//Improved version of JMMenu.js -- 3/8/08 -- Handles missing menu definition arrays.
//By J.M. Almeida -- Using ideas from Peter Belesis; Smith Menus; and various tutorials on object detection,
//                   event handling, etc.
//Assumes menu definition arrays ala Peter Belesis' floating menus; e.g.:
/*
arMenu1 = new Array(        // arMenu1 thru arMenun (n is any integer) define the main menus.
150,    //these lines are ignored ...
"","",
"","",
"","",
"","",  // ... to here.
"Directory","StoreList.asp?type=Bakery",0,
"<b>Cakeworld</b>","./CakeWorld/index.htm",1    //note that the las line ends without a coma (,).
)                                          ^ 1:=has submenu; 0:=no submenu.
...arMenun = new Array(0,0,0,0,0,0,0,0,0,"line1 of last (nth) main menu","link1 of last main menu",0 or 1)
                       ^----ignored----^
arMenu1_2 = new Array("line1 of 1st submenu","link1 of 1st submenu",0 or 1) //this submenu corresponds to the second line of master menu 1, above.
arMenuk_m = new Array(...) submenu of line m in master menu k.
arMenun_m_j_..._p = new Array(...) submenu of line p in submenu m_j... of master menu n. 
*/
var topCount=1;
function Menu(label){
    this.name = label;
    this.type = "Menu";
    this.posx = 0;
    this.posy = 0;
    this.nitems = (!this.nitems)?0:this.nitems;
    this.mnuitems = (!this.mnuitems)?new Array():this.mnuitems;
    this.mnuactions = (!this.mnuactions)?new Array():this.mnuactions;
    this.itemhaschild = (!this.itemhaschild)?new Array():this.itemhaschild;
    this.parentmnu = (label.lastIndexOf("_")>0)?label.slice(0,label.lastIndexOf("_")):null;
    this.activechild = (!this.activechild)?false:this.activechild;
    this.offtimer = (!this.offtimer)?null:this.offtimer;
    if(!window.menus){window.menus=new Array();}
    window.menus[this.name] = this;
    window.menus[window.menus.length] = this;
}   

function accessCSS(layerID){
    if(document.getElementById){
          return document.getElementById(layerID);
    }else if(document.all){
          return document.all[layerID];
    }else if(document.layers){
          return document.layers[layerID];
    }
}
 function GetMenus(){
    topCount=1;
	while(eval(rootmnuarr="window.arMenu" + topCount)) {
        temparr=eval(rootmnuarr);
        temparr=temparr.slice(8);temparr[0]=(temparr.length-1)/3;temparr[temparr.length]=0;
        EachMenu=new Menu("Menu"+topCount);
        EachMenu.nitems=temparr[0];
        for(i=1;i<=EachMenu.nitems;i++){EachMenu.mnuitems[i]=temparr[3*i-2];
            EachMenu.mnuactions[i]=temparr[3*i-1];EachMenu.itemhaschild[i]=temparr[3*i];
        }
        //disp.value+=EachMenu.name+" ready with "+EachMenu.nitems+" lines";
        topCount++;
    }
    for(nm=0;nm<window.menus.length;nm++){
        EachMenu=window.menus[nm];
        for(k=1;k<=EachMenu.nitems;k++){
            if(EachMenu.itemhaschild[k]>0){GetSubMenu(EachMenu,k);}
        }
    }
}
function GetSubMenu(Pmnu,itm){
    kmnu=Pmnu.name+"_"+itm;kidarr="window.ar"+kmnu;
    if(!eval(kidarr)){alert("Missing SubMenu array "+kidarr.slice(9));temparr=Array(1,"<center><font color='gray'><i>Missing SubMenu</i></font></center>","",0,0);}
    else{temparr=eval(kidarr);temparr.splice(0,0,temparr.length/3);temparr[temparr.length]=0;}
    KMenu=new Menu(kmnu);KMenu.nitems=temparr[0];
    for(i=1;i<=KMenu.nitems;i++){
        KMenu.mnuitems[i]=temparr[3*i-2];KMenu.mnuactions[i]=temparr[3*i-1];
        KMenu.itemhaschild[i]=temparr[3*i];
    }
    //disp.value+=KMenu.name+" ready with "+KMenu.nitems+" items";
}
function WriteMenus(){
    for (j=0; j<window.menus.length; j++){
        if(window.menus[j]){Menuj=window.menus[j];}
        else alert("window.menus["+j+"] not defined in WriteMenus()");
        nlines=Menuj.nitems;
        if(nlines > 0){
            divid="el"+Menuj.name;qdivid="'"+divid+"'";
            document.write('<div id="'+divid+'" style="position:absolute; left:0; top:0;" onMouseOut="closeMenu(this,event);//popDown('+qdivid+');">');
            kidi=0;
            for (i=1; i <= nlines; i++){
                var imgsrc='';
                if(Menuj.itemhaschild[i]){KMenuj=window.menus[Menuj.name+"_"+i];KMenuj.parentmnu=Menuj;
                    var imgsrc=' style="background-image:url(tri.gif);background-repeat:no-repeat;background-position:135px 6px;" '}
                document.write('<a href="'+Menuj.mnuactions[i]+'" id="'+Menuj.name+'Line'+i+'" class="mnubox"'+imgsrc+' onMouseOver="ShowActive(event)" onMouseOut="ShowInactive(event)" dispText="'+Menuj.mnuitems[i]+'" linkText="'+Menuj.mnuactions[i]+'">'+Menuj.mnuitems[i]+'</a>');
            }
            document.write('</div>')
        }
    }
}
function closeMenu(frmel,event) {
  //disp.value+="|close?"+frmel.id;
  var current, related;
  if (window.event) {
    current = window.event.fromElement
    related = window.event.toElement;
  }
  else {
    current = event.currentTarget;
    related = event.relatedTarget;
  }
  if(current && related)if ((current == related.parentNode) || contains(frmel, related))return;
    Menuj=window.menus[frmel.id.slice(2)];
    Menuj.offtimer=setTimeout("MenuOff('"+Menuj.name+"')",250);
}
function contains(a, b) {  // Return true if node a contains node b.
  while (b.parentNode){
    if ((b = b.parentNode) == a){
      return true;}
  }
}

