/*
*/
//*** Global Variables
var	LIBLOADEDJSmenu	=false;
var	systemLibCnt	=0;
var	isNS=(document.layers)?true:false;// Is it a Netscape browser
var	systemMouseDn	=false; // mousemove dragging
var	systemLayers	=(isNS)?eval('document.layers'):document.all;
var	systemMaxZ	=0; 
var	systemNullChk	=((isNS)?((navigator.appVersion.substring(0,4)=="4.05")?"null":"undefined"):"null")
var	menuTimeOut	=null;  // mouseout Cancel menu timer
var	menuCurrentItem	=null;  // currently highlighted object.
var	menuCurrentPath	="";    // The open menu list.
var	menuScreenWidth	=0;
//*** General Menu  configuration variables
var	menuSubAuto	=false  ;
var	menuAtimeout	=4500	;
var	menuSubSymbol	="&raquo;";// html to indicate sub menu
var	menuRoll	=false  ;// Show menu items as built
var	menuCharHeight	=14     ;// Avg Char Height.
var	menuCharWidth	=5      ;// Avg Char Width.
var	menuYpopoff	=menuCharHeight;
var	menuXpopoff	=0;
var	menuBcolor	="#006699";// background
var	menuTcolor	="#FFFFFF";// Text
var	menuHBcolor	="#0078B9";
var	menuHTcolor	="#000000";
var	menuFBcolor	="#000000";
var	menuFont	="geneva,ms sans serif";// menu label font
var	menuFontSize	=1	;// menu font size
var	menuBold	=false	;// Use bold
var	Firstpass	=true	;
var	lastEVENT	=null	;

var	szDuds		="Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)";

function PreLoads(treeList)
	{
	window.status="["+systemLibCnt+"] menu.js["+LIBLOADEDJSmenu + "] items ["+""+" Loading ...";
	if(!LIBLOADEDJSmenu)
	  {  setTimeout("PreLoads('"+treeList+"')",500);return;   }
	window.onResize="document.location.href=document.location.href";        
	if(!document.links.length)
	  {  setTimeout("PreLoads('"+treeList+"')",500);return;   }
	window.status="initializing";
	while(treeList.length>1)
	     {          
	     killboy =treeList.substring(1);
	     killboy =killboy.substring(0,killboy.indexOf(":"));
	     treeList=treeList.substring(killboy.length+1);
	     window.status="Loading "+killboy;
	     menuCREATE(killboy,0,0);
	     }
	window.status="";
	}

/* Called by the jsLAYERclass to create
a layer if the layer does not already exist.*/
function jsLAYERcreateLayer(Homeboy,x,y,w,h,bColor)
	{
	if(isNS)
	  {
	  var lyr= document.layers[Homeboy.lyrName] = new Layer(w)
	  lyr.left=x;lyr.top=y; lyr.clip.height=h+1;lyr.clip.width=w+1;
	  lyr.bgColor=((jsLAYERcreateLayer.arguments.length>5)?bColor:menuBcolor);
	  lyr.visibility='hidden';lyr.zIndex=1;
	  lyr.isHighlight=false;
	  lyr.border=1;
	  lyr.style=lyr;
	  }else{
	  var str = '\n<DIV id='+Homeboy.lyrName+' style="visibility: hidden; position:absolute; left:'+x+'; top:'+y+'; width:'+w
	  str += '; height:'+menuCharHeight+'; clip:rect(0,'+(w+1)+','+(h+1)+',0)'
	  str += '; background-color:'+((jsLAYERcreateLayer.arguments.length>5)?bColor:menuBcolor)+';"> </DIV>';
	  document.body.insertAdjacentHTML("BeforeEnd",str);
	  }
	Homeboy.jsLAYERobject=systemLayers[Homeboy.lyrName];
	if(isNS)
	  {
	  Homeboy.jsLAYERdocument       =document.layers[Homeboy.lyrName].document;
	  Homeboy.jsLAYERcss            =document.layers[Homeboy.lyrName];
	  }else{
	  Homeboy.jsLAYERdocument       =document.all[Homeboy.lyrName];
	  Homeboy.jsLAYERcss            =document.all[Homeboy.lyrName].style;
	  Homeboy.jsLAYERcss.zIndex     =systemMaxZ++;
	  }
	Homeboy.jsLAYERobject.HomeBoy=Homeboy;
	Homeboy.jsLAYERobject.W =w;
	Homeboy.jsLAYERobject.X =x;
	Homeboy.jsLAYERobject.Y =y;
	Homeboy.jsLAYERobject.H =h;
	Homeboy.jsLAYERobject.MOUSEHANDLER="MOUSEVECTOR";
	return Homeboy;
	}
