
/**************************
*	Menu script.
*
*	een menu bestaat uit 
*	een object menu: alle elementen van het menu
*	een of meerdere object head: de headers van het menubalk
*	per head een of meerder object item: de items van de pulldowns
*
*	initialiseren: 
*	definieer deze variabelen in de head van je html pagina
*	var	imageDir = "";			directory voor alle gifs van het menu
*	var headPrefix = "";		de filenaam van een gif van een head is headPrefix + headId + headSuffix + buttonOn/Off
*	var headSuffix = "";
*	var pullPrefix = "";		de filenaam van een gif van een pulldown item is pullPrefix + itemId + pullSuffix
*	var pullSuffix = "";
*	var buttonOn = "";			
*	var buttonOff = "";											
*	var buttonPull = "";		alleen gebruikt als de head veranderd als de pulldown is zichtbaar
*	var linkPrefix = '';		algemene link: linkPrefix + itemId/headId
*
*	initialiseer het menu in de head van je html pagina
*	object Menu = new Menu(string: naam, string: align, int: top in pixels, string: orientation);
*	bijv: menu = new Menu("menu", 202, 0);
*
*	orientation is optioneel, mag zijn vetical of horizontal
*
*	voeg de heads toe:
*	object Head = menu.add(string: naam, string: text, string: link, string of int: align, int: width, int: height);
*	bijv.: beroepen = menu.add("beroepen", null, "pagina.asp?metnaam=odysseus&pagnaam=beroepen", "left", 101, 73);	
*
*	voeg de items toe aan de head:
*	head.add(string: naam, string: text, string: link)
*	bijv.: beroepen.add("onderwerp1", "onderwerp1", "onderwerp1");
*
*	text en link zijn optioneel.
*	als er geen tekst is, dan word er gezocht naar een gif: imageDir/headPrefix + headId + headSuffix + buttonOn/Off
*	als er geen link is, dan komt er een link naar algemene link: linkPrefix + itemId/headId
*
*	indien nodig voeg een separator toe:
*	head.addSeparator(string: imageFile, int: width, int: height);
*	bijv.: beroepen.addSeparator("../global/pixel.gif", 100, 7);
*
*	in de body van je html pagina, roep je menu.writeOldBrowser() aan, op de plek waar het menu terecht zal komen, zodat oude browsers de site kunnen navigeren.
*	aan het einde van je html, dus net boven de </body> tag, roep je menu.draw(activePagina)
*	waarbij activePagina is optioneel en is de naam van de pagina (cq site-onderdeel), waar dit menu bij hoort.
*  
*	het uiterlijk van de menus word bepaald in een stylesheet. Je moet per pulldown 2 classes definieren: .pulldown<head> en .pulldown<head>Tekst
*
*	af op Wednesday, November 15, 2000 18:32:21 PM
*	door: alvaro@icatt.nl
*
*	gewijzigd op:
*	dinsdag 27 maart 2001 16:17:50
***************************/
var	imageDir = "";								// directory voor alle gifs van het menu
var headPrefix = "";
var headSuffix = "";
var pullPrefix = "";
var pullSuffix = "";
var buttonOn = "";
var buttonOff = "";											
var buttonPull = "";
var linkPrefix = "";			// algemene link naar script url


function Menu(id, align, top, orientation) {
	this.id = id;					// string: id
	this.align = align;				// string: center, right of left of int pixels
	this.top = top					// int: pixels. Top positie van de menubalk
	this.left = 0;					// int pixels. Links positie van de menubalk
	this.lijst = null;				// array van object head. Alle Heads van de menubalk
	this.close_menusTimeout = 0;	// object timeout. 
	this.delay = 500;				// int milliseconden. Delay voor pulldown sluiten
	this.activePage = null;			// string paginanaam. Naam van de pagina waar dit menu bij hoort 
	this.activeHead = null;			// object head. De head die nu geselecteerd is. 
	this.activeItem = null;			// object item. Het item die nu geselecteerd is.
	this.imageDir = "";				// string dir. Directory voor alle plaatjes van dit menu
	this.done = false;					// bool. Is het menu getekend
	if(orientation) {
		this.orientation = orientation;	// is dit een verticaal of horizontaal menu
	}
	else {
		this.orientation = "horizontal";	// horizontaal menu is de default
	}
	if(this.orientation == "vertical") { 
		this.write = writeMenuVertical;	// menu schrijven in de pagina
	}else {
		this.write = writeMenu;	// menu schrijven in de pagina
	}
}
Menu.prototype.init = initMenu;		// menu initialiseren
Menu.prototype.close = closeMenu;	// alle pulldown sluiten
Menu.prototype.writeOldBrowser = writeMenuOldBrowser;	// versie voor oude browsers
Menu.prototype.getHead = getHead;	// return index van een head
Menu.prototype.getLeft = getLeft;	// links positie van de menubalk berekenen
Menu.prototype.add = menuAddHead;	// een object head toevoegen

