//constants
var cIEname = "Microsoft Internet Explorer";
//end constants

//******globals****************//
var gMenus = new Array();
var gActiveMenu=null;

var gOldBrowser=_oldBrowser();
//end globals

//objects
function objMenu(index, menuItems, minWidth, orientation, rootClickDelay, subClickDelay, hideDelay, rootOffsetTop, rootOffsetLeft, subOffsetTop, subOffsetLeft){
    this.id=index;
    
    this.MenuItems = menuItems;
    
    this.MinWidth = minWidth;
    this.Orientation = orientation;
    this.SubClickDelay = subClickDelay;
    this.RootClickDelay = rootClickDelay;
    
    this.HideDelay = hideDelay;
    this.RootOffsetTop  = rootOffsetTop;
    this.RootOffsetLeft = rootOffsetLeft;
    this.SubOffsetTop   = subOffsetTop;
    this.SubOffsetLeft  = subOffsetLeft;
    
    this.RootItems = new Array();
    this.SubMenus  = new Array();

    this.ActiveMenuItem = null;
    this.ActiveSubMenu=null;
    this.ActiveSubMenus = new Array();
    
    this.QueuedSubMenu = null;
    this.OpenTimer = null;
    this.HideTimer = null;
    
}

function objSubMenu(id, parentMenuItem, parentId, rootId, level){
	this.id=id;
	this.level=level;
	this.parentMenuItem=parentMenuItem;
	this.top=0;
	this.left=0;
	this.width=0;
	this.elem=null;
	this.rootId=rootId;
	this.parentId=parentId;
	this.parent=null;
	this.menuItems=new Array();
	this.activeItem = null;
}

function objRootItem(id, itm){
	this.id=id;
	this.elem=itm;
}
//end objects

//public functions
function initMenu(index, menuItems, minWidth, orientation, rootClickDelay, subClickDelay, hideDelay, rootOffsetTop, rootOffsetLeft, subOffsetTop, subOffsetLeft){
    gMenus[index] = new objMenu(index, menuItems, minWidth, orientation, rootClickDelay, subClickDelay, hideDelay, rootOffsetTop, rootOffsetLeft, subOffsetTop, subOffsetLeft);
    gActiveMenu  = gMenus[index];
    
	document.write(_createRootMenu(index, gActiveMenu.MenuItems));
	
	//register events
	if(!gOldBrowser){
		if (window.captureEvents){
			window.captureEvents(Event.CLICK);
		};
		document.onclick = _Body_OnClick;
		document.onmouseover=_Body_OnMouseOver;
	};
	document.close();
}

function activateMenu(index){
    if(index!=gActiveMenu.id){
        _deactivateAll();
        gActiveMenu = gMenus[index];
    };
}
//end public functions

//private functions
function _createRootMenu(index){

	var r="";var j=0;
    r = "<div class='menu' id='menu_" + gActiveMenu.id + "'>" +
        "<div class='rootmenu'><table cellpadding='0' cellspacing='0' border='0' id='root_table_" + gActiveMenu.id + "' class='menuitems'>"+(gActiveMenu.Orientation=='vertical'?"":"<tr>");
	for(var i=0;i<gActiveMenu.MenuItems.length;i++){
		var mnuItm=gActiveMenu.MenuItems[i];


        if(mnuItm[1]==null){
			if(gOldBrowser){
    			r=r+(gActiveMenu.Orientation=='vertical'?"<tr>":"")+"<td id='root_" + gActiveMenu.id + "_"+mnuItm[0]+"' class='"+(mnuItm[5]?"delimiter":"Item")+"'><div><a href='"+mnuItm[3]+"'>"+mnuItm[2]+"</a></div></td>"+(gActiveMenu.Orientation=='vertical'?"</tr>":"");
			}else{
                if(mnuItm[5]){//delimiter
				    r=r+(gActiveMenu.Orientation=='horizontal'?"":"<tr>")+"<td class='delimiter'><div>|</div></td>"+(gActiveMenu.Orientation=='horizontal'?"":"</tr>");
				}else{
				    r=r+(gActiveMenu.Orientation=='horizontal'?"":"<tr>")+"<td class='"+(mnuItm[5]?"delimiter":"item")+"'  onMouseOver=activateMenu("+index+");mnuOnMouseOver(event,"+mnuItm[0]+",null,"+mnuItm[0]+",this,"+mnuItm[4]+","+mnuItm[5]+","+mnuItm[6]+") id='root_" + gActiveMenu.id + "_"+mnuItm[0]+"' onClick=mnuOnClick(event,'"+mnuItm[3]+"',this)><div "+(mnuItm[4]?"class='folder'":"")+"><a href='"+mnuItm[3]+"'>"+mnuItm[2]+"</a><span class='folder'>&nbsp;</span></div></td>"+(gActiveMenu.Orientation=='horizontal'?"":"</tr>");
				}
				gActiveMenu.RootItems[j]=new objRootItem(mnuItm[0],"root_" + gActiveMenu.id + "_"+mnuItm[0]);
			};
		    j++;
		};
	};
	
	return r+(gActiveMenu.Orientation=='vertical'?"":"</tr>")+"</table></div></div>";

}

