//Ændret 07-04-2003; CRN
//- Menuen får 'visibility: hidden', indtil den er indlæst.
//Ændret 09-04-2003; CRN
//- Menuen måler tilgængelig bredde og højde og "popper" til den side hvor der er plads (SetPosition()).
//Ændret 22-09-2003; FLJ
//- Indarbejdet en mekanisme som muliggør at der i menustrukturen (på serveren) kan angives hvor brede
//  de enkelte menupunkter skal være i pixels. Default er stadig, at menupunkterne er lige store og
//  (det er nyt), at det automatisk beregnes hvor brede de skal være i forhold til en udrulningsbrede
//  på 572 pixels divideret med antallet af toplevel-menupunkter i menustrukturen.
//  Bemærk, at disse ændringer kun er gennemført 100% for menutyperne 1 og 4 (top- og bund-menu)!


//Parametre
var GMmenunavn,GMmenubundlinie,GMmenupil,GMmenudegradeurl,GMmenuSpacing,GMmenuElementWidthArr,GMmenuDefaultSelected,GMmenutype;

function GMisNotNull(o) {
	var r = (typeof o == "undefined") ? null : o;
	return r;
}

function GMisIdentical(a,b) {
	var r = (a == b) ? true : false;
	return r;
}

function GMhideMenu(t) {
	//t=1: menu; t=2: submenu
	if (t == 1) {
		GMpagemenu.activemenu.style.display = "none";
		GMpagemenu.activemenu = null;
		GMtoggleTheElements("visible");
	}
	else if (t == 2) {
		GMpagemenu.activesubmenu.style.top = "0px";
		GMpagemenu.activesubmenu.style.display = "none";
		//Fjerner alle A-elementer i submenu
		var m_as = GMpagemenu.activesubmenu.getElementsByTagName("A");
		for (var i = 0; i < m_as.length; i++) {
			m_as[i].style.top = "0px";
			m_as[i].style.display = "none";
			m_as[i].style.visibility = "hidden";
		}
		GMpagemenu.activesubmenu = null;
	}
}

function GMresetTimeout() {
	if (GMtimeout != null) {
		clearTimeout(GMtimeout);
		GMtimeout = null;
	}
}

function GMcontains(a, b) {
	// Return true if node a contains node b.
	if (b) { //-for at forhindre fejl
		while (b.parentNode) {
			if ((b = b.parentNode) == a) {
				return true;
			}
		}
	}
	return false;
}

function GMtoggleTheElements(val) {
	for (var i = 0; i < GMpagemenu.comboboxes.length; i++) {
		GMpagemenu.comboboxes[i].style.visibility = val;
	}
	for (var i = 0; i < GMpagemenu.iframes.length; i++) {
		GMpagemenu.iframes[i].style.visibility = val;
	}
}

