/********************************************
 * Mouse-event functions                      *
 *******************************************/
var ignoreClick = false;

function globalClickHandler() {
	if (!ignoreClick && anyMenuOpen()) { // is any menu open?
		// close it!
		closeMenu("0");
	}
	// reset for next event
	ignoreClick = false;
}

document.onclick=globalClickHandler;

/********************************************
 * Key-event functions                      *
 *******************************************/
var shortcutArray = new Array();


function registerShortcut(object, shortcutLetter) {
	var arr = shortcutLetter.split("+");
	shortcutLetter=arr[2];
	var index = (shortcutLetter.charCodeAt(0))-65;
	if (index < 0 || index > 24)
		return;
	shortcutArray[index] = object;
}


var NO_KEY 	= 1000;
var KEY_LEFT 	= 1001;
var KEY_UP 	= 1002;
var KEY_RIGHT 	= 1003;
var KEY_DOWN 	= 1004;

function mapCodeToKey(code) {
	if (code == null || code == "")
		return NO_KEY;
	if (code == 37 || code == 57387)
		return KEY_LEFT;
	if (code == 38 || code == 57385)
		return KEY_UP;
	if (code == 39 || code == 57388)
		return KEY_RIGHT;
	if (code == 40 || code == 57386)
		return KEY_DOWN;
	return NO_KEY;
}

function keyhandler(e){
	var menuid="0_0_3";
	var element=getMenuElementById(menuid);
	//window.status=menuid+"/"+element.name+"/"+element.isSelected +" -> "+window.status;
	var kkode = -1;
	var ctrl = false;
	var alt = false;
	if (window.event) {
		kkode = event.keyCode;
		ctrl = (event.ctrlKey || event.ctrlLeft);
		alt = (event.altKey || event.altLeft);
	}
	else {
		kkode = e.which;		
		alt = e.altKey;
		ctrl = e.ctrlKey;
	}

	//alert("ctrl = "+ctrl+", alt = "+alt+", key = "+kkode);
	
	if (ctrl && alt && kkode > 64 && kkode < 91) {
		var handler = shortcutArray[kkode-65];
		if (handler != null && handler != "") {
			handler.handleShortcut();
			closeMenu("0");
		}
	}
	else if(kkode == 27) {
		closeMenu("0");
	}
	else if (kkode == 13 && anyMenuOpen()) {
		handleMouseClick(lastSelected);
	}
	else if(mapCodeToKey(kkode) != NO_KEY) {
		var eventHandled = handleArrow(mapCodeToKey(kkode));
		//window.status=menuid+"/"+element.name+"/"+element.isSelected +" -> "+window.status;
		if(eventHandled && !window.event){
			e.stopPropagation();
			e.preventDefault();
		}
		return !eventHandled;
	}

}
function handleShortcut() {
	switch(this.target.toUpperCase()){
		case "_TOP":
			top.location=this.link;
			return;
		case "_BLANK":
			window.open(this.link);
			return;
		case "":
			document.location=this.link;
			return;
	}	
}

document.onkeydown=keyhandler;


/********************************************
 * Classes                                  *
 *******************************************/
function seperator(){
	this.name="-";
	this.isMenu=false;
	this.isSelected=false;
	this.isEnabled=false;
	this.isSeperator=true;
}

function item(aName,aLink,aTarget,aShortcut,aIcon,aEnabled){
	this.name=aName;
	this.link=aLink;
	this.target=aTarget;
	if (this.target == null)
		this.target = "";
	this.shortcut=aShortcut;
	if(this.shortcut!=null && this.shortcut != "" && aEnabled)
		registerShortcut(this,this.shortcut);
	this.icon=aIcon;

	this.isSelected=false;
	this.isMenu=false;
	this.handleShortcut = handleShortcut;
	this.isEnabled=aEnabled;
}

function menu(aName,aClickToOpen,aShortcut,aIcon){
	this.name=aName;
	this.shortcut=aShortcut;
	this.subItems=new Array();
	this.icon=aIcon;
	this.clickToOpen=aClickToOpen;
	this.isMenu=true;
	this.isSelected=false;
	this.isOpen=false;

}

/********************************************
 * Layer functions                          *
 *******************************************/
