var countryCodes="|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|fx|ga|gb|gd|ge|gf|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|in|io|iq|ir|is|it|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nt|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zr|zw|com|edu|gov|int|mil|net|org|arpa|nato|info|biz|sex|xxx";
var animationFields = Array();

function onSubmitHandler(form) {
	var missingElements = Array();
	var failedElements = Array();
	var okSoFar = true;
	var valType;

	for(c = 0; c < form.elements.length; c++) {
		element = form.elements[c];

		// add [] to mutiple selects if it isn't there (for php form handling)
		if (element.type == 'select-multiple' && element.name.substr(element.name.length-2, 2) != '[]') element.name = element.name + '[]';

		if (element.getAttribute("required") == '1') {
			switch(element.type) {
				case 'select-one':
				case 'select-multiple':
					if (element.selectedIndex == -1) {
						okSoFar = false;
						missingElements[missingElements.length] = element;
					}
					break;

				case 'checkbox':
					if (!element.checked) {
						okSoFar = false;
						missingElements[missingElements.length] = element;
					}
					break;

				case 'radio':
					var sel = false;
					for (i = 0; i < form.elements[element.name].length; i++) if (form.elements[element.name][i].checked) sel = true;

					if (sel == false) {
						okSoFar = false;
						missingElements[missingElements.length] = element;
					}

					break;

				case 'text':
					if (trim(element.value) == '') {
						okSoFar = false;
						missingElements[missingElements.length] = element;
					}
					break;

				case 'textarea':
					if (trim(element.value) == '') {
						okSoFar = false;
						missingElements[missingElements.length] = element;
					}
			}
		}
		if (valType = element.getAttribute("validation")) {
			failedMessage = null;
			switch(valType.toLowerCase()) {
				case "email":
					failedMessage = checkEmail(element.value);
					break;
				case "dutchbankaccount":
					failedMessage = isValidDutchBankAccount(element.value);
					break;
//				case "url":
//					failedMessage = isValidUrl(element.value);
//					break;

			}
			if (failedMessage !== null) {
				okSoFar = false;
				element.message = failedMessage;
				failedElements[failedElements.length] = element;
			}
		}
	}

	// check for other things here and set okSoFar to false if something is wrong!

	if (okSoFar) return true;

	var melding = Array();

	if (missingElements.length > 0) {
		reUnderscore = /_/g
		missingElements[0].name = missingElements[0].name.replace(reUnderscore,' ');

		if (missingElements.length == 1) melding[melding.length] = "Het veld " + missingElements[0].name.replace('[]', '') + " is nog niet ingevuld.";
		else {
			var fieldnames = Array();
			var q = false;
			for(c = 0; c < missingElements.length; c++) {
				q = false;
				for(i = c+1; i < missingElements.length; i++) if (missingElements[c].name == missingElements[i].name) { q = true; break; }
				if (!q){
					var elName = missingElements[c].name.replace(reUnderscore,' ');
					elName = elName.replace('[]', '');
					fieldnames[fieldnames.length] = elName;
				}
			}
			lastFieldName = fieldnames.pop();
			melding[melding.length] = 'De velden ' + fieldnames.join(', ') + ' en ' + lastFieldName + ' zijn nog niet ingevuld.';
		}
	}

	for(c = 0; c < failedElements.length; c++) melding[melding.length] = failedElements[c].message;

	alert(melding.join("\n"));

	for(c = missingElements.length-1; c >= 0; c--) {
		missingElements[c].style.oldBorderColor = missingElements[c].style.borderColor;
		missingElements[c].style.borderColor = 'red';
		missingElements[c].onkeypress = revertToNormal;
		inputFieldAnimation(missingElements[c]);
	}
	for(c = failedElements.length-1; c >= 0; c--) {
		failedElements[c].style.oldBorderColor = failedElements[c].style.borderColor;
		failedElements[c].style.borderColor = 'red';
		failedElements[c].onkeypress = revertToNormal;
		inputFieldAnimation(failedElements[c]);
	}

	return false;
}

function revertToNormal(obj) {
	this.style.borderColor = this.style.oldBorderColor;
	this.onkeypress = null;
}

function trim(s) {
	while (s.substring(0,1) == ' ') s = s.substring(1,s.length);
	while (s.substring(s.length-1,s.length) == ' ') s = s.substring(0,s.length-1);
	return s;
}

