var menu = null;
var menu_cfg = new Array( ); 

function menu_load( )
{
	if(!menu_cfg["id"])
	{
		var menu_meta = document.getElementsByTagName("META");
		for(var i=0; i<menu_meta.length; i++) if(menu_meta[i].name.indexOf("menu_") == 0)
			menu_cfg[menu_meta[i].name.substring(menu_meta[i].name.indexOf("_")+1)] = menu_meta[i].content;
		if(!menu_cfg["id"]) menu_cfg["id"] = "menu";
		if(!menu_cfg["position"]) menu_cfg["position"] = "bottom";
	}
	if(!menu)
	{
		menu = document.getElementById(menu_cfg["id"]);
		for(var i=0; i<menu.childNodes.length; i++) if(menu.childNodes[i].nodeType == 1)
		{
			var submenu = menu.childNodes[i].getElementsByTagName("LI");
			menu.childNodes[i].onmouseover = menu_hover;
			menu.childNodes[i].onfocus = menu_hover;
			menu_css_set("menu_root", menu.childNodes[i]);
			if(menu.childNodes[i].getElementsByTagName("UL").length > 0)
				menu_css_set("menu_haschild", menu.childNodes[i]);
			if(submenu.length) for(var j=0; j<submenu.length; j++)
			{
				menu_css_set("menu_children", submenu[j]);
				submenu[j].onmouseover = submenu_hover;
				submenu[j].onmouseover = submenu_hover;
				if(submenu[j].getElementsByTagName("UL").length > 0)
					menu_css_set("menu_haschild", submenu[j]);
			}
		}
	}
	if(typeof document.body.addEventListener != "undefined")
		document.body.addEventListener("click", menu_hide, false);
	else if(typeof document.body.attachEvent != "undefined")
		document.body.attachEvent("onclick", menu_hide);
}

function menu_hover( )
{
	var menu_parent = this.parentNode;
	var offset_left = this.offsetLeft;
	var offset_top = this.offsetTop;
	var offset_parent = this.offsetParent;
	while(offset_parent.tagName.toLowerCase( ) != "html" && offset_parent.tagName.toLowerCase( ) != "body")
	{
		offset_left += offset_parent.offsetLeft;
		offset_top += offset_parent.offsetTop;
		offset_parent = offset_parent.offsetParent;
	}
	for(var i=0; i<menu_parent.childNodes.length; i++) if(menu_parent.childNodes[i] != this && menu_parent.childNodes[i].nodeType == 1 && menu_css_isset("menu_selected", menu_parent.childNodes[i])) 
	{
		menu_css_unset("menu_selected", menu_parent.childNodes[i]);
		if(menu_parent.childNodes.length) for(var j=0; j<menu_parent.childNodes[i].childNodes.length; j++)
		{
			if(menu_parent.childNodes[i].childNodes[j].nodeType == 1 && menu_parent.childNodes[i].childNodes[j].nodeName.toLowerCase( ) == "ul")
			{
				menu_parent.childNodes[i].childNodes[j].style.display = "none";
				menu_parent.childNodes[i].childNodes[j].style.visibility = "hidden";
				j = menu_parent.childNodes[i].childNodes[j].length;
			}
		}
	}
	if(this.childNodes.length) for(var i=0; i<this.childNodes.length; i++)
	{
		if(this.childNodes[i].nodeType == 1 && this.childNodes[i].nodeName.toLowerCase( ) == "ul")
		{
			this.childNodes[i].style.display = "block";
			menu_css_set("menu_selected", this);
			if(menu_cfg["position"] == "bottom")
			{
				this.childNodes[i].style.top = (offset_top + this.offsetHeight) + "px";
				if(offset_left + this.childNodes[i].offsetWidth > document.body.clientWidth) 
					this.childNodes[i].style.left = (document.body.clientWidth - this.childNodes[i].offsetWidth) + "px";
				else this.childNodes[i].style.left = offset_left + "px";
			}
			else if(menu_cfg["position"] == "right")
			{
				if(offset_top + this.childNodes[i].offsetHeight > document.body.clientHeight)
					this.childNodes[i].style.top = (document.body.clientHeight - this.childNodes[i].offsetHeight) + "px";
				else this.childNodes[i].style.top = offset_top + "px";
				this.childNodes[i].style.left = (offset_left + this.offsetWidth) + "px";
			}
			this.childNodes[i].style.visibility = "visible";
			i = this.childNodes.length;
		}
	}
}

