function cascadeMenu(prefix,orient,css) {
	this.prefix=prefix;
	this.menu=new Array;
	this.mid2idx=new Array;
	this.hasChild=new Array;
	this.orient=orient;
	this.css=css;
	this.menuActivate=false;
	this.rootClick=false;
	this.currentMenu=null;
	this.menuBuffer=new Array;
	this.delay=2500;
	this.setSplit();
	this.checkBrowser();
}

cascadeMenu.prototype.setSplit = function (splitHTML) {
	 var defaultSplit='<table style="font-size:2px" width="90%" height="100%" border="0" cellspacing="0" cellpadding="0">';
	 defaultSplit+='<tr><td>&nbsp;</td></tr>';
	 defaultSplit+='<tr><td style="border-top:1px solid #CCCCCC;">&nbsp;</td></tr>';
	 defaultSplit+='</table>';
	 this.splitHTML=(splitHTML==null)?defaultSplit:splitHTML;
}

cascadeMenu.prototype.checkBrowser = function () {
	var safariIndex=navigator.userAgent.indexOf('Safari');
	this.safari=(safariIndex!=-1)?true:false;
	if (this.safari) {
		this.safariVer=parseInt(navigator.userAgent.substr(safariIndex+7));
	}
}

cascadeMenu.prototype.setRootClick = function (status) {
	if (status==null) status=true;
	this.rootClick=status;
}

cascadeMenu.prototype.setDelay = function (msec) {
	this.delay=msec;
}

cascadeMenu.prototype.setImgPath = function (path) {
	this.imgPath=path;
}

cascadeMenu.prototype.addIndex = function () {
	this.submenuIndex=(this.submenuIndex==undefined)?0:++this.submenuIndex;
}

cascadeMenu.prototype.getIndex = function () {
	return this.submenuIndex;
}

cascadeMenu.prototype.addMenu = function (parent_mid) {
	this.menuIndex=(this.menuIndex==undefined)?0:++this.menuIndex;
	if (parent_mid) {
		this.hasChild[parent_mid]=this.menuIndex;
	} else {
		if (this.Rootmidx!=null) alert('Duplicate Root Node Error!');
		this.Rootmidx=this.menuIndex;
	}
}

cascadeMenu.prototype.addNode =  function (id,name,img,link,target) {
	this.addIndex();
	var midx=this.menuIndex;
	if (!this.menu[midx]) {
		this.menu[midx]=new Array;
	}
	var submenuIdx=this.menu[midx].length;
	this.menu[midx][submenuIdx]=new Object;

	if (id) {
		this.menu[midx][submenuIdx].id=id;
		this.menu[midx][submenuIdx].img=img;
		this.menu[midx][submenuIdx].name=name;
		this.menu[midx][submenuIdx].link=link;
		this.menu[midx][submenuIdx].target=target;
	}
	this.menu[midx][submenuIdx].index=this.getIndex();
	this.mid2idx[id]=this.getIndex();
}

cascadeMenu.prototype.drawMenu = function () {
	this.menuHTML='';
	this._drawRootMenu(this.Rootmidx);
	document.write(this.menuHTML);
}

cascadeMenu.prototype.drawSubMenu = function () {
	this.submenuHTML='';
	for (var i=0;i<this.menu.length;i++) {
		if (i!=this.Rootmidx) {
			this._drawSubMenu(i);
		}
	}
	document.write(this.submenuHTML);
	this.positionMenu();
}

