$.fn.extend({
	validate: function() {
		var errors = [];
		this.each(function() {
			var form = $(this);
			$(this).find(':input[class!=""]').each(function() {
				var id = $(this).attr('id');
				var label = form.find('label[for=' + id + ']').text();
				var value = $(this).val();
				if ( $(this).hasClass('validate-require') ) {
					if ( !value ) {
						errors.push({input:this, id:id, label:label, error:'require', value:value});
					}
				}
				if (value) {
					if ( $(this).hasClass('validate-email') ) {
						if ( !value.match(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/) ) {
							errors.push({input:this, id:id, label:label, error:'email', value:value});
						}
					} else if ( $(this).hasClass('validate-url') ) {
						if ( !value.match(/^(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?:\w+:\w+@)?(?:(?:[-\w]+\.)+(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?::[\d]{1,5})?(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$/) ) {
							errors.push({input:this, id:id, label:label, error:'url', value:value});
						}
					} else if ( $(this).hasClass('validate-number') ) {
						if ( !value.match(/^[\d\s\,\.]+$/) ) {
							errors.push({input:this, id:id, label:label, error:'number', value:value});
						}
					} else if ( $(this).hasClass('validate-integer') ) {
						if ( !value.match(/^[\d]+$/) ) {
							errors.push({input:this, id:id, label:label, error:'integer', value:value});
						}
					} else if ( $(this).hasClass('validate-phone') ) {
						if ( !value.match(/^[\d\s\+\-\(\)]+$/) ) {
							errors.push({input:this, id:id, label:label, error:'phone', value:value});
						}
					}
					if ( $(this).is('[class*="validate-minlength-"]') ) {
						var min = (/validate\-minlength\-([\d]+)/).exec($(this).attr('class'));
						if (min) {
							if ( value.length < min[1] ) {
								errors.push({input:this, id:id, label:label, error:'minlength', value:value, min:min[1]});
							}
						}
					}
					if ( $(this).is('[class*="validate-maxlength-"]') ) {
						var max = (/validate\-maxlength\-([\d]+)/).exec($(this).attr('class'));
						if (max) {
							if ( value.length > max[1] ) {
								errors.push({input:this, id:id, label:label, error:'maxlength', value:value, max:max[1]});
							}
						}
					}
				}
			});
		});
		return {
			success: !(errors.length > 0),
			errors: errors
		};
	}
});