function submenu_hover( )
{
	var menu_parent = this.parentNode;
	var offset_top = this.offsetTop;
	var offset_left = this.offsetLeft;
	var offset_parent = this.offsetParent;
	var availWidth = document.body.clientWidth;
	var availHeight = document.body.clientHeight;
	while(offset_parent.tagName.toLowerCase( ) != "html" && offset_parent.tagName.toLowerCase( ) != "body")
	{
		offset_top += offset_parent.offsetTop;
		offset_left += offset_parent.offsetLeft;
		offset_parent = offset_parent.offsetParent;
	}

	for(var i=0; i<menu_parent.childNodes.length; i++) if(menu_parent.childNodes[i] != this && menu_parent.childNodes[i].nodeType == 1 && menu_css_isset("menu_selected", menu_parent.childNodes[i])) 
	{
		menu_css_unset("menu_selected", menu_parent.childNodes[i]);
		if(menu_parent.childNodes.length) for(var j=0; j<menu_parent.childNodes[i].childNodes.length; j++)
		{
			if(menu_parent.childNodes[i].childNodes[j].nodeType == 1 && menu_parent.childNodes[i].childNodes[j].nodeName.toLowerCase( ) == "ul")
			{
				menu_parent.childNodes[i].childNodes[j].style.display = "none";
				menu_parent.childNodes[i].childNodes[j].style.visibility = "hidden";
				j = menu_parent.childNodes[i].childNodes[j].length;
			}
		}
	}
	if(this.childNodes.length) for(var i=0; i<this.childNodes.length; i++)
	{
		
		if(this.childNodes[i].nodeType == 1 && this.childNodes[i].nodeName.toLowerCase( ) == "ul")
		{
			this.childNodes[i].style.display = "block";
			menu_css_set("menu_selected", this);
			if(offset_top + this.offsetHeight + this.childNodes[i].offsetHeight > availHeight)
				this.childNodes[i].style.top = (this.offsetParent.offsetHeight - this.childNodes[i].offsetHeight) + "px";
			else this.childNodes[i].style.top = this.offsetTop + "px";
			if(offset_left + this.offsetWidth + this.childNodes[i].offsetWidth > availWidth)
				this.childNodes[i].style.left = "-" + this.childNodes[i].offsetWidth + "px";
			else this.childNodes[i].style.left = (this.offsetLeft + this.offsetWidth) + "px";
			this.childNodes[i].style.visibility = "visible";
			i = this.childNodes.length;
		}
	}
}

function menu_hide( )
{
	var menu_list = menu.getElementsByTagName("UL");
	var menu_parent = menu;
	for(var i=0; i<menu_list.length; i++)
	{
		menu_list[i].style.display = "block";
		menu_list[i].style.visibility = "hidden";
		for(var j=0; j<menu_list[i].childNodes.length; j++) if(menu_list[i].childNodes[j].hasChildNodes( ) && menu_list[i].childNodes[j].firstChild.nodeName.toLowerCase( ) == "a" && menu_css_isset("menu_selected", menu_list[i].childNodes[j]))
			menu_css_unset("menu_selected", menu_list[i].childNodes[j]);
	}
	for(var i=0; i<menu_parent.childNodes.length; i++) if(menu_parent.childNodes[i] != this && menu_parent.childNodes[i].nodeType == 1 && menu_css_isset("menu_selected", menu_parent.childNodes[i])) 
	{
		menu_css_unset("menu_selected", menu_parent.childNodes[i]);
		if(menu_parent.childNodes.length) for(var j=0; j<menu_parent.childNodes[i].childNodes.length; j++)
		{
			if(menu_parent.childNodes[i].childNodes[j].nodeType == 1 && menu_parent.childNodes[i].childNodes[j].nodeName.toLowerCase( ) == "ul")
			{
				menu_parent.childNodes[i].childNodes[j].style.display = "none";
				menu_parent.childNodes[i].childNodes[j].style.visibility = "hidden";
				j = menu_parent.childNodes[i].childNodes[j].length;
			}
		}
	}
}

function menu_css_isset(css_class, css_element)
{
	if(typeof css_element == "string")
		css_element = document.getElementById(css_element);
	if(css_element && css_class)
	{
		var css_current = css_element.className.split(" ");
		css_class = css_class.toLowerCase( );
		for(var i=0; i<css_current.length; i++) if(css_current[i].toLowerCase( ) == css_class)
			return true;
	}
	return false;
}

function menu_css_set(css_class, css_element)
{
	if(typeof css_element == "string")
		css_element = document.getElementById(css_element);
	if(css_element && css_class)
	{
		var css_current = css_element.className.split(" ").sort( );
		var css_isset = false;
		for(var i=0; i<css_current.length; i++)
		{
			if(!css_current[i] || (i > 0 && css_current[i].toLowerCase( ) == css_current[i-1].toLowerCase( )))
			{
				css_current.splice(i, 1);
				i--;
			}
			else if(css_current[i].toLowerCase( ) == css_class.toLowerCase( ))
				css_isset = true;
		}
		if(!css_isset)
			css_current.push(css_class);
		css_current.sort( );
		css_element.className = css_current.join(" "); 
	}
}

function menu_css_unset(css_class, css_element)
{
	if(typeof css_element == "string")
		css_element = document.getElementById(css_element);
	if(css_element && css_class)
	{
		var css_current = css_element.className.split(" ");
		var css_isset = false;
		for(var i=0; i<css_current.length; i++)
		{
			if(!css_current[i] || (i > 0 && css_current[i].toLowerCase( ) == css_current[i-1].toLowerCase( )) || css_current[i].toLowerCase( ) == css_class.toLowerCase( ))
			{
				css_current.splice(i, 1);
				i--;
			}
		}
		css_element.className = css_current.join(" "); 
	}
}

if(typeof self.addEventListener != "undefined")
	self.addEventListener("load", menu_load, false);
else if(typeof self.attachEvent != "undefined")
	self.attachEvent("onload", menu_load);