cascadeMenu.prototype._drawRootMenu = function (mid) {
	this.menuHTML+='<table border="0" cellpadding="0" cellspacing="0" id="'+this.prefix+'_menu'+mid+'" class="'+this.css+'_RootMenu">';
	if (this.orient.indexOf('h')!=-1) {
		this.menuHTML+='<tr>';
		for (var i=0;i<this.menu[mid].length;i++) {
			this.menuHTML+='<td align="center" id="'+this.prefix+'_item'+ this.menu[mid][i].index + '" '+this.addAction(mid,i)+'>';

			if (!this.menu[mid][i].id) {
				this.menuHTML+='<div style="width:1;height:100%;border-left:1px solid #CCCCCC;"></div>';
			} else {
				if (this.menu[mid][i].img) {
					this.menuHTML+='<img width="10" src="'+this.imgPath+this.menu[mid][i].img+'" align="absmiddle">';
				}
				this.menuHTML+='<span style="padding-left:3px;">'+this.menu[mid][i].name+'</span>';
			}
			this.menuHTML+='</td>';
		}
		this.menuHTML+='</tr>';
	}
	else {
		for (var i=0;i<this.menu[mid].length;i++) {
			this.menuHTML+='<tr><td id="'+this.prefix+'_item'+ this.menu[mid][i].index + '" '+this.addAction(mid,i)+'>';

			if (!this.menu[mid][i].id) {
				this.menuHTML+='<div style="width:90%;height:30%;border-bottom:1px solid #CCCCCC;"></div>';
			} else {
				if (this.menu[mid][i].img) {
					this.menuHTML+='<img src="'+this.imgPath+this.menu[mid][i].img+'" align="absmiddle">';
				}
				this.menuHTML+='<span style="padding-left:3px;">'+this.menu[mid][i].name+'</span>';
			}
			this.menuHTML+='</td></tr>';
		}
	}
	this.menuHTML+='</table>';
}

cascadeMenu.prototype._drawSubMenu = function (mid) {
	this.submenuHTML+='<div id="'+this.prefix+'_menu'+mid+'" style="position:absolute;top:0px;left:0px;visibility:hidden;">';
	this.submenuHTML+='<div class="'+this.css+'_SubMenu_shadow">';
	this.submenuHTML+='<div class="'+this.css+'_SubMenu_content">';
	this.submenuHTML+='<table cellpadding="0" cellspacing="0" border="0">';

	for (var i=0;i<this.menu[mid].length;i++) {
		this.submenuHTML+='<tr>';
		this.submenuHTML+='<td id="'+this.prefix+'_item'+ this.menu[mid][i].index + '" '+this.addAction(mid,i)+'>';

		// table in row start
		this.submenuHTML+='<table height="100%" width="100%" border="0" cellpadding="0" cellspacing="0">';
		this.submenuHTML+='<tr>';

		if (this.menu[mid][i].img!==false)  {
			this.submenuHTML+='<td id="'+this.prefix+'_img'+this.menu[mid][i].index+'" class="'+this.css+'_SubMenu_img">';
			if(this.menu[mid][i].img){
				this.submenuHTML+='<img src="'+this.imgPath+this.menu[mid][i].img+'" border="0">';
			} else {
				this.submenuHTML+='<img src="'+this.imgPath+'spacer.gif" width="25" height="1" border="0">';
			}
			this.submenuHTML+='</td>';
		}

		if (this.menu[mid][i].id==null) { // write split menu
			this.submenuHTML+='<td align="center" class="'+this.css+'_SubMenu_label" colspan="2">';
			this.submenuHTML+=this.splitHTML;
			this.submenuHTML+='</td>';
		}
		else {
			this.submenuHTML+='<td class="'+this.css+'_SubMenu_label"';
			this.submenuHTML+=(this.menu[mid][i].img!==false)?' style="padding-left:3px;padding-right:3px;"':'';
			this.submenuHTML+='>';
			this.submenuHTML+=this.menu[mid][i].name;
			this.submenuHTML+='</td>';
			this.submenuHTML+='<td width="18" align="right">';
			if (this.hasChild[this.menu[mid][i].id]) {
				this.submenuHTML+='<font face="webdings"><span style="font-size:14px;">4</span></font>';
			} else {
				this.submenuHTML+='<img src="'+this.imgPath+'spacer.gif" width="18">';
			}
			this.submenuHTML+='</td>';
		} // end of if (this.menu[mid][i].id==null)
		this.submenuHTML+='</tr></table>';
		// table in row end
		this.submenuHTML+='</td></tr>';
	}
	this.submenuHTML+='</table>';
	this.submenuHTML+='</div>';
	this.submenuHTML+='</div>';
	this.submenuHTML+='</div>';
}

cascadeMenu.prototype.positionMenu = function() {
	var rootMenuObj=document.getElementById(this.prefix+'_menu'+this.Rootmidx);
	for (var i=0;i<this.menu[this.Rootmidx].length;i++) {
		if (this.hasChild[this.menu[this.Rootmidx][i].id]==null)
			continue;
		this._positionChildMenu(this.Rootmidx,i);
	}
}

