/**
 * jmodal is a tiny JS program allowing you to create pseudo-modal windows.
 */

/**
 * jmodal class methods.
 */
if (! window.jmodal) {
jmodal = {
	bg: null,
	/**
	 * jmodal.window constructor.
	 * @param string | object outerElement
	 * @param string | object contentElement
	 * @param int width
	 * @param int height
	 */
	window: function(outerElement, contentElement, width, height) {
		this.firstLoad = true;
		this.outerElement = jdom(outerElement);
		this.contentElement = jdom(contentElement);
		this.width = width;
		this.height = height;
		this.onOpen = this.onClose = function(){};
		jdom.hide(this.outerElement);
		if (this.contentElement != this.outerElement)
		{
			jdom.show(this.contentElement);
		}
		this.outerElement.style.width = width + 'px';
		this.outerElement.style.height = height + 'px';
		this.outerElement.style.position = 'absolute';
		this.outerElement.style.left = '50%';
		this.outerElement.style.top = '50%';
		jdom.addClass(this.outerElement, "jmodal-window");
	},
	/**
	 * @access private
	 */
	ensureBg: function() {
		if (null === jmodal.bg) {
			var bg = document.body.appendChild(document.createElement('div'));
			bg.className = 'jmodal-bg';
			jmodal.bg = new jdom.layer(bg);
		}
	}
}
/**
 * jmodal.window instance methods
 */
jmodal.window.prototype = {
	open: function() {
		jmodal.ensureBg();
		
		jmodal.bg.element.style.height = jdom.propget('scrollHeight', document.documentElement, document.body) + 'px';
		jmodal.bg.element.style.width = jdom.propget('scrollWidth', document.documentElement, document.body) + 'px';
//		jmodal.bg.element.style.zIndex = '1000';
		jdom.onKeyUp(document, 27, function(){
			this.close();
		}, this);
		jmodal.bg.show(0, 0);
		
		this.outerElement.oldZIndex = this.outerElement.style.zIndex || '0';
		this.outerElement.style.zIndex = '1001';
		
		this.onOpen.call(this);
		this.firstLoad = false;
		
		var sp = this.getScrollPosition();
		this.outerElement.style.marginLeft = (- Math.round(this.width / 2) + sp[0]) + 'px';
		this.outerElement.style.marginTop = (- Math.round(this.height / 2) + sp[1]) + 'px';
		
		jdom.show(this.outerElement);
		this.outerElement.focus();
	},
	close: function() {
		this.onClose.call(this);
		this.outerElement.style.zIndex = this.outerElement.oldZIndex;
		jdom.hide(this.outerElement);
		jmodal.bg.hide();
	},
	setOpenHandler: function(f) {
		this.onOpen = f;
		return this;
	},
	setCloseHandler: function(f) {
		this.onClose = f;
		return this;
	},
	getScrollPosition: function() {
		var ScrollTop = document.body.scrollTop;
		var ScrollLeft = document.body.scrollLeft;
		if (ScrollTop == 0)
		{
			if (window.pageYOffset)
			{
				ScrollTop = window.pageYOffset;
				ScrollLeft = window.pageXOffset;
			} else {
				ScrollTop = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0;
				ScrollLeft = (document.body.parentElement) ? document.body.parentElement.scrollLeft : 0;
			}
		}
		return [ScrollLeft, ScrollTop];
	}
}
}