/**************************************************************************
*	menuAddHead   (Menu.prototype.add)
*	
*	object Head function menuAddHead(
*      string id: naam van deze head 
*	   string text: text van deze head. Indien null dan word een gif gebruikt
*	   string link: link van deze head. Indien null dan word de default link gebruikt
*	   string of int align: indien string: center, right of left of indien int pixels vanaf linkerkant van de window
*	   int width: breedte van deze Head
*	   int height: hoogte van deze Head.
*	)
**************************************************************************/
function menuAddHead(id, text, link, align, width, height) {
	var head = null;
	
	head = new Head(id, text, link, align, width, height, this.orientation);	// nieuw object Head
 	if(!this.lijst) {										// lijst van object head aanmaken in het menu object
 		this.lijst = new Array();
		this.lijst[0] = head;								// deze Head is de eerste
	}else {
		this.lijst = this.lijst.concat(head);				// deze Head toevoegen aan de Head array van menu
	}
	return(head);
}
/**************************************************************************
*   getLeft (Menu.prototype.getLeft)
*   linker positie van de menu balk uitrekenen
*   void getLeft(void)
**************************************************************************/
function getLeft() {
	var windowWidth = 0;
	var menuWidth = 0;
	var hl = 0;

	switch(platform.browser) {											// object platform komt uit extern bestand platform.js
		case "ns":	windowWidth = window.innerWidth; break;				// zoekt de breedte van de browser window in netscape
		case "ie":	windowWidth = document.body.clientWidth; break;		// zoekt de breedte van de browser window in explorer
		default:	windowWidth = 800;									// als andere browser word aangenomen dat de window is 800 pixels breed 
	}
	for(hl in this.lijst)												// doorloop alle Heads van het menu.
		menuWidth += this.lijst[hl].width;								// de breedte van de nmenubalk is de som van de breedte van alle Heads.
 
	if(isNaN(this.align)) {												// menu.align kan een string of een int zijn
		switch(this.align) {
			case "center":	this.left = Math.round((windowWidth - menuWidth)/2); break;		// bereken de linker positie van de menubalk als align een string is.
			case "right":	this.left = windowWidth - menuWidth - 16; break;
			case "left":	this.left = 0; break;
		}
	}else {
		this.left = this.align;											// als menu.align is een int, dan komt de menubalk te staan op pixelpsitie align
	}
}
/**************************************************************************
*   initMenu (Menu.prototype.init)
*   void initMenu(void)
*   menu initialiseren
**************************************************************************/
function initMenu() {
	var kpleft = 0;
	var kpl = 0;
	var kp = 0;

	if(imageDir) {								// directory waar alle menuplaatjes staan
		imageDir = imageDir.replace(/\/$/,"");	// indien een slash aan het einde: weghalen
		this.imageDir = imageDir;
	}
	this.getLeft();								// bereken de linker positie van de menubalk
	kpleft = this.left;							// de linker positie van de eerste Head  
	for(kpl in this.lijst) {					// doorloop alle Heads van het menu
		kp = this.lijst[kpl];
		kp.menu = this;							// elke Head heeft een pointer naar het menu waar het bij hoort
		kp.left = kpleft;						// de linker positie van de Head
		kpleft += this.lijst[kpl].width;		// de linker positie word vergroot met de breedte van de huidige Head
		kp.top = this.top;						// de top positie van de Head
		kp.zIndex=200;
		if(!kp.link) kp.link = linkPrefix + kp.id;	// als deze Head heeft geen expliciet link, gebruik de default linkPrefix
		kp.imageDir = this.imageDir;			// directory van alle laatjes  van de Head, hier gelij aan menu.imageDir
		kp.init();// initializeer de Head
	}
}
/**************************************************************************
*   closeMenu (Menu.prototype.close)
*   void closeMenu(void)
*   rollovers en pulldowns sluiten
**************************************************************************/
function closeMenu() {
	var l;
	
	for(l in this.lijst)
		this.lijst[l].close();
}
/**************************************************************************
*   getHead (Menu.prototype.getHead)
*   int getHead(string: headId)
*   het index nummer van een Head naam zoeken
**************************************************************************/
function getHead(headId) {
	var h = 0;
	var result = -1;
	
	for(h in this.lijst) {
		if(this.lijst[h].id == headId) {
			result = h;
			break;
		}
	}
	return(result);
}
/**************************************************************************
*   writeMenu (Menu.prototype.write)
*   void writeMenu(string: activePage)
*   menu html schrijven
**************************************************************************/
function writeMenu(activePage) {
	var dummy;
	var headElement = null;
	var layerId = "";
	var menuBuffer = "";
	var l = 0;
	var h = 0;
	
	if(this.done) return;										// als het menu is al geschreven door de functie writeOldBrowser, dan retour.
	dummy = menu.add("dummy", " ", null, "right", 1, 20);		// een dummy Head toevoegen, nodig voor netscape
	this.init();												// het menu initialiseren
	layerId = this.id + "layer";
	this.activePage = activePage;								// een string met de naam van de html pagina cq siteonderdeel waar dit menu bij hoort.
																
																// schrijf de menubalk-tabel naar een buffer
	if(platform.os == "mac" && platform.browser == "ie")		// op explorer voor mac hebben tabellen bij default een marge boven
		menuBuffer = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin-top:0px;\"><tr>";
	else
		menuBuffer = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\"><tr>";
	for(l in this.lijst) {
		h = this.lijst[l];
		menuBuffer += "<td>";
		menuBuffer += h.write();								// doorloop de lijst met heads, en schrijf die
		menuBuffer += "</td>";
	}
	menuBuffer += "</tr></table>";								// sluit menubalk-tabel af
	headElement = new Element(layerId, 'visible', this.top, this.left, this.width, this.height, null, menuBuffer); // de gehele tabel komt terecht binnen een cross-browser dhtml element
	headElement.writeElement();		// schrijf de dhtml element inclusief menubalk-tabel naar de pagina
									// Element is gedefinieerd in extern bestand posElement.js
	this.done = true;				// deze menu is geschreven naar de pagina
}
/**************************************************************************
*   writeMenuVertical (Menu.prototype.write)
*   void writeMenuVertical(string: activePage)
*   verticaal menu html schrijven
**************************************************************************/
function writeMenuVertical(activePage) {
	var dummy;
	var headElement = null;
	var layerId = "";
	var menuBuffer = "";
	var l = 0;
	var h = 0;
	
	if(this.done) return;										// als het menu is al geschreven door de functie writeOldBrowser, dan retour.
	dummy = menu.add("dummy", " ", null, "right", 1, 20);		// een dummy Head toevoegen, nodig voor netscape
	this.init();												// het menu initialiseren
	layerId = this.id + "layer";
	this.activePage = activePage;								// een string met de naam van de html pagina cq siteonderdeel waar dit menu bij hoort.
																
																// schrijf de menubalk-tabel naar een buffer
	if(platform.os == "mac" && platform.browser == "ie")		// op explorer voor mac hebben tabellen bij default een marge boven
		menuBuffer = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin-top:0px\">";
	else
		menuBuffer = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
	for(l in this.lijst) {
		h = this.lijst[l];
		menuBuffer += "<tr><td class=\""+h.id+"Cell\">";
		menuBuffer += h.write();								// doorloop de lijst met heads, en schrijf die
		menuBuffer += "</td></tr>";
	}
	menuBuffer += "</table>";								// sluit menubalk-tabel af

	//alert(menuBuffer)

	headElement = new Element(layerId, 'visible', this.top, this.left, this.width, this.height, null, menuBuffer); // de gehele tabel komt terecht binnen een cross-browser dhtml element
	headElement.writeElement();		// schrijf de dhtml element inclusief menubalk-tabel naar de pagina
									// Element is gedefinieerd in extern bestand posElement.js
	this.done = true;				// deze menu is geschreven naar de pagina
}
/**************************************************************************
*   writeMenuOldBrowser (Menu.prototype.writeOldBrowser)
*   void writeMenuOldBrowser(string: activePage)
*   menu html schrijven voor browsers die geen layers ondersteunen
**************************************************************************/
function writeMenuOldBrowser(activePage) {
	var menuWidth = 0;
	var menuHeight = 0;
	var hl = 0;

	if(platform.DOM || ((platform.browser == "ns") && (platform.version >= 4))) {	// kan de browser layers gebruiken?
		for(hl in this.lijst)														// DOM word gedefinieerd in extern bestand paltform.js
			menuWidth += this.lijst[hl].width;										// DOM staat voor Document Object Model
		for(hl in this.lijst)														// als de browser layers kan, dan komt er een transparante gif op de plek waar de layers komen straks.
			menuHeight = (this.lijst[hl].height > menuHeight)? this.lijst[hl].height : menuHeight;
		document.write("<img  src=\"wtpimages/spacer.gif\" width=\"" + menuWidth + "\" height=\"" + menuHeight + "\" border=\"0\">");
	}else {
		this.write(activePage);		// als de browser geen layers ondersteunt, dan word het menu geschreven zonder layers.
	}
}

