var MaxLevel=2; //pocet podporovanych urovni, pri pridani je treba modifikovat i TimingName a TimingID
var TimingName=new Array("",""); //obsahuje jmena menu, ktere by se mela zavrit
var TimingID=new Array(0,0); //jsou cisla, ktera se pred kazdym zavolani m_timeout() zvysi a tak muzeme v m_timeout() porovnanim s tim jakou hodnotu to melo kdyz se to volalo a jakou to ma ted rict, zda je tento timer opravdu ten posledni
var LockTimer=false; //zajistuje aby se casovana funkce m_timeout() nezacala provadet uprostred jine, chranene funkce ktera pracuje z promenymy ktere ovlivnuji m_timeout()

var jsDOM0 = (document.all);
var jsDOM1 = (document.getElementById);

function getObj(name)
{
  if (typeof name == "object")
    return name;

  if (jsDOM1)
    return document.getElementById(name);

  if (jsDOM0)
    return eval('document.all.'+name);
  else
   return null;
}

/***************************************************/
function m_over(Menu,Level)
{
	var i; //promena cyklu

  LockTimer=true;


  for(i=0;i<MaxLevel;i++)
  {
  	if (getObj(TimingName[i])!=null)
    {
      if (TimingName[i]!=Menu[i])
      { //jeste je videt jine menu
		    getObj(TimingName[i]).style.display='none'; //schovame to jine menu co jeste bylo videt
		  }
	  }
	  TimingName[i]=""; //znemoznime akce vsem timerum ktere volaly m_timeout() a jeste neprobehly
	  TimingID[i]++;
	}


  for(i=0;i<=Level;i++)
  {
   	if (getObj(Menu[i])!=null)
   	{
       getObj(Menu[i]).style.display='block';  //zobrazeni menu
    }
	}
  //
	LockTimer=false;

	return true;
}

function m_out(Menu,Level)
{
	var i; //promena cyklu

	LockTimer=true;

  for(i=0;i<=Level;i++)
  {
    TimingID[i]++;
	  setTimeout("m_timeout("+TimingID[i].toString()+","+Level.toString()+")",2000);
	  TimingName[i]=Menu[i];  //nastaveni timeoutu
	}

	LockTimer=false;

	return true;
}

function m_timeout(TID,Level) //V TID je predano jake cislo mel TimingID v dobe volani
{
	while(LockTimer)
    ; //pokud je timer uzamcen, cekame nez se odemkne

	if ((TimingID[Level]==TID) && (TimingName[Level]!=""))
  { //pokud je nyni TimingID stejny jako v dobe volani, vime ze toto volani nebylo zruseno a provedeme prislusne akce
    for(i=0;i<=Level;i++)
    {
     	if (getObj(TimingName[i])!=null)
     	{
         getObj(TimingName[i]).style.display='none';  //schovej menu
      }
    }
	}
}
/********************* wrapery pro level 0 ******************************************/

function m_over_menu(Menu)
{
  MenuArray=new Array(Menu);

  m_over(MenuArray,0);

  return true;
}

function m_out_menu(Menu)
{
  MenuArray=new Array(Menu);

  m_out(MenuArray,0);

  return true;
}

/********************* wrapery pro level 1 ******************************************/

function m_over_submenu(Menu,Submenu)
{
  MenuArray=new Array(Menu,Submenu);

  m_over(MenuArray,1);

  return true;
}

function m_out_submenu(Menu,Submenu)
{
  MenuArray=new Array(Menu,Submenu);

  m_out(MenuArray,1);

  return true;
}
