/**
 *
 * Form validatie class
 * Aron 15/08/06
 *
 * Versie:			1.1
 * Laatste update:	01-09-2006
 *
 * Deze class maakt het client-side valideren van formulieren makkelijk :)
 *
 * Hoe te gebruiken:
 * ------------------------
 * Voeg aan het te valideren formulier de class 'validate' toe.
 * Voeg aan de te valideren velden de class 'required' toe.
 *
 * De class voegt automatisch meldingen toe bij de desbetreffende velden. Deze zijn d.m.v CSS te stylen, bv:
 * 		.errFld - het input veld
 *		.errMsg - het error bericht 
 *
 *	form .errFld {
 *		border: 1px solid #F00;
 *	}
 *	form .errMsg {	
 *		color: #CC3333;
 *		display: block;
 *	}
 *
 * UPDATES
 * ------------------------
 * 17-08-2006	Aron	ADDED:		Integer test toegevoegd
 *						FIXED:		geen dubbele foutmeldingen weergeven
 *						FIXED:		textareas werken nu.
 * 30-08-2006	Aron	ADDED:		MAJOR FEATURE: vanaf nu is toevoegen van classname 'validate' aan formulier genoeg.
 *						ADDED:		CLASS: validate-email
 * 01-09-2006	Aron	FIXED:		Integer & email veld was standaard verplicht
 * 05-09-2006	Aron	ADDED:		select-box validatie! woohoo!
 * 12-09-2006	Aron	ADDED:		postcode validatie en stripspaces functie
 *						FIXED:		wanneer een veld op 2 condities wordt gevalideert, wordt de foutmelding nu correct
 * 									geupdated wanneer 1 van de 2 condities voldoet.
 *						FIXED:		major bug in addValidationHandlers() gefixed waardoor het script niet werkte in IE.
 * 
*/


// STRING MATCH FUNCTIES

String.prototype.isInteger = function() {
	var regexp = /^\d+$/;
	return regexp.test(this);
}

String.prototype.isEmail = function() {
	var regexp = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	return regexp.test(this);
}

String.prototype.isDate = function() {
	var regexp = /^\d{2}-\d{2}-\d{4}$/
	return regexp.test(this);
}

String.prototype.isPostcode = function() {
	var regexp = /^\d{4}\s{0,1}\w{2}$/;
	return regexp.test(this);
}
String.prototype.stripSpaces = function() {
	return this.replace(/\s+/g, ''); 
}


// ONLOAD HANDLER

function addValidationHandlers() {
	var allForms = document.getElementsByTagName('form');	
	var numForms = allForms.length;
	if (numForms < 1) return false;
	for (var i = 0; i < numForms; i++) {
		if (Element.hasClassName(allForms[i], 'validate')) {
			Event.observe(allForms[i], 'submit', (function(e) {
				validateForm(this, false, e);
			}).bind(allForms[i]));
		}
	}
}

// BEGIN CLASS

function validateForm(form, showalert, e) {
	
	var self = this;
	
	this.showAlert = showalert;
	this.errorCount = 0;
	this.errors = new Array();
	
	//--------------------------------
	// BEGIN INTERNE FUNCTIES
	//--------------------------------
	
	this.attachError = function(element, message) {
		if (!message) message = 'Dit veld is verplicht!';
		Element.addClassName(element, 'errFld');
		
		// foutmelding verwijderen wanneer er al een bestaat
		if ($('error_'+element.getAttribute('name'))) Element.remove('error_'+element.getAttribute('name'));
		
		// foutmelding aanmaken
		var node = document.createElement('span');
		node.setAttribute('id', 'error_'+element.getAttribute('name'));
		node.className = 'errMsg';
		var text = document.createTextNode(message);
		node.appendChild(text);
		element.parentNode.appendChild(node);
		return true;		
	}
	
	this.detachError = function(element) {
		if (Element.hasClassName(element, 'errFld')) {
			Element.removeClassName(element, 'errFld');
			var el = $('error_'+element.getAttribute('name'));
			if (el) {
				Element.remove('error_'+element.getAttribute('name'));
			}
		}
	}
	
	this.validate = function(element) {
		// integer check
		if (Element.hasClassName(element, 'integer')) {
			if (!element.value.isInteger() && element.value != '') {
				this.attachError(element, 'Dit veld mag alleen numerieke waardes bevatten!');
				this.errors[this.errorCount++] = element;
				return false;
			}
		}
		
		// email check
		if (Element.hasClassName(element, 'validate-email')) {
			if (!element.value.isEmail() && element.value != '') {
				this.attachError(element, 'Dit is geen geldig e-mailadres!');
				this.errors[this.errorCount++] = element;
				return false;
			}
		}
		
		// postcode check
		if (Element.hasClassName(element, 'validate-postcode')) {
			if (!element.value.isPostcode() && element.value != '') {
				this.attachError(element, 'Dit is geen geldige postcode!');
				this.errors[this.errorCount++] = element;
				return false;
			}
		}		
		
		// datum check
		if (Element.hasClassName(element, 'validate-date')) {
			if (!element.value.isDate() && element.value != '') {
				this.attachError(element, 'Dit is geen geldige datum! Gebruik het formaat <b>30-12-2006</b>');
				this.errors[this.errorCount++] = element;
				return false;
			}
		}		
		
		
		// lege value check
		if (Element.hasClassName(element, 'required')) {
			
			// uitzondering: aparte check voor selects
			if (element.tagName.toLowerCase() == 'select') {
				
				var si = element.options[element.selectedIndex].value;

				if (si == '' || parseInt(si) == 0) {
					this.attachError(element);
					this.errors[this.errorCount++] = element;
					return false;
				}
				
			} else {
				
				if (element.value == '') {
					this.attachError(element);
					this.errors[this.errorCount++] = element;
					return false;
				}
				
			}
		}

		return true;	
		
	}
	
	//--------------------------------
	// EINDE INTERNE FUNCTIES
	//--------------------------------	
	
	var elements = Form.getElements(form);
	var elementCount = elements.length;
	
	for (var i=0; i<elementCount;i++) {
		
		switch (elements[i].tagName.toLowerCase()) {
			
			case 'input':
			case 'textarea':
			case 'select':
			
				// velden die op dit moment een foutmelding bevatten controleren
				if (Element.hasClassName(elements[i], 'errFld')) {
					if (this.validate(elements[i])) {
						this.detachError(elements[i]);
						continue;
					}
				}
				
				this.validate(elements[i]);			
				
				break;
			
			default:
			
				continue;
				
		}
	}	
		
	if (this.errorCount > 0) {
		if (this.showAlert) alert('FOUT: Er '+((this.errorCount>1)?'zijn':'is')+' bij het opslaan van het formulier '+this.errorCount+' fout'+((this.errorCount>1)?'en':'')+' geconstateerd.');
		if (e) Event.stop(e);
		return false;
	} else {
		return true;
	}
}

// ONLOAD HANDLER
Event.observe(window, 'load', addValidationHandlers);