/******************************************
*	Head                                  *
*   Heads zijn onderdelen van de menubalk *
*	object Head function Head(
*      string id: naam van deze head 
*	   string text: text van deze head. Indien null dan word een gif gebruikt
*	   string link: link van deze head. Indien null dan word de default link gebruikt
*	   string of int align: indien string: center, right of left of indien int pixels vanaf linkerkant van de window
*	   int width: breedte van deze Head
*	   int height: hoogte van deze Head.
*	)
*******************************************/
function Head(id, text, link, align, width, height, orientation){
	this.id = id;			// string id: naam van deze head 
	this.text = text;		// string text: text van deze head. Indien null dan word een gif gebruikt
	this.link = link;		// string link: link van deze head. Indien null dan word de default link gebruikt
	this.align = align;		// string of int align: indien string: center, right of left of indien int pixels vanaf linkerkant van de window
	this.width = width;		// int width: breedte van deze Head
	this.height = height;	// int height: hoogte van deze Head.
	this.lijst = null;		// object Item[]: lijst van alle items van de pulldown van deze Head
	this.menu = null;		// object Menu: waar deze Head bij hoort
	this.button = null;		// object Button: clickbutton van deze Head
	this.top = 0;			// int: top positie in pixels 
	this.left = 0;			// int: linker positie van de Head in pixels
	this.headMenuLeft = 0;	// int: linker positie van de pulldown, in pixels
	this.headMenuTop = 0;	// int: top van de pulldown
	this.headMenuHeight = 0;	//int: hoogte van de pulldown
	this.headMenuWidth = 0;		// int: breedte van de pulldown
	this.imageDir = "";			// string: directory van alle plaatjes van deze Head, is gelij aan imageDir van menu.
	this.availElements = 0;		// int: aantal items van de pulldown waarop je kan clicken
	if(orientation) {
		this.orientation = orientation;	// is dit een verticaal of horizontaal menu
	}
	else {
		this.orientation = "horizontal";	// horizontaal menu is de default
	}
	if(this.orientation == "vertical") { 
		this.init = initHeadVertical;	// menu schrijven in de pagina
	}else {
		this.init = initHead;	// menu schrijven in de pagina
	}
};
Head.prototype.write = writeHead;			// head initialiseren
Head.prototype.focus = headFocus;		// word aangeroepn als bij mouseover
Head.prototype.blur = headBlur;			// bij mouseout
Head.prototype.pullActive = pullActive;	// eigenlijk niet gebruikt, maar in het geval dat de head een andere uiterlijk krijgt als de pulldown is zichtbaar
Head.prototype.close = headClose;		// rollover en pulldown sluiten
Head.prototype.getItem = getItem;		// index van een item zoeken bij naam 
Head.prototype.add = addItem;			// een item toevoegen aan de pulldown van deze Head
Head.prototype.addSeparator = addSeparator;	// een separator gif toevoegen, zonder link