function GMSetPosition(elem,elTop) {
	var vpdata = "Window data:";
	  // Adjust position to fit in view.
	  // En del af koden er fra http://brainjar.com/dhtml/menubar/default9.asp (Mike Hall), hvor der også findes uddybende beskrivelser
  var maxX, maxY;
  if (window.event) {
    maxX =
      (document.documentElement.scrollLeft   != 0 ?
         document.documentElement.scrollLeft
       : document.body.scrollLeft)
    + (document.documentElement.clientWidth  != 0 ?
       document.documentElement.clientWidth
       : document.body.clientWidth);
    maxY =
      (document.documentElement.scrollTop    != 0 ?
       document.documentElement.scrollTop
       : document.body.scrollTop)
    + (document.documentElement.clientHeight != 0 ?
       document.documentElement.clientHeight
       : document.body.clientHeight);
  }
  else {
    maxX = window.scrollX + window.innerWidth;
    maxY = window.scrollY + window.innerHeight;
  }
	if (GMmenutype == 1) { //Top-menu
		maxY -= elem.parentNode.offsetHeight;
		//Vi beregner tilgængelig bredde og skubber menuen til venstre, hvis der ikke er plads til højre
		var elParentId = GMpagemenu.activemenu.id;
		//alert(elParentId);
		var elOffsetWidth = ((elem.previousSibling.offsetWidth) + (elem.previousSibling.offsetWidth * (parseInt(elParentId.substr(4,elParentId.length))-1)));
		//Vi skyder menuen til venstre, hvis der ikke er plads til højre
		if (elOffsetWidth > maxX-20) {
			elem.style.left = "-" + elem.previousSibling.offsetWidth + "px";
//			elem.style.zIndex = -5000;
		}
	}
	else {
		var id = GMpagemenu.activemenu.id;
		var h = (elem.parentNode.offsetHeight * (parseInt(id.substr(4,id.length))));
		maxY -= h;
		//alert(GMpagemenu.activemenu.id)
	}
	//Vi beregner tilgængelig højde og skubber menuen opad, hvis der ikke er plads i bunden
	var elId = String(elem.id);
	var elOffsetHeight = ((elem.offsetHeight) + (elem.parentNode.offsetHeight * parseInt(elId.substr(5,elId.length))));
	var diff = 0;
//		alert(elem.parentNode.offsetHeight)
	if (elOffsetHeight > maxY) {
		diff = (elOffsetHeight - maxY);
		if (GMmenutype != 1) //Det er ikke menu i toppen
			diff -= (elem.parentNode.offsetHeight*2); //Jeg er ikke helt sikker på, at det her er rigtigt - men det virker :-)
	}
	elem.style.top = (elTop - diff) + "px";
}


var GMrunthrough = 0;
var GMsublev = 0;
var GMpreanchor = null;
var GMtimeout = null;
var GMtemp_child = null;

//Global closer-funktion
//Levels: 0=all,1=main,2=sub
function GMcloseMenu(a) {
	if (GMtimeout != null) {
		var current = a[0];
		var related = a[1];
		var elem = a[2];
		var level = a[3];
		if (elem.tagName == "A") {
			var nextsibling = elem.nextSibling;
			var childel = (GMisNotNull(nextsibling) && GMisIdentical(nextsibling.nodeName,"UL")) ? nextsibling : null;
			if (level == 1) {
				if (GMisNotNull(GMpagemenu.activemenu)) {
					if (GMpagemenu.activemenu != childel || !GMcontains(GMpagemenu.menuel,related)) {
						GMhideMenu(level);
					}
				}
			}
			else if (level == 2) {
				if (GMisNotNull(GMpagemenu.activesubmenu)) {
					if (!GMisIdentical(GMpagemenu.activesubmenu,childel)) {
						GMhideMenu(level);
					}
				}
			}

		}
		else if (elem.tagName == "UL") {
			if (level == 1) {
				if (GMisNotNull(GMpagemenu.activemenu) && (!GMcontains(GMpagemenu.activemenu,related) && !GMisIdentical(GMpagemenu.activemenu,related))) {
					if (!GMisIdentical(GMpagemenu.activemenu.previousSibling,related)) {
						GMhideMenu(level);
					}
					if (GMisNotNull(GMpagemenu.activesubmenu)) {
						GMhideMenu(level + 1);
					}
				}
			}
		}
		GMresetTimeout();
	}
}

function GMsetCurrentRelated(ev) {
	if (window.event) {
		GMcurrent = this;
		GMrelated = window.event.toElement;
	}
	else {
		GMcurrent = ev.currentTarget;
		GMrelated = ev.relatedTarget;
	}
}

var GMcurrent, GMrelated;

	// Lukker hovedmenu
function GMdoClose(event) {
	GMsetCurrentRelated(event);
	aCloseValues = [GMcurrent,GMrelated,this,1];
	GMtimeout = setTimeout("GMcloseMenu(aCloseValues)",600);
	return false;
}


var GMtotalMenuWidth = 572;
var GMparsingDone = false;
var GMmenuElementCount = 0;
var GMmenuElementWidth = -1;


