/*
 * jQuery liveValidation plugin
 * 
 * YOU ARE FREE TO USE, MODIFY OR EXTEND THIS PLUGIN, AS LONG AS THIS COPYRIGHT NOTICE STAYS PRESENT.
 *
 * Copyright (c) 2009 Glenn Ceurvels - www.gackson.be
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 */
(function($){
	$.fn.liveValidation = function (userSettings) {
		var settings = $.extend({
				 invalidClass:"invalid",
				 validClass:"valid",
				 onSendError:function() {},
				 onSendSucces:function() {},
				 performAction:true
		}, userSettings ? userSettings: {});
		var form = this;
		var fields = this.find("input[type=text], textarea, input[type=password]").filter(".reqd, .email, .reqdNumber, .phone");
		var radios = this.find("input[type=radio].reqdRadio");
		init()
		
		return form;
		
		function init() {
			form.bind("submit", submitHandler);
			fields.bind("blur", function(){validate(this)});
		}
		function validate(f) {
			var type = $(f).attr("class");
			var valid = false;
			var value = $(f).val();
						
			if (type.search("email")> -1) {valid = validateMail(value)}
			else if (type.search("reqdNumber")> -1) {valid = validateNumber(value)}
			else if (type.search("reqd")> -1) {valid = validateReqd(value)}
			else if (type.search("phone")> -1) {valid = validatePhone(value)}
			
			if (!valid) {
				$(f).addClass(settings.invalidClass).removeClass(settings.validClass);
			}
			else if (valid) {
				$(f).addClass(settings.validClass).removeClass(settings.invalidClass);
			}
		}
		function submitHandler(event) {
			//alle fields checken, met autocomplete van velden zijn de goede class'en mogelijk nog niet aanwezig
			fields = form.find("input[type=text], textarea").filter(".reqd, .email, .reqdNumber, .phone");
			fields.each(function() {
				validate(this);		 
			});
			
			if ((fields.filter("." + settings.validClass).size() != fields.size()) || !validRadios()) {
				event.preventDefault();
				settings.onSendError();
			}
			else {
				if (!settings.performAction) {
					event.preventDefault();	
				}
				settings.onSendSucces();
			}
		}
		function validateMail(val) {
			var value = $.trim(val);
			var pattern = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			if (value.length == 0) {
				return false;	
			}
			if (value.match(pattern)) {
				return true;	
			}
			return false;
		}
		function validateReqd (val) {
			if ($.trim(val).length == 0) {
				return false;	
			}
			else {
				return true;	
			}
			return false;		
		}
		function validateNumber (val) {
			if ($.trim(String(val)).length == 0) {
				return false;	
			}
			if (isNaN(Number(val))) {
				return false;	
			}
			else {
				return true;	
			}
			
			return false;		
		}
		function validatePhone (val) {
			var value = $.trim(val);
			var pattern = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/;
			if (value.length == 0) {
				return false;	
			}
			if (value.match(pattern)) {
				return true;	
			}
			return false;
		}
		function validRadios() {
			if (radios.size() > 0) {
				//valideren
				var checkedNames = new Array();
				var groepName;
				for (var i=0; i< radios.size(); i++) {
					groepName = radios.eq(i).attr("name");
					if ($.inArray(groepName, checkedNames)<0) {
						if (radios.filter("[name="+ groepName +"]:checked").size() > 0) {
							checkedNames.push(groepName);
							radios.filter("[name=" + groepName +"]").parent().addClass(settings.validClass);
						}
						else {
							radios.filter("[name=" + groepName +"]").parent().addClass(settings.invalidClass);
							return false;
						}
					}
					else if (($.inArray(groepName, checkedNames)>-1) && i == radios.size()-1) {
						return true;
					}
				}
			}
			else {
				return true;
			}
		}
		
	}		  
})(jQuery)