function hideLayer(layerId){
	var layer=document.getElementById(layerId);
	layer.style.display="none";
}

function showLayer(layerId){
	var layer=document.getElementById(layerId);
	layer.style.display="";
}

/********************************************
 * Locale functions                         *
 *******************************************/

function anyMenuOpen() {
	topMenu=document.topMenu;
	for(i=0;i<topMenu.subItems.length;i++){
		if (topMenu.subItems[i].isOpen)
			return true;
	}
	return false;
}

function getLeft(element){
    var left = element.offsetLeft;
    while (element.offsetParent.tagName != "BODY") {
	    element = element.offsetParent;
	    left += element.offsetLeft;
    }
    return left;
}

function getTop(element){
    var top = element.offsetTop;
    while (element.offsetParent.tagName != "BODY") {
	    element = element.offsetParent;
	    top += element.offsetTop;
    }
    return top;
}

function getRight(element){
	return getLeft(element)+element.offsetWidth;	
}

function getBottom(element){
	return getTop(element)+element.offsetHeight;
}

function getHeight(element){
	return element.offsetHeight;
}

function getWidth(element){
	return element.offsetWidth;
}

function getMenuElementById(menuId){
	if(menuId==null) return null;
	var idArray=menuId.split("_");
	var item=document.topMenu;
	for(i=1;i<idArray.length;i++){
		item=item.subItems[idArray[i]];
	}
	return item;
}

function getMenuElementByShortcut(shortcut){
	for(i=0;i<subscriptionArray.length;i++){
		if(subscriptionArray[i].shortcut==shortcut)
			return getMenuElementById(subscriptionArray[i].menuId);
	}

}

function openMenu(menuId){
	var parentId=menuId.substring(0,menuId.lastIndexOf("_"));
	var parentIdArray=parentId.split("_");
	var element=getMenuElementById(menuId);
	var layer=document.getElementById("layer_"+menuId);
	var layertable=document.getElementById("layertable_"+menuId);
	var shadowlayer=document.getElementById("shadowlayer_"+menuId);
	var shadowtable=document.getElementById("shadowtable_"+menuId);
	var parentTable=document.getElementById("table_"+menuId);

	if(parentIdArray.length==1)  //if parent is button
	{
		var parentTable=document.getElementById("table_"+menuId);
		var maintable=document.getElementById("table_0");
		
		layer.style.left=getLeft(parentTable);
		layer.style.top=getBottom(maintable);
	}
	else
	{
		layer.style.left=getRight(parentTable);
		layer.style.top=getTop(parentTable);		
		
	}


	layer.style.display="";
	
	//alert(offsetParent);
	//alert(getHeight(layertable));
	shadowlayer.style.left=getLeft(layer)+4;
	shadowlayer.style.top=getTop(layer)+4;
	shadowtable.style.width=getWidth(layertable);
	shadowtable.style.height=getHeight(layertable);
	shadowlayer.style.display="";
	//layer.style.display="none";
	element.isOpen=true;
}

function closeMenu(menuId){
	var fakethreadStateLastSelected = lastSelected;
	var element=getMenuElementById(menuId);
	if (!element.isMenu)
		return;
	//alert("closeMenu("+menuId+")");
	var i;
	for(i=0;i<element.subItems.length;i++){
		//alert("element.subItems["+i+"]");
		if(element.subItems[i].isMenu) {
			//alert("element.subItems["+i+"].isMenu");
			if(element.subItems[i].isOpen){
				//alert("element.subItems["+i+"].isOpen");
				deselectItem(menuId+"_"+i);
				closeMenu(menuId+"_"+i);
				break;
			}
		}
		//alert("element.subItems["+i+"].isSelected == "+element.subItems[i].isSelected);
		//window.status="Check:"+menuId+"_"+i+" =  "+element.subItems[i].isSelected+"/"+element.subItems[i].name+" -> "+window.status;
		//if (element.subItems[i].isSelected) {
		if(element.subItems[i].isEnabled)
			deselectItem(menuId+"_"+i);
		//}
	}
	if (element.isOpen) {
		hideLayer("shadowlayer_"+menuId);
		hideLayer("layer_"+menuId);
		element.isOpen=false;
		//alert(menuId+":isOpen=false");
	}
	lastSelected = fakethreadStateLastSelected;
}

