/*
 * SimpleModal 1.4 - jQuery Plugin
 * http://www.ericmmartin.com/projects/simplemodal/
 * Copyright (c) 2010 Eric Martin (http://twitter.com/ericmmartin)
 * Dual licensed under the MIT and GPL licenses
 * Revision: $Id: jquery.simplemodal.js 256 2010-07-27 23:05:43Z emartin24 $
 */
(function(d) {
	var k = d.browser.msie && parseInt(d.browser.version) === 6
			&& typeof window.XMLHttpRequest !== "object", l = null, f = [];
	d.modal = function(a, b) {
		return d.modal.impl.init(a, b)
	};
	d.modal.close = function() {
		d.modal.impl.close()
	};
	d.modal.focus = function(a) {
		d.modal.impl.focus(a)
	};
	d.modal.setContainerDimensions = function() {
		d.modal.impl.setContainerDimensions()
	};
	d.modal.setPosition = function() {
		d.modal.impl.setPosition()
	};
	d.modal.update = function(a, b) {
		d.modal.impl.update(a, b)
	};
	d.fn.modal = function(a) {
		return d.modal.impl.init(this, a)
	};
	d.modal.defaults = {
		appendTo : "body",
		focus : true,
		opacity : 50,
		overlayId : "simplemodal-overlay",
		overlayCss : {},
		containerId : "simplemodal-container",
		containerCss : {},
		dataId : "simplemodal-data",
		dataCss : {},
		minHeight : null,
		minWidth : null,
		maxHeight : null,
		maxWidth : null,
		autoResize : false,
		autoPosition : true,
		zIndex : 1E3,
		close : true,
		closeHTML : '<a class="modalCloseImg" title="Close"></a>',
		closeClass : "simplemodal-close",
		escClose : true,
		overlayClose : false,
		position : null,
		persist : false,
		modal : true,
		onOpen : null,
		onShow : null,
		onClose : null
	};
	d.modal.impl = {
		d : {},
		init : function(a, b) {
			var c = this;
			if (c.d.data)
				return false;
			l = d.browser.msie && !d.boxModel;
			c.o = d.extend( {}, d.modal.defaults, b);
			c.zIndex = c.o.zIndex;
			c.occb = false;
			if (typeof a === "object") {
				a = a instanceof jQuery ? a : d(a);
				c.d.placeholder = false;
				if (a.parent().parent().size() > 0) {
					a.before(d("<span></span>").attr("id",
							"simplemodal-placeholder").css( {
						display : "none"
					}));
					c.d.placeholder = true;
					c.display = a.css("display");
					if (!c.o.persist)
						c.d.orig = a.clone(true)
				}
			} else if (typeof a === "string" || typeof a === "number")
				a = d("<div></div>").html(a);
			else {
				alert("SimpleModal Error: Unsupported data type: " + typeof a);
				return c
			}
			c.create(a);
			c.open();
			d.isFunction(c.o.onShow) && c.o.onShow.apply(c, [ c.d ]);
			return c
		},
		create : function(a) {
			var b = this;
			f = b.getDimensions();
			if (b.o.modal && k)
				b.d.iframe = d('<iframe src="javascript:false;"></iframe>')
						.css(d.extend(b.o.iframeCss, {
							display : "none",
							opacity : 0,
							position : "fixed",
							height : f[0],
							width : f[1],
							zIndex : b.o.zIndex,
							top : 0,
							left : 0
						})).appendTo(b.o.appendTo);
			b.d.overlay = d("<div></div>").attr("id", b.o.overlayId).addClass(
					"simplemodal-overlay").css(d.extend(b.o.overlayCss, {
				display : "none",
				opacity : b.o.opacity / 100,
				height : b.o.modal ? f[0] : 0,
				width : b.o.modal ? f[1] : 0,
				position : "fixed",
				left : 0,
				top : 0,
				zIndex : b.o.zIndex + 1
			})).appendTo(b.o.appendTo);
			b.d.container = d("<div></div>").attr("id", b.o.containerId)
					.addClass("simplemodal-container").css(
							d.extend(b.o.containerCss, {
								display : "none",
								position : "fixed",
								zIndex : b.o.zIndex + 2
							})).append(
							b.o.close && b.o.closeHTML ? d(b.o.closeHTML)
									.addClass(b.o.closeClass) : "").appendTo(
							b.o.appendTo);
			b.d.wrap = d("<div></div>").attr("tabIndex", -1).addClass(
					"simplemodal-wrap").css( {
				height : "100%",
				outline : 0,
				width : "100%"
			}).appendTo(b.d.container);
			b.d.data = a.attr("id", a.attr("id") || b.o.dataId).addClass(
					"simplemodal-data").css(d.extend(b.o.dataCss, {
				display : "none"
			})).appendTo("body");
			b.setContainerDimensions();
			b.d.data.appendTo(b.d.wrap);
			if (k || l)
				b.fixIE()
		},
		bindEvents : function() {
			var a = this;
			d("." + a.o.closeClass).bind("click.simplemodal", function(b) {
				b.preventDefault();
				a.close()
			});
			a.o.modal && a.o.close && a.o.overlayClose
					&& a.d.overlay.bind("click.simplemodal", function(b) {
						b.preventDefault();
						a.close()
					});
			d(document).bind("keydown.simplemodal", function(b) {
				if (a.o.modal && b.keyCode === 9)
					a.watchTab(b);
				else if (a.o.close && a.o.escClose && b.keyCode === 27) {
					b.preventDefault();
					a.close()
				}
			});
			d(window).bind(
					"resize.simplemodal",
					function() {
						f = a.getDimensions();
						a.o.autoResize ? a.setContainerDimensions()
								: a.o.autoPosition && a.setPosition();
						if (k || l)
							a.fixIE();
						else if (a.o.modal) {
							a.d.iframe && a.d.iframe.css( {
								height : f[0],
								width : f[1]
							});
							a.d.overlay.css( {
								height : f[0],
								width : f[1]
							})
						}
					})
		},
		unbindEvents : function() {
			d("." + this.o.closeClass).unbind("click.simplemodal");
			d(document).unbind("keydown.simplemodal");
			d(window).unbind("resize.simplemodal");
			this.d.overlay.unbind("click.simplemodal")
		},
		fixIE : function() {
			var a = this, b = a.o.position;
			d
					.each(
							[ a.d.iframe || null,
									!a.o.modal ? null : a.d.overlay,
									a.d.container ],
							function(c, h) {
								if (h) {
									var g = h[0].style;
									g.position = "absolute";
									if (c < 2) {
										g.removeExpression("height");
										g.removeExpression("width");
										g
												.setExpression(
														"height",
														'document.body.scrollHeight > document.body.clientHeight ? document.body.scrollHeight : document.body.clientHeight + "px"');
										g
												.setExpression(
														"width",
														'document.body.scrollWidth > document.body.clientWidth ? document.body.scrollWidth : document.body.clientWidth + "px"')
									} else {
										var e;
										if (b && b.constructor === Array) {
											c = b[0] ? typeof b[0] === "number" ? b[0]
													.toString()
													: b[0].replace(/px/, "")
													: h.css("top").replace(
															/px/, "");
											c = c.indexOf("%") === -1 ? c + ' + (t = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'
													: parseInt(c.replace(/%/,
															"")) + ' * ((document.documentElement.clientHeight || document.body.clientHeight) / 100) + (t = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"';
											if (b[1]) {
												e = typeof b[1] === "number" ? b[1]
														.toString()
														: b[1]
																.replace(/px/,
																		"");
												e = e.indexOf("%") === -1 ? e + ' + (t = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft) + "px"'
														: parseInt(e.replace(
																/%/, "")) + ' * ((document.documentElement.clientWidth || document.body.clientWidth) / 100) + (t = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft) + "px"'
											}
										} else {
											c = '(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (t = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"';
											e = '(document.documentElement.clientWidth || document.body.clientWidth) / 2 - (this.offsetWidth / 2) + (t = document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft) + "px"'
										}
										g.removeExpression("top");
										g.removeExpression("left");
										g.setExpression("top", c);
										g.setExpression("left", e)
									}
								}
							})
		},
		focus : function(a) {
			var b = this;
			a = a && d.inArray(a, [ "first", "last" ]) !== -1 ? a : "first";
			var c = d(":input:enabled:visible:" + a, b.d.wrap);
			setTimeout(function() {
				c.length > 0 ? c.focus() : b.d.wrap.focus()
			}, 10)
		},
		getDimensions : function() {
			var a = d(window);
			return [
					d.browser.opera && d.browser.version > "9.5"
							&& d.fn.jquery < "1.3" || d.browser.opera
							&& d.browser.version < "9.5"
							&& d.fn.jquery > "1.2.6" ? a[0].innerHeight : a
							.height(), a.width() ]
		},
		getVal : function(a, b) {
			return a ? typeof a === "number" ? a : a === "auto" ? 0 : a
					.indexOf("%") > 0 ? parseInt(a.replace(/%/, "")) / 100
					* (b === "h" ? f[0] : f[1]) : parseInt(a.replace(/px/, ""))
					: null
		},
		update : function(a, b) {
			var c = this;
			if (!c.d.data)
				return false;
			c.d.origHeight = c.getVal(a, "h");
			c.d.origWidth = c.getVal(b, "w");
			c.d.data.hide();
			a && c.d.container.css("height", a);
			b && c.d.container.css("width", b);
			c.setContainerDimensions();
			c.d.data.show();
			c.o.focus && c.focus();
			c.unbindEvents();
			c.bindEvents()
		},
		setContainerDimensions : function() {
			var a = this, b = a.d.origHeight ? a.d.origHeight
					: d.browser.opera ? a.d.container.height() : a.getVal(
							a.d.container.css("height"), "h"), c = a.d.origWidth ? a.d.origWidth
					: d.browser.opera ? a.d.container.width() : a.getVal(
							a.d.container.css("width"), "w"), h = a.d.data
					.outerHeight(true), g = a.d.data.outerWidth(true);
			a.d.origHeight = a.d.origHeight || b;
			a.d.origWidth = a.d.origWidth || c;
			var e = a.o.maxHeight ? a.getVal(a.o.maxHeight, "h") : null, i = a.o.maxWidth ? a
					.getVal(a.o.maxWidth, "w")
					: null;
			e = e && e < f[0] ? e : f[0];
			i = i && i < f[1] ? i : f[1];
			var j = a.o.minHeight ? a.getVal(a.o.minHeight, "h") : "auto";
			b = b ? a.o.autoResize && b > e ? e : b : h ? h > e ? e
					: a.o.minHeight && j !== "auto" && h < j ? j : h : j;
			e = a.o.minWidth ? a.getVal(a.o.minWidth, "w") : "auto";
			c = c ? a.o.autoResize && c > i ? i : c : g ? g > i ? i
					: a.o.minWidth && e !== "auto" && g < e ? e : g : e;
			a.d.container.css( {
				height : b,
				width : c
			});
			a.d.wrap.css( {
				overflow : h > b || g > c ? "auto" : "visible"
			});
			a.o.autoPosition && a.setPosition()
		},
		setPosition : function() {
			var a = this, b, c;
			b = f[0] / 2 - a.d.container.outerHeight(true) / 2;
			c = f[1] / 2 - a.d.container.outerWidth(true) / 2;
			if (a.o.position
					&& Object.prototype.toString.call(a.o.position) === "[object Array]") {
				b = a.o.position[0] || b;
				c = a.o.position[1] || c
			} else {
				b = b;
				c = c
			}
			a.d.container.css( {
				left : c,
				top : b
			})
		},
		watchTab : function(a) {
			var b = this;
			if (d(a.target).parents(".simplemodal-container").length > 0) {
				b.inputs = d(
						":input:enabled:visible:first, :input:enabled:visible:last",
						b.d.data[0]);
				if (!a.shiftKey && a.target === b.inputs[b.inputs.length - 1]
						|| a.shiftKey && a.target === b.inputs[0]
						|| b.inputs.length === 0) {
					a.preventDefault();
					b.focus(a.shiftKey ? "last" : "first")
				}
			} else {
				a.preventDefault();
				b.focus()
			}
		},
		open : function() {
			var a = this;
			a.d.iframe && a.d.iframe.show();
			if (d.isFunction(a.o.onOpen))
				a.o.onOpen.apply(a, [ a.d ]);
			else {
				a.d.overlay.show();
				a.d.container.show();
				a.d.data.show()
			}
			a.o.focus && a.focus();
			a.bindEvents()
		},
		close : function() {
			var a = this;
			if (!a.d.data)
				return false;
			a.unbindEvents();
			if (d.isFunction(a.o.onClose) && !a.occb) {
				a.occb = true;
				a.o.onClose.apply(a, [ a.d ])
			} else {
				if (a.d.placeholder) {
					var b = d("#simplemodal-placeholder");
					if (a.o.persist)
						b.replaceWith(a.d.data.removeClass("simplemodal-data")
								.css("display", a.display));
					else {
						a.d.data.hide().remove();
						b.replaceWith(a.d.orig)
					}
				} else
					a.d.data.hide().remove();
				a.d.container.hide().remove();
				a.d.overlay.hide();
				a.d.iframe && a.d.iframe.hide().remove();
				setTimeout(function() {
					a.d.overlay.remove();
					a.d = {}
				}, 10)
			}
		}
	}
})(jQuery);

