/* $Id:$ */
var attentionColor = '#faf8cc';
var faderSpeed = 30;
var faderIncrease = 1;
window.onload = init;

// generic onload function. Add calls to the functions you want to run on document load to this function
function init() {
	focusForm();
	addFormChecker();
	addSelectAll();
	clickableRows();
	externalWindow();
	kwalificatieSelect();
	addCustomOmgeving();
	stageAanmeldenHelp();
	disableHelpBlockClicks();
	if (navigator.userAgent.indexOf("safari") > 0 || navigator.userAgent.indexOf("applewebkit") > 0) {
	  var labels = document.getElementsByTagName("label");
	  for (i = 0; i < labels.length; i++) {
	    labels[i].addEventListener("click", addLabelFocus, false);
    }
  }
}

// emulate innerText for non-ie/opera browsers
if(!window.ScriptEngine && !window.opera) {
	HTMLElement.prototype.__defineGetter__("innerText", function () {
		 var r = this.ownerDocument.createRange();
		 r.selectNodeContents(this);
		 return r.toString();
	});
}

// does exactly what is says
function getParentByTagName(element,tag) {
	while (element != null && element.tagName.toLowerCase() != tag.toLowerCase()) {
		element = element.parentNode;
	}
	return element;
}

function _debug(str) {
    // Easy debugging... Mozilla only
    java.lang.System.out.println(str);
}

function disableHelpBlockClicks() {
	var i, j, objs = document.getElementsByTagName('a');
	for(i=0, j=objs.length; i<j; i++) {
		if(objs[i].className == 'help-block') {
			objs[i].onclick = function() { this.blur(); return false; };
		}
	}
}

// make the fields in the stage aanmelden form show their helptekst on focus
function stageAanmeldenHelp() {
	var i, j, els, obj = document.getElementById('stage-aanmelden-form');
	if(obj !== null) {
		els = obj.getElementsByTagName('input'); 
		for(i=0,j=els.length; i<j; i++) {
			if(els[i].type == 'text' || els[i].type == 'checkbox' || els[i].type == 'radio') {
				els[i].onfocus = showHelp;
				els[i].onblur = hideHelp;
			}
		}
		els = obj.getElementsByTagName('textarea');
		for(i=0,j=els.length; i<j; i++) {
			els[i].onfocus = showHelp;
			els[i].onblur = hideHelp;
		}
		els = obj.getElementsByTagName('select'); 
		for(i=0,j=els.length; i<j; i++) {
			els[i].onfocus = showHelp;
			els[i].onblur = hideHelp;
		}
	}
}

function showHelp() {
	var i, j, els, obj = getParentByTagName(this,'tr');
	if(obj) {
		els = obj.getElementsByTagName('div');
		for(i=0,j=els.length; i<j; i++) {
			if(els[i].className == 'help-text') {
				els[i].style.display = 'block';
			}
		}
		els = obj.getElementsByTagName('span');
		for(i=0,j=els.length; i<j; i++) {
			if(els[i].parentNode.className == 'help-block') {
				els[i].className = 'active';
			}
		}
	}
}

function hideHelp() {
	var i, j, els, obj = getParentByTagName(this,'tr');
	if(obj) {
		els = obj.getElementsByTagName('div');
		for(i=0,j=els.length; i<j; i++) {
			if(els[i].className == 'help-text') {
				els[i].style.display = '';
			}
		}
		els = obj.getElementsByTagName('span');
		for(i=0,j=els.length; i<j; i++) {
			if(els[i].parentNode.className == 'help-block') {
				els[i].className = '';
			}
		}
	}
}

// add a special option to the omgeving select to toggle the plaats input field
function addCustomOmgeving() {
	var streek = document.getElementById('streek');
	var plaats = document.getElementById('plaatsnaam');
	if(streek !== null && plaats !== null) {
		streek.onchange = toggleCustomOmgeving;
		var anders = document.createElement('option');
		try { 
			anders.innerText = 'Anders...';
		}
		catch(e) {
			anders.text = 'Anders...';
		}
		anders.value = '0';
		anders.id = 'togglePlaats';
		streek.appendChild(anders);
		plaats.value = '';
		plaats.parentNode.parentNode.style.display = 'none';
	}
}

// toggle the plaats input field on / off
function toggleCustomOmgeving() {
	var plaats = document.getElementById('plaatsnaam');
	if(plaats !== null) {
		if(this.options[this.selectedIndex].id == 'togglePlaats') {
			plaats.parentNode.parentNode.style.display = '';
			plaats.focus();
		} else {
			plaats.value = '';
			plaats.parentNode.parentNode.style.display = 'none';
		}
	}
}

