(function($) {
		  
$.extend($.fn, { 
	validate: function(options){
		var validator = this;
		
		validator.find('label[for]').each(function (){
			$(this).click(function (){
				validator.find('input[type=text][name=' + $(this).attr('for') + ']').focus();
				validator.find('select[name=' + $(this).attr('for') + ']').focus();
				validator.find('textarea[name=' + $(this).attr('for') + ']').focus();
			});
		});
		
		validator.show = function (message, item) {
			if(message == 'success'){
				validator.find('label[generated=true][for=' + item.name + ']').text(item.messages[message]).removeClass('prompt').removeClass('error').addClass('success');
			} else if (message == 'prompt') {
				if(item.messages[message]){
					validator.find('label[generated=true][for=' + item.name + ']').text(item.messages[message]).removeClass('error').removeClass('success').addClass('prompt');
				}
			} else {
				if(!item.messages[message]){
					item.messages[message] = 'Unknow error!';
				}
				validator.find('label[generated=true][for=' + item.name + ']').text(item.messages[message]).removeClass('prompt').removeClass('success').addClass('error');;
			}
			return false;
		}
		
		validator.revert = function (item) {
			validator.find('label[generated=true][for=' + item.name + ']').text('').removeClass('prompt').removeClass('error').removeClass('success');
			item.old = '';
		}
		
		$.each(options.rules, function (key, value) {
			if (!value.messages){
				value.messages = {};
			}
			if (!value.messages.error){
				value.messages.error = 'This field is required!';
			}
			if (!value.messages.success){
				value.messages.success = 'Success.';
			}
			validator[key] = {}
			validator[key].messages = value.messages;
			validator[key].name = key;
			validator[key].old = '';
			validator[key].value = '';
			if(validator.find('[name=' + key + ']').length == 0){
				return;
			}
			var tag = validator.find('[name=' + key + ']').get(0).tagName.toLowerCase();
			if (validator.find(tag + '[name=' + key + ']').length > 0){
				validator[key].tag = tag;
				validator[key].type = null;
				if(tag == 'input'){
					validator[key].type = validator.find(this + '[name=' + key + ']').attr('type');
				}
				validator.find(tag + '[name=' + key + ']').focus(function() {
					if(!validator[key].old){
						validator.show('prompt', validator[key]);
					}
				});
				validator.find(tag + '[name=' + key + ']').blur(function() {
					
					if(validator[key].type == 'radio' || validator[key].type == 'checkbox'){
						if($('input:checked[name=' + $(this).attr('name') + ']').length == 0){
							validator[key].value = '';
						} else {
							validator[key].value = $('input:checked[name=' + $(this).attr('name') + ']').val();
						}
					} else {
						validator[key].value = $.trim($(this).val());
					}
					
					if (validator[key].value != '' && validator[key].old == validator[key].value){
						return;
					} else {
						validator[key].old = validator[key].value;
					}
					value.fn(key, validator);
				});
				if(tag == 'select'){
					validator.find(this + '[name=' + key + ']').change(function() {
						validator[key].value = $.trim($(this).val());
						if (validator[key].value != '' && validator[key].old == validator[key].value){
							return;
						} else {
							validator[key].old = validator[key].value;
						}
						value.fn(key, validator);
					});
				}
			}
			
			if(options.prompt){
				if(value.messages.prompt){
					validator.find('label[generated=true][for=' + key + ']').text(value.messages.prompt).attr('class', 'prompt');
				}
			}
		});
		this.submit(function (){
			
			$.each(options.rules, function (key, value) {
				if (validator.find('[name=' + key + ']').length > 0){
					var tag = validator.find('[name=' + key + ']').get(0).tagName.toLowerCase();
					validator.find(tag + '[name=' + key + ']').blur();
				}
			});
			options.fn(validator);
			if(validator.find('label.error[generated=true]').length > 0){
				return false;
			}
		});
	}
});

})(jQuery);
