(function($){

var num = 0;
var basez = 10000;

window.shiftpress.modal = function(options) {
    var defaults = {
        id: 'sp-modal-' + (++num),
        title: null,
        callback: null,
        url: null,
        content: null,
        appendTo: 'body',
        showClose: true,
        overlayClose: true,
        maxWidth: null,
        minWidth: null,
        show: null,
        autoCenter: false,
        waitQueue: 0,
        waitForReady: false
    };

    options = $.extend(defaults, options);

    function showWindowWhenReady() {
        if (++ready < 2 || options.waitForReady) {
            return;
        }

        wait(null, false);

        showWindow();
    }

    function showWindow() {
        wndw.fadeIn();
        center();
        center();

        if (options.show) {
            options.show(modal);
        }

        if (options.autoCenter) {
            (function update() {
                // make sure the modal window still exists!
                if (modal.is(":visible") && options.autoCenter) {
                    center();
                    setTimeout(update, 100);
                }
            })();
        }
    }

    function close() {
        var done = 0;

        function cleanup() {
            if (++done < 2) {
                return;
            }

            modal.remove();
        }

        var close = true;
        if (options.callback) {
            close = options.callback(modal);
        }

        if (close) {
            wait(null, false);
            wndw.fadeOut(cleanup);
            overlay.fadeOut(cleanup);

            // close all tooltips
            $('.sp-tooltip').trigger('tooltipclose');
        }
    }

    function wait(e, enable) {
        if (enable == undefined) {
            enable = true;
        }

        var waitoverlay = $('.sp-modal-wait_overlay', modal);

        if (enable) {
            ++options.waitQueue;

            if (waitoverlay.length == 0) {
                modal.append($('<div />')
                    .addClass('sp-modal-wait_overlay')
                    .css({ zIndex: basez++ })
                    .show()
                    .append($('<div />')
                        .hide()
                        .addClass('sp-modal-wait_overlay-spinner')
                        .fadeIn()
                    )
                );
            } else {
                waitoverlay.stop().animate({ opacity: 1 });
            }
        } else {
            --options.waitQueue;

            if (options.waitQueue == 0) {
                waitoverlay.animate({ opacity: 0 }, function() { $(this).remove(); });
            } else if (options.waitQueue < 0) {
                // safety
                options.waitQueue = 0;
            }
        }
    }

    function title(e, title) {
        $('h1', titlebar).text(title);
    }

    function center(e) {
        wndw
            .css({ // for some reason, this forces a recalculation
                marginTop: -wndw.height() / 2,
                marginLeft: -wndw.width() / 2
            })
        ; 
    }

    var modal = $('<div />')
        .addClass('sp-modal-wrapper')
        .css({ zIndex: basez, position: "fixed" })
        .attr({
            id: options.id
        })
        .hide()
    ;
    var overlay = $('<div />')
        .addClass('sp-modal-overlay-wrapper')
        .css({ zIndex: basez++ })
        .append($('<div />').addClass('sp-modal-overlay'))
        .appendTo(modal)
    ;
    var titlebar = $('<div />')
        .addClass('sp-modal-title')
        .append($('<h1 />').text(options.title))
        .append($('<div />')
            .addClass('sp-modal-close')
            .click(close)
        )
    ;

    if (!options.showClose) {
        $('.sp-modal-close', titlebar).remove();
    } else {
        $('h1', titlebar).addClass('sp-modal-has-close');
    }

    var content = $('<div />')
        .addClass('sp-modal-content')
    ;
    var wndw = $('<div />')
        .addClass('sp-modal-window-wrapper')
        .css({ zIndex: basez++ })
        .append($('<div />').addClass('sp-modal-window').append(titlebar).append(content))
        .appendTo(modal)
        .hide()
    ;

    if (options.maxWidth) {
        wndw.css('maxWidth', options.maxWidth);
    }

    if (options.minWidth) {
        wndw.css('minWidth', options.minWidth);
    }

    // setup the events
    modal.bind('modalclose', close);
    modal.bind('modalwait', wait);
    modal.bind('modaltitle', title);
    modal.bind('modalcenter', center);
    modal.bind('modalready', function() {
        options.waitForReady = false;
        showWindowWhenReady();
    });

    modal.keyup(function(e) {
        if (e.keyCode == 13) {
            var buttons = [
                "button.button-primary",
                "input.button-primary",
                "button",
                "input[type=submit]",
                "input[type=button]"
            ];

            for (i = 0; i < buttons.length; ++i) {
                var $button = $(buttons[i]);
                if ($button.length > 0) {
                    $button.first().click();
                    e.stopPropagation();
                    return false;
                }
            }
        }
    }, 999);

    var ready = 0;

    if (options.overlayClose) {
        overlay.click(close);
    }

    modal.appendTo($(options.appendTo)).fadeIn(showWindowWhenReady);

    if (options.url) {
        wait();
        content.load(options.url, showWindowWhenReady);
    } else {
        content.html(options.content);
        showWindowWhenReady();
    }

    return modal;
};

window.shiftpress.modal_yesno = function(options) {
    var buttonpushed = null;

    var defaults = {
        title: "Question",
        content: "Would you like to continue?",
        showClose: false,
        overlayClose: false,
        maxWidth: 400,
        callback: function(modal) {
            if (buttonpushed == null) {
                // fall through
            } else if (buttonpushed) {
                if (options.yes) {
                    if (options.yes(modal) == false) {
                        return false;
                    }
                }
            } else {
                if (options.no) {
                    if (options.no(modal) == false) {
                        return false;
                    }
                }
            }

            return true;
        }
    }

    options = $.extend(defaults, options);

    var realcontent = $('<div class="sp-modal-yesno"><div class="sp-modal-yesno-content">' + options.content + '</div><div class="sp-modal-bottom"><div class="sp-buttons"><button class="sp-button sp-button-yes"><span></span>Yes</button><button class="sp-button sp-button-secondary sp-button-no">No</button></div></div></div>');
    var modal;

    $('.sp-button-yes', realcontent).click(function() {
        buttonpushed = true;
        modal.trigger('modalclose');
        return false;
    });

    $('.sp-button-no', realcontent).click(function() {
        buttonpushed = false;
        modal.trigger('modalclose');
        return false;
    });

    options = $.extend(options, {
        content: realcontent
    });

    modal = shiftpress.modal(options);
};

window.shiftpress.modal_ok = function(options, title) {
    if (typeof options == "string") {
        options = {
            content: "<p>" + options + "</p>"
        };

    }

    if (typeof title == "string") {
        options.title = title;
    }

    var defaults = {
        id: "modal-okay",
        title: "Message",
        maxWidth: 400
    };

    options = $.extend(defaults, options);
    options.content = $('<div class="sp-modal-okay-content">' + options.content + '</div><div class="sp-modal-bottom"><div class="sp-buttons"><button class="sp-button sp-button-ok">Okay</button></div></div>');

    $('.sp-button-ok', options.content).click(function() {
        modal.trigger('modalclose');
        return false;
    });

    var modal = shiftpress.modal(options);
};  

window.shiftpress.modal_error = function(content, error) {
    var options = {
        id: "modal-error",
        title: "Error",
        content: '<div class="sp-modal-error-content"><p>' + content + '</p><p>Technical details are listed below:<blockquote>' + error + '</blockquote><p>Please provide the above details to ShiftPress support if you are unable to resolve the problem: <a href="mailto:' + shiftpress.SUPPORT_EMAIL + '">' + shiftpress.SUPPORT_EMAIL + '</a>.</p></div>'

    };

    var modal = shiftpress.modal_ok(options);
};

})(jQuery);

