(function($){
	var defaults = {messages : [
			{ tipo : '.url'	, message : 'URL inválida', regex : /(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/ }, 
			{ tipo : '.number'	, message : 'valor não numérico', regex : /[0-9]+/ }, 
			{ tipo : '.cnh_tipo', message : 'Tipo de CNH inválido', regex : /[A-E]+/ }, 
			{ tipo : '.email'	, message : 'endereço de email inválido', regex : /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/ }, 
			{ tipo : '.cnpj'	, message : 'CNPJ inválido', func : function (r){if(r=r.replace(/[^\d]+/g,""),14==r.length&&"00000000000000"!=r&&"11111111111111"!=r&&"22222222222222"!=r&&"33333333333333"!=r&&"44444444444444"!=r&&"55555555555555"!=r&&"66666666666666"!=r&&"77777777777777"!=r&&"88888888888888"!=r&&"99999999999999"!=r){var t=r.length-2,n=r.substring(0,t),e=r.substring(t),a=0,s=t-7;for(i=t;i>=1;i--)a+=n.charAt(t-i)*s--,2>s&&(s=9);var u=2>a%11?0:11-a%11;if(u!=e.charAt(0))return!1;for(t+=1,n=r.substring(0,t),a=0,s=t-7,i=t;i>=1;i--)a+=n.charAt(t-i)*s--,2>s&&(s=9);if(u=2>a%11?0:11-a%11,u==e.charAt(1))return!0}return!1}}, 
			{ tipo : '.cpf'	, message : 'CPF inválido', func : function(r){if(r=r.replace(/[^\d]+/g,""),11==r.length&&"00000000000"!=r&&"11111111111"!=r&&"22222222222"!=r&&"33333333333"!=r&&"44444444444"!=r&&"55555555555"!=r&&"66666666666"!=r&&"77777777777"!=r&&"88888888888"!=r&&"99999999999"!=r){var t=0;for(i=0;i<9;i++)t+=parseInt(r.charAt(i))*(10-i);var a=11-t%11;if((10==a||11==a)&&(a=0),a==parseInt(r.charAt(9))){for(t=0,i=0;i<10;i++)t+=parseInt(r.charAt(i))*(11-i);if(a=11-t%11,(10==a||11==a)&&(a=0),a==parseInt(r.charAt(10)))return!0}}return!1} },
			], vazio : 'preencha este campo' };

	$.fn.simpleValidator = function(){


		var t = $(this), valid = false, tmpInvalid;

		if(!t.is("form")) return this;

		var selectorsFields = "input.required, textarea.required, input[required], textarea[required]";
		for(var i=0; i < defaults.messages.length; i++)
			selectorsFields += ', '+defaults.messages[i].tipo;

		var toValidate = t.find(selectorsFields);
		toValidate.on('blur', function(e){
			$(this).auxValidate();
		});

		t.submit(function(e){

			toValidate.map(function(i,e){
				valid = $(e).auxValidate();
				if(!valid){	
					tmpInvalid = !!tmpInvalid ? tmpInvalid : e;
					return;
				}
			});

			$(tmpInvalid).trigger("focus");
			setTimeout(function(){
				$(toValidate).not(tmpInvalid).remTtip();
			},3000);

			if(!valid)
				e.preventDefault();

			return valid;
		});

		$.fn.auxValidate = function(){
			var _t = $(this);
			//wrap this element to append simpleValidatorTooltip in the next time
			if(!_t.parent().is('.sv-wrapper'))
				_t.wrap('<div class="sv-wrapper"></div>');

			// validate an empty field
			if(_t.is('[required]') || _t.is('.required'))
				if(_t.val().replace(/[\s\n\t]+/g,'') == ''){
					_t.simpleValidatorTooltip(defaults.vazio);
					return false;
				}

			var valid = true;
			for(var i in defaults.messages){
				if(_t.is(defaults.messages[i].tipo) && !(!(_t.is('[required]') || _t.is('.required')) && (_t.value == ''))){
					if(defaults.messages[i].regex) {
						if(!(defaults.messages[i].regex.test(_t.val()))){
							_t.simpleValidatorTooltip(defaults.messages[i].message);
							valid = false;
							break;
						}
					} else if(defaults.messages[i].func){
						if(!(defaults.messages[i].func(_t.val()))){
							_t.simpleValidatorTooltip(defaults.messages[i].message);
							valid = false;
							break;
						}
						break;
					}
				}
			}
			if(valid)
				_t.remTtip();
			return valid;
		}

		$.fn.simpleValidatorTooltip = function(message){
			var _t = $(this).addClass('sv-error');
			var timer = setInterval(function(){
				_t.removeClass("sv-error");
				clearInterval(timer);
			},1000);

			$(this).parent().find('.sv-tooltip').remove();
			$(this).parent().append('<div class="sv-tooltip">'+message+'</div>');

			//bind simpleValidatorTooltips click event
			$(".sv-tooltip")
				.unbind("click")
				.bind("click", function(){
					$(this).fadeOut(300,function(){
						$(this).remove();
					});
			});
		}
		$.fn.remTtip = function(message){
			$(this).removeClass('sv-error').parent().find('.sv-tooltip').fadeOut(300,function(){
					$(this).remove();
				});
		}

	}
})(jQuery);