function jsLAYERsetHandler(Homeboy,szHANDLER) // named function for events
	{
	Homeboy.jsLAYERobject.MOUSEHANDLER=szHANDLER;
	MOUSECAPTURE(Homeboy,Homeboy.lyrName);
	}
function jsLAYERhomeboy(layername){return systemLayers[layername].HomeBoy;}
function jsLAYERopen(Homeboy){if(isNS){Homeboy.jsLAYERobject.document.open();  }else{  Homeboy.jsLAYERobject.innerHTML="";}}
function jsLAYERwrite(Homeboy,Text){if(isNS){Homeboy.jsLAYERdocument.write(Text);}else{Homeboy.jsLAYERobject.innerHTML+=Text;}}
function jsLAYERclose(Homeboy)
	{
	if(isNS)
	  {
	  Homeboy.jsLAYERdocument.close();
	  MOUSECAPTURE(Homeboy,Homeboy.lyrName);
	  }
	}
function jsLAYERsetContent(Homeboy,text)
	{
	jsLAYERopen(Homeboy);
	jsLAYERwrite(Homeboy,text);
	jsLAYERclose(Homeboy);return;
	}
function jsLAYERshow(Homeboy,vis){Homeboy.jsLAYERcss.visibility=((vis)?"visible":"hidden");}
function jsLAYERgetX(Homeboy){return parseInt((document.all)?Homeboy.jsLAYERcss.left:Homeboy.jsLAYERcss.x);}
function jsLAYERgetY(Homeboy){return parseInt((document.all)?Homeboy.jsLAYERcss.top:Homeboy.jsLAYERcss.y);}
function jsLAYERxy(Homeboy,x,y,InLayer)
	{
	this.InX=x;this.InY=y;
	if(!isNS)
	  {
	  if(InLayer)
	    {
	    this.InX+=parseInt(document.all[Homeboy.lyrName].style.left);
	    this.InY+=parseInt(document.all[Homeboy.lyrName].style.top);
	    }
	  systemLayers[Homeboy.lyrName].style.left=InX
	  systemLayers[Homeboy.lyrName].style.top=InY
	  }else{
	  if(InLayer)
	    {
	    InX+=InLayer.jsLAYERcss.left;
	    InY+=InLayer.jsLAYERcss.top;
	    }
	  Homeboy.jsLAYERobject.x=this.InX;
	  Homeboy.jsLAYERobject.y=this.InY;
	  }
	}
/*Function      :MEVENT
**Parameters    :Homeboy        - Layer Class Pointer
**               Evt            - javascript Browser Event
**Description   :Noramalizes Netscape/MSIE evnts to 
**a class containing variables for both, with Netscape names
**superceding MSIE names. It is this psudeo event class that
**is passed to all MOUSE... event handler functions.
*/
var LastEVT;
function MEVENT(Homeboy,Evt) //normalizes the differences in NS and MSIE events
	{
	this.type=Evt.type;
	this.screenX=Evt.screenX;this.screenY=Evt.screenY;
	this.x=Evt.x;this.y=Evt.y;
	this.locationX=parseInt(Homeboy.jsLAYERobject.style.left);
	this.locationY=parseInt(Homeboy.jsLAYERobject.style.top);
	if(isNS)
	  {
	this.pageX	=Evt.pageX	;this.pageY	=Evt.pageY	;
	this.layerX	=Evt.layerX	;this.layerY	=Evt.layerY	;
	this.which	=Evt.which	;
	this.target	=Evt.target	;
	this.modifiers	=Evt.modifiers;
	  }else{
	this.y+=document.body.scrollTop;
	this.pageX      =Evt.x		;this.pageY      =this.y;
	this.offsetY    =Evt.offsetY	;this.offsetX    =Evt.offsetX;
	this.clientX    =Evt.clientX	;this.clientY    =Evt.clientY;
	this.layerX     =Math.abs(this.clientX-this.locationX);
	this.layerY     =Math.abs(this.pageY-this.locationY);
	this.which      =Evt.button+1;
	this.target     =Evt.srcElement;
	this.modifiers=(((Evt.altKey)?1:0)+((Evt.ctrlKey)?2:0)+((Evt.AltKey)?4:0));
	  }
	LASTevt= this;
	}
