var _timerOpenMenu = null;
var _timerCloseMenu = null;
var _oMenuLastOpen = null;
var _oItemSelected = null;
var MENU_DELAY = 1000;

function delayOpenMenu(sFromCtrlId, sMenuId)
{
	var oMenu = document.getElementById(sMenuId);

	if (oMenu.style.display == 'none')
	{
		if (_oMenuLastOpen == null)
		{
			// Open menu after the mouse hovers for 1 second
			_timerOpenMenu = window.setTimeout(function() { _timerOpenMenu = null; openMenu(sFromCtrlId, oMenu) }, MENU_DELAY);
		}
		else
		{
			// Open menu now when another menu was already open
			openMenu(sFromCtrlId, oMenu);
		}
	}
}

function delayCloseMenu()
{
	// Close menu after the mouse has been away for 1 second
	_timerCloseMenu = window.setTimeout(function() { _timerCloseMenu = null; closeMenu() }, MENU_DELAY);
}

function cancelOpenMenu()
{
	if (_timerOpenMenu != null)
	{
		window.clearTimeout(_timerOpenMenu);
		_timerOpenMenu = null;
	}
}

function cancelCloseMenu()
{
	if (_timerCloseMenu != null)
	{
		window.clearTimeout(_timerCloseMenu);
		_timerCloseMenu = null;
	}
}

function toggleMenu(sFromCtrlId, sMenuId)
{
	var oMenu = document.getElementById(sMenuId);

	if (oMenu != null && oMenu.style.display == 'none')
	{
		openMenu(sFromCtrlId, oMenu);
	}
	else
	{
		closeMenu();
	}
}

function openMenu(sFromCtrlId, oMenu)
{
	try
	{
		cancelOpenMenu();
		cancelCloseMenu();

		if (_oMenuLastOpen != null && _oMenuLastOpen != oMenu)
		{
			closeMenu();
		}

		_oMenuLastOpen = oMenu;

		showMenu();
		alignMenu(sFromCtrlId);

		_oMenuLastOpen.ondrag = function() { return false; }
		_oMenuLastOpen.onselectstart = function() { return false; }
		_oMenuLastOpen.onmouseover = cancelCloseMenu;
		_oMenuLastOpen.onmouseout = delayCloseMenu;
	}
	catch (exception)
	{
		alert(exception);
	}
}

function closeMenu()
{
	try
	{
		cancelCloseMenu();
		cancelOpenMenu();

		hideMenu();

		_oMenuLastOpen = null;
	}
	catch (exception)
	{
		alert(exception);
	}
}

function showMenu()
{
	highlightParent();
	if (_oMenuLastOpen != null)
	{
		_oMenuLastOpen.style.display = ''; // clearing 'none' is safer than setting 'block';
	}
}

function hideMenu()
{
	dimParent();
	if (_oMenuLastOpen != null)
	{
		_oMenuLastOpen.style.display = 'none';
	}
}

function dimParent()
{
	if (_oMenuLastOpen != null)
	{
		var sParentId = _oMenuLastOpen.getAttribute('parentId');
		if (sParentId)
		{
			var oParent = document.getElementById(sParentId);
			if (oParent != null)
			{
				genericHover(oParent, false);
			}
		}
	}
}

function highlightParent()
{
	if (_oMenuLastOpen != null)
	{
		var sParentId = _oMenuLastOpen.getAttribute('parentId');
		if (sParentId)
		{
			var oParent = document.getElementById(sParentId);
			if (oParent != null)
			{
				genericHover(oParent, true);
			}
		}
	}
}

function alignMenu(sFromCtrlId)
{
	var fromCtrl = document.getElementById(sFromCtrlId);
	if (fromCtrl != null && _oMenuLastOpen != null)
	{
		alignBottomLeftToParent(_oMenuLastOpen, fromCtrl);
	}
}

function alignRightToParent(oMenu, oParent)
{
	// @THB 03/2009 see Library.js alignPopUp() if you get compatibility problems between IE, FF or Safari
	var pixelTop = oParent.offsetTop;
	var pixelLeft = oParent.offsetLeft;
	var oContainer = oParent.offsetParent;
	while (oContainer != document.body)
	{
		pixelTop += oContainer.offsetTop;
		pixelTop -= oContainer.scrollTop;
		pixelLeft += oContainer.offsetLeft;
		pixelLeft -= oContainer.scrollLeft;
		oContainer = oContainer.offsetParent;
	}
	oMenu.style.top = pixelTop + 'px';
	oMenu.style.left = (pixelLeft + oParent.offsetWidth) + 'px';
}

function alignLeftToParent(oMenu, oParent)
{
	// @THB 03/2009 see Library.js alignPopUp() if you get compatibility problems between IE, FF or Safari
	var pixelTop = oParent.offsetTop;
	var pixelLeft = oParent.offsetLeft;
	var oContainer = oParent.offsetParent;
	while (oContainer != document.body)
	{
		pixelTop += oContainer.offsetTop;
		pixelTop -= oContainer.scrollTop;
		pixelLeft += oContainer.offsetLeft;
		pixelLeft -= oContainer.scrollLeft;
		oContainer = oContainer.offsetParent;
	}
	oMenu.style.top = pixelTop + 'px';
	oMenu.style.left = pixelLeft + 'px';
}

function alignBottomRightToParent(oMenu, oParent)
{
	var pixelTop = oParent.offsetTop;
	var pixelLeft = oParent.offsetLeft;
	var oContainer = oParent.offsetParent;
	while (oContainer != document.body)
	{
		pixelTop += oContainer.offsetTop;
		pixelTop -= oContainer.scrollTop;
		pixelLeft += oContainer.offsetLeft;
		pixelLeft -= oContainer.scrollLeft;
		oContainer = oContainer.offsetParent;
	}
	oMenu.style.top = (pixelTop + oParent.offsetHeight) + 'px';
	oMenu.style.left = (pixelLeft + oParent.offsetWidth) + 'px';
}

function alignBottomLeftToParent(oMenu, oParent)
{
	var pixelTop = oParent.offsetTop;
	var pixelLeft = oParent.offsetLeft;
	var oContainer = oParent.offsetParent;
	while (oContainer != document.body)
	{
		pixelTop += oContainer.offsetTop;
		pixelTop -= oContainer.scrollTop;
		pixelLeft += oContainer.offsetLeft;
		pixelLeft -= oContainer.scrollLeft;
		oContainer = oContainer.offsetParent;
	}
	oMenu.style.top = (pixelTop + oParent.offsetHeight) + 'px';
	oMenu.style.left = pixelLeft + 'px';
}

