/* Copyright (c) 2008 Kean Loong Tan http://www.gimiti.com/kltan
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * Version: 1.1 (March 26, 2008)
 * Requires: jQuery 1.2+
 */
 
(function($) {

  var dialogDisplayed = false;
  var currentPos = true;

  $.fn.createDialog = function(options) {

    // Extend our default options with those provided.
    var opts = $.extend({}, $.fn.createDialog.defaults, options);
    var showDialog = function() {
      currentPos = opts.center;
      if (!dialogDisplayed) { //display dialog if none is there
        $("body").prepend('<div id="jDialogProgressBar"><img src="i/ajax-loader.gif" /></div><div id="jDialogOverlay"></div><div id="jDialogContainer"></div>');
        overlayPos(1);
        dialogDisplayed=true;
      }
      
      if(opts.progress)
        $("#jDialogProgressBar").show();
        
      $.ajax({
        type: opts.method,
        data: opts.data,
        url: opts.addr,
        success: function(msg){
          $("#jDialogContainer").html(msg);
          if (currentPos)
            reposition();
          $("#jDialogProgressBar").fadeOut(900);
        }
      });
      //only IE6 needs this function
      if($.browser.msie && parseInt($.browser.version) < 7) {
        $(window).scroll(function(){
          if(dialogDisplayed==1) {
            overlayPos();
            if (currentPos)
              reposition();
          }
        });
      }
      $(window).resize(function(){
        if (dialogDisplayed==1) {
          overlayPos();
          if (currentPos)
            reposition();
        }
      });
      
      $(window).unload( function () {
        if (dialogDisplayed==1)
          $.closeDialog();
      });
      
      $(window).keydown(function(event){
        if (event.keyCode == 27) 
          $.closeDialog();
      });

    };
    $(this).click(showDialog);
    
    //private function
    function overlayPos(init){
      var left = 0;
      var top = 0;
      var overlayWidth = $(window).width();
      var overlayHeight = $(document).height();
      var winHeight =  $(window).height();
    
      if ($.browser.msie && parseInt($.browser.version) < 7) { //if IE6
        $("#jDialogOverlay").css({
                    top: 0, 
                    left: 0, 
                    width: overlayWidth, 
                    height: overlayHeight, 
                    position: "absolute",
                    display: "block",
                    color: opts.bg,
                    zIndex: opts.index
                  });
      }
      else { //other browsers
        $("#jDialogOverlay").css({
                    top: 0, 
                    left: 0, 
                    width: overlayWidth, 
                    height: winHeight, 
                    position: "fixed",
                    display: "block",
                    background: opts.bg,
                    zIndex: opts.index
                  }).show();
      }
      
      if (init==1) {
        $("#jDialogOverlay").css("opacity", 0);
        $("#jDialogOverlay").fadeTo(200, opts.opacity);
      }
    }
    
    //private function
    function reposition(){ //calculate the position
      var left = 0;
      var top = 0;
      var winWidth = $(window).width();
      var winHeight =  $(window).height();
      var dialogHeight = $("#jDialogContainer").children().height();
      var dialogWidth = $("#jDialogContainer").children().width();
    
      if ($.browser.msie) {
        left = document.body.scrollLeft || document.documentElement.scrollLeft;
        top = document.body.scrollTop || document.documentElement.scrollTop;
      }
      else {
        left = window.pageXOffset;
        top = window.pageYOffset;
      }
    
      var topOff = top + winHeight/2 - dialogHeight/2; //offset for IE6
      var  leftOff = left + winWidth/2 - dialogWidth/2; //offset for IE6
      var topFixed = topOff - top;
      var  leftFixed = leftOff - left;
      
      if ($.browser.msie && parseInt($.browser.version) < 7) { // IE6
        //IE 6 fix
        $("select").hide();
        //IE 6 fix
        $("#jDialogContainer select").show(); 
        //IE6 doesn't support fixed position
        $("#jDialogContainer").children().css({
                              top: topOff,
                              left: leftOff,
                              position: "absolute",
                              zIndex: (opts.index+1)
                            }).show(); 
      }
      else{  // firefox and IE7
        $("#jDialogContainer").children().css({
                              top: topFixed, 
                              left: leftFixed, 
                              position: "fixed", 
                              zIndex: (opts.index+1)
                            }).show();
      }
    }
    
    return showDialog;
  };
  
  $.fn.createDialog.defaults = {
    progress: true,
    center: true,
    method: 'GET',
    data: '',
    opacity: 0.85,
    bg: '#FFFFFF',
    index: 2000
  };
  
  $.closeDialog = function(){
    dialogDisplayed=false;
    if($.browser.msie && parseInt($.browser.version) < 7) //IE6 bug
      $("select").show();
    //fade out and remove DOM nodes
    $("#jDialogOverlay").fadeTo(200, 0, function(){
      $("#jDialogContainer, #jDialogOverlay, #jDialogProgressBar").remove();
    });
    
  };

})(jQuery);