/**
 * 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]*$/
		},
		bedrag: {
			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}$/
		},
		mobile: {
			errorMessage: 'U dient een geldig mobielnummer in te vullen',
			regex: /^06-?[0-9]{8}$/
		},
		licenseplate: {
			errorMessage: 'U dient een geldig kenteken in te vullen',
			regex: /^[a-zA-Z0-9]{2}[ |-]?[a-zA-Z0-9]{2,3}[ |-]?[a-zA-Z0-9]{1,2}$/
		},
		date: {
			errorMessage: 'U dient een geldige datum in te vullen',
			regex: /^[0-9]{2}[\/\-\s][0-9]{2}[\/\-\s][0-9]{4}$/
		}
	}
	
	return {
		initialize: function() {
			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]);
					}
				}
			}
			if(WS.hasClass(form, 'mass-validate')) {
				var arr = document.getElementsByName('bonusmalus');
				this.initMassEvents(arr);
			} else {
				this.initEvents();
			}
		},
		
		initMassEvents: function (arr) {
			var self = this;
			form.onsubmit = function() {
				if(self.validateThese(arr)) {
					return self.validateForm();
				} else {
					return false;
				}				
			}			
		},
		
		initEvents: function() {
			var self = this;
			form.onsubmit = function() {
				return self.validateForm();
			}
		},
		
		enableElement: function(el) {
			el = $(el);
			if(el.nodeName == 'FIELDSET')
				WS.removeClass(el, 'disabled');
			else
				el.disabled = false;
		},
		
		disableElement: function(el) {
			el = $(el);
			if(el.nodeName == 'FIELDSET')
				WS.addClass(el, 'disabled');
			else
				el.disabled = true;
		},
		
		enableGroup: function(arr) {
			for(var i = 0; i < arr.length; i++) {
				var el = $(arr[i]);
				if(el.nodeName == 'FIELDSET')
					WS.removeClass(el, 'disabled');
				else
					el.disabled = false;
			}
		},
		
		disableGroup: function(arr) {			
			for(var i = 0; i < arr.length; i++) {
				var el = $(arr[i]);				
				if(el.nodeName == 'FIELDSET')
					WS.addClass(el, 'disabled');
				else
					el.disabled = true;
			}
		},
		
		addValidation: function(name, properties) {
			if(!validations[name])
				validations[name] = properties;
		},
		
		validateElement: function(el, valType) {
			var valid = true;
			var vArr = el.className.match(/wsv-\w+/g);
			
			for(var i = 0; i < vArr.length; i++) {
				if(vArr[i] != errorClass && !(el.disabled || WS.hasClass(el, 'disabled'))) {
					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' && valType == 'mass-validate') {
							valid = el.checked;
							/*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;
		},
		
		/**
		 * This function isn't fully tested yet, works for radio buttons though
		 */		 		
		validateThese: function(arr) {
			var valid = false;
			
			for(var i = 0; i < arr.length; i++) {
				if(!valid)
					valid = this.validateElement(arr[i], 'mass-validate');
			}
			
			return valid;
		},
		
		validateForm: function() {
			var submit = true;
			
			for(var i = 0; i < formElements.length; i++) {
				if(!this.validateElement(formElements[i])) {
					submit = false;
				}
			}
			
			if($('weight')) {
				if($('weight').value>3500) {
					if(!WS.hasClass($('weight'), errorClass)) {
						WS.addClass($('weight'), errorClass);
						submit = false;
						if(!$('weight-error')) {
							var el = document.createElement('p');
							el.setAttribute('id', 'weight-error');
							WS.addClass(el, 'warning');
							el.innerHTML = 'Uw camper mag niet zwaarder zijn dan 3500 Kg.';
							WS.DOM.insertAfter(el, $('form-steps'));
						}
					}
				}
			}
			
			if($('birthdate')) {				
				var birthdateParts = $('birthdate').value.split('-');
				var currentDate = new Date();
				currentDate.setFullYear(currentDate.getFullYear()-25);
				var birthDate = new Date();
				birthDate.setFullYear(birthdateParts[2]);
				birthDate.setMonth(birthdateParts[1]-1);
				birthDate.setDate(birthdateParts[0]);
				if(currentDate<birthDate) {
					submit = false;
					WS.addClass($('birthdate'), errorClass);
					if(!$('birthdate-error')) {
						var el = document.createElement('p');
						el.setAttribute('id', 'birthdate-error');
						WS.addClass(el, 'warning');
						el.innerHTML = 'Voor het aanvragen van een camperverzekering dient u 25 jaar of ouder te zijn.';
						WS.DOM.insertAfter(el, $('form-steps'));
					}
				}
			}
			
			// telefoonnummer weer terug ingeregeld, deze moet immers ingevuld worden bij de laatste stap
			
			if($('phone') && $('phone').value == "" && $('mobile') && $('mobile').value == "") {
				submit = false;
				
				WS.addClass($('phone'), errorClass);
				WS.addClass($('mobile'), errorClass);
					
				if(!$('phone-error')) {
					var el = document.createElement('p');
					el.setAttribute('id', 'phone-error');
					WS.addClass(el, 'warning');
					el.innerHTML = 'Een telefoonnummer en/of mobielnummer moet worden ingevuld.';
					WS.DOM.insertAfter(el, $('form-steps'));
				}
			}
			
			// 
			if($('account')) {				
				var sAccountNumber = $('account').value;
				sAccountNumber = sAccountNumber.replace('.', '');
				if(sAccountNumber.length == 9) {
					var multiplier = sAccountNumber.length;
					var result = 0;
					for(var i = 0; i < sAccountNumber.length; i++) {
						result += sAccountNumber.charAt(i) * multiplier;
						multiplier -= 1;
					}
					
					if((result % 11) != 0) {
						submit = false;
						WS.addClass($('account'), errorClass);
						if(!$('account-error')) {
							var el = document.createElement('p');
							el.setAttribute('id', 'account-error');
							WS.addClass(el, 'warning');
							el.innerHTML = 'Dit is geen geldig nederlands bankrekening nummer.';
							WS.DOM.insertAfter(el, $('form-steps'));
						}
					}
				}
			}
			
			if($('insurancedate')) {
				var valid = validations['date'].regex.test($('insurancedate').value);

				if(!valid) {
					submit = false;
					WS.addClass($('insurancedate'), errorClass);
				}
				else if(valid && WS.hasClass($('insurancedate'), errorClass)) {
					WS.removeClass($('insurancedate'), errorClass);
				}
			
				var currentDate = new Date();				
				var insurancedate = checkInsuranceDate('insurancedate');
				var dateinfuture = new Date();
				dateinfuture.setFullYear(dateinfuture.getFullYear() + 1);
				
				if(insurancedate < currentDate) {
					submit = false;
					WS.addClass($('insurancedate'), errorClass);
					if(!$('insurancedate-error')) {
						var el = document.createElement('p');
						el.setAttribute('id', 'insurancedate-error');
						WS.addClass(el, 'warning');
						el.innerHTML = 'De ingangsdatum van uw verzekering mag niet in het verleden, en niet meer dan 1 jaar in de toekomst liggen.';
						WS.DOM.insertAfter(el, $('form-steps'));
					}
				}
				
				if(insurancedate > dateinfuture) {
					submit = false;
					WS.addClass($('insurancedate'), errorClass);
					if(!$('insurancedate-error')) {
						var el = document.createElement('p');
						el.setAttribute('id', 'insurancedate-error');
						WS.addClass(el, 'warning');
						el.innerHTML = 'De ingangsdatum van uw verzekering mag niet in het verleden, en niet meer dan 1 jaar in de toekomst liggen.';
						WS.DOM.insertAfter(el, $('form-steps'));
					}
				}
			}
			
			if($('travelinsurancedate')) {
				var currentDate = new Date();
				var dateinfuture = new Date();
				dateinfuture.setFullYear(dateinfuture.getFullYear() + 1);
				
				var insurancedate = checkInsuranceDate('travelinsurancedate');
				
				if(insurancedate < currentDate) {
					submit = false;
					WS.addClass($('travelinsurancedate'), errorClass);
					if(!$('travelinsurancedate-error')) {
						var el = document.createElement('p');
						el.setAttribute('id', 'travelinsurancedate-error');
						WS.addClass(el, 'warning');
						el.innerHTML = 'Ingangsdatum reisverzekering kan niet in het verleden zijn.';
						WS.DOM.insertAfter(el, $('form-steps'));
					}
				}
				
				if(insurancedate > dateinfuture) {
					submit = false;
					WS.addClass($('travelinsurancedate'), errorClass);
					if(!$('travelinsurancedate-error')) {
						var el = document.createElement('p');
						el.setAttribute('id', 'travelinsurancedate-error');
						WS.addClass(el, 'warning');
						el.innerHTML = 'Ingangsdatum reisverzekering kan maximaal 1 jaar in toekomst liggen.';
						WS.DOM.insertAfter(el, $('form-steps'));
					}
				}
			}
			
			/**
			 * On error, show top of form and display error message
			 */	
			if(submit===false) {
				window.scrollTo(0,250);
				if($('form-steps')) {
					if(!$('form-error')) {
						var el = document.createElement('p');
						el.setAttribute('id', 'form-error');
						WS.addClass(el, 'warning');
						el.innerHTML = 'De rood gemarkeerde velden zijn niet goed ingevuld.';
						WS.DOM.insertAfter(el, $('form-steps'));
					}
				}
			}
			
			return submit;
		}
	}
}

function checkInsuranceDate(insurancefield) {
	var insurancedateParts = $(insurancefield).value.split('-');
	var insurancedate = new Date();
	
	insurancedate.setFullYear(insurancedateParts[2]);
	insurancedate.setMonth(insurancedateParts[1] - 1);
	insurancedate.setDate(insurancedateParts[0]);
	
	return insurancedate;
}