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) {

	if ((typeof $ != 'undefined') && (typeof $.validator != 'undefined') && $(form).find('.required').length > 0) {
		return $(form).validate().form();
	} else {
		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 || trim(element.options[element.selectedIndex].value) == '') {
							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 'password':
					case 'text':
					case 'file':
					case 'textarea':
						if (trim(element.value) == '') {
							okSoFar = false;
							missingElements[missingElements.length] = element;
						}
						break;
				}
			}
			if (valType = element.getAttribute('validation')) {
				var validationFields = new Object();

				// parse the validation string, for possible multiple strings and options in the validation attribute
				if ( valType.indexOf(',') ) {
					var fields = valType.split(',');
					for (var i=0; i<fields.length; i++) {
						if ( fields[i].indexOf('=') ) {
							var field = fields[i].split('=');
							validationFields[field[0]] = field[1];
						} else {
							validationFields[fields[i]] = '';
						}
					}
				} else {
					if ( valType.indexOf('=') ) {
						var field = valType.split('=');
						validateFields[field[0]] = field[1];
					} else {
						validationFields[valType] = '';
					}
				}


				failedMessage = null;
				reUnderscore = /_/g
				if (trim(element.value) != '' || element.getAttribute('required') == '1') {
					for ( i in validationFields ) {
						var title = (element.title)? element.title: element.name;
						switch(i.toLowerCase()) {
							case 'email':
								failedMessage = checkEmail(element.value);
								break;

							case 'dutchbankaccount':
								failedMessage = isValidDutchBankAccount(element.value);
								break;

							case 'numeric':
								var regex=/^\d*$/;
								if(!regex.test(element.value)){
									failedMessage = title.replace(reUnderscore,' ')+' mag alleen cijfers bevatten.';
								}
								break;

							case 'alphanumeric':
								var regex=/\w/;
								if(!regex.test(element.value)){
									failedMessage = title.replace(reUnderscore,' ')+' mag alleen letters en cijfers waarden bevatten.';
								}
								break;

							case 'maxlength':
								var val = element.value;
								if ( val.length > validationFields[i]) {
									failedMessage = title.replace(reUnderscore,' ')+' bevat te veel karakters, maximaal '+ validationFields[i] +'.';
								}
								break;

							case 'minlength':
								var val = element.value;
								if ( val.length < validationFields[i]) {
									failedMessage = title.replace(reUnderscore,' ')+' bevat te weinig karakters, minimaal '+ validationFields[i] +'.';
								}
								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

		var fieldnames = Array();
		var alreadyExists = false;
		for(c = 0; c < missingElements.length; c++) {
			if (!missingElements[c].title) missingElements[c].title = missingElements[c].name;
			alreadyExists = false;
			for(i=0; i<fieldnames.length; i++) {
				if (fieldnames[i] == missingElements[c].title) {
					alreadyExists = true;
					break;
				}
			}
			if (!alreadyExists){
				var elName = missingElements[c].title.replace(reUnderscore,' ');
				elName = elName.replace('[]', '');
				fieldnames[fieldnames.length] = elName;
			}
		}


		if (fieldnames.length == 1) melding[melding.length] = 'Het veld ' + fieldnames[0] + ' is nog niet ingevuld.';
		else {
			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.';
//}