// jQuery Popup Box
// by Haroon Rafi
// 8th March 2011

(function ($) {
    $.fn.popupBox = function (options) {

        // Default settings, do not modify here - pass required settings as plugin options instead
        var defaults = {
            autoOpen: false,
            autoOpenChildSelector: '.keep-popup-open',
            appendToForm: true,
            formSelector: 'body > form',
            doFade: true,
            fadeTime: 800,
            darkenFadeTime: -1,
            openLinkSelector: '.popup-open-link',
            closeLinkSelector: '.popup-close-link',
            disableClosePostAction: true,
            clickOutsideClose: true,
            darkenBackground: true,
            darkenOpacity: 0.6,
            popupOpacity: 1.0,
            autoCloseButton: false,
            autoCloseButtonClass: 'popup-close-link',
            autoCloseButtonText: 'Close'
        };

        var opts = $.extend(defaults, options);

        if (opts.darkenFadeTime < 0) opts.darkenFadeTime = opts.fadeTime;

        var $target = this;
        var $openLink = $(opts.openLinkSelector);
        var $closeLink = $(opts.closeLinkSelector);

        var $screenLock = $('#screen-lock');
        if ($screenLock.length < 1 && opts.darkenBackground) {
            $screenLock = $('<div id="screen-lock" style="position: absolute; left: 0; top: 0; background: black; width: 100%; height: 50px; z-index: 9988; display:none;"></div>');
            $('body').append($screenLock);
            $screenLock.height($(document).height());
        }

        return this.each(function () {

            $target.hide();

            var $closeButton = $('<a href="#" title="' + opts.autoCloseButtonText + '">' + opts.autoCloseButtonText + '</a>');
            $closeButton.addClass(opts.autoCloseButtonClass);
            if (opts.autoCloseButton) {
                $target.prepend($closeButton);
            }

            centerPopup();

            var $foundAutoOpenChild = $target.find(opts.autoOpenChildSelector).length;
            if (opts.autoOpen || $foundAutoOpenChild > 0) {
                if ($foundAutoOpenChild) showTarget(true);
                else showTarget();
            }


            $openLink.click(function () {
                showTarget();
                return false;
            });

            $closeLink.click(function () {
                hideTarget();
                if(opts.disableClosePostAction) return false;
            });

            $closeButton.click(function () {
                hideTarget();
                return false;
            });

            $screenLock.click(function () {
                if (opts.clickOutsideClose) hideTarget();
                return false;
            });

            function showTarget() {
                showTarget(false);
            }

            function showTarget(noFade) {
                if (opts.doFade && !noFade) {
                    if (opts.darkenBackground) $screenLock.fadeTo(opts.darkenFadeTime, opts.darkenOpacity);
                    $target.fadeTo(opts.fadeTime, opts.popupOpacity);
                }
                else {
                    if (opts.darkenBackground) $screenLock.fadeTo(0, opts.darkenOpacity);
                    $target.show();
                }
            }

            function hideTarget() {
                if (opts.doFade) {
                    if (opts.darkenBackground) $screenLock.fadeOut(opts.darkenFadeTime);
                    $target.fadeOut(opts.fadeTime);
                }
                else {
                    if (opts.darkenBackground) $screenLock.hide();
                    $target.hide();
                }
            }

            function centerPopup() {
                if (opts.appendToForm) $(opts.formSelector).append($target);
                else $('body').append($target);
                var $targetWidth = $target.outerWidth();
                var $targetHeight = $target.outerHeight();
                $target.css({ 'position': 'absolute', 'zIndex': 9999 });
                var horPos = ($(window).width() / 2) - ($targetWidth / 2);
                var verPos = ($(window).height() / 2) - ($targetHeight / 2);
                $target.css('top', verPos + "px");
                $target.css('left', horPos + "px");
            }
        });
    };
})(jQuery);
