/*
 * nyroModal - jQuery Plugin
 * http://nyromodal.nyrodev.com
 *
 * Copyright (c) 2008 Cedric Nirousset (nyrodev.com)
 * Licensed under the MIT license
 *
 * $Date: 2009-07-17 (Fri, 17 Jul 2009) $
 * $version: 1.5.1
 */
jQuery(function($){
    var userAgent = navigator.userAgent.toLowerCase();
    var browserVersion = (userAgent.match(/.+(?:rv|webkit|khtml|opera|msie)[\/: ]([\d.]+)/) || [0, '0'])[1];
    var isIE6 = (/msie/.test(userAgent) && !/opera/.test(userAgent) && parseInt(browserVersion) < 7 && !window.XMLHttpRequest);
    var body = $('body');
    var currentSettings;
    var shouldResize = false;
    var gallery = {};
    var fixFF = false;
    var contentElt;
    var contentEltLast;
    var modal = {
        started: false,
        ready: false,
        dataReady: false,
        anim: false,
        animContent: false,
        loadingShown: false,
        transition: false,
        resizing: false,
        closing: false,
        error: false,
        blocker: null,
        blockerVars: null,
        full: null,
        bg: null,
        loading: null,
        tmp: null,
        content: null,
        wrapper: null,
        contentWrapper: null,
        scripts: new Array(),
        scriptsShown: new Array()
    };
    var resized = {
        width: false,
        height: false,
        windowResizing: false
    };
    var initSettingsSize = {
        width: null,
        height: null,
        windowResizing: true
    };
    var windowResizeTimeout;
    $.fn.nyroModal = function(settings){
        if (!this) 
            return false;
        return this.each(function(){
            var me = $(this);
            if (this.nodeName.toLowerCase() == 'form') {
                me.unbind('submit.nyroModal').bind('submit.nyroModal', function(e){
                    if (me.data('nyroModalprocessing')) 
                        return true;
                    if (this.enctype == 'multipart/form-data') {
                        processModal($.extend(settings, {
                            from: this
                        }));
                        return true
                    }
                    e.preventDefault();
                    processModal($.extend(settings, {
                        from: this
                    }));
                    return false
                })
            }
            else {
                me.unbind('click.nyroModal').bind('click.nyroModal', function(e){
                    e.preventDefault();
                    processModal($.extend(settings, {
                        from: this
                    }));
                    return false
                })
            }
        })
    };
    $.fn.nyroModalManual = function(settings){
        if (!this.length) 
            processModal(settings);
        return this.each(function(){
            processModal($.extend(settings, {
                from: this
            }))
        })
    };
    $.nyroModalManual = function(settings){
        processModal(settings)
    };
    $.nyroModalSettings = function(settings, deep1, deep2){
        setCurrentSettings(settings, deep1, deep2);
        if (!deep1 && modal.started) {
            if (modal.bg && settings.bgColor) 
                currentSettings.updateBgColor(modal, currentSettings, function(){
                });
            if (modal.contentWrapper && settings.title) 
                setTitle();
            if (!modal.error && (settings.windowResizing || (!modal.resizing && (('width' in settings && settings.width == currentSettings.width) || ('height' in settings && settings.height == currentSettings.height))))) {
                modal.resizing = true;
                if (modal.contentWrapper) 
                    calculateSize(true);
                if (modal.contentWrapper && modal.contentWrapper.is(':visible') && !modal.animContent) {
                    if (fixFF) 
                        modal.content.css({
                            position: ''
                        });
                    currentSettings.resize(modal, currentSettings, function(){
                        currentSettings.windowResizing = false;
                        modal.resizing = false;
                        if (fixFF) 
                            modal.content.css({
                                position: 'fixed'
                            });
                        if ($.isFunction(currentSettings.endResize)) 
                            currentSettings.endResize(modal, currentSettings)
                    })
                }
            }
        }
    };
    $.nyroModalRemove = function(){
        removeModal()
    };
    $.nyroModalNext = function(){
        var link = getGalleryLink(1);
        if (link) 
            return link.nyroModalManual(getCurrentSettingsNew());
        return false
    };
    $.nyroModalPrev = function(){
        var link = getGalleryLink(-1);
        if (link) 
            return link.nyroModalManual(getCurrentSettingsNew());
        return false
    };
    $.fn.nyroModal.settings = {
        debug: false,
        blocker: false,
        modal: false,
        type: '',
        forceType: null,
        from: '',
        hash: '',
        processHandler: null,
        selIndicator: 'nyroModalSel',
        formIndicator: 'nyroModal',
        content: null,
        bgColor: '#000000',
        ajax: {},
        swf: {
            wmode: 'transparent'
        },
        width: null,
        height: null,
        minWidth: 480,
        minHeight: 360,
        resizable: true,
        autoSizable: true,
        padding: 25,
        regexImg: '[^\.]\.(jpg|jpeg|png|tiff|gif|bmp)\s*$',
        addImageDivTitle: false,
        defaultImgAlt: 'Image',
        setWidthImgTitle: true,
        ltr: true,
        gallery: null,
        galleryLinks: '<a href="#" class="nyroModalPrev">Prev</a><a href="#"  class="nyroModalNext">Next</a>',
        galleryCounts: galleryCounts,
        zIndexStart: 100,
        css: {
            bg: {
                position: 'absolute',
                overflow: 'hidden',
                top: 0,
                left: 0,
                height: '100%',
                width: '100%'
            },
            wrapper: {
                position: 'absolute',
                top: '50%',
                left: '50%'
            },
            wrapper2: {},
            content: {
                overflow: 'hidden'
            },
            loading: {
                position: 'absolute',
                top: '50%',
                left: '50%',
                marginTop: '-50px',
                marginLeft: '-50px'
            }
        },
        wrap: {
            div: '<div class="wrapper"></div>',
            ajax: '<div class="wrapper"></div>',
            form: '<div class="wrapper"></div>',
            formData: '<div class="wrapper"></div>',
            image: '<div class="wrapperImg"></div>',
            swf: '<div class="wrapperSwf"></div>',
            iframe: '<div class="wrapperIframe"></div>',
            iframeForm: '<div class="wrapperIframe"></div>',
            manual: '<div class="wrapper"></div>'
        },
        closeButton: '<a href="#" class="nyroModalClose" id="closeBut" title="close">Close</a>',
        title: null,
        titleFromIframe: true,
        openSelector: '.nyroModal',
        closeSelector: '.nyroModalClose',
        contentLoading: '<a href="#" class="nyroModalClose">Cancel</a>',
        errorClass: 'error',
        contentError: 'The requested content cannot be loaded.<br />Please try again later.<br /><a href="#" class="nyroModalClose">Close</a>',
        handleError: null,
        showBackground: showBackground,
        hideBackground: hideBackground,
        endFillContent: null,
        showContent: showContent,
        endShowContent: null,
        beforeHideContent: null,
        hideContent: hideContent,
        showTransition: showTransition,
        hideTransition: hideTransition,
        showLoading: showLoading,
        hideLoading: hideLoading,
        resize: resize,
        endResize: null,
        updateBgColor: updateBgColor,
        endRemove: null
    };
    function processModal(settings){
        if (modal.loadingShown || modal.transition || modal.anim) 
            return;
        debug('processModal');
        modal.started = true;
        setDefaultCurrentSettings(settings);
        if (!modal.full) 
            modal.blockerVars = modal.blocker = null;
        modal.error = false;
        modal.closing = false;
        modal.dataReady = false;
        modal.scripts = new Array();
        modal.scriptsShown = new Array();
        currentSettings.type = fileType();
        if (currentSettings.forceType) {
            if (!currentSettings.content) 
                currentSettings.from = true;
            currentSettings.type = currentSettings.forceType;
            currentSettings.forceType = null
        }
        if ($.isFunction(currentSettings.processHandler)) 
            currentSettings.processHandler(currentSettings);
        var from = currentSettings.from;
        var url = currentSettings.url;
        initSettingsSize.width = currentSettings.width;
        initSettingsSize.height = currentSettings.height;
        if (currentSettings.type == 'swf') {
            setCurrentSettings({
                overflow: 'hidden'
            }, 'css', 'content');
            currentSettings.content = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + currentSettings.width + '" height="' + currentSettings.height + '"><param name="movie" value="' + url + '"></param>';
            var tmp = '';
            $.each(currentSettings.swf, function(name, val){
                currentSettings.content += '<param name="' + name + '" value="' + val + '"></param>';
                tmp += ' ' + name + '="' + val + '"'
            });
            currentSettings.content += '<embed src="' + url + '" type="application/x-shockwave-flash" width="' + currentSettings.width + '" height="' + currentSettings.height + '"' + tmp + '></embed></object>'
        }
        if (from) {
            var jFrom = $(from).blur();
            if (currentSettings.type == 'form') {
                var data = $(from).serializeArray();
                data.push({
                    name: currentSettings.formIndicator,
                    value: 1
                });
                if (currentSettings.selector) 
                    data.push({
                        name: currentSettings.selIndicator,
                        value: currentSettings.selector.substring(1)
                    });
                $.ajax($.extend({}, currentSettings.ajax, {
                    url: url,
                    data: data,
                    type: jFrom.attr('method') ? jFrom.attr('method') : 'get',
                    success: ajaxLoaded,
                    error: loadingError
                }));
                debug('Form Ajax Load: ' + jFrom.attr('action'));
                showModal()
            }
            else 
                if (currentSettings.type == 'formData') {
                    initModal();
                    jFrom.attr('target', 'nyroModalIframe');
                    jFrom.attr('action', url);
                    jFrom.prepend('<input type="hidden" name="' + currentSettings.formIndicator + '" value="1" />');
                    if (currentSettings.selector) 
                        jFrom.prepend('<input type="hidden" name="' + currentSettings.selIndicator + '" value="' + currentSettings.selector.substring(1) + '" />');
                    modal.tmp.html('<iframe frameborder="0" hspace="0" name="nyroModalIframe" src="javascript:false;"></iframe>');
                    $('iframe', modal.tmp).css({
                        width: currentSettings.width,
                        height: currentSettings.height
                    }).error(loadingError).load(formDataLoaded);
                    debug('Form Data Load: ' + jFrom.attr('action'));
                    showModal();
                    showContentOrLoading()
                }
                else 
                    if (currentSettings.type == 'image') {
                        debug('Image Load: ' + url);
                        var title = jFrom.attr('title') || currentSettings.defaultImgAlt;
                        initModal();
                        modal.tmp.html('<img id="nyroModalImg" />').find('img').attr('alt', title);
                        modal.tmp.css({
                            lineHeight: 0
                        });
                        $('img', modal.tmp).error(loadingError).load(function(){
                            debug('Image Loaded: ' + this.src);
                            $(this).unbind('load');
                            var w = modal.tmp.width();
                            var h = modal.tmp.height();
                            modal.tmp.css({
                                lineHeight: ''
                            });
                            resized.width = w;
                            resized.height = h;
                            setCurrentSettings({
                                width: w,
                                height: h,
                                imgWidth: w,
                                imgHeight: h
                            });
                            initSettingsSize.width = w;
                            initSettingsSize.height = h;
                            setCurrentSettings({
                                overflow: 'hidden'
                            }, 'css', 'content');
                            modal.dataReady = true;
                            if (modal.loadingShown || modal.transition) 
                                showContentOrLoading()
                        }).attr('src', url);
                        showModal()
                    }
                    else 
                        if (currentSettings.type == 'iframeForm') {
                            initModal();
                            modal.tmp.html('<iframe frameborder="0" hspace="0" src="javascript:false;" name="nyroModalIframe" id="nyroModalIframe"></iframe>');
                            debug('Iframe Form Load: ' + url);
                            $('iframe', modal.tmp).eq(0).css({
                                width: '100%',
                                height: $.support.boxModel ? '99%' : '100%'
                            }).load(iframeLoaded);
                            modal.dataReady = true;
                            showModal()
                        }
                        else 
                            if (currentSettings.type == 'iframe') {
                                initModal();
                                modal.tmp.html('<iframe frameborder="0" hspace="0" src="javascript:false;" name="nyroModalIframe" id="nyroModalIframe"></iframe>');
                                debug('Iframe Load: ' + url);
                                $('iframe', modal.tmp).eq(0).css({
                                    width: '100%',
                                    height: $.support.boxModel ? '99%' : '100%'
                                }).load(iframeLoaded);
                                modal.dataReady = true;
                                showModal()
                            }
                            else 
                                if (currentSettings.type) {
                                    debug('Content: ' + currentSettings.type);
                                    initModal();
                                    modal.tmp.html(currentSettings.content);
                                    var w = modal.tmp.width();
                                    var h = modal.tmp.height();
                                    var div = $(currentSettings.type);
                                    if (div.length) {
                                        setCurrentSettings({
                                            type: 'div'
                                        });
                                        w = div.width();
                                        h = div.height();
                                        if (contentElt) 
                                            contentEltLast = contentElt;
                                        contentElt = div;
                                        modal.tmp.append(div.contents())
                                    }
                                    initSettingsSize.width = w;
                                    initSettingsSize.height = h;
                                    setCurrentSettings({
                                        width: w,
                                        height: h
                                    });
                                    if (modal.tmp.html()) 
                                        modal.dataReady = true;
                                    else 
                                        loadingError();
                                    if (!modal.ready) 
                                        showModal();
                                    else 
                                        endHideContent()
                                }
                                else {
                                    debug('Ajax Load: ' + url);
                                    setCurrentSettings({
                                        type: 'ajax'
                                    });
                                    var data = currentSettings.ajax.data ||
                                    {};
                                    if (currentSettings.selector) {
                                        if (typeof data == "string") {
                                            data += '&' + currentSettings.selIndicator + '=' + currentSettings.selector.substring(1)
                                        }
                                        else {
                                            data[currentSettings.selIndicator] = currentSettings.selector.substring(1)
                                        }
                                    }
                                    $.ajax($.extend(true, currentSettings.ajax, {
                                        url: url,
                                        success: ajaxLoaded,
                                        error: loadingError,
                                        data: data
                                    }));
                                    showModal()
                                }
        }
        else 
            if (currentSettings.content) {
                debug('Content: ' + currentSettings.type);
                setCurrentSettings({
                    type: 'manual'
                });
                initModal();
                modal.tmp.html($('<div/>').html(currentSettings.content).contents());
                if (modal.tmp.html()) 
                    modal.dataReady = true;
                else 
                    loadingError();
                showModal()
            }
            else {
            }
    }
    function setDefaultCurrentSettings(settings){
        debug('setDefaultCurrentSettings');
        currentSettings = $.extend(true, {}, $.fn.nyroModal.settings, settings);
        currentSettings.selector = '';
        currentSettings.borderW = 0;
        currentSettings.borderH = 0;
        currentSettings.resizable = true;
        setMargin()
    }
    function setCurrentSettings(settings, deep1, deep2){
        if (modal.started) {
            if (deep1 && deep2) {
                $.extend(true, currentSettings[deep1][deep2], settings)
            }
            else 
                if (deep1) {
                    $.extend(true, currentSettings[deep1], settings)
                }
                else {
                    if (modal.animContent) {
                        if ('width' in settings) {
                            if (!modal.resizing) {
                                settings.setWidth = settings.width;
                                shouldResize = true
                            }
                            delete settings['width']
                        }
                        if ('height' in settings) {
                            if (!modal.resizing) {
                                settings.setHeight = settings.height;
                                shouldResize = true
                            }
                            delete settings['height']
                        }
                    }
                    $.extend(true, currentSettings, settings)
                }
        }
        else {
            if (deep1 && deep2) {
                $.extend(true, $.fn.nyroModal.settings[deep1][deep2], settings)
            }
            else 
                if (deep1) {
                    $.extend(true, $.fn.nyroModal.settings[deep1], settings)
                }
                else {
                    $.extend(true, $.fn.nyroModal.settings, settings)
                }
        }
    }
    function setMarginScroll(){
        if (isIE6 && !modal.blocker) {
            if (document.documentElement) {
                currentSettings.marginScrollLeft = document.documentElement.scrollLeft;
                currentSettings.marginScrollTop = document.documentElement.scrollTop
            }
            else {
                currentSettings.marginScrollLeft = document.body.scrollLeft;
                currentSettings.marginScrollTop = document.body.scrollTop
            }
        }
        else {
            currentSettings.marginScrollLeft = 0;
            currentSettings.marginScrollTop = 0
        }
    }
    function setMargin(){
        setMarginScroll();
        currentSettings.marginLeft = -(currentSettings.width + currentSettings.borderW) / 2;
        currentSettings.marginTop = -(currentSettings.height + currentSettings.borderH) / 2;
        if (!modal.blocker) {
            currentSettings.marginLeft += currentSettings.marginScrollLeft;
            currentSettings.marginTop += currentSettings.marginScrollTop
        }
    }
    function setMarginLoading(){
        setMarginScroll();
        var outer = getOuter(modal.loading);
        currentSettings.marginTopLoading = -(modal.loading.height() + outer.h.border + outer.h.padding) / 2;
        currentSettings.marginLeftLoading = -(modal.loading.width() + outer.w.border + outer.w.padding) / 2;
        if (!modal.blocker) {
            currentSettings.marginLefttLoading += currentSettings.marginScrollLeft;
            currentSettings.marginTopLoading += currentSettings.marginScrollTop
        }
    }
    function setTitle(){
        var title = $('h1#nyroModalTitle', modal.contentWrapper);
        if (title.length) 
            title.text(currentSettings.title);
        else 
            modal.contentWrapper.prepend('<h1 id="nyroModalTitle">' + currentSettings.title + '</h1>')
    }
    function initModal(){
        debug('initModal');
        if (!modal.full) {
            if (currentSettings.debug) 
                setCurrentSettings({
                    color: 'white'
                }, 'css', 'bg');
            var full = {
                zIndex: currentSettings.zIndexStart,
                position: 'fixed',
                top: 0,
                left: 0,
                width: '100%',
                height: '100%'
            };
            var contain = body;
            var iframeHideIE = '';
            if (currentSettings.blocker) {
                modal.blocker = contain = $(currentSettings.blocker);
                var pos = modal.blocker.offset();
                var w = modal.blocker.outerWidth();
                var h = modal.blocker.outerHeight();
                if (isIE6) {
                    setCurrentSettings({
                        height: '100%',
                        width: '100%',
                        top: 0,
                        left: 0
                    }, 'css', 'bg')
                }
                modal.blockerVars = {
                    top: pos.top,
                    left: pos.left,
                    width: w,
                    height: h
                };
                var plusTop = (/msie/.test(userAgent) ? 0 : getCurCSS(body.get(0), 'borderTopWidth'));
                var plusLeft = (/msie/.test(userAgent) ? 0 : getCurCSS(body.get(0), 'borderLeftWidth'));
                full = {
                    position: 'absolute',
                    top: pos.top + plusTop,
                    left: pos.left + plusLeft,
                    width: w,
                    height: h
                }
            }
            else 
                if (isIE6) {
                    body.css({
                        height: body.height() + 'px',
                        width: body.width() + 'px',
                        position: 'static',
                        overflow: 'hidden'
                    });
                    $('html').css({
                        overflow: 'hidden'
                    });
                    setCurrentSettings({
                        css: {
                            bg: {
                                position: 'absolute',
                                zIndex: currentSettings.zIndexStart + 1,
                                height: '110%',
                                width: '110%',
                                top: currentSettings.marginScrollTop + 'px',
                                left: currentSettings.marginScrollLeft + 'px'
                            },
                            wrapper: {
                                zIndex: currentSettings.zIndexStart + 2
                            },
                            loading: {
                                zIndex: currentSettings.zIndexStart + 3
                            }
                        }
                    });
                    iframeHideIE = $('<iframe id="nyroModalIframeHideIe" src="javascript:false;"></iframe>').css($.extend({}, currentSettings.css.bg, {
                        opacity: 0,
                        zIndex: 50,
                        border: 'none'
                    }))
                }
            contain.append($('<div id="nyroModalFull"><div id="nyroModalBg"></div><div id="nyroModalWrapper"><div id="nyroModalContent"></div></div><div id="nyrModalTmp"></div><div id="nyroModalLoading"></div></div>').hide());
            modal.full = $('#nyroModalFull').css(full).show();
            modal.bg = $('#nyroModalBg').css($.extend({
                backgroundColor: currentSettings.bgColor
            }, currentSettings.css.bg)).before(iframeHideIE);
            if (!currentSettings.modal) 
                modal.bg.click(removeModal);
            modal.loading = $('#nyroModalLoading').css(currentSettings.css.loading).hide();
            modal.contentWrapper = $('#nyroModalWrapper').css(currentSettings.css.wrapper).hide();
            modal.content = $('#nyroModalContent');
            modal.tmp = $('#nyrModalTmp').hide();
            if ($.isFunction($.fn.mousewheel)) {
                modal.content.mousewheel(function(e, d){
                    var elt = modal.content.get(0);
                    if ((d > 0 && elt.scrollTop == 0) || (d < 0 && elt.scrollHeight - elt.scrollTop == elt.clientHeight)) {
                        e.preventDefault();
                        e.stopPropagation()
                    }
                })
            }
            $(document).bind('keydown.nyroModal', keyHandler);
            modal.content.css({
                width: 'auto',
                height: 'auto'
            });
            modal.contentWrapper.css({
                width: 'auto',
                height: 'auto'
            });
            if (!currentSettings.blocker) {
                $(window).bind('resize.nyroModal', function(){
                    window.clearTimeout(windowResizeTimeout);
                    windowResizeTimeout = window.setTimeout(windowResizeHandler, 200)
                })
            }
        }
    }
    function windowResizeHandler(){
        $.nyroModalSettings(initSettingsSize)
    }
    function showModal(){
        debug('showModal');
        if (!modal.ready) {
            initModal();
            modal.anim = true;
            currentSettings.showBackground(modal, currentSettings, endBackground)
        }
        else {
            modal.anim = true;
            modal.transition = true;
            currentSettings.showTransition(modal, currentSettings, function(){
                endHideContent();
                modal.anim = false;
                showContentOrLoading()
            })
        }
    }
    function keyHandler(e){
        if (e.keyCode == 27) {
            if (!currentSettings.modal) 
                removeModal()
        }
        else 
            if (currentSettings.gallery && modal.ready && modal.dataReady && !modal.anim && !modal.transition) {
                if (e.keyCode == 39 || e.keyCode == 40) {
                    e.preventDefault();
                    $.nyroModalNext();
                    return false
                }
                else 
                    if (e.keyCode == 37 || e.keyCode == 38) {
                        e.preventDefault();
                        $.nyroModalPrev();
                        return false
                    }
            }
    }
    function fileType(){
        var from = currentSettings.from;
        var url;
        if (from && from.nodeName) {
            var jFrom = $(from);
            url = jFrom.attr(from.nodeName.toLowerCase() == 'form' ? 'action' : 'href');
            if (!url) 
                url = location.href.substring(window.location.host.length + 7);
            currentSettings.url = url;
            if (jFrom.attr('rev') == 'modal') 
                currentSettings.modal = true;
            currentSettings.title = jFrom.attr('title');
            if (from && from.rel && from.rel.toLowerCase() != 'nofollow') {
                var indexSpace = from.rel.indexOf(' ');
                currentSettings.gallery = indexSpace > 0 ? from.rel.substr(0, indexSpace) : from.rel
            }
            var imgType = imageType(url, from);
            if (imgType) 
                return imgType;
            if (isSwf(url)) 
                return 'swf';
            var iframe = false;
            if (from.target && from.target.toLowerCase() == '_blank' || (from.hostname && from.hostname.replace(/:\d*$/, '') != window.location.hostname.replace(/:\d*$/, ''))) {
                iframe = true
            }
            if (from.nodeName.toLowerCase() == 'form') {
                if (iframe) 
                    return 'iframeForm';
                setCurrentSettings(extractUrlSel(url));
                if (jFrom.attr('enctype') == 'multipart/form-data') 
                    return 'formData';
                return 'form'
            }
            if (iframe) 
                return 'iframe'
        }
        else {
            url = currentSettings.url;
            if (!currentSettings.content) 
                currentSettings.from = true;
            if (!url) 
                return null;
            if (isSwf(url)) 
                return 'swf';
            var reg1 = new RegExp("^http://", "g");
            if (url.match(reg1)) 
                return 'iframe'
        }
        var imgType = imageType(url, from);
        if (imgType) 
            return imgType;
        var tmp = extractUrlSel(url);
        setCurrentSettings(tmp);
        if (!tmp.url) 
            return tmp.selector
    }
    function imageType(url, from){
        var image = new RegExp(currentSettings.regexImg, 'i');
        if (image.test(url)) {
            return 'image'
        }
    }
    function isSwf(url){
        var swf = new RegExp('[^\.]\.(swf)\s*$', 'i');
        return swf.test(url)
    }
    function extractUrlSel(url){
        var ret = {
            url: null,
            selector: null
        };
        if (url) {
            var hash = getHash(url);
            var hashLoc = getHash(window.location.href);
            var curLoc = window.location.href.substring(0, window.location.href.length - hashLoc.length);
            var req = url.substring(0, url.length - hash.length);
            if (req == curLoc || req == $('base').attr('href')) {
                ret.selector = hash
            }
            else {
                ret.url = req;
                ret.selector = hash
            }
        }
        return ret
    }
    function loadingError(){
        debug('loadingError');
        modal.error = true;
        if (!modal.ready) 
            return;
        if ($.isFunction(currentSettings.handleError)) 
            currentSettings.handleError(modal, currentSettings);
        modal.loading.addClass(currentSettings.errorClass).html(currentSettings.contentError);
        $(currentSettings.closeSelector, modal.loading).unbind('click.nyroModal').bind('click.nyroModal', removeModal);
        setMarginLoading();
        modal.loading.css({
            marginTop: currentSettings.marginTopLoading + 'px',
            marginLeft: currentSettings.marginLeftLoading + 'px'
        })
    }
    function fillContent(){
        debug('fillContent');
        if (!modal.tmp.html()) 
            return;
        modal.content.html(modal.tmp.contents());
        modal.tmp.empty();
        wrapContent();
        if (currentSettings.type == 'iframeForm') {
            $(currentSettings.from).attr('target', 'nyroModalIframe').data('nyroModalprocessing', 1).submit().attr('target', '_blank').removeData('nyroModalprocessing')
        }
        if (!currentSettings.modal) 
            modal.wrapper.prepend(currentSettings.closeButton);
        if ($.isFunction(currentSettings.endFillContent)) 
            currentSettings.endFillContent(modal, currentSettings);
        modal.content.append(modal.scripts);
        $(currentSettings.closeSelector, modal.contentWrapper).unbind('click.nyroModal').bind('click.nyroModal', removeModal);
        $(currentSettings.openSelector, modal.contentWrapper).nyroModal(getCurrentSettingsNew())
    }
    function getCurrentSettingsNew(){
        var currentSettingsNew = $.extend(true, {}, currentSettings);
        if (resized.width) 
            currentSettingsNew.width = null;
        else 
            currentSettingsNew.width = initSettingsSize.width;
        if (resized.height) 
            currentSettingsNew.height = null;
        else 
            currentSettingsNew.height = initSettingsSize.height;
        	//currentSettingsNew.css.content.overflow = 'auto';
			currentSettingsNew.css.content.overflow = 'hidden';
        return currentSettingsNew
    }
    function wrapContent(){
        debug('wrapContent');
        var wrap = $(currentSettings.wrap[currentSettings.type]);
        modal.content.append(wrap.children().remove());
        modal.contentWrapper.wrapInner(wrap);
        if (currentSettings.gallery) {
            modal.contentWrapper.append(currentSettings.galleryLinks);
            gallery.links = $('[rel*="' + currentSettings.gallery + '"]');
            gallery.index = gallery.links.index(currentSettings.from);
            if (currentSettings.galleryCounts && $.isFunction(currentSettings.galleryCounts)) 
                currentSettings.galleryCounts(gallery.index + 1, gallery.links.length, modal, currentSettings);
            var currentSettingsNew = getCurrentSettingsNew();
            var linkPrev = getGalleryLink(-1);
            if (linkPrev) {
                var prev = $('.nyroModalPrev', modal.contentWrapper).attr('href', linkPrev.attr('href')).click(function(e){
                    e.preventDefault();
                    $.nyroModalPrev();
                    return false
                });
                if (isIE6 && currentSettings.type == 'swf') {
                    prev.before($('<iframe id="nyroModalIframeHideIeGalleryPrev" src="javascript:false;"></iframe>').css({
                        position: prev.css('position'),
                        top: prev.css('top'),
                        left: prev.css('left'),
                        width: prev.width(),
                        height: prev.height(),
                        opacity: 0,
                        border: 'none'
                    }))
                }
            }
            else {
                $('.nyroModalPrev', modal.contentWrapper).remove()
            }
            var linkNext = getGalleryLink(1);
            if (linkNext) {
                var next = $('.nyroModalNext', modal.contentWrapper).attr('href', linkNext.attr('href')).click(function(e){
                    e.preventDefault();
                    $.nyroModalNext();
                    return false
                });
                if (isIE6 && currentSettings.type == 'swf') {
                    next.before($('<iframe id="nyroModalIframeHideIeGalleryNext" src="javascript:false;"></iframe>').css($.extend({}, {
                        position: next.css('position'),
                        top: next.css('top'),
                        left: next.css('left'),
                        width: next.width(),
                        height: next.height(),
                        opacity: 0,
                        border: 'none'
                    })))
                }
            }
            else {
                $('.nyroModalNext', modal.contentWrapper).remove()
            }
        }
        calculateSize()
    }
    function getGalleryLink(dir){
        if (currentSettings.gallery) {
            if (!currentSettings.ltr) 
                dir *= -1;
            var index = gallery.index + dir;
            if (index >= 0 && index < gallery.links.length) 
                return gallery.links.eq(index)
        }
        return false
    }
    function calculateSize(resizing){
        debug('calculateSize');
        modal.wrapper = modal.contentWrapper.children('div:first');
        resized.width = false;
        resized.height = false;
        if (false && !currentSettings.windowResizing) {
            initSettingsSize.width = currentSettings.width;
            initSettingsSize.height = currentSettings.height
        }
        if (currentSettings.autoSizable && (!currentSettings.width || !currentSettings.height)) {
            modal.contentWrapper.css({
                opacity: 0,
                width: 'auto',
                height: 'auto'
            }).show();
            var tmp = {
                width: 'auto',
                height: 'auto'
            };
            if (currentSettings.width) {
                tmp.width = currentSettings.width
            }
            else 
                if (currentSettings.type == 'iframe') {
                    tmp.width = currentSettings.minWidth
                }
            if (currentSettings.height) {
                tmp.height = currentSettings.height
            }
            else 
                if (currentSettings.type == 'iframe') {
                    tmp.height = currentSettings.minHeight
                }
            modal.content.css(tmp);
            if (!currentSettings.width) {
                currentSettings.width = modal.content.outerWidth(true);
                resized.width = true
            }
            if (!currentSettings.height) {
                currentSettings.height = modal.content.outerHeight(true);
                resized.height = true
            }
            modal.contentWrapper.css({
                opacity: 1
            });
            if (!resizing) 
                modal.contentWrapper.hide()
        }
        if (currentSettings.type != 'image' && currentSettings.type != 'swf') {
            currentSettings.width = Math.max(currentSettings.width, currentSettings.minWidth);
            currentSettings.height = Math.max(currentSettings.height, currentSettings.minHeight)
        }
        var outerWrapper = getOuter(modal.contentWrapper);
        var outerWrapper2 = getOuter(modal.wrapper);
        var outerContent = getOuter(modal.content);
        var tmp = {
            content: {
                width: currentSettings.width,
                height: currentSettings.height
            },
            wrapper2: {
                width: currentSettings.width + outerContent.w.total,
                height: currentSettings.height + outerContent.h.total
            },
            wrapper: {
                width: currentSettings.width + outerContent.w.total + outerWrapper2.w.total,
                height: currentSettings.height + outerContent.h.total + outerWrapper2.h.total
            }
        };
        if (currentSettings.resizable) {
            var maxHeight = modal.blockerVars ? modal.blockerVars.height : $(window).height() - outerWrapper.h.border - (tmp.wrapper.height - currentSettings.height);
            var maxWidth = modal.blockerVars ? modal.blockerVars.width : $(window).width() - outerWrapper.w.border - (tmp.wrapper.width - currentSettings.width);
            maxHeight -= currentSettings.padding * 2;
            maxWidth -= currentSettings.padding * 2;
            if (tmp.content.height > maxHeight || tmp.content.width > maxWidth) {
                if (currentSettings.type == 'image' || currentSettings.type == 'swf') {
                    var useW = currentSettings.imgWidth ? currentSettings.imgWidth : currentSettings.width;
                    var useH = currentSettings.imgHeight ? currentSettings.imgHeight : currentSettings.height;
                    var diffW = tmp.content.width - useW;
                    var diffH = tmp.content.height - useH;
                    if (diffH < 0) 
                        diffH = 0;
                    if (diffW < 0) 
                        diffW = 0;
                    var calcH = maxHeight - diffH;
                    var calcW = maxWidth - diffW;
                    var ratio = Math.min(calcH / useH, calcW / useW);
                    calcW = Math.floor(useW * ratio);
                    calcH = Math.floor(useH * ratio);
                    tmp.content.height = calcH + diffH;
                    tmp.content.width = calcW + diffW
                }
                else {
                    tmp.content.height = Math.min(tmp.content.height, maxHeight);
                    tmp.content.width = Math.min(tmp.content.width, maxWidth)
                }
                tmp.wrapper2 = {
                    width: tmp.content.width + outerContent.w.total,
                    height: tmp.content.height + outerContent.h.total
                };
                tmp.wrapper = {
                    width: tmp.content.width + outerContent.w.total + outerWrapper2.w.total,
                    height: tmp.content.height + outerContent.h.total + outerWrapper2.h.total
                }
            }
        }
        if (currentSettings.type == 'swf') {
            $('object, embed', modal.content).attr('width', tmp.content.width).attr('height', tmp.content.height)
        }
        else 
            if (currentSettings.type == 'image') {
                $('img', modal.content).css({
                    width: tmp.content.width,
                    height: tmp.content.height
                })
            }
        modal.content.css($.extend({}, tmp.content, currentSettings.css.content));
        modal.wrapper.css($.extend({}, tmp.wrapper2, currentSettings.css.wrapper2));
        if (!resizing) 
            modal.contentWrapper.css($.extend({}, tmp.wrapper, currentSettings.css.wrapper));
        if (currentSettings.type == 'image' && currentSettings.addImageDivTitle) {
            $('img', modal.content).removeAttr('alt');
            var divTitle = $('div', modal.content);
            if (currentSettings.title != currentSettings.defaultImgAlt && currentSettings.title) {
                if (divTitle.length == 0) {
                    divTitle = $('<div>' + currentSettings.title + '</div>');
                    modal.content.append(divTitle)
                }
                if (currentSettings.setWidthImgTitle) {
                    var outerDivTitle = getOuter(divTitle);
                    divTitle.css({
                        width: (tmp.content.width + outerContent.w.padding - outerDivTitle.w.total) + 'px'
                    })
                }
            }
            else 
                if (divTitle.length = 0) {
                    divTitle.remove()
                }
        }
        if (currentSettings.title) 
            setTitle();
        tmp.wrapper.borderW = outerWrapper.w.border;
        tmp.wrapper.borderH = outerWrapper.h.border;
        setCurrentSettings(tmp.wrapper);
        setMargin()
    }
    function removeModal(e){
        debug('removeModal');
        if (e) 
            e.preventDefault();
        if (modal.full && modal.ready) {
            $(document).unbind('keydown.nyroModal');
            if (!currentSettings.blocker) 
                $(window).unbind('resize.nyroModal');
            modal.ready = false;
            modal.anim = true;
            modal.closing = true;
            if (modal.loadingShown || modal.transition) {
                currentSettings.hideLoading(modal, currentSettings, function(){
                    modal.loading.hide();
                    modal.loadingShown = false;
                    modal.transition = false;
                    currentSettings.hideBackground(modal, currentSettings, endRemove)
                })
            }
            else {
                if (fixFF) 
                    modal.content.css({
                        position: ''
                    });
                modal.wrapper.css({
                    overflow: 'hidden'
                });
                modal.content.css({
                    overflow: 'hidden'
                });
                if ($.isFunction(currentSettings.beforeHideContent)) {
                    currentSettings.beforeHideContent(modal, currentSettings, function(){
                        currentSettings.hideContent(modal, currentSettings, function(){
                            endHideContent();
                            currentSettings.hideBackground(modal, currentSettings, endRemove)
                        })
                    })
                }
                else {
                    currentSettings.hideContent(modal, currentSettings, function(){
                        endHideContent();
                        currentSettings.hideBackground(modal, currentSettings, endRemove)
                    })
                }
            }
        }
        if (e) 
            return false
    }
    function showContentOrLoading(){
        debug('showContentOrLoading');
        if (modal.ready && !modal.anim) {
            if (modal.dataReady) {
                if (modal.tmp.html()) {
                    modal.anim = true;
                    if (modal.transition) {
                        fillContent();
                        modal.animContent = true;
                        currentSettings.hideTransition(modal, currentSettings, function(){
                            modal.loading.hide();
                            modal.transition = false;
                            modal.loadingShown = false;
                            endShowContent()
                        })
                    }
                    else {
                        currentSettings.hideLoading(modal, currentSettings, function(){
                            modal.loading.hide();
                            modal.loadingShown = false;
                            fillContent();
                            setMarginLoading();
                            setMargin();
                            modal.animContent = true;
                            currentSettings.showContent(modal, currentSettings, endShowContent)
                        })
                    }
                }
            }
            else 
                if (!modal.loadingShown && !modal.transition) {
                    modal.anim = true;
                    modal.loadingShown = true;
                    if (modal.error) 
                        loadingError();
                    else 
                        modal.loading.html(currentSettings.contentLoading);
                    $(currentSettings.closeSelector, modal.loading).unbind('click.nyroModal').bind('click.nyroModal', removeModal);
                    setMarginLoading();
                    currentSettings.showLoading(modal, currentSettings, function(){
                        modal.anim = false;
                        showContentOrLoading()
                    })
                }
        }
    }
    function ajaxLoaded(data){
        debug('AjaxLoaded: ' + this.url);
        modal.tmp.html(currentSettings.selector ? filterScripts($('<div>' + data + '</div>').find(currentSettings.selector).contents()) : filterScripts(data));
        if (modal.tmp.html()) {
            modal.dataReady = true;
            showContentOrLoading()
        }
        else 
            loadingError()
    }
    function formDataLoaded(){
        debug('formDataLoaded');
        var jFrom = $(currentSettings.from);
        jFrom.attr('action', jFrom.attr('action') + currentSettings.selector);
        jFrom.attr('target', '');
        $('input[name=' + currentSettings.formIndicator + ']', currentSettings.from).remove();
        var iframe = modal.tmp.children('iframe');
        var iframeContent = iframe.unbind('load').contents().find(currentSettings.selector || 'body').not('script[src]');
        iframe.attr('src', 'about:blank');
        modal.tmp.html(iframeContent.html());
        if (modal.tmp.html()) {
            modal.dataReady = true;
            showContentOrLoading()
        }
        else 
            loadingError()
    }
    function iframeLoaded(){
        if ((window.location.hostname && currentSettings.url.indexOf(window.location.hostname) > -1) || currentSettings.url.indexOf('http://')) {
            var iframe = $('iframe', modal.full).contents();
            var tmp = {};
            if (currentSettings.titleFromIframe) 
                tmp.title = iframe.find('title').text();
            if (!tmp.title) {
                try {
                    tmp.title = iframe.find('title').html()
                } 
                catch (err) {
                }
            }
            var body = iframe.find('body');
            if (!currentSettings.height && body.height()) 
                tmp.height = body.height();
            if (!currentSettings.width && body.width()) 
                tmp.width = body.width();
            $.extend(initSettingsSize, tmp);
            $.nyroModalSettings(tmp)
        }
    }
    function galleryCounts(nb, total, elts, settings){
        if (total > 1) 
            settings.title += (settings.title ? ' - ' : '') + nb + '/' + total
    }
    function endHideContent(){
        debug('endHideContent');
        modal.anim = false;
        if (contentEltLast) {
            contentEltLast.append(modal.content.contents());
            contentEltLast = null
        }
        else 
            if (contentElt) {
                contentElt.append(modal.content.contents());
                contentElt = null
            }
        modal.content.empty();
        gallery = {};
        modal.contentWrapper.hide().children().remove().empty().attr('style', '').hide();
        if (modal.closing || modal.transition) 
            modal.contentWrapper.hide();
        modal.contentWrapper.css(currentSettings.css.wrapper).append(modal.content);
        showContentOrLoading()
    }
    function endRemove(){
        debug('endRemove');
        $(document).unbind('keydown', keyHandler);
        modal.anim = false;
        modal.full.remove();
        modal.full = null;
        if (isIE6) {
            body.css({
                height: '',
                width: '',
                position: '',
                overflow: ''
            });
            $('html').css({
                overflow: ''
            })
        }
        if ($.isFunction(currentSettings.endRemove)) 
            currentSettings.endRemove(modal, currentSettings)
    }
    function endBackground(){
        debug('endBackground');
        modal.ready = true;
        modal.anim = false;
        showContentOrLoading()
    }
    function endShowContent(){
        debug('endShowContent');
        modal.anim = false;
        modal.animContent = false;
        modal.contentWrapper.css({
            opacity: ''
        });
        fixFF = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) && parseFloat(browserVersion) < 1.9 && currentSettings.type != 'image';
        if (fixFF) 
            modal.content.css({
                position: 'fixed'
            });
        modal.content.append(modal.scriptsShown);
        if (currentSettings.type == 'iframe') 
            modal.content.find('iframe').attr('src', currentSettings.url);
        if ($.isFunction(currentSettings.endShowContent)) 
            currentSettings.endShowContent(modal, currentSettings);
        if (shouldResize) {
            shouldResize = false;
            $.nyroModalSettings({
                width: currentSettings.setWidth,
                height: currentSettings.setHeight
            });
            delete currentSettings['setWidth'];
            delete currentSettings['setHeight']
        }
        if (resized.width) 
            setCurrentSettings({
                width: null
            });
        if (resized.height) 
            setCurrentSettings({
                height: null
            })
    }
    function getHash(url){
        if (typeof url == 'string') {
            var hashPos = url.indexOf('#');
            if (hashPos > -1) 
                return url.substring(hashPos)
        }
        return ''
    }
    function filterScripts(data){
        if (typeof data == 'string') 
            data = data.replace(/<\/?(html|head|body)([^>]*)>/gi, '');
        var tmp = new Array();
        $.each($.clean({
            0: data
        }, this.ownerDocument), function(){
            if ($.nodeName(this, "script")) {
                if (!this.src || $(this).attr('rel') == 'forceLoad') {
                    if ($(this).attr('rev') == 'shown') 
                        modal.scriptsShown.push(this);
                    else 
                        modal.scripts.push(this)
                }
            }
            else 
                tmp.push(this)
        });
        return tmp
    }
    function getOuter(elm){
        elm = elm.get(0);
        var ret = {
            h: {
                margin: getCurCSS(elm, 'marginTop') + getCurCSS(elm, 'marginBottom'),
                border: getCurCSS(elm, 'borderTopWidth') + getCurCSS(elm, 'borderBottomWidth'),
                padding: getCurCSS(elm, 'paddingTop') + getCurCSS(elm, 'paddingBottom')
            },
            w: {
                margin: getCurCSS(elm, 'marginLeft') + getCurCSS(elm, 'marginRight'),
                border: getCurCSS(elm, 'borderLeftWidth') + getCurCSS(elm, 'borderRightWidth'),
                padding: getCurCSS(elm, 'paddingLeft') + getCurCSS(elm, 'paddingRight')
            }
        };
        ret.h.outer = ret.h.margin + ret.h.border;
        ret.w.outer = ret.w.margin + ret.w.border;
        ret.h.inner = ret.h.padding + ret.h.border;
        ret.w.inner = ret.w.padding + ret.w.border;
        ret.h.total = ret.h.outer + ret.h.padding;
        ret.w.total = ret.w.outer + ret.w.padding;
        return ret
    }
    function getCurCSS(elm, name){
        var ret = parseInt($.curCSS(elm, name, true));
        if (isNaN(ret)) 
            ret = 0;
        return ret
    }
    function debug(msg){
        if ($.fn.nyroModal.settings.debug || currentSettings && currentSettings.debug) 
            nyroModalDebug(msg, modal, currentSettings ||
            {})
    }
    function showBackground(elts, settings, callback){
        elts.bg.css({
            opacity: 0
        }).fadeTo(500, 0.75, callback)
    }
    function hideBackground(elts, settings, callback){
        elts.bg.fadeOut(300, callback)
    }
    function showLoading(elts, settings, callback){
	
        elts.loading.css({
            marginTop: settings.marginTopLoading + 'px',
            marginLeft: settings.marginLeftLoading + 'px',
            opacity: 0
        }).show().animate({
            opacity: 1
        }, {
            complete: callback,
            duration: 400
        })
    }
    function hideLoading(elts, settings, callback){
        callback()
    }
    function showContent(elts, settings, callback){
        elts.loading.css({
            marginTop: settings.marginTopLoading + 'px',
            marginLeft: settings.marginLeftLoading + 'px'
        }).show().animate({
            width: settings.width + 'px',
            height: settings.height + 'px',
            marginTop: settings.marginTop + 'px',
            marginLeft: settings.marginLeft + 'px'
        }, {
            duration: 350,
            complete: function(){
                elts.contentWrapper.css({
                    width: settings.width + 'px',
                    height: settings.height + 'px',
                    marginTop: settings.marginTop + 'px',
                    marginLeft: settings.marginLeft + 'px'
                }).show();
                elts.loading.fadeOut(200, callback)
            }
        })
    }
    function hideContent(elts, settings, callback){
        elts.contentWrapper.animate({
            height: '50px',
            width: '50px',
            marginTop: (-(25 + settings.borderH) / 2 + settings.marginScrollTop) + 'px',
            marginLeft: (-(25 + settings.borderW) / 2 + settings.marginScrollLeft) + 'px'
        }, {
            duration: 350,
            complete: function(){
                elts.contentWrapper.hide();
                callback()
            }
        })
    }
    function showTransition(elts, settings, callback){
        elts.loading.css({
            marginTop: elts.contentWrapper.css('marginTop'),
            marginLeft: elts.contentWrapper.css('marginLeft'),
            height: elts.contentWrapper.css('height'),
            width: elts.contentWrapper.css('width'),
            opacity: 0
        }).show().fadeTo(400, 1, function(){
            elts.contentWrapper.hide();
            callback()
        })
    }
    function hideTransition(elts, settings, callback){
        elts.contentWrapper.hide().css({
            width: settings.width + 'px',
            height: settings.height + 'px',
            marginLeft: settings.marginLeft + 'px',
            marginTop: settings.marginTop + 'px',
            opacity: 1
        });
        elts.loading.animate({
            width: settings.width + 'px',
            height: settings.height + 'px',
            marginLeft: settings.marginLeft + 'px',
            marginTop: settings.marginTop + 'px'
        }, {
            complete: function(){
                elts.contentWrapper.show();
                elts.loading.fadeOut(400, function(){
                    elts.loading.hide();
                    callback()
                })
            },
            duration: 350
        })
    }
    function resize(elts, settings, callback){
        elts.contentWrapper.animate({
            width: settings.width + 'px',
            height: settings.height + 'px',
            marginLeft: settings.marginLeft + 'px',
            marginTop: settings.marginTop + 'px'
        }, {
            complete: callback,
            duration: 400
        })
    }
    function updateBgColor(elts, settings, callback){
        if (!$.fx.step.backgroundColor) {
            elts.bg.css({
                backgroundColor: settings.bgColor
            });
            callback()
        }
        else 
            elts.bg.animate({
                backgroundColor: settings.bgColor
            }, {
                complete: callback,
                duration: 400
            })
    }
    $($.fn.nyroModal.settings.openSelector).nyroModal()
});
function nyroModalDebug(msg, elts, settings){
    if (elts.full) 
        elts.bg.prepend(msg + '<br />')
}
