if (!window.Modalbox)
	var Modalbox = new Object();
Modalbox.Methods = {
	overrideAlert : false,
	focusableElements : new Array,
	currFocused : 0,
	initialized : false,
	active : true,
	options : {
		title : "ModalBox Window",
		overlay : true,
		overlayClose : true,
		width : 500,
		height : 90,
		overlayOpacity : .65,
		overlayDuration : .25,
		slideDownDuration : .5,
		slideUpDuration : .5,
		resizeDuration : .25,
		inactiveFade : true,
		transitions : false,
		loadingString : "אנא המתן. טוען...",
		closeString : "סגור חלון",
		closeValue : "×",
		params : {},
		method : 'get',
		autoFocusing : false,
		aspnet : false
	},
	_options : new Object,
	setOptions : function(options) {
		Object.extend(this.options, options || {});
	},
	_init : function(options) {
		Object.extend(this._options, this.options);
		this.setOptions(options);
		this.MBoverlay = new Element("div", {
			id : "MB_overlay",
			opacity : "0"
		});
		if (!this.options.overlay)
			$(this.MBoverlay).setStyle( {
				display : 'none'
			});
		this.MBwindow = new Element("div", {
			"id" : "MB_window",
			"class" : "instant-cart",
			"style" : "display: none"
		}).update(this.MBframe = new Element("div", {
			id : "MB_frame"
		}).update(this.MBheader = new Element("div", {
			id : "MB_header"
		}).update(this.MBcaption = new Element("div", {
			id : "MB_caption"
		}))));
		this.MBclose = new Element("a", {
			id : "MB_close",
			title : this.options.closeString,
			href : "#"
		}).update("<span>" + this.options.closeValue + "</span>");
		this.MBheader.insert( {
			'bottom' : this.MBclose
		});
		this.MBcontent = new Element("div", {
			id : "MB_content"
		}).update(this.MBloading = new Element("div", {
			id : "MB_loading"
		}).update(this.options.loadingString));
		this._loadingHeight = $(this.MBloading).getHeight();
		this.MBframe.insert( {
			'bottom' : this.MBcontent
		});
		var injectToEl = this.options.aspnet ? $(document.body).down('form')
				: $(document.body);
		injectToEl.insert( {
			'top' : this.MBwindow
		});
		injectToEl.insert( {
			'top' : this.MBoverlay
		});
		this.initScrollX = window.pageXOffset || document.body.scrollLeft
				|| document.documentElement.scrollLeft;
		this.initScrollY = window.pageYOffset || document.body.scrollTop
				|| document.documentElement.scrollTop;
		this.hideObserver = this._hide.bindAsEventListener(this);
		this.kbdObserver = this._kbdHandler.bindAsEventListener(this);
		this._initObservers();
		this.initialized = true;
	},
	setTitle : function(title) {
		if (title) {
			this.options.title = title;
			$(this.MBcaption).update(this.options.title);
		}
	},
	show : function(content, options) {
		if (this._pe)
			this._pe.stop();
		if (!this.initialized)
			this._init(options);
		this.content = content;
		this.setOptions(options);
		if (this.options.title)
			$(this.MBcaption).update(this.options.title);
		else {
			$(this.MBheader).hide();
			$(this.MBcaption).hide();
		}
		if (this.MBwindow.style.display == "none") {
			this._appear();
			this.event("onShow");
		} else {
			this._update();
			this.event("onUpdate");
		}
	},
	hide : function(options) {
		if (this._pe)
			this._pe.stop();
		if (this.initialized) {
			if (options && typeof options.element != 'function')
				Object.extend(this.options, options);
			this.event("beforeHide");
			if (this.options.transitions)
				Effect.SlideUp(this.MBwindow, {
					duration : this.options.slideUpDuration,
					transition : Effect.Transitions.sinoidal,
					afterFinish : this._deinit.bind(this)
				});
			else {
				$(this.MBwindow).hide();
				this._deinit();
			}
		}
	},
	autoHide : function(seconds, options) {
		if (this._pe)
			this._pe.stop();
		this._pe = new PeriodicalExecuter(function(pe) {
			pe.stop();
			this.hide(options);
		}.bind(this), seconds);
	},
	_hide : function(event) {
		event.stop();
		if (event.element().id == 'MB_overlay' && !this.options.overlayClose)
			return false;
		this.hide();
	},
	alert : function(message) {
		var html = '<div class="MB_alert"><p>'
				+ message
				+ '</p><input type="button" onclick="Modalbox.hide()" value="OK" /></div>';
		Modalbox.show(html, {
			title : 'Alert: ' + document.title,
			width : 300
		});
	},
	_appear : function() {
		if (Prototype.Browser.IE && !navigator.appVersion.match(/\b7.0\b/)
				&& this.options.overlay) {
			window.scrollTo(0, 0);
			this._prepareIE("100%", "hidden");
		}
		this._setWidth();
		this._setPosition();
		if (this.options.transitions) {
			$(this.MBoverlay).setStyle( {
				opacity : 0
			});
			new Effect.Fade(this.MBoverlay, {
				from : 0,
				to : this.options.overlayOpacity,
				duration : this.options.overlayDuration,
				afterFinish : function() {
					new Effect.SlideDown(this.MBwindow, {
						duration : this.options.slideDownDuration,
						transition : Effect.Transitions.sinoidal,
						afterFinish : function() {
							this._setPosition();
							this.loadContent();
						}.bind(this)
					});
				}.bind(this)
			});
		} else {
			$(this.MBoverlay).setStyle( {
				opacity : this.options.overlayOpacity
			});
			if (!this.options.overlay)
				$(this.MBoverlay).setStyle( {
					display : 'none'
				});
			$(this.MBwindow).show();
			this._setPosition();
			this.loadContent();
		}
		this._setWidthAndPosition = this._setWidthAndPosition
				.bindAsEventListener(this);
		Event.observe(window, "resize", this._setWidthAndPosition);
	},
	resize : function(byWidth, byHeight, options) {
		var oWidth = $(this.MBoverlay).getWidth();
		var wHeight = $(this.MBwindow).getHeight();
		var wWidth = $(this.MBwindow).getWidth();
		var hHeight = $(this.MBheader).getHeight();
		var cHeight = $(this.MBcontent).getHeight();
		var newHeight = ((wHeight - hHeight + byHeight) < cHeight) ? (cHeight + hHeight)
				: (wHeight + byHeight);
		var newWidth = wWidth + byWidth;
		if (options)
			this.setOptions(options);
		if (this.options.transitions) {
			new Effect.Morph(this.MBwindow, {
				style : "width:" + newWidth + "px; height:" + newHeight
						+ "px; left:" + ((oWidth - newWidth) / 2) + "px",
				duration : this.options.resizeDuration,
				beforeStart : function(fx) {
					fx.element.setStyle( {
						overflow : "hidden"
					});
				},
				afterFinish : function(fx) {
					fx.element.setStyle( {
						overflow : "visible"
					});
					this.event("_afterResize");
					this.event("afterResize");
				}.bind(this)
			});
		} else {
			this.MBwindow.setStyle( {
				width : newWidth + "px",
				height : newHeight + "px"
			});
			setTimeout(function() {
				this.event("_afterResize");
				this.event("afterResize");
			}.bind(this), 1);
		}
		this.MBwindow.setStyle( {
			height : "auto"
		});
	},
	resizeToContent : function(options) {
		var byHeight = this.options.height - $(this.MBwindow).getHeight();
		if (byHeight != 0) {
			if (options)
				this.setOptions(options);
			Modalbox.resize(0, byHeight);
		}
	},
	resizeToInclude : function(element, options) {
		var el = $(element);
		var elHeight = el.getHeight() + parseInt(el.getStyle('margin-top'), 0)
				+ parseInt(el.getStyle('margin-bottom'), 0)
				+ parseInt(el.getStyle('border-top-width'), 0)
				+ parseInt(el.getStyle('border-bottom-width'), 0);
		if (elHeight > 0) {
			if (options)
				this.setOptions(options);
			Modalbox.resize(0, elHeight);
		}
	},
	_update : function() {
		$(this.MBcontent).update(
				$(this.MBloading).update(this.options.loadingString));
		$(this.MBcontent).setStyle( {
			height : $(this.MBloading).getHeight() + 'px'
		});
		$(this.MBcontent).setStyle( {
			height : 'auto'
		});
		this.loadContent();
	},
	loadContent : function() {
		if (this.event("beforeLoad") != false) {
			if (typeof this.content == 'string') {
				var htmlRegExp = new RegExp(/<\/?[^>]+>/gi);
				if (htmlRegExp.test(this.content)) {
					this._insertContent(this.content.stripScripts(),
							function() {
								this.content.extractScripts().map(
										function(script) {
											return eval(script.replace("<!--",
													"").replace("// -->", ""));
										}.bind(window));
							}.bind(this));
				} else
					new Ajax.Request(
							this.content,
							{
								method : this.options.method.toLowerCase(),
								parameters : this.options.params,
								onSuccess : function(transport) {
									if (this._pe)
										this._pe.stop();
									var response = new String(
											transport.responseText);
									this
											._insertContent(
													transport.responseText
															.stripScripts(),
													function() {
														try {
															if (response != '') {
																var script = '';
																var scripts = response;
																scripts = scripts
																		.replace(
																				/<script[^>]*>([\s\S]*?)<\/script>/gi,
																				function() {
																					if (scripts !== null)
																						script += arguments[1]
																								+ '\n';
																					return '';
																				});
																if (script)
																	(window.execScript) ? window
																			.execScript(script)
																			: window
																					.setTimeout(
																							script,
																							0);
															}
															return false;
														} catch (e) {
														}
													});
								}.bind(this),
								onException : function(instance, exception) {
									Modalbox.hide();
									throw ('Modalbox Loading Error: ' + exception);
								}
							});
			} else if (typeof this.content == 'object') {
				this._insertContent(this.content);
			} else {
				Modalbox.hide();
				throw ('Modalbox Parameters Error: Please specify correct URL or HTML element (plain HTML or object)');
			}
		}
	},
	_insertContent : function(content, callback) {
		$(this.MBcontent).hide().update("");
		if (typeof content == 'string') {
			this.MBcontent.update(new Element("div", {
				style : "display: none"
			}).update(content)).down().show();
		} else if (typeof content == 'object') {
			var _htmlObj = content.cloneNode(true);
			if (content.id)
				content.id = "MB_" + content.id;
			$(content).select('*[id]').each(function(el) {
				el.id = "MB_" + el.id;
			});
			this.MBcontent.update(_htmlObj).down('div').show();
			if (Prototype.Browser.IE)
				$$("#MB_content select").invoke('setStyle', {
					'visibility' : ''
				});
		}
		if (this.options.height == this._options.height) {
			Modalbox.resize((this.options.width - $(this.MBwindow).getWidth()),
					$(this.MBcontent).getHeight()
							- $(this.MBwindow).getHeight()
							+ $(this.MBheader).getHeight(), {
						afterResize : function() {
							setTimeout(function() {
								this._putContent(callback);
							}.bind(this), 1);
						}.bind(this)
					});
		} else {
			this._setWidth();
			this.MBcontent.setStyle( {
				overflow : 'auto',
				height : $(this.MBwindow).getHeight()
						- $(this.MBheader).getHeight() - 13 + 'px'
			});
			setTimeout(function() {
				this._putContent(callback);
			}.bind(this), 1);
		}
	},
	_putContent : function(callback) {
		this.MBcontent.show();
		this.focusableElements = this._findFocusableElements();
		this._setFocus();
		if (callback != undefined)
			callback();
		this.event("afterLoad");
		var viewHeight = document.viewport.getHeight() * .9;
		this._contentHeight = $(this.MBcontent).getHeight();
		if (this._contentHeight > viewHeight)
			this.MBcontent.setStyle( {
				overflow : 'auto',
				height : viewHeight - $(this.MBheader).getHeight() - 13 + 'px'
			});
	},
	activate : function(options) {
		this.setOptions(options);
		this.active = true;
		$(this.MBclose).observe("click", this.hideObserver);
		if (this.options.overlayClose)
			$(this.MBoverlay).observe("click", this.hideObserver);
		$(this.MBclose).show();
		if (this.options.transitions && this.options.inactiveFade)
			new Effect.Appear(this.MBwindow, {
				duration : this.options.slideUpDuration
			});
	},
	deactivate : function(options) {
		this.setOptions(options);
		this.active = false;
		$(this.MBclose).stopObserving("click", this.hideObserver);
		if (this.options.overlayClose)
			$(this.MBoverlay).stopObserving("click", this.hideObserver);
		$(this.MBclose).hide();
		if (this.options.transitions && this.options.inactiveFade)
			new Effect.Fade(this.MBwindow, {
				duration : this.options.slideUpDuration,
				to : .75
			});
	},
	_initObservers : function() {
		$(this.MBclose).observe("click", this.hideObserver);
		if (this.options.overlayClose)
			$(this.MBoverlay).observe("click", this.hideObserver);
		if (Prototype.Browser.Gecko)
			Event.observe(document, "keypress", this.kbdObserver);
		else
			Event.observe(document, "keydown", this.kbdObserver);
	},
	_removeObservers : function() {
		$(this.MBclose).stopObserving("click", this.hideObserver);
		if (this.options.overlayClose)
			$(this.MBoverlay).stopObserving("click", this.hideObserver);
		if (Prototype.Browser.Gecko)
			Event.stopObserving(document, "keypress", this.kbdObserver);
		else
			Event.stopObserving(document, "keydown", this.kbdObserver);
	},
	_setFocus : function() {
		if (this.focusableElements.length > 0
				&& this.options.autoFocusing == true) {
			var firstEl = this.focusableElements.find(function(el) {
				return el.tabIndex == 1;
			}) || this.focusableElements.first();
			this.currFocused = this.focusableElements.toArray()
					.indexOf(firstEl);
			firstEl.focus();
		} else if ($(this.MBclose).visible())
			$(this.MBclose).focus();
	},
	_findFocusableElements : function() {
		this.MBcontent.select(
				'input:not([type~=hidden]), select, textarea, button, a[href]')
				.invoke('addClassName', 'MB_focusable');
		return this.MBcontent.select('.MB_focusable');
	},
	_kbdHandler : function(event) {
		var node = event.element();
		switch (event.keyCode) {
		case Event.KEY_TAB:
			event.stop();
			if (node != this.focusableElements[this.currFocused])
				this.currFocused = this.focusableElements.toArray().indexOf(
						node);
			if (!event.shiftKey) {
				if (this.currFocused == this.focusableElements.length - 1) {
					this.focusableElements.first().focus();
					this.currFocused = 0;
				} else {
					this.currFocused++;
					this.focusableElements[this.currFocused].focus();
				}
			} else {
				if (this.currFocused == 0) {
					this.focusableElements.last().focus();
					this.currFocused = this.focusableElements.length - 1;
				} else {
					this.currFocused--;
					this.focusableElements[this.currFocused].focus();
				}
			}
			break;
		case Event.KEY_ESC:
			if (this.active)
				this._hide(event);
			break;
		case 32:
			this._preventScroll(event);
			break;
		case 0:
			if (event.which == 32)
				this._preventScroll(event);
			break;
		case Event.KEY_UP:
		case Event.KEY_DOWN:
		case Event.KEY_PAGEDOWN:
		case Event.KEY_PAGEUP:
		case Event.KEY_HOME:
		case Event.KEY_END:
			if (Prototype.Browser.WebKit
					&& ! [ "textarea", "select" ].include(node.tagName
							.toLowerCase()))
				event.stop();
			else if ((node.tagName.toLowerCase() == "input" && [ "submit",
					"button" ].include(node.type))
					|| (node.tagName.toLowerCase() == "a"))
				event.stop();
			break;
		}
	},
	_preventScroll : function(event) {
		if (! [ "input", "textarea", "select", "button" ].include(event
				.element().tagName.toLowerCase()))
			event.stop();
	},
	_deinit : function() {
		this._removeObservers();
		Event.stopObserving(window, "resize", this._setWidthAndPosition);
		if (this.options.transitions && this.options.overlay) {
			Effect.toggle(this.MBoverlay, 'appear', {
				duration : this.options.overlayDuration,
				afterFinish : this._removeElements.bind(this)
			});
		} else {
			this.MBoverlay.hide();
			this._removeElements();
		}
		$(this.MBcontent).setStyle( {
			overflow : '',
			height : ''
		});
	},
	_removeElements : function() {
		$(this.MBoverlay).remove();
		$(this.MBwindow).remove();
		if (Prototype.Browser.IE && !navigator.appVersion.match(/\b7.0\b/)) {
			this._prepareIE("", "");
			window.scrollTo(this.initScrollX, this.initScrollY);
		}
		if (typeof this.content == 'object') {
			if (this.content.id && this.content.id.match(/MB_/)) {
				this.content.id = this.content.id.replace(/MB_/, "");
			}
			this.content.select('*[id]').each(function(el) {
				el.id = el.id.replace(/MB_/, "");
			});
		}
		this.initialized = false;
		this.event("afterHide");
		this.setOptions(this._options);
	},
	_setWidth : function() {
		$(this.MBwindow).setStyle( {
			width : this.options.width + "px",
			height : this.options.height + "px"
		});
	},
	_setPosition : function() {
		$(this.MBwindow).setStyle(
				{
					left : (($(this.MBoverlay).getWidth() - $(this.MBwindow)
							.getWidth()) / 2)
							+ "px"
				});
	},
	_setWidthAndPosition : function() {
		$(this.MBwindow).setStyle( {
			width : this.options.width + "px"
		});
		var viewHeight = document.viewport.getHeight() * .9;
		if (this._contentHeight > viewHeight)
			this.MBcontent.setStyle( {
				overflow : 'auto',
				height : viewHeight - $(this.MBheader).getHeight() - 13 + 'px'
			});
		this._setPosition();
	},
	_getScrollTop : function() {
		var theTop;
		if (document.documentElement && document.documentElement.scrollTop)
			theTop = document.documentElement.scrollTop;
		else if (document.body)
			theTop = document.body.scrollTop;
		return theTop;
	},
	_prepareIE : function(height, overflow) {
		$$('html, body').invoke('setStyle', {
			width : height,
			height : height,
			overflow : overflow
		});
		$$("select").invoke('setStyle', {
			'visibility' : overflow
		});
	},
	event : function(eventName) {
		if (this.options[eventName]) {
			var returnValue = this.options[eventName]();
			this.options[eventName] = null;
			if (returnValue != undefined)
				return returnValue;
			else
				return true;
		}
		return true;
	}
};
Object.extend(Modalbox, Modalbox.Methods);
if (Modalbox.overrideAlert)
	window.alert = Modalbox.alert;
