﻿//opts : disableOverlayClose, when true is disables the wrapper(faded out area) to be clickable and does not hidden the pop up
//opts : onBeforePopup, fires before popup is created return false to disable
$.fn.popup = function (content, opts) {
    opts = opts || {};

    return $(this).each(function () {
        var $popup = $(this);
        var $popupContent = content;
        if (typeof (content) == 'string') {
            $popupContent = $('<div>').html(content);
        }
        else if (typeof (content) == 'undefined') $popupContent = $popup.next();

        var removeContentLater = false;
        if ($popupContent.parent().length == 0) {
            removeContentLater = true;
            $popupContent.appendTo(document.body);
            if (typeof (content) == 'string') {
                var contentCss = { width: $popupContent.width(), height: $popupContent.height() };
                if ($popupContent.children().length == 1) { var $child = $popupContent.children().first(); contentCss = { width: $child.width(), height: $child.height()} }
                $popupContent.css(contentCss).hide();
            }
        }

        $popup.click(function () {
            if (typeof opts.onBeforePopup == 'function') {
                if (opts.onBeforePopup() === false) return;
            }

            var $overlay = $('<div>').addClass('popup-overlay');
            var $wrapper = $('<div>').addClass('popup-wrapper');

            $popupContent.show();

            // wrap popupContent
            $wrapper.insertBefore($popupContent);
            $wrapper.append($popupContent);

            $overlay.prependTo(document.body);

            // IE7 HACK, see below for more
            if ($.browser.msie && parseInt($.browser.version, 10) == 7) {
                $wrapper.parents().each(function () {
                    var $hack = $(this);
                    if ($hack.css('position') == 'relative') {
                        $hack.css('position', 'static').attr('data-popup-ie-position-hack', '1');
                    }
                });
            }

            $popupContent.addClass('popupContent').css({
                marginLeft: (0 - ($popupContent.width() / 2)),
                marginTop: (0 - ($popupContent.height() / 2))
            });

            var $window = $(window);
            $window.data('popup-content', $popupContent);
            $window.data('popup-overlay', $overlay);
            $window.data('popup-wrapper', $wrapper);
            $window.data('popup-remove-content', removeContentLater);

            $popupContent.find('textarea, input').first().focus();

            $wrapper.click(function (e) {
                var $target = $(e.target);
                if (($target.hasClass('popup-wrapper') && opts.disableOverlayClose != true)
                    || $target.hasClass('close')
                    || $target.hasClass('cancel')) {
                    $.hidePopup();
                }
                if (!$target.is('button, input[type=button], input[type=submit], a')) return false;
            });
            return false;
        });
    });
};

$.popup = function (content, opts) {
    $temp = $('<div>');
    $temp.popup(content, opts);
    $temp.click();
};
$.hidePopup = function () {
    var $window = $(window);
    var $popupContent = $window.data('popup-content');
    var $overlay = $window.data('popup-overlay');
    var $wrapper = $window.data('popup-wrapper');
    var removeContent = $window.data('popup-remove-content');

    // REVERT IE7 HACK, see above for more
    if ($.browser.msie && parseInt($.browser.version, 10) == 7) $wrapper.parents('[data-popup-ie-position-hack]').css('position', 'relative').removeAttr('data-popup-ie-position-hack');

    $popupContent.insertBefore($wrapper).hide();
    $wrapper.remove();
    $overlay.remove();
    if (removeContent) $popupContent.remove();

    $window.removeData('popup-content');
    $window.removeData('popup-overlay');
    $window.removeData('popup-wrapper');
    $window.removeData('popup-remove-content');
};
$(function () {
    $('[data-popup-target]').each(function () {
        $(this).popup($('#' + $(this).attr('data-popup-target')));
    });
});
