function GetCurrentStyle(el, val)
{
  if(el.currentStyle)
    return el.currentStyle[val];
  return document.defaultView.getComputedStyle(el, '')[val];
}
/*
function findPosX(obj)
{
  var curleft = 0;
  while(obj.offsetParent && GetCurrentStyle(obj, 'position')!="absolute")
  {
    curleft+=obj.offsetLeft
    obj=obj.offsetParent;
  }
  return curleft;
}

function findPosY(obj)
{
  var curtop = 0;
  while (obj.offsetParent) // && GetCurrentStyle(obj, 'position')!="absolute"
  {
    curtop+=obj.offsetTop
    obj=obj.offsetParent;
  }
  return curtop;
}
*/
function findPosX(obj){
  var curleft = 0;
  if (obj.offsetParent){
    while (obj.offsetParent){
      curleft += obj.offsetLeft;
      obj = obj.offsetParent;
    }
    if(GetCurrentStyle(obj,'position')=='fixed') //ie, opera
      curleft += obj.offsetLeft;
  }
  return curleft;
}

function findPosY(obj){
  var curtop = 0;
  if (obj.offsetParent){
    while (obj.offsetParent){
      curtop += obj.offsetTop;
      obj = obj.offsetParent;
    }
    if(GetCurrentStyle(obj,'position')=='fixed') //ie, opera
      curtop+=obj.offsetTop;
  }
  return curtop;
}

var outnode=[];
var outtime;
function HideProc(n)
{
  n=n.smenu;
  outnode.push(n);
  if(outtime)
    window.clearTimeout(outtime);
  outtime=window.setTimeout(Hide, 100);
}
function Hide()
{
  if(outtime)
    window.clearTimeout(outtime);
  outtime=0;
  for(var i=0; i<outnode.length; ++i)
  {
    for(var pn=outnode[i]; pn; pn=pn.sm ? pn.sm : pn.parentNode)
    {
      if(TestClass(pn, "men"))
        pn.style.display="none";
    }
    outnode=[];
  }
}

function Show(node)
{
  var par=node.sm;

  node.style.display="block";
  if(par.className=="rmenu"  || par.className=="lmenu")
  {
    var yoffs=(findPosY(par)-par.offsetTop)-(findPosY(node)-node.offsetTop);
    if(par.className=="rmenu")
      node.style.left=(findPosX(par)+par.offsetWidth-1)+"px";
    else
      node.style.left=(findPosX(par)-node.offsetWidth+1)+"px";
    node.style.top=(par.offsetTop+yoffs)+"px";
  }
  else
  {
    node.style.left=findPosX(par)+"px";  //    node.style.right=(document.body.offsetWidth-findPosX(par)-par.offsetWidth)+"px";
    node.style.top=(findPosY(par)+par.offsetHeight)+"px";
  }
}

function ShowProc(n)
{
  Hide();
  var par=n;
  var node=par.smenu;
  if(!node)
    return false;

  var sq=[];
  for(var pn=node; pn; pn=pn.sm ? pn.sm : pn.parentNode)
  {
    if(TestClass(pn, "men"))
      sq.push(pn);
  }
  for(var i=sq.length-1; i>=0; --i)
    Show(sq[i]);
}

function RemoveClass(e, c)
{
  var re=new RegExp(c+' *');
  e.className=e.className.replace(re, "");
}
function AddClass(e, c)
{
  e.className+=" "+c;
}
function TestClass(e, c)
{
  var re=new RegExp('\\b'+c+'\\b');
  return (e && e.className && e.className.match(re));
}

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)"))
    {
      var zz=it.childNodes;
      for(j=0;j<zz.length;++j)
      {
        var node=zz[j];
        if(TestClass(node, "men"))
        {
          node.sm=it;
          it.smenu=node;
          it.removeChild(node);
          document.body.appendChild(node);

//          node.style.position='absolute';
//          node.style.top=0;
//          node.style.display='block';
          break;
        }
      }
      it.onmouseover=function()
      {
        ShowProc(this);
      }
      it.onmouseout=function()
      {
        HideProc(this);
      }

      node.onmouseover=function()
      {
        ShowProc(this.sm);
      }
      node.onmouseout=function()
      {
        HideProc(this.sm);
      }
    }
  }

  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());
});

