/**
 * Validation.js - Javascript form validation
 * 
 * @author  Webstores <info at webstores dot nl>
 *           Copyright (c) Webstores internet totaalbureau <http://www.webstores.nl/>
 */

WS.Validation = function(form) {
	
	var form = $(form),
	    formElements = [],
		errorClass = 'wsv-error';
	
	var validations = {
		required: {
			errorMessage: 'Dit veld is verplicht',
			regex: /\S+/
		},
		email: {
			errorMessage: 'U dient een geldig e-mailadres in te vullen',
			regex: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/
		},
		zip: {
			errorMessage: 'U dient een geldige postcode in te vullen (1234AB)',
			regex: /^[0-9]{4}[\ ]?[a-zA-Z]{2}$/
		},
		numeric: {
			errorMessage: 'Dit veld mag alleen numerieke tekens bevatten',
			regex: /^[0-9]*$/
		},
		phone: {
			errorMessage: 'U dient een geldig telefoonnummer in te vullen',
			regex: /^[0-9 +-]{10,16}$/
		}
	}
	
	return {
		initialize: function() {
			if(!form) return;
			
			for(var i = 0; i < form.elements.length; i++) {
				if(WS.hasClass(form.elements[i], 'wsv-', true)) {
					formElements.push(form.elements[i]);
				}
			}
			if(WS.browser.Webkit) {
				var fieldsets = form.getElementsByTagName('fieldset');
				for(var i = 0; i < fieldsets.length; i++) {
					if(WS.hasClass(fieldsets[i], 'wsv-', true)) {
						formElements.push(fieldsets[i]);
					}
				}
			}
			this.initEvents();
		},
		
		initEvents: function() {
			var self = this;
			form.onsubmit = function() {
				return self.validateForm();
			}
		},
		
		enableElement: function(el) {
			el = $(el);
			el.disabled = false;
		},
		
		disableElement: function(el) {
			el = $(el);
			el.disabled = true;
		},
		
		addValidation: function(name, properties) {
			if(!validations[name])
				validations[name] = properties;
		},
		
		validateElement: function(el) {
			var valid = true;
			var vArr = el.className.match(/wsv-\w+/g);
			
			for(var i = 0; i < vArr.length; i++) {
				if(vArr[i] != errorClass) {
					if(el.nodeName == 'INPUT') {
						if(el.type == 'text' || el.type == 'password') {
							if(vArr[i] == 'wsv-required' || el.value != '') {
								valid = validations[vArr[i].split('wsv-')[1]].regex.test(el.value);
							}
						}
						else if(el.type == 'checkbox') {
							valid = el.checked;
						}
						else if(el.type == 'radio') {
							var nextElement = formElements[formElements.indexOf(el) + 1];
							do {
								if(!el.checked) {
									valid = false;
								}
								nextElement = formElements[formElements.indexOf(nextElement) + 1];
							}
							while(nextElement.type == 'radio' && nextElement.name == el.name);
						}
					}
					else if(el.nodeName == 'SELECT') {
						valid = el.value != -1;
					}
					else if(el.nodeName == 'TEXTAREA') {
						valid = el.value;
					}
					else if(el.nodeName == 'FIELDSET') {
						valid = 0;
						var inputs = el.getElementsByTagName('input');
						for(var i = 0; i < inputs.length; i++) {
							valid += inputs[i].checked;
						}
					}
				}
				if(!valid) {
					WS.addClass(el, errorClass);
				}
				else if(valid && WS.hasClass(el, errorClass)) {
					WS.removeClass(el, errorClass);
				}
			}
			
			return valid;
		},
		
		validateForm: function() {
			var submit = true;
			
			for(var i = 0; i < formElements.length; i++) {
				if(!this.validateElement(formElements[i])) {
					submit = false;
				}
			}
			
			return submit;
		}
	}
}