function GMparseMenu(el) {
	var remainder;

	if (GMparsingDone)
		return;
	GMparsingDone = true;
	// Determine the number of toplevel menuelements
	for (var i = 0; i < el.childNodes.length; i++) {
		var child = el.childNodes[i];
		if (child.nodeType != 1) continue;
		if (child.tagName == 'LI') {
			GMmenuElementCount++;
		}
	}
	
	// Calculate the width (in pixels) of the individual toplevel menuelements,
	// based on the number of toplevel menuelements.
	if (GMmenuElementCount > 0){
		if ((GMmenuElementWidthArr.length != 0) && ((GMmenuElementWidthArr.length != GMmenuElementCount))){
			alert("Du har angivet nogle specifikke bredder på menuelementerne i menudefinitionen (.XML fil),\nmen du har ikke angivet en bredde (width-attribut) på ALLE (topniveau-) elementer i menudefitionen!\nMed andre ord: enten skal der slet ikke angives nogle bredder, eller også skal de sættes på ALLE menupunkterne.\Fix dette og prøv igen.");
			return;
		}
		if (GMmenuElementWidthArr.length > 0){
			// There is already an definition of the length of the individual toplevel menuelements.
			// Validate it!
			var sum = 0;
			for (var x = 0; x < GMmenuElementWidthArr.length; x++){
				sum += GMmenuElementWidthArr[x];
			}
			if (GMmenuSpacing > 0){
				sum += (GMmenuSpacing * (GMmenuElementCount - 1));
			}
			if (sum != GMtotalMenuWidth){
				alert("Du har angivet nogle specifikke bredder på menuelementerne i menudefinitionen (.XML fil),\nmen summen af bredderne giver " + sum + " pixels, hvor designet foreskriver at det skal fylde " + GMtotalMenuWidth + " pixels.\nTilpas størrelserne i menudefinitionen og prøv igen.\nBemærk, at summen kan være inklusive evt. mellemrum imellem menupunkterne, angivet i variablen menuSpacing.");
				return;
			}
		}
		else{
			if (GMmenuSpacing == 0) {
				GMmenuElementWidth = parseInt(GMtotalMenuWidth / GMmenuElementCount);
				remainder = parseInt(GMtotalMenuWidth - (GMmenuElementCount * GMmenuElementWidth));
			}
			else{
				GMmenuElementWidth = parseInt((GMtotalMenuWidth - ((GMmenuElementCount - 1) * GMmenuSpacing)) / GMmenuElementCount);
				remainder = parseInt(GMtotalMenuWidth - ((GMmenuElementCount * GMmenuElementWidth) + ((GMmenuElementCount - 1) * GMmenuSpacing)));
			}
			for (var x = 0; x < GMmenuElementCount; x++){
				GMmenuElementWidthArr[x] = GMmenuElementWidth;
			}
			// If the sum of the menuelements width in pixels does not match the value of the
			// variable "GMtotalMenuWidth", add the remainder to the last menuelement to ensure alignment.
			if (remainder != 0){
				GMmenuElementWidthArr[GMmenuElementCount - 1] += remainder;
			}
		}
	}
}

