

	var fieldRequiredClassName = 'required';
	var fieldEmailClassName = 'email';
	var fieldEmptyOnClickClassName = 'emptyOnClick';
	var fieldCanBeDefaultClassName = 'canBeDefault';
	var fieldErrorClassName = 'fieldError';


	// standalone onDomReady function from http://www.ajaxprogrammer.com/
	window.onDomReady = function(fn){
		window.__ondom_functionArray.push(fn);
	};
	(function(){
		window.__ondom_functionArray = [];
		function _runFunctions(){
			for (var i in window.__ondom_functionArray){
				(window.__ondom_functionArray[i])();
			}
		};
		var _khtml = /(WebKit|khtml)/i.test(navigator.userAgent);
		if(document.addEventListener && !_khtml){
			document.addEventListener("DOMContentLoaded", _runFunctions, false);
		}else if(_khtml){
			var _timer = setInterval(function(){
				if(/loaded|complete/.test(document.readyState)){
					clearInterval(_timer);
					_runFunctions();
				}
			}, 10);
		}else{
			document.write("<script id=__ie_ondom defer src=javascript:void(0)><\/script>");
			var script = document.getElementById("__ie_ondom");
			script.onreadystatechange = function(){
				if(this.readyState == "complete"){
					_runFunctions();
				}
			};
		}
	})();


	// standalone getElementsByClassName function from http://www.robertnyman.com/index.php?p=256
	function getElementsByClassName(className, tag, elm){
		var testClass = new RegExp("(^|\\s)" + className + "(\\s|$)");
		var tag = tag || "*";
		var elm = elm || document;
		var elements = (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
		var returnElements = [];
		var current;
		var length = elements.length;
		for(var i=0; i<length; i++){
			current = elements[i];
			if(testClass.test(current.className)){
				returnElements.push(current);
			}
		}
		return returnElements;
	}


	// on dom ready
	onDomReady(function(){

		// set forms' submit event
		var form, forms = document.getElementsByTagName('form');
		for (var i = 0; form = forms[i]; i++)
		{
			form.onsubmit = submitForm;
		}

		// set form elements' click and blur events
		var element, elements = getElementsByClassName(fieldEmptyOnClickClassName);
		for (var i = 0; element = elements[i]; i++)
		{
			element.onclick = function(){if(this.defaultValue == this.value && this.type.toLowerCase() != 'submit'){this.value = ''}};
			element.onblur = function(){if(this.value.trim() == ''){this.value = this.defaultValue}};
		}

		// set reset buttons' click event
		var resetButton, resetButtons = getElementsByClassName('resetButton');
		for (var i = 0; resetButton = resetButtons[i]; i++)
		{
			resetButton.onclick = emptyForm;
		}

		// set replyMedium's change event - only on the contact page
		if (replyMedium = document.getElementById('replyMedium'))
		{
			replyMedium.onchange = adaptRequiredFields;
		}

	});


	// empty form
	function emptyForm(e)
	{
		if (!e) e = window.event;
		var target = (e.target) ? e.target: e.srcElement;
		var form = getForm(target);
		var input, inputs = form.getElementsByTagName('input');
		var textarea, textareas = form.getElementsByTagName('textarea');
		var errorMssg;

		for (i = 0; input = inputs[i]; i++)
		{
			if (input.type.toLowerCase() != 'submit')
			{
				input.value = input.defaultValue;
			}
		}
		for (i = 0; textarea = textareas[i]; i++)
		{
			textarea.value = textarea.defaultValue;
		}

		return false;
	}


	// submit form
	function submitForm(e)
	{
		var errorMssg;
		if (!e) e = window.event;
		var target = (e.target) ? e.target: e.srcElement;

		if (!(errorMssg = checkForm(target)))
		{
			document.getElementById('formInformationMessage') ? document.getElementById('formInformationMessage').style.display = 'block' : '';
			document.getElementById('javascriptErrorMessage') ? document.getElementById('javascriptErrorMessage').style.display = 'none' : '';
			return true;
		}
		else
		{
			document.getElementById('formInformationMessage') ? document.getElementById('formInformationMessage').style.display = 'none' : '';
			document.getElementById('javascriptErrorMessage') ? document.getElementById('javascriptErrorMessage').style.display = 'block' : '';
			alert(errorMssg);
		}

		return false;
	}


	// get parent form through any of its children
	function getForm(child)
	{
		var parent = child.parentNode;

		while (parent.tagName.toLowerCase() != 'form')
		{
			parent = parent.parentNode;

			if (parent.tagName.toLowerCase() == 'body')
			{
				return 'not found';
			}
		}

		return parent;
	}


	// check the form's required elements (all elements with className required)
	function checkForm(form)
	{
		var errorMssg;
		var requiredElement, requiredElements = getElementsByClassName(fieldRequiredClassName, '*', form);
		var email;

		for (i = 0; requiredElement = requiredElements[i]; i++)
		{
			if (requiredElement.value.trim() == '' || (requiredElement.value == requiredElement.defaultValue && !hasClassName(requiredElement, fieldCanBeDefaultClassName)))
			{
				addClassName(requiredElement, fieldErrorClassName);
				errorMssg = 'U hebt nog niet alle relevante velden ingevuld.';
			}
			else
			{
				removeClassName(requiredElement, fieldErrorClassName);
			}
		}

		if (errorMssg)
		{
			return errorMssg;
		}

		if (email = getElementsByClassName(fieldEmailClassName)[0])
		{
			if (email.value != "" && email.value.search(/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/) == -1)
			{
				addClassName(email, fieldErrorClassName);
				errorMssg = 'Het opgegeven e-mail adres is ongeldig.';
			}
			else
			{
				removeClassName(email, fieldErrorClassName);
			}
		}

		return errorMssg;
	}


	// array push function for IE5
	if(typeof Array.prototype.push != "function"){
		Array.prototype.push = ArrayPush;
		function ArrayPush(value){
			this[this.length] = value;
		}
	}


	// for trim on specified characters see http://forums.devnetwork.net/viewtopic.php?p=397506#397506
	// string trim function from http://www.somacon.com/p355.php
	String.prototype.trim = function() {
		return this.replace(/^\s+|\s+$/g,"");
	}


	// standalone addClassName from http://particletree.com/features/javascript-basics-for-prototyping/
	// dependancies: String.prototype.trim
	function addClassName (elem, className) {
		removeClassName (elem, className);
		elem.className = (elem.className + " " + className).trim();
	}


	// standalone removeClassName from http://particletree.com/features/javascript-basics-for-prototyping/
	// dependancies: String.prototype.trim
	function removeClassName (elem, className) {
		elem.className = elem.className.replace(className, "").trim();
	}


	// check whether an element has a specific class
	function hasClassName(el, name) {
		var i, list;

		list = el.className.split(" ");

		for(i=0;i<list.length;i++)
			if(list[i]==name)
				return true;
		
		return false;
	}