function selectItem(menuId){
	var element=document.getElementById("table_"+menuId);
	var menuitem=getMenuElementById(menuId);

	idarray=menuId.split("_");
	
	if(idarray.length==2)
		element.className="selectedbutton";
	else{
		if(!menuitem.isMenu&&!menuitem.isEnabled){
			element.className="disableditem_selected";
		}
		else
			element.className="enableditem_selected";
	}
	//window.status="selecting "+menuId;
	element.isSelected = true;
	//window.status=menuId+" is selected: "+element.isSelected+" -> "+window.status;
	lastSelected=menuId;
}

function deselectItem(menuId){
	//alert("deselectItem("+menuId+")");
	var element=document.getElementById("table_"+menuId);
	var menuitem=getMenuElementById(menuId);
	
	idarray=menuId.split("_");
	
	if(idarray.length==2)
		element.className="unselectedbutton";
	else{
		//alert("menuitem.isEnabled == "+menuitem.isEnabled);
		if(!menuitem.isMenu&&!menuitem.isEnabled)
			element.className="disableditem";
		else
			element.className="enableditem";
	}

	if (lastSelected!=null)
		lastSelected=lastSelected.substring(0,lastSelected.lastIndexOf("_"));
	if (lastSelected=="0")
		lastSelected=null;
	//window.status="deselecting "+menuId+" -> "+window.status;
	element.isSelected = false;
}

var lastSelected=null;




/********************************************
 * Handling                                 *
 *******************************************/
 
function handleArrow(key) {

	if (!anyMenuOpen())
		return false;


	//window.status = "lastSelected: "+lastSelected;


	// find elemented fra lastSelected
	var myLastSelected = lastSelected;
	var index = -1;
	var oElement = getMenuElementById(myLastSelected);
	var generations = myLastSelected.split("_");
	var parentId = myLastSelected.substring(0,myLastSelected.lastIndexOf("_"));
	var level = generations.length;

	switch(key) {
	
		case KEY_UP:
			if (oElement.isMenu && oElement.isOpen) {
				// select item.length child
				if (oElement.subItems.length > 0)
					selectItem(myLastSelected+"_"+(oElement.subItems.length-1));
			}
			else {
				
				// find mit index ud fra menuId
				index = Number(generations[generations.length-1]);
		
				do{
					// træk en fra mit index
					index -= 1;
					var parent = getMenuElementById(parentId);
					if (index < 0)
						index = parent.subItems.length-1;
				}while(getMenuElementById(parentId+"_"+index).name=="-");
				// deselect mig selv
				deselectItem(myLastSelected);
				// select index hos min far's børn
				selectItem(parentId+"_"+index);
			}
		break;
		
		case KEY_DOWN:
			if (oElement.isMenu && oElement.isOpen) {
				// select item index 0 child
				if (oElement.subItems.length > 0)
					selectItem(myLastSelected+"_0");
			}
			else {
				// find mit index ud fra menuId
				index = Number(generations[generations.length-1]);
				do{
					// plus en fra mit index
					index += 1;
					var parent = getMenuElementById(parentId);
					if (index > parent.subItems.length-1)
						index = 0;
				}while(getMenuElementById(parentId+"_"+index).name=="-");
				// deselect mig selv
				deselectItem(myLastSelected);
				// select index hos min far
				selectItem(parentId+"_"+index);
			}
		break;
		
		case KEY_LEFT:
			if (level == 2) {
				index = Number(generations[1]);
				index --;
				if (index < 0)
					index = topMenu.subItems.length-1;
				deselectItem(myLastSelected);
				closeMenu(myLastSelected);
				openMenu("0_"+index);
				selectItem("0_"+index);
			}
			else if (level == 3) {
				// lav index = fars id
				index = Number(generations[1]);
				index -= 1;
				if (index < 0)
					index = topMenu.subItems.length-1;
				// luk og deselect oElement
				closeMenu(parentId);
				deselectItem(parentId);
				// åben og select farfars.børn[index]
				openMenu("0_"+index);
				selectItem("0_"+index);
				// vælg min ældste fætter
				if (getMenuElementById("0_"+index).subItems.length > 0)
					selectItem("0_"+index+"_0");
			}
			else {
				closeMenu(parentId);
				selectItem(parentId);
			}
		break;
		
		case KEY_RIGHT:
			if (level == 2) {
				index = Number(generations[1]);
				index ++;
				if (index > topMenu.subItems.length-1)
					index = 0;
				deselectItem(myLastSelected);
				closeMenu(myLastSelected);
				openMenu("0_"+index);
				selectItem("0_"+index);
			}
			else if (oElement.isMenu) {
				openMenu(myLastSelected);
				if (oElement.subItems.length > 0)
					selectItem(myLastSelected+"_0");
				
			}
			else {
				var level2 = Number(generations[1]);
				// lav index = level2 id
				index = level2;
				index ++;
				if (index > topMenu.subItems.length-1)
					index = 0;
				// luk og deselect level2
				closeMenu("0_"+level2);
				deselectItem("0_"+level2);
				// åben og select topMenu.børn[index]
				openMenu("0_"+index);
				selectItem("0_"+index);
				// select topMenu.børn[index].børn[0]
				if (getMenuElementById("0_"+index).subItems.length > 0)
					selectItem("0_"+index+"_0");
				//window.status="level";
			}
		break;
	}
	
	return true;
}

