/* Class Menu

constructor: Menu(containerID:String, contentWindow:Window, menuCSSClass:String, hasSubmenuCSSClass:String)
 @containerID:String - id of a html element which contains menu
 @contentWindow:Window - window object where html doca are displayed
 @menuCSSClass - CSS class applied to unordered list <ul> which renders menu
 @hasSubmenuCSSClass:String - CSS classs applied to <li> element that has submenu attached
 
 */

function Menu(containerID,contentWindow,menuCSSClass, hasSubmenuCSSClass) {
	this.parent=containerID;
	this.mainMenu=this;
	this.containerID=containerID;
	this.menuContainer=getRawObject(containerID);
	this.contentWindow=contentWindow;
	this.menuCss=menuCSSClass;
	this.hasSubmenuCss=hasSubmenuCSSClass;
	/* array, contains associative arrays with each menu item data 
	{itemID,itemObj,itemPicNormal,itemPicRollover,targetHTML,itemSubmenu} */
	this.menuItems=new Array(); 
	/* associative array, keys are menu elements ids, values are appearance order indexes */
	this.menuItemsPos=new Array();
	this.numOfItems=0;
	this.currentlySelected=null; /* menu element id */
	this.currentlySelectedPos=null; /* menu element position*/
}

function addMenuItem(itemPicNormal,itemPicRollover,targetHTML) {
	var tempItemID;
	
	tempItemID=this.parent+'_'+this.numOfItems;
	this.menuItemsPos[tempItemID]=this.numOfItems;
	this.menuItems[this.numOfItems]=new Array();
	this.menuItems[this.numOfItems]["itemID"]=tempItemID;
	this.menuItems[this.numOfItems]["itemObj"]=null;
	this.menuItems[this.numOfItems]["itemPicNormal"]=new Image();
	this.menuItems[this.numOfItems]["itemPicNormal"].src=itemPicNormal;
	this.menuItems[this.numOfItems]["itemPicRollover"]=new Image();
	this.menuItems[this.numOfItems]["itemPicRollover"].src=itemPicRollover;
	this.menuItems[this.numOfItems]["targetHTML"]=targetHTML;
	this.menuItems[this.numOfItems]["itemSubmenu"]=null;
	this.numOfItems++;
	
}

function createSubmenu(itemNum,menuCSSClass,hasSubmenuCSSClass) {
	var newSubmenu;
	newSubmenu= new Menu(this.containerID,this.contentWindow,menuCSSClass,hasSubmenuCSSClass);
	this.menuItems[itemNum]["itemSubmenu"]=newSubmenu;
	newSubmenu.setParent(this.menuItems[itemNum]["itemID"],this);
	return newSubmenu;
}

function setParent(parentItemID,mainmenu) {
	this.parent=parentItemID;
	this.mainMenu=mainmenu;
}

function getRenderString() {
	var rStr="";
	var itemID;
	rStr='<ul class="'+this.menuCss+'">';
	for (var i=0; i< this.numOfItems; i++) {
		itemID=this.menuItems[i]["itemID"];
		if (i==this.currentlySelectedPos) {
			if (this.menuItems[i]["itemSubmenu"]!=null && this.currentlySelected==this.menuItems[i]["itemID"]) {
				rStr+='<li class="'+this.hasSubmenuCss+'">';
			} else {
				rStr+='<li>';				
			}
			rStr+='<img src="'+this.menuItems[i]["itemPicRollover"].src+'" name="'+itemID+'" id="'+itemID+'" style="cursor: pointer;"></li>'
		} else {
			if (this.menuItems[i]["itemSubmenu"]!=null && this.currentlySelected==this.menuItems[i]["itemID"]) {
				rStr+='<li class="'+this.hasSubmenuCss+'">';
			} else {
				rStr+='<li>';				
			}
			rStr+='<img src="'+this.menuItems[i]["itemPicNormal"].src+'" name="'+itemID+'" id="'+itemID+'" style="cursor: pointer;"></li>';
		}
		if (this.menuItems[i]["itemSubmenu"]!=null && this.currentlySelected==this.menuItems[i]["itemID"]) {
			rStr+=this.menuItems[i]["itemSubmenu"].getRenderString();
		}
	}
	rStr+='</ul>';
	return rStr;
}


function outputMenu() {
	var containerObj;
	var subMenuObj;
	containerObj=getRawObject(this.containerID);
	containerObj.innerHTML =this.getRenderString();
	this.setItemObjects();
	this.initFunctionality();	
} 

