// --------------------------------------------------
// functions
// --------------------------------------------------


// --- functions - Trim a string (remove whitespace at begin and end)
function trim(strIn) {
	strIn = strIn.replace(/^\s+/,'');
	strIn = strIn.replace(/\s+$/,'');
	return strIn;
}


// --- functions - Layout
function changeBackgroundColor(elem, strColor) {
	elem.style.background = strColor;
}
function changeClassName(elem, strClass) {
	document.getElementById(elem).className = strClass;
}
function showElement(elem) {
	document.getElementById(elem).style.display = "block";
}
function hideElement(elem) {
	document.getElementById(elem).style.display = "none";
}


// --- functions - email validator
function validateEmail() {
	if (document.getElementById("email").value != "") {
		var strEmail= document.getElementById("email").value;
		var firstAt= strEmail.indexOf('@');
		var lastAt = strEmail.lastIndexOf('@');
		var dot = strEmail.lastIndexOf('.');
		if (firstAt != lastAt || firstAt <= 0 || dot <= firstAt + 1 || dot >= strEmail.length - 2)
		{
			alert("Ongeldig emailadres!");
			return false;
		}
	}
	return true;
}


// --- functions - Store last visited pages
function storeActualVisitedPage(strName, strValue) {
	var intDays = 30
	var objDate = new Date();
	var strExpires = "";
	var arrCookies = document.cookie.split(';');
	var intCounter = 0;

	// check wether actual visited page cookie exists
	// if so: remove this cookie
	for(var i = 0; i < arrCookies.length; i++) {
		var arrNameValuePair = arrCookies[i].split('=');
		if (trim(arrNameValuePair[0]) == strName) {
			objDate.setTime(objDate.getTime() + (-1 * 24 * 60 * 60 * 1000));
			strExpires = ";expires=" + objDate.toGMTString();
			document.cookie = strName + "="  + strExpires + ";path=/";
			intCounter --;
		}
		if (trim(arrNameValuePair[0]).indexOf("http") == 0) {
			intCounter ++;
		}
	}
	
	// calculate number of last visited pages
	// only last 10 visited pages are stored
	// otherwise remove first (oldest) cookie
	if (intCounter >= 10) {
		var blnFirstRemoved = false;
		for(var i = 0; i < arrCookies.length; i++) {
			if ( (trim(arrCookies[i]).indexOf("http") == 0) && (!blnFirstRemoved) ) {
				var arrFirstCookie = arrCookies[i].split('=');
				objDate.setTime(objDate.getTime() + (-1 * 24 * 60 * 60 * 1000));
				strExpires = ";expires=" + objDate.toGMTString();
				document.cookie = arrFirstCookie[0] + "="  + strExpires + ";path=/";
				blnFirstRemoved = true;
			}
		}
	}

	// add actual visited page to cookie
	objDate.setTime(objDate.getTime() + (intDays * 24 * 60 * 60 * 1000));
	strExpires = ";expires=" + objDate.toGMTString();
	document.cookie = strName + "=" + strValue + strExpires + ";path=/";
}


// --- functions - Get elements by classname
document.getElementsByClassName = function(strClassName) {
	var arrElements = [];
	var myClass = new RegExp("\\b" + strClassName + "\\b");
	var elem = this.getElementsByTagName("*");
	for (var i = 0; i < elem.length; i++) {
		var classes = elem[i].className;
		if (myClass.test(classes)) arrElements.push(elem[i]);
	}
	return arrElements;
};


// --- functions - Set tooltip-definitions at keywords
function Definition() {
}

