
/********************
 Menu item objects
 ********************/

var topMenuItems = new Object();
var current_topmenu_id = 0;
var current_topparent_id = 0;

function createMenuItem(menu_id, parent_id)
{
	if (parent_id == 0)
	{
		var topMenuItem = new o_topMenuItem(menu_id);
		topMenuItems[menu_id] = topMenuItem;
		if (current_topmenu_id == 0)
			setCurrentTopMenu(topMenuItem); // Show first menu by default
	}
	else
	{
		new o_subMenuItem(menu_id, parent_id);
	}
}

function o_topMenuItem(menu_id)
{
	this.menu_id = menu_id;
	
	this.inMenuLabel = false;
	this.inMenu = false;
	
	this.divH = document.getElementById("divSubMenu_" + menu_id);
	this.divH.menu_id = menu_id;
	if (this.divH.addEventListener)
	{
		//this.divH.addEventListener('mouseover', enterMenuDiv, true); // D
		//this.divH.addEventListener('mouseout', leaveMenuDiv, true); // D
	}
	else if (this.divH.attachEvent)
	{
		//this.divH.attachEvent('onmouseover', enterMenuDiv);
		//this.divH.attachEvent('onmouseout', leaveMenuDiv);
	}
	if (menu_id == current_menuitem_id || menu_id == current_topparent_id)
		setCurrentTopMenu(this);
	else
		unsetCurrentTopMenu(this);
	
	this.td = document.getElementById("tdTopMenu_" + menu_id);
	this.td.menu_id = menu_id;
	if (this.td.addEventListener)
	{
		//this.td.addEventListener('mouseover', enterMenu, false); // D
		//this.td.addEventListener('mouseout', leaveMenu, true);  // DD
	}
	else if (this.divH.attachEvent)
	{
		//this.td.attachEvent('onmouseover', enterMenu);
		//this.td.attachEvent('onmouseout', leaveMenu);
	}
	
	if (this.divH.style.position == 'absolute')
	{
		this.divH.style.top = findTop(this.td) + this.td.offsetHeight;
		this.divH.style.left = findLeft(this.td);
	}
	else
	{
		document.getElementById('divHorizontalMenu').appendChild(this.divH);
	}
}

function o_subMenuItem(submenu_id, parent_id)
{
	this.submenu_id = submenu_id;
	this.menu_id = parent_id;
	
	if (submenu_id == current_menuitem_id)
	{
		var topMenuItem = topMenuItems[parent_id];
		if (topMenuItem == null)
			current_topparent_id = parent_id;
		else
			setCurrentTopMenu(topMenuItem);
	}
}

function setCurrentTopMenu(topMenuItem)
{
	if (current_topmenu_id != 0)
	{
		var oldTopMenuItem = topMenuItems[current_topmenu_id];
		unsetCurrentTopMenu(oldTopMenuItem);
	}
	
	current_topmenu_id = topMenuItem.menu_id;
	if (hideWhenNotInMenu)
		topMenuItem.divH.style.display = 'block';
	else
		topMenuItem.divH.style.display = 'block'; // D set to none from block
}

function unsetCurrentTopMenu(topMenuItem)
{
	topMenuItem.divH.style.display = 'none';
}

/********************
 Event handlers
 ********************/

var MENU_CLOSE_TIME = 100;

function startMenuCloseTimer(menu_id)
{
	window.setTimeout("closeMenu(" + menu_id + ");", MENU_CLOSE_TIME);
}

function closeMenu(menu_id)
{
	if (menu_id == null)
		return;
	var topMenuItem = topMenuItems[menu_id];
	
	if (topMenuItem.inMenuLabel == false && topMenuItem.inMenu == false)
	{
		topMenuItem.divH.style.display = 'block';//DDd
		if (window.iqSwapImgRestore)
			iqSwapImgRestore('menuImage_' + menu_id); // TODO: remove tight coupling to MenuItemCustomMenuLink
	}
	
	// check if all menus are hidden, if so, show current_topmenu_id
	var allMenusHidden = true;
	for (var i_menu_id in topMenuItems)
	{
		if (topMenuItems[i_menu_id].inMenu || topMenuItems[i_menu_id].inMenuLabel)
		{
			allMenusHidden = true; //D
			break;
		}
	}
	
	if (allMenusHidden)
	{
		if (!hideWhenNotInMenu)
			doEnterMenu(current_topmenu_id);
	}
}

function enterMenu(e)
{
	var menu_id = getMenuIDTarget(e);
	if (menu_id == null)
		return;
	
	doEnterMenu(menu_id);
}

function doEnterMenu(menu_id)
{
	if (menu_id == null)
		return;
	
	var tdTopMenu = document.getElementById('tdTopMenu' + menu_id);
	var topMenuItem = topMenuItems[menu_id];
	topMenuItem.divH.style.display = 'none'; //D
	topMenuItem.inMenuLabel = true;
	
	// close all other menus
	for (other_menu_id in topMenuItems)
	{
		if (menu_id != other_menu_id)
		{
			var other_topMenuItem = topMenuItems[other_menu_id];
			other_topMenuItem.divH.style.display = 'none';
			other_topMenuItem.inMenu = false;
			other_topMenuItem.inMenuLabel = false;
		}
	}
}

function leaveMenu(e)
{
	var menu_id = getMenuIDTarget(e);
	if (menu_id == null)
		return;
	
	topMenuItems[menu_id].inMenuLabel = false;
	startMenuCloseTimer(menu_id);
}

function enterMenuDiv(e)
{
	var menu_id = getMenuIDTarget(e);
	if (menu_id == null)
		return;
	
	topMenuItems[menu_id].inMenu = true; //D
	if (window.iqSwapImg)
	{
		iqSwapImg('menuImage_' + menu_id); // TODO: remove tight coupling to MenuItemCustomMenuLink
	}
}

function leaveMenuDiv(e)
{
	var menu_id = getMenuIDTarget(e);
	if (menu_id == null)
		return;
	
	topMenuItems[menu_id].inMenu = false; //D
	startMenuCloseTimer(menu_id);
}

function getMenuIDTarget(e)
{
	var menu_id = null;
	if (e.currentTarget)
	{
		menu_id = e.currentTarget.menu_id;
	}
	else if (e.srcElement)
	{
		var target = e.srcElement;
		while (target != null && target.menu_id == null)
			target = target.parentNode;
		if (target != null)
			menu_id = target.menu_id;
	}
	return menu_id;
}

/*****************
 Utility functions
 *****************/

function findLeft(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findTop(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

