$(document)
.ready(
	function(){

	/* FORM VALIDATION Trigger */
	$(".jqValidate").each(
		function()
		{
		var paramsObj = $(this);
			$(this).parents("form").submit(function()
			{
				var params = paramsObj.attr("value").split(/\s*;\s*/);
				return validateForm($(this),params[0],params[1],params[2]);
		});
	});
	<!-- / form validation trigger -->


	/* FORM VALIDATION */	
	function validateForm(frmObj,required,msg,echo){ 
		var emailfilter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		var telefoonfilter = /^([0-9-]{10})/;
		var postcodefilter = /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/;
		var datefilter = /^([0-9]{2})-([0-9]{2})-([0-9]{4})$/;
		var errorFields = '';
		var requiredFields = required.split (/\s*,\s*/);
		
		for(var i=0;i<requiredFields.length;i++){
			var fldObj = frmObj.find("#"+requiredFields[i])[0];
			if(fldObj == undefined)
			{
				alert("Couldn't find the following object: " + requiredFields[i]);
				return false;
			}
			function hasErrors(obj){
				if(obj.type != 'checkbox' && obj.value == '') return true;
				else if(obj.type != 'checkbox' && obj.value == obj.title) return true;
				else if(obj.type == 'checkbox' && obj.checked == false) return true;
				else if(obj.name.toLowerCase().indexOf("e-mail") != -1 && !emailfilter.test(obj.value)) return true;
				//else if(obj.name.toLowerCase().indexOf("datum") && !datefilter.test(obj.value)) return true;
				else if((obj.name.toLowerCase().indexOf("telefoon") != -1 || obj.name.toLowerCase().indexOf("mobiel") != -1 || obj.name.toLowerCase().indexOf("fax")) != -1 && !telefoonfilter.test(obj.value)) return true;
				else if(obj.name.toLowerCase().indexOf("postcode") != -1 && !postcodefilter.test(obj.value)) return true;
				else if(obj.name.indexOf("Herhaal") != -1 && notSame(obj)) return true;
				else if(obj.value.indexOf("<") != -1) return true;
				else if(obj.value.indexOf("--") != -1) return true;
				else return false;
			}

			function notSame(obj){
				if(obj.value != $(obj).parent().prev().find("input").val())	return true;
			}
			
			if(hasErrors(fldObj)){
				errorFields += (fldObj.title) ? fldObj.title + ", " : fldObj.name + ", ";
				$(fldObj).parent().addClass("notValid");

				/* TO DO : eventhandlers get binded multiple times, so build a check to see if handlers are already binded with -> console.log($(fldObj).data('events')); */
				
				// Bind key up functionality on input and textarea
				$(fldObj).not("select").not(".checkbox").bind("keyup click", function(){
					if(!hasErrors(this)) $(this).parent().removeClass("notValid");
					else $(this).parent().addClass("notValid");
				});
				
				// Bind change and keyup functionality on selectboxes
				$(fldObj).not("input:not(:checked)").not("textarea").bind("change keyup", function(){
					if(!hasErrors(this)) $(this).parent().removeClass("notValid");
					else $(this).parent().addClass("notValid");
				});

				// Bind click functionality on checkbox
				$(fldObj).filter("input:checkbox").bind("click", function(){
					// re-validate
					if($(this).is(":checked")) $(this).parent().removeClass("notValid");
					else $(this).parent().addClass("notValid");
				});
				
				// Bind click functionality on custom checkbox
				/*$(fldObj).filter("input:checkbox").next("img").bind("click", function(){
					// re-validate
					if($(this).hasClass("checked")) $(this).parent().removeClass("notValid");
					else $(this).parent().addClass("notValid");
				});*/
				
			}
		}
	
		// Handle error message
		if(errorFields != ''){
			errorFields = errorFields.substring(-1,errorFields.length-2) + ".";
			frmObj.find("div.notValidMsg").remove();
			var errors = (echo && echo === "noEcho")? "" : " "+errorFields;
			errors = (errors.length > 129)? errors.substring(0,129)+"..." : errors;
			
			frmObj.find("input.submit").parent().after("<div class='notValidMsg'><p>"+ msg +"<br /><strong>"+ errors +"</strong></p></div>")
			.prev("div.notValidMsg").hide().slideDown();
			return false;
		} else {
			return true;	
		}

	} <!-- / form validation -->


	/* ADD TO AND REMOVE FROM VALIDATION ON DEMAND */
	// obj is either a string of id references or a single object reference.
	// validationObj is the '.jqValidate' obj.
	function addToValidation(obj,validationObj) 
	{
		// add single obj or string
		var stringToAdd = (typeof obj === 'string')? obj : obj.attr("id");
		// check if obj is already added
		if(validationObj.val().indexOf(stringToAdd) != -1) return;
		// add to validation
		var validationString = validationObj.val();
		validationString = validationString.replace(";",","+stringToAdd+";");
		validationObj.val(validationString);
	};
	
	function removeFromValidation(obj,validationObj) 
	{
		// add single obj or string
		var stringToRemove = (typeof obj === 'string')? obj : obj.attr("id");
		// check if obj is present
		if(validationObj.val().indexOf(stringToRemove) == -1) return;
		var validationString = validationObj.val();
		validationString = validationString.replace(","+stringToRemove,"");
		validationObj.val(validationString);
	};
	<!-- / add to and remove from validation on demand -->


	
	

}); /* /.ready */