function inputFieldAnimation(input) {
	el = animationFields.length;
	if (typeof(input.tmpValue) !== 'undefined' && input.tmpValue !== false) return;
	input.tmpValue = input.value;
	animationFields[el] = input;
	field = 'animationFields[' + el + ']';

	if(input.type.substring(0,6) == 'select') {
		input.focus();
		setTimeout(field + ".blur();", 100);
		setTimeout(field + ".focus();", 200);
		setTimeout(field + ".blur();", 300);
		setTimeout(field + ".value = " + field + ".tmpValue; " + field + ".focus(); " + field + ".tmpValue=false; ", 400);
	} else {
		input.value = '   <  <  <';
		setTimeout(field + ".value = '  <  <  <';", 200);
		setTimeout(field + ".value = ' <  <  <';", 400);
		setTimeout(field + ".value = '<  <  <';", 600);
		setTimeout(field + ".value = ''; " + field + ".value = " + field + ".tmpValue; " + field + ".focus(); " + field + ".tmpValue=false; ", 800);
	}
}

function checkEmail(Email){
	var at;
	var c;
	var pos;

	if(Email.indexOf(',')!=-1) {
		if(Email.toLowerCase().indexOf('compuserve.com')!=-1)
			return "In een compuserve-adres dient u de komma's door punten te vervangen";
		else
			return "Een e-mail adres mag geen komma's bevatten";
	}

	at = Email.indexOf('@');

	if(at==0)
		return "Er staat niets voor het @-teken";
	else if(at==-1)
		return "Een e-mail adres hoort een @-teken te bevatten";
	c=Email.charAt(at+1).toLowerCase();
	if((c<'a'||c>'z')&&(c<'0'||c>'9'))
		return "Achter het @-teken hoort een letter of cijfer te staan";
	if(Email.indexOf('..',at)!=-1)
		return "Achter het @-teken staan twee punten achter elkaar";
	for(pos=0;pos<Email.length;pos++){
		c=Email.charAt(pos).toLowerCase();
		if(c==' ')
		return "Het e-mail adres bevat één of meerdere spaties";
		}

	for(pos=at+1;pos<Email.length;pos++){
		c=Email.charAt(pos).toLowerCase();
		if((c<'a'||c>'z')&&(c<'0'||c>'9')&&c!='.'&&c!='-')
			return "Het e-mail adres bevat het ongeldige teken '"+c+"'";
		}
	pos=Email.lastIndexOf('.');
	if(pos==-1) return "De domeinnaam bevat geen punt";
	c=Email.substring(pos+1,Email.length).toLowerCase();
	if(countryCodes.indexOf('|'+c+'|')==-1) return "Er bestaan geen domeinnamen die eindigen op ."+c;
	return null;
}

function limitSelect(obj,maxLength, text) {
	var counter=0;
	var maxReached = false;
	for(x=0;x<obj.options.length;x++) {
		var current = obj.options[x];
		if (current.selected) {
			counter++;
			if (counter>maxLength) {
				var maxReached = true;
				if (text!=undefined) {
					alert(text);
				}
				current.selected = false;
				break;
			}
		}
	}
}


function isValidDutchBankAccount(accNum) {
    var re_acc_postbank = /^[pP]\d{1,7}$/i;
    var re_acc_bank = /^(\d{9,10}|\d{2,3}.\d{2}.\d{2}.\d{3})$/;
	if((accNum.length <= 9  && (accNum.indexOf('p') == 0 || accNum.indexOf('P') == 0)) || accNum.length <= 8){
	    accNum = accNum.replace(/\./g, '');
    	if (re_acc_postbank.test(accNum))  return null;
	    else  return "Dit is een ongeldig Postbank nummer\nBijvoorbeeld: P12345";
	}
    if (!re_acc_bank.test(accNum))  return 'De opmaak van uw bankrekening nummer is ongeldig.';
    accNum = accNum.replace(/\./g, '');
    accNum = '0' + accNum;
    accNum = accNum.substring(accNum.length - 10);
    var productSum = 0;
    for (var i = 0; i < accNum.length; i++) {
        productSum += (accNum.length - i) * parseInt(accNum.charAt(i));
    }
    if (productSum % 11 != 0)  return 'Dit is een ongeldig bankrekeningnummer';
    return null;
};


//function isValidUrl(url) {
//	//var strMatch = /(^|[ \t\r\n])((ftp|http|https|mailto|file):(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?([A-Za-z0-9$_+!*();/?:~-]))/i;
//	var matches = new Array();
//	matches[0]	= /(^|[\n ])([\w]+?://[\w\#$%&~/.\-;:=,?@\[\]+]*)/is;
//	matches[1]	= /(^|[\n ])((www|ftp)\.[\w\#$%&~/.\-;:=,?@\[\]+]*)/is;
//	matches[2]	= /(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)/i;
//
//	for ( var i = 0 ; i <= matches.length; i++ ) {
//		if ( matches[i].test(url) ) {
//			return null;
//		}
//	}
//	return 'Dit is een ongeldig webadres.';
//}