XoopsModules25x/xoopsinfo

View on GitHub
phpsysinfo/js/jQuery/jquery.nyroModal.js

Summary

Maintainability
F
1 wk
Test Coverage
/*
 * nyroModal - jQuery Plugin
 * http://nyromodal.nyrodev.com
 *
 * Copyright (c) 2010 Cedric Nirousset (nyrodev.com)
 * Licensed under the MIT license
 *
 * $Date: 2010-02-23 (Tue, 23 Feb 2010) $
 * $version: 1.6.2+jquery1.8fix+bindfix+ff2fix
 */
jQuery(function($) {

    // -------------------------------------------------------
    // Private Variables
    // -------------------------------------------------------

    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 || typeof(XMLHttpRequest) === 'function'));
    var body = $('body');

    var currentSettings;
    var callingSettings;

    var shouldResize = false;

    var gallery = {};

    // To know if the fix for the Issue 10 should be applied (or has been applied)
    var fixFF = false;

    // Used for retrieve the content from an hidden div
    var contentElt;
    var contentEltLast;

    // Contains info about nyroModal state and all div references
    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()
    };

    // Indicate of the height or the width was resized, to reinit the currentsettings related to null
    var resized = {
        width: false,
        height: false,
        windowResizing: false
    };

    var initSettingsSize = {
        width: null,
        height: null,
        windowResizing: true
    };

    var windowResizeTimeout;


    // -------------------------------------------------------
    // Public function
    // -------------------------------------------------------

    // jQuery extension function. A paramater object could be used to overwrite the default settings
    $.fn.nyroModal = function(settings) {
        if (!this)
            return false;
        return this.each(function() {
            var me = $(this);
            if (this.nodeName.toLowerCase() == 'form') {
                me
                .off('submit.nyroModal')
                .on('submit.nyroModal', function(e) {
                    if(e.isDefaultPrevented())
                        return false;
                    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
                .off('click.nyroModal')
                .on('click.nyroModal', function(e) {
                    if(e.isDefaultPrevented())
                        return false;
                    e.preventDefault();
                    processModal($.extend(settings, {
                        from: this
                    }));
                    return false;
                });
            }
        });
    };

    // jQuery extension function to call manually the modal. A paramater object could be used to overwrite the default settings
    $.fn.nyroModalManual = function(settings) {
        if (!this.length)
            processModal(settings);
        return this.each(function(){
            processModal($.extend(settings, {
                from: this
            }));
        });
    };

    $.nyroModalManual = function(settings) {
        processModal(settings);
    };

    // Update the current settings
    // object settings
    // string deep1 first key where overwrite the settings
    // string deep2 second key where overwrite the 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);
                    });
                }
            }
        }
    };

    // Remove the modal function
    $.nyroModalRemove = function() {
        removeModal();
    };

    // Go to the next image for a gallery
    // return false if nothing was done
    $.nyroModalNext = function() {
        var link = getGalleryLink(1);
        if (link)
            return link.nyroModalManual(getCurrentSettingsNew());
        return false;
    };

    // Go to the previous image for a gallery
    // return false if nothing was done
    $.nyroModalPrev = function() {
        var link = getGalleryLink(-1);
        if (link)
            return link.nyroModalManual(getCurrentSettingsNew());
        return false;
    };


    // -------------------------------------------------------
    // Default Settings
    // -------------------------------------------------------

    $.fn.nyroModal.settings = {
        debug: false, // Show the debug in the background

        blocker: false, // Element which will be blocked by the modal
        
        windowResize: true, // indicates if the modal should resize when the window is resized

        modal: false, // Esc key or click backgrdound enabling or not

        type: '', // nyroModal type (form, formData, iframe, image, etc...)
        forceType: null, // Used to force the type
        from: '', // Dom object where the call come from
        hash: '', // Eventual hash in the url

        processHandler: null, // Handler just before the real process

        selIndicator: 'nyroModalSel', // Value added when a form or Ajax is sent with a filter content

        formIndicator: 'nyroModal', // Value added when a form is sent

        content: null, // Raw content if type content is used

        bgColor: '#000000', // Background color

        ajax: {}, // Ajax option (url, data, type, success will be overwritten for a form, url and success only for an ajax call)

        swf: { // Swf player options if swf type is used.
            wmode: 'transparent'
        },

        width: null, // default Width If null, will be calculate automatically
        height: null, // default Height If null, will be calculate automatically

        minWidth: 400, // Minimum width
        minHeight: 300, // Minimum height

        resizable: true, // Indicate if the content is resizable. Will be set to false for swf
        autoSizable: true, // Indicate if the content is auto sizable. If not, the min size will be used

        padding: 25, // padding for the max modal size

        regexImg: '[^\.]\.(jpg|jpeg|png|tiff|gif|bmp)\s*$', // Regex to find images
        addImageDivTitle: false, // Indicate if the div title should be inserted
        defaultImgAlt: 'Image', // Default alt attribute for the images
        setWidthImgTitle: true, // Set the width to the image title
        ltr: true, // Left to Right by default. Put to false for Hebrew or Right to Left language

        gallery: null, // Gallery name if provided
        galleryLinks: '<a href="#" class="nyroModalPrev">Prev</a><a href="#"  class="nyroModalNext">Next</a>', // Use .nyroModalPrev and .nyroModalNext to set the navigation link
        galleryCounts: galleryCounts, // Callback to show the gallery count
        galleryLoop: false, // Indicate if the gallery should loop

        zIndexStart: 100,

        cssOpt: { // Default CSS option for the nyroModal Div. Some will be overwritten or updated when using IE6
            bg: {
                position: 'absolute',
                overflow: 'hidden',
                top: 0,
                left: 0,
                height: '100%',
                width: '100%'
            },
            wrapper: {
                position: 'absolute',
                top: '50%',
                left: '50%'
            },
            wrapper2: {
            },
            content: {
            },
            loading: {
                position: 'absolute',
                top: '50%',
                left: '50%',
                marginTop: '-50px',
                marginLeft: '-50px'
            }
        },

        wrap: { // Wrapper div used to style the modal regarding the content type
            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"></a>', // Adding automaticly as the first child of #nyroModalWrapper

        title: null, // Modal title
        titleFromIframe: true, // When using iframe in the same domain, try to get the title from it

        openSelector: '.nyroModal', // selector for open a new modal. will be used to parse automaticly at page loading
        closeSelector: '.nyroModalClose', // selector to close the modal

        contentLoading: '<a href="#" class="nyroModalClose">Cancel</a>', // Loading div content

        errorClass: 'error', // CSS Error class added to the loading div in case of error
        contentError: 'The requested content cannot be loaded.<br />Please try again later.<br /><a href="#" class="nyroModalClose">Close</a>', // Content placed in the loading div in case of error

        handleError: null, // Callback in case of error

        showBackground: showBackground, // Show background animation function
        hideBackground: hideBackground, // Hide background animation function

        endFillContent: null, // Will be called after filling and wraping the content, before parsing closeSelector and openSelector and showing the content
        showContent: showContent, // Show content animation function
        endShowContent: null, // Will be called once the content is shown
        beforeHideContent: null, // Will be called just before the modal closing
        hideContent: hideContent, // Hide content animation function

        showTransition: showTransition, // Show the transition animation (a modal is already shown and a new one is requested)
        hideTransition: hideTransition, // Hide the transition animation to show the content

        showLoading: showLoading, // show loading animation function
        hideLoading: hideLoading, // hide loading animation function

        resize: resize, // Resize animation function
        endResize: null, // Will be called one the content is resized

        updateBgColor: updateBgColor, // Change background color animation function

        endRemove: null // Will be called once the modal is totally gone
    };

    // -------------------------------------------------------
    // Private function
    // -------------------------------------------------------

    // Main function
    function processModal(settings) {
        if (modal.loadingShown || modal.transition || modal.anim)
            return;
        debug('processModal');
        modal.started = true;
        callingSettings = $.extend(true, settings);
        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') {
            // Swf is transforming as a raw content
            setCurrentSettings({overflow: 'visible'}, 'cssOpt', '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)});
                showModal();
                $.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'));
            } else if (currentSettings.type == 'formData') {
                // Form with data. We're using a hidden iframe
                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:\'\';"></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).off('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: 'visible'}, 'cssOpt', '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:\'\';" 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:\'\';" 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) {
                // Could be every other kind of type or a dom selector
                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);
                    }
                }
                showModal();
                $.ajax($.extend(true, currentSettings.ajax, {
                    url: url,
                    success: ajaxLoaded,
                    error: loadingError,
                    data: data
                }));
            }
        } else if (currentSettings.content) {
            // Raw content not from a DOM element
            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 {
            // What should we show here? nothing happen
        }
    }

    // Update the current settings
    // object settings
    // string deep1 first key where overwrite the settings
    // string deep2 second key where overwrite the settings
    function setDefaultCurrentSettings(settings) {
        debug('setDefaultCurrentSettings');
        currentSettings = $.extend(true, {}, $.fn.nyroModal.settings, settings);
        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);
            }
        }
    }

    // Set the margin for postionning the element. Useful for IE6
    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;
        }
    }

    // Set the margin for the content
    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;
        }
    }

    // Set the margin for the current loading
    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.marginLeftLoading+= currentSettings.marginScrollLeft;
            currentSettings.marginTopLoading+= currentSettings.marginScrollTop;
        }
    }

    // Set the modal Title
    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>');
    }

    // Init the nyroModal div by settings the CSS elements and hide needed elements
    function initModal() {
        debug('initModal');
        if (!modal.full) {
            if (currentSettings.debug)
                setCurrentSettings({color: 'white'}, 'cssOpt', '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
                    }, 'cssOpt', '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({
                    marginLeft: 0,
                    marginRight: 0
                });
                var w = body.width();
                var h = $(window).height()+'px';
                if ($(window).height() >= body.outerHeight()) {
                    h = body.outerHeight()+'px';
                } else
                    w+= 20;
                w += 'px';
                body.css({
                    width: w,
                    height: h,
                    position: 'static',
                    overflow: 'hidden'
                });
                $('html').css({overflow: 'hidden'});
                setCurrentSettings({
                    cssOpt: {
                        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:\'\';"></iframe>')
                                .css($.extend({},
                                    currentSettings.cssOpt.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.cssOpt.bg))
                .before(iframeHideIE);
            modal.bg.on('click.nyroModal', clickBg);
            modal.loading = $('#nyroModalLoading')
                .css(currentSettings.cssOpt.loading)
                .hide();
            modal.contentWrapper = $('#nyroModalWrapper')
                .css(currentSettings.cssOpt.wrapper)
                .hide();
            modal.content = $('#nyroModalContent');
            modal.tmp = $('#nyrModalTmp').hide();

            // To stop the mousewheel if the the plugin is available
            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).on('keydown.nyroModal', keyHandler);
            modal.content.css({width: 'auto', height: 'auto'});
            modal.contentWrapper.css({width: 'auto', height: 'auto'});

            if (!currentSettings.blocker && currentSettings.windowResize) {
                $(window).on('resize.nyroModal', function() {
                    window.clearTimeout(windowResizeTimeout);
                    windowResizeTimeout = window.setTimeout(windowResizeHandler, 200);
                });
            }
        }
    }

    function windowResizeHandler() {
        $.nyroModalSettings(initSettingsSize);
    }

    // Show the modal (ie: the background and then the loading if needed or the content directly)
    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();});
        }
    }

    // Called when user click on background
    function clickBg(e) {
        if (!currentSettings.modal)
            removeModal();
    }
    
    // Used for the escape key or the arrow in the gallery type
    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;
            }
        }
    }

    // Determine the filetype regarding the link DOM element
    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://|https://", "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;
    }

    // Called when the content cannot be loaded or tiemout reached
    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)
            .off('click.nyroModal')
            .on('click.nyroModal', removeModal);
        setMarginLoading();
        modal.loading
            .css({
                marginTop: currentSettings.marginTopLoading+'px',
                marginLeft: currentSettings.marginLeftLoading+'px'
            });
    }

    // Put the content from modal.tmp to modal.content
    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)
            .off('click.nyroModal')
            .on('click.nyroModal', removeModal);
        $(currentSettings.openSelector, modal.contentWrapper).nyroModal(getCurrentSettingsNew());
    }

    // Get the current settings to be used in new links
    function getCurrentSettingsNew() {
        return callingSettings;
        /*
        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.cssOpt.content.overflow = 'auto';
        return currentSettingsNew;
        */
    }

    // Wrap the content and update the modal size if needed
    function wrapContent() {
        debug('wrapContent');

        var wrap = $(currentSettings.wrap[currentSettings.type]);
        modal.content.append(wrap.children().remove());
        modal.contentWrapper.wrapInner(wrap);

        if (currentSettings.gallery) {
            // Set the action for the next and prev button (or remove them)
            modal.content.append(currentSettings.galleryLinks);

            gallery.links = $('[rel="'+currentSettings.gallery+'"], [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:\'\';"></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:\'\';"></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);
            else if (currentSettings.galleryLoop) {
                if (index < 0)
                    return gallery.links.eq(gallery.links.length-1);
                else
                    return gallery.links.eq(0);
            }
        }
        return false;
    }

    // Calculate the size for the contentWrapper
    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) {
                // We're gonna resize the modal as it will goes outside the view port
                if (currentSettings.type == 'image' || currentSettings.type == 'swf') {
                    // An image is resized proportionnaly
                    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 {
                    // For an HTML content, we simply decrease the size
                    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.cssOpt.content));
        modal.wrapper.css($.extend({}, tmp.wrapper2, currentSettings.cssOpt.wrapper2));

        if (!resizing)
            modal.contentWrapper.css($.extend({}, tmp.wrapper, currentSettings.cssOpt.wrapper));

        if (currentSettings.type == 'image' && currentSettings.addImageDivTitle) {
            // Adding the title for the image
            $('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).off('keydown.nyroModal');
            if (!currentSettings.blocker)
                $(window).off('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: ''}); // Fix Issue #10, remove the attribute
                modal.wrapper.css({overflow: 'hidden'}); // Used to fix a visual issue when hiding
                modal.content.css({overflow: 'hidden'}); // Used to fix a visual issue when hiding
                $('iframe', modal.content).hide(); // Fix issue 359
                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)
                    .off('click.nyroModal')
                    .on('click.nyroModal', removeModal);
                setMarginLoading();
                currentSettings.showLoading(modal, currentSettings, function(){modal.anim=false;showContentOrLoading();});
            }
        }
    }
    
    // -------------------------------------------------------
    // Private Data Loaded callback
    // -------------------------------------------------------

    function ajaxLoaded(data) {
        debug('AjaxLoaded: '+this.url);
        
        if (currentSettings.selector) {
            var tmp = {};
            var i = 0;
            // Looking for script to store them
            data = data
                .replace(/\r\n/gi,'nyroModalLN')
                .replace(/<script(.|\s)*?\/script>/gi, function(x) {
                        tmp[i] = x;
                        return '<pre style="display: none" class=nyroModalScript rel="'+(i++)+'"></pre>';
                    });
            data = $('<div>'+data+'</div>').find(currentSettings.selector).html()
                .replace(/<pre style="display: none;?" class="?nyroModalScript"? rel="(.?)"><\/pre>/gi, function(x, y, z) {
                    return tmp[y];
                })
                .replace(/nyroModalLN/gi,"\r\n");
        }
        modal.tmp.html(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.off('load').contents().find(currentSettings.selector || 'body').not('script[src]');
        iframe.attr('src', 'about:blank'); // Used to stop the loading in FF
        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) {
                    // for IE
                    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;
    }


    // -------------------------------------------------------
    // Private Animation callback
    // -------------------------------------------------------

    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.cssOpt.wrapper)
            .append(modal.content);
        showContentOrLoading();
    }

    function endRemove() {
        debug('endRemove');
        $(document).off('keydown', keyHandler);
        modal.anim = false;
        modal.full.remove();
        modal.full = null;
        if (isIE6) {
            body.css({height: '', width: '', position: '', overflow: '', marginLeft: '', marginRight: ''});
            $('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: ''}); // for the close button in IE
        fixFF = /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent) && parseFloat(browserVersion) < 1.9 && currentSettings.type != 'image';

        if (fixFF)
            modal.content.css({position: 'fixed'}); // Fix Issue #10
        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});
    }


    // -------------------------------------------------------
    // Utilities
    // -------------------------------------------------------

    // Get the selector from an url (as string)
    function getHash(url) {
        if (typeof url == 'string') {
            var hashPos = url.indexOf('#');
            if (hashPos > -1)
                return url.substring(hashPos);
        }
        return '';
    }

    // Filter an html content to remove the script[src]
    function filterScripts(data) {
        // Removing the body, head and html tag
        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;
    }

    // Get the vertical and horizontal margin, padding and border dimension
    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($.css(elm, name, true));
        if (isNaN(ret))
            ret = 0;
        return ret;
    }

    // Proxy Debug function
    function debug(msg) {
        if ($.fn.nyroModal.settings.debug || currentSettings && currentSettings.debug)
            nyroModalDebug(msg, modal, currentSettings || {});
    }

    // -------------------------------------------------------
    // Default animation function
    // -------------------------------------------------------

    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) {
        // Put the loading with the same dimensions of the current content
        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) {
        // Place the content wrapper underneath the the loading with the right dimensions
        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});
    }

    // -------------------------------------------------------
    // Default initialization
    // -------------------------------------------------------

    $($.fn.nyroModal.settings.openSelector).nyroModal();

});

// Default debug function, to be overwritten if needed
//      Be aware that the settings parameter could be empty
var tmpDebug = '';
function nyroModalDebug(msg, elts, settings) {
    if (elts.full && elts.bg) {
        elts.bg.prepend(msg+'<br />'+tmpDebug);
        tmpDebug = '';
    } else
        tmpDebug+= msg+'<br />';
}