/**************************************************************************
*	addItem   (Head.prototype.add)
*	
*	object Item function addItem(
*      string id: naam van deze head 
*	   string text: text van deze head. Indien null dan word een gif gebruikt
*	   string link: link van deze head. Indien null dan word de default link gebruikt
*	   int width: breedte van deze Head
*	   int height: hoogte van deze Head.
*	   bool avail: of dit item een link heeft
*	)
**************************************************************************/
function addItem(id, text, link, width, height, avail) {
	var item = new Item(id, text, link, width, height, avail);	// nieuw item object
 	if(!this.lijst) {											// als deze head geen items lijst heeft, maak die nu aan
 		this.lijst = new Array();
		this.lijst[0] = item;									// dit is de eerste item van deze Head
	}else {
		this.lijst = this.lijst.concat(item);					// als deze Head al items heeft, voeg deze toe
	}
	return(item);
}
/**************************************************************************
*   addSeparator (Head.prototype.addSeparator)
*   void addSeparator(
*	string file: url van een gif, absoluut of relatief an imageDir
*	int width
*	int height
*	)
*
*   addSeparator maakt het mogelijk om een gif te plaatsen in een pulldown. 
*
**************************************************************************/
function addSeparator(file, width, height) {
	var text = null;
	var link = null;
	var avail = false;
	this.add(file, text, link, width, height, avail);	// separator is eigenlijk een item, waarbij avail is false
}
/**************************************************************************
*   initHead (Head.prototype.init)
*   void initHead(void)
* 	Head initialiseren
**************************************************************************/
function initHead() {
	var il = 0;
	var kzl = 0;
	var kz = 0;

	this.headMenuTop = this.top + this.height;		// top positie in pixels van de pulldown

	this.headMenuHeight = 0;						// totale hoogte van de pulldown 
	if(this.lijst) {
		for(il in this.lijst) {
			this.headMenuHeight += this.lijst[il].height;	// de totale hoogte van de pulldown is de som van de hoogte van alle items
		}
	}
	this.headMenuWidth = this.width;				// breedte van de pulldown
	if(this.lijst) {
		for(il in this.lijst) {
			this.headMenuWidth = (this.lijst[il].width > this.headMenuWidth)? this.lijst[il].width : this.headMenuWidth;
		}											// de breedte van de pulldown is gelijk aan de breedte van de breedste item
	}

	if(isNaN(this.align)) {							// align kan een string (center, right, left) of een int in pixels
		switch(this.align) {
			case "center":	this.headMenuLeft = Math.round(this.left - (this.headMenuWidth - this.width)/2); break;	// bereken de pixel positie van deze pulldown
			case "right":	this.headMenuLeft = this.left - (this.headMenuWidth - this.width); break;
			case "left":	this.headMenuLeft = this.left; break;
		}
	}else {
		this.headMenuLeft = this.left + this.align;		// als align is een int, dan is de positie van de pulldown relatief aan de positie van de head (mag negatief zijn) 
	}
	if(this.headMenuLeft < 0) this.headMenuLeft = 0;	// de pulldown mag niet links van de window-rand uitklappen
	if(this.lijst) {
		for(kzl in this.lijst) {						// doorloop de lijst met Items van deze Head
			kz = this.lijst[kzl];
			kz.head = this;								// elke Item krijgt een pointer naar de Head waar het bij hoort.
			if(!kz.link) kz.link = linkPrefix + kz.id;	// als het Item heeft geen expliciet link, gebruik de default linkPrefix
			kz.imageDir = this.imageDir;				// directory voor plaatjes van deze item
		}
		this.availElements = 0;							// aantal elementen van de pulldown die avail zijn, en dus een link hebben
		for(kzl=0; kzl<this.lijst.length; kzl++){
			if(this.lijst[kzl].avail) this.availElements++;
		}
	}
}
/**************************************************************************
*   initHeadVertical (Head.prototype.init)
*   void initHeadVertical(void)
* 	Verticaal Head initialiseren
**************************************************************************/
function initHeadVertical() {
	var il = 0;
	var kzl = 0;
	var kz = 0;

	this.headMenuTop = this.top;
	if(this.align)
		this.headMenuTop += this.align;
	for(il in this.menu.lijst) {
		if(this.menu.lijst[il].id == this.id) break;
		this.headMenuTop += this.height;		// top positie in pixels van de pulldown
	}
	
	this.headMenuHeight = 0;						// totale hoogte van de pulldown 
	if(this.lijst) {
		for(il in this.lijst) {
			this.headMenuHeight += this.lijst[il].height;	// de totale hoogte van de pulldown is de som van de hoogte van alle items
		}
	}
	this.headMenuWidth = 0;				// breedte van de pulldown
	if(this.lijst) {
		for(il in this.lijst) {
			this.headMenuWidth = (this.lijst[il].width > this.headMenuWidth)? this.lijst[il].width : this.headMenuWidth;
		}											// de breedte van de pulldown is gelijk aan de breedte van de breedste item
	}

	var maxWidth = 0;
	for(k in this.menu.lijst) {
		maxWidth = (this.menu.lijst[k].width > maxWidth)? this.menu.lijst[k].width : maxWidth;
	}
	this.headMenuLeft = this.menu.left + maxWidth;
	if(this.headMenuLeft < 0) this.headMenuLeft = 0;	// de pulldown mag niet links van de window-rand uitklappen
	if(this.lijst) {
		for(kzl in this.lijst) {						// doorloop de lijst met Items van deze Head
			kz = this.lijst[kzl];
			kz.head = this;								// elke Item krijgt een pointer naar de Head waar het bij hoort.
			if(!kz.link) kz.link = linkPrefix + kz.id;	// als het Item heeft geen expliciet link, gebruik de default linkPrefix
			kz.imageDir = this.imageDir;				// directory voor plaatjes van deze item
		}
		this.availElements = 0;							// aantal elementen van de pulldown die avail zijn, en dus een link hebben
		for(kzl=0; kzl<this.lijst.length; kzl++){
			if(this.lijst[kzl].avail) this.availElements++;
		}
	}
}
/**************************************************************************
*   headFocus (Head.prototype.focus)
*   void headFocus(void)
*   aangeroepen door onmouseover
**************************************************************************/
function headFocus() {
	if(this.menu.close_menusTimeout) {clearTimeout(this.menu.close_menusTimeout);}	// wis de menu.close() timeout
	if(this.menu.activeHead) 													  	// als er een Head open staat
		if(this != this.menu.activeHead) this.menu.activeHead.close();				// sluit de actieve head, tenzij het deze head zelf is.
	this.menu.activeHead = this;													// de active Head is nu deze
}
function headBlur() {
	this.menu.close_menusTimeout = setTimeout("menu.close()",this.menu.delay);		// wacht menu.delay milliseconden voordat de head sluit
}
function headClose() {
	this.button.buttonClose();	// head button roll off
}
function pullActive() {			// kan aangeroepen worden als de head veranderd als de pulldown open staat. word eigenlijk niet gebruikt
	this.button.pullActive();
}
/**************************************************************************
*   getItem (Head.prototype.getItem)
*   int getItem(string: itemId)
*   het index nummer van een Item naam zoeken
**************************************************************************/
function getItem(itemId) { 
	var h = 0;
	var result = -1;
	
	for(h in this.lijst) {
		if(this.lijst[h].id == itemId) {
			result = h;
			break;
		}
	}
	return(result);
}
/**************************************************************************
*   writeHead (Head.prototype.write)
*   void writeHead(void)
*   Head html schrijven
**************************************************************************/

