// JavaScript Document

var Dialog = {};
Dialog.Box = Class.create();
Object.extend(Dialog.Box.prototype, {
	initialize: function(id) {
		this.id = id;
		this.createOverlay();

		this.dialog_box = $(id);
		this.dialog_box.show = this.show.bind(this);
		this.dialog_box.hide = this.hide.bind(this);

		this.parent_element = this.dialog_box.parentNode;

		this.dialog_box.style.position = "absolute";

		var e_dims = Element.getDimensions(this.dialog_box);
		var b_dims = Element.getDimensions(this.overlay);

		page_size = this.getPageSize();
		this.dialog_box.style.left = ((b_dims.width/2) - (e_dims.width/2)) + 'px';
		this.dialog_box.style.top = ((page_size[1] - (e_dims.width/2))/2) + 'px';
		this.dialog_box.style.zIndex = this.overlay.style.zIndex + 1;
	},

	createOverlay: function() {
		if($('dialog_overlay')) this.overlay = $('dialog_overlay');
		else
		{
			this.overlay = document.createElement('div');
			this.overlay.id = 'dialog_overlay_'+this.id;
			Object.extend(this.overlay.style, {
				position: 'absolute',
				top: 0,
				left: 0,
				zIndex: 9999,
				width: '100%',
				backgroundColor: '#bdbdbd',
				display: 'none'
			});
			document.body.insertBefore(this.overlay, document.body.childNodes[0]);
		}
	},

	show: function() {
		page_size = this.getPageSize();
		viewport_size = this.getViewportSize();
		var viewport_scroll_offsets = document.viewport.getScrollOffsets();

		this.overlay.style.height = page_size[1] + 'px';

		// hide all the dropdowns and flash objects on the page
		this.selectBoxes('hide');
		this.flashObjects('hide');

		new Effect.Appear(this.overlay, {duration: 0.1, from: 0.0, to: 0.5});
		this.dialog_box.style.display = '';

		this.dialog_box.style.left = '0px';

		var e_dims = Element.getDimensions(this.dialog_box);

		this.dialog_box.style.left = (((viewport_size[0]/2) - (e_dims.width)/2) + viewport_scroll_offsets.left) + 'px';
		this.dialog_box.style.top = (((viewport_size[1]/2) - (e_dims.height)/2) + viewport_scroll_offsets.top) + 'px'; // "250px";

		if (viewport_size[1] < e_dims.height) this.dialog_box.style.top = "0px";
		if (viewport_size[0] < e_dims.width) this.dialog_box.style.left = "0px";
	},

	hide: function() {
		this.selectBoxes('show');
	    new Effect.Fade(this.overlay, {duration: 0.1});
	    this.dialog_box.style.display = 'none';

		window.onresize = function() {};
	},

	selectBoxes: function(what) {
		$A(document.getElementsByTagName('select')).each(function(select) {
			Element[what](select);
		});

		if(what == 'hide') $A(this.dialog_box.getElementsByTagName('select')).each(function(select){Element.show(select)})
	},

	flashObjects: function(what) {
		$A(document.getElementsByTagName('embed')).each(function(embed) {
			Element[what](embed.parentNode);
		});
		$A(document.getElementsByTagName('object')).each(function(object) {
			Element[what](object.parentNode);
		});

		if(what == "hide") $A(this.dialog_box.getElementsByTagName('embed')).each(function(embed){Element.show(embed.parentNode)})
		if(what == "hide") $A(this.dialog_box.getElementsByTagName('object')).each(function(object){Element.show(object.parentNode)})
	},

    getPageSize: function() {

	     var xScroll, yScroll;

		if (window.innerHeight && window.scrollMaxY) {
			xScroll = window.innerWidth + window.scrollMaxX;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}

		var windowWidth, windowHeight;

		if (self.innerHeight) {	// all except Explorer
			if(document.documentElement.clientWidth){
				windowWidth = document.documentElement.clientWidth;
			} else {
				windowWidth = self.innerWidth;
			}
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}

		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else {
			pageHeight = yScroll;
			if (document.all) pageHeight += 25;
		}

		// for small pages with total width less then width of the viewport
		if(xScroll < windowWidth){
			pageWidth = xScroll;
		} else {
			pageWidth = windowWidth;
		}

		return [pageWidth,pageHeight];
	},

	getViewportSize: function() {
		var viewportwidth;
		var viewportheight;

		if (typeof window.innerWidth != 'undefined')
		{
			viewportwidth = window.innerWidth,
			viewportheight = window.innerHeight
		}
		else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0)
		{
			viewportwidth = document.documentElement.clientWidth,
			viewportheight = document.documentElement.clientHeight
		}
		else
		{
			viewportwidth = document.getElementsByTagName('body')[0].clientWidth,
			viewportheight = document.getElementsByTagName('body')[0].clientHeight
		}
		return [viewportwidth, viewportheight];
	}

});