function MOUSEVECTOR(layername,Evt)// handles the actuall prep and call of mouse events
	{Homeboy=systemLayers[layername].HomeBoy;return false;}
// Sets up mouse event NOTE: Use of "new Function" is important
function MOUSECAPTURE(Homeboy,layername)
        {
var NFD="return "+Homeboy.jsLAYERobject.MOUSEHANDLER+"('"+layername+"',"+((isNS)?"arguments[0]":"window.event")+")"
Homeboy.jsLAYERobject.onmouseover	=new Function(NFD)
Homeboy.jsLAYERobject.onmouseout	=new Function(NFD)
Homeboy.jsLAYERdocument.onmousemove	=new Function(NFD)
Homeboy.jsLAYERdocument.onmousedown	=new Function(NFD)
Homeboy.jsLAYERdocument.onmouseup	=new Function(NFD)
if(isNS)Homeboy.jsLAYERdocument.captureEvents(  Event.MOUSEUP |   Event.MOUSEDOWN   | Event.MOUSEMOVE);
        }
function NSResizePatch(){document.location.href=document.location.href;}
function jsNULLvector(layername,Evt){return true;}
var MPTYPE ="",MSTYPE ="";
function jsMPANELvector(panelName,Evt)  // Vectors mouse messages for the panel
	{
	Homeboy=jsLAYERhomeboy(panelName);
	if(menuTimeOut)clearTimeout(menuTimeOut);
	if(Evt.type=="mouseout" || Evt.type=="mouseover") 
	  {
	  MPTYPE=Evt.type;
	  if(MPTYPE==MSTYPE&&MPTYPE=="mouseout")menuTimeOut=setTimeout("menuPOPDN()",100);
	  }
	if(Evt.type!="mousemove" )return false;
	EVENT=new MEVENT(Homeboy,Evt);
	EntryNum=0;
	EntryNotch=EVENT.layerY;
	if(EntryNotch)
	  {
	  EntryNotch-=(EntryNotch%menuCharHeight);
	  EntryNum=(EntryNotch/menuCharHeight)
	  }
	if(Homeboy.mParent.Items.length<=EntryNum)return true;
	lastEVENT=EVENT;
	if(Homeboy.mParent.EntryNum==EntryNum)return false;
if(!Homeboy.mParent.Items[EntryNum])
{alert("HI ENTRY "+EntryNum+" layerY="+EVENT.layerY+" pageY="+EVENT.pageY+" LOCATIONY="+EVENT.locationY);
return false;
}
	jsLAYERsetContent(Homeboy.mParent.mSELECT,Homeboy.mParent.Items[EntryNum].RENDER);
	jsLAYERxy(Homeboy.mParent.mSELECT,jsLAYERgetX(Homeboy),jsLAYERgetY(Homeboy)+(EntryNum*menuCharHeight));
	Homeboy.mParent.EntryNum=EntryNum;
	if(!menuSubAuto)return false;
	if(Homeboy.mParent.Items[EntryNum].ACTION.substring(0,1)=="@")
	  {
	  fakeEvt = new Object();
	  fakeEvt.type="mouseup";
	  jsMSELECTvector(Homeboy.mParent.mSELECT.lyrName,fakeEvt);
	  }
	return false;
	}