function writeHead() {
	var headBuffer = null;
	var buffer = "";
	var pulldown = null;
	var headIndex = 0;
	var avail = false;
	var layerId = "";
	var hl = 0;
	var i = 0;
	var listElement = null;
	
	layerId = this.menu.id + "layer";
	headIndex = this.menu.getHead(this.id);
	avail = (this.id != this.menu.activePage)? true:false;	// de head is avail tenzij het met de active html pagina overeenkomt
	this.button = new menuButton("menu.lijst[" + headIndex + "].button", headPrefix + this.id + headSuffix, layerId, this, avail);
															// maak een nieuwe button aan
	headBuffer = this.button.draw();						// teken het head rollover button naar een buffer
	if(this.lijst && (platform.DOM || ((platform.browser == "ns")&&(platform.version >= 4)))) { // oude browsers die geen layers kunnen, krijgen ook geen pulldown.
																// maak een tabel waar alle items van de pulldown in zittenm
		if(platform.os == "mac" && platform.browser == "ie")	// op explorer voor mac hebben tabellen bij default een marge boven
			buffer = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin-top:0px;\">";
		else
			buffer = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"pulldownTabel\">";
		
		for(hl in this.lijst) {								// doorloop alle items van het pulldown
			i = this.lijst[hl];
			if(i.avail)										// als deze pulldown is avail-able, krijgt het class pulldown
				buffer += "<tr><td class=\"pulldown\">";
			else											// anders is het een separator, en dan is de marge en de padding nul.
				if(platform.browser == "ns")		
					buffer += "<tr><td class=\"pulldown\" {padding: 0px; margin: 0px;}>"; // inline style op z'n netscape
				else
					buffer += "<tr><td class=\"pulldown\" style=\"padding: 0px; margin: 0px;\">"; // inline style op de normale manier
			buffer += i.write();							// schrijf het item naar een buffer
			buffer += "</td></tr>";
		}
		if(this.availElements > 0){							// voeg een separator toe aan de onderkant van de pulldown, om tezorgen dat deze is tenminste zo breed als de head
			buffer += "<tr><td><img  src=\"wtpimages/spacer.gif\" width=\"" + this.headMenuWidth + "\" height=\"1\" border=\"0\"></td></tr>";
		}
		buffer += "</table>";
		listElement = new Element(this.id+"layerlist", 'hidden', this.headMenuTop, this.headMenuLeft, null, this.headMenuHeight, null, buffer);
		listElement.writeElement();							// schrijf een cross-browser layer met de pullldown tabel als inhoud 
	}
	return(headBuffer);
}


