/*******************************************************************************
*
*	TableMenuRenderer.js
*
*******************************************************************************/

/*******************************************************************************
* CONSTRUCTOR
*******************************************************************************/
function TableMenuRenderer(args)
{
	/* Empty Constuctor Helper */
	if (! args)
	{
		args = [];
	}
	
	/* Need this construct because of JavaScript inheritance problems */
	if (args[ConstructorHelper] == ConstructorHelper)
	{
		return;
	}
	
	throw new Error("Cannot instantiate virtual Class TableMenuRenderer");
}

/*TableMenuRenderer.prototype._init = function(menu)
{
	alert("Call to abstract method");
}*/

/*******************************************************************************
* _processMenu
*******************************************************************************/
TableMenuRenderer.prototype._processMenu = function(menu)
{
	switch (menu._getLevel())
	{
		case 0:
		//alert("FIRST");
			this._renderFirstLevel(menu);
			break;
		case 1:
		//alert("SECOND");
			this._renderSecondLevel(menu);
			break;
		default:
			this._renderDefaultLevel(menu);
			break;
	}
	

	for (var i = 0; i < menu._getMenuItemsCount(); i++)
	{
		//alert("SECOND+ LEVEL");
		if (menu._menuItems[i]._hasSubMenu())
		{
			this._processMenu(menu._menuItems[i]._subMenu)
		}
	}
}

/*******************************************************************************
* regEvent
*		Register an event on any target
*******************************************************************************/
TableMenuRenderer.prototype.regEvent = function(targetObject, nodeObject, handlerName, functionCode, nodeEvent)
{
	targetObject[handlerName] = functionCode;
	nodeObject[nodeEvent] = function(e) { targetObject[handlerName](e); };
}



/*******************************************************************************
* _renderHSubMenuTable
*		HORIZONTAL MENU
*******************************************************************************/
TableMenuRenderer.prototype._renderHSubMenuTable = function(subMenu)
{
	var node = this._renderDivTableContainerElement(subMenu);
	
	// TABLE ROW
	var tr = createBitbaseNodeElement('TR');
	//alert(node.firstChild);
	node.firstChild.appendChild(tr);

	document.getElementById('bitbase_menu').appendChild(node);

	for (var i in subMenu._menuItems)
	{
		var td = this._renderHtmlTdElement(subMenu._menuItems[i]);

		tr.appendChild(td);
		
	}

	return node;

}


/*******************************************************************************
* _renderVSubMenuTable
*		VERTICAL MENU
*******************************************************************************/
TableMenuRenderer.prototype._renderVSubMenuTable = function(subMenu)
{
	var node = this._renderDivTableContainerElement(subMenu);
	
	for (var i = 0; i < subMenu._getMenuItemsCount(); i++)
	{
		// TABLE ROW
		var tr = createBitbaseNodeElement('TR');
		//alert(node.firstChild.firstChild);
		node.firstChild.firstChild.appendChild(tr);		
		
		var td = this._renderHtmlTdElement(subMenu._menuItems[i]);
		
		tr.appendChild(td);
	} 

	document.getElementById('bitbase_menu').appendChild(node);
	
	
	// TABLE MOUSE OUT
	var mouseOutHandler = function(e)
	{
		if (!e) var e = window.event;
			
		var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
			
		// Hide this element if we leave the whole menu
		if (! reltg.bitbaseMenuItem)
		{
			this._getRootMenu()._hideAll();
		}
	}
	this.regEvent(subMenu, node, "mouseOutHandler", mouseOutHandler, "onmouseout");
	
	//alert(node);
	return node;

}


/*******************************************************************************
*	_renderDivTableContainerElement
*******************************************************************************/
TableMenuRenderer.prototype._renderDivTableContainerElement = function(subMenu)
{
	var node = createBitbaseNodeElement('DIV');
	node.style.position = "absolute";
	
	// TABLE STRUCTURE
	var table = createBitbaseNodeElement('TABLE');
	table.style.tableLayout = "fixed";
	table.style.emptyCells = "show";
	table.style.backgroundColor = "yellow";
	table.style.borderWidth = "1px";
	table.style.borderSpacing = "3px";
	// Internet Explorer Compatibility
	table.setAttribute("cellSpacing", 2);
	var tbody = createBitbaseNodeElement('TBODY');
	
	tbody.setAttribute("bgColor", "#CCCCCC");
	
	table.appendChild(tbody);
	
	// DIV<->TABLE
	node.appendChild(table);
	
	subMenu._node = node;

	return node;	
}

/*******************************************************************************
* _renderHtmlTdElement
*******************************************************************************/
TableMenuRenderer.prototype._renderHtmlTdElement = function(menuItem)
{
	/*****************************************************************************
	* CLOSURE tdMouseOverHandler
	*****************************************************************************/
	var tdMouseOverHandler = function(e)
		{
			if (!e) var e = window.event;
			
			// Hide all open items
			for (var i = 0; i < this._parentMenu._getMenuItemsCount(); i++)
			{
				//this._parentMenu._menuItems[i]._subMenu._hide();
				if (this._parentMenu._menuItems[i]._subMenu)
				{
					// TODO: Check if its the current item
					this._parentMenu._menuItems[i]._subMenu._hideAll();
				}
			}
			
			// if there is a submenu, open it
			if (this._subMenu)
			{
				this._subMenu._show();	
			}
		}	


	var td = createBitbaseNodeElement('TD');
	td.style.border = "1px solid blue";
	var text = document.createTextNode(menuItem._text);
	td.appendChild(text);
	
	this.regEvent(menuItem, td, "mouseOverHandler", tdMouseOverHandler, "onmouseover");
	
	menuItem._node = td;
		
	//menuItem._setCssClassBlockDefault();
	
	return td;
}

