/* --- 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,"");
}

/* --- 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 --- */
initAccordionGen = function() {
	var accordion = document.getElementById('secNavBar') || document.getElementById('secNavBarOver');
	if (!accordion) 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 = (document.getElementById('secNavBar')) ? 35 : 36;		// height of inflated chamber in pixels (interger)
	var chamberMaxHeight = (document.getElementById('secNavBar')) ? 248 : 84;		// 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
			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') || document.getElementById('secNavBarOver');
	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 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
}


///////////// HELPOVERLAY /////////////

helpOverlay = function() {
	var help = document.getElementById('help');
	if (!help) return;

	var overlay = document.getElementById('helpOverlay');
	if (!overlay) return;

	var closeLinks = overlay.getElementsByTagName('a');
	for (a=0; a<closeLinks.length; a++) {
		var closeLink = closeLinks[a];
		if (!hasClass(closeLink, "close")) continue;

		closeLink.onclick = function() {
			var overlay = getAncestor(this, "id", "helpOverlay", 4);
			if (!overlay) return;

			removeClass(overlay, "visible");
			return false;
		}

		var closable = true;
	}

	if (!closable) return;	// overlay mag alleen geopend kunnen worden indien deze ook weer gesloten kan worden.

	var openLinks = help.getElementsByTagName('a');
	for (a=0; a<openLinks.length; a++) {
		var openLink = openLinks[a];
		if (getAncestor(openLink, "id", "helpOverlay", 4)) continue;

		openLink.overlay = overlay;

		openLink.onclick = function() {
			addClass(this.overlay, "visible");
			return false;
		}
	}

	var input = document.getElementById('helpZoekenTerm');
	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;
	}
}


///////////// OVERLABEL /////////////

/* --- overLabel --- place labels over corresponding form control --- */
/* --- based on http://www.alistapart.com/articles/makingcompactformsmoreaccessible/ ---*/
overLabel = function() {
	var labels;
	if (!(labels = document.getElementsByTagName('label'))) return;

	for (l=0; l<labels.length; l++) {
		var label = labels[l];
		if (!(hasClass(label, "overLabel") && label.htmlFor)) continue;

		var overControl = document.getElementById(label.htmlFor);
		if (!overControl) continue;

		label.forControl = overControl;	// make reference from label to corresponding control

		if (overControl.value === "") addClass(overControl.parentNode, "inactive");	// make sure label is only placed on top of control in case it has no value which is not always the case after a reload

		overControl.onfocus = function() {
			removeClass(this.parentNode, "inactive");
		}

		overControl.onblur = function() {
			if (this.value === "") addClass(this.parentNode, "inactive");
		}

		label.onclick = function() {	// needed for Safari
			this.forControl.focus();	// give focus to corresponding control
		}
	}

	addClass(document.body, "jsLabelsOn");	// CSS hook to turn it on
}

clickEmpty = function() {
	var parentSelect = this.parentNode;
	parentSelect.options[0] = parentSelect.labelOption;
	parentSelect.options[0].selected = "selected";
}


///////////// PARADE /////////////