cascadeMenu.prototype._positionChildMenu = function(midx,submenuIdx) {
	var parentMenu=this.menu[midx][submenuIdx];

	//position this menu first
	var parentObj=document.getElementById(this.prefix+'_item'+parentMenu.index);
	var x = this._getObjX(parentObj);
	var y = this._getObjY(parentObj);

	if (this.orient.indexOf('h')!=-1 && this.Rootmidx==midx) {
		y+= document.getElementById(this.prefix+'_item'+parentMenu.index).offsetHeight;
	} else {
		x+=document.getElementById(this.prefix+'_menu'+midx).offsetWidth;
	}

	if (this.Rootmidx==midx && this.safari && this.safariVer<=125) {
		y+=6;
	}

	var currentMenuIdx=this.hasChild[parentMenu.id];
	document.getElementById(this.prefix+'_menu'+currentMenuIdx).style.left=x + 'px';
	document.getElementById(this.prefix+'_menu'+currentMenuIdx).style.top=y + 'px';

	// loop thru to find child menus
	for (var i=0;i<this.menu[currentMenuIdx].length;i++) {
		var childmidx = this.hasChild[this.menu[currentMenuIdx][i].id];
		if (childmidx==null)
			continue;
		this._positionChildMenu(currentMenuIdx,i);
	}

	// apply style after positioning
	document.getElementById(this.prefix+'_menu'+currentMenuIdx).className=''+this.css+'_SubMenu';
}

cascadeMenu.prototype._getObjX = function (obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	} else if (obj.x) {
		curleft += obj.x;
	}
	return curleft;
}

cascadeMenu.prototype._getObjY = function (obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	} else if (obj.y) {
		curtop += obj.y;
	}
	return curtop;
}

cascadeMenu.prototype.showMenu = function (midx,submenuIdx) {
	var currMenuObj=this.menu[midx][submenuIdx];
	var childmidx=this.hasChild[currMenuObj.id];

	while (this.menuBuffer.length>0) {
		var currmidx=this.menuBuffer[this.menuBuffer.length-1];
		if (currmidx!=midx && currmidx!=childmidx) {
			document.getElementById(this.prefix+'_menu'+currmidx).style.visibility='hidden';
			this.menuBuffer.pop();

			// display IE Tag
			this.ShowIETag(this.prefix+'_menu'+currmidx);

		} else {break;}
	} // end of while loop

	if (childmidx==null) return;

	if (document.getElementById(this.prefix+'_menu'+childmidx).style.visibility!='visible') {
		document.getElementById(this.prefix+'_menu'+childmidx).style.visibility='visible';
		this.menuBuffer.push(childmidx);
	}

	// Hide IE Tags
	if (document.all) {
		this.HideIETag('SELECT',this.prefix+'_menu'+childmidx);
	}
}

cascadeMenu.prototype.ShowIETag = function (idname) {
	if (!document.all) return;
	if (this.IETagBuffer==null) return;
	if (this.IETagBuffer[idname]==null) return;

	for (var tag in this.IETagBuffer[idname]) {
		for(var i=0;i<this.IETagBuffer[idname][tag].length;i++) {
			document.all.tags(tag)[this.IETagBuffer[idname][tag][i]].style.visibility='visible';
		}
		this.IETagBuffer[idname][tag]=new Array;
	}
}

cascadeMenu.prototype.HideIETag = function (tag,idname) {
	var currMenuObj=document.getElementById(idname);
	var x=this._getObjX(currMenuObj);
	var y=this._getObjY(currMenuObj);
	var w=currMenuObj.offsetWidth;
	var h=currMenuObj.offsetHeight;

	for (var i=0;i<document.all.tags(tag).length; ++i) {
		var obj = document.all.tags(tag)[i];
		if (!obj || !obj.offsetParent) continue;

		var ox = this._getObjX(obj);
		var oy = this._getObjY(obj);
		var ow = obj.offsetWidth;
		var oh = obj.offsetHeight;

		if (ox > (x + w) || (ox + ow) < x) continue;
		if (oy > (y + h) || (oy + oh) < y) continue;

		if (this.IETagBuffer==null) {this.IETagBuffer=new Array;}
		if (this.IETagBuffer[idname]==null) {this.IETagBuffer[idname]=new Array;}
		if (this.IETagBuffer[idname][tag]==null) {this.IETagBuffer[idname][tag]=new Array;}
		//alert(idname+', '+tag)

		if (obj.style.visibility != "hidden") {
			obj.style.visibility = "hidden";
			this.IETagBuffer[idname][tag].push(i);
		}
	}
}

