
var hideTimer = null;
var rootMenu = null;
var menuId = -1;
var menuItems = new Array();
var menuItemPrefix = "menuItem";
var menuPrefix = "menuContainer";

if (!document.getElementById)
	document.getElementById = function() { return null; }
	
var agt = navigator.userAgent.toLowerCase();
var is_ie = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_mac = (agt.indexOf("mac")!=-1);
var needShim = is_ie && !is_mac;
	
function MenuItem(title, href)
{
	menuId++;

	this.id = menuId;
	this.title = title;
	this.href = href;
	this.menuItems = new Array();
}

function writeMenus()
{	
	document.write('<div id="menuList">');

	var index;

	for (index = 0 ; index < menuItems.length ; index++)
	{
		writeMenuItems(menuItems[index]);
		initializeMenu(menuItems[index].id);
	}

	document.write('</div>');		
}

function writeMenuItems(menuItem)
{
	var index;
	
	if (menuItem.menuItems.length > 0)
	{
		document.write('<ul id="' + menuPrefix + menuItem.id + '">');
		for (index = 0 ; index < menuItem.menuItems.length ; index++)
		{
			var item = menuItem.menuItems[index];

			document.write('<li><a href="' + item.href + '" id="' + menuItemPrefix + item.id + '"' );

			if (item.menuItems.length > 0)
				document.write(' class="subMenu"');

			document.write('>' + item.title + '</a></li>');
		}
		document.write('</ul>');

		for (index = 0 ; index < menuItem.menuItems.length ; index++)
		{
			var item = menuItem.menuItems[index];

			writeMenuItems(item);

			if (item.menuItems.length > 0)
				initializeSubMenu(menuItem.id, item.id);
			else
				initializeMenuItem(menuItem.id, item.id);
		}
	}	
}

function initializeMenu(menuId) 
{
	var menu = document.getElementById(menuPrefix + menuId);
	var menuItem = document.getElementById(menuItemPrefix + menuId);

	if (menuItem == null || menu == null) return;

	menuItem.onmouseover = function() 
	{
		clearDelayedHide();
		hideMenus();

		if (menu != null)
		{
			rootMenu = menu;

			menu.style.left = getRealLeft(menuItem) + 7 + "px";
			menu.style.top = getRealTop(menuItem) + menuItem.offsetHeight + 1 + "px";
			menu.style.visibility = "visible";
			
			if (needShim)
				openShim(menu);
		}
	}
	menuItem.onmouseout = function() { setDelayedHide(); }
	
	menu.onmouseover = function() { clearDelayedHide(); }
	menu.onmouseout = function() { setDelayedHide(); }
	menu.activeMenu = null;
}

function initializeSubMenu(parentId, menuId)
{
	var parentMenu = document.getElementById(menuPrefix + parentId);
	var menu = document.getElementById(menuPrefix + menuId);
	var menuItem = document.getElementById(menuItemPrefix + menuId);

	if (menu == null || menuItem == null || parentMenu == null) return;

	menuItem.onmouseover = function()
	{
		clearDelayedHide();
		hideSubMenus(parentMenu);

		realLeft = getRealLeft(menuItem) + menuItem.offsetWidth + 1;
		realTop = getRealTop(menuItem)

		if ((realLeft + menu.offsetWidth) > getAvailWidth())
			realLeft = realLeft - menu.offsetWidth * 2 - 2;

		menu.style.left = realLeft + "px";
		menu.style.top = realTop + "px";
		menu.style.visibility = "visible";
		
		if (needShim)
			openShim(menu);

		parentMenu.activeMenu = menu;
	}
	
	menu.onmouseover = function() { clearDelayedHide(); }
	menu.onmouseout = function() { setDelayedHide(); }
	menu.activeMenu = null;
}

function initializeMenuItem(parentId, menuId)
{
	var menu = document.getElementById(menuPrefix + parentId);
	var item = document.getElementById(menuItemPrefix + menuId);

	if (menu == null || item == null) return;

	item.onmouseover = function()
	{
		clearDelayedHide();
		hideSubMenus(menu);
	}
}

function setDelayedHide()
{
	hideTimer = window.setTimeout("hideMenus()", 500);
}

function clearDelayedHide()
{
	if (hideTimer) 
	{
		window.clearTimeout(hideTimer);
		hideTimer = null;
	}
}

function hideMenus()
{
	if (rootMenu != null)
	{
		rootMenu.style.visibility = "hidden";
		closeShim(rootMenu);
		hideSubMenus(rootMenu);
	}
}

function hideSubMenus(parentMenu)
{	
	var menu = parentMenu.activeMenu;

	while (menu != null)
	{
		menu.style.visibility = "hidden";
		closeShim(menu);
		menu = menu.activeMenu;
	}	
}

function getRealLeft(el) 
{
	xPos = el.offsetLeft;
	tempEl = el.offsetParent;
	while (tempEl != null) 
	{
		xPos += tempEl.offsetLeft;
		tempEl = tempEl.offsetParent;
	}
	return xPos;
}

function getRealTop(el) 
{
	yPos = el.offsetTop;
	tempEl = el.offsetParent;
	while (tempEl != null) 
	{
		yPos += tempEl.offsetTop;
		tempEl = tempEl.offsetParent;
	}
	return yPos;
}

function getAvailWidth()
{
	var width;	
	width = document.body.clientWidth;		
	return width;
}

function openShim(menu)
{
    var shim = getShim(menu);
    
    if (shim == null) 
		shim = createMenuShim(menu, getShimId(menu));
     
    menu.style.zIndex = 100;        
    
    shim.style.width = menu.offsetWidth + "px";
    shim.style.height = menu.offsetHeight + "px";
    shim.style.top = getRealTop(menu) + "px";
    shim.style.left = getRealLeft(menu) + "px";
    shim.style.zIndex = menu.style.zIndex - 1;
    shim.style.position = "absolute";
    shim.style.display = "block";
}

function closeShim(menu)
{
    var shim = getShim(menu);
    if (shim != null) 
		shim.style.display = "none";
}

function createMenuShim(menu)
{	
	var shim = document.createElement('iframe');
    shim.name = getShimId(menu);
    shim.id = getShimId(menu);    
    shim.scrolling="no";    
    shim.style.position = "absolute";
    shim.style.top = "0px";
    shim.style.left = "0px";
    shim.style.display = "none";
    shim.style.border = "0";
	
	window.document.body.appendChild(shim);     

    return shim;
}

function getShimId(menu)
{    
    return menu.id + "__shim";
}

function getShim(menu)
{
    return document.getElementById(getShimId(menu));
}

function selectMenu(id)
{
	var item = document.getElementById(id);
	
	if (item != null)
		item.className = "selected";
}