/* --- initParade --- initiate parade --- */
initParade = function() {
	var parade = document.getElementById('parade');
	if (!parade) return;

	var itemWidth = 185;		// width of parade item (width + margin + padding + border) in pixels (integer)
	var scrollStep = -1;		// number of pixels in scroll step (signed integer)
	var scrollInterval = 50;	// duration of scroll step in miliseconds (integer >= 50)

	parade.itemWidth = itemWidth;
	parade.scrollStep = scrollStep;
	parade.scrollInterval = scrollInterval;

	var paradeItems = document.getElementById('paradeItems');
	if (!paradeItems) return;

	paradeItems.order = [];
	parade.items = paradeItems;

	var pItems = paradeItems.getElementsByTagName('li');
	for (i=0; i<pItems.length; i++) {
		var paradeItem = pItems[i];

		if (!paradeItem.id) {	// if {item has no ID yet} (give one)
			var itemID = "paradeItem" + paradeItems.order.length;
			var itemIDitem = document.getElementById(itemID);
			while (itemIDitem) {
				itemID += "x";
				var itemIDitem = document.getElementById(itemID);
			}
			paradeItem.id = itemID;
		}

		paradeItems.order[paradeItems.order.length] = paradeItem.id;
	}

	paradeItems.style.width = (paradeItems.order.length * parade.itemWidth) + "px";

	paradeItems.onfocus = function() {
		var parade = document.getElementById('parade');
		if (!parade) return;

		clearInterval(parade.scrolling);
		parade.scrolling = null;
	}

	paradeItems.onblur = function() {
		var parade = document.getElementById('parade');
		if (!parade) return;

		parade.scroll();
	}

	parade.scroll = function() {
		this.scrolling = setInterval('adjustPosition()', scrollInterval);
	}

	parade.getPosition = function() {
		var pos = parseInt(this.items.style.left) || 0;
		return pos;
	}

	parade.reorder = function(direction) {
		if (!direction && direction != 0) return;

		var paradeItems = this.items;

		var firstItem = document.getElementById(paradeItems.order[0]);
		if (!firstItem) return;

		if (direction > -1) {	// to the right
			var lastItem = document.getElementById(paradeItems.order[paradeItems.order.length - 1]);
			if (!lastItem) return;

			lastItem.parentNode.insertBefore(lastItem,firstItem);	// last node becomes first
			paradeItems.order.unshift(paradeItems.order.pop());		// synchronise array

			return (this.itemWidth * -1);
		}
		else {					// to the left
			firstItem.parentNode.appendChild(firstItem);			// first node becomes last
			paradeItems.order.push(paradeItems.order.shift());		// synchronise array

			return (this.itemWidth);
		}
		return 0;
	}

	adjustPosition(0);
	parade.scroll();

	var scrollPrev = document.getElementById('scrollPrev');
	if (!scrollPrev) return;

	scrollPrev.onclick = function() {
		var parade = document.getElementById('parade');
		if (!parade) return;

		adjustPosition(parade.itemWidth);
		return false;
	}

	var scrollNext = document.getElementById('scrollNext');
	if (!scrollNext) return;

	scrollNext.onclick = function() {
		var parade = document.getElementById('parade');
		if (!parade) return;

		adjustPosition(parade.itemWidth * -1);
		return false;
	}

}

/* --- adjustPosition() --- move parade items --- */
function adjustPosition(distance) {
	var parade = document.getElementById('parade');
	if (!parade) return;

	if (!distance && distance != 0) distance = parade.scrollStep;
	var pos = parade.getPosition() + distance;

	var correction = (pos < (parade.itemWidth * -1) || pos > parade.scrollStep) ? parade.reorder(distance) : 0;
	parade.items.style.left = (pos + correction) + "px";
}


///////////// FAQ /////////////

initFaq = function() {
	var faq = document.getElementById('faq');
	if (!faq) return;

	var answers = faq.getElementsByTagName('dd');
	if (!answers[0] || !answers[0].previousSibling) return;	// either the previousSibling property is not supported or the <dl> is corrupt (starts with a <dd>)

	for (a=0; a<answers.length; a++) {
		var answer = answers[a];

		var ddArr = [];
		var prevSibling = answer;

		do {	// find corresponding <dt>
			if (!prevSibling.done && prevSibling.nodeName == "DD") {
				ddArr[ddArr.length] = prevSibling;
				prevSibling.done = true;
			}
			var prevSibling = prevSibling.previousSibling;
		} while (prevSibling.nodeName == "DD" || prevSibling.nodeType == 3);

		if (prevSibling.nodeName != "DT" || ddArr.length == 0) continue;
		var question = prevSibling;

		var questionLabel = question.getElementsByTagName('span')[1];
		questionLabel.innerHTML = '<a href="#">' + questionLabel.innerHTML + '</a>';	// add <a> in order to make it accessible for keyboard

		question.answers = ddArr;

		questionLabel.onclick = function() {
			var dl = getAncestor(this.parentNode, "nodeName", "DL");
			if (!dl) return;

			if (dl.current && this.parentNode != dl.current) {
				for (c=0; c<dl.current.answers.length; c++) {

					removeClass(dl.current.answers[c], "open");
				}
				removeClass(dl.current, "open");
			}

			var openState = hasClass(this.parentNode, "open");
			for (n=0; n<this.parentNode.answers.length; n++) {
				openState ? removeClass(this.parentNode.answers[n], "open") : addClass(this.parentNode.answers[n], "open")
			}
			openState ? removeClass(this.parentNode, "open") : addClass(this.parentNode, "open")

			dl.current = this.parentNode;
			return false;
		}

		questionLabel.onmouseover = questionLabel.onfocus = function() {
			addClass(this, "jsHover");
		}

		questionLabel.onmouseout = questionLabel.onblur = function() {
			removeClass(this, "jsHover");
		}

		var checkBoxes = answer.getElementsByTagName('input');
		for (i=0; i<checkBoxes.length; i++) {
			var checkBox = checkBoxes[i];
			if (!(hasClass(checkBox, "notUseful") || hasClass(checkBox, "useful"))) continue;

			if (hasClass(checkBox, "notUseful")) answer.notUseful = checkBox;
			if (hasClass(checkBox, "useful")) answer.useful = checkBox;

			var divs = answer.getElementsByTagName('div');
			for (d=0; d<divs.length; d++) {
				var missInAnswer = divs[d];
				if (!hasClass(missInAnswer, "missInAnswer")) continue;

				answer.missing = missInAnswer;
				break;
			}

			checkBox.onclick = function() {
				var answer = getAncestor(this, "tagName", "DD", 5);
				if (!answer) return;

				if (answer.notUseful.checked) {
					addClass(answer, "notUseful");
				}
				else {
					removeClass(answer, "notUseful");
				}
			}
		}
	}

	addClass(faq, "jsFaqOn");	// CSS hook to turn it on
}