/*

function writeHead() {
	var headBuffer = null;
	var buffer = "";
	var pulldown = null;
	var headIndex = 0;
	var avail = false;
	var layerId = "";
	var hl = 0;
	var i = 0;
	var listElement = null;
	
	layerId = this.menu.id + "layer";
	headIndex = this.menu.getHead(this.id);
	avail = (this.id != this.menu.activePage)? true:false;	// de head is avail tenzij het met de active html pagina overeenkomt
	this.button = new menuButton("menu.lijst[" + headIndex + "].button", headPrefix + this.id + headSuffix, layerId, this, avail);
															// maak een nieuwe button aan
	headBuffer = this.button.draw();						// teken het head rollover button naar een buffer
	if(this.lijst && (platform.DOM || ((platform.browser == "ns")&&(platform.version >= 4)))) { // oude browsers die geen layers kunnen, krijgen ook geen pulldown.
																// maak een tabel waar alle items van de pulldown in zittenm
		if(platform.os == "mac" && platform.browser == "ie")	// op explorer voor mac hebben tabellen bij default een marge boven
			buffer = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"margin-top:0px;\">";
		else
			buffer = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" class=\"pulldownTabel\">";
		
		for(hl in this.lijst) {								// doorloop alle items van het pulldown
			i = this.lijst[hl];
			if(i.avail)										// als deze pulldown is avail-able, krijgt het class pulldown
				buffer += "<tr><td class=\"pulldown"+this.id+"\">";
			else											// anders is het een separator, en dan is de marge en de padding nul.
				if(platform.browser == "ns")		
					buffer += "<tr><td class=\"pulldown"+this.id+"\" {padding: 0px; margin: 0px;}>"; // inline style op z'n netscape
				else
					buffer += "<tr><td class=\"pulldown"+this.id+"\" style=\"padding: 0px; margin: 0px;\">"; // inline style op de normale manier
			buffer += i.write();							// schrijf het item naar een buffer
			buffer += "</td></tr>";
		}
		if(this.availElements > 0){							// voeg een separator toe aan de onderkant van de pulldown, om tezorgen dat deze is tenminste zo breed als de head
			buffer += "<tr><td><img  src=\"wtpimages/spacer.gif\" width=\"" + this.headMenuWidth + "\" height=\"1\" border=\"0\"></td></tr>";
		}
		buffer += "</table>";
		listElement = new Element(this.id+"layerlist", 'hidden', this.headMenuTop, this.headMenuLeft, null, this.headMenuHeight, null, buffer);
		listElement.writeElement();							// schrijf een cross-browser layer met de pullldown tabel als inhoud 
	}
	return(headBuffer);
}
*/

/******************************************
*	Item                                  *
*   Items zijn onderdelen van de menubalk *
*	object Item function Item(
*      string id: naam van deze item
*	   string text: text van deze item. Indien null dan word een gif gebruikt
*	   string link: link van deze item. Indien null dan word de default link gebruikt
*	   int width: breedte van deze item
*	   int height: hoogte van deze item.
*	   bool avail: kan je clicken op deze item
*	)
*******************************************/
function Item(id, text, link, width, height, avail) {
	this.id = id;			// string id: naam van deze item
	this.text = text;		// string text: text van deze item. Indien null dan word een gif gebruikt
	this.link = link;		// string link: link van deze item. Indien null dan word de default link gebruikt
	this.width = width;		// int width: breedte van deze item
	this.height = height;	// int height: hoogte van deze item.
	this.head = null;		// pointer naar de head waar deze item bij hoort 
	this.button = null;		// rollover button van dit item 
	this.avail = (avail == false)? false:true;	// avail is true by default
	this.imageDir = "";		// directory voor images van deze item.
}
Item.prototype.focus = itemFocus;	// aangeroepn onmouseover
Item.prototype.blur = itemBlur;		// aangeroepen onmouseout
Item.prototype.close = itemClose;	// rolloff
Item.prototype.write = writeItem;	// button html genereren
/**************************************************************************
*   itemFocus (Item.prototype.focus)
*   void itemFocus(void)
*   aangeroepen door onmouseover
**************************************************************************/
function itemFocus() {
	if(this.head.menu.close_menusTimeout) {clearTimeout(this.head.menu.close_menusTimeout);}	// wis timeout van de pulldown
	if(this.head.menu.activeItem)
		if(this != this.head.menu.activeItem) this.head.menu.activeItem.close();				// sluit de actieve item tenzij het deze zelf is
	this.head.pullActive();
	this.head.menu.activeItem = this;
}
/**************************************************************************
*   itemBlur (Item.prototype.blur)
*   void itemBlur(void)
*   aangeroepen door onmouseout
**************************************************************************/
function itemBlur() {
	this.head.menu.close_menusTimeout = setTimeout("menu.close()", this.head.menu.delay);	// wacht menu.delay milliseconden voordat het item sluit
}
function itemClose() {
	this.button.buttonClose();	// rolloff button
}
/**************************************************************************
*   writeItem (Item.prototype.write)
*   void writeItem(void)
*   Item html schrijven
**************************************************************************/
function writeItem() {
	var itemIndex = 0;
	var headIndex = 0;
	var layerId = "";
	var itemBuffer = "";
	var imageDir = "";
	
	headIndex = this.head.menu.getHead(this.head.id);
	itemIndex = this.head.getItem(this.id);
	layerId = this.head.id + "layerlist";
	imageDir = this.head.menu.imageDir;
	
	if(this.avail) {						// als deze item is available (dus een link heeft), maak er een button van
		this.button = new menuButton("menu.lijst[" + headIndex + "].lijst[" + itemIndex + "].button", pullPrefix + this.id + pullSuffix, layerId, this, true);
		itemBuffer = this.button.draw();	// sla de button op in een buffer
	}else if(this.head.availElements){		// als deze item is niet available, dus is een separator, en er zijn available elementen in de pulldown
		itemBuffer = "<img src=\"" + imageDir + "/" + this.id + "\" width=\"" + this.head.headMenuWidth + "\" height=\"" + this.height + "\" border=\"0\">";
	}										// teken de separator als gif
	return(itemBuffer);
}

