function menu(id) {
this.topNode; this.mTrg; this.lastFlyout;
  this.catchEvent=function(event){
  var eT, cObj, pObj, f, t, isTrigger;
  eT=event.type;
    if(window.event) {
    cObj=event.srcElement; f=event.fromElement; t=event.toElement;
    }
    else{
    if(eT=="mouseover"){f=event.relatedTarget;t=event.target;}
    if(eT=="mouseout"){f=event.target;t=event.relatedTarget;}
    cObj=event.target;
    if(cObj.nodeType!=cObj.ELEMENT_NODE) cObj=cObj.parentNode;
    }
    switch(eT){
      case('mouseover'):
        if(this.getSubMenu(cObj)!=this.topNode.lastParent && cObj.nodeName=="A"){
        pObj=cObj.parentNode;
          if(cObj.className==""&&pObj.className=="menubutton"){
          this.mclose();
          this.setAT(this.mTrg,"first trigger");
          }
          if(this.aTrig&&cObj.parentNode==this.getSubMenu(this.aTrig)){
          this.setAT(this.aTrig,"flyout trigger");
          }
          if(this.isTrg(cObj)){
          isTrigger=true;
          pObj=cObj.parentNode.parentNode;
          }
          if(pObj.active&&pObj.active.flyout){
          this.setCN(pObj.active.flyout,'inactive');
          pObj.active.flyout.state='closed';
          if(this.aTrig) this.setAT(this.aTrig,"trigger");
          }
        if(isTrigger){
          if(t!=cObj.parentNode){
          cObj.flyout=this.getSubMenu(cObj);
            if(cObj.className.indexOf("first")==-1){
            this.aTrig=cObj;
            }
            else{
              if(this.topNode.lastMenu!=cObj){
              if(this.mTrg) this.setAT(this.mTrg,"first trigger");
              this.mTrg=cObj;
              }
            this.setAT(cObj,"topflyout first trigger");
            this.topNode.lastMenu=cObj;
            }
          this.setCN(cObj.flyout,"active");
          cObj.flyout.state='open';
  		    if(cObj.flyout.className.indexOf('submenu')!=-1) this.lastFlyout = cObj.flyout;
  		    this.topNode.lastActive=cObj.flyout;
          }
        }
        pObj.active=cObj;
        this.topNode.lastParent=pObj;
        this.topNode.lastNode=cObj;
        }
        if(cObj.className.indexOf("topflyout")!=-1&&this.topNode.lastActive){
          if(this.topNode.lastActive.state){
          if(this.lastFlyout) this.setCN(this.lastFlyout,"inactive");
	        } 
        }
      break;
      case('mouseout'):
      this.check(cObj,t,f);
      break;
      } 
   }
   
  this.check=function(cur,t,frm){
		if(((t==this.topNode) && (cur!=this.topNode)) || (!containsNode(this.topNode,t)))
		this.mclose();
  }
  
  this.mclose=function(){
  var o=this.topNode.lastParent;
    if(o){
      while(o.active){
      if(this.isTrg(o.active)) this.setCN(this.getSubMenu(o.active),'inactive');
      o.active==null;
      o=o.parentNode.parentNode;
      }
    } 
	  if(String(this.mTrg)!='undefined') this.setAT(this.mTrg,"first trigger");
		this.topNode.lastParent=null;
    this.topNode.lastNode=null;
  }
  
  this.getSubMenu=function(n){
  if(n.nextSibling && n.nextSibling.nextSibling)return(n.nextSibling.nextSibling);
  }
  
  this.isTrg=function(n){
  if(n.className.indexOf("trigger")!=-1) return true;  
  }
 
  this.setCN=function(n,cls){
  if(n.className.indexOf('submenu')==-1) n.className=cls+" menu";
  else n.className=cls+" submenu";
  } 
 
  this.setAT=function(n,cls){
  if(n.className.indexOf("nalink")!=-1) cls = "nalink "+cls;
  n.className=cls;
  }

  function init(p,o){
  p.topNode=o;
  p.topNode.menu = p;
  o.onmouseover = o.onmouseout = function(e){ if(typeof window.event != 'undefined') var e = window.event; this.menu.catchEvent(e)};
  } 

  function setUnload(o){
    if(window.onunload){
	  var tmp = window.onunload;
	  window.onunload = function() {
	    o=null;
		tmp();
      }
	}else{
	  window.onunload = function(){
	    o=null;
	  }
	}  
  }	

  if (document.getElementById(id) && (!document.getElementById(id).className || (document.getElementById(id).className && document.getElementById(id).className.indexOf('disabled')==-1)) ) {
    // init only if nav container exists and class is not "disabled".
    init(this,document.getElementById(id));
    setUnload(this);
  }
  
}

function containsNode(a,b){
  while(b&&(a!=b)&&(b!=null))
   b=b.parentNode;
  return(a==b);
 }