function setItemObjects() {
	var subMenuObj;
	
	for (var i=0; i< this.numOfItems; i++) {
		this.menuItems[i]["itemObj"]=getRawObject(this.menuItems[i]["itemID"]);
		if (i==this.currentlySelectedPos) {
			subMenuObj=this.menuItems[i]["itemSubmenu"];
			if (subMenuObj!=null) {
				subMenuObj.setItemObjects();
			}
		}
	}
}

function setSelectedMenu(menuItemPos) {
	if (this.currentlySelectedPos!=null) {
		if (this.menuItems[this.currentlySelectedPos]["itemSubmenu"]!=null) {
			this.menuItems[this.currentlySelectedPos]["itemSubmenu"].currentlySelected=null;
			this.menuItems[this.currentlySelectedPos]["itemSubmenu"].currentlySelectedPos=null;
		}
	}
	this.currentlySelected=this.menuItems[menuItemPos]["itemID"];
	this.currentlySelectedPos=menuItemPos;
	if (this.menuItems[menuItemPos].targetHTML!="") {
			this.contentWindow.location.href=this.menuItems[menuItemPos].targetHTML;
	}
}

function setSubmenuItem(submenuItemPos) {
	var currentMenu;
	var previousMenu;
	var itemPos;
	
	currentMenu=this;
	previousMenu=null;
	
	for (var i=0; i<submenuItemPos.length; i++) {
		itemPos=submenuItemPos[i];
		if (currentMenu==null) {
			previousMenu.setSelectedMenu(previousMenu.currentlySelectedPos);
			return;
		}
		if (itemPos<currentMenu.numOfItems) {
			currentMenu.currentlySelectedPos=itemPos;
			currentMenu.currentlySelected=currentMenu.menuItems[itemPos]["itemID"];
			previousMenu=currentMenu;
			currentMenu=currentMenu.menuItems[itemPos]["itemSubmenu"];
		} else {
			break;
		}
	}
	if (previousMenu!=null) {
		previousMenu.setSelectedMenu(previousMenu.currentlySelectedPos);
	}
}


function initFunctionality() {
	var menuObj;
	menuObj=this;
	
	function menuItemPress() {
		var menuItemPos;
		menuItemPos=menuObj.menuItemsPos[this.name];
		
		/* if pressed menu item is not selected */ 
		if (menuObj.currentlySelected!=this.name) {
			menuObj.setSelectedMenu(menuItemPos);
			menuObj.mainMenu.outputMenu();
		}
	}
	
	function menuItemRollOver() {
		var menuItemPos;
		menuItemPos=menuObj.menuItemsPos[this.name];
		
		if (menuObj.currentlySelected!=this.name) {
			menuObj.menuItems[menuItemPos]["itemObj"].src=menuObj.menuItems[menuItemPos]["itemPicRollover"].src;
		}
	}
	
	function menuItemRollOut() {
		var menuItemPos;
		menuItemPos=menuObj.menuItemsPos[this.name];
		
		if (menuObj.currentlySelected!=this.name) {
			menuObj.menuItems[menuItemPos]["itemObj"].src=menuObj.menuItems[menuItemPos]["itemPicNormal"].src;
		}
	}

	for (var menuItem in this.menuItems) {
		menuObj.menuItems[menuItem]["itemObj"].onclick=menuItemPress;
		menuObj.menuItems[menuItem]["itemObj"].onmouseover=menuItemRollOver;
		menuObj.menuItems[menuItem]["itemObj"].onmouseout=menuItemRollOut;
		if (menuItem == menuObj.currentlySelectedPos && menuObj.menuItems[menuItem]["itemSubmenu"]!=null) {
			menuObj.menuItems[menuItem]["itemSubmenu"].initFunctionality();
		}
	}	
}

Menu.prototype.addMenuItem=addMenuItem;
Menu.prototype.setSelectedMenu=setSelectedMenu; /* private */
Menu.prototype.initFunctionality=initFunctionality; /* private */
Menu.prototype.getRenderString=getRenderString; 
Menu.prototype.createSubmenu=createSubmenu;
Menu.prototype.setParent=setParent; /* private */
Menu.prototype.setSubmenuItem=setSubmenuItem;
Menu.prototype.outputMenu=outputMenu;
Menu.prototype.setItemObjects=setItemObjects; /* private */
