﻿/* 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
				var bodyBackground = $("body").css("background-image") && $("body").css("background-image") != "none";
				if (!bodyBackground) {
					var beforeWidth = document.body.clientWidth,
						beforeScrollTop = $("html").scrollTop();
					$("html").css("overflow", "hidden");
					var afterWidth = document.body.clientWidth,
						afterScrollTop = $("html").scrollTop();
					$("html").css("margin-right", afterWidth - beforeWidth);

					if (afterScrollTop != beforeScrollTop) {
						$("html").scrollTop(beforeScrollTop);
					}
				}
				$("#gsfn-wrapper").hide();

				$("div.lt-memorial:first").prepend('<div class="modal-overlay"></div><div class="modal"><div class="r"><div class="r"><div class="r"><div class="r"><div class="body"></div></div></div></div></div></div>');
				$("div.modal").addClass(opts.cssClass).hide();
				if (opts.closeButton) $("div.lt-memorial div.modal div.body").before('<a class="modal-close" href="#">close</a>');
				$("a.modal-close").click(function(e) {
					e.preventDefault();
					$.closeDialog(opts);
				});
				overlayPos(1, opts);
				dialogDisplayed = true;
			}

			if (opts.progress) {
				if ($.browser.msie) {
					var top = document.body.scrollTop || document.documentElement.scrollTop;
				}
				else {
					var top = window.pageYOffset;
				}
			}

			if (opts.urlRequest) {
				$.ajax({
					type: opts.method,
					data: opts.data,
					url: opts.urlRequest,
					success: function(msg) {
						$("div.modal").show();
						$("div.modal div.body").html(msg);
						var exception = $("div.modal div.body").find("input, select, textarea, a");
						$("body").find("input, select, textarea, a").not(exception).each(function() {
							var tabIndex = $(this).attr("tabindex");
							if (tabIndex) $(this).attr("oldindex", tabIndex);
							$(this).attr("tabindex", -1);
						});
						if (currentPos)
							if (opts.reposition) { reposition(); }

						if (opts.loadCallback) {
							opts.loadCallback.call();
						}

						if (!opts.disableClose) {
							$("div.modal-overlay").click(function() {
								$.closeDialog(opts);
							});
						}
					}
				});
			} else {
				$("div.modal").show();
				$("div.modal div.body").html(opts.content);
				if (currentPos)
					if (opts.reposition) { reposition(); }

				if (opts.loadCallback) {
					opts.loadCallback.call();
				}

				if (!opts.disableClose) {
					$("div.modal-overlay").click(function() {
						$.closeDialog(opts);
					});
				}
			}

			//only IE6 needs this function
			if ($.browser.msie && parseInt($.browser.version) < 7) {
				$(window).scroll(function() {
					if (dialogDisplayed == 1) {
						overlayPos(null, opts);
						if (currentPos)
							if (opts.reposition) { reposition(); }
					}
				});
			}

			$(window).resize(function() {
				if (dialogDisplayed == 1) {
					overlayPos(null, opts);
					if (currentPos)
						if (opts.reposition) { reposition(); }
				}
			});

			if (!opts.disableClose) {
				$(window).unload(function() {
					if (dialogDisplayed == 1)
						$.closeDialog(opts);
				});

				$(window).keydown(function(event) {
					if (event.keyCode == 27)
						$.closeDialog(opts);
				});
			}
		});

		//private function
		function overlayPos(init, opts) {
			var left = 0;
			var top = 0;
			var overlayWidth = $(window).width();
			var overlayHeight = $(document).height();
			var winHeight = $(window).height();

			if (opts.beforeShowCallback) {
				opts.beforeShowCallback.call();
			}

			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
				});
				$("div.modal-overlay").parents().each(function() {
					var pos = $(this).css("position");
					if (/relative|absolute/.test(pos)) $(this).css("z-index", opts.index - 1);
				});
			}
			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) {
				if (!$.browser.msie) {
					$("div.modal-overlay").css("opacity", 0);
					$("div.modal-overlay").fadeTo(200, opts.opacity);
				} else {
					$("div.modal-overlay").css("opacity", 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();
			}
			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");
				if ($.browser.safari) {
					$("html").css("overflow-y", "");
				}
				overlayPos(1, opts);
			}
		}
		return this;
	};

	$.fn.createModal.defaults = {
		progress: true,
		center: true,
		method: 'GET',
		cssClass: '',
		data: '',
		opacity: 0.25,
		bg: '#000',
		index: 9999,
		reposition: true,
		loadCallback: false,
		beforeShowCallback: false,
		afterHideCallback: false,
		closeButton: true,
		hideScroll: false,
		disableClose: false
	};

	$.closeDialog = function(opts) {
		dialogDisplayed = false;

		if ($.browser.msie && parseInt($.browser.version) < 7) {
			//IE6 bug
			$("select").show();
			$("div.modal-overlay").parents().each(function() {
				var pos = $(this).css("position");
				if (/relative|absolute/.test(pos)) $(this).css("z-index", "");
			});
		}
		// 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() {
			setTimeout(function() {
				$("html").css({ "overflow": "", "margin-right": "" });
			}, 50);
			$("div.modal a.modal-close, div.modal, div.modal-overlay").remove();
			$("#gsfn-wrapper").show();

			$("body").find("input, select, textarea, a").each(function() {
				var oldIndex = $(this).attr("oldindex");
				if (oldIndex) $(this).attr("tabindex", oldIndex)
				else $(this).removeAttr("tabindex");
			});

			if (typeof opts != "undefined" && opts.afterHideCallback) {
				opts.afterHideCallback.call();
			}

			$("html").removeClass("html-no-scroll");
			// Chrome bug with page scroll
			if ($.browser.safari) {
				$("html").css("overflow-y", "scroll");
			}
		});

	};

})(jQuery);
