/* --- JavaScript --- */
/* --- General --- */

/* --- add functions to onload event: addLoadEvent(functionName); --- */
/* --- http://simonwillison.net/2004/May/26/addLoadEvent/ --- */
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	}
	else {
		window.onload = function() {
			if (oldonload) {
				oldonload();
			}
			func();
		}
	}
}

/* --- createElement() --- */
function createElement(element) {
	if (typeof document.createElementNS != 'undefined') {
		return document.createElementNS('http://www.w3.org/1999/xhtml', element);
	}
	if (typeof document.createElement != 'undefined') {
		return document.createElement(element);
	}
	return false;
}

/* --- setAttributes() --- */
function setAttributes(element,attr) {	// format attr: [['class','actief'],['href','http://www.test.xx']]
	if (typeof element.setAttributeNS != 'undefined') {
		for (a=0; a<attr.length; a++) {
			element.setAttributeNS('http://www.w3.org/1999/xhtml',attr[a][0],attr[a][1]);
		}
	}
	if (typeof element.setAttribute != 'undefined') {
		for (a=0; a<attr.length; a++) {
			element.setAttribute(attr[a][0],attr[a][1]);
		}
	}
	return false;
}

/* --- add className --- */
function addClass(node, className) {
	removeClass(node, className);	// make sure there won't be any doubles
	node.className += " " + className;
}

/* --- remove className --- */
function removeClass(node, className) {
	//var seperator = (node.className.length == className.length) ? "" : " ";
	//node.className = node.className.replace(seperator + className,"");
	node.className = node.className.replace(className,"");
}

/* --- check if node has className --- */
function hasClass(node, className) {
	var nodeClass = node.className;
	if (!className && nodeClass != "") return true;			// if no className is specified any className will do
	if (className && nodeClass.indexOf(className) > -1) {	// match, but not exact
		var nodeClasses = nodeClass.split(/\s+/);			// seperate class names (devided by one or more whitespaces)
		for (c=0; c<nodeClasses.length; c++) {
			if (nodeClasses[c] == className) return true
		}
	}
	return false;
}

/* --- get first ancestor that matches the property --- */
function getAncestor(node, property, value, levels) {	// levels is an optional argument
	var parent = node;
	var level = (levels) ? levels : 1;
	do {
		parent = parent.parentNode;
		if (!parent || parent.nodeName == "HTML") return false;	// there is no parent or parent is <html>

		if ((parent[property] == value) ? true : hasClass(parent, value)) return parent; // return parent if property matches value

		if (levels) level--;
	} while (parent.parentNode && parent.parentNode.nodeName != "HTML" && level > 0);
}

/* --- check for CSS support --- */
function cssSupport() {
	if (!document.styleSheets) return false;	// styleSheets object is not supported
	var css = document.styleSheets;
	for (s=0; s<css.length; s++) {
		if (s == 0) {
			if (!(css[0].cssRules || css[0].rules)) return false;	// both methods (cssRules/rules) are not supported
		}
		if (!css[s].disabled) return true;	// at least one of the stylesheets is not disabled
	}
	return false;	// stylesheets are all disabled or not supported at all
}


/* =================================== */
/* ===== site specific functions ===== */
/* =================================== */


///////////// ACCORDION /////////////

/* --- initAccordion --- initiate accordion --- */
initAccordion = function() {
	var accordion = document.getElementById('secNavBar');
	if (!accordion || hasClass(accordion, "noAction")) return;

	//var initState = 0;				// number of chamber that should be open on page load  (integer, starts with 0)
	var labelElement = "h2";		// element of chamber label (string)
	var chamberMinHeight = 45;		// height of inflated chamber in pixels (interger)
	var chamberMaxHeight = 131;		// height of inflated chamber in pixels (interger)
	var animSteps = 6;				// number of steps in animation (integer)
	var animInterval = 50;			// duration of animStep in miliseconds (integer >= 50)

	accordion.chambers = [];					// array of chambers
	accordion.chamberMinHeight = chamberMinHeight;
	accordion.chamberMaxHeight = chamberMaxHeight;
	accordion.animSteps = animSteps;
	accordion.animInterval = animInterval;
	accordion.animAction = [];					// array with animation steps already taken

	var numOfChambers = 0;

	var chambers = accordion.getElementsByTagName('div');
	for (b=0; b<chambers.length; b++) {
		var chamber = chambers[b];
		if (!hasClass(chamber, "addNav")) continue;

		accordion.chambers[accordion.chambers.length] = chamber;
		chamber.accordion = accordion;			// keep ref to accordion

		var label = chamber.getElementsByTagName(labelElement)[0];
		if (!label) continue;

		//label.innerHTML = '<a href="#">' + label.innerHTML + '</a>';	// insert hyperlink for keyboard navigation

		chamber.label = label;					// keep ref to label;
		chamber.animate = animateChamber;		// make animation method of chamber

		if (hasClass(chamber, "accOffOpen")) {
			removeClass(chamber, "accOffOpen");		// undo JS-off state
		//if (numOfChambers == initState) {
			addClass(chamber, "open");			// set initial state
			accordion.inflateChamber = chamber;	// keep ref to open chamber

			label.onclick = function() {
				return false;
			}
		}
		else {
			// addClass(chamber, (accordion.inflateChamber) ? "down" : "up");

			label.onclick = labelClick;			// activate label
		}

		numOfChambers++;
	}
	if (numOfChambers > 1) addClass(accordion, "accOn");	// only activate when there are more than 2 chambers
}

