jQuery.fn.validate = function(p) {
	// Variables
	var FormID = this.attr('id');
	var Errors = new Array();
	
	// Runtime
	ParseParams(p);
	
	// Functions
	function IsNull(v) {
		if ((v == null) || (v == '')) return true;
		return false;
	}

	function ParseParams(p) {
		$.each(p.rules,function(i,n) {
			BindElement(i);
		});
		if (!p.defaultResponse) p.defaultResponse = 'You must fill out the form correctly';
	}
	
	function BindElement(id) {
		// On Keyup
		$("#"+id).keyup(function() {
			var el = $(this);
			switch (IsNull(el.val())) {
				case true :
					el.addClass(p._class);
					break;
				case false :
					el.removeClass(p._class);
					break;
			}
		});
		// On Blur
		$("#"+id).blur(function() {
			var el = $(this);
			switch (IsNull(el.val())) {
				case true :
					el.addClass(p._class);
					break;
				case false :
					el.removeClass(p._class);
					break;
			}
		});
	}
	
	function ValidateElement(el, a) {
		var valid = true;
		var val = $("#"+el).val();
		$.each(a, function(i,n) {
			valid = IsNull(val) ? false : true;
			
			switch (i) {
				case 'numeric':
					if (n == 'float') {
						valid = (parseFloat(val) && parseFloat(val) != NaN) ? true : false;
					}
					if (n == 'int') {
						valid = (parseInt(val) && parseInt(val) != NaN) ? true : false;
					}
					break;
					
				case 'equals':
					valid = (val == n) ? true : false;
					break;
				
				case 'maxValue':
					valid = (val > n) ? false : true;
					break;
				
				case 'minValue':
					valid = (val < n) ? false : true;
					break;
				
				case 'maxLength':
					valid = (val.length > n) ? false : true;
					break;
					
				case 'minLength':
					valid = (val.length < n) ? false : true;
					break;
					
				case 'len':
					valid = (val.length == n) ? true : false;
					break;
				
				case 'email':
					var emxp  = /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;
					valid = emxp.test(val) ? true : false;
					break;
				
				case 'date':
					if (n == 'dd/mm/YYYY') {
						valid = (/\b(0[1-9]|[12][0-9]|3[01]|[1-9])[- \/.](0[1-9]|1[012]|[1-9])[- \/.]((19|20)\d{2}|\d{2})\b/.test(val)) ? true : false;
					} else if (n == 'mm/dd/YYYY') {
						valid = (/\b(0[1-9]|1[012]|[1-9])[- \/.](0[1-9]|[12][0-9]|3[01]|[1-9])[- \/.]((19|20)\d{2}|\d{2})\b/.test(val)) ? true : false;
					}
					break;
			}
			if (!valid) {
				Errors.push(p.messages[el][i]);
			}
		});
	}
	
	function ValidateForm() {
		var r = true;
		Errors = new Array();
		$.each(p.rules, function(i,n) {
			ValidateElement(i,n);
		});
		if (Errors.length > 0) {
			var txt = p.defaultResponse + "<ul>";
			$.each(Errors, function(i,n) {
				txt += '<li>' + n + '</li>';
			});
			txt += "</ul>";
			$(p.responseID).html(txt);
			
			$(p.responseID).css("display","block");
			r = false;
		}
		return r;
	}
	
	// Events
	$("#"+FormID).submit(function() {
		return ValidateForm();
	});
}