﻿/******************************************************************************************************************
* @name: bPopup
* @type: jQuery
* @author: Bjoern Klinggaard (http://dinbror.dk/bpopup)
* @version: 0.3.6
* @requires jQuery 1.3
*
* DEFAULT VALUES:
* amsl(Above Mean Sea Level): 150px // Vertical distance from the middle of the window, + = above, - = under
* appendTo: 'body' // Which element the popup should append to (append to 'form' when ASP.net)
* closeClass: 'bClose' // Class to bind the close event to
* escClose: true // Close on esc
* fadeSpeed: 250 // Animation speed on fadeIn/out
* follow: true // Should the popup follow the screen on scroll/resize? 
* followSpeed: 500 // Animation speed for the popup on scroll/resize
* loadUrl: null // External page or selection to load in popup
* modal: true // Modal overlay
* modalColor: #000 // Modal overlay color
* overlay: 0.5 // Transparency, from 0.1 to 1.0 (filled)
* scrollBar: true // Scrollbars visible
* vStart: null // Vertical start position for popup
* xLink: false // Xlink popup
* zIndex: 9999 // Popup z-index, modal overlay = popup z-index - 1
*
* TODO: REFACTOR CODE!!! easing
*******************************************************************************************************************/
; (function ($) 
{
    $.fn.openPopup = function (options, callback) 
    {
        if ($.isFunction(options)) 
        {
            callback = options;
            options = null;
        }
        o = $.extend({}, $.fn.openPopup.defaults, options);

        //HIDE SCROLLBAR?  
        if (!o.scrollBar) 
        {
            $('html').css('overflow', 'hidden');
        }

        var $selector = $(this),
        $modal = $('<div id="bModal"></div>'),
        d = $(document),
        w = $(window),
        cp = getCenterPosition($selector, o.amsl),
        vPos = cp[0],
        hPos = cp[1],
        isIE6 = $.browser.msie && parseInt($.browser.version) == 6 && typeof window['XMLHttpRequest'] != 'object'; // browser sniffing is bad

        return this.each(function () 
        {
            // MODAL OVERLAY
            if (o.modal) 
            {
                $modal
                .css(getModalStyle())
                .appendTo(o.appendTo)
                .animate({ 'opacity': o.opacity }, o.fadeSpeed);
            }
            // OPEN POPUP  
            create();
        });

        ////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // HELP FUNCTIONS - PRIVATE
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////
        function create() 
        {
            var hasInputField = $('input[type=text]', $selector).length != 0;
            var t = o.vStart != null ? o.vStart : d.scrollTop() + vPos;
            if (o.xLink) 
            {
                //Not generic yet
                $('a#bContinue')
                .attr({ 'href': $('a.xlink').attr('href') });
                $('a#bContinue .btnLink')
                .text($('a.xlink').attr('title'))
            }
            $selector
            .css({ 'left': d.scrollLeft() + hPos, 'position': 'absolute', 'top': t, 'z-index': o.zIndex })
            .appendTo(o.appendTo)
            .hide(function ()
            {
                if (hasInputField) 
                {
                    if(o.resetInputDataWhenClose == true)
                    {
                        // Resets input fields
                        $selector.each(function () 
                        {
                            $selector.find('input[type=text]').val('');
                        });
                    }
                }
                if (o.loadUrl != null)
                    $selector.load(o.loadUrl);
            })
            .fadeIn(o.fadeSpeed, function () 
            {
                if (hasInputField) 
                {
                    $selector.find('input[type=text]:first').focus();
                }
                // Triggering the callback if set    
                $.isFunction(callback) && callback();
            });
            //BIND EVENTS
            bindEvents();
        }

        function close() 
        {
            if (o.modal) 
            {
                $('#bModal')
                .fadeOut(o.fadeSpeed, function () 
                {
                    $('#bModal').remove();
                });
            }
            $selector.fadeOut(o.fadeSpeed, function ()
            {
                if (o.loadUrl != null)
                    $selector.empty();
            });
            unbindEvents();
        }

        function getModalStyle() 
        {
            if (isIE6) 
            {
                var dd = getDocumentDimensions();
                return { 'background-color': o.modalColor, 'height': dd[0], 'left': getDistanceToBodyFromLeft(), 'opacity': 0, 'position': 'absolute', 'top': 0, 'width': dd[1], 'z-index': o.zIndex - 1 };
            }
            else
                return { 'background-color': o.modalColor, 'height': '100%', 'left': 0, 'opacity': 0, 'position': 'fixed', 'top': 0, 'width': '100%', 'z-index': o.zIndex - 1 };
        }

        function bindEvents() 
        {
            $('.' + o.closeClass).live('click', function () 
            {
                close();
                return false;
            });
            if (o.follow) 
            {
                w.bind('scroll.bPopup', function () 
                {
                    $selector
                   .stop()
                   .animate({ 'left': d.scrollLeft() + hPos, 'top': d.scrollTop() + vPos }, o.followSpeed);
                })
               .bind('resize.bPopup', function () 
               {
                   // MODAL OVERLAY IE6
                   if (o.modal && isIE6) {
                       var dd = getDocumentDimensions();
                       $modal
                            .css({ 'height': dd[0], 'width': dd[1], 'left': getDistanceToBodyFromLeft() });
                   }
                   // POPUP
                   var pos = getCenterPosition($selector, o.amsl);
                   vPos = pos[0];
                   hPos = pos[1];
                   $selector
                        .stop()
                        .animate({ 'left': d.scrollLeft() + hPos, 'top': d.scrollTop() + vPos }, o.followSpeed);
               });
            }
            if (o.escClose) 
            {
                d.bind('keydown.bPopup', function (e) 
                {
                    if (e.which == 27) {  //escape
                        close();
                    }
                });
            }
        }

        function unbindEvents() 
        {
            if (!o.scrollBar) 
            {
                $('html').css('overflow', 'auto');
            }
            $('.' + o.closeClass).die('click');
            d.unbind('keydown.bPopup');
            w.unbind('.bPopup');
        }

        function getDocumentDimensions() 
        {
            return [d.height(), d.width()];
        }

        function getDistanceToBodyFromLeft() 
        {
            return (w.width() < $('body').width()) ? 0 : ($('body').width() - w.width()) / 2;
        }

        function getCenterPosition(s, a) 
        {
            var vertical = ((w.height() - s.height()) / 2) - a;
            var horizontal = ((w.width() - s.width()) / 2) + getDistanceToBodyFromLeft();
            return [vertical < 20 ? 20 : vertical, horizontal];
        }
    };

    $.fn.openPopup.defaults = 
    {
        amsl: 150,
        appendTo: 'body',
        closeClass: 'bClose',
        escClose: true,
        fadeSpeed: 250,
        follow: true,
        followSpeed: 500,
        loadUrl: null,
        modal: true,
        modalColor: '#000',
        opacity: 0.5,
        scrollBar: true,
        xLink: false,
        zIndex: 9999,
        resetInputDataWhenClose: true
    };

    $.fn.closePopup = function () 
    {
        $(this).trigger('click');
    }

    $.fn.disable = function() {
        return this.each(function() {
        $(this).attr("disabled", "disabled");
        //if (this.disabled == null) this.disabled = true;
        });
    }

})(jQuery);
