// Управление выпадающим меню CMS
////document.getElementById("textbox").value += "OnMainMenuMouseOver\r\n";

var _container = null;	// Ссылка на объект выпадающего меню
var _submenu = new Object();	// Ассоциативный массив (список) открытых подменю
var _listmenu = new Array();	// Массив текстовых полей основного меню CMS
var showdelay = 400;	// Интервал времени до появления выпадающего меню
var timeouttimer = null;	// Ссылка на отсчет закрытия или открытия выпадающего окна меню
var _menu = new DropDownList();	// Статичное меню


function InitDropDownMenu()
{
	var maintable = document.getElementById("mainmenutable");
	if (!maintable)
		return;
	var listparagraph = maintable.getElementsByTagName("p");
	for (var i = 0; i < listparagraph.length; i++)
	{
		if (listparagraph[i].className.toLowerCase() == "p_cms_menu")
		{
			_listmenu.push(listparagraph[i]);
			// ... и сразу добавляем обработчики событий
			AddListener("mouseover", listparagraph[i], OnMainMenuMouseOver);
			AddListener("mouseout", listparagraph[i], OnMainMenuMouseOut);
		}
	}
}


//
// Обработчик наведения мыши на текстовое поле меню
function OnMainMenuMouseOver(e)
{
	if (!e)
		e = window.event;
	var target = e.target;
	if (!target)
		target = e.srcElement;
	var level = {};
	var rootelement = GetMenuRootElement(target);
	var rootElementDivision;
	if (rootelement && rootelement.getAttribute("menuid") != null)
		rootElementDivision = _menu.FindMenu(rootelement.getAttribute("menuid"));
	var cellElement = GetSubmenuElement(target);
	var menuitem;
	if (target.getAttribute("menuid") != null)
		menuitem = _menu.FindMenu(target.getAttribute("menuid"), level);
	else
		menuitem = _menu.FindMenu(cellElement.getAttribute("menuid"), level);
	var offsetleft;
	var offsettop;
	// Координаты выпадающего меню 1-го уровня
	if (level.value == 1)
	{
		offsetleft = GetOffsetLeft(target);
		if (offsetleft <= 0)
			offsetleft = e.clientX;
		offsettop = GetOffsetTop(target);
		if (offsettop <= 0)
			offsettop = e.clientY;
		offsettop += target.offsetHeight
	}
	// Координаты выпадающего меню ниже 1-го уровня
	else
	{
		var offsetleft = parseInt(rootelement.style.left) + 210;
		if (offsetleft <= 0)
			offsetleft = e.clientX + 20;
		offsettop = (cellElement) ? GetOffsetTop(cellElement) : GetOffsetTop(target);
		if (offsettop <= 0)
			offsettop = e.clientY - 10;
	}
	
	// При наведении на ссылку в выпадающем меню объектом target является сама ссылка,
	// а не ячейка таблицы.
	if (target.getAttribute("menuid") == null)
		target = cellElement;
	// Обработчик наведения мыши на меню открывает выпадающее меню. Но, если указатель мыши 
	// наведен на основное меню, в отличие от события наведения указателя на пункт 
	// выпадающего меню, действия будут отличаться, что и предусмотрено при обработке
	// значения level.value ниже.
	clearTimeout(timeouttimer);
	timeouttimer = setTimeout(function()
	{
		if (level.value == 1)
			_menu.HideMenu();
		else if (rootElementDivision && menuitem)
			rootElementDivision.HideContainer(false, menuitem.id);
		ShowContainer(target, offsetleft, offsettop);
	}, showdelay);
	// Останавливаем всплытие события
	StopPropagation(e);
}


//
// Обработчик ухода мыши с пункта меню
function OnMainMenuMouseOut(e)
{
	if (!e)
		e = window.event;
	var target = e.target;
	if (!target)
		target = e.srcElement;
	var related = e.relatedTarget;
	if (!related)
		related = e.toElement;
	// Контейнер текстового пункта меню, на который перемещена мышь
	var relatedCell = GetSubmenuElement(related);
	// Объект-контейнер меню (поле меню)
	var menuDivision = GetMenuRootElement(target);
	var currentmenu = _menu.FindMenu(target.getAttribute("menuid"));
	if (!currentmenu)
		return;
	// Если указатель мыши "ушел" с меню, то пытаемся закрыть данное открытое меню.
	// Если указатель ушел на текст внутри ячейки, то есть остался на меню, то
	// обработчик OnMainMenuMouseOver не даст выполнить данные действия.
	clearTimeout(timeouttimer);
	timeouttimer = setTimeout(function()
	{
		currentmenu.HideContainer();
	}, showdelay);
}


