(function($){
/* Custom form validation */
var formValidate = {
	messages: {
		required: 'required message',
		email: 'email message',
		zip: 'zip message',
		plate: 'number plate message',
		password: 'password message',
		nodigit: 'no digits message',
		digits: 'only digits message',
		phone: 'telephone message',
		date: 'date message',
		check: 'two fields must be the same',
		'damage-free-years': 'damage free years message'
	},
	selector: 'form',
	init: function(){
		$(formValidate.selector).each(function(){
			var form = $(this);
			formValidate.companyList();
			form.submit(function(e, el){
				if (el && $(el).hasClass('novalidation')) return;

				formValidate.removeErrors(form);
				formValidate.checked = true;
				$('*[data-validation]:visible', form).each(function(){
					var field = $(this);
					var crit = field.attr('data-validation').replace(' ','').split(',');
					jQuery.each(crit, function() {
						formValidate.checkField(field,this);
					});
				});

				if(!formValidate.checked) {return formValidate.handleErrors(form);}
			});
		});
	},
	companyList: function(){
		// insurance company list
		$('input[name=insurance-company]').click(function(){
			if ($('input[name=insurance-company]:eq(1):checked').size()==1) {
				$('select#name-insurance-company').val('').attr('disabled','disabled').attr('data-validation','');
			}
			else {
				$('select#name-insurance-company').attr('disabled','').attr('data-validation','required');
			}
		});

	},
	removeErrors: function(){
		$('#validationerrors').addClass('hide');
		$('.gc-error').removeClass('gc-error error');
		$('.g-error').remove();
	},
	checkField: function(field,crit) {
		var fielderror = false;
		var value = field.val();
		var c = crit.replace('-silent','');
		switch(c) {
			case 'required':
				if (field.attr('type')=='radio') {
					if (!$('input[name='+field.attr('name')+']:checked', field.parents('form')).size()) fielderror = true;
				}
				else if (field.attr('type')=='checkbox') {
					if (!$('input:checkbox[name='+field.attr('name')+']:checked').size()) fielderror = true;
				}
				else if (field.val() =='') fielderror = true;
				break;
			case 'email':
				if(!/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(value)) fielderror = true;
				break;
			case 'zip':
				if (!/^\d{4}[\s-]?[a-zA-Z]{2}$/.test(value)) fielderror = true;
				break;
			case 'plate':
				if (!/^[a-zA-Z\d\s-]{6,}$/.test(value)) fielderror = true;
				break;
			case 'password':
				if (!/^[a-z\d]{6,}$/i.test(value)) fielderror = true;
				break;
			case 'nodigit':
				if (/\d/.test(value)) fielderror = true;
				break;
			case 'digits':
				if (!/^\d+$/.test(value)) fielderror = true;
				break;
			case 'phone':
				if (!/^\d{2}[\s-]?\d{8}$|^\d{3}[\s-]?\d{7}$|^\d{4}[\s-]?\d{6}$|^\d{10}$/.test(value)) fielderror = true;
				break;
			case 'date':
			case 'age18':
				var selectdate = new Array();
				field.parent().find('input[type=text],select').each(function(){
					selectdate.push($(this).val());
				});

				var year = parseInt(selectdate[2], 10);
				var month = parseInt(selectdate[1], 10);
				var day = parseInt(selectdate[0], 10);

				function checkDate(){
					if (month==2) {
						if (((year%4 == 0) && (year%100 != 0)) || (year%400==0)) {
							if (day > 29) return false;
						}
						else if (day > 28) return false;
					}
					if ((month == 4) || (month == 6) || (month == 9) || (month==11)) {
						if (day > 30) return false;
					}
					if (day > 31) return false;
					return true;
				}


				if(!checkDate() || !year || !month || !day) fielderror = true;
				
				if (c == 'age18') {
					var birthday = new Date(selectdate.reverse().join('/'));
					var today = new Date();
					var years = Math.floor((today-birthday)/31536000000);
					if (years < 18) fielderror = true;
				}
				break;
			case 'check':
				if ($('#confirm'+field.attr('id').charAt(0).toUpperCase()+field.attr('id').substr(1)).val() != value) fielderror = true;
				break;
			case 'damage-free-years':
				var selectdate = new Array();
				$('input#birthDateDay').parent().find('input,select').each(function(){
					selectdate.push($(this).val());
				});
				var birthday = new Date(selectdate.reverse().join('/'));
				var today = new Date();

				var years = Math.floor((today-birthday)/31536000000);
				if ((years-parseInt(field.text()))<18) fielderror = true;
				break;

		}
		if (fielderror) formValidate.error(field,crit);
	},
	error: function(field,crit) {
		formValidate.checked = false;
		field.parents('li:first').addClass('error gc-error');
		var message = field.cmsValidationMessage(crit);
		if (message) {
			if(field.parents('li:first').find('p.g-error').size()) field.parents('li:first').find('p.g-error').append('<br/>'+message);
			else field.parents('li:first').append('<p class="error g-error">'+message+'</p>');
		}
	},
	/*
	 * MR -> 2010-04-22
	 * if the message is not present the standard error is displayed else the message displayed should be the function parameter
	 */
	handleErrors: function(form, message) {
		if(!message)
			message = 'Er is iets fout gegaan. Controleer alstublieft de aangegeven velden.';
		$('div.content-main').before('<div class="push error g-error"><div class="inner"><p>' + message + '</p></div></div>');
		window.scrollTo(0,0);
		return false;
	}

}

/* Dependancy */
var dependancies = {
	init: function(){
		// initial hide
		$('.dependant').hide();
		$('*[data-dependant]').each(function(){
			var field = $(this);
			$(field).click(function(){
				var deps = field.attr('data-dependant').replace(' ','').split(',');
				for (var d in deps) {
					var subjectArr = deps[d].split('=');
					var subject = subjectArr[0];
					var state = subjectArr[1];

					if (field.attr('type')=='checkbox') {
						if (!field.attr("checked")) {
							 state = state == 'on' ? 'off' : 'on';
						}
					}

					if (state == 'on') $('.' + subject).show();
					else $('.' + subject).hide();
				}

			});

		});
	}
}

$(document).ready( function() {
	formValidate.init();
	dependancies.init();
});

window.formValidation=formValidate;

})(jQuery);
