/**
 * VALIDAÇÃO DE FORMULARIOS
 * versão: 1.3
 */

(function($){

	/**
	 * Tratamento de validaçao
	 */
	$.fn.validar = function() {
		
		var options = $.extend($.fn.validar.defaults, $.fn.validar.options);
		
		//habilita a checagem com alteraçao de valor
		$(this).vKeyup();
		
		//avalia todos os objetos da string
		for(y=0; y<options.obj.length; y++) {
		
			//separa o objeto e o tipo de processamento
			ar  = options.obj[y].split('[');
			arq = ar[0];
			tip = ar[1].substr(0, (ar[1].length - 1));
			
			//verifica se o campo está vazio
			if ($(arq).val() == "") { $(this).vErro(arq); }
			else {
			
				//faz a validaçao de acordo com o tipo escolhido
				switch (tip) {
		
					case "email": 			$(this).vMail(arq); break;
					case "site": 			$(this).vSite(arq); break;
					case "alfanumerico": 	$(this).vAlfanumerico(arq); break;
					default: 				$(this).vOk(arq); break;
				
				}
			
			}
		
		}

	};
	
	/**
	 * A toda alteração dos objetos abre a função de validação
	 */
	$.fn.vKeyup = function() { 
	
		var options = $.extend($.fn.validar.defaults, $.fn.validar.options);
	
		if(options.kup) {
	
			$(options.frm).find("input").keyup( function()		{ $(this).validar(this); });
			$(options.frm).find("textarea").keyup( function()	{ $(this).validar(this); });
			$(options.frm).find("select").change( function()	{ $(this).validar(this); });
			
		};

		//desabilita a validaçao pelo keyup
		// - desabilita para nao criar um loop em cima da mesma funçao
		$.fn.validar.options = {kup: false};
		
	};
	
	/**
	 * Formataçao para ERRO
	 * - adiciona o css ao objeto
	 * - insere a imagem infomativa ao lado do objeto
	 */
	$.fn.vErro = function(i){
		
		var options = $.extend($.fn.validar.defaults, $.fn.validar.options);
		var style = 'position:relative; top:-18px; width:0px; height:0px; left:'+ ($(i).width() + 5) +'px;';
		
		//css
		if(options.css) {
			
			$(i).css("background", options.cssBgErro);
			$(i).css("border", '1px solid ' + options.cssBorderErro);
			
		};
		
		//imagem
		if (options.imagem) {
			
			if (!$(i + "_").length) {	
				
				html = '<div style="'+ style +'" id="'+ $(i).attr('id') +'_"></div>'; 
				$(i).after(html);
				
			}
	
			$(i + "_").html('<img src="'+ options.dirImg + options.imgErro +'">');
		}
		
		//altera o status geral
		$.fn.validar.options = {st: 'f'};
	
	}
	
	/**
	 * Formataçao para OK
	 * - adiciona o css ao objeto
	 * - insere a imagem infomativa ao lado do objeto
	 */
	$.fn.vOk = function(i){
		
		var options = $.extend($.fn.validar.defaults, $.fn.validar.options);
		var style = 'position:relative; top:-18px; width:0px; height:0px; left:'+ ($(i).width() + 5) +'px;';

		//css			
		if(options.css) {
			
			$(i).css("background", options.cssBgOk);
			$(i).css("border", '1px solid ' + options.cssBorderOk);
			
		};
		
		//imagem
		if (options.imagem) {
			
			if (!$(i + "_").length) {	
				
				html = '<div style="'+ style +'" id="'+ $(i).attr('id') +'_"></div>'; 
				$(i).after(html);
				
			}
		
		}

		$(i + "_").html('<img src="'+ options.dirImg + options.imgOk +'">');
	
	}
	
	/**
	 * Retorna o status geral
	 */
	$.fn.vConfirm = function(){
		
		var options = $.extend($.fn.validar.defaults, $.fn.validar.options);
		
		if (options.st == "t") {
			
			//limpa o div de status
			$(options.msg).html("");
			return true;
			
		}
			
		else { return false; }
	
	}
	
	/**
	 * Verifica se o texto esta no formato correto de e-mail.
	 */
	$.fn.vMail = function(i){
		
		var expressao = "^([0-9a-zA-Z]+([_.-]?[0-9a-zA-Z]+)*@[0-9a-zA-Z]+[0-9,a-z,A-Z,.,-]*\.{1}[a-zA-Z]{2,4})+$";
		
		if ($(i).val().match(expressao)) { $(this).vOk(i); }	
		else { $(this).vErro(i); }
	
	}
	
	/**
	 * Verifica se o texto esta no formato correto de website.
	 */
	$.fn.vSite = function(i){
		
		var expressao = "^(http[s]?://|ftp://)?(www\.)?[a-zA-Z0-9-\.]+\.(com|org|net|mil|edu|ca|co.uk|com.au|gov|br)$";
		
		if ($(i).val().match(expressao)) { $(this).vOk(i); }	
		else { $(this).vErro(i); }
	
	}
	
	/**
	 * Caracteres alfanuméricos, o que no caso de ASCII corresponde a [A-Za-z0-9]
	 */
	$.fn.vAlfanumerico = function(i){
		
		var expressao = "^[a-zA-Z0-9 ]+$";
		
		if ($(i).val().match(expressao)) { $(this).vOk(i); }	
		else { $(this).vErro(i); }
	
	}
	
	/**
	 * Variáveis
	 */	
	$.fn.validar.defaults = { 
		st: 't',
		msg: '',
		frm: '',
		obj: {},
		css: true,
		kup: true,
		imagem: false,
		cssBgErro: '#FFEAEA',
		cssBgOk: '#EBFFD7',
		cssBorderErro: '#F63',
		cssBorderOk: '#5FA',
		dirImg: '',
		imgErro: 'erro.png',
		imgOk: 'ok.png'
	};


})(jQuery);
