function dnMenu()
{
	this.cont = null;
	this.hash = null;
	this.CSSMname = null;
	this.CSSPname = null;
	this.CSSitem = 'item';
	this.CSSitemsel = 'itemsel';
	this.CSSitemon = 'itemon';
	this.type = "vertical";
	this.itemsURLs = [];
	this.opened = null;
	this.sep = null;
	this.selected = 0;
}

dnMenu.hideTimer = {};

dnMenu.getBrowser = function()
{
	var nav = navigator.appName;
	switch(nav)
	{
		case 'Microsoft Internet Explorer':
			return "IE";
		case 'Netscape':
			return "NS";
		case 'Opera':
			return "O";
	}
}

//функция сктытия пункта меню
dnMenu.menuHide = function(itemID)
{
	if(typeof dnMenu.hideTimer["menu_" + itemID] != "undefined") 
	{
		clearInterval(dnMenu.hideTimer["menu_" + itemID]);
		dnMenu.hideTimer["menu_" + itemID] = null;
	}
	var item = document.getElementById("menu_" + itemID);
	if(item) 
	{
		item.style.visibility = "hidden";
	}
}

//функция закрытия соседних с пунктом меню
dnMenu.adjacentHide = function(itemID)
{
	dnMenu.parentTable(document.getElementById(itemID)).style.visibility = "hidden";
	var rightNode = document.getElementById("menu_" + itemID.split("_")[1])
	if(rightNode) rightNode.style.visibility = "hidden";
}

//функция закрытия всех открытых подменю
dnMenu.treeHide = function(itemID, end_itemID)
{
	var item = document.getElementById(itemID);
	var parNode = dnMenu.parentTable(item);
	if(parNode.id!="menu_" +  end_itemID)
	{
		parNode.style.visibility = "hidden";
		this.treeHide(parNode.parentNode.id, end_itemID);
	}
	if(typeof dnMenu.hideTimer[item.id] != "undefined") 
	{
		clearInterval(dnMenu.hideTimer[item.id]);
		dnMenu.hideTimer[item.id] = null;
	}
}

//функция определения уровня меню
dnMenu.menuLevel = function(element, end_itemID)
{
	var level = 0;
	while(element.id!="menu_" +  end_itemID)
	{
		if(element.id.indexOf("menu")==0) level++;
		element = element.parentNode;
	}
	return level;
}

//функция определения уровня меню
dnMenu.parentTable = function(element)
{
	return element.parentNode.parentNode.parentNode;
}

//событие показа меню
dnMenu.prototype.evnShow = function(event)
{
	var target = (event.srcElement) ? event.srcElement: event.target;
	var targetNode = target.parentNode;
	var targetPar = dnMenu.parentTable(targetNode);
	var targetData =  targetNode.id.split("_");
	if(targetData[0]=="item")
	{
		if(typeof dnMenu.hideTimer[targetPar.id] != "undefined") 
		{
			clearInterval(dnMenu.hideTimer[targetPar.id]);
			dnMenu.hideTimer[targetPar.id] = null;
		}
	
		if(this.opened) 
		{
			var parOpened = document.getElementById(this.opened.parID).parentNode;
			clearInterval(dnMenu.hideTimer[this.opened.ID]);
			if(dnMenu.parentTable(parOpened).id == targetPar.id) dnMenu.adjacentHide(this.opened.ID);
			if(targetPar.id == "menu_" + dnMenu.cont) dnMenu.treeHide(this.opened.ID, this.cont);
			this.opened = null;
		}

		var level = dnMenu.menuLevel(targetNode, this.cont);
		var item = document.getElementById("menu_" + targetData[1]);
		if(item)
		{
			var nav = dnMenu.getBrowser();
			if(this.type!="vertical" && level==0)
			{
				mLeft = targetNode.offsetLeft;
				mTop = targetNode.offsetHeight;
			}
			else
			{
				mLeft = targetNode.offsetWidth;
				if(nav!="IE") mTop = targetNode.offsetTop + 3; else mTop = 3;
			}

			item.style.left = mLeft;
			item.style.top = mTop;
			item.style.visibility = "visible";
		}
		if(this.CSSitemsel!=null && target.className!=this.CSSitemon) {target.className = this.CSSitemsel;}
	}
}