/**************************************************************************
*  object menuButton function menuButton(
*  string name: naam van deze button 
*  string fileName: gif van deze button
*  string layerId: naam van de layer waar deze button in word getekend
*  object item/head *parent: head of item waar deze button bij hoort
*  bool avail: of deze button een link heeft, dus of het geen separator is
*  )
*  menu buttons als gif rollovers tekenen
*  requires platform.js
**************************************************************************/
	function menuButton(name, fileName, layerId, parent, avail) {
		var imageDir;
		this.name = name;				// string name: naam van deze button
		this.fileName = fileName;		// string fileName: gif van deze button
		this.layerId = layerId;			// string layerId: naam van de layer waar deze button in word getekend
		this.parent = parent;			// object item/head *parent: head of item waar deze button bij hoort
		imageDir = parent.imageDir;		// string dir: waar alle plaatjes van de button staan 
		this.link = parent.link;		// string link: indien null, Indien null dan word de default link gebruikt
		this.width = parent.width;		// int width: breedte
		this.height = parent.height;	// int height: hoogte

		this.image = new Image();		// object image: off image
		this.image.src = imageDir + "/" + this.fileName + buttonOff + ".gif"; 		// preload
		this.rollImage = new Image();	// object image: on image
		this.rollImage.src = imageDir + "/" + this.fileName + buttonOn + ".gif"; 	// preload
//		this.pullImage = new Image();
//		this.pullImage.src = imageDir + "/" + this.fileName + buttonPull + ".gif";

		this.avail = avail;
		if(this.parent.text)				// parent.text is de text string van de head of item waar deze bij hoort.
			this.draw = buttonTextDraw;		// als er een text is, dan is dit een text button
		else
			this.draw = buttonGifDraw;		// anders is dit ee gif button
	}
	if((platform.browser == "ns") && (platform.version < 5)) {
		menuButton.prototype.buttonRoll = buttonRollNS;
		menuButton.prototype.buttonClose = buttonCloseNS;
		menuButton.prototype.pullActive = pullActiveNS;
	}else if ((platform.browser == "ns") && (platform.version >= 5) || (platform.browser == "ie")){
		menuButton.prototype.buttonRoll = buttonRoll;
		menuButton.prototype.buttonClose = buttonClose;
		menuButton.prototype.pullActive = pullActive;
	} else {
		menuButton.prototype.buttonRoll = function() {return};
		menuButton.prototype.buttonClose = function() {return};
		menuButton.prototype.pullActive = function() {return};
	}

/*************************************
*                                    *
*     Netscape functies              *
*                                    *
**************************************/
	function buttonRollNS() {
		imageName = this.fileName;
		if(this.avail && !this.parent.text)								// als deze button is available en geen textbutton
			if(this.rollImage.complete)									// of de rollover wel geladen is
				if(document.layers[this.layerId])
					document.layers[this.layerId].document.images[imageName].src = this.rollImage.src;	// in netscape heeft elke layer een eigen document
		if(this.parent) {												
			if(this.parent.lijst) {										// als deze button hoort bij een head met een pulldown 
				listId = this.parent.id+"layerlist";
				if(document.layers[listId])
					document.layers[listId].visibility = "visible";		// maak de pulldown zichtbaar
			}
			this.parent.focus();
		}
	}
	function buttonCloseNS() {
		imageName = this.fileName;
		if(this.avail && !this.parent.text)							// als deze button is available en geen textbutton
			if(this.image.complete)									// of de rollover wel geladen is
				if(document.layers[this.layerId])
					document.layers[this.layerId].document.images[imageName].src = this.image.src;	// in netscape heeft elke layer een eigen document
		if(this.parent) {
			if(this.parent.lijst) {									// als deze button hoort bij een head met een pulldown
				listId = this.parent.id+"layerlist";
				if(document.layers[listId])
					document.layers[listId].visibility = "hidden";	// maak de pulldown onzichtbaar
			}
		}
	}
	function pullActiveNS() {
//		imageName = this.fileName;

//		if(this.image.complete)
//			document.layers[this.layerId].document.images[imageName].src = this.image.src;
	}
