var lastMenuId = 0;
var clbId = 0;
var timer;
var mSheets = new Array();
var mCallbacks = {};
var currZ = 100;
var mReady = false;
var mLeftPos = 326;

function MenuLink(textVal, linkVal, subVal, target){
	this.text = textVal;
	this.action = linkVal;
	this.submenu = subVal;
	this.target = target || '_self';
}

function menuHideAll(){
	for (var c = 0; c < mSheets.length; c++)
	{
		if (mSheets[c])
		{
			mSheets[c].hide();
		}
	}
}

function menuHideTimerSet(){
	timer = window.setTimeout(menuHideAll, 100);
}

function menuHideTimerReset(){
	if (timer) window.clearTimeout(timer);
}

function menuAddLink(textVal, linkVal, target){
	this.links[this.links.length] = new MenuLink(textVal, linkVal, null, target);
}

function menuAddSubmenu(textVal, linkVal, target){
	this.links[this.links.length] = new MenuLink(textVal, linkVal, new MenuSheet(this), target);
}

function menuShow(leftVal, topVal, obj)
{
	var theWidth = 0;

	if (document.documentElement && document.documentElement.clientWidth)
	{
		theWidth = document.documentElement.clientWidth;
	}
	else if (document.body)
	{
		theWidth = document.body.clientWidth;
	}
	else if (window.innerWidth)
	{
		theWidth = window.innerWidth;
	}

	this.block.style.visibility = "hidden";
	this.block.style.display = "block";

	if (0 < this.block.offsetWidth && leftVal + this.block.offsetWidth > theWidth)
	{
		if (this.parent)
		{
			leftVal = leftVal - obj.offsetWidth - this.block.offsetWidth;
		}
		else
		{
			leftVal = leftVal + theWidth - (this.block.offsetWidth + leftVal)
		}
	}

	this.block.style.left = leftVal + "px";
	this.block.style.top = topVal + "px";
	this.block.style.visibility = "visible";
	this.block.style.display = "block";

	hideShowCovered ( this.block, false );

}

function menuHide(){
	this.hideCh();

	if(this.block.style.display!="none")
	{
		this.block.style.display = "none";
		hideShowCovered ( this.block, true );
	}

}

function menuFlip(leftVal, topVal){
	var disp = this.block.style.display;
	if (disp == "none") this.show(leftVal, topVal);
	else this.hide();
}

function menuHideCh(){
	for (var c = 0; c < this.links.length; c++){
		curLink = this.links[c];
		if (curLink.submenu) curLink.submenu.hide();
	}
}

