var Overlay = {
	container: 'overlayfg',

	content: null,
	
	background: 'overlaybg',
	
	loadingClassName: 'loading',
		
	duration: 1,
	
	bgOpacity: .7,
	
	ajax: null,
	
	effect: null,
	
	initialize: function(event)
	{
		// Populate properties w/ real elements
		Overlay.container = $(Overlay.container);
		if(!Overlay.container)
		{
			return;
		}
		
		Overlay.content = Overlay.container.select('.content').first();
		Overlay.background = $(Overlay.background);
	
		// Register event handlers
		Event.observe(window, 'resize', Overlay.window_Resize);		
	},
	
	window_Resize: function(event)
	{
		Overlay.realign();
	},
	
	show: function (url, ajaxOptions, effectOptions)
	{
		var _ajaxOptions = {
			method: 'get',
			onComplete: function () {}
		};
		Object.extend(_ajaxOptions, ajaxOptions || {});
		
		var ajaxOnComplete = _ajaxOptions.onComplete;
		_ajaxOptions.onComplete = function(transport)
		{
			ajaxOnComplete(transport);
			Overlay.container.removeClassName(Overlay.loadingClassName);
			Overlay.ajax = null;
		};
		
		var _effectOptions = {
			duration: Overlay.duration,	
			afterFinish: function() {}
		};
		Object.extend(_effectOptions, effectOptions || {});
		
		var effectAfterFinish = _effectOptions.afterFinish;
		_effectOptions.afterFinish = function ()
		{
			Overlay.container.show();
			effectAfterFinish();
			Overlay.effect = null;
		};
		
		Overlay.container.addClassName(Overlay.loadingClassName);
		Overlay.ajax = new Ajax.Updater(Overlay.content, url, _ajaxOptions);

		Overlay.realign();
		Overlay.effect = new Effect.Parallel([
		    //	new Effect.Appear(Overlay.container, {sync : true}),
				new Effect.Appear(Overlay.background, {sync : true, to : Overlay.bgOpacity})
			],
			_effectOptions
		);
	},
	
	hide: function(effectOptions)
	{
		var _effectOptions = {
			duration: Overlay.duration,	
			afterFinish: function() {}	
		};
		Object.extend(_effectOptions, effectOptions || {});
		
		var effectAfterFinish = _effectOptions.afterFinish;
		_effectOptions.afterFinish = function ()
		{
			effectAfterFinish();
			Overlay.effect = null;
		};
		
		Overlay.container.hide();
		Overlay.content.update();
		Overlay.effect = new Effect.Parallel([
	//			new Effect.Fade(Overlay.container, {sync : true}),
				new Effect.Fade(Overlay.background, {sync : true, from : Overlay.bgOpacity})
			],
			_effectOptions
		);
	},
	
	realign: function ()
	{
		var overlayDims = Overlay.container.getDimensions();
		var viewportDims = document.viewport.getDimensions();
		var left = Math.round((viewportDims.width - overlayDims.width) / 2);
		var top = Math.round((viewportDims.height - overlayDims.height) / 2);
		Overlay.container.style.left = (left < 0?0:left) + "px";
		Overlay.container.style.top = (top < 0?0:top) + "px";
	}

};

// Register bootloader
document.observe('dom:loaded', Overlay.initialize);