function GMInitializeMenu(el,lev,prelev,conti) {
	GMparseMenu(el);
	for (var i = 0; i < el.childNodes.length; i++) {
		var child = el.childNodes[i];
		if (child.nodeType != 1) continue;
		if (child.tagName == 'LI' && lev == 0) {
			if (GMmenutype == 1 || GMmenutype == 4) { //Top eller bund
				var leftPos = 0;
				for (var zz = 0; zz < GMrunthrough; zz++){
					leftPos += GMmenuElementWidthArr[zz];
					if (zz < GMrunthrough)
						leftPos += GMmenuSpacing;
				}
				child.style.left = leftPos + "px";
				//child.style.left = (GMrunthrough * (GMmenuElementWidthArr[GMrunthrough] + GMmenuSpacing)) + "px";
				child.style.width = GMmenuElementWidthArr[GMrunthrough] + "px";
			}
			else {//Højre eller venstre
				child.style.top = (GMrunthrough * GMmenuhoejde) + "px";
			}
		}
		if (child.tagName == 'A') {
			if (lev == 1) {
				child.id = 'GMmenulink' + String(++GMrunthrough);
				if (GMmenuDefaultSelected == GMrunthrough)
				{
					child.className = 'appMenuActive';
				}
				else
				{
					child.className = 'appMenu';
				}
				child.onmouseover = function(event) {
					GMresetTimeout();
					if (GMisNotNull(GMpagemenu.activemenu) && !GMisIdentical(this.nextSibling,GMpagemenu.activemenu)) {
						GMsetCurrentRelated(event);
						aCloseValues = [GMcurrent,GMrelated,this,1];
						GMtimeout = GMsetTimeout("GMcloseMenu(aCloseValues)",600);
					}
					if (GMisNotNull(GMpagemenu.activesubmenu)) {
						//Måske problem her??
						GMhideMenu(2);
					}
					return false;
				}
				child.onmouseout = GMdoClose;
			}
			if (lev == 2) {
				child.onmouseover = function(event) {
					GMresetTimeout();
					GMsetCurrentRelated(event);
					aCloseValues = [GMcurrent,GMrelated,this,2];
					GMtimeout = setTimeout("GMcloseMenu(aCloseValues)",0);
					return false;
				}
				GMsublev++;
			}
			else if (lev > 2) {
				child.onmouseover = function(event) {
					GMresetTimeout();
				}
			}
			preanchor = child;
		}
		if (child.tagName == 'UL') {
			if (lev != 0) {
				if (lev == 1) {
					child.id = 'GMmenu' + String(GMrunthrough);
					child.className = 'appMenuSubmenu';
					if (GMisNotNull(GMmenubundlinie)) preanchor.style.borderBottom = GMmenubundlinie;
					if (GMmenuopenevent == 1)
					{
						preanchor.onmouseover = function(event)
						{
							// Af hensyn til performance - her hentes resten - men kun første gang (LTN: 22-07-2003)
							if (!child.isInitialized)
							{
								GMrunthrough = 0;
								GMsublev = 1;

								GMInitializeMenu(child,1,1,0);
								child.isInitialized = true;
							}
						};
						preanchor.onclick = function(event)
						{
							GMresetTimeout();
							if (!child.isInitialized)
							{
								return;
							}
							if (GMisNotNull(GMpagemenu.activemenu) && !GMisIdentical(this.nextSibling,GMpagemenu.activemenu)) {
								GMhideMenu(lev);
							}
							var el = this.nextSibling;
							GMtoggleTheElements("hidden");
							el.style.display = "block";
							if (GMmenutype == 1 || GMmenutype == 4) { //Top eller bund
								//el.style.top = "0px";
								el.style.left = "-1px";
								var idxStr = el.id;
								var idx = parseInt(idxStr.substr(6,255));
								el.style.width = GMmenuElementWidthArr[idx - 1] + "px";
								//el.style.width = GMmenuElementWidthArr[0] + "px";
							}
							else { //Højre eller venstre
								el.style.left = "100%";
								el.style.top = "0px";
								el.style.width = "100%";
							}
							el.style.marginLeft = "0px";
							el.style.paddingLeft = "0px";
							GMpagemenu.activemenu = el;
							return false;
						};
						child.onmouseout = GMdoClose;
					}
					if (GMmenuopenevent == 2)
					{
						preanchor.onmouseover = function(event)
						{
							// Af hensyn til performance - her hentes resten - men kun første gang (LTN: 22-07-2003)
							if (!child.isInitialized)
							{
								GMrunthrough = 0;
								GMsublev = 1;
								
								GMInitializeMenu(child,1,1,0);
								child.isInitialized = true;
							}
								
							GMresetTimeout();
								
							if (!child.isInitialized)
							{
								return;
							}
														
							if (GMisNotNull(GMpagemenu.activemenu) && !GMisIdentical(this.nextSibling,GMpagemenu.activemenu)) {
								GMhideMenu(lev);
							}
							var el = this.nextSibling;
							GMtoggleTheElements("hidden");
							el.style.display = "block";
							if (GMmenutype == 1 || GMmenutype == 4) { //Top eller bund
								el.style.left = "0px";
							}
							else { //Højre eller venstre
								el.style.left = "100%";
								el.style.top = "0px";
							}
							el.style.width = "100%";
							el.style.marginLeft = "0px";
							el.style.paddingLeft = "0px";
							GMpagemenu.activemenu = el;
							return false;
						};
						child.onmouseout = GMdoClose;
					}
				}
				else {
					child.id = 'GMmenu' + String(GMrunthrough) + String(GMsublev-1);
					//child.id = 'GMmenu' + String(GMsublev-1);
					
					//Pil
					if (GMisNotNull(GMmenupil)) {
						preanchor.style.backgroundImage = "url('" + GMmenupil + "')";
						preanchor.style.backgroundRepeat = "no-repeat";
						preanchor.style.backgroundPosition = "99% 50%";
					}
					//Slut på pil
					
					preanchor.onmouseover = function(event) {
						GMresetTimeout();
						var el = this.nextSibling;
						GMtoggleTheElements("hidden");
						if (GMisNotNull(GMpagemenu.activesubmenu) && !GMisIdentical(GMpagemenu.activesubmenu,el)) {
							//Måske problem her??
							GMhideMenu(2);
						}
						GMpagemenu.activesubmenu = el;
						var m_as = GMpagemenu.activesubmenu.getElementsByTagName("A");
						for (var i = 0; i < m_as.length; i++) {
							m_as[i].style.display = "block";
							m_as[i].style.visibility = "visible";
						}
						var m_id = el.id
						var tmpdepth = parseInt(String(m_id).substr(6,m_id.length))-1;
						var m_top = (tmpdepth*(GMmenuhoejde+2));

						// Et eller andet virker anderledes i IE!?!?!? (LTN: 23-07-2003)
						if (GMmenutype == 1)
							if (window.event)
								m_top = (tmpdepth*(GMmenuhoejde));
						
						//Sikkert ikke nødvendig
						/*if (GMmenutype == 2 || GMmenutype == 3) //Højre eller venstre
							m_top = (tmpdepth*(GMmenuhoejde+2));*/
						el.style.top = this.parentNode.offsetHeight + "px";//"0px";
						el.style.left = this.offsetWidth + "px";/*TIL HØJRE FOR PARENT*/
						el.style.position = "absolute";
						el.style.display = "block";
						el.style.visibility = "hidden";
						GMSetPosition(el,m_top); //Sætter top og left i forhold til window-size
						el.style.visibility = "visible";
						//IE-hack
						if(window.event) el.parentElement.style.display = "inline";
						return false;
					};
				}
			}

			// stop af hensyn til performance - kun første niveau hentes (LTN: 22-07-2003)			
			if (conti == 1)
			{
				continue;
			}
		}
		if (child.hasChildNodes()) {
			var newlev = lev;
			if (GMisIdentical(child.tagName,'LI')) {
				newlev = lev + 1; //Vi tæller toplevel op
				if (!GMisIdentical(lev,prelev)) {
					GMsublev = 1; //Vi skal starte forfra på sublevels
				}
			}
			GMInitializeMenu(child,newlev,lev,conti);
		}
	}
}

var GMpagemenu = new Object();

function GMdynmenu_onload() {
	if (GMisNotNull(typeof document.getElementById)) {
		//GMpagemenu.availwidth = window.screen.width - (window.screen.width - window.event.screenX);
		//var m_height = window.screen.height - (window.screen.height - window.event.screenY);
		GMpagemenu.menuel = document.getElementById(GMmenunavn);
		if (typeof GMpagemenu.menuel != "undefined" && GMpagemenu.menuel != null) {
			GMpagemenu.comboboxes = document.getElementsByTagName("SELECT");
			GMpagemenu.iframes = document.getElementsByTagName("IFRAME");
			hasbeen = false;
			GMInitializeMenu(GMpagemenu.menuel,0,1,1);
			GMpagemenu.menuel.style.visibility = "visible";
		}
	}
	else {
	//Vi skal håndtere gamle browsere
		var menuel = document.eval(GMmenunavn);
		var menulinks = document.links;
		//alert(menulinks.length);
/*
		for (var i = 0; i < menulinks.length; i++) {
			if (String(menulinks[i].href).indexOf(GMmenudegradeurl) > -1) {
				alert(menulinks[i].text);
			}
		}
*/
	}
}

//window.onload = dynmenu_onload;