function handleMouseMove(menuId){
	var arr = menuId.split("_");
	var level = arr.length;
	if (level == 2) {
		if (lastSelected != null && arr[1] != lastSelected.split("_")[1]) {
			handleMouseOut(lastSelected);
			handleMouseOver(menuId);
		}
	}
	else if(menuId!=lastSelected) {
		if (lastSelected!= null)
			handleMouseOut(lastSelected);
		handleMouseOver(menuId);
	}
} 

function handleMouseOver(menuId){
	var element=getMenuElementById(menuId);
	var i;
	var lastSelectedWasOpen=false;
	
	if(!element.isSeperator){
		if(lastSelected!=null){
			oldIdArray=lastSelected.split("_");
			newIdArray=menuId.split("_");	

			// hvis oldId var på samme nivau eller længere ude i træet
			if(oldIdArray.length>=newIdArray.length){
				var sharedId="0";
				for(i=1;i<newIdArray.length;i++){
					if(newIdArray[i]==oldIdArray[i])
						sharedId=sharedId+"_"+newIdArray[i];
					else{
						var idToClose=sharedId+"_"+oldIdArray[i];
						var oldElement=getMenuElementById(idToClose);
						if(oldElement.isMenu){
							if(oldElement.isOpen)
								lastSelectedWasOpen=true;
							//alert(idToClose);
							closeMenu(idToClose);
							deselectItem(idToClose);
							
						}
						break;
					}
					
				}
			}
		}	
		selectItem(menuId);
		
		if(element.isMenu&&(!element.clickToOpen||lastSelectedWasOpen)){
			openMenu(menuId);
		}
	}

	//window.status="Mouseover("+menuId+")";
}

function handleMouseOut(menuId){
	var element=getMenuElementById(menuId);
	if(element.isSeperator || menuId != lastSelected || (element.isMenu && element.isOpen)){}
	else	
		deselectItem(menuId);

	//window.status="Mouseout("+menuId+")";
}

function handleMouseClick(menuId){
	ignoreClick = true;
	var element=getMenuElementById(menuId);

	if(element.isMenu){
		if(element.isOpen){
			if(element.clickToOpen){
				//deselectItem(menuId);
				closeMenu(menuId);
				element.isOpen=false;
			}
		}
		else{
			if(element.clickToOpen){
				openMenu(menuId);
				element.isOpen=true;
			}
		}
	}
	else{
		if(element.isEnabled){
			switch(element.target.toUpperCase()){
				case "_TOP":
					top.location=element.link;
					break;
				case "_BLANK":
					window.open(element.link);
					break;
				case "":
					document.location=element.link;
					break;
				
			}
			closeMenu("0");
		}
	}
	
	//window.status="Mouseclick("+menuId+")";
}


/********************************************
 * Create functions                         *
 *******************************************/