// add some "check the sector checkbox" magic to the "opleiding" select box
function kwalificatieSelect() {
	var obj = document.getElementById('opleiding');
	if(obj !== null && obj.tagName.toLowerCase() == 'select') {
		obj.onchange = checkSector;
	}
}

function checkSector() {
	var i, j, obj, objs, sectorId, optionId = this.options[this.selectedIndex].parentNode.id;
	if(optionId.indexOf('s') === 0) {
		sectorId = 'o'+optionId.substring(1,optionId.length);
		obj = document.getElementById(sectorId);
		if(obj !== null && obj.tagName.toLowerCase() == 'input' && obj.type == 'checkbox') {
			if(obj.parentNode.parentNode !== null && obj.parentNode.parentNode.tagName.toLowerCase() == 'fieldset') {
				objs = obj.parentNode.parentNode.getElementsByTagName('input');
				for(i=0,j=objs.length; i<j; i++) {
					if(objs[i].type == 'checkbox') {
						objs[i].checked = false;
					}
				}
			}
			obj.checked = true;
		}
	}
}

// links with a rel="external" attribute will open in a new window
function externalWindow() {
	var i, j, links = document.links;
	for(i=0,j=links.length; i<j; i++){
		if(links[i].rel == 'external') {
			links[i].onclick = function() { this.target = '_blank'; }
		}
	}
}

// focus the first element that is not hidden in the first form
function focusForm() {
	var i, j, obj = document.forms[0];
	if(obj) {
		for(i=0,j=obj.elements.length; i<j; i++) {
			if(obj.elements[i].type && obj.elements[i].type != 'hidden') {
				obj.elements[i].focus();
				break;
			}
		}
	}
}

// make clickable rows euhm... clickable and more
function clickableRows() {
	var i, j, k, l, rows, obj, objs = document.getElementsByTagName('tbody');
	if(objs !== null) {
		for(i=0,j=objs.length; i<j; i++) {
			if(objs[i].className == 'clickable-rows') {
				obj = objs[i];
				rows = obj.rows;
				for(k=0,l=rows.length; k<l; k++) {
					rows[k].onmouseover = rowHover;
					rows[k].onmouseout = function() { window.status=''; }
					rows[k].onclick = rowClick;
				}
			}
		}
	}
}

function rowHover() {
	var obj = this;
	var links = this.getElementsByTagName('a');
	if(links.length == 1) {
		if(links[0].href.indexOf('://') > -1) {
			window.status = links[0].href;
		} else {
			window.status = document.location.protocol+'//'+document.location.host+links[0].href;
		}
	}
}

function rowClick() {
	var obj = this;
	var links = this.getElementsByTagName('a');
	if(links.length == 1) {
		try {
			links[0].href.click();
		} catch(e) {
			window.location = links[0].href;
		}
	}
}

// enable the select all checkbox to actually select all checkboxes
function addSelectAll() {
	var obj = document.getElementById('selectall');
	if(obj !== null) {
		// onclick since IE only seems to fire the onchange event when reloading?
		obj.onclick = selectAll;
		if(obj.type == 'radio') {
			obj.onclick();
		}
	} else {
		obj = document.getElementById('stagebank_selectall');
		if(obj !== null) {
			// onclick since IE only seems to fire the onchange event when reloading?
			obj.onclick = selectAll;
		}
		obj = document.getElementById('stagebank_ovdb_selectall');		
		if(obj !== null) {
			// onclick since IE only seems to fire the onchange event when reloading?
			obj.onclick = selectAll;
		}
	}
}

// (un)select all checkboxes
function selectAll() {
	var i, j, objs, obj = getParentByTagName(this,'fieldset');
	if(obj !== null && obj.tagName.toLowerCase() == 'fieldset') {
		objs = obj.getElementsByTagName('input');
		for(i=0,j=objs.length; i<j; i++) {
			if(objs[i].type == 'checkbox') {
				if(objs[i] != this) {
					objs[i].checked = this.checked ? true : false;
					objs[i].onclick = function() { document.getElementById('selectall').checked = false; }
				}
			}
			if(objs[i].type == 'radio') {
				if(objs[i] != this) {
					objs[i].checked = false;
					objs[i].onclick = function() { document.getElementById('selectall').checked = false; }
				}
			}
		}
	}
}

// add an form checker to the onsubmit event handler on every form
function addFormChecker() {
	var i, j, obj = document.forms;
	for(i=0,j=obj.length; i<j; i++) {
		obj[i].onsubmit = checkIt;
	}
}