function _createSubMenu(id, parentId, rootId, itm, level){

	var mnu=_findInactiveMenu(id);
	
	if(mnu==null){
	

		var mnu=new objSubMenu(id, itm, parentId, rootId, level);

    	var lr=document.createElement("div");
    	lr.id="sub_" + gActiveMenu.id + "_" + id;
		lr.style.position='absolute';
		lr.style.visibility='hidden';
		lr.style.display='none';
		

		lr.innerHTML=_createSubMenuItems(mnu);

		mnu.elem=lr;
		
		document.body.appendChild(lr);

		if(parentId!=null){

			
			mnu.parent=gActiveMenu.ActiveSubMenus[level-1];
			mnu.left=_getOffsetLeft(itm)+mnu.parent.width+gActiveMenu.SubOffsetLeft;
			mnu.top=_getOffsetTop(itm)+gActiveMenu.SubOffsetTop;
			
			
			if(gActiveMenu.Orientation=='horizontal'){
				if(mnu.top<mnu.parent.top){
					mnu.top=mnu.parent.top;
				};
			};
		}else{
			var rt=document.getElementById("root_table_" + gActiveMenu.id);
			mnu.top=_getOffsetTop(itm)+rt.offsetHeight+gActiveMenu.RootOffsetTop;
			mnu.left=_getOffsetLeft(itm)+(gActiveMenu.Orientation=='vertical'?gActiveMenu.MinWidth+gActiveMenu.RootOffsetLeft:gActiveMenu.RootOffsetLeft);
		};
		
		gActiveMenu.SubMenus[gActiveMenu.SubMenus.length] = mnu;
	
    }else{
		if(parentId!=null){
			mnu.left=_getOffsetLeft(itm)+mnu.parent.width+gActiveMenu.SubOffsetLeft;
			mnu.top=_getOffsetTop(itm)+gActiveMenu.SubOffsetTop;
		}else{
			var rt=document.getElementById("root_table_" + gActiveMenu.id);
			mnu.top=_getOffsetTop(itm)+rt.offsetHeight+gActiveMenu.RootOffsetTop;
			mnu.left=_getOffsetLeft(itm)+(gActiveMenu.Orientation=='vertical'?gActiveMenu.MinWidth+gActiveMenu.RootOffsetLeft:gActiveMenu.RootOffsetLeft);
		};
    };
	
	return mnu;
	
}

function _createSubMenuItems(mnu){

	var r="";var j=0;

	r="<div class='submenulevel_"+mnu.level+"'><div class='submenu'><table cellpadding='0' cellspacing='0' border='0' class='menuitems'>"+(gActiveMenu.Orientation=='vertical'&&mnu.id==null?"<tr>":"");
	for(var i=0;i<gActiveMenu.MenuItems.length;i++){
		var mnuItm=gActiveMenu.MenuItems[i];
			
		if(mnuItm[1]==mnu.id){
			
			r=r+(gActiveMenu.Orientation=='horizontal'&&mnu.id==null?"":"<tr>")+"<td class='"+(mnuItm[5]?"delimiter":"item")+"' onMouseOver='mnuOnMouseOver(event,"+mnuItm[0]+","+mnu.id+","+mnu.rootId+",this,"+mnuItm[4]+","+mnuItm[5]+","+mnuItm[6]+")' id='itm_" + gActiveMenu.id + "_"+mnuItm[0]+"' onClick=mnuOnClick(event,'"+mnuItm[3]+"',this)><div "+(mnuItm[4]?"class='folder'":"")+">"+(mnuItm[5]?"&nbsp;":"<a href='"+mnuItm[3]+"'>"+mnuItm[2]+"</a>")+"</div></td>"+(gActiveMenu.Orientation=='horizontal'&&mnu.id==null?"":"</tr>");
			mnu.menuItems[j]="itm_"+gActiveMenu.id+"_"+mnuItm[0];			
			j++;
		};
	};
	
	return r+(gActiveMenu.Orientation=='vertical'&&mnu.id==null?"</tr>":"")+"</table></div></div>";
	
}