function createSubitems(rootId,arrayOfItems){
	var e;
	var menuId;
	var tablesettings;
	//alert(rootId);
	document.write("<div style=\"position:absolute;display:none;z-index:5;\" id=layer_"+rootId+">");
	document.write("<table class=menutable cellpadding=0 cellspacing=0 id=layertable_"+rootId+"><tr><td>");
	for(e=0;e<arrayOfItems.length;e++){
		menuId=rootId+"_"+e;

		//Start writing the start of the table
		if(!arrayOfItems[e].isMenu&&!arrayOfItems[e].isEnabled){
			if(arrayOfItems[e].name=="-"){		//seperator
				tablesettings="height=1 class=menuseperator cellpadding=0";
			}
			else{					//disabled item
				tablesettings="cellpadding=3 class=disableditem";
			}
		}
		else{
			tablesettings="cellpadding=3 class=enableditem";
		}

		document.write("<table width=100% onmousemove=\"handleMouseMove('"+menuId+"')\" onclick=\"handleMouseClick('"+menuId+"');\" onmouseover=\"handleMouseOver('"+menuId+"');\" onmouseout=\"handleMouseOut('"+menuId+"');\" "+tablesettings+" id=table_"+menuId+" cellspacing=0><tr>");

		if(arrayOfItems[e].name=="-")
			document.write("<td colspan=3><img src=/gfx/1x1.gif border=0>");		
		else{

			document.write("<td width=20>");

			if(arrayOfItems[e].icon != null && arrayOfItems[e].icon != "")
				document.write("<img width=16 height=16 src=\""+arrayOfItems[e].icon+"\" border=\"0\" / >");
			else
				document.write("<img src=\"/gfx/1x1.gif\" border=\"0\" / >");

			document.write("</td><td nowrap>");
			document.write(arrayOfItems[e].name);

			if(!arrayOfItems[e].isMenu && arrayOfItems[e].target != null && arrayOfItems[e].target.toUpperCase() == "_BLANK")
				document.write("...");

			document.write("</td><td width=60 align=right><font class=menushortcut>"+(arrayOfItems[e].isMenu?"->":arrayOfItems[e].shortcut)+"</font></td>");
		}
		document.write("</td></tr></table>");
	}
	document.write("</td></tr></table>");
	document.write("</div>");

	//shadow div
	var parentDiv=document.getElementById("layer_"+rootId);
	//alert(getWidth(parentDiv));
	document.write("<div style=\"position:absolute;display:none;filter:alpha(opacity=40);-moz-opacity: .4;z-index:4;\" id=shadowlayer_"+rootId+">");
	//document.write("<table id=shadowtable_"+rootId+" width="+getWidth(parentDiv)+" height="+getHeight(parentDiv)+" bgcolor=#000000><tr><td><img src=/gfx/1x1.gif></td></tr></table>");
	document.write("<table id=shadowtable_"+rootId+" width=100% height=100% bgcolor=#000000><tr><td><img src=/gfx/1x1.gif></td></tr></table>");
	document.write("</div>");

	for(e=0;e<arrayOfItems.length;e++){
		if(arrayOfItems[e].isMenu){
			createSubitems(rootId+"_"+e,arrayOfItems[e].subItems);
		}
	}
}

function createMenu(){
	var rootId="0";
	var menuId;
	topMenu=document.topMenu;
	document.write("<table width=100% class=maintable id=table_"+rootId+" cellpadding=0 cellspacing=0><tr><td>");
	document.write("<table cellpadding=3 cellspacing=0><tr>");
	for(i=0;i<topMenu.subItems.length;i++){
		menuId=rootId+"_"+i;
		document.write("<td><table class=unselectedbutton id=table_"+menuId+" cellpadding=0 cellspacing=0><tr><td valign=center align=center onmousemove=\"handleMouseMove('"+menuId+"')\" onclick=\"handleMouseClick('"+menuId+"');\" onmouseover=\"handleMouseOver('"+menuId+"');\" onmouseout=\"handleMouseOut('"+menuId+"');\">");
		document.write(topMenu.subItems[i].name);
		document.write("</td></tr></table>");
		if(topMenu.subItems[i].isMenu)
			createSubitems(menuId,topMenu.subItems[i].subItems);
		document.write("</td>");
	}
	document.write("</tr></table>");
	document.write("</td></tr></table>");
	//alert(document.body.innerHTML);
}