/* Deze functies zorgen voor het controleren van het menu 
 *
 * Uses: DHTML_API.js
 * Uses: findPosition.js
 * Uses: cookieControl.js
 */

/* 	Instellingen voor het menu
	- gebruikFadeEffect:		Wel of geen gebruik maken van het fade effect tijdens het zichtbaar maken van het submenu
								Opm: true of false. 
								Opm: Werkt alleen in IE.
	- fadeEffectDuur:			De tijd die het moet duren voordat de fade is afgelopen. Dit is een duur in seconden. 
								Opm: Deze wordt alleen gebruikt als gebruikFadeEffect true is. 
								Opm: >= 0
	- gebruikRolEffect:			Wel of geen gebruik maken van het vertical afrol effect. 
								Opm: true of false
	- fadeEffectDuur:			De snelheid waarmee het roleffect moet plaatsvinden.
								Opm: Deze wordt alleen gebruikt als gebruikRolEffect true is. 
								Opm: >= 1 (traagste) en <= 100 (snelste)
	- verbergSubMenuNaTimeout:	Wel of niet verbergen van het submenu na het verstrijken van een aantal seconden nadat het zichtbaar is gemaakt.
								Opm: true of false
	- subMenuTimeoutTijd:		De tijd die moet verstrijken voordat een submenu weer wordt verborgen ndadat het zichtbaar is genmaakt.
								Opm: Deze wordt alleen gebruikt als verbergSubMenuNaTimeout true is. 
								Opm: >= 0
	- storeState:				Opslaan van de toestand van het menu, zodat deze kan worden hersteld na verversen van een pagina.
								Opm: Wanneer de state ook daadwerkelijk moet worden hersteld na een new request, dan moet in de onLoad van de body tag
									een aanroep naar restoreMenuState() staan.
								Opm: true of false
								Opm: Zet deze op false als je niet wil dat er gebruik wordt gemaakt van cookies.
	- behaviour					De manier waarop het menu wordt gebruilkt.
								0:	Wanneer showMenu wordt aangeroepen wordt het menu meteen uitgeklapt en opgeslagen in de state als uitgeklapt
								1:	Wanneer showMenu wordt aangeroepen wordt het menu niet uitgeklapt, maar wel in de state als zodanig opgeslagen. Wanneer de pagina wordt
									ververst, dan klapt het menu alsnog uit.
	- submenuheight				Het aantal pixels dat de submenu a's hoog zijn.
*/ 
var gebruikFadeEffect		= false;
var fadeEffectDuur			= 0.5; /* dit is de duration in seconden. Hoger  getal geeft dus een tragere fade */
var gebruikRolEffect		= false;
var rolEffectSnelheid		= 5; /* 1 traagste, 100 snelste */
var verbergSubMenuNaTimeout	= false;
var subMenuTimeoutTijd		= 5000; /* In milliseconden */
var storeState				= true; 
var behaviour				= 0;
var submenuheight			= 22;

/* Hieronder begint de code. Niets aan veranderen dus */
var checkIt;
var rolluit;
var rows;
var disableEffects 			= false;

var ADD		= 0;
var REMOVE	= 1;

function showMenu(menunr) {
	if (behaviour == 0) {
		closeAll();
		userInput();		
		rolMenuUit(menunr);
	} else {
		// Nog te bouwen
	}
}

function userInput() {	
	if (checkIt) clearTimeout(checkIt);
	if (rolluit) clearTimeout(rolluit);
	if (verbergSubMenuNaTimeout) checkIt = setTimeout('closeAll(1)', subMenuTimeoutTijd);
}

function closeAll() {
	var i = 1;
	for (;;) {
		if (storeState) storeMenuState(i, REMOVE);
		try {
			var menuObj = new getObj('menu' + i + '_sub');			
		} catch (error) {
			/* Er bestaat geen menuitem i */
			break;	
		}		
		menuObj.style.display = 'none';
		
		/* Alle a's onzichtbaar maken om ze straks zichtbaar te maken met een fade.
		 * Deze fade werkt met een DLL specifiek voor IE, en zorgt ervoor dat de oude inhoud 
		 * van een element wordt gefaded naar de nieuwe inhoud van een element. In dit geval 
		 * is de oude inhoud dus de onzichtbare a's en de nieuwe inhoud de zichtbare a's.
		 */
		var rows = getRows(i);
		for (var j=0; j < rows.length; j++) {
			rows[j].style.visibility = 'hidden';		
		}
		i++; 
	}
}