Definition.setup = function() {

	if (!Definition.MAP) {
		return false;
	}
	
	function findElements(list) {
		var nl = [];
		for (var i in list) {
			if (list[i].charAt(0) == "#") { // element by id
				var n = document.getElementById(list[i].substring(1));
				if (n) {
					nl[nl.length] = n;
				}
			} else {
				if (list[i].charAt(0) == ".") { // elements by className
					var nl2 = document.getElementsByClassName(list[i].substring(1));
					for (var i = 0, l = nl2.length; i < l; i++) {
							nl[nl.length] = nl2[i];
					}
				} else { // elements by tagName
					var nl3 = document.getElementsByTagName(list[i].substring(0));
					for (var i = 0, l = nl3.length; i < l; i++) {
							nl[nl.length] = nl3[i];
					}
				}
			}
		}
		return nl;
	} 

	var wn = findElements(Definition.WHITELIST);
	var bn = findElements(Definition.BLACKLIST);
	var tn = [];

	function collectTextNodes(n) { // collect all descending text nodes in element n, excluding those in black list elements
		n = n.firstChild;
		while (n) {
			if (n.nodeType == 3) { // text node
				tn[tn.length] = [n, n.nodeValue];
			} else {
				if (n.nodeType == 1 && n.hasChildNodes()) { // element with child nodes
					var black = false;
					for (var i in bn) {
						if (n == bn[i]) { // element is on black list
							black = true;
							break;
						}
					}
				}
				if (!black && n.hasChildNodes()) {
					collectTextNodes(n);
				}
			}
			n = n.nextSibling;
		}
	}

	for (var i in wn){
		collectTextNodes(wn[i]); // kick off recursive function
	}
  
	var map = Definition.MAP;
	var maxocc = Definition.MAX_OCCURENCES;
	counter = 0;
	var m = []; 

	for (var i = 0; i < map.length; i++) {
		map[i][2] = map[i][0].toLowerCase();
	}

	for (var i in tn) { // loop through collected text nodes
    	if (maxocc > 0 && counter >= maxocc) {
    		break;
    	}
    	var v = tn[i][1];
    	var vLower = v.toLowerCase();
    
		for (var j = 0; j < map.length; j++) { // loop through all definitions
			if (map[j][0] == null) {
				continue;
			}
			if (vLower.indexOf(map[j][2]) != -1) {
				var key = map[j][0]; // keyword
				var regOptions = Definition.SINGLE_OCCURENCES ? 'i' : 'gi';
				v = v.replace(new RegExp("(^|[\\W])("+ key +")($|[\\W])", regOptions), '$1<dfn title="' + j +'">$2</dfn>$3');
				tn[i][1] = v;
				tn[i][2] = true;
				if (Definition.SINGLE_OCCURENCES) {
					map[j][0] = null;
				}
				counter++;
			}
		}
		if (tn[i][2]) {
			var el = tn[i][0];
			var span = document.createElement('span');
			span.innerHTML = tn[i][1];
			el.parentNode.insertBefore(span, el);
			el.parentNode.removeChild(el);
		}
	}

	//replace reference with real titles
	var list = document.getElementsByTagName('dfn');
	for (var i = 0; i < list.length; i++) {
		var arrNumber = list[i].getAttribute('title');
		if (!parseInt(arrNumber, 10)) {
			continue;
		}
		list[i].setAttribute('title', map[arrNumber][1]);
	}
}