// generic check function, based on the assumption that labels with an * in the innerText are associated with required fields
function checkIt() {
	var i, j, objs, el, els, obj = this;
	if(typeof obj == 'object') {
		objs = obj.getElementsByTagName('label');
		for(i=0,j=objs.length; i<j; i++) {
			if(objs[i].innerText.indexOf('*') > -1) {
				el = document.getElementById(objs[i].htmlFor);
				if(el !== null && el.tagName.toLowerCase() == 'input' || el !== null && el.tagName.toLowerCase() == 'textarea') {
					if(el.type && el.type == 'text' || el.tagName.toLowerCase() == 'textarea') 	{
						if(!checkText(el)) return false;
					}
				} else if(el !== null && el.tagName.toLowerCase() == 'select') {
					if(!checkSelect(el)) return false;
				} else if(el !== null && el.tagName.toLowerCase() == 'fieldset') {
					els = el.getElementsByTagName('input');
					if(els[0] !== null && els[0].type == 'checkbox') {
						if(!checkBoxes(els)) return false;
					}
				}
			}
		}
		return true;
	}
	else {
		return false;
	}
}

function checkText(obj) {
	var a, b, c;
	obj.style.backgroundColor = '';
	obj.value = trim(obj.value);
	if(obj.name == 'dd') {
		if(!checkDate()) {
			return false;
		}
	} else if(obj.name.indexOf('email') > -1) {
		if(!checkEmail(obj.value)) {
			obj.focus();
			a = new Fader(attentionColor, "#ffffff", obj, faderSpeed, faderIncrease); a.fade();
			return false;
		}
	} else {
		if(obj.value === '') {
			obj.focus();
			a = new Fader(attentionColor, "#ffffff", obj, faderSpeed, faderIncrease); a.fade();
			return false;
		}
	}
	return true;
}

function checkEmail(str) {
	if(str === '') {
		return false;
	} else {
		if(str.match(/^.*@.*\..*.$/) == null) {
			return false;
		}
	}
	return true;
}

function checkDate() {
	var a, b, c;
	var objd = document.getElementById('dd');
	var objm = document.getElementById('mm');
	var objy = document.getElementById('yyyy');
	objm.style.backgroundColor = '';
	objy.style.backgroundColor = '';
	objd.value = trim(objd.value).length == 1 ? '0'+trim(objd.value) : trim(objd.value);	
	objm.value = trim(objm.value).length == 1 ? '0'+trim(objm.value) : trim(objm.value);
	objy.value = trim(objy.value);
	if(	objd.value === '' || objm.value === '' || objy.value === ''||
			objd.value.match(/^([0-9]{2})$/) === null || objm.value.match(/^([0-9]{2})$/) === null || 
			objy.value.match(/^([0-9]{4})$/) === null) {
		objd.focus();
		a = new Fader(attentionColor, "#ffffff", objd, faderSpeed, faderIncrease); a.fade();
		b = new Fader(attentionColor, "#ffffff", objm, faderSpeed, faderIncrease); b.fade();
		c = new Fader(attentionColor, "#ffffff", objy, faderSpeed, faderIncrease); c.fade();
		return false;
	} else if(!dateValidate(objd.value,'dd') || !dateValidate(objm.value,'mm') || !dateValidate(objy.value,'yyyy')) {
		objd.focus();
		a = new Fader(attentionColor, "#ffffff", objd, faderSpeed, faderIncrease); a.fade();
		b = new Fader(attentionColor, "#ffffff", objm, faderSpeed, faderIncrease); b.fade();
		c = new Fader(attentionColor, "#ffffff", objy, faderSpeed, faderIncrease); c.fade();
		return false;
	}
	return true;
}

function checkSelect(obj) {
	var a, i, j, selected = false;
	if(obj.options[obj.selectedIndex].value != "") {
		selected = true;
	}
	if(!selected) {
		a = new Fader(attentionColor, "#ffffff", obj, faderSpeed, faderIncrease); a.fade();
	}
	return selected;
}

function dateValidate(str,type) {
	var now = new Date();
	var year = now.getFullYear();
	switch(type) {
		case 'dd': 	return parseInt(str,10) <= 31 && parseInt(str,10) > 0;
		case 'mm': return parseInt(str,10) <= 12 && parseInt(str,10) > 0;
		case 'yyyy': return parseInt(str,10) <= year+5 && parseInt(str,10) >= year-5;
		default: return true;
	}
	return true;
}

function checkBoxes(obj) {
	var i, j, checked = false;
	var oColor = '#ffffff';
	for(i=0,j=obj.length; i<j; i++) {
		if(obj[i].type == 'checkbox') {
			obj[i].parentNode.style.backgroundColor = '';
			if(obj[i].checked) {
				checked = true;
			}
		}
	}
	if(checked == false) {
		for(i=0; i<j; i++) {
			if(obj[i].currentStyle) {
				oColor = obj[i].parentNode.currentStyle.backgroundColor;
			} else {
				oColor = document.defaultView.getComputedStyle(obj[i].parentNode, '').getPropertyValue("background-color");
				if(oColor.indexOf('rgb') > -1) {
					oColor = getFromRGBColor(document.defaultView.getComputedStyle(obj[i].parentNode, '').getPropertyValue("background-color"));
				}
			}
			this['a'+i] = new Fader(attentionColor, oColor, obj[i].parentNode, faderSpeed, faderIncrease); this['a'+i].fade();
		}
	}
	obj[0].focus();
	return checked;
}

