var menuItems = new Array();
var itemsReady = new Array();
var activeItems = new Array();
var menuInUse = false;

var userAgent = navigator.userAgent.toLowerCase();
var is_opera  = (userAgent.indexOf('opera') != -1);
var is_saf    = ((userAgent.indexOf('applewebkit') != -1) || (navigator.vendor == "Apple Computer, Inc."));
var is_webtv  = (userAgent.indexOf('webtv') != -1);
var is_ie     = ((userAgent.indexOf('msie') != -1) && (!is_opera) && (!is_saf) && (!is_webtv));
var is_ie4    = ((is_ie) && (userAgent.indexOf("msie 4.") != -1));
var is_moz    = ((navigator.product == 'Gecko') && (!is_saf));
var is_kon    = (userAgent.indexOf('konqueror') != -1);
var is_ns     = ((userAgent.indexOf('compatible') == -1) && (userAgent.indexOf('mozilla') != -1) && (!is_opera) && (!is_webtv) && (!is_saf));
var is_ns4    = ((is_ns) && (parseInt(navigator.appVersion) == 4));

var domType = '';
if (document.getElementById) 
{
	domType = "std";
}
else if (document.all) 
{
	domType = "ie4";
}
else if (document.layers)
{
	domType = "ns4";
}

var elementCache = new Array();

function objectByID(idname)
{
	if (!elementCache[idname])
	{
		switch (domType)
		{
			case "std":
			{
				elementCache[idname] = document.getElementById(idname);
			}
			break;

			case "ie4":
			{
				elementCache[idname] = document.all[idname];
			}
			break;

			case "ns4":
			{
				elementCache[idname] = document.layers[idname];
			}
			break;
		}
	}
	return elementCache[idname];
}

function handleEvent(eventobj)
{
	if (!eventobj || is_ie)
	{
		window.event.returnValue = false;
		window.event.cancelBubble = true;
		return window.event;
	}
	else
	{
		eventobj.stopPropagation();
		eventobj.preventDefault();
		return eventobj;
	}
}

function registerMenuItem(controlid)
{
	if (document.getElementsByTagName)
	{
		var controlobj = objectByID(controlid);
		if (controlobj)
		{			
			menuItems[menuItems.length] = controlid;
			return true;
		}
	}
	
	return false;
}

function initMenu()
{
	if (menuItems.length > 0)
	{
		for (i in menuItems)
		{
			initMenuEntry(menuItems[i]);
		}

		document.onclick = closeMenu;
	}
	
	return true;
}

function normalizeEvent(eventobj)
{
	if (!eventobj || is_ie)
	{
		window.event.cancelBubble = true;
		return window.event;
	}
	else
	{
		if (eventobj.target.type == 'submit')
		{
			eventobj.target.form.submit();
		}
		eventobj.stopPropagation();
		return eventobj;
	}
}

function totalLeftOffset(elm)
{
	var left = elm.offsetLeft;
	while((elm = elm.offsetParent) != null)
	{
		left += elm.offsetLeft;
	}
	return left;
}

function totalTopOffset(elm)
{
	var top = elm.offsetTop;
	while((elm = elm.offsetParent) != null)
	{
		top += elm.offsetTop;
	}
	return top;
}

function menuID(controlid)
{
	var dotpos = controlid.indexOf(".");
	if (dotpos != -1)
	{
		return controlid.substr(0, dotpos);
	}
	else
	{
		return controlid;
	}
}

function mouseOver(e)
{
	e = handleEvent(e);
	mouseHOver(this);
}

function mouseClick(e)
{
	e = handleEvent(e);
	openMenu(this);
}

function closeMenu()
{
	if (menuInUse)
	{
		for (key in activeItems)
		{
			objectByID(menuID(key) + "_menu").style.display = "none";
			activeItems[key] = false;
		}
	}
	menuInUse = false;
	if (is_ie)
	{
		selects = document.getElementsByTagName("select");
		for (var i = 0; i < selects.length; i++)
		{
			selects[i].style.visibility = "visible";
		}
	}
}

function mouseHOver(elm)
{
	for (key in activeItems)
	{
		if (activeItems[key] == true && key != elm.id)
		{
			openMenu(elm);
			return;
		}
	}
}

function menuOverlap(selectobj, mouseTop, mouseLeft, mouseBottom, mouseRight)
{
	objLeft = totalLeftOffset(selectobj);
	objTop = totalTopOffset(selectobj);	
	objRight = objLeft + selectobj.offsetWidth;
	objBottom = objTop + selectobj.offsetHeight;
	
	if (objLeft >= mouseLeft && objLeft <= mouseRight && ((objTop >= mouseTop && objTop <= mouseBottom) || (objBottom >= mouseTop && objBottom <= mouseBottom))) 
	{ 
		return true; 
	}
	if (objRight >= mouseLeft && objRight <= mouseRight && ((objTop >= mouseTop && objTop <= mouseBottom) || (objBottom >= mouseTop && objBottom <= mouseBottom))) 
	{ 
		return true; 
	}
	if (objBottom >= mouseTop && objTop <= mouseBottom && ((objLeft >= mouseLeft && objLeft <= mouseRight) || (objRight >= mouseRight && objRight <= mouseRight))) 
	{ 
		return true; 
	}
	if (mouseBottom >= objTop && mouseTop <= objBottom && ((mouseLeft >= objLeft && mouseLeft <= objRight) || (mouseRight >= objRight && mouseRight <= objRight))) 
	{ 
		return true;
	}
	return false;
}