// --------------------------------------------------
// code executed at end of every page
// --------------------------------------------------
if (document.getElementById && document.getElementsByTagName) {
	// get the URL
	var strUrl = window.location.href;
	// remove font-size parameter (conflict with recent visited pages widget)
	if (strUrl.indexOf("?grootte=") > 0) {
		var arrStrUrl = strUrl.split('?');
		strUrl = arrStrUrl[0];
	}
	
	// add this visited page to cookie
	// expires after 30 days
	if (document.getElementsByTagName("h1")[0].firstChild) {
		var strTitle = document.getElementsByTagName("h1")[0].firstChild.nodeValue;
		strTitle = strTitle.replace(/ /g, "_");
		strTitle = strTitle.replace(/;/g, "");
		strTitle = strTitle.replace(/,/g, "");
		storeActualVisitedPage(strUrl, strUrl + "##" + strTitle);
	}

	// icon forum mouseover effect
	if (document.getElementById("img_forum")) {
		var elemForumImg = document.getElementById("img_forum");
		elemForumImg.onmouseover = function() {
			this.src = "/images/elements/icon_forum_over.gif";
		}
		elemForumImg.onmouseout = function() {
			this.src = "/images/elements/icon_forum.gif";
		}
	}

	// remove prefilled value in searchboxes
	if (document.getElementById("searchbox")) {
		var elemSearchBox = document.getElementById("searchbox");
		elemSearchBox.onfocus = function() {
			if (this.value == "zoek op trefwoord") {
				this.value = "";
			} else {
				if (this.value == "search using key word") {
					this.value = "";
				}
			}
		}
	}

	// add javascript functionality to group-items (lp_homepage only)
	if (document.getElementById("groups")) {
		var arrElemsGroup = document.getElementsByClassName("group");
		for(var i = 0; i < arrElemsGroup.length; i ++) {
			// mouseover color
			arrElemsGroup[i].onmouseover = function() {
				changeBackgroundColor(this, "#f8e8e0");
			}
			// mouseout color
			arrElemsGroup[i].onmouseout = function() {
				changeBackgroundColor(this, "#f1e9e7");
			}
			// get and add URL to group-item
			arrElemsGroup[i].onclick = function() {
				var arrElemsA = this.getElementsByTagName("a");
				if (arrElemsA[0].href) location.href = arrElemsA[0].href;
			}
		}
	}

	// add javascript functionality to questions-block (cp_default only)
	if (document.getElementById("questions")) {
		var questionID;
		var answerID;
		var elemQuestions = document.getElementById("questions");
		// by default all answers are visible (opened)
		// javascript hides (closed) all answers
		var arrElemsAnswers = elemQuestions.getElementsByTagName("dd");
		for(var i = 0; i < arrElemsAnswers.length; i ++) {
			answerID = arrElemsAnswers[i].id;
			questionID = arrElemsAnswers[i].id.replace(/a/, "q");

			hideElement(answerID);
			changeClassName(questionID, "closed");
		}

		// add open/close functionality to question-items
		var arrElemsTerms = elemQuestions.getElementsByTagName("dt");
		for(var i = 0; i < arrElemsTerms.length; i ++) {
			arrElemsTerms[i].onclick = function() {
				questionID = this.id;
				answerID = questionID.replace(/q/, "a");
				
				switch (document.getElementById(questionID).className) {
					case "opened":
						changeClassName(questionID, "closed");
						hideElement(answerID);
						break;
					case "closed":
						changeClassName(questionID, "opened");
						showElement(answerID);
						break;
					default:
						// nothing
				}
			}
		}
	}

	// open external links in new browser window
	var arrElemsA = document.getElementsByTagName("a");
	for (var i = 0; i < arrElemsA.length; i++) {
		var elemA = arrElemsA[i];
		if (elemA.getAttribute("href") && elemA.getAttribute("rel") == "external") {
				elemA.target = "_blank";
		}
	}
	
	// last visited pages functionalities
	// show last visited div
	if (document.createElement && document.getElementById("lastVisited")) {
		var arrCookies = document.cookie.split(';');

		if (arrCookies.length > 0) {
			// create unordered list-node
			var elemLastVisited = document.getElementById("lastVisited");
			var newElement = document.createElement("ul");
			newElement.id = "listVisitedPages";
			elemLastVisited.appendChild(newElement);

			// add list-items (url-title) to unordered list node
			// ordered by recently visited pages first in row
			var elemListNode = document.getElementById("listVisitedPages");
			for(var i = arrCookies.length - 1; i >= 0; i--) {
				var arrNameValuePair = arrCookies[i].split('=');
				var arrUrlTitlePair = arrNameValuePair[1].split('##');
				if (arrUrlTitlePair[1]) {
					var newListItem = document.createElement("li");
					var newHyperlink = document.createElement("a");
					newHyperlink.href = arrUrlTitlePair[0];
					var strText = document.createTextNode(arrUrlTitlePair[1].replace(/_/g, " "));
					newHyperlink.appendChild(strText);
					newListItem.appendChild(newHyperlink);
					elemListNode.appendChild(newListItem);
				}
			}
		}
		showElement("lastVisited");
	}
	
	// Tooltips / definitions
	Definition.MAP = getDefinitionsArray ();
	Definition.WHITELIST = ["#content_wrapper"];
	Definition.BLACKLIST = ["#navigation",  "#header", "#specials", "#facetSearch", ".definitionlist", ".consultations", "h1", "h2", "h3", "h4", "h5", "h6", "a", "option"];
	Definition.MAX_OCCURENCES = 0;
	Definition.SINGLE_OCCURENCES = false;
	
	Definition.setup();
}
