var emailRegExp = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i;
var zipcode4RegExp = /[1-9][0-9]{3}\x20?[A-Z]{2}/;
function checkFormSubmit () {
    var Messages = Array();
    var formRef = this;
    var FormName = '';
    var _fieldCheck = Array();
    if (this.nodeName == 'FORM') FormName = this.name;
    else {
		while (formRef.parentNode && formRef.nodeName != 'FORM') formRef = formRef.parentNode;
		FormName = formRef.name;
	}

    var msgSent = Array();
    var failed = Array();
	for (var num in checkValidity) {
		for (var name in checkValidity[num]) {
			if (name == FormName) {

				var checkInfo = checkValidity[num][name];
				// first check if the checkIf is met
				var check = true;
				if (checkInfo.checkIf.type) {
					var check = false;
					var foundIf = 0;
					var fieldsChecked = 0;
					for(var i in checkInfo.checkIf.fields) {
						var fieldName = checkInfo.checkIf.fields[i].field;
						var fieldVal  = checkInfo.checkIf.fields[i].value;
						if(jQuery("[name='"+fieldName+"']", formRef).length > 0) {

							for(var i = 0; i < jQuery("[name='"+fieldName+"']", formRef).length; i++) {
								domObj = jQuery("[name='"+fieldName+"']", formRef).get(i);
								//check value of a radio / checkbox
								if(domObj.type == 'checkbox' || domObj.type == 'radio') {
								    if(jQuery("input[name='"+fieldName+"']:checked").val() == fieldVal)
								    foundIf++;
								}
								else{
								if(domObj.value == fieldVal) {
									if (domObj.nodeName == 'INPUT' && (domObj.type == 'checkbox' || domObj.type == 'radio') && !domObj.checked) continue;
									foundIf++;
								    }
								}
								fieldsChecked++;
							}
						}
					}
					if (foundIf > 0 && checkInfo.checkIf.type == 'OR') check = true;
					if (foundIf == fieldsChecked && checkInfo.checkIf.type == 'AND') check = true;

				}
				if (check) {
					checkFail = false;
					// email check
					for (var i in checkInfo.email) {
						if (parseInt(i) != i) continue;
						var fieldFail = false;
						var field = jQuery("[name='"+ checkInfo.email[i] + "']", formRef).get(0);
						if (field) {
							if(!emailRegExp.test(field.value)) { checkFail = true; fieldFail = true; }
							_fieldCheck[checkInfo.email[i]] = fieldFail;
						}
					}
					if (checkFail && !msgSent['email']) {
						Messages.push('Vul a.u.b. een geldig e-mail adres in.');
						msgSent['email'] = true;
					}

					checkFail = false;
					// zipcode 4 numbers check
					for (var i in checkInfo.zipcode4) {
						if (parseInt(i) != i) continue;
						var fieldFail = false;
						var field = jQuery("[name='"+ checkInfo.zipcode4[i] + "']", formRef).get(0);
						if (field) {
							if(!zipcode4RegExp.test(field.value)) { checkFail = true; fieldFail = true; }
							_fieldCheck[checkInfo.zipcode4[i]] = fieldFail;
						}
					}
					if (checkFail && !msgSent['zipcode4']) {
						Messages.push('Vul a.u.b. een geldige postcode in beginnend met 4 cijfers.');
						msgSent['zipcode4'] = true;
					}

					checkFail = false;
					// phonenumber with () and -
					for (var i in checkInfo.phonenumber) {
						if (parseInt(i) != i) continue;
						var fieldFail = false;
						var field = jQuery("[name='"+ checkInfo.phonenumber[i] + "']", formRef).get(0);
						if (field) {
							if(!validatePhoneNumber.ValidateForm(field.value)) { checkFail = true; fieldFail = true; }
							_fieldCheck[checkInfo.phonenumber[i]] = fieldFail;
						}
					}
					if (checkFail && !msgSent['phonenumber']) {
						Messages.push('Vul a.u.b. een geldig telefoonnummer in.');
						msgSent['phonenumber'] = true;
					}

					checkFail = false;
					for (var i in checkInfo.banknumber) {
						if (jQuery("[name='"+ checkInfo.banknumber[i] + "']").is(":visible")) {								
							if (parseInt(i) != i) continue;
							var fieldFail = false;
							var field = jQuery("[name='"+ checkInfo.banknumber[i] + "']", formRef).get(0);
							if (field) {
								bankNr = field.value;
								lengthBefore = bankNr.length;
								var re = new RegExp('[^0-9]','g');
								bankNr = bankNr.replace(re,'');
								lengthAfter = bankNr.length;

								field.value = bankNr;

								if((lengthAfter > 7 && lengthAfter < 9) || (lengthAfter > 9 || lengthAfter < 2)){
									checkFail = true;
									fieldFail = true;
								}

								if(lengthAfter == 9){
									var totaal = 0;
									for(i=0; i < 9; i++){
										totaal += (9-i) * parseInt(bankNr.charAt(i));
									}
									if(totaal % 11 != 0){
										checkFail = true;
										fieldFail = true;
									}
								}
							}	
							_fieldCheck[checkInfo.banknumber[i]] = fieldFail;
						}	
					}
					if (checkFail && !msgSent['banknumber']) {
						Messages.push('Vul a.u.b. een geldig bank/giro nummer in.');
						msgSent['banknumber'] = true;
					}

					// required check
					checkFail = false;

					for(var i in checkInfo.require) {
						if (parseInt(i) != i) continue;

						var fieldFail = false;
						var field = jQuery("[name='"+checkInfo.require[i]+"']", formRef).get(0);

						if (field) {
							field.value = jQuery.trim(field.value);
							if (field.value =="") { checkFail = true; fieldFail = true; }
							if(!_fieldCheck[checkInfo.require[i]]) _fieldCheck[checkInfo.require[i]] = fieldFail;
						}

					}

					if (checkFail && !msgSent['require']) {
						Messages.push('Vul a.u.b. de verplichte velden in.');
						msgSent['require'] = true;
					}

					// required check
					if(checkInfo.between){
						checkFail = false;
						for(var i in checkInfo.between.fields){
							var fieldVal = checkInfo.between.fields[i].field;
							var fieldMin = checkInfo.between.fields[i].min;
							var fieldMax = checkInfo.between.fields[i].max;
							var field = jQuery("[name='"+fieldVal+"']", formRef).get(0);
							var fieldFail = false;

							var integer = /(^-?\d\d*$)/;

							if(!integer.test(field.value) || field.value < fieldMin || field.value > fieldMax){
								checkFail = true;
								fieldFail = true;
								Messages.push('Voer een waarde in tussen ' + fieldMin + ' en ' + fieldMax);
							}
							if(!_fieldCheck[fieldVal]){
								_fieldCheck[fieldVal] = fieldFail;
							}
						}
						if (checkFail && !msgSent['between']) {
							msgSent['between'] = true;
						}
					}

					// checkbox check
					checkFail = false;
					if(jQuery.isArray(checkInfo.validatePasswords)){
						for(var fields in checkInfo.validatePasswords){
							var password = jQuery("[name='"+checkInfo.validatePasswords[fields][0]+"']", formRef).get(0);
							var confirmation = jQuery("[name='"+checkInfo.validatePasswords[fields][1]+"']", formRef).get(0);
							if(password != confirmation){
								checkFail = true;
								fieldFail = true;

								_fieldCheck[checkInfo.validatePasswords[fields][0]] = fieldFail;
								_fieldCheck[checkInfo.validatePasswords[fields][1]] = fieldFail;

								if(!msgSent['validatePasswords']){
									Messages.push('Wachtwoord en wachtwoord ter bevestiging komen niet overeen');
									msgSent['require'] = true;
								 }
							}
						}
					}

					// requireDate check

					// Functionality written for the membership plugin.
					// The function will check if the default value of a date selector has been selected ( "0" )
					// In this case it will popup a confirm box and ask for confirmation!
					checkFail = false;
					if(jQuery.isArray(checkInfo.requireDate)){
						var defaultDateParts = 0;
						for(var dateObjects in checkInfo.requireDate){
							for(var dateFields in dateObjects){
								var dateArr = checkInfo.requireDate[dateObjects][dateFields];
								if(parseInt(jQuery("[name='"+dateArr.day+"']", formRef).val()) == 0) defaultDateParts++;
								if(parseInt(jQuery("[name='"+dateArr.month+"']", formRef).val()) == 0) defaultDateParts++;
								if(parseInt(jQuery("[name='"+dateArr.year+"']", formRef).val()) == 0) defaultDateParts++;
								if(defaultDateParts > 0 && defaultDateParts < 3){
									checkFail = true;
									fieldFail = true;
									_fieldCheck[dateArr.day] = fieldFail;
									_fieldCheck[dateArr.month] = fieldFail;
									_fieldCheck[dateArr.year] = fieldFail;
									if (checkFail && !msgSent['require']) {
										Messages.push('U heeft geen geldige datum ingevult!.');
										msgSent['require'] = true;
									}
								}
								else if(defaultDateParts == 3){
									if(!confirm("U heeft ervoor gekozen de huidige datum als wijzigingsdatum te gebruiken!"+"\n"+"Weet u zeker dat u door wilt gaan?")){
										checkFail = true;
										fieldFail = true;
										_fieldCheck[dateArr.day] = fieldFail;
										_fieldCheck[dateArr.month] = fieldFail;
										_fieldCheck[dateArr.year] = fieldFail;
										if (checkFail && !msgSent['require']) {
											Messages.push('U heeft geen geldige datum ingevult!.');
											msgSent['require'] = true;
										}
									}
								}
							}
						}
					}
				} else {
					for (var i in checkInfo.email) if(parseInt(i) == i) {
						if(!_fieldCheck[checkInfo.email[i]]) _fieldCheck[checkInfo.email[i]] = false;
					}
					for (var i in checkInfo.require) if(parseInt(i) == i) {
						if(!_fieldCheck[checkInfo.require[i]]) _fieldCheck[checkInfo.require[i]] = false;
					}
				}
			}
		}
	}

	for(var i in _fieldCheck) {

		if (typeof(_fieldCheck[i]) != 'boolean') continue;
		var selector = '[name="' + i + '"]';
		var field = jQuery(selector, formRef);

		if (_fieldCheck[i]) {
			field.removeClass('input').addClass('input-active');
			field.next('.inputEnd').addClass('changed');
		} else {
			field.removeClass('input-active').addClass('input');
			field.next('.inputEnd').removeClass('changed');
		}
	}

    if (Messages.length > 0) {
        if(typeof tb_remove == 'function') {
            tb_remove();
        }
		alert(Messages.join("\n"));
		return false;
	}
}