/*
** Vectors mouse messages for the menu selector
*/
function jsMSELECTvector(panelName,Evt)
	{
	if(menuTimeOut)clearTimeout(menuTimeOut);
	if(Evt.type=="mouseout" || Evt.type=="mouseover") 
	  {
	  MSTYPE=Evt.type;
	  if(MPTYPE==MSTYPE&&MPTYPE=="mouseout")menuTimeOut=setTimeout("menuPOPDN()",100);
	  Homeboy=jsLAYERhomeboy(panelName);
	  return false;
	  }
	if(Evt.type!="mouseup")return false;
	Homeboy=jsLAYERhomeboy(panelName);
	var action = Homeboy.mParent.Items[Homeboy.mParent.EntryNum].ACTION;
	if(menuCurrentPath.indexOf(Homeboy.jsLAYERobject.GROUP)>0)
	  {
	  var FindGroup = ":"+Homeboy.jsLAYERobject.GROUP+":";
	  var killList = menuCurrentPath.substring(menuCurrentPath.indexOf(FindGroup)+FindGroup.length-1);
	  menuPOPDN(killList);
	  }
	if(action.length<1){window.status="[Not Available]";return false;}
	var isMenu = action.substring(0,1)=="@";
	var isJavascript = action.substring(0,1)=="!";
	if(isJavascript)
	  {	eval(action.substring(1));return false;  }
	if(isMenu)
	  {
	  menuPOPUP(jsLAYERgetX(Homeboy)+Homeboy.jsLAYERobject.W+2,jsLAYERgetY(Homeboy),action.substring(1));
	  }else{
	  document.location.href=action;
	  }
	return false;
	}
/*
** This is the menu panel
*/
function jsMPANELclass(group,entry,label,action,x,y,w,h)
	{
	this.lyrName            =group+entry;
	if(!systemLayers[this.lyrName])jsLAYERcreateLayer(this,x,y,w,h,menuFBcolor);
	jsLAYERsetHandler(this,"jsMPANELvector");
	this.jsLAYERobject.GROUP	=group;this.jsLAYERobject.ENTRY=entry;
	this.jsLAYERobject.rtWidth	=10		;
	this.jsLAYERobject.rtSymbol	="&raquo;"	;
	}
/*
** This is the highlite bar
*/
function jsMSELECTclass(group,entry,label,action,x,y,w,h)
	{
	this.lyrName            =group+entry;
	if(!systemLayers[this.lyrName])jsLAYERcreateLayer(this,x,y,w,h);
	jsLAYERsetHandler(this,"jsMSELECTvector");
	this.jsLAYERobject.GROUP	=group		;
	this.jsLAYERobject.ENTRY	=entry		;
	this.jsLAYERobject.rtWidth	=10		;
	this.jsLAYERobject.rtSymbol	="&raquo;"	;
        }
/*
** Create the menu label obeject string for display
*/
function menuLABEL(Homeboy,text,isHighlight,isSub)
	{
	var fontstart="<FONT FACE='"+menuFont+"' SIZE="+menuFontSize+" COLOR='"+((isHighlight)?menuHTcolor:menuTcolor)+"'>"+((menuBold)?"<B>":"");
	var CONTENT="&nbsp;";
	if(text)CONTENT=text.length?"&nbsp;"+text:"&nbsp;";
	var lyrtxt="<TABLE BORDER=0 CELLPADDING=0 STYLE='cursor:hand' CELLSPACING='0' BGCOLOR='";
	lyrtxt+=((isHighlight)?menuHBcolor:menuBcolor);
	lyrtxt+="' WIDTH='"+Homeboy.jsLAYERobject.W+"' HEIGHT='"+menuCharHeight+"'><TR VALIGN=MIDDLE>";
	twidth=parseInt(Homeboy.jsLAYERobject.W)-parseInt(Homeboy.jsLAYERobject.rtWidth);
	lyrtxt+="<TD WIDTH='"+twidth.toString();
	lyrtxt+="'>"+fontstart+CONTENT+((menuBold)?"</B>":"")+"</FONT></TD>";
	lyrtxt+="<TD WIDTH='10'>"+fontstart+((isSub)?menuSubSymbol:"&nbsp;")+((menuBold)?"</B>":"")+"</FONT></TD></TR></TABLE>";
	return lyrtxt;
	}
function MenuItem(label,action)
	{
	this.LABEL      =label  ;
	this.ACTION     =action ;
	this.SUB        =this.ACTION.substring(0,1)=="@";
	this.RENDER     =""     ;
	}
function MenuListAPPEND(label,action)   //Appends an item to the menuobject
	{
	this.Items[this.Items.length]=new MenuItem(label,action);
	if(label.length>this.greatestCharWidth)this.greatestCharWidth=label.length;
	}
