/***********************************************

Выпадающее меню

Для работы меню в body на загрузке инициируем функцию setOnLoad()
Каждый элемент(ссылка) должны быть зыключены в единый блок
Далее для каждого элемента(ссылки), у которого есть выпадающее меню задаем идентификатор указанный в linkName: linkName + X (где X порядковый номер)
А для каждого выпадающего блока идентификатор указанный в subName: subName + X (где Х порядковый номер равный номеру в вызывающам данное подменю идентификаторе)

пример: 
<DIV>
	<A HREF="http://yourLink.ru" id="menuLink1">Link</A>
	<DIV id="subMenu1">
		<A HREF="http://elseLink1.ru">Link1</A>
		<A HREF="http://elseLink2.ru">Link2</A>
	</DIV>
</DIV>

***********************************************/
var hideTime = 300;

var linkName = "menuLink";
var subName = "subMenu";

// инициализация уровней вложенности
var levels = new Array();
levels[1] = new Array(1, 2, 3, 4, 5, 6);
levels[2] = new Array(7, 8, 9, 10, 11, 12);




// порядковый номер элемента меню
var subNum = new Array()
// таймаут на закрытие
var menuHide = new Array();

/****************************************************
 упарвляющие функции
****************************************************/
// управляющий метод. инициация действий всех элементов меню имеющих подменю
function setOnLoad()
{
	var i = 1
	while(getObj(linkName + i))
	{
		getObj(linkName + i).onmouseover = menuOver;
		if(getObj(subName + i)) getObj(linkName + i).onmouseout = menuOut;
		if(getObj(subName + i)) getObj(subName + i).onmouseover = subMenuOver;
		if(getObj(subName + i)) getObj(subName + i).onmouseout = subMenuOut;
		i++;
	}

	for(i = 1; i < levels.length; i++)
	{
		subNum[i] = "";
		menuHide[i] = null;
	}
}

// метод изменения стиля родительского эл-та меню, когда активен его child
function blockStyle(num)
{
	var level = getMenuLevel(num);

// для каждого уровня вложенности создаем свой стиль
	if(level == 1)
	{
		getObj(linkName + num).style.background = "#5D0101";
	}
	if(level == 2)
	{
		getObj(linkName + num).style.background = "#B3AE2E";
	}
}

// метод изменения стиля родительского эл-та меню, когда его child закрывается
function noneStyle(num)
{
	var level = getMenuLevel(num);

// для каждого уровня вложенности создаем свой стиль
	if(level == 1)
	{
		getObj(linkName + num).style.background = "none";
	}
	if(level == 2)
	{
		getObj(linkName + num).style.background = "none";
	}
}

// изменение свойств элементов при наведении и убирании мышки
function menuAct(num, state)
{
	if(!getObj(subName + num))
		return;

	// при наведении
	if(state == "block")
	{
		blockStyle(num);
	}
	// при убирании
	else
	{
		noneStyle(num);
	}
	getObj(subName + num).style.display = state;
}

/****************************************************
 функции-действия
****************************************************/
// действие при наведении мышки на элемент меню
function menuOver()
{
	nowNum = getMenuNum(this.id);
	nowLevel = getMenuLevel(nowNum);

	for(i = nowLevel; i < levels.length; i++)
	{
		clearTimeout(menuHide[i]);
		if(subNum[i])
			menuAct(subNum[i], "none");
	}

	subNum[nowLevel] = getMenuNum(this.id);
	menuAct(subNum[nowLevel], "block");
}

// действие при убирании мышки с элемента меню
function menuOut()
{
	nowNum = getMenuNum(this.id);
	nowLevel = getMenuLevel(nowNum);

	menuHide[nowLevel] = setTimeout("menuAct(" + nowNum + ", 'none')", hideTime);
}

// действие при наведении мышки на блок подменю
function subMenuOver()
{
	nowNum = getMenuNum(this.id);
	nowLevel = getMenuLevel(nowNum);

	clearTimeout(menuHide[nowLevel]);
	subNum[nowLevel] = nowNum;
}

// действие при убирании мышки с блока подменю
function subMenuOut()
{
	nowNum = getMenuNum(this.id);
	nowLevel = getMenuLevel(nowNum);

	clearTimeout(menuHide[nowLevel]);

	menuHide[nowLevel] = setTimeout("menuAct(" + nowNum + ", 'none')", hideTime);
}


/****************************************************
 вспомогательные функции
****************************************************/
// определение объекта по id
function getObj(obj)
{
	return document.getElementById(obj)? document.getElementById(obj): false;
}

// определение порядкового номера активного элемента меню
function getMenuNum(objID)
{	
	var num = "";
	for(i = objID.length; i > 0; --i)
	{
		if(!isNaN(parseInt(objID.charAt(i), 10)))
			num = objID.charAt(i) + num;
	}
//	alert(num);
	return num;
}

// определение уровня вложенности активного элемента меню
function getMenuLevel(menuNum)
{
	for(i = 1; i < levels.length; i++)
	{
		for(j = 0; j < levels[i].length; j++)
		{
			if(levels[i][j] == menuNum)
			{
				return i;
			}
		}
	}
}