function _deactivateAll(){
	_deactivateSubMenus();
	_deactivateRootItems();

	gActiveMenu.HideTimer=null;
	gActiveMenu.ActiveMenuItem=null;
	gActiveMenu.ActiveSubMenus=new Array();

	gActiveMenu.QueuedSubMenu=null;
	_changeSelectElementVisibility('visible');
}

function _changeSelectElementVisibility(visibility){


    var sel = document.getElementsByTagName('select');

    for(var i=0;i<sel.length;i++){
        sel[i].style.visibility=visibility;
    };
    
    //var o = document.getElementsByTagName('object');

    //for(var i=0;i<o.length;i++){
    //    o[i].style.visibility=visibility;
    //};

}
function _oldBrowser(){
	if(navigator.appName=="Netscape" && parseInt(navigator.appVersion)<5){
		return true;
	}else if(navigator.appName==cIEname && (navigator.userAgent.indexOf('MSIE 4')>0)){
		return true;
	}else{
		return false;
	};
}

function _findInactiveMenu(id){
	var menus=gActiveMenu.SubMenus;
	
	for(var i=0;i<menus.length;i++){
		var mnu=menus[i];
		
		if(mnu!=null){
			if(mnu.id==id){
				return mnu;
				break;
			};
		};
	};
}



function _activateSubMenu(mnu){

	mnu.elem.style.display='inline';
	
	if(mnu.width==0){
		if(gActiveMenu.MinWidth==null){
		    mnu.width=mnu.elem.offsetWidth;
		}else{
		    mnu.width=(mnu.elem.offsetWidth>gActiveMenu.MinWidth?mnu.elem.offsetWidth:gActiveMenu.MinWidth);
		};
	};
	
	if(mnu.left+mnu.width>document.body.clientWidth&&mnu.parentId!=null){
		mnu.elem.style.left=(mnu.parent.left-mnu.width)-gActiveMenu.SubOffsetLeft+'px';
	}else{
		mnu.elem.style.left=mnu.left+'px';
	};

    mnu.elem.style.width=mnu.width;	
	mnu.elem.style.visibility='visible';
	mnu.elem.style.top=mnu.top+'px';

}

function _openQueuedSubMenu(id, parentId, rootId, level){
	var itm=gActiveMenu.QueuedSubMenu;
	
	gActiveMenu.OpenTimer=null;
	
	_changeSelectElementVisibility('hidden');

	var mnu=_createSubMenu(id, parentId, rootId, itm, level);
	
	if(mnu!=null){
		gActiveMenu.ActiveSubMenus[level]=mnu;
		gActiveMenu.ActiveSubMenu=mnu;
		_activateSubMenu(mnu);
		
	};
}

function _getOffsetLeft(obj){
	if(obj){
		var curLeft=0;

		while(obj.offsetParent){
			curLeft+=obj.offsetLeft;
			obj=obj.offsetParent;
		};
		return curLeft;
	};
}

function _getOffsetTop(obj){
	if(obj){
		var curTop=0;
	
		while(obj.offsetParent){
			curTop+=obj.offsetTop;
			obj=obj.offsetParent;
		};

		return curTop;
	};
}

function _setOpenTimeout(expression, delay){
	_clearHideTimeout(gActiveMenu.HideTimer);
	gActiveMenu.OpenTimer=window.setTimeout(expression, delay);
}

function _setHideTimeout(expression, delay){
	if(gActiveMenu.HideTimer==null){
		_clearOpenTimeout(gActiveMenu.OpenTimer);
		gActiveMenu.HideTimer=window.setTimeout(expression, delay);
	};
}

function _clearOpenTimeout(id){
	if(id){
		window.clearTimeout(id);
		gActiveMenu.OpenTimer = null;
		id=null;	
	};
}

function _clearHideTimeout(id){
	if(id){
		window.clearTimeout(id);
		gActiveMenu.HideTimer = null;
		id=null;	
	};
}