function MenuOff(layid){
    //disp.value+="|Mnof.."+layid;
    ShowMenu(layid,"notvis",layid);
}
function ShowMenu(layid,onof,tagid,x,y){
    if(String(layid).indexOf("Menu") != 0){return}
    if(!tagid){tagid=layid}
    var mnusuffix=layid.slice(4,layid.length);
    var mnuj=parseInt(mnusuffix);
    Menuj=window.menus[layid];var nlines=Menuj.nitems;//disp.value+=(onof=="visible")?"on-":"off-"+Menuj.name;
    if((Menuj.activechild) && (onof != "visible")){//disp.value+="|"+layid+" is active";
        if(Menuj.offtimer)clearTimeout(Menuj.offtimer);Menuj.offtimer=setTimeout("MenuOff('"+Menuj.name+"')",250);return}
    if(x || y){lft=x;tp=y;}//disp.value+="|Shm@"+x+","+y;}//if(Menuj.parentmnu){tp=tp+6;lft=lft+27} //-1 was -6, +50 was +150
    else{if(onof == "visible"){
            var itmob=accessCSS(tagid);var tp=y+itmob.offsetTop;var lft=x+itmob.offsetLeft;
            strx=new String(itmob.offsetParent);
            while (strx.indexOf("[object") >= 0) {
                itmob=itmob.offsetParent;
                tp=tp+itmob.offsetTop;lft=lft+itmob.offsetLeft;
                strx=new String(itmob.offsetParent);
            }
        }
    }
    Menuj.posx=lft;Menuj.posy=tp;
    for(i=1; i<=nlines; i++){
        itmob=accessCSS(Menuj.name+"Line"+i);
        if (onof == "visible") {
            itmob.style.left = lft;
            itmob.style.top = tp;
            itmob.style.visibility = "visible";
            tp+=20;
        }
        else {
            itmob.style.visibility = "hidden";
        }
    }
    PMenu=Menuj.parentmnu;if(PMenu){if(onof == "visible")PMenu.activechild=true;else PMenu.activechild=false;}
}
function popUp(elM,e,x,y){
    if(e.target){evsrc=e.target;if(!x)x=e.pageX;if(!y)y=e.pageY;}
    else if(event.srcElement){evsrc=event.srcElement;
        if(!x)x=event.clientX+document.body.scrollLeft+document.documentElement.scrollLeft;
        if(!y)y=event.clientY+document.body.scrollTop+document.documentElement.scrollTop;}
    var tagid=evsrc.id;//disp.value+="Pup-Menu"+elM.slice(6);
    ShowMenu("Menu"+elM.slice(6),"visible",elM,x,y);
}
function popDown(elM,e){
    mnuj="Menu"+elM.slice(6);Menuj=window.menus[mnuj];
    Menuj.offtimer=setTimeout("MenuOff('Menu"+elM.slice(6)+"')",250);
}
function ShowActive(e){
    if(e.srcElement){evsrc=event.srcElement}
    if(e.target){evsrc=e.target;}
    var mnuid=String(evsrc.id);
    evsrc.style.color = "red";
    if (mnuid.indexOf("Menu") == 0){
        //evsrc.style.backgroundColor = coloract;   //******put this back if not using class=mnubox:hover
        var mnuj=mnuid.slice(0,mnuid.lastIndexOf("Line"));
        var mnuln=parseInt(mnuid.slice(mnuid.lastIndexOf("Line")+4));
        Menuj=window.menus[mnuj];if(Menuj.offtimer)clearTimeout(Menuj.offtimer);
        //disp.value+="|Sha"+Menuj.name+"_"+parseInt(mnuid.slice(mnuid.lastIndexOf("Line")+4))+"Kid="+Menuj.itemhaschild[mnuln];
        if(Menuj.itemhaschild[mnuln]){popUp("el"+mnuj+"_"+mnuln,e,Menuj.posx+145,Menuj.posy+(mnuln*20-10))}
        PMenuj=Menuj.parentmnu;if(PMenuj){PMenuj.activechild=true;}//disp.value+="|"+PMenuj.name+" kid^";}
    }
}
function ShowInactive(e){
    if(window.event){
        evsrc=window.event.srcElement;evtoel=window.event.toElement;evsrc.style.color = "";if(evsrc.contains(evtoel)){return}
    }
    if(e.target){evsrc=e.target;evtoel=e.relatedTarget;evsrc.style.color = "";if(evtoel.parentNode==evsrc){return}}
    var mnuid=String(evsrc.id);
    evsrc.style.color = "";
    if (mnuid.indexOf("Menu") == 0){//disp.value+="}Shinact."+evsrc.id;
        //evsrc.style.backgroundColor = colorinact; //******put this back if not using class=mnubox:hover
        var mnuj=mnuid.slice(0,mnuid.lastIndexOf("Line"));
        var mnuln=parseInt(mnuid.slice(mnuid.lastIndexOf("Line")+4));
        Menuj=window.menus[mnuj];if(Menuj.itemhaschild[mnuln]){popDown("el"+mnuj+"_"+mnuln,e)}
    }
}