/* --- labelClick --- handle click on chamber label --- */
labelClick = function() {
	var labelChamber = getAncestor(this, "className", "addNav");	// find chamber
	if (!labelChamber) return false;

	labelChamber.animate();
	return false;
}

/* --- animateChamber --- calculate chamber animation --- */
animateChamber = function() {
	var acc = this.accordion;
	for (a=0; a<acc.animAction.length; a++) {
		clearTimeout(acc.animAction[a]);		// clear previous animation steps
	}
	acc.animAction.length = 0;

	acc.deflateChamber = acc.inflateChamber;
	acc.inflateChamber = this;

	var step = 0;
	var stepSize = (acc.chamberMaxHeight - acc.chamberMinHeight) / acc.animSteps;

	//removeClass(acc.deflateChamber, (hasClass(acc.deflateChamber, "up")) ? "up" : "down");
	acc.deflateChamber.openClass = true;

	do {
		var acceleration = Math.sin(2 * Math.PI / acc.animSteps * (step + 1)) * -1 * stepSize;	// deviation that creates an animation curve, set acceleration to 0 for linear animation
		var height = Math.round(stepSize * (step + 1) + acceleration);

		if (step >= acc.animSteps || height > acc.chamberMaxHeight) height = acc.chamberMaxHeight;

		var interval = acc.animInterval * step;

		acc.animAction[step] = setTimeout('alterHeights(' + height + ')', interval);
		step++;
	} while (step < acc.animSteps && height < acc.chamberMaxHeight);

	interval = acc.animInterval * step;
	setTimeout('reInit("' + acc.id + '")', interval);
}

/* --- alterHeights --- */
function alterHeights(height) {
	var accordion = document.getElementById('secNavBar');
	if (!accordion) return;

	if (accordion.deflateChamber.openClass) {
		removeClass(accordion.deflateChamber, "open");
		accordion.deflateChamber.openClass = false;
	}

	accordion.inflateChamber.style.height = (accordion.chamberMinHeight + height) + "px";
	accordion.deflateChamber.style.height = (accordion.chamberMaxHeight - height) + "px";
}

/* --- reInit --- finalize animation/new status --- */
function reInit(id) {
	var acc = document.getElementById(id);
	if (!acc) return;

	acc.inflateChamber.label.onclick = function() {
		return false;		// open chamber has no active label
	}

	addClass(acc.inflateChamber, "open");

	var oldContent = document.getElementById(acc.deflateChamber.id + "_content");	// gaat er van uit dat de contentDivs een id hebben dat als volgt is opgebouwd: id van chamber + '_content'
	var newContent = document.getElementById(acc.inflateChamber.id + "_content");
	removeClass(oldContent, "visible");	// verwijder de className "visible" van de contentDiv die gesloten moet worden
	addClass(newContent, "visible");	// voeg de className "visible" toe aan de contentDiv die geopend moet worden

	//addClass(newContent.parentNode, "showContent");
	if (!hasClass(newContent.parentNode, "showContent")) {
		var kunnenWijUHelpen = document.getElementById('kunnenWijUHelpen');
		if (kunnenWijUHelpen) {
			var headerLink = kunnenWijUHelpen.getElementsByTagName('a')[0];
			if (headerLink) canWeHelpLink(headerLink);
		}
	}

	/*var down = false;
	for (c=0; c<acc.chambers.length; c++) {
		var chamber = acc.chambers[c];

		if (chamber == acc.inflateChamber) down = true;

		removeClass(chamber, (down) ? "up" : "down");
		addClass(chamber, (down) ? "down" : "up");
	}*/

	acc.deflateChamber.label.onclick = labelClick;	// activate label of closed chamber
}

canWeHelp = function() {
	var kunnenWijUHelpen = document.getElementById('kunnenWijUHelpen');
	if (!kunnenWijUHelpen) return;

	var headerLink = kunnenWijUHelpen.getElementsByTagName('a')[0];
	if (!headerLink) return;

	canWeHelpLink(headerLink);

	headerLink.onclick = function() {
		canWeHelpLink(this);
		return false;
	}
}

function canWeHelpLink(headerLink) {
	var mainContent = document.getElementById('mainContent');
	if (!mainContent) return;

	var ico = headerLink.getElementsByTagName('img')[0];

	if (hasClass(mainContent, "showContent")) {
		removeClass(mainContent, "showContent");
		var state = "close";
		var prevState = "open";
		var alt = "sluiten";
	}
	else {
		addClass(mainContent, "showContent");
		var state = "open";
		var prevState = "close";
		var alt = "open";
	}

	if (ico) {
		ico.src = ico.src.replace(prevState, state);
		ico.alt = alt;
	}

}


helpenZoeken = function() {
	var input = document.getElementById('helpenZoekenTerm');
	if (!input) return;

	input.origValue = "Tip: Zoek op de volgende manier: analyse data";
	input.value = input.origValue;

	input.onfocus = function() {
		if (this.value === this.origValue) this.value = "";
	}

	input.onblur = function() {
		if (this.value === "") this.value = this.origValue;
	}
}



/* =================================== */
/* === call functions on page load === */
/* =================================== */

/* --- call functions only if the used methods are supported --- */
if (document.getElementById && document.createElement) {
	if (cssSupport()) {
		addLoadEvent(initAccordion);
		addLoadEvent(canWeHelp);
		addLoadEvent(helpenZoeken);
	}
}