var lastFormName = '';
var currentFieldValue = '';
function checkFormChange(e) {



	if (lastFormName == '') {
		currentFieldValue = this.value;
		return;
	}

	var node = this.parentNode;
	while(node.nodeName != 'FORM' && node.parentNode) node = node.parentNode;

	if (lastFormName != node.name) {
		formName = lastFormName;

		if (confirm("In het vorige kader heeft u wijzigingen aangebracht, wilt u deze opslaan?")) {
			jQuery('form[name="'+formName+'"]').trigger('submit');
		} else {

			if(jQuery('form[name='+formName+'] :button').length){
				jQuery('form[name='+formName+'] :button.bewarenButton-verborgen').hide();
			} else {
				jQuery('form[name='+formName+'] :submit.bewarenButton-verborgen').hide();
			}
			if(jQuery('form[name='+lastFormName+'] :button').length){
				jQuery('form[name='+lastFormName+'] :button.bewarenButton-verborgen').hide();
			} else {
				jQuery('form[name='+lastFormName+'] :submit.bewarenButton-verborgen').hide();
			}

			lastFormName = '';
			jQuery('form[name="'+formName+'"]').trigger('reset');
		}
	}
	currentFieldValue = this.value;
}

function checkFieldChange() {
	if (this.value != currentFieldValue || this.type == 'checkbox' || this.type == 'radio' || this.type == 'file') {
		var node = this.parentNode;
		while(node.nodeName != 'FORM' && node.parentNode) node = node.parentNode;
		lastFormName = node.name;

		if(jQuery('form[name='+lastFormName+'] :button').length){
			jQuery('form[name='+lastFormName+'] :button:hidden.bewarenButton-verborgen').show();
		} else {
			jQuery('form[name='+lastFormName+'] :submit:hidden.bewarenButton-verborgen').show();
		}

	}
}

