/*
Многоуровневое выпадающее меню
SamoVaR, 2007

!для работы надо подключать common.js

*/

function popupmenu()
{
	//---	Устанавливает выпадающее меню 1-го уровня. _mode="down" | "right"
	this.setFirstLevel=function(_parentId, _popupId, _mode)	
	{	
		if( !_mode) _mode="down";
		this._linkNodes(_parentId, _popupId, _parentId, _mode);	
	}
	//---	Устанавливает выпадающее меню последующих уровней. Всегда справа
	this.setOtherLevel=function(_parentId,_popupId, _parentMenuId)
	{
		this._linkNodes(_parentId, _popupId, _parentMenuId, "right");	
	}

	//--- Далее - переменные и служебные ф-ции
	this.showedStack=new Array();	//стек показанных меню
	this.insideMenuFlag=0;	
	this.dontSetIfEqu=0;			
	//---	мы - внутри меню
	this.insideMenu=function(_id)	
	{	
		if( this.dontSetIfEqu!=_id ) this.insideMenuFlag=_id;	
		this.dontSetIfEqu=0;	
	}
	//---	покидаем меню
	this.leaveMenu=function()
	{
		this.insideMenuFlag=0;
		setTimeout("spylogMenuObj.closeMenu()",300);
	}
	//---	закрываем меню
	this.closeMenu=function()	{	this._hideBeforeId(this.insideMenuFlag);	}
	//---	Устанавливаем связь между родительским эл-том и выпадающим меню
	//_parentId - элемент родительского меню
	//_popupId - выпадающее меню
	//_parentMenuId - ID родительского меню. 
	this._linkNodes=function(_parentId, _popupId, _parentMenuId, _mode)
	{
		parentNode=document.getElementById(_parentId);
		popupNode=document.getElementById(_popupId);
		//На всякий случай - устанавливаем необходимые стили
		popupNode.style.display='none';
		popupNode.style.position='absolute';
		//Добавляем обработчики событий к родительскому этементу и к выпадающему меню
		parentNode.onmouseover=function()	{	spylogMenuObj._show(_parentId, _popupId, _parentMenuId, _mode);	}
		parentNode.onmouseout=function()	{	spylogMenuObj.leaveMenu();	}
		popupNode.onmouseover=function()	{	spylogMenuObj.insideMenu(_popupId);	}
		popupNode.onmouseout=function()		{	spylogMenuObj.leaveMenu();	}
	}
	//---	Обработчик события для выпадения меню
	this._show=function(_parentId, _popupId, _parentMenuId, _mode) 
	{
		//Стираем все меню, которые показывались после родителя (возможно просто все меню)
		this._hideBeforeId( _parentMenuId );
		var parentNode=document.getElementById(_parentId);
		//Вычисляем левый нижний угол
        ar=calcLeftCorner(parentNode, true);
        //Показываем выпадающее меню 
        with (document.getElementById(_popupId).style) {
        	if( "down"==_mode ){
				left=ar[0]+"px";
				top=ar[1]+"px";
        	}
        	else {
				left=(ar[0]+parentNode.offsetWidth)+"px";
				top=(ar[1]-parentNode.offsetHeight/2)+"px";
        	}
        	zIndex=this.showedStack.length;
			display='block';
        }
        //Устанавливаем разные служебные переменные
        this.showedStack.push(_popupId);
		spylogMenuObj.insideMenu(_popupId);	
		this.dontSetIfEqu=_parentMenuId;	//Что-б сразу же не перетерлась родителем
	}
	//---	Скрывает все меню, показанные после меню _id (или все)
	this._hideBeforeId=function(_id)
	{
		var id;
		while(id=this.showedStack.pop() ) {
			if( id==_id ) {
				this.showedStack.push(id);
				break;
			}
			document.getElementById(id).style.display="none";
		}
	}
	//---	TODO! надо вынести в отдельный класс или ф-цию
	this.debug=function(_str)
	{
		var l=document.getElementById('log');
		l.innerHTML="&middot; "+_str+"<BR>"+l.innerHTML;
	}
}
var spylogMenuObj= new popupmenu();

