over_level2_state	= false;
over_level1_object	= false;
over_timeout		= false;
timeout_value		= 1300;

class_level1        = "level1";
class_level2        = "topmenu_level2";
class_active		= "_active";

function init_menu()
{
	td = document.getElementById("menu"); 
	levels = td.getElementsByTagName("a");

	for (i=0; i < levels.length; i++)
	{                  
		if(levels[i].className == class_level1) 
		{
			levels[i].onmouseover	= show_level2;
			levels[i].onmouseout	= hide_level2;
		
			levels2 = levels[i].parentNode.getElementsByTagName("div");

			if (levels2[0])
			{
				display(levels2[0]);
			 	levels2[0].style.width = levels[i].parentNode.offsetWidth;
				display(levels2[0]);
				levels2[0].onmouseover	= show_level2;
				levels2[0].onmouseout	= hide_level2;
				levels2[0].style.left = levels[i].parentNode.offsetLeft;
			}
		}
	}  

	d = document.getElementById("objects");
	if (d) d.style.display = 'block';
}

function resize_menu(level1)
{
	levels2 = level1.parentNode.getElementsByTagName("div");
	if (levels2[0])
	{            
		levels2[0].style.width = level1.parentNode.offsetWidth;
		levels2[0].style.left = level1.parentNode.offsetLeft;
	}
}

function display_level2(level1)
{
	level2 = level1.parentNode.getElementsByTagName("div");
	if (level2[0]) display(level2[0]);
}

/*
	При наведении на любой уровень удаляет удаление по timeout
	При наведении на первый уровень показывает меню второго уровня
*/
function show_level2()
{
/* debug("show_level2 -> "+this.className); */
	erase_timeout();
	over_level2_state = true;		
	
	if (this.className != class_level1)
		return;
	
	if(over_level1_object == this)
		return;

    if (over_level1_object) 
    {
    	state_level(over_level1_object, 0);
    	display_level2(over_level1_object);
    }

    over_level1_object = this;
    state_level(over_level1_object, 1);    
    display_level2(over_level1_object);
    resize_menu(over_level1_object);
	over_level2_state = true;
}

function hide_level2()
{            
	erase_timeout();
	over_level2_state = false;
    over_timeout = window.setTimeout("hide_level2_timeout();", timeout_value); 
}

function hide_level2_timeout()
{
/* debug("hide_level2_timeout -> overstate="+over_level2_state); */
    if(over_level2_state)
		return;
	if(over_level1_object)
	{
		state_level(over_level1_object, 0);
		display_level2(over_level1_object);
		over_level1_object = false;
	}
}

function erase_timeout()
{
/* debug("erase_timeout -> over_timeout="+over_timeout); */
	if(over_timeout) 
		window.clearTimeout(over_timeout);
	over_timeout = false;
}

/*
	Добавляет к имени класса постфикс state_level в зависимости от параметра state
	Это необходимо для выделения пункта меню с активным меню следующего уровня
*/
function state_level(lev, state)
{
	if(!lev) return;

	if(state)
		lev.className = class_level1+class_active;
	else
		lev.className = class_level1;
}

/*
	Вспомогательная функция
	Позволяет корректно определить положение блока на экране
	по родителю
*/
function getElementPosition (offsetTrail)
{
  var offsetLeft = 0;
  var offsetTop = 0;
  while (offsetTrail) {
    offsetLeft += offsetTrail.offsetLeft;
    offsetTop += offsetTrail.offsetTop;
    offsetTrail = offsetTrail.offsetParent;
  }

  return {left:offsetLeft, top:offsetTop};
}


/*
	Вспомогатльная функция
	Задает способ скрывания и показывания блоков
	Переводит блок в противоположное состояние
*/
function display(object)
{
	class_hide = '_hide';

	reg_exp		= new RegExp(class_hide+"$");
	class_name 	= object.className;

	if(reg_exp.test(class_name))
		object.className = class_name.replace(reg_exp, '');
	else
		object.className = object.className+class_hide;
}

