/*************************************************************************
 * FORM VALIDATOR v0.9
 *************************************************************************
 * Reinier van Grieken / Scheepens Reclame Adviseurs
 *************************************************************************
 * Laatste wijziging: 4 juni 2009
 *************************************************************************
 * TO DO:
 *************************************************************************/
 
function formValidator(formElement) {
	this.form = formElement;
}

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

formValidator.prototype.isTextElement = function(element) {
	if ((element.type) && (element.type.match(/^(text|textarea|file|password|hidden)$/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" :
		case "hidden" :
			var value = element.value;
			value = value.replace(/^\s+|\s+$/mg, '');		// strip leading & trailing spaces
			value = value.replace(/[ \t]+/g, ' ');			// strip subsequent spaces, respects newlines
			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.inputCompare = function(elementName1, elementName2) {
	var element1 = this.form.elements[elementName1];
	var element2 = this.form.elements[elementName2];
	if (element1.value&&element2.value) {
		if (element1.value == element2.value) return true; else return false;
	} else return false;
}

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 = 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,"");
	}
}

/*************************************************************************
 * Example usage
 */

function validateFormOfferte() {
	var myForm = new formValidator(document.getElementById('form_offerte'));

	// common field patterns:
	var regEx_any           = /^.+$/;							// elke mogelijke tekenreeks
	var regEx_any_multiline = /^.+$/m;							// elke mogelijke tekenreeks, geschikt voor tekstarea's
	var regEx_numeric       = /^\d+$/;							// alleen cijfers
	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_janee         = /^(ja|nee)$/i;					// Ja of Nee
	var regEx_aanhef        = /^(Dhr\.|Mevr\.)$/;				// Keuze uit 2 waardes
	var regEx_telefoon      = /^0[0-9]{9}$/;					// 10 cijfers, beginnend met 0
	var regEx_huisnr        = /^[1-9].*$/;						// beginnend met een cijfer, rest onbelangrijk
	var regEx_postcode      = /^[0-9]{4}[A-Z]{2}$/;				// 4 cijfers 2 letters
	
	myForm.preFormatUcwords("woning_straat");
	myForm.preFormatUcwords("voornaam");
	myForm.preFormatUcwords("achternaam");
	myForm.preFormatUcwords("straatnaam");
	myForm.preFormatStripWhitespaces("postcode");
	myForm.preFormatToUpperCase("postcode");
	myForm.filterCharacters("telefoon", /\D+/g);

	if (!myForm.inputArrayCountTest("offerte[]",1)) { alert("Waarvoor wilt u een offerte ontvangen?"); return false; }
	if (myForm.inputArrayIndexTest("offerte[]",3)) {
		if (!myForm.inputValueTest("woning_straat", true, regEx_any)) { alert("Heeft u uw adres nieuwe woning wel (juist) ingevuld?"); return false; }
		if (!myForm.inputValueTest("woning_huisnr", true, regEx_huisnr)) { alert("Heeft u uw adres nieuwe woning wel (juist) ingevuld?"); return false; }
		if (!myForm.inputValueTest("woning_woonplaats", true, regEx_any)) { alert("Heeft u uw woonplaats nieuwe woning wel (juist) ingevuld?"); return false; }
		if (!myForm.inputValueTest("woning_koopprijs", true, regEx_any)) { alert("Heeft u uw koopprijs wel (juist) ingevuld?"); return false; }
		if (!myForm.inputValueTest("woning_hypotheek", true, regEx_any)) { alert("Heeft u uw hypotheekhoogte wel (juist) ingevuld?"); return false; }
		if (!myForm.inputValueTest("woning_bijzonderheden", false, regEx_any_multiline)) { alert("Heeft u de bijzonderheden wel (juist) ingevuld?"); return false; }
	}
	if (myForm.inputArrayIndexTest("offerte[]",4)) {
		if (!myForm.inputValueTest("hypotheek_hypotheek", true, regEx_any)) { alert("Heeft u uw hypotheekhoogte wel (juist) ingevuld?"); return false; }
		if (!myForm.inputValueTest("hypotheek_aflossen", true, regEx_janee)) { alert("Dient er een hypotheek afgelost te worden?"); return false; }
		if (!myForm.inputValueTest("hypotheek_bijzonderheden", false, regEx_any_multiline)) { alert("Heeft u de bijzonderheden wel (juist) ingevuld?"); return false; }
	}
	if (!myForm.inputValueTest("aanhef", true, regEx_aanhef)) { alert("Heeft u uw aanhef wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("voornaam", true, 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("straatnaam", true, regEx_any)) { alert("Heeft u uw straatnaam wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("huisnr", true, regEx_huisnr)) { alert("Heeft u uw huisnummer wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("postcode", true, regEx_postcode)) { alert("Heeft u uw postcode wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("woonplaats", true, regEx_any)) { alert("Heeft u uw woonplaats 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-mailadres wel (juist) ingevuld?"); return false; }

	myForm.form.submit();
}

function showNieuwsbriefForm() {
	document.getElementById("nieuwsbrief_form").style.display="block";
	document.getElementById("nieuwsbrief_ok").style.display="none";
	document.getElementById("nieuwsbrief_error").style.display="none";
	return false;
}

function nieuwsbriefResult(transport) {
	if (transport.match(/<div id=\"resultCode\">0</im)) {
		document.getElementById("nieuwsbrief_form").style.display="none";
		document.getElementById("nieuwsbrief_ok").style.display="none";
		document.getElementById("nieuwsbrief_error").style.display="block";
	}
	if (transport.match(/<div id=\"resultCode\">1</im)) {
		document.getElementById("nieuwsbrief_form").style.display="none";
		document.getElementById("nieuwsbrief_ok").style.display="block";
		document.getElementById("nieuwsbrief_error").style.display="none";
	}
}

function validateFormNieuwsbrief() {
	var myForm = new formValidator(document.getElementById('form_nieuwsbrief'));

	// common field patterns:
	var regEx_any           = /^.+$/;							// elke mogelijke tekenreeks
	var regEx_any_multiline = /^.+$/m;							// elke mogelijke tekenreeks, geschikt voor tekstarea's
	var regEx_numeric       = /^\d+$/;							// alleen cijfers
	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_janee         = /^(ja|nee)$/i;					// Ja of Nee
	var regEx_aanhef        = /^(Dhr\.|Mevr\.)$/;				// Keuze uit 2 waardes
	var regEx_telefoon      = /^0[0-9]{9}$/;					// 10 cijfers, beginnend met 0
	var regEx_huisnr        = /^[1-9].*$/;						// beginnend met een cijfer, rest onbelangrijk
	var regEx_postcode      = /^[0-9]{4}[A-Z]{2}$/;				// 4 cijfers 2 letters
	
	myForm.preFormatUcwords("voornaam");
	myForm.preFormatUcwords("achternaam");
	myForm.preFormatUcwords("straatnaam");
	myForm.preFormatStripWhitespaces("postcode");
	myForm.preFormatToUpperCase("postcode");
	myForm.filterCharacters("telefoon", /\D+/g);

	if (!myForm.inputArrayCountTest("nieuwsbrief[]",1)) { alert("Welke nieuwsbrief wilt u ontvangen?"); return false; }
	if (!myForm.inputValueTest("aanhef", true, regEx_aanhef)) { alert("Heeft u uw aanhef wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("voornaam", true, 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("straatnaam", false, regEx_any)) { alert("Heeft u uw straatnaam wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("huisnr", false, regEx_huisnr)) { alert("Heeft u uw huisnummer wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("postcode", false, regEx_postcode)) { alert("Heeft u uw postcode wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("woonplaats", false, regEx_any)) { alert("Heeft u uw woonplaats wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("telefoon", false, regEx_telefoon)) { alert("Heeft u uw telefoonnummer wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("email", true, regEx_email)) { alert("Heeft u uw e-mailadres wel (juist) ingevuld?"); return false; }

	var form_aanhef      = myForm.form.elements["aanhef"].value=="Mevr."?0:1;
	var form_voorletters = myForm.form.elements["voornaam"].value.replace(/(^|\s)([a-zA-Z])[^\s]*/ig,"$2.");
	var form_achternaam  = myForm.form.elements["achternaam"].value;
	var form_action      = "save";
	var form_email       = myForm.form.elements["email"].value;
	var form_kantoor     = "F507BCBA-1FE5-40F1-8EB7-78475CF23599";
	var form_type1       = myForm.inputArrayIndexTest("nieuwsbrief[]",0);
	var form_type2       = myForm.inputArrayIndexTest("nieuwsbrief[]",1);

	var form2_aanhef      = myForm.form.elements["aanhef"].value;
	var form2_voornaam    = myForm.form.elements["voornaam"].value;
	var form2_achternaam  = myForm.form.elements["achternaam"].value;
	var form2_huisnr      = myForm.form.elements["huisnr"].value;
	var form2_postcode    = myForm.form.elements["postcode"].value;
	var form2_woonplaats  = myForm.form.elements["woonplaats"].value;
	var form2_telefoon    = myForm.form.elements["telefoon"].value;
	var form2_email       = myForm.form.elements["email"].value;
	var form2_particulier = myForm.inputArrayIndexTest("nieuwsbrief[]",0);
	var form2_zakelijk    = myForm.inputArrayIndexTest("nieuwsbrief[]",1);

	var req = new Ajax();
	req.request(
		"/ajax/nieuwsbriefform.php",
		"post",
		nieuwsbriefResult,
		{
			aanhef       :form_aanhef,
			achternaam   :form_achternaam,
			action       :form_action,
			email        :form_email,
			kantoor      :form_kantoor,
			type1        :form_type1,
			type2        :form_type2,
			voorletters  :form_voorletters,

			m_aanhef     :myForm.form.elements["aanhef"].value,
			m_voornaam   :myForm.form.elements["voornaam"].value,
			m_achternaam :myForm.form.elements["achternaam"].value,
			m_huisnr     :myForm.form.elements["huisnr"].value,
			m_postcode   :myForm.form.elements["postcode"].value,
			m_woonplaats :myForm.form.elements["woonplaats"].value,
			m_telefoon   :myForm.form.elements["telefoon"].value,
			m_email      :myForm.form.elements["email"].value,
			m_particulier:myForm.inputArrayIndexTest("nieuwsbrief[]",0),
			m_zakelijk   :myForm.inputArrayIndexTest("nieuwsbrief[]",1)
		}
	);
	//myForm.form.submit();
}

