/******************************************************************************************************************
 * @name: bPopup
 * @type: jQuery
 * @author: Bjoern Klinggaard (http://dinbror.dk/bpopup)
 * @version: 0.3.5
 * @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' // 
 * duration: 'normal' // Animation speed
 * escClose: true // Close on esc
 * loadUrl: null // 
 * minTop: 20px // Minimum distance from top to 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
 * xLink: false // Xlink popup
 * zIndex: 9999 // Popup z-index, modal overlay = popup z-index - 1
 *
 * TODO: REFACTOR CODE!!! easing, new options(follow)
 *******************************************************************************************************************/ 
;(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';
        
    return this.each(function() {  
          // MODAL OVERLAY
          if(o.modal) {
             $modal
                .css(getModalStyle())
                .appendTo(o.appendTo)   
                .animate({'opacity': o.opacity}, o.duration);
          }   
          // OPEN POPUP  
          create();
    }); 
    
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // HELP FUNCTIONS - PRIVATE
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
    function create() {
        var hasInputField = $('input[type=text]', $selector).length != 0;
        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, 'top': d.scrollTop() + vPos, 'z-index': o.zIndex } )
            .appendTo(o.appendTo)
            .hide(function(){
                if(hasInputField) {
                    $selector.each(function() {
                        $selector.find('input[type=text]').val('');    
                    });
                } 
                if(o.loadUrl != null) 
                    $selector.load(o.loadUrl);                             
            })
            .fadeIn(o.duration, 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.duration, function(){
                    $('#bModal')
                        .remove();
                });  
        }
        $selector.fadeOut(o.duration, 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;
       });
       w.bind('scroll.bPopup', function() { 
            $selector
               .stop()
               .animate({'left': d.scrollLeft() + hPos, 'top': d.scrollTop() + vPos }, o.duration);
       })
       .bind('resize.bPopup', function() {
            // MODAL OVERLAY
            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.duration);               
       }); 
       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 < o.minTop ? o.minTop : vertical, horizontal];
    } 
  };
  $.fn.openPopup.defaults = {
        'amsl': 150, 
        'appendTo': 'body',
        'closeClass': 'bClose',
        'duration': 'normal',
        'escClose': true,
        'loadUrl': null,
        'minTop': 20,
        'modal': true,
        'modalColor': '#000',
        'opacity': 0.5,
        'scrollBar': true,
        'xLink': false,
        'zIndex': 9999
  };
  
  $.fn.closePopup = function() {
      $(this).trigger('click'); 
  }
})(jQuery);

