/*
*	TopPanelController.js - object to control "front window" behavior
*	
*	
*/

//declaring the class
var TopPanelController = Class.create();

//defining the rest of the class implmentation
TopPanelController.prototype = 
{
	initialize: function (panelIDs) 
	{
		this.typeName = 'TopPanelController';
		this.options = (arguments[1] || {});
		this.event = 'mousedown';
		this.zIndex = '1000';
		
		this.panels = new Array();
		for (i=0; i < panelIDs.length; i++)
		{
			this.addPanel(panelIDs[i]);
		}
		
	//	this._debug("\n\nLoading TPC with " 
	//		+ panelIDs.length + " panels.");	//	***
	},
	
	setOptions: function (options)
	{
		Object.extend(this.options, options);
	},
	
	getTopPanel: function ()
	{
		return (this.toppanel || '');
	},
	
	getTopPanelID: function ()
	{
		return (this.toppanel.id || '');
	},
	
	getPreviousZIndex: function ()
	{
		return (this.previousZIndex || '');
	},
	
	addPanel: function (panelID)
	{
		var panel = $(panelID);
		
		if (panel !== undefined)
		{
			this.panels.push(panel);
			
			this.observeEvent(panel, (this.options.event || this.event));
		}
		
	//	this._debug('Adding panel ' + panel.id + ".");	//	***
	},
	
	isPanel: function (panel)
	{
		return this.panels.include(panel);
	},
	
	promotePanel: function (panelID)
	{
		//	get panel as element
		var panel = $(panelID);
		
		//	if element is in list of panels
		if (this.isPanel(panel))
		{
			//	if a panel has been previously promoted
			if (this.toppanel && this.previousZIndex)
			{
				//	demote panel to previous z-index
				this.toppanel.style.zIndex = this.previousZIndex;
			}
			
			//	store promoted panel and its old z-index
			this.toppanel = panel;
			this.previousZIndex = panel.style.zIndex;
			
			//	promote window to new z-index
			panel.style.zIndex = (this.options.zIndex || this.zIndex);
		}
		
	//	this._debug('Promoting ' + panel.id + " to " + panel.style.zIndex 
	//		+ " from " + this.previousZIndex + ".");	//	***
	},
		
	promote: function (event)
	{
		
		//	get event-triggering element
		var triggerElement = Event.element(event || window.event);
				
		var validPanel = this._parentToPanel(triggerElement);
		
	//	this._debug('promote() passing ' + validPanel.id + ".");	//	***
		
		//	call panel promotion call (see above)
		this.promotePanel(validPanel);
	},
	
	observeEvent: function (target, listen)
	{
		Event.observe(target, listen, 
			this.promote.bindAsEventListener(this), true);
	},
	
	_parentToPanel: function (panel, col)
	{
		if (panel == null)
		{
		//	this._debug('Not Found: ' + col + " > *null*\n");	//	***
			return '';
		}
		else if (this.isPanel(panel))
		{
		//	this._debug('Found (' + panel.id + '): ' 
		//		+ col + " > " + panel.id + "\n");	//	***
			return panel;
		}
		else
		{
			return this._parentToPanel(panel.parentNode, 
				(col || '*') + " > " + panel.id);
		}
	},
	
	_debug: function (msg)
	{
		if (this.options.debug) $('console_ta').value += msg + "\n";
	}
}

/*
	Original Usage:
	
	var toppanel, previousZ;
	function topPanelListener(panel)
	{
		//	set (old) toppanel with previous z-index
		if (toppanel) toppanel.style.zIndex = previousZ;
		//	store new top panel and its z-index
		toppanel = panel;
		previousZ = panel.style.zIndex;
		//	promote window
		panel.style.zIndex = '1000';
	}
	
	in window.onload hook:
	
	//	Observe all movable panels for z-index promotion
	Event.observe($('controls'), 'mousedown', 
		function () { topPanelListener($('controls')); }, false);
	Event.observe($('report'), 'mousedown', 
		function () { topPanelListener($('report')); }, false);
	Event.observe($('roominfo'), 'mousedown', 
		function () { topPanelListener($('roominfo')); }, false);
*/
