///////////////////////////////////
// Класс управления деревом меню //
///////////////////////////////////

//
// Конструктор класса DropDownList. Статическое меню.
function DropDownList()
{ 
	this.items = [];
}

//
// Поиск пункта меню по id
DropDownList.prototype.FindMenu = function (menuid, level/* Object: уровень вложенности */)
{
	if (!level)
		level = {};
	level.value = -1;
	function GetSubMenu(subitem, levelvalue)
	{
		if (subitem.id == menuid)
		{
			level.value = levelvalue;
			return subitem;
		}
		for (var i = 0; i < subitem.children.length; i++)
		{
			var menuitem = GetSubMenu(subitem.children[i], levelvalue + 1);
			if (menuitem)
				return menuitem;
		}
		return null;
	}
	
	for (var i = 0; i < this.items.length; i++)
	{
		var menuitem = GetSubMenu(this.items[i], 1);
		if (menuitem)
			return menuitem;
	}
	return null;
}

//
// Добавление пункта меню к корневому или родительскому элементу. Вызывается, обычно,
// из документа при инициализации меню.
DropDownList.prototype.AddMenu = function (
	  strmenu/* String: текстовое значение пункта меню */
	, menuid/* Number: идентификатор пункта меню */
	, parentid/* = 0 Number: идентификатор родительского пункта меню */
	, href/* String */)
{
	if (!parentid)
		parentid = 0;
	var parentItem = null;
	if (parentid > 0)
		parentItem = this.FindMenu(parentid);
	if (parentItem)
		parentItem.children.push(new DropDownMenu(menuid, strmenu, href));
	else if (parentid == 0)
		this.items.push(new DropDownMenu(menuid, strmenu, href));
}

DropDownList.prototype.GetDropDownMenu = function (menuid/* идентификатор пункта меню */)
{
	var menuItem = this.FindMenu(menuid);
	if (!menuItem)
		return;
	if (menuItem.division)
	{
		document.body.removeChild(menuItem.division);
		menuItem.division = null;
	}
	// Если нет дочерних элементов, завершаем работу функции
	if (menuItem.children.length == 0)
		return;
	menuItem.division = document.createElement("div");
	menuItem.division.setAttribute("id", "dropdowncontainer");
	menuItem.division.className = "dropdownmenu_container";
	menuItem.division.setAttribute("menuid", menuid.toString());
	var contents = '<div class="div_relative">'
		+ '<div class="dropdown_shadow"></div>'
		+ '<div class="div_absolute">'
		+ '<table cellpadding="0" cellspacing="1" width="100%" class="table_dropdown_container">'
		+ '<tr>'
			+ '<td class="td_dropdown_container" valign="top">'
			+ '<table cellpadding="0" cellspacing="0" width="100%">'
			+ '</table>'
			+ '</td>'
		+ '</tr>'
		+ '</table>'
		+ '</div>'
	+ '</div>';
	menuItem.division.innerHTML = contents;
	
	// Заполняем выпадающее меню пунктами
	var targetelement = menuItem.division.getElementsByTagName("table")[1];
	if (!targetelement)
		return;
	if (targetelement.getElementsByTagName("tbody").length > 0)
		targetelement = targetelement.getElementsByTagName("tbody")[0];
	for (var i = 0; i < menuItem.children.length; i++)
	{
		var trElement = document.createElement("tr");
		var tdElement = document.createElement("td");
		tdElement.setAttribute("menuid", menuItem.children[i].id.toString());
		tdElement.className = "td_dropdown";
		var linkElement = document.createElement("a");
		linkElement.className = "a_dropdown_menu";
		var linkTextNode = document.createTextNode(menuItem.children[i].name);
		linkElement.setAttribute("href", menuItem.children[i]["href"]);
		linkElement.appendChild(linkTextNode);
		tdElement.appendChild(linkElement);
		trElement.appendChild(tdElement);
		targetelement.appendChild(trElement);
		AddListener("mouseover", tdElement, OnMainMenuMouseOver);
		AddListener("mouseout", tdElement, OnMainMenuMouseOut);
	}
	document.body.appendChild(menuItem.division);
	return menuItem.division;
}

//
// Закрытие меню (полностью)
DropDownList.prototype.HideMenu = function ()
{
	for (var i = 0; i < this.items.length; i++)
		this.items[i].HideContainer();
}


///////////////////////////////////
// Класс управления деревом меню //
///////////////////////////////////

//
// Конструктор класса пункта меню
function DropDownMenu(_id, _name, _href)
{
	this.id = _id;	// Уникальный идентификатор пункта меню
	this.name = _name;	// Строковое значение названия меню
	this.href = _href; // Ссылка
	this.children = [];	// Массив дочерних элементов
	this.division;	// Ссылка на визуализированный объект меню
}

//
// Поиск дочернего меню по id. Находит только элемент меню, который находится ниже уровнем
// в древовидном списке меню.
DropDownMenu.prototype.FindItem = function (menuid)
{
	function GetSubMenuItems(subitems)
	{
		for (var i = 0; i < subitems.length; i++)
		{
			if (subitems[i].id == menuid)
				return subitems[i];
			var menuitem = GetSubMenuItems(subitems[i].children);
			if (menuitem)
				return menuitem;
		}
		return null;
	}
	
	return GetSubMenuItems(this.children);
}

//
// Скрытие выпадающего меню и его дочерних меню. Функция принимает параметры:
// 1: закрыть выпадающее меню, относящееся к вызвавшему ее объекту меню.
// 2: пропустить при закрытии подменю с id равным этому параметру. Используется обычно при 
//    переходе указателя мыши между пунктами меню одного выпадающего меню.
DropDownMenu.prototype.HideContainer = function (closeself/* = true; Boolean: 			*/
	/* требуется закрыть текущий пункт меню (true) или оставить его открытым (false) 	*/
	, exceptid/* Number: не закрывать меню с этим id */)
{
	if (closeself === undefined)
		closeself = true;
	if (exceptid === undefined)
		exceptid = 0;
	function CloseSubMenu(subitem, closeself, exceptid)
	{
		if (subitem.division && closeself === true && exceptid != subitem.id)
		{
			subitem.division.style.display = "none";
			document.body.removeChild(subitem.division);
			subitem.division = null;
		}
		for (var i = 0; i < subitem.children.length; i++)
			CloseSubMenu(subitem.children[i], true, exceptid);
	}
	CloseSubMenu(this, closeself, exceptid);
}
