nodepf = new platform();

var rootNode;
if(!nodepf.nodeMenu) document.writeln("<table><tr><td bgcolor=#ffffaf><font size=-3 color=#000000>This site is best viewed with the latest version of MS Internet Explorer or Netscape Navigator</font></td></tr></table><p>");

function platform() {
/** sets properties:
	major, nav6up,ie,ie3,ie4,ie5up,win9up,nodeMenu
*/	

// convert all characters to lowercase to simplify testing
    var agt=navigator.userAgent.toLowerCase();

// *** BROWSER VERSION ***
// Note: On IE5, these return 4, so use this.ie5up to detect IE5.
	this.major = parseInt(navigator.appVersion);
//	this.minor = parseFloat(navigator.appVersion);

// Note: Opera and WebTV spoof Navigator.  We do strict client detection.
// If you want to allow spoofing, take out the tests for opera and webtv.
    var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
                && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
                && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1));
    this.nav6up = (is_nav && (this.major >= 5));

    this.ie     = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
    this.ie3    = (this.ie && (this.major < 4));
    this.ie4    = (this.ie && (this.major == 4) && (agt.indexOf("msie 4")!=-1) );
    this.ie5up  = (this.ie && !(this.ie3||this.ie4));

// *** PLATFORM ***
//	this.win   = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
// NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
//        Win32, so you can't distinguish between Win95 and WinNT.

	this.win9up = (agt.indexOf("win")!=-1)&&(agt.indexOf("windows 3.1")==-1)
				&&(agt.indexOf("win16")==-1)&&(agt.indexOf("windows 16-bit")==-1)
				&&(agt.indexOf("16bit")==-1);

//	this.mac    = (agt.indexOf("mac")!=-1);
// *** OK VOOR MENU'S ***
	this.nodeMenu = (this.nav6up||this.ie5up&&this.win9up);
}

function Node(url,text,parent) {				// definieer klasse Node
/**
	Knooppunt in boomstructuur
	url = linkadres
	tekst = tekst in de link
	parent (optioneel) = knooppunt waar dit knooppunt onder hangt
*/
	narg = Node.arguments.length;
	if(nodepf.nodeMenu) {
//idc.innerHTML+='<hr>node<br>'+url+' '+text+'<br>';
	
	// declare properties
		if (narg){
			if(!rootNode) new Node();			// eerste keer: geef default rootnode
			if (narg>2) {
				var l = parent.subn.length;
				parent.subn[l] = this;
	
				this.level = parent.level+1;
				this.shown = 0;
				this.parent = parent;
			}else{ 
				this.level = 0;					// diepte in hierarchie
				this.shown = 1;					// tonen
				this.parent = rootNode;			// wie is de bovenliggende
			}
			this.opened = 0;					// alle nodes zijn toe bij de start
			this.index = rootNode.subn.length;
			rootNode.subn[this.index] = this;	// voeg toe aan subnodes van root
			this.url = url;					// link bij klik
			this.text = text;				// tekst die verschijnt
		} else {
			rootNode = this;				// na definitie is dit de rootnode voor alle genaamde nodes
			this.index = 0;
			this.shown = 0;					// tonen
			this.opened = 1;				// uitzondering: nodes onder root zijn open
			this.parent = 0;				// wie is de bovenliggende
// properties rootNode
			this.right = 1;					// kolom rechts voor hoeveel levels ?
			this.oudLevel = 0;				// vorige level deze tree
			this.topLevel = 0;				// hoogste level dat nu getoond wordt
			this.timeout = 0;				// timeout bij mouseover
			this.inText = new Array();		// binnentekst voor elke vertikale strook

		}
		this.subn = new Array();			// subnodes
	}else{
// indien niet gesupporteerd: toon enkel toplaag
		if (narg&&!parent) document.writeln('<br><a href="'+url+'">'+text+'</a>');
//		if(narg) {
//			if(!parent) document.writeln('<br><a href="'+url+'">'+text+'</a>');
//		}else{
//			rootNode = this;
//		}
		this.index=-1;						// niet gesupporteerd
	}	
	// declare methods:
	this.addSub = nodeAddSub;			// voeg subnode toe
	this.show = nodeShow;				// maak subnodes van node zichtbaar (1 niveau)
	this.hide = nodeHide;				// verberg subnodes van node (alle niveaus)
	this.paint = nodePaint;				// breng node, ofwel node + eerste niveau subnodes in beeld
	this.writeLink = nodeWriteLink;		// schrijf tekstlink naar browser
	this.close = nodeClose;				// verberg alles wat onder deze node hangt.
	this.setRoot = nodeSetRoot;			// gebruik deze als rootnode
	this.setRight = nodeSetRight;		// bepaal uitbreiding naar rechts voor rootnode

}

