﻿/* 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.createModal = function(options) {

		// Extend our default options with those provided.
		var opts = $.extend({}, $.fn.createModal.defaults, options);

		$(this).click(function(){

			currentPos = opts.center;

			if (!dialogDisplayed) { //display dialog if none is there
			
				$("div.lt-memorial:first").prepend('<div class="ajax-loading">Loading...</div><div class="modal-overlay"></div><div class="modal"><div class="r"><div class="r"><div class="r"><div class="r"><a class="modal-close" href="javascript:void(0);" onclick="$.closeDialog();">close</a><div class="body"></div></div></div></div></div></div>');

				overlayPos(1);
				dialogDisplayed=true;
			}

			if(opts.progress) {
				if ($.browser.msie) {
					var top = document.body.scrollTop || document.documentElement.scrollTop;
				}
				else {
					var top = window.pageYOffset;
				}

				$("div.ajax-loading").css({
					top: top
				}).show();
			}

			$.ajax({
				type: opts.method,
				data: opts.data,
				url: opts.urlRequest,
				success: function(msg){
					$("div.modal").addClass(opts.cssClass);
					$("div.modal div.body").html(msg);
					if (currentPos)
						if(opts.reposition) { reposition(); }
					$("div.ajax-loading").fadeOut(900);

					if (opts.loadCallback) {
						opts.loadCallback.call();
					}

					if(!opts.disableClose) {
						$("div.modal-overlay").click(function(){
							$.closeDialog();
						});
					}
				}
			});

			//only IE6 needs this function
			if($.browser.msie && parseInt($.browser.version) < 7) {
				$(window).scroll(function(){
					if(dialogDisplayed==1) {
						overlayPos();
						if (currentPos)
							if(opts.reposition) { reposition(); }
					}
				});
			}

			$(window).resize(function(){
				if (dialogDisplayed==1) {
					overlayPos();
					if (currentPos)
						if(opts.reposition) { reposition(); }
				}
			});

			if(!opts.disableClose) {
				$(window).unload( function () {
					if (dialogDisplayed==1)
						$.closeDialog();
				});
				
				$(window).keydown(function(event){
					if (event.keyCode == 27) 
						$.closeDialog();
				});
			}
		});
		
		//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
				$("div.modal-overlay").css({
									  top: 0, 
									  left: 0, 
									  width: overlayWidth, 
									  height: overlayHeight, 
									  position: "absolute",
									  display: "block",
									  color: opts.bg,
									  zIndex: opts.index,
									  filter: 'mask()',
									  opacity: opts.opacity
								  });
			}
			else { //other browsers
				$("div.modal-overlay").css({
									  top: 0, 
									  left: 0, 
									  width: overlayWidth, 
									  height: winHeight, 
									  position: "fixed",
									  display: "block",
									  background: opts.bg,
									  zIndex: opts.index
								  }).show();
			}
			
			if (init==1) {
				$("div.modal-overlay").css("opacity", 0);
				$("div.modal-overlay").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 = $("div.modal").children().height();
			var dialogWidth = $("div.modal").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
				$("div.modal div.body select").show(); 
				//IE6 doesn't support fixed position
				$("div.modal").css({
														  top: topOff,
														  left: leftOff,
														  position: "absolute",
														  zIndex: (opts.index+1)
													  }).show(); 
													  
				$("div.ajax-loading").css({
														  top: topOff,
														  left: leftOff
													  })
			}
			else{	// firefox and IE7
				$("div.modal").css({
														  top: topFixed, 
														  left: leftFixed, 
														  position: "fixed", 
														  zIndex: (opts.index+1)
													  }).show();
			}
			
			if(opts.hideScroll) {
				$("html").addClass("html-no-scroll");
				overlayPos(1);
			}
		}
	};
	
	$.fn.createModal.defaults = {
		progress: true,
		center: true,
		method: 'GET',
		cssClass: '',
		data: '',
		opacity: 0.25,
		bg: '#000',
		index: 2000,
		reposition: true,
		loadCallback: false,
		disableClose: false
	};
	
	$.closeDialog = function(){
		dialogDisplayed = false;

		if($.browser.msie && parseInt($.browser.version) < 7) //IE6 bug
			$("select").show();

		// IE bug with flash objects
		if ($.browser.msie) {
			$("div.modal object").each(function(obj) {
				try {
					this.parentNode.removeChild(this);
				} catch (ex) { }
			});
		}
		
		$("div.modal-overlay").fadeTo(200, 0, function(){
			$("div.modal a.modal-close, div.modal div.body, div.modal-overlay, div.ajax-loading").remove();
		});

		$("html").removeClass("html-no-scroll");
	};

})(jQuery);