// -------------------------------------------------------------------------------------------------------
// ------------------------- Menueeinstellungen ab hier vornehmen ----------------------------------------
// -------------------------------------------------------------------------------------------------------


// -------------------------------------------------------------------------------------------------------
// ------------------------- Menus dynamisch erstellen ---------------------------------------------------
// -------------------------------------------------------------------------------------------------------

// *** CROSS-BROWSER COMPATIBILITY ***

// globale Variablen (werden in Funktion startMenu()() mit Werten belegt)
var setpos;

function getRef(id)
{
 if (isDOM) return document.getElementById(id);
 if (isIE4) return document.all[id];
 if (isNS4) return document.layers[id];
}

function getSty(id)
{
 return (isNS4 ? getRef(id) : getRef(id).style);
} 


// *** MOUSEOVER/OUT CONTROL FUNCTIONS ***

// Hide timeout.
var popTimer = 1;
// Array showing highlighted menu items.
var litNow = new Array();

function popOver(menuNum, itemNum)
{
 clearTimeout(popTimer);

 // Hide all other menus & dim old highlighted items, still showing this menu.
 hideAllBut(menuNum);
 // Get tree of parent menu items and light them up - global variable for hideAllBut!
 litNow = getTree(menuNum, itemNum);
 changeCol(litNow, true);

 // Get target menu to show - if it's nonzero, position & show it.
 targetNum = menu[menuNum][itemNum].target;
 if (targetNum > 0)
 {
  // Get current menu position.
  thisX = parseInt(menu[menuNum][0].ref.left) + parseInt(menu[menuNum][itemNum].ref.left);
  thisY = parseInt(menu[menuNum][0].ref.top) + parseInt(menu[menuNum][itemNum].ref.top);

  // Add those to the target's offset to set the target's position, show it.
  with (menu[targetNum][0].ref)
  {
   left = parseInt(thisX + menu[targetNum][0].x);
   top = parseInt(thisY + menu[targetNum][0].y);
   visibility = 'visible';
  }
 }
}

function popOut(menuNum, itemNum)
{
 // If it's a root menu item that doesn't trigger a popout, hide now, else set timeout
 // to hide menu in 1/2 sec, *UNLESS* another mouseover clears the timeout!
 if ((menuNum == 0) && !menu[menuNum][itemNum].target)
  hideAllBut(0)
 else
  popTimer = setTimeout('hideAllBut(0)', 500);
}

function getTree(menuNum, itemNum)
{
 // Array index is the menu number. The contents are null (if that menu is not a parent)
 // or the item number in that menu that is an ancestor (to light it up).
 itemArray = new Array(menu.length);
 
 while(1) {
  itemArray[menuNum]=itemNum;
  // If we've reached the top of the hierarchy, return.
  if (menuNum==0) {  break; }
  itemNum=menu[menuNum][0].parentItem;
  menuNum=menu[menuNum][0].parentMenu;
 }
 return itemArray;
}

// Pass an array and a boolean to specify colour change, true = over colour.
function changeCol(changeArray, isOver)
{
 // Cycle through array searching for items to change.
 for (menuCount = 0; menuCount < changeArray.length; menuCount++)
 {
  // If item number is present, change its colour.
  if (changeArray[menuCount])
  {
   newCol = isOver ? menu[menuCount][0].overCol : menu[menuCount][0].backCol;

   // Change the colours of the div/layer background.
   with (menu[menuCount][changeArray[menuCount]].ref)
   {
    if (isNS4) bgColor = newCol;
    else backgroundColor = newCol;
   }
  }
 }
}

function hideAllBut(menuNum)
{
 // Get array of parent menus (item numbers irrelevant, just pass '1').
 var keepMenus = getTree(menuNum, 1);

 // ...and work through it, hiding menus that are not its ancestors/itself.
 for (count = 0; count < menu.length; count++)
  if (!keepMenus[count])
   menu[count][0].ref.visibility = 'hidden';

 // Dim all the items in litNow array.
 changeCol(litNow, false);
}


// *** MENU CONSTRUCTION FUNCTIONS ***