// this function returns a string with whitespace stripped from the beginning and end of str
// the whitespace characters include space, tab, new-line, carriage-return and form-feed.
function trim(str) { return str.replace(/^\s*|\s*$/g,""); }

function getFromRGBColor(str) {
	var rgb = str.substring(str.indexOf('(')+1,str.indexOf(')')).split(',');
	var hex = '';
	hex = '#'+parseInt(rgb[0]).toString(16)+''+parseInt(rgb[1]).toString(16)+''+parseInt(rgb[2]).toString(16);
	return hex;
}

// Created by Nick Chapman (http://chapnickman.com/)
// Information: http://chapnickman.com/2005/03/08/yellow-fade-technique/
// License: Attribution-ShareAlike 2.0 (http://creativecommons.org/licenses/by-sa/2.0/)
// Version 1.0

Fader._instances = new Array();

Fader._progressFade = function(instance) {
	if(instance.percent < 100) 	{
		instance.percent += instance.increase;
		instance.callback.style.backgroundColor = Fader._getColor(instance.start, instance.end, instance.percent);

		setTimeout("Fader._progressFade(Fader._instances[" + instance.index + "])", instance.speed);
	}
	else {
		instance.percent = 0;
	}
};

// Code from codingforums.com
// -- http://www.codingforums.com/archive/index.php/t-4656

Fader._getColor = function (start, end, percent) {
	var r1 = Fader._hex2dec(start.slice(0,2));
	var g1 = Fader._hex2dec(start.slice(2,4));
	var b1 = Fader._hex2dec(start.slice(4,6));

	var r2 = Fader._hex2dec(end.slice(0,2));
	var g2 = Fader._hex2dec(end.slice(2,4));
	var b2 = Fader._hex2dec(end.slice(4,6));

	var pc = percent / 100;

	var r = Math.floor(r1 + (pc * (r2-r1)) + 0.5);
	var g = Math.floor(g1 + (pc * (g2-g1)) + 0.5);
	var b = Math.floor(b1 + (pc * (b2-b1)) + 0.5);

	return("#" + Fader.dec2hex(r) + Fader.dec2hex(g) + Fader.dec2hex(b));
};

Fader._hexDigit = new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");

Fader.dec2hex = function (dec) {
	return(Fader._hexDigit[dec>>4] + Fader._hexDigit[dec&15]);
};

Fader._hex2dec = function (hex) {
	return(parseInt(hex,16));
};

// End codingforums.com code

function Fader(start, end, callback, speed, increase) {
	this.percent = 0;
	this.callback = null;
	this.start = null;
	this.end = null;
	this.speed = 15;
	this.increase = 1;
	
	if (start && end && callback) {
		if (start.charAt(0) == "#") {
			this.start = start.substring(1, start.length);
		} else {
			this.start = start;
		}
		if (end.charAt(0) == "#") {
			this.end = end.substring(1, end.length);
		} else {
			this.end = end;
		}
		this.callback = callback;

		if (speed !== null) {
			this.speed = speed;
		}
		if (increase !== null) {
			this.increase = increase;
		}
	}
	
	this.index = Fader._instances.length;
	
	Fader._instances[this.index] = this;
}

Fader.prototype.fade = function() {
	Fader._progressFade(this);
};

/* http://www.chriscassell.net/log/2004/12/19/add_label_click.html */
function addLabelFocus() {
	var obj = document.getElementById(this.getAttribute("for"));
	if(obj) {
		if (obj.getAttribute("type") != "image" && obj.getAttribute("type") != "submit") {
			obj.focus();
		} else {
			obj.click();
		}
		if (obj.getAttribute("type") == "checkbox") {
			if (!obj["checked"]) {
				obj["checked"] = true;
			}
			else {
				obj["checked"] = false;
			}
		}
		else if (obj.getAttribute("type") == "radio") {
			var allRadios = document.getElementsByTagName("input");
			var radios = new Array();
			for (i = 0; i < allRadios.length; i++) {
				if (allRadios[i].getAttribute("name") == obj.getAttribute("name")) {
					radios.push(allRadios[i]);
				}
			}
			for (i = 0; i < radios.length; i++) {
				if (radios[i]["checked"] && 
						radios[i].getAttribute("id") != obj.getAttribute("id"))
				{
					radios[i]["checked"] = false;
				}
			}
			obj["checked"] = true;
		}
	}
}