function checkNumberOnly(field) {
   jQuery(field).val(jQuery(field).val().replace(/[^0-9]/g,""));
}

jQuery(document).ready(function() {
	jQuery('.content input:not(.IframeButton), .content select, .content textarea, .content file').bind('focus', checkFormChange);
	jQuery('.content input:not(.IframeButton), .content select, .content textarea, .content file').bind('blur', checkFieldChange);

	jQuery('.content check, .content radio').bind('click', checkFieldChange);
});


var validatePhoneNumber = new function() {
	// Declaring required variables
	var digits = "0123456789";
	// non-digit characters which are allowed in phone numbers
	var phoneNumberDelimiters = "()- ";
	// characters which are allowed in international phone numbers
	// (a leading + is OK)
	var validWorldPhoneChars = phoneNumberDelimiters + "+";
	// Minimum no of digits in an international phone no.
	var minDigitsInIPhoneNumber = 10;

	this.isInteger = function(s){
		var i;
			for (i = 0; i < s.length; i++)
			{
					// Check that current character is number.
					var c = s.charAt(i);
					if (((c < "0") || (c > "9"))) return false;
			}
			// All characters are numbers.
			return true;
	}
	this.trim = function(s){
		var i;
			var returnString = "";
			// Search through string's characters one by one.
			// If character is not a whitespace, append to returnString.
			for (i = 0; i < s.length; i++)
			{
					// Check that current character isn't whitespace.
					var c = s.charAt(i);
					if (c != " ") returnString += c;
			}
			return returnString;
	}
	this.stripCharsInBag = function(s, bag) {
		var i;
			var returnString = "";
			// Search through string's characters one by one.
			// If character is not in bag, append to returnString.
			for (i = 0; i < s.length; i++)
			{
					// Check that current character isn't whitespace.
					var c = s.charAt(i);
					if (bag.indexOf(c) == -1) returnString += c;
			}
			return returnString;
	}

	this.checkInternationalPhone = function(strPhone){
		var bracket=3
		strPhone=this.trim(strPhone)
		if(strPhone.indexOf("+")>1) return false
		if(strPhone.indexOf("-")!=-1)bracket=bracket+1
		if(strPhone.indexOf("(")!=-1 && strPhone.indexOf("(")>bracket)return false
		var brchr=strPhone.indexOf("(")
		if(strPhone.indexOf("(")!=-1 && strPhone.charAt(brchr+2)!=")")return false
		if(strPhone.indexOf("(")==-1 && strPhone.indexOf(")")!=-1)return false
		s=this.stripCharsInBag(strPhone,validWorldPhoneChars);
		return (this.isInteger(s) && s.length >= minDigitsInIPhoneNumber);
	}

	this.ValidateForm = function(elem){
		var Phone=elem;

		if ((Phone==null)||(Phone=="")){
			return false
		}
		if (this.checkInternationalPhone(Phone)==false){
			return false
		}
		return true
	 }

}