function Menu(isVert, popInd, x, y, width, overCol, backCol, borderClass, textClass, alignText)
{
 // True or false - a vertical menu?
 this.isVert = isVert;
 // The popout indicator used (if any) for this menu.
 this.popInd = popInd
 // Position and size settings.
 this.x = x;
 this.y = y;
 this.width = width;
 // Colours of menu and items.
 this.overCol = overCol;
 this.backCol = backCol;
 // The stylesheet class used for item borders and the text within items.
 this.borderClass = borderClass;
 this.textClass = textClass;
 // Parent menu and item numbers, indexed later.
 this.parentMenu = null;
 this.parentItem = null;
 // Reference to the object's style properties (set later).
 this.ref = null;
 this.alignText = alignText;
}

function Item(text, href, frame, length, spacing, target)
{
 this.text = text;
 this.href = href;
 this.frame = frame;
 this.length = length;
 this.spacing = spacing;
 this.target = target;
 // Reference to the object's style properties (set later).
 this.ref = null;
}

function writeMenus()
{
 
 if (!isDOM && !isIE4 && !isNS4) return;
 
 // Loop through menus, using properties of menu description object, i.e. x, y, width etc...
 for (currMenu = 0; currMenu < menu.length; currMenu++) with (menu[currMenu][0])
 {
  // Variable for holding HTML for items and positions of next item.
  var str = '', itemX = 0, itemY = 0;

  // Remember, items start from 1 in the array (0 is menu object itself, above).
  // Also use properties of each item nested in the other with() for construction.
  for (currItem = 1; currItem < menu[currMenu].length; currItem++) with (menu[currMenu][currItem])
  {
   var itemID = 'menu' + currMenu + 'item' + currItem;

   // The width and height of the menu item - dependent on orientation!
   var w = (isVert ? width : length);
   var h = (isVert ? length : width);

   // Create a div or layer text string with appropriate styles/properties.
    if (isDOM || isIE4)
   {
    str += '<div id="' + itemID + '" style="position: absolute; left:' + itemX +
     '; top:' + itemY + '; width:' + w + '; height:' + h + '; visibility:inherit; ';
    if (backCol) str += 'background-color:' + backCol + ';';
    str += '" ';
   }
   if (isNS4)
   {
    str += '<layer id="' + itemID + '" left="' + itemX + '" top="' + itemY + '" width="' + 
     w + '" height="' + h + '" visibility="inherit" ';
    if (backCol) str += 'bgcolor="' + backCol + '" ';
   }
   if (borderClass) str += 'class="' + borderClass + '" ';
   
   // Add mouseover handlers and finish div/layer.
   str += 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' +
     currMenu + ',' + currItem + ')">';

   // Add contents of item (default: table with link inside).
   // In IE/NS6+, add padding if there's a border to emulate NS4's layer padding.
   // If a target frame is specified, also add that to the <a> tag.
   str += '<table width="' + (w - 8) + '" border="0" cellspacing="0" cellpadding="' +
    (!isNS4 && borderClass ? 3 : 0) + '"><tr><td align="' + alignText + '" height="' +
    (h - 7) + '"><a class="' + textClass + '" href="' + href + '"' +
    (frame ? ' target="' + frame + '">' : '>') + text + '</a></td>';


   if (target > 0)
   {
    // Set target's parents to this menu item.
    menu[target][0].parentMenu = currMenu;
    menu[target][0].parentItem = currItem;

    // Add a popout indicator.
    if (popInd) str += '<td class="' + textClass + '" align="right">' + popInd + '</td>';
   }

   // Finish off table and item.
   str += '</tr></table>' + (isNS4 ? '</layer>' : '</div>');

   // Move next item position down or across by this item's length and additional spacing.
   if (isVert) itemY += length + spacing;
   else itemX += length + spacing;
   
  // End loop through items and with([menu[currMenu][currItem]).
  }


  // Now, write the menu to the document depending on browser capabilities.
  // N.B: Still using properties of menu[currMenu][0] like 'ref' etc...

  // In IE5+ or NS6+, create a new DIV node and add text to it...
  if (isDOM)
  {
   var newDiv = document.createElement('div');
   document.getElementsByTagName('body').item(0).appendChild(newDiv);
   newDiv.innerHTML = str;
   ref = newDiv.style;
    
   ref.position = 'absolute';
   ref.visibility = 'hidden';
  }
   
  // Insert a div tag to the end of the BODY with menu HTML in place for IE4.
  if (isIE4)
  {
   document.body.insertAdjacentHTML('beforeEnd', '<div id="menu' + currMenu + 'div" ' +
    'style="position: absolute; visibility: hidden">' + str + '</div>');
   ref = getSty('menu' + currMenu + 'div');
  }
  
  // In NS4, create a reference to a new layer and write the items to it.
  if (isNS4)
  {
   ref = new Layer(0);
   ref.document.write(str);
   ref.document.close();
  }

  // Now items have been written, loop through them again to set up references.
  for (currItem = 1; currItem < menu[currMenu].length; currItem++)
  {
   itemName = 'menu' + currMenu + 'item' + currItem;
   if (isDOM || isIE4) menu[currMenu][currItem].ref = getSty(itemName);
   if (isNS4) menu[currMenu][currItem].ref = ref.document[itemName];
  }
  
 // End loop through menus and with (menu[currMenu][0]).
 }
 
 // Now they've all been written, position & show the root menu (others positioned later).
 with(menu[0][0])
 {
  ref.left = x;
  ref.top = y;
  ref.visibility = 'visible';
 }
}