function rolMenuUit(menunr) {
	if (document.getElementById) {			
		
		if (storeState) storeMenuState(menunr, ADD);
		
		var x = findPosX(document.getElementById('submenucontainer')) + 5;
		var y = findPosY(document.getElementById('submenucontainer')) + 14;		
		var menuObj = new getObj('menu' + menunr + '_sub');
		
		menuObj.style.left		= x + 'px';
		menuObj.style.top		= y + 'px';
		menuObj.style.height	= '0';
		menuObj.style.overflow	= 'hidden'; /* clip werkt niet in Mozilla, dus vandaar deze constructie met overflow en height*/
		menuObj.style.display	= 'block';
		menuObj.style.filter	= 'progid:DXImageTransform.Microsoft.Fade(duration=' + fadeEffectDuur + ')';
		
		// Alle a's zichtbaar maken met een fade (fade werkt alleen in IE)
		if (gebruikFadeEffect && !disableEffects) try { menuObj.obj.filters[0].Apply(); } catch (error) {	/* Het kan zijn dat deze DLL niet is geregistreerd, of niet bestaat */}
		var rows = getRows(menunr);
		for (var j=0; j < rows.length; j++) {
			rows[j].style.visibility = 'visible';		
		}
		if (gebruikFadeEffect && !disableEffects) try { menuObj.obj.filters[0].Play(); } catch (error) {	/* Het kan zijn dat deze DLL niet is geregistreerd, of niet bestaat */}
		
		showRow(0, menunr, getRows(menunr).length * submenuheight);
	}
}

function showRow(currentPercentage, menunr, hoogte) {
	if (currentPercentage < 100) {
		currentPercentage		= currentPercentage + ((gebruikRolEffect && !disableEffects)? rolEffectSnelheid: 100);
		var menuObj				= new getObj('menu' + menunr + '_sub');
		menuObj.style.height	= Math.round((currentPercentage / 100 ) * hoogte) + 'px';
		rolluit					= setTimeout('showRow(' + currentPercentage + ', ' + menunr + ', ' + hoogte + ')', submenuheight);	
	}
}

function getRows(menunr) {
	return document.getElementById('menu' + menunr + '_sub').getElementsByTagName('a')
}

/************************/
/*	MENUSTATE METHODEN	*/
/************************/

function restoreMenuState() {
	var visibleMenuIds = getMenuState();
	// Alle effecten even weglaten, dan herstelt het menu zich sneller.
	disableEffects = true;
	for (var i=0; i < visibleMenuIds.length; i++) {
		showMenu(parseFloat(visibleMenuIds[i]));
	} 
	disableEffects = false;
}

function storeMenuState(menuNr, actionType) {
	var visibleMenuIds = getMenuState();
	var newVisibleMenuIds = new Array(visibleMenuIds.length + 1);
	var found = false;
	for (var i =0; i < visibleMenuIds.length; i++) { 		
		found = visibleMenuIds[i] == menuNr;
		newVisibleMenuIds[i] = visibleMenuIds[i]; 
		if (actionType == REMOVE && visibleMenuIds[i] == menuNr) newVisibleMenuIds[i] = null;
	}
	if (actionType == ADD && !found) newVisibleMenuIds[visibleMenuIds.length + 1] = menuNr; 
	
	setMenuState(newVisibleMenuIds);
}

/* Retourneert een array van ids van submenu;s die zichtbaar moeten zijn volgens de opgeslagen state */
function getMenuState() {
	var arr = (getCookie("visibleMenuIds") == null? "": getCookie("visibleMenuIds")).split("-");	
	if (arr.length == 1 && arr[0] == "") {
		return new Array(0);
	} else {
		return arr;
	}
}

/*	Slaat de toestand van het menu op. Als invoer wordt een array van menuIds verwacht. 
	Als op een plek in het array null staat, dan wordt deze waarde niet opgeslagen. 
*/
function setMenuState(state) {
	var StateAsString = "";
	for (var i =0; i < state.length; i++) { 				
		StateAsString += (StateAsString != ""? "-": "") + (state[i] != null?state[i]: "");
	}
	setCookie("visibleMenuIds", StateAsString);
}