var Overlay = {
	open: function()
	{
		var level = Popup.stack.length;
		var overlay = $("overlay");
		if (overlay)
		{
			overlay.show();
		}
		else
		{
			overlay = new Element("div", {"class": "overlay", "id": "overlay"});
			
			$$("body")[0].insert(overlay);
			//overlay.absolutize();
		}
		overlay.setStyle({position: 'absolute'});
		var dimensions = $$("body")[0].getDimensions();
		var screen = document.viewport.getDimensions();
		var height = 0; var width = 0;
		if (screen.height > dimensions.height)
		{
			height = screen.height;
		}
		else
		{
			height = dimensions.height;
		}
		
		if (screen.width > dimensions.width)
		{
			width = screen.width;
		}
		else
		{
			width = dimensions.width;
		}
		overlay.setStyle({height: height + "px", width: width + "px", top: 0, left: 0});
		overlay.setStyle({zIndex: 99 + level*2});
		overlay.setOpacity(0.8);
	},
	
	close: function()
	{
		var level = Popup.stack.length;
		var overlay = $("overlay");
		if (overlay)
		{
			if (!level)
			{
				overlay.hide();
			}
			else
			{
				overlay.setStyle({zIndex: 99 + (level-1)*2});
			}
		}
	}
}

var Popup = {
	stack: [],
	open: function(e, url, options)
	{
		var options = options || {};
		if (e)
		{
			e.stop();
			if (!options.element)
				options.element = e.element();
		}
		var request = new Ajax.Request(url, {evalJS: false, evalJSON: false, onSuccess: Popup.load.bind(Popup, options)});
		Overlay.open();
		LoadingImage.open({type: "L"});
	},
	
	load: function(options, transport)
	{
		LoadingImage.close();
		var count = Popup.stack.length;
		var scripts = transport.responseText.extractScripts();
		Popup.stack[count] = transport.responseText.stripScripts();
		
		var div = $("popup" + count);
		if (div)
		{
			div.setStyle({height: "auto"});
			div.update(Popup.stack[count]);
			
			div.setOpacity(0);
			div.show();
		}
		else
		{
			div = new Element("div", {"class": "popup", "id": "popup" + count});
			div.setStyle({height: "auto"});
			div.update(Popup.stack[count]);
			div.setStyle({zIndex: 100+count*2});
			div.setStyle({position: 'absolute'});
			div.hide();
			
			$$("body")[0].insert(div);
			//div.absolutize();
			div.setOpacity(0);
			div.show();
		}
		var dim = document.viewport.getDimensions();
		var scr = document.viewport.getScrollOffsets();
		var endDim = div.childElements()[0].getDimensions();
		
		var startDim = {};
		var startPos = {};
		if (options.element)
		{
			startDim = options.element.getDimensions();
			startPos = options.element.cumulativeOffset();
		}
		else
		{
			startDim = {width: 0, height: 0};
			startPos = {top: (dim.height/2)+scr.top, left: (dim.width/2)+scr.left};
		}
		
		div.setStyle({height: startDim.height + "px", width: startDim.width + "px", top: startPos.top + "px", left: startPos.left + "px"});
		var top = ((dim.height/2)+scr.top-endDim.height/2);
		var left = ((dim.width/2)+scr.left-endDim.width/2);
		//div.setStyle({top: (top < 0 ? 0 : top)+"px", left: (left < 0 ? 0 : left)+"px"});
		new Effect.Parallel([
		    new Effect.Move(div, {sync: true, x: left, y: top, mode: 'absolute'}),
		    new Effect.Morph(div, {sync: true, style: {width: endDim.width + "px", height: endDim.height + "px"}}),
		    new Effect.Opacity(div, {sync: true, from: 0, to: 1})
		], {duration: 1});
		scripts.map(function(s) { return eval(s); });
	},
	
	close: function(e)
	{
		if (e)
			e.stop();
		var count = Popup.stack.length;
		var div = $("popup" + (count-1));
		if (div)
		{
			div.update();
			Popup.stack.pop();
			new Effect.Fade(div, {duration: 0.5, afterFinish: function() { Overlay.close(); }});
		}
	},
	
	closeAll: function(e)
	{
		if (e)
			e.stop();
		for (var i = Popup.stack.length; i > 0; i--)
		{
			Popup.close(null);
		}
	}
}