// -------------------------------------------------------------------------------------------------------
// ------------------------- Zusaetzliche Funktionen  ----------------------------------------------------
// -------------------------------------------------------------------------------------------------------


// Alle Menueeintraege auf ihre Startposition setzen
function setStartPos(){
	for(menuNum=0; menuNum<menu.length; menuNum++){
 		for (itemNum=0; itemNum<menu[menuNum].length; itemNum++){		 		
			// Get target menu to show - if it's nonzero, set position.
			targetNum = menu[menuNum][itemNum].target;
			if (targetNum > 0){
		 		// Get current menu position.
		  		thisX = parseInt(menu[menuNum][0].ref.left) + parseInt(menu[menuNum][itemNum].ref.left);
		  		thisY = parseInt(menu[menuNum][0].ref.top) + parseInt(menu[menuNum][itemNum].ref.top);
		
		  		// Add those to the target's offset to set the target's position, show it.
		 	 	with (menu[targetNum][0].ref){
					left = parseInt(thisX + menu[targetNum][0].x);
					top = parseInt(thisY + menu[targetNum][0].y);
			  	}
		 	}
  		}
	}
}

// fuer netscape muss bei groessenaenderung der Website neu geladen werden
var popOldWidth = window.innerWidth;
var popOldHeight = window.innerHeight;
nsResizeHandler = new Function('if (popOldWidth != window.innerWidth || popOldHeight != window.innerHeight) location.reload()');


// This is a quick snippet that captures all clicks on the document and hides the menus
// every time you click. Use if you want.

if (isNS4) document.captureEvents(Event.CLICK);
document.onclick = clickHandle;

function clickHandle(evt)
{
 if (isNS4) document.routeEvent(evt);
 hideAllBut(0);
}

// aktuelle Mitte der website auslesen und menu positionieren
function moveRoot()
{
 var menuLaenge = 614;
 // fuer Netscape 4
 if (isNS4) {
    setpos = (innerWidth/2 - menuLaenge/2)-8;
    if (setpos != Math.round(setpos)) {setpos = Math.round(setpos)-1};
	}
  // fuer Netscape 6 
 if (isDOM && !document.all) {
 	setpos = (innerWidth/2 - menuLaenge/2)-7;
    if (setpos != Math.round(setpos)) {setpos = Math.round(setpos)-1};
	}
  // fuer Internet Explorer (alle Versionen) 
 if (document.all) { 
 	setpos = document.body.clientWidth/2 - menuLaenge/2;
 	}
 if (setpos < 0) {setpos=0};
 with(menu[0][0]) { ref.left = setpos; }
}

// Initialisierung und start der Menues
function startMenu(){
    // für erstes laden bei netscape4, alle anderen browser siehe browsercheck.js
    isNS4 = (document.layers ? true : false);
    if(browserVersion>=4){
    	writeMenus();
    	setStartPos();
    	//moveRoot();
    }
    	
}