///////////// BOODSCHAPPENLIJST /////////////

/* --- initBoodschappenLijst --- */
initBoodschappenLijst = function() {
	var boodschappenLijst = document.getElementById('boodschappenLijst');
	if (!boodschappenLijst) return;

	var delay = 4;	// delay time for auto closure in seconds (integer)

	boodschappenLijst.delay = delay;

	var items = boodschappenLijst.getElementsByTagName('li');
	if (items.length < 1) return;

	var showList = document.getElementById('showList');	// boodschappenlijst link
	if (!showList) return;

	showList.onclick = function() {
		if (hasClass(this.parentNode, "open")) {
			closeList();
		}
		else {
			addClass(this.parentNode, "open");
			startDelay(this.parentNode);
		}
		return false;
	}

	var links = boodschappenLijst.getElementsByTagName('a');
	for (a=0; a<links.length; a++) {
		var thisLink = links[a];

		if (hasClass(thisLink, "close")) {				// close link
			thisLink.onclick = function() {
				closeList();
				return false;
			}
		}
		else if (hasClass(thisLink, "print")) {			// print link
			thisLink.onclick = function() {
				window.open(this.href, "print", "width=570,height=650,menubar=yes,toolbar=yes,scrollbars=yes,resizable=yes");
				startDelay(this.parentNode);
				return false;
			}
		}
	}

	addClass(document.body, "jsBoodschappenLijstOn");	// CSS hook to turn it on
	startDelay(boodschappenLijst);						// close layer (it may be open on page load)
}

function startDelay(list) {
	list.timer = setTimeout("closeList()", list.delay * 1000);
}

function closeList() {
	var boodschappenLijst = document.getElementById('boodschappenLijst');
	if (!boodschappenLijst) return;

	clearTimeout(boodschappenLijst.timer);
	boodschappenLijst.timer = null;

	removeClass(boodschappenLijst, "open");
}


///////////// SELECT NAVIGATION /////////////

/* --- initSelectNav --- initialezes autosubmit on <select>s that have class="selectNav", works with keyboard too (in IE, FX and Op) --- */
initSelectNav = function() {
	var selects = document.getElementsByTagName('select');

	var countSelectNavs = false;
	for (s=0; s<selects.length; s++) {
		var selectNav = selects[s];
		if (!hasClass(selectNav, "selectNav")) continue;

		selectNav.onfocus = function() {
			this.origVal = this.value;
		}

		selectNav.onchange = function() {
			if (this.newVal) this.origVal = this.newVal;
			this.newVal = this.value;
		}

		selectNav.onblur = selectNav.onclick = function() {
			if (this.newVal && this.newVal != this.origVal) this.form.submit();
		}

		countSelectNavs = true;
	}

	if (countSelectNavs) addClass(document.body, "jsSelectNavOn");
}