function nodeSetRoot(divID,tdAttrib) {
//idc.innerHTML+='<hr>setRoot<br>oude div='+this.divID+'<br>nieuwe div='+divID;
	if(nodepf.nodeMenu&&!this.index) {
		rootNode = this;
		this.divID = divID;
		if (nodeSetRoot.arguments.length>1) rootNode.tdAttrib=tdAttrib;
	}
	nodePaint(divID);
}

function nodeSetRight(r) {
//idc.innerHTML+='<hr>setRoot<br>oude div='+this.divID+'<br>nieuwe div='+divID;
	if(nodepf.nodeMenu&&!this.index) {
		this.right=r;
		nodePaint(this.divID);
	}
}

function nodeAddSub(sUrl,sText) {		// voeg subnode toe aan node
//idc.innerHTML+='<hr>addSub<br>'+this.url+' '+this.text+' -- ><br>'+sUrl+' '+sText+'<br>';
	var l = this.subn.length;
	this.subn[l] = new Node(sUrl,sText);
	var temp = this.subn[l];
	temp.shown = 0;
	temp.level = this.level+1;
	temp.parent = this;
}

function nodeShow() {					// toon knooppunt en onderliggende laag
//idc.innerHTML+='<hr>show<br>'+this.url+' '+this.text+ ' '+this.shown+'<br>';
	for(var i=0;i<this.parent.subn.length;i++) {
		var temp = this.parent.subn[i];
		if (temp.shown) this.parent.subn[i].hide();
	}
	if(this.subn.length) {
		rootNode.topLevel = this.level+1;
		for(var i=0;i<this.subn.length;i++) this.subn[i].shown = 1;
	} else {
		rootNode.topLevel = this.level;
	}
	this.opened = 1;
	nodePaint();
}

function nodeHide() {
//idc.innerHTML+='<hr>hide<br>'+this.url+' '+this.text+ ' '+this.shown+'<br>';
	this.opened = 0;
	for (var i=0;i<this.subn.length;i++) {
		var temp=this.subn[i];
		if(temp.shown) {
			temp.hide();
			temp.shown = 0;
		}
	}
}

function nodePaint(divID) {
//idc.innerHTML+='<hr>paint<br>'+this.url+' '+this.text+ ' '+this.shown+'<br>';
	if (nodepf.nodeMenu) {
		if(nodePaint.arguments.length) rootNode.divID=divID;
		tID = document.getElementById(rootNode.divID); 
		if (this.subn) {
	
			this.writeLink();
			
			for (var is=0; is<this.subn.length; is++) {
				var temp = this.subn[is];
				if (temp.shown) {
					temp.paint();
				} else {
					temp.writeLink();
				}
			}
		} else {
			var rTop = Math.min(rootNode.right,rootNode.topLevel);
			for (var r=0;r<=rTop;r++) rootNode.inText[r]='<table>'
			
			for (var i=0; i<rootNode.subn.length; i++) if (rootNode.subn[i].level==0) rootNode.subn[i].paint();

// probleem met plaatsing tags: op welk level			
			for(var i=rootNode.oudLevel;i>0;i--) {
				if(i>rootNode.right) {
					rootNode.inText[rootNode.right]+='</table></td></tr></table></td></tr>';
				}else {
					rootNode.inText[i]+='</td></tr>';
				}
			}

			
			var innerHTML = '<table><tr>';
//idc.innerHTML='rTop='+rTop+'<br>topLevel='+rootNode.topLevel+'<br>';
			for (var r=0;r<=rTop;r++) {
				innerHTML+='<td valign="top">'+rootNode.inText[r]+'</table></td>';
//idc.innerHTML+='<hr>Level '+r+':<br><textarea cols=80 rows=15>'+rootNode.inText[r]+'</table></textarea>';
			}
			tID.innerHTML=innerHTML+'</tr></table>';
//idc.innerHTML+='<hr>Resultaat:<br><textarea cols=80 rows=35>'+tID.innerHTML+'</textarea>';
			rootNode.oudLevel = 0;
		}
	}
}