function openMenu(elm)
{
	var openmenu = menuInUse;
	
	closeMenu();
	
	if (openmenu == elm.id)
	{
		return false;
	}
	
	var menuid = menuID(elm.id) + "_menu";	
	var menuobj = objectByID(menuid);
	
	activeItems[elm.id] = true;
	menuInUse = elm.id;
	
	var leftpx = totalLeftOffset(elm);
	var toppx = totalTopOffset(elm) + elm.offsetHeight;
	
	menuobj.style.display = "";
	
	menuobj.style.left = leftpx + "px";
	menuobj.style.top = toppx + "px";
	
	if (is_ie)
	{	
		mouseRight=leftpx + menuobj.offsetWidth;
		mouseBottom=toppx + menuobj.offsetHeight;
		selects = document.getElementsByTagName("select");
		for (var i = 0; i < selects.length; i++)
		{
			if (menuOverlap(selects[i], toppx,leftpx,mouseBottom,mouseRight))
			{
				selects[i].style.visibility = "hidden";
			}
		}
	}
	
	return false;
}

function clickLink(e)
{
	childLinks = this.getElementsByTagName("a");
	if (childLinks[0])
	{
		if (is_ie)
		{
			childLinks[0].click();
			window.event.cancelBubble = true;
		}
		else
		{
			// other browsers can use this
			if (e.shiftKey)
			{
				window.open(childLinks[0].href);
				e.stopPropagation();
				e.preventDefault();
			}
			else
			{
				window.location = childLinks[0].href;
				e.stopPropagation();
				e.preventDefault();
			}
		}
	}
}

function switchBackground(e)
{
	if (is_moz)
	{
		rightClickMozilla(e);
	}
	this.className = (this.className == "popupOptions") ? "popupMouseOver" : "popupOptions";
	switchMousePointer(this);
}

function switchMousePointer(obj)
{
	try
	{
		obj.style.cursor = "pointer";
	}
	catch(e)
	{
		obj.style.cursor = "hand";
	}
}

function initMenuEntry(controlid)
{
	var menuid = menuID(controlid) + "_menu";
	var menuobj = objectByID(menuid);
	
	if (document.getElementsByTagName && menuobj)
	{
		var controlobj = objectByID(controlid);
		switchMousePointer(controlobj);
		controlobj.unselectable = true;
		controlobj.onclick = mouseClick;
		controlobj.onmouseover = mouseOver;
		
		if (typeof(itemsReady[menuid]) != "undefined")
		{
			return;
		}
		
		var popupobj = objectByID(menuid);
		popupobj.style.display = "none";
		popupobj.style.position = "absolute";
		popupobj.style.left = "0px";
		popupobj.style.top = "0px";
		popupobj.onclick = normalizeEvent;
		
		var tables = popupobj.getElementsByTagName("table");
		if (tables.length > 0)
		{
			tables[0].width = "";
		}
		
		if (is_ie)
		{		
			popupobj.style.filter += "progid:DXImageTransform.Microsoft.alpha(enabled=1,opacity=100)";
			popupobj.style.filter += "progid:DXImageTransform.Microsoft.shadow(direction=135,color=#8E8E8E,strength=3)";
		}
		
		var tds = popupobj.getElementsByTagName("td");
		for (var i = 0; i < tds.length; i++)
		{			
			if (tds[i].className == "popupOptions")
			{
				tds[i].style.cursor = "default";
				if (tds[i].title == "nohilite")
				{
					tds[i].title = "";
				}
				else
				{
					tds[i].onmouseover = switchBackground;
					tds[i].onmouseout = switchBackground;
					tds[i].onclick = clickLink;

					if (!is_saf && !is_kon)
					{
						try
						{
							var links = tds[i].getElementsByTagName("a");
							for (var j = 0; j < links.length; j++)
							{
								if (typeof(links[j].onclick) == "undefined")
								{
									links[j].onclick = normalizeEvent;
								}
							}
						}
						catch(e)
						{
						}
					}
				}
			}
			else if (is_moz)
			{
				tds[i].onmouseover = rightClickMozilla;
				tds[i].onmouseout = rightClickMozilla;
			}
		}
		
		itemsReady[menuid] = true;
	}
}

function rightClickMozilla(e)
{
	if (e.type == 'mouseover')
	{
		document.onclick = '';
	}
	else
	{
		document.onclick = closeMenu;
	}
}
