/*************************************************************************
 * FORM VALIDATOR v0.4
 *************************************************************************
 * Reinier van Grieken / Scheepens Reclame Adviseurs
 *************************************************************************
 * Laatste wijziging: 13 november 2008
 *************************************************************************
 * TO DO:
 *************************************************************************/


function formValidator(formElement) {
	this.form = formElement;
}

/*************************************************************************
 * Private functions
 */

formValidator.prototype.isTextElement = function(element) {
	if ((element.type) && (element.type.match(/^(text|textarea|file)$/i))) return true; else return false;
}
formValidator.prototype.giveFocus = function(element) {
	if ((!element.disabled)&&(element.focus)) element.focus();
}

/*************************************************************************
 * Public functions
 */

formValidator.prototype.inputValueTest = function(elementName, required, validRegEx) {
	var element     = this.form.elements[elementName];
	var elementType = element.nodeName?(element.nodeName.toLowerCase()=="input"?(element.type?element.type.toLowerCase():"unknown"):(element.nodeName.toLowerCase().search(/^(textarea|select)$/i)>=0?element.nodeName.toLowerCase():"unknown")):(element[0]?(element[0].type?(element[0].type.toLowerCase()=="radio"?"radio":"unknown"):"unknown"):"unknown");
	switch (elementType) {
		case "text" :
		case "textarea" :
			var value = element.value;
			value = value.replace(/^\s+|\s+$/, '');		// strip leading & trailing spaces
			value = value.replace(/\s+/, ' ');			// strip subsequent spaces
			if ((value == '') && (!required)) return true;
			if (validRegEx.test(value)) { element.value = value; return true; } else { this.giveFocus(element); return false; }
			break;
		case "select" :
			var value = element.value;
			if (!required) return true;
			if (validRegEx.test(value)) { return true; } else { this.giveFocus(element); return false; }
			break;
		case "file" :
			var value = element.value;
			if ((value == '') && (!required)) return true;
			if (validRegEx.test(value)) { return true; } else { return false; }
			break;
		case "password" :
			var value = element.value;
			if ((value == '') && (!required)) return true;
			if (validRegEx.test(value)) { return true; } else { this.giveFocus(element); return false; }
			break;
		case "checkbox" :
			if (!required) { return true; } else { return element.checked; }
			break;
		case "radio" :
			if (!required) return true;
			for (var i=0; i<element.length; i++) if (element[i].checked) { return true; break; }
			return false;
			break;
	}
}

formValidator.prototype.inputArrayCountTest = function(elementName, minCount, maxCount) {
	var cBoxes = this.form.elements[elementName];
	var checkCount = 0; for (var i=0; i<cBoxes.length; i++) if (cBoxes[i].checked) checkCount++;
	if (checkCount < minCount) return false;
	if (maxCount&&(checkCount>maxCount)) return false;
	return true;
}

formValidator.prototype.inputArrayIndexTest = function(elementName, index) {
	var cBoxes = this.form.elements[elementName];
	if (index<cBoxes.length) { return cBoxes[index].checked; } else { return false; }
}


/*************************************************************************
 * Preformatting functions
 */

// preFormatInitials: zet ingevulde waarden om in hoofdletters met punten ertussen
formValidator.prototype.preFormatInitials = function(elementName) {
	var element = this.form.elements[elementName];
	if (this.isTextElement(element)) {
		var value    = element.value.replace(/[^a-zA-Z]/g,"");
		var newvalue = "";
		for (var i=0;i<value.length;i++) {
			newvalue += value.charAt(i).toUpperCase()+".";
		}
		element.value = newvalue;
	}
}

// preFormatNumeric: verwijdert alle tekens dat geen cijfer is uit de ingevulde waarden
formValidator.prototype.preFormatNumeric = function(elementName) {
	var element = this.form.elements[elementName];
	if (this.isTextElement(element)) {
		element.value = element.value.replace(/\D/g,"");
	}
}

// preFormatUcfirst: zet de ingevulde waarden om in 1e teken hoofdletter, de rest kleine letters
formValidator.prototype.preFormatUcfirst = function(elementName) {
	var element = this.form.elements[elementName];
	if (this.isTextElement(element)) {
		element.value = element.value.substring(0,1).toUpperCase() + element.value.substring(1).toLowerCase();
	}
}

// preFormatUcwords: zet alle woorden in het ingevulde veld om in 1e teken hoofdletter, de rest kleine letters
formValidator.prototype.preFormatUcwords = function(elementName) {
	var element = this.form.elements[elementName];
	if (this.isTextElement(element)) {
		var words    = element.value.split(/\s/g);
		var newvalue = "";
		for (var i=0;i<words.length;i++) {
			if (i>0) newvalue+=" ";
			newvalue += words[i].substring(0,1).toUpperCase() + words[i].substring(1).toLowerCase();
		}
		element.value = newvalue;
	}
}