///////////// POPINFO /////////////

/* --- popInfo --- */
popInfo = function() {
	/* DIV section -|- add section for every tagName */
	var divs = document.getElementsByTagName('div');
	popThisInfo(divs);
	/* end DIV section */

	addClass(document.body, "jsPopInfoOn");	// CSS hook to turn it on
}

function popThisInfo(nodelist) {
	for (n=0; n<nodelist.length; n++) {
		var node = nodelist[n];
		if (!hasClass(node, "popInfo")) continue;

		node.onmouseover =  function() {
			addClass(this, "jsHover");
		}

		node.onmouseout = function() {
			removeClass(this, "jsHover");
		}

		/* in order to make it work for keyboard as well... */
		var popLink = node.getElementsByTagName('a')[0];
		if (!popLink) continue;

		var ancestor = popLink;
		popLink.ancestorLevel = 0;
		do {
			ancestor = ancestor.parentNode;
			popLink.ancestorLevel++;
		} while (ancestor == node || popLink.ancestorLevel > 10);

		if (popLink.ancestorLevel > 10) continue;

		popLink.onfocus = function() {
			var node = getParent(this);
			node.onmouseover();
		}

		popLink.onblur = function() {
			var node = getParent(this);
			node.onmouseout();
		}
	}
}

function getParent(node) {
	var ancestor = node;
	for (p=1; p<node.ancestorLevel; p++) {
		ancestor = ancestor.parentNode;
	}
	return ancestor;
}


///////////// OVERFLOW /////////////

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

	var divs = mainContent.getElementsByTagName('div');
	for (d=0; d<divs.length; d++) {
		var div = divs[d];
		if (!hasClass(div, "werkenBij")) continue;

		var overflowOn = false;

		var cutOffs = div.getElementsByTagName('div');
		for (c=0; c<cutOffs.length; c++) {
			var cutOff = cutOffs[c];
			if (!hasClass(cutOff, "overflow")) continue;

			overflowOn = true;
			addClass(div, "flow");
			break;
		}

		if (!overflowOn) continue;

		div.innerHTML += '<a class="toggleOverflow" href="#"><img src="fileadmin/template/images/ico_showoverflow.gif" width="7" height="4" title="Toon alle vacatures" alt="Toon alle vacatures" /></a>';
		var toggleOverflows = div.getElementsByTagName('a');
		for (t=0; t<toggleOverflows.length; t++) {
			var toggleOverflow = toggleOverflows[t];
			if (!hasClass(toggleOverflow, "toggleOverflow")) continue;

			toggleOverflow.onclick = function() {
				var ico = this.getElementsByTagName('img')[0];
				if (ico) {
					ico.showSrc = "fileadmin/template/images/ico_showoverflow.gif";
					ico.showTitle = "Toon alle vacatures";
					ico.showAlt = "Toon alle vacatures";
					ico.hideSrc = "fileadmin/template/images/ico_hideoverflow.gif";
					ico.hideTitle = "Verberg overige vacatures";
					ico.hideAlt = "Verberg overige vacatures";
				}

				var werkenBij = this.parentNode;
				if (hasClass(werkenBij, "show")) {
					removeClass(werkenBij, "show");
					if (ico) {
						ico.src = ico.showSrc;
						ico.title = ico.showTitle;
						ico.Alt = ico.showAlt;
					}
				}
				else {
					addClass(werkenBij, "show");
					if (ico) {
						ico.src = ico.hideSrc;
						ico.title = ico.hideTitle;
						ico.Alt = ico.hideAlt;
					}
				}
				return false;
			}
		}

	}
}


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

/* --- call functions only if the used methods are supported --- */
if (document.getElementById && document.createElement) {
	if (cssSupport()) {
		addLoadEvent(popInfo);
		addLoadEvent(initSelectNav);
		addLoadEvent(initAccordionGen);
		addLoadEvent(helpOverlay);
		addLoadEvent(overLabel);
		addLoadEvent(initBoodschappenLijst);
		addLoadEvent(initParade);
		addLoadEvent(initFaq);
		addLoadEvent(initOverflow);
	}

}