//союытие скрытия меню
dnMenu.prototype.evnHide = function(event)
{
	var target = (event.srcElement) ? event.srcElement : event.target;
	var targetNode = target.parentNode;
	var targetData =  targetNode.id.split("_");
	if(targetData[0]=="item")
	{
		var targetPar = dnMenu.parentTable(targetNode);
		dnMenu.hideTimer["menu_" + targetData[1]] = setInterval("dnMenu.menuHide('" + targetData[1] + "')", 50);
		if(targetPar.id!="menu_" + this.cont)
		{
			this.opened =  {ID: targetNode.id, parID: targetPar.id};
			dnMenu.hideTimer[targetNode.id] = setInterval("dnMenu.treeHide('" + targetNode.id + "', '" + this.cont + "')" , 50);
		}
		if(this.CSSitem!=null && target.className!=this.CSSitemon) target.className = this.CSSitem;
	}
}

//союытие скрытия меню
dnMenu.prototype.evnClick = function(event)
{
	var target = (event.srcElement) ? event.srcElement.parentNode : event.target.parentNode;
	if(this.itemsURLs[target.id] != null) location.href = this.itemsURLs[target.id];
}

//метод инициализации меню
dnMenu.prototype.Init = function()
{	
	//определяем переменные
	var idArray = [];
	var _this = this;
	
	//функция строит меню из хэша
	var buildMenu = function(hash, parentId)
	{
		var Id;
		var code = "";
		var pm = location.pathname.match(/[a-zA-Z_0-9]+/ig);
		var _class = (parentId == _this.cont) ? _this.CSSMname : _this.CSSPname;
		// считаем кол-во элементов хэша
		var hcount = 0;
		var cm = 0
		for (Id in hash){
			hcount++;
			var mm = hash[Id][1].match(/[a-zA-Z_0-9]+/ig);
			if(!pm && !mm) _this.selected=Id;
			if(_this.cont==parentId && pm && mm){
				var c = 0;
				for(i=0; i<pm.length; i++){
					if(!mm[i]) break;
					if(mm[i]==pm[i]) c++;
				}
				if(c>cm) {cm=c; _this.selected=Id;}
			}
		}

		// строим хэш
		var count = 0;
		for (Id in hash)
		{
			count++;
			//var randId = parseInt(Math.random() * 1e10).toString() + parseInt(Math.random() * 1e10);
			var randId = Id;
			var itemClass=(_this.selected==Id) ? _this.CSSitemon : _this.CSSitem;
			if(parentId==_this.cont && _this.type!="vertical")
			{
				code += "<td id='item_" + randId + "'><div class='"+itemClass+"'>" + hash[Id][0];
				if (typeof hash[Id][2] != "undefined") code+= "\n" + buildMenu(hash[Id][2], randId);
				code += "</div></td>\n";
				if(_this.sep!=null && count != hcount) code += "<td id='sep_" + randId + "'>" + _this.sep + "</td>";	
			}
			else
			{
				code += "<tr><td id='item_" + randId + "'><div class='"+itemClass+"'>" + hash[Id][0];
				if (typeof hash[Id][2] != "undefined") code+= "\n" + buildMenu(hash[Id][2], randId);
				code += "</div></td></tr>\n";
				if(_this.sep!=null && count != hcount) code += "<tr><td id='sep_" + randId + "'>" + _this.sep + "</td></tr>";
			}
			if(hash[Id][1] != null) _this.itemsURLs['item_' + randId] = hash[Id][1];
		}
		if(code.length>0)
		{
			if(parentId==_this.cont && _this.type!="vertical") code = "<tr>\n" + code + "</tr>\n";
			code = "<table border='0' cellpadding='0' cellspacing='0' id='menu_" + parentId + "' class='" + _class + "'>\n" + code + "</table>\n";
		}
		return code;
	}
	
	//проверяем задан ли хеш
	if(this.CSSMname==null || this.CSSPname==null) 
	{
		alert("Ошибка!!! Не заданна таблица стилей...");
		return false;
	}

	//проверяем задан ли хеш
	if(this.hash==null) 
	{
		alert("Ошибка!!! Не задан хеш меню...");
		return false;
	}

	//выводим меню в документ
	if(this.cont==null)
	{
		alert("Ошибка!!! Не задан контейнер...");
		return false;
	}
	
	document.getElementById(this.cont).innerHTML = buildMenu(this.hash, this.cont);

	//Создаем события для меню
	var menu = document.getElementById("menu_" + _this.cont);
	menu.onmouseover = function(event){
		_this.evnShow(event ? event : window.event);
	}
	menu.onmouseout = function(event){
		_this.evnHide(event ? event : window.event);
	}
	menu.onclick = function(event){
		_this.evnClick(event ? event : window.event);
	}
}