/*************************************
*                                    *
*     DOM functies                   *
*                                    *
**************************************/
	function buttonRoll() {
		imageName = this.fileName;
		if(this.avail && !this.parent.text)								// als deze button is available en geen textbutton
			if(this.rollImage.complete)									// of de rollover wel geladen is
				document.images[imageName].src = this.rollImage.src;
		if(this.parent) {
			if(this.parent.lijst) {										// als deze button hoort bij een head met een pulldown
				listId = this.parent.id+"layerlist";
				if(document.getElementById)								// als de browser DOM compatibel is, gebruik getElementById
					document.getElementById(listId).style.visibility = "visible";	// maak de pulldown zichtbaar
				else
					document.all[listId].style.visibility = "visible";	// als de browser niet volledig DOM compatibel is, zoals explorer 4.5 voor mac
			}
			this.parent.focus();
		}
	}
	function buttonClose() {
		imageName = this.fileName;
		if(this.avail && !this.parent.text)								// als deze button is available en geen textbutton
			if(this.image.complete)
				document.images[imageName].src = this.image.src;		// of de rollover wel geladen is
		if(this.parent) {
			if(this.parent.lijst && this.parent.availElements) {		// als deze button hoort bij een head met een pulldown met available elements
				listId = this.parent.id + "layerlist";
				if(document.getElementById)								// als de browser DOM compatibel is, gebruik getElementById
					document.getElementById(listId).style.visibility = "hidden";	// maak de pulldown onzichtbaar
				else													// als de browser niet volledig DOM compatibel is, zoals explorer 4.5 voor mac
					document.all[listId].style.visibility = "hidden";
			}
		}
	}
	function pullActive() {
//		imageName = this.fileName;

//		if(this.image.complete)
//			document.images[imageName].src = this.image.src;
	}

/*************************************
*                                    *
*     cross-browser functies         *
*                                    *
**************************************/
	function buttonGifDraw() {
		var buttonImage = null;
		var buttonMarkup = null;
		var buttonSrc = "";
		var buttonRollSrc = "";
		var buttonWidth = 0;
		var buttonHeight = 0;
		var pulldown = null;
		var buttonEvents = "";
		var parentName = "";
		var parentIndex = 0;
		var buttonName = "";
		var buttonFileName = "";
		var itemIndex = 0;
		var parentName = "";
		
		parentName = this.parent.id;
		if(this.parent.menu)
			parentIndex = this.parent.menu.getHead(parentName);
		else {
			parentIndex = this.parent.head.menu.getHead(this.parent.head.id);
			itemIndex = this.parent.head.getItem(parentName);
		}
		buttonName = this.name;
		buttonFileName = this.fileName;
		buttonSrc = this.image.src;
		buttonRollSrc = this.rollImage.src;
		buttonWidth = this.width;
		buttonHeight = this.height;
		pulldown = '"' + this.link + '"';
		buttonEvents = '';
		if(platform.DOM || ((platform.browser == "ns") && (platform.version >= 4))) {				// oude browsers geen rollover 
			if(itemIndex == null)	
				buttonEvents = 'onMouseOver="'+buttonName+'.buttonRoll();" onMouseOut="menu.lijst['+parentIndex+'].blur()"';
			else {
				if(this.parent.availElements)
					buttonEvents = 'onMouseOver="'+buttonName+'.buttonRoll();" onMouseOut="menu.lijst['+parentIndex+'].lijst['+itemIndex+'].blur()"';
				else
					buttonEvents = 'onMouseOver="'+buttonName+'.buttonRoll();" onMouseOut="menu.lijst['+parentIndex+'].blur()"';
			}
		}
		if(this.avail)
			buttonImage = '<img src="' + buttonSrc + '" width="' + buttonWidth + '" height="' + buttonHeight + '" border="0" name="' + buttonFileName + '">';
		else
			buttonImage = '<img src="' + buttonRollSrc + '" width="' + buttonWidth + '" height="' + buttonHeight + '" border="0" name="' + buttonFileName + '">';

		buttonMarkup = '<a href=' + pulldown + ' ' + buttonEvents + '>' + buttonImage + '</a>';
		return(buttonMarkup);
	}
	
	function buttonTextDraw() {
		var parentName = "";
		var tekstClass = ""; 
		var parentIndex = ""; 
		var itemIndex = ""; 
		var buttonInhoud = "";
		var buttonEvents = "";
		var buttonName = "";
		var pulldown = "";
		
		parentName = this.parent.id;
		buttonName = this.name;
		if(this.parent.head)
			tekstClass = 'pulldownTekst';
		else
			tekstClass = this.parent.id + 'Head';
		itemIndex = null;
		if(this.parent.menu)
			parentIndex = this.parent.menu.getHead(parentName);
		else {
			parentIndex = this.parent.head.menu.getHead(this.parent.head.id);
			itemIndex = this.parent.head.getItem(parentName);
		}

		buttonEvents = '';
		if(itemIndex == null) {
			buttonEvents = 'onMouseOver="'+buttonName+'.buttonRoll();" onMouseOut="menu.lijst['+parentIndex+'].blur()"';
		}else {
			buttonEvents = 'onMouseOver="'+buttonName+'.buttonRoll();" onMouseOut="menu.lijst['+parentIndex+'].lijst['+itemIndex+'].blur()"';
		}
		pulldown = '"' + this.link + '"';
		buttonInhoud = '<img  src=\"wtpimages/spacer.gif\" width=\"'+this.parent.width+'\" height=\"1\" border=\"0\"><br><nobr><a href=' + pulldown + ' ' + buttonEvents + ' class=\"'+tekstClass+'\">' + this.parent.text + '</a></nobr>';
		return(buttonInhoud);
	}