cascadeMenu.prototype.closeAllMenu = function () {
	if (this.currentMenu!=null || !this.menuActivate) return;

	for(var i=0;i<this.menuBuffer.length;i++) {
		document.getElementById(this.prefix+'_menu'+this.menuBuffer[i]).style.visibility='hidden';
	}

	if (this.ShowIETag) {
		for (var idname in this.IETagBuffer) {
			this.ShowIETag(idname);
		}
	}

	this.menuActivate=false;
}

cascadeMenu.prototype.menuOver = function (obj,midx,submenuIdx) {
	if (!this.rootClick && !this.menuActivate && this.Rootmidx==midx) {
		this.menuActivate=true;
	}
	if (!this.menuActivate) return;

	// do action
	var currMenuObj=this.menu[midx][submenuIdx];
	if (this.currentMenu!=currMenuObj.index)  {
		this.currentMenu=currMenuObj.index;
		this.showMenu(midx,submenuIdx);
	}
}

cascadeMenu.prototype.menuOut = function (obj,midx,submenuIdx) {
	this.currentMenu=null;
	setTimeout(this.prefix+'.closeAllMenu()',this.delay);
}

cascadeMenu.prototype.menuUp = function (obj,midx,submenuIdx) {
	var currMenuObj=this.menu[midx][submenuIdx];
	var target = (currMenuObj.target!=null && currMenuObj.target!='')? currMenuObj.target : '_self';
	var js=(currMenuObj.link.indexOf('javascript:')==0)?true:false;
	if (currMenuObj.link) {
		if (!js) {
			window.open(currMenuObj.link,target);
		} else {
			eval(currMenuObj.link);
		}
	}
}

cascadeMenu.prototype.menuDown = function (obj,midx,submenuIdx) {
	if (this.rootClick && !this.menuActivate && this.Rootmidx==midx) {
		this.menuActivate=true;
		this.menuOver(obj,midx,submenuIdx);
	}
}

cascadeMenu.prototype.addAction = function (midx,submenuIdx) {
	if (this.menu[midx][submenuIdx].id==null) return;

	var currMenuObj=this.menu[midx][submenuIdx];

	// define mouseover/mouseout action for changing background colour
	var mouseoverAction='style.cursor=\'default\';this.className=\''+this.css+'_Menu_hover\';';
	var mouseoutAction= 'this.className=\'\';';

	if (this.Rootmidx!=midx && currMenuObj.img!==false) {
		mouseoverAction+='document.getElementById(\''+this.prefix+'_img'+currMenuObj.index+'\').className=\''+this.css+'_SubMenu_img_hover\';';
		mouseoutAction+='document.getElementById(\''+this.prefix+'_img'+currMenuObj.index+'\').className=\''+this.css+'_SubMenu_img\';';
	}

	// define mouseover action
	mouseoverAction+= this.prefix+'.menuOver(this,\''+midx+'\',\''+submenuIdx+'\');';

	// define mouseout action
	mouseoutAction+= this.prefix+'.menuOut(this,\''+midx+'\',\''+submenuIdx+'\');';

	// define mouseup action
	var mouseupAction= this.prefix+'.menuUp(this,\''+midx+'\',\''+submenuIdx+'\');';

	// define mousedown action
	var mousedownAction= this.prefix+'.menuDown(this,\''+midx+'\',\''+submenuIdx+'\');';


	var actionHTML='';
	actionHTML+= 'onmouseover="'+ mouseoverAction + '" ';
	actionHTML+= 'onmouseout="' + mouseoutAction + '" ';
	actionHTML+= 'onmouseup="'	+ mouseupAction + '" ';
	actionHTML+= 'onmousedown="'+ mousedownAction + '"';
	return actionHTML;
}
