function Show(menu)
{
  var men=menu.ChildMen;
  if(!men)
    return;

  var mpos=GetPosition(menu);
  men.style.display="block";
  if(TestClass(menu, "(rmenu|lmenu)"))
  {
    var yoffs=(mpos.y-menu.offsetTop)-(GetPosition(men).y-men.offsetTop);
    if(TestClass(menu, "rmenu"))
      men.style.left=(mpos.x+menu.offsetWidth)+"px";
    else
      men.style.left=(mpos.x-men.offsetWidth)+"px";

    if(TestClass(menu, "up"))
      men.style.top=(menu.offsetTop+yoffs-men.offsetHeight+menu.offsetHeight)+"px";
    else
      men.style.top=(menu.offsetTop+yoffs)+"px";
  }
  else
  {
    men.style.left=(mpos.x+(menu.offsetWidth-men.offsetWidth)/2)+"px";
    if(TestClass(menu, "dmenu"))
      men.style.top=(mpos.y+menu.offsetHeight)+"px";
    else
      men.style.top=(mpos.y-men.offsetHeight)+"px";
  }
  AddClass(menu, "mopen");
}
function Hide(menu)
{
  RemoveClass(menu, "mopen");
  var men=menu.ChildMen;
  if(!men)
    return;
  men.style.display="none";
}

var curel;
function HideCurrent(n)
{
  if(!curel)
    return;

  for(var pn=n; pn; pn=pn.ParentMenu ? pn.ParentMenu : pn.parentNode)
    if(pn.ChildMen)
      pn.Show=1;

  for(var pn=curel; pn; pn=pn.ParentMenu ? pn.ParentMenu : pn.parentNode)
    if(pn.ChildMen && !pn.Show)
      Hide(pn);

  for(var pn=n; pn; pn=pn.ParentMenu ? pn.ParentMenu : pn.parentNode)
    if(pn.ChildMen)
      pn.Show=0;
}

var timeout;
function SetCurrent(n)
{
  if(timeout)
    window.clearTimeout(timeout);
  timeout=window.setTimeout(function()
  {
    timeout=0;
    if(n==curel)
      return;

    HideCurrent(n);
    curel=n;
    if(!n)
      return;
    for(var pn=n; pn; pn=pn.ParentMenu ? pn.ParentMenu : pn.parentNode)
      if(pn.ChildMen)
        Show(pn);
  }, n ? 1 : 100);
}

AttachEvent(window, 'load', function()
{
  var all=document.getElementsByTagName("body")[0].getElementsByTagName("*");
  for(var i=0; i<all.length; ++i)
  {
    var it=all[i];
    if(TestClass(it, "menu"))
    {
      it.onclick=function(e)
      {
        if(!e)
          e=window.event;

        var src=e.srcElement ? e.srcElement : e.target;
        while(src && src!=this)
        {
          if(TestClass(src, "men") || src.tagName=='A')
            return true;
          src=src.parentNode;
        }

        var mei;
        for(var i=0; i<this.childNodes.length; ++i)
        {
          var it=this.childNodes[i];
          if(TestClass(it, "mei"))
            mei=it;
          if(TestClass(it, "men"))
            if(it.style.display=='' || it.style.display=='none')
            {
              it.style.display="block";
              AddClass(mei, "mopen");
            }
            else
            {
              it.style.display="none";
              RemoveClass(mei, "mopen");
            }
        }
        e.cancelBubble=true;
        return false;
      }
    }
    if(TestClass(it, "mei"))
    {
      it.onmouseover=function(e)
      {
        AddClass(this, "mhover");
      }
      it.onmouseout=function(e)
      {
        RemoveClass(this, "mhover");
      }
    }




    if(TestClass(it, "(rmenu|lmenu|dmenu|umenu)"))
    {
      var zz=it.childNodes;
      for(j=0;j<zz.length;++j)
      {
        var node=zz[j];
        if(TestClass(node, "men"))
        {
          node.ParentMenu=it;
          it.ChildMen=node;
          it.removeChild(node);
          document.body.appendChild(node);
          break;
        }
      }
    }
  }

  var curel=document.getElementById('curel');
  for(var ns=curel; ns; ns=ns.nextSibling)
  {
    if(TestClass(ns, "men"))
    {
      ns.style.display="block";
      AddClass(curel, 'mopen');
      break;
    }
  }

  while(curel)
  {
    if(TestClass(curel, "men") && TestClass(curel.parentNode, "menu"))
    {
      curel.style.display="block";
      for(var n=curel.previousSibling; n; n=n.previousSibling)
        if(TestClass(n, "mei"))
          AddClass(n, 'mopen');
    }
    curel=curel.parentNode;
  }

});

AttachEvent(document, 'click', function()
{
//  while(HideProc());
});


function CheckMouse(e)
{
  for(var n=e.target; n; n=n.parentNode)
  {
    if(TestClass(n, "mei"))
    {
      SetCurrent(e.type=='mouseover' ? n : 0);
      return;
    }
//if(e.type=='mouseover')
//  alert(n.tagName+" "+n.className+" "+n.ChildMen);
    var menu=n.ChildMen ? n : n.ParentMenu;
    if(menu)
    {
      each(menu.childNodes, function(z)
      {
        if(z.className=='mei')
        {
          SetCurrent(e.type=='mouseover' ? z : 0);
        }
      });
      return;
    }
  }
}

AttachEvent(document, 'mouseover', CheckMouse);
AttachEvent(document, 'mouseout', CheckMouse);