function menuCreate(path){
	var res = "<div class=\"menu-sh\" onmouseout=\"menuHideTimerSet()\" onmouseover=\"menuHideTimerReset()\"><table cellpadding=\"0\" cellspacing=\"0\" class=\"flyout\">";
	var curLink;
	var newPath;
	if (path == null) path = "mSheets[" + this.id + "]";
	for (var c = 0; c < this.links.length; c++){
		curLink = this.links[c];
		res += "<tr><td class=\"blk-menu-sh";
		if (curLink.submenu) res += " blk-menu-arr";
		res += "\" onmouseover=\"if(mReady)setClass(this, 'blk-menu-sh-act";
		if (curLink.submenu) res += " blk-menu-arr-act";
		res += "'); ";
		res += path + ".hideCh();";
		if (curLink.submenu){
			newPath = path + ".links[" + c + "].submenu";
			res += "; " + newPath + ".show(getLeftPos(this) + this.offsetWidth, getTopPos(this) - 0, this)";
			curLink.submenu.create(newPath);
		}
		res += "\" onmouseout=\"if(mReady)setClass(this, 'blk-menu-sh";
		if (curLink.submenu) res += " blk-menu-arr";

		switch (typeof curLink.action)
		{
			case 'function':
				mCallbacks[clbId] = curLink.action;
				res += "')\" onclick=\"mSheets[" + this.id + "].hide(); mCallbacks[" + clbId++ + "](); window['onMenuClick']();\" nowrap=\"nowrap\">"
				break;
			case 'string':
			default:
				var tStr = curLink.action.replace(/'/g, "\\'");
				res += "')\" onclick=\"mReady=false; gotoURL('" + tStr + "', '" + curLink.target + "', window['onMenuClick']);\" nowrap=\"nowrap\">"
				break;
		}

		res += curLink.text + "</td></tr>";
	}
	res += "</table></div>";
	this.block.innerHTML = res;
	//this.block.style.filter = "progid:DXImageTransform.Microsoft.Alpha(opacity=90)";
}

function MenuSheet(parentObj, className){
	this.links = new Array();
	this.addLink = menuAddLink;
	this.addSubmenu = menuAddSubmenu;
	this.create = menuCreate;
	this.show = menuShow;
	this.hide = menuHide;
	this.flip = menuFlip;
	this.hideCh = menuHideCh;
	this.id = lastMenuId;
	lastMenuId++;
	this.parent = parentObj;
	this.block = document.createElement("DIV");
	this.block.className = className ? className : "blk-menu";
	this.block.style.position = "absolute";
	this.block.style.display = "none";
	this.block.style.zIndex = currZ;
	currZ++;
	this.block.id = "ms" + this.id;
	document.body.appendChild(this.block);
}

function showMenu(objVal, numVal){
	if (mReady){
		menuHideAll();
		objVal.className = "item act";
		mSheets[numVal].show( getLeftPos( objVal ), getTopPos(objVal) + 18, objVal);

		//hideShowCovered ( mSheets[numVal].block, false );
		menuHideTimerReset();
	}
}

function hideMenu(objVal, numVal){
	if (mReady){
		menuHideTimerSet();
		objVal.className = "item";
	}
}


function getVisib(obj){
	var value = obj.style.visibility;
	if (!value) {
		if (obj.currentStyle) { // IE
			value = obj.currentStyle.visibility;
		} else
			value = '';
	}
	return value;
}

function getAbsolutePos ( el )
{
	var is_div;
	var r = { 'x':0, 'y':0 };
	obj = el;
	while( obj )
	{
		is_div = /^div$/i.test(obj.tagName);
		r.x = r.x + (obj.offsetLeft - ( (is_div && obj.scrollLeft)? obj.scrollLeft:0 ));
		r.y = r.y + (obj.offsetTop - ( (is_div && obj.scrollTop)? obj.scrollTop:0));
		obj = obj.offsetParent;
	}
	return r;
}

var elements = {};
function hideShowCovered ( element, v )
{
	if (!is_ie)
	{
		return;
	}

	if ('' + elements[element.id] == 'undefined')
	{
		elements[element.id] = v;
	}
	else if(elements[element.id] == v)
	{
		return;
	}
	elements[element.id] = v;

	var tags = new Array("applet", "iframe", "select");
	var el = element;

	var p 	= getAbsolutePos(el);
	var EX1 = p.x;
	var EX2 = el.offsetWidth + EX1;
	var EY1 = p.y;
	var EY2 = el.offsetHeight + EY1;

	var ar = [];
	var cc = null;

	for (var k = tags.length; k > 0; )
	{
		/*var*/
		var __ar = document.getElementsByTagName(tags[--k]);
		for( var __k = 0; __k< __ar.length;__k++)
		{
			ar[ar.length] = __ar[__k];
		}

		//var cc = null;
	}
		for (var i = ar.length; i > 0;)
		{
			cc = ar[--i];

			p = getAbsolutePos(cc);
			var CX1 = p.x;
			var CX2 = cc.offsetWidth + CX1;
			var CY1 = p.y;
			var CY2 = cc.offsetHeight + CY1;

			//if( ! (  ) )
			//{
				if ( cc.id.match(/iefix/) || ( cc.style.visibility == "hidden" ) || (CX1 > EX2) || (CX2 < EX1) || (CY1 > EY2) || (CY2 < EY1)   )
				{
					if (!cc.__msh_save_visibility)
					{
						cc.__msh_save_visibility = getVisib(cc);
					}
					fl = true;
					if(cc.__v_arr)
					{
						//{mine} "for in" construction is required here
						for(var j in cc.__v_arr)
						{
							if(j!=element.id && cc.__v_arr[j])
							{
								fl = false;
								break;
							}
						}
						cc.__v_arr[element.id] = false;
					}
					if(fl)cc.style.visibility = cc.__msh_save_visibility;
				}
				else
				{
					if (!cc.__msh_save_visibility)
					{
						cc.__msh_save_visibility = getVisib(cc);
					}
					cc.style.visibility = "hidden";
					if(!cc.__v_arr)
						cc.__v_arr = {};
					cc.__v_arr[element.id] = true;
				}
			//}
		}
	//}
}

function initDd(ul, s)
{
	var arr = ul.immediateDescendants();
	for (var i = 0; i < arr.length; i++)
	{
		var a = arr[i].immediateDescendants()[0];
		if (0 < arr[i].getElementsByTagName('li').length)
		{
			s.addSubmenu(a.innerHTML, a.href);
			initDd(arr[i].immediateDescendants()[1], s.links[s.links.length - 1].submenu);
		}
		else
		{
			s.addLink(a.innerHTML, a.href);
		}
	}
}

function stopPropagation(e)
{
	e.stopPropagation();
}

Event.observe(window, 'unload', function() {
	mReady = false;

	if (document.body.addEventListener)
	{
		document.body.addEventListener('mouseover', stopPropagation, true);
		document.body.addEventListener('mouseout', stopPropagation, true);
	}
});

Event.observe(window, 'load', function() {
	if ($('dd_list'))
	{
		var menuItems = $('dd_list').immediateDescendants();

		for (var i = 0; i < menuItems.length; i++)
		{
			mSheets[i] = new MenuSheet();
		}

		for (var i = 0; i < menuItems.length; i++)
		{
			var ul = menuItems[i].immediateDescendants()[1];

			if (ul)
			{
				initDd(ul, mSheets[i]);
			}

			mSheets[i].create();
		}
	}

	mReady = true;
});

function observeMenuItemsClick(menuName)
{
	var lnk, items = document.getElementById(menuName).getElementsByTagName('DIV');

	for (i = 0; i < items.length; i++)
	{
		if (lnk = items[i].getElementsByTagName('A')[0])
		{
			Element.observe(lnk, 'click', window['onMenuClick']);
		}
	}
}

function createMenus()
{

}