function menuPop(tobj) //Pops up menu relative to <A> tag location on screen.
	{
	objectName=tobj.href.substring(tobj.href.lastIndexOf("/")+1);
	if(objectName.indexOf(".html")>-1)objectName=objectName.substring(0,objectName.indexOf("."))
	if(menuCurrentPath.indexOf(":"+objectName+":")==0)return false;
	if(menuCurrentPath.length>0)menuPOPDN();
	if(szDuds.indexOf(navigator.userAgent)>-1)
	  {
	  if(tobj.href.indexOf(".htm")==-1)tobj.href+=".html";
	  return true;
	  }
	if(navigator.appVersion.indexOf("MSIE")>-1&&navigator.appVersion.indexOf("Mac")>-1)
	  {// compatible mac
	  if(tobj.href.indexOf(".htm")==-1)tobj.href+=".html";
	  return true;
	  }
        
//	this.MX=((isNS)?(tobj.x):window.event.clientX-window.event.offsetX+tobj.offsetLeft);
//	this.MY=((isNS)?(tobj.y):window.event.clientY-window.event.offsetY+tobj.offsetTop+document.body.scrollTop);
	this.MX=((isNS)?(tobj.x):0);
	this.MY=((isNS)?(tobj.y):0);
if(!isNS)MSIEmeasure(tobj,this);

	this.MY+=menuYpopoff;this.MX+=menuXpopoff;
	menuPOPUP(this.MX,this.MY,objectName);
//	menuTimeOut=setTimeout("menuPOPDN()",4500);
	menuTimeOut=setTimeout("menuPOPDN()",menuAtimeout);
	return false;
	}
function menuPOPUP(x,y,menulist)        //*** Opens named menu at given location
	{
	var DL=eval(menulist);
	if(!DL){alert("menuPOPUP NULL "+menulist);return;}
	menuSHOW(menulist,x,y);
	if(!menuScreenWidth)
	  menuScreenWidth=(isNS)?document.width:document.body.offsetWidth;
	mkw=(DL.greatestCharWidth*menuCharWidth)+10;
	var atX = ((x+mkw+20)>=menuScreenWidth)?x-mkw:x;
	if(jsLAYERgetX(DL.mPANEL)!=atX)menuXY(DL,atX,y);
	}
function menuCREATE(szMlist,iLeft,iTop)
	{
	Left= 20;Top = 40;
	if(menuCREATE.arguments.length>1)Left=iLeft;
	if(menuCREATE.arguments.length>2)Top=iTop;
	Mlist=eval(szMlist);
	if(Mlist.mPANEL ==null)
	  {
	  Mlist.mPANEL=new jsMPANELclass(szMlist,0,"Hello","alert('hi')",Left,Top,((Mlist.greatestCharWidth+10)*menuCharWidth)+1,(menuCharHeight*Mlist.Items.length)+1);
	  Mlist.mPANEL.mParent=Mlist;
	  var menuContent='';
	  menuContent='<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0><TR><TD>';
	  for(x=0;x<Mlist.Items.length;x++)
	   {
	   menuContent+=menuLABEL(Mlist.mPANEL,Mlist.Items[x].LABEL,false,Mlist.Items[x].SUB);
	   Mlist.Items[x].RENDER=menuLABEL(Mlist.mPANEL,Mlist.Items[x].LABEL,true,Mlist.Items[x].SUB);
	   }
	  menuContent+='</TD><TD BGCOLOR="'+menuFBcolor+'">&nbsp;</TD>';
	  menuContent+="</TR><TR><TD COLSPAN=2>&nbsp;</TD></TR></TABLE>";
	  jsLAYERsetContent(Mlist.mPANEL,menuContent);
	  }
	if(Mlist.mSELECT==null)
	  {
	  Mlist.mSELECT=new jsMSELECTclass(szMlist,1,"Hello","alert('hi')",Left,Top,(Mlist.greatestCharWidth+10)*menuCharWidth,menuCharHeight);
	  Mlist.mSELECT.mParent=Mlist;
	  jsLAYERsetContent(Mlist.mSELECT,Mlist.Items[0].RENDER);
	  }
	}
