var jsMenuZIndex = 500000;
window.mouseIsOverMenuThread = null;
function jsMenuTDHighLight(domObjFrom)
{
	domObjFrom.className = "JSMenuTDhover";
}

function jsMenuTDNormal(domObjFrom)
{
	domObjFrom.className = "JSMenuTD";
}


var jsMenuSubMenus = new Array();
var mouseIsOverMenu = false;
function jsMenuRegisterSubMenus()
{
	var documentTables = document.getElementsByTagName("table");
	var menuCount=0;
	for(var i=0; i<documentTables.length; i++)
	{
		if(!documentTables[i].getAttribute("id"))
			continue;
		if(documentTables[i].getAttribute("id").match(/^subGroupOf\[[0-9]+\]$/))
		{
			jsMenuSubMenus[menuCount] = documentTables[i]; 
			menuCount++;
		}
	}
}

function hideSubMenus(except)
{
	window.haMenuAtivo = false;
	try
	{
		if(window.jsMenuSubMenus.length == 0)
			jsMenuRegisterSubMenus();
	}
	catch(e)
	{
		return;
	}
	for(var i=0; i<window.jsMenuSubMenus.length; i++)
	{
		try
		{
			if(window.jsMenuSubMenus[i].style.visibility != "visible" && 
				window.jsMenuSubMenus[i].className != "JSMenuMainmenu")
				continue;
			var id = parseInt(window.jsMenuSubMenus[i].getAttribute("id").replace(/[^0-9]+/, ""));
			
		}
		catch(e)
		{
			continue;
		}
		var subMenusTds = window.jsMenuSubMenus[i].getElementsByTagName("td");
		for(var cTd=0; cTd<subMenusTds.length; cTd++)
		{
			if(subMenusTds[cTd].className == "JSMenuTDhover")
			{
				var tdId = parseInt(subMenusTds[cTd].getAttribute("id").replace(/[^0-9]+/, ""));
				if(!isAncestor(tdId, except))
					subMenusTds[cTd].className = "JSMenuTD";
			}
		}

		if(isAncestor(id, except))
			continue;
		if(id != 0)
		{
			window.jsMenuSubMenus[i].style.visibility = "hidden";
			window.jsMenuSubMenus[i].style.top = 0;
			window.jsMenuSubMenus[i].style.left = 0;
		}
		window.jsMenuActive[id] = false;
	}

}
window.isOverMenuAndMouseIsClicked = false;
var jsMenuActive = new Array();
var jsMenuWhoIsTheParents = new Array();

function isAncestor(idAncentor, idToCheck)
{
	if(idAncentor == idToCheck)
		return true;
	var test = idToCheck;
	while(test = jsMenuWhoIsTheParents[test])
	{
		if(test == idAncentor)
			return true;
	}
	return false;
}

if(document.all)
{
	document.body.attachEvent("onmousedown", hideOnBodyClick);
}
else
{
	document.body.addEventListener("mousedown", hideOnBodyClick, false);
}

function hideOnBodyClick()
{
	try
	{
		if(!mouseIsOverMenu)
			hideSubMenus(0);
	}
	catch(e){}
}

var menuTimer = null;

function startMenuTimer()
{
	//clearTimeout(window.menuTimer);
	//window.menuTimer = setTimeout("hideOnBodyClick();", 200);
}

function stopMenuTimer()
{
	//clearTimeout(window.menuTimer);
}
window.haMenuAtivo = false;
function showSubMenu(id, parentIsVertical, domObjFrom, subGroupOf)
{
	if(window.jsMenuActive[id])
		return;
	
	hideSubMenus(subGroupOf);
	window.haMenuAtivo = true;

	var subGroupMenuElement = document.getElementById("subGroupOf["+id.toString()+"]");
	jsMenuTDHighLight(domObjFrom);
	var posTop;
	var posLeft;

	//alert(subGroupMenuElement.offsetWidth);
	//document.body.clientHeight
	
	if(parentIsVertical)
	{
		posTop = oMyFindPosition.Y(domObjFrom);
		posLeft = oMyFindPosition.X(domObjFrom)+domObjFrom.offsetWidth-2;		
		if((posLeft+subGroupMenuElement.offsetWidth)>document.body.clientWidth)
		{
			var altPosLeft = oMyFindPosition.X(domObjFrom)-subGroupMenuElement.offsetWidth+2;
		
			if(altPosLeft >= 0)
				posLeft = altPosLeft;
		}
	}
	else
	{
		posLeft = oMyFindPosition.X(domObjFrom) - 1;
		posTop = oMyFindPosition.Y(domObjFrom)+domObjFrom.offsetHeight;
		if((posTop+subGroupMenuElement.offsetHeight)>document.body.clientHeight)
		{
			var altPosTop = oMyFindPosition.Y(domObjFrom)-subGroupMenuElement.offsetHeight+1;
		
			if(altPosTop >= 0)
				posTop = altPosTop;
		}
	}

	subGroupMenuElement.style.top = posTop.toString()+"px";
	subGroupMenuElement.style.left = posLeft.toString()+"px";
	window.jsMenuZIndex++;
	subGroupMenuElement.style.zIndex = window.jsMenuZIndex;
	subGroupMenuElement.style.visibility = "visible";

	window.jsMenuActive[id] = true;
	window.jsMenuWhoIsTheParents[id] = subGroupOf;
}

function MyFindPosition () 
{
	this.X = function (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;
	}

	this.Y = function (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;
	}  
}

var oMyFindPosition = new MyFindPosition;