/*************************************************************************
 * FORM VALIDATOR v0.4
 *************************************************************************
 * Reinier van Grieken / Scheepens Reclame Adviseurs
 *************************************************************************
 * Laatste wijziging: 3 februari 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)$/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+$/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.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 checkFormInfoAanvraag() {
	var myForm = new formValidator(document.getElementById("info_aanvraag_form"));

	// 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_aanhef        = /^(Dhr\.|Mevr\.)$/;				 // Keuze uit 2 waardes
	var regEx_telefoon      = /^0[0-9]{9}$/;					 // 10 cijfers, beginnend met 0
	var regEx_postcode      = /^[0-9]{4}\s*[A-Z]{2}$/;			 // Postcode, 4 cijfers 2 letters
	var regEx_datum         = /^[0-9]{1,2}-[0-9]{1,2}-[0-9]{4}$/; // Datum, dag maand jaar
	var regEx_tijd          = /^[0-9]{1,2}:[0-9]{2}$/;           // Tijd, uren minuten
	
	myForm.preFormatInitials("voorletters");
	myForm.preFormatToLowerCase("tussenvoegsel");
	myForm.preFormatUcwords("achternaam");
	myForm.preFormatUcwords("straatnaam");
	myForm.filterCharacters("huisnummer", /\D+/g);
	myForm.preFormatToUpperCase("postcode");
	myForm.preFormatUcwords("woonplaats");
	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", true, regEx_any)) { alert("Heeft u uw voorletters wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("tussenvoegsel", false, regEx_any)) { alert("Heeft u uw tussenvoegsel 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("huisnummer", true, regEx_numeric)) { alert("Heeft u uw huisnummer wel (juist) ingevuld?"); return false; }
	if (!myForm.inputValueTest("toevoeging", false, regEx_any)) { alert("Heeft u uw huisnummer toevoeging 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; }
	if (document.getElementById("onderwerp").value == '' || document.getElementById("onderwerp").value == '') {
		alert("Heeft u uw onderwerp wel (juist) ingevuld?"); return false; 
	} else {
		switch (document.getElementById("onderwerp_id").value) {
			/* Afspraak maken in de showroom */
			case 'optie1':
				var today = new Date()
				var correctDate = today.getFullYear()+''+leadingZero(today.getMonth())+''+leadingZero(today.getDate())
				var givenDate = document.getElementById("datum").value.split("-")//.replace(/-|\//g, "")
				var rightOrderGivenDate = givenDate[2]+givenDate[1]+givenDate[0]
				if (!myForm.inputValueTest("datum", true, regEx_datum) || parseFloat(rightOrderGivenDate) < parseFloat(correctDate) ) { alert("Heeft u uw datum wel (juist) ingevuld?\n\r (datum formaat dd-mm-yyyy)"); return false; }
				if (!myForm.inputValueTest("tijdstip", false, regEx_tijd)) { alert("Heeft u uw tijd wel (juist) ingevuld?\n\r (tijd formaat uu:mm)"); return false; }
			break;
			/* Aanvraag gratis Goergen keukenmagazine */
			case 'optie2':
			break;
			/* Vraag of opmerking over mijn nieuwe Goergen keuken */
			case 'optie3':
				if (!myForm.inputValueTest("vraag", true, regEx_any_multiline)) { alert("Heeft u uw vraag wel (juist) ingevuld?"); return false; }
			break;
		}
	}
	document.info_aanvraag_form.submit();
}
/*************************************************************************
 * Custom ivm leading zero`s for dates (day & month)
 */
function leadingZero(nr) {
	if (nr < 10) nr = "0" + nr;
	return nr;
}