function menuSHOW(szMlist,iLeft,iTop)   // SHOW the menu
	{
	Left= 20;Top = 40;
	if(menuSHOW.arguments.length>1)Left=iLeft;
	if(menuSHOW.arguments.length>2)Top=iTop;
	Mlist=eval(szMlist);
	if(Mlist.mPANEL==null)menuCREATE(szMlist,iLeft,iTop);
	if(jsLAYERgetX(Mlist.mPANEL)!=Left || jsLAYERgetY(Mlist.mPANEL)!=Top)
	  {
	  jsLAYERxy(Mlist.mPANEL,Left,Top)   
	  jsLAYERxy(Mlist.mSELECT,Left,Top+(Mlist.EntryNum*menuCharHeight));   
	  }; 
	if(menuCurrentPath.indexOf(":"+szMlist+":")<0)menuCurrentPath+=((menuCurrentPath.length)?"":":")+szMlist+":";
	jsLAYERshow(Mlist.mPANEL,true);
	jsLAYERshow(Mlist.mSELECT,true);
	}
function menuHIDE(szMlist)      //  Hides the named menu
	{
	Mlist=eval(szMlist);
	jsLAYERshow(Mlist.mSELECT,false);
	jsLAYERshow(Mlist.mPANEL,false);
	}
function menuXY(Mlist,x,y)      // Moves the referenced menu
	{
	jsLAYERxy(Mlist.mPANEL,x,y)
	jsLAYERxy(Mlist.mSELECT,x,y+(Mlist.EntryNum*menuCharHeight));
	}
function menuPOPDN(treeList)    // closes a list of menus
	{
	if(menuTimeOut)clearTimeout(menuTimeOut);
	if(menuPOPDN.arguments.length<1)treeList=menuCurrentPath;
	while(treeList.length>1)
	     {          
	     killboy =treeList.substring(1);
	     killboy =killboy.substring(0,killboy.indexOf(":"));
	     treeList=treeList.substring(killboy.length+1);
	     menuHIDE(killboy);
	     }
	if(menuPOPDN.arguments.length<1)menuCurrentPath="";
	};
/*
** MAIN MENU OBJECT
*/
var mSELECT=null;
function MenuList(Mlist)
	{
	this.mPANEL	=null;this.mSELECT=null;
	this.Items	=new Array();this.EntryNum=0;
	this.APPEND	=MenuListAPPEND;
	this.greatestCharWidth=0;
	}
/*      Function        :MSIEmeasure
**      Since I have found no straight forward method of obtaining IE x,y
**      coords for the clicked link, this function recurses up the object tree
**      to measure the screen location of the <A> involved
*/
function MSIEmeasure(btobj,HB)
	{
	var tobj=btobj		;
	HB.MX	=tobj.offsetLeft;
	HB.MY	=tobj.offsetTop	;
	while(tobj.parentElement)
	  {
	  if(!tobj.parentElement)break;
	  tobj = tobj.parentElement;
	  if(String(":TABLE:TD:DIV:").indexOf(":"+tobj.tagName+":")>-1)
	    {
	    HB.MX+=tobj.offsetLeft;
	    HB.MY+=tobj.offsetTop;
	    }
	  if(!tobj.parentElement)break;
	  if(tobj.parentElement.tagName=="BODY")break;
	  }
	return ;
	}
/****************************************
** A message window                     *
*****************************************/
var StatusMsgWin=null;
function jsMESSAGEclass(group,entry,x,y,w,h)
	{
	this.lyrName		=group+entry;
	if(!systemLayers[this.lyrName])jsLAYERcreateLayer(this,x,y,w,h,"#FFFFCC");
	jsLAYERsetHandler(this,"jsNULLvector");
	jsLAYERshow(this,true);
	this.jsLAYERobject.GROUP=group;this.jsLAYERobject.ENTRY=entry;
	}
/*
** Set the contents of the message window;
*/
function jsStatusMsg(txtMESSAGE)
	{
	if(!StatusMsgWin)
	  {
	  StatusMsgWin= new jsMESSAGEclass("E",1,1,1,355,100);
	  jsLAYERshow(StatusMsgWin,true);
	  }
	jsLAYERsetContent(StatusMsgWin,txtMESSAGE);
	}
var LIBLOADEDJSmenu=true;