// preFormatStripWhitespaces: haalt alle whitespaces uit de ingevulde waarden
formValidator.prototype.preFormatStripWhitespaces = function(elementName) {
	var element = this.form.elements[elementName];
	var value=""; var newvalue="";
	if (this.isTextElement(element)) {
		element.value.replace(/\s/g,"");
	}
}

// preFormatToUpperCase: zet de ingevulde waarden om in alles hoofdletters
formValidator.prototype.preFormatToUpperCase = function(elementName) {
	var element = this.form.elements[elementName];
	if (this.isTextElement(element)) {
		element.value = element.value.toUpperCase();
	}
}

// preFormatToLowerCase: zet de ingevulde waarden om in alles kleine letters
formValidator.prototype.preFormatToLowerCase = function(elementName) {
	var element = this.form.elements[elementName];
	if (this.isTextElement(element)) {
		element.value = element.value.toLowerCase();
	}
}

// preFormatReplace: Voer een search&replace uit in de ingevulde waarden
formValidator.prototype.preFormatReplace = function(elementName, regEx, replaceWith) {
	var element = this.form.elements[elementName];
	if (this.isTextElement(element)) {
		element.value = element.value.replace(regEx,replaceWith);
	}
}

// filterCharacters: Filter characters of substrings uit de ingevulde waarden
formValidator.prototype.filterCharacters = function(elementName, regEx) {
	var element = this.form.elements[elementName];
	if (this.isTextElement(element)) {
		element.value = element.value.replace(regEx,"");
	}
}

/*************************************************************************
 * Custom
 */

function submitContactForm() {
	var myForm = new formValidator(document.forms['contactform']);

	// common field patterns:
	var regEx_any           = /^.+$/;							// elke mogelijke tekenreeks
	var regEx_email         = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/i;

	// custom field patterns:
	var regEx_aanhef        = /^(Dhr\.|Mevr\.)$/;				// Keuze uit 2 waardes
	var regEx_telefoon      = /^0[0-9]{9}$/;					// 10 cijfers, beginnend met 0

	myForm.preFormatInitials("voorletters");
	myForm.preFormatUcwords("achternaam");
	myForm.filterCharacters("telefoon", /\D+/g);

	if (!myForm.inputValueTest("aanhef", true, regEx_aanhef)) { alert("Heeft u uw aanhef wel (juist) aangegeven?"); return false; }
	if (!myForm.inputValueTest("voorletters", false, regEx_any)) { alert("Heeft u uw voornaam wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("achternaam", true, regEx_any)) { alert("Heeft u uw achternaam wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("bedrijfsnaam", false, regEx_any)) { alert("Heeft u uw firmanaam wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("telefoon", true, regEx_telefoon)) { alert("Heeft u uw telefoonnummer wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("email", true, regEx_email)) { alert("Heeft u uw e-mail adres wel (juist) ingevuld?"); return false; }

	myForm.form.submit();
}

function submitNieuwsbriefAanmeldForm() {
	var myForm = new formValidator(document.forms['nieuwsbriefaanmeldform']);

	// common field patterns:
	var regEx_any           = /^.+$/;							// elke mogelijke tekenreeks
	var regEx_email         = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/i;

	// custom field patterns:
	var regEx_aanhef        = /^(Dhr\.|Mevr\.)$/;				// Keuze uit 2 waardes

	myForm.preFormatInitials("voorletters");
	myForm.preFormatUcwords("achternaam");

	if (!myForm.inputValueTest("aanhef", true, regEx_aanhef)) { alert("Heeft u uw aanhef wel (juist) aangegeven?"); return false; }
	if (!myForm.inputValueTest("voorletters", false, regEx_any)) { alert("Heeft u uw voornaam wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("achternaam", true, regEx_any)) { alert("Heeft u uw achternaam wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("bedrijfsnaam", true, regEx_any)) { alert("Heeft u uw firmanaam wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("email", true, regEx_email)) { alert("Heeft u uw e-mail adres wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("nieuwsbrief", true, regEx_any)) { alert("Wilt u de nieuwsbrief ontvangen?"); return false; }

	myForm.form.submit();
}

function submitNieuwsbriefAfmeldForm() {
	var myForm = new formValidator(document.forms['nieuwsbriefafmeldform']);

	// common field patterns:
	var regEx_email         = /^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$/i;
	if (!myForm.inputValueTest("email", true, regEx_email)) { alert("Heeft u uw e-mail adres wel (juist) ingevuld?"); return false; }

	myForm.form.submit();
}

