/**
* @author sebastiaan
* @param Form
* @return boolean
*/
function validateForm(theform) {
	
	var fields = theform.getElementsByTagName("input");
	
	var strErrors = "";
	var strRequiredFields = "";
	
	for(var i = 0;i < fields.length;i++) {
		if (fields[i].type != "hidden" && fields[i].type != "reset" && fields[i].type != "submit") {
			field = fields[i];
			// store the field attributes in a temp variable this is necasarry for text fields
			tmp = field.attributes;
			dataType = field.attributes.dataType.value;
			displayName = field.attributes.displayName.value;
			value = field.value;
			required = field.attributes.required.value;
			switch(dataType) {
				case 'text': 
					if ((required == "true") && (value.length == 0)) {
						strRequiredFields = strRequiredFields + "- " + displayName + "\n";
					}
					break;
				case 'numeriek':
					if ((required == "true") && (value.length == 0)) {
						strRequiredFields = strRequiredFields + "- " + displayName + "\n";
					}
					else {
						if (!isValidNumber(value)) {
							strErrors = strErrors + "- " + displayName + "\n";
						}
					}
					break;
				
				case 'postcode':
					fieldname2 = fields[i].name.substr(0, fields[i].name.length - 1) + 2;
					postcode2 = theform[fieldname2].value;
					
					if ((required == "true") && (value.length == 0 || postcode2.length == 0)) {
						strRequiredFields = strRequiredFields + "- " + displayName + "\n";
					}
					else {
						if (value.length == 0 && postcode2.length == 0) {
							// email is not required and not filled in, so it is valid 
						} else {
							if (!isValidPostcode(value + postcode2)) {
								strErrors = strErrors + "- " + displayName + "\n";
							}
						}
					}
					break;
				case 'email':
					if ((required == "true") && (value.length == 0)) {
						strRequiredFields = strRequiredFields + "- " + displayName + "\n";
					}
					else {
						if (value.length > 0 && !isValidEmail(value)) {
							strErrors = strErrors + "- " + displayName + "\n";
						}
					}
					break;
				case 'radio':
					if (required == "true") {
						var checked = false;
						for (var j=0; j < theform[field.name].length; j++) {
							if (theform[field.name][j].checked) checked = true;
						}
						if (!checked) {
							strRequiredFields = strRequiredFields + "- " + displayName + "\n";
						}
					}
					break;
			}
		}
	}
	
	var fields = theform.getElementsByTagName('textarea');
	
	for(var i = 0;i < fields.length;i++) {
		if (fields[i].type != "hidden" && fields[i].type != "reset" && fields[i].type != "submit") {
			dataType = fields[i].attributes.dataType.value;
			displayName = fields[i].attributes.displayName.value;
			value = fields[i].value;
			required = fields[i].attributes.required.value;
			
			switch(dataType) {
				case 'textarea': 
					if ((required == "true") && (value.length == 0)) {
						strRequiredFields = strRequiredFields + "- " + displayName + "\n";
					}
					break;
			}
		}
	}
	var fields = theform.getElementsByTagName('select');
	
	for(var i = 0;i < fields.length;i++) {
		dataType = fields[i].attributes.dataType.value;
		displayName = fields[i].attributes.displayName.value;
		value = fields[i].options[fields[i].selectedIndex].value;
		
		required = fields[i].attributes.required.value;
		
		switch(dataType) {
			case 'select': 
				if ((required == "true") && (value.length == 0)) {
					strRequiredFields = strRequiredFields + "- " + displayName + "\n";
				}
				break;
		}
	}
					
	strMessage = "";
	if (strRequiredFields.length) {
		strMessage += "\nDe volgende velden zijn verplicht:\n" + strRequiredFields;
	}
	if (strErrors.length) {
		strMessage += "\nDe volgende velden zijn niet correct ingevuld:\n" + strErrors;
	}
	if (strMessage.length) {
		alert(strMessage);
		return false;
	} else {
		return true;
	}
}
/**
* @author sebastiaan
* @param String number
* @return boolean
*/
function isValidNumber(strText) {
	var validChars = "0123456789";
	var isNumber=true;
	var singleChar;
	for(i = 0;i < strText.length && isNumber == true;i++){ 
		singleChar = strText.charAt(i); 
		if (validChars.indexOf(singleChar) == -1){
			isNumber = false;
		}
	}
	return isNumber;
}
/**
* @author sebastiaan
* @param String date
* @return boolean
*/
function isValidDate(dateStr){
	var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
	var matchArray = dateStr.match(datePat); // is format OK?
	 
	if (matchArray == null) {
		return false;
	}
	 
	// parse date into variables
	day = matchArray[1];
	month = matchArray[3];
	year = matchArray[5];
	 
	if (month < 1 || month > 12) { // check month range
		return false;
	}
	 
	if (day < 1 || day > 31) {
		return false;
	}
	 
	if ((month==4 || month==6 || month==9 || month==11) && day==31) {
		return false;
	}
	 
	if (month == 2) { // check for february 29th
		var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
		if (day > 29 || (day==29 && !isleap)) {
			return false;
		}
	}
	
	return true;  // date is valid
}
/**
* @author sebastiaan
* @param String postcode
* @return boolean
*/
function isValidPostcode(postcode) {
	if (postcode.length == 6) {
		var numeric = postcode.substr(0, 4);
		var alphanumeric = postcode.substr(4, 6);
		if (!isNaN(numeric) && isNaN(alphanumeric)) {
			var charCode1 = alphanumeric.charCodeAt(0);
			var charCode2 = alphanumeric.charCodeAt(1);
			if (((charCode1 >= 65 && charCode1 <= 90) || (charCode1 >= 97 && charCode1 <= 122)) && ((charCode2 >= 65 && charCode2 <= 90) || (charCode2 >= 97 && charCode2 <= 122))) { return true; }
			else { return false; }
		}
		else { return false; }
	}
	else { return false; }
}
/**
* @author sebastiaan
* @param String emailadres
* @return boolean
*/
function isValidEmail(str) {
	// are regular expressions supported?
	var supported = 0;
	if (window.RegExp) {
		var tempStr = "a";
		var tempReg = new RegExp(tempStr);
		if (tempReg.test(tempStr)) supported = 1;
	}
	if (!supported) return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);
	var r1 = new RegExp("(@.*@)|(\\.\\.)|(@\\.)|(^\\.)");
	var r2 = new RegExp("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,4}|[0-9]{1,4})(\\]?)$");
	return (!r1.test(str) && r2.test(str));
}