function _activateMenuItem(itm){
    
    if(itm.className.indexOf(0,'item')!=0){
        itm.className="activeitem";
    }else{
        itm.className="activedelimiter";
    };
}

function _deactivateSubMenus(activeSubMenuLevel){
	var activeSubMenu = gActiveMenu.ActiveSubMenus[activeSubMenuLevel];

	for(var i=gActiveMenu.ActiveSubMenus.length-1;i>=0;i--){
		var mnu = gActiveMenu.ActiveSubMenus[i];

		if(mnu){
			if(activeSubMenu!=null){
				if(mnu!=activeSubMenu && mnu.level>activeSubMenu.level){
					_deactivateMenuItem(mnu.activeItem);
					
					if(mnu.parentId!=activeSubMenu.id || mnu.parentMenuItem.id!=activeSubMenu.activeItem.id){
						_deactivateSubMenu(mnu);
					};
				};
			}else{
				if(activeSubMenuLevel==0 && i==1){
					return;
				};
				_deactivateMenuItem(mnu.activeItem);
				_deactivateSubMenu(mnu);
			};
		};
	};	
}

function _deactivateSubMenu(mnu){
	mnu.elem.style.visibility='hidden';
	gActiveMenu.ActiveSubMenus[mnu.level]=null;
}


function _deactivateRootItems(activeItemID){
	var itm;
	
	for(var i=0;i<gActiveMenu.RootItems.length;i++){
		itm=gActiveMenu.RootItems[i];
		if(itm.id!=activeItemID){
			_deactivateMenuItem(document.getElementById(itm.elem));
		};
	};
}

function _deactivateSubMenuItems(mnu, activeItemID){
	
	for(var i=0;i<mnu.menuItems.length;i++){
		var itm = document.getElementById(mnu.menuItems[i]);

		if(itm.id!=activeItemID){
			_deactivateMenuItem(itm);
		};
	};
}

function _deactivateMenuItem(itm){
	if(itm){
		if(itm.className.indexOf(0,'item')!=0){
		    itm.className="item";
		}else{
		    itm.parentNode.className="delimiter";
		};
	};
}

//end private functions


//*** events ***

function mnuOnMouseOver(e, itemId, parentId, rootId, itm, openMenu, delimiter, level){

	_clearHideTimeout(gActiveMenu.HideTimer);
	
	if(gActiveMenu.ActiveMenuItem!=itm){
		
		_clearOpenTimeout(gActiveMenu.OpenTimer);	
	
		_activateMenuItem(itm);

		
		if(level==0){
			//rootitems
			
			_deactivateRootItems(itemId);
			
			if(gActiveMenu.ActiveSubMenus[1]){
				if(gActiveMenu.ActiveSubMenus[1].rootId==itemId){

					_deactivateSubMenuItems(gActiveMenu.ActiveSubMenus[1]);
					_deactivateSubMenus(0);

					gActiveMenu.ActiveMenuItem=itm;
					e.cancelBubble=true;
					return;
				};
			};
			
			_deactivateSubMenus();
			
			if(openMenu){
				gActiveMenu.QueuedSubMenu=itm;
				_setOpenTimeout("_openQueuedSubMenu("+itemId+","+parentId+","+rootId+","+(level+1)+")",gActiveMenu.RootClickDelay);
			};
			

		}else{
			//submenus
			
			var mnu = gActiveMenu.ActiveSubMenus[level];
			
			mnu.activeItem=itm;
			
			_deactivateSubMenuItems(mnu, itm.id);
			_deactivateSubMenus(level);

			if(openMenu&&!gActiveMenu.ActiveSubMenus[level+1]){
				gActiveMenu.QueuedSubMenu=itm;
				_setOpenTimeout("_openQueuedSubMenu("+itemId+","+parentId+","+rootId+","+(level+1)+")",gActiveMenu.SubClickDelay);
			};
		};
		gActiveMenu.ActiveMenuItem=itm;
	};
	e.cancelBubble=true;
}

function mnuOnClick(e,href, itm){
	if(href!="#"&&href!=null&&href!=""){
		//document.location.href=href;
	};
	e.cancelBubble=true;
}

function _Body_OnClick(){
	_clearOpenTimeout(gActiveMenu.OpenTimer);
	_clearHideTimeout(gActiveMenu.HideTimer);
	_deactivateAll();
}

function _Body_OnMouseOver(){
	_setHideTimeout("_deactivateAll()",gActiveMenu.HideDelay);
}
//end events