//
// Обработчик наведения мыши на открытое выпадающее меню
function OnDropDownMenuMouseOver(e)
{
	clearTimeout(timeouttimer);
	if (!e)
		e = window.event;
	var target = e.target;
	if (!target)
		target = e.srcElement;
	// Объект-контейнер меню (поле меню)
	var menuDivision = GetMenuRootElement(target);
	// Ссылка на меню, отвечающего за открытый контейнер
	var currentmenu = _menu.FindMenu(menuDivision.getAttribute("menuid"));
	// Наведение на контейнер обрабатывается только в том случае, если указатель не
	// был наведен на текстовое поле меню, то есть, указатель находится на "открытом"
	// месте контейнера. Закрываем все подменю контейнера.
	if (currentmenu)
		timeouttimer = setTimeout(function()
		{
			currentmenu.HideContainer(false);
		}, showdelay);
}


//
// Обработчик ухода мыши с открытого выпадающего меню
function OnDropDownMenuMouseOut(e)
{
	
	if (!e)
		e = window.event;
	var target = e.target;
	if (!target)
		target = e.srcElement;
	// Обработка событий, при которых указатель мыши уходит с контейнера меню. 
	// В любом случае вызывается функция закрытия всего меню, предположительно, что
	// указатель ушел на документ страницы.
	clearTimeout(timeouttimer);
	timeouttimer = setTimeout(function()
	{
		_menu.HideMenu();
	}, showdelay);
}


//
// Открытие выпадающего меню. Функция назначает обработчики событий:
// наведение указателя мыши, потеря указателя мыши.
function ShowContainer(target, x, y)
{
	var menulinktext = (target.innerText) ? target.innerText : target.text;
	if (!menulinktext)
		menulinktext = target.textContent;
	var container = _menu.GetDropDownMenu(target.getAttribute("menuid"));
	if (!container)
		return;
	container.style.display = "block";
	container.style.left = x + "px";
	container.style.top = y + "px";
	AddListener("mouseout", container, OnDropDownMenuMouseOut);
	AddListener("mouseover", container, OnDropDownMenuMouseOver);
	// Изменяем высоту тени
	var menucontainer;
	var shadow;
	var shadows = container.getElementsByTagName("div");
	for (var i = 0; i < shadows.length; i++)
		if (shadows[i].className.toLowerCase() == "dropdown_shadow")
			shadow = shadows[i];
		else if (shadows[i].className.toLowerCase() == "div_absolute")
			menucontainer = shadows[i];
	if (!shadow || !menucontainer)
		return;
	shadow.style.height = menucontainer.offsetHeight + "px";
}


//
// Функция определяет, является ли искомый объект элементом дерева контейнера
// выпадающего меню (которое в данный момент считается открытым)
function IsInNodeTree(element, container)
{
	try
	{
		while (element.parentNode)
		{
			if (element == container)
				return true;
			element = element.parentNode;
		}
	}
	catch (e) { }
	return false;
}


//
// Функция находит корневой элемент div объекта. У элемента div должны быть 
// следующие свойства:
// class="dropdownmenu_container"
// menuid="id меню"
function GetMenuRootElement(element)
{
	// Настройки безопасности некоторых броузеров, например, Firefox, могут не предоставлять
	// права доступа к элементам вне объекта element.
	try
	{
		while (element.parentNode)
		{
			if (element.tagName.toUpperCase() == "DIV" && element.className == "dropdownmenu_container" && element.getAttribute("menuid"))
				return element;
			element = element.parentNode;
		}
	}
	catch (e) { }
	return null;
}


//
// Функция находит родительский элемент (ячейку таблицы), у которого есть соответствующие 
// атрибуты:
// class="td_dropdown"
// menuid="id меню"
function GetSubmenuElement(element)
{
	try
	{
		while (element.parentNode)
		{
			if (element.tagName.toUpperCase() == "TD" && element.className == "td_dropdown" && element.getAttribute("menuid"))
				return element;
			element = element.parentNode;
		}
	}
	catch (e) { }
	return null;
}