function nodeClose() {
//idc.innerHTML+='<hr>close<br>'+this.url+' '+this.text;
	if (nodepf.nodeMenu) {
		this.hide();
		rootNode.topLevel=this.level;
		nodePaint();
	}
}


function nodeWriteLink() {
//idc.innerHTML+='<hr>writeLink<br>'+this.url+' '+this.text+ ' '+this.shown+'<br>';
	if(this.shown) {
		rootNode.timeout = (this.level<=rootNode.oudLevel)?500:200;
		var r = Math.min(rootNode.right,this.level);
		var tdAttrib = (rootNode.tdAttrib)?rootNode.tdAttrib:'';
		var isKop = this.opened&&this.subn.length;
		if(this.level>=rootNode.right&&this.level==rootNode.topLevel-1) {
			var bgcolor='#ff7f00'
			var tdClause='bgcolor="#3f3f3f"'
		}else{
			var bgcolor='#3f3f3f'
			var tdClause=''
		}

	//	Sluit geneste boxes in meest rechtse kolom indien we naar een lager niveau gaan
		for(var i=rootNode.oudLevel;i>this.level;i--) {
			if(i>rootNode.right) {
				rootNode.inText[rootNode.right]+='</table></td></tr></table></td></tr>';
			}else{
				rootNode.inText[i]+='</td></tr>';
			}
		}

	//	Open een rij voor dit item	
		rootNode.inText[r]+='<tr><td width="100%" '+tdAttrib+'>';

	//	Indien het een kop is (geselecteerd en onderverdeling geopend), open dan een box
		if (isKop) rootNode.inText[r]+='<table bgcolor="'+bgcolor+'" width="100%" border=0 cellspacing=1 cellpadding=1><tr><td '+tdAttrib+' '+tdClause+'>';
	
	//	Bouw een "anchor" op voor dit item
		rootNode.inText[r]+='<a id="node_'+this.index+'" href="'+this.url+'"';
		if(!this.opened) rootNode.inText[r]+=' onMouseOver="idTimeout=setTimeout(\'rootNode.subn['+this.index+'].show()\','+rootNode.timeout+');" onMouseOut="clearTimeout(idTimeout);"';
		rootNode.inText[r]+='><font size=-1>'+this.text;
		if (this.subn.length) rootNode.inText[r]+='...';

	//	Sluit de rij af
		rootNode.inText[r]+='</font></a></td></tr>';

	//	Een kop buiten de laatste kolom: sluit de box, een kop in de laatste kolom: open box in box
		if (isKop) {
			if(this.level<rootNode.right) {
//				rootNode.inText[r]+='</table></td></tr>';
				rootNode.inText[r]+='</table>';
			}else{
				rootNode.inText[r]+='<tr><td><table bgcolor="#000000" width="100%" cellpadding=3>';
			}
		}
		rootNode.oudLevel = this.level;

//idc.innerHTML+='<hr>level='+this.level+'<br>r='+r+'<br>rootNode.inText['+r+']<br><textarea name=idctext cols=80 rows=20>'+rootNode.inText[r]+'</textarea>'
	}
}
