﻿/**
 * Classe de Validações
 * 
 * @author Charles Cavalcante
 * @link   www.charles.art.br
 *
 * @version 1.2, 2011-08-11 22:15
 * 
 */
Validacao = function()
{
	this.validou = true;
	this.erro = '';
	this.texto = '';
	$('#erro').remove();
	
	/**
	 * Retorna o resultado da validação e escreve o erro se houver 
	 */
	this.retorno = function(form)
	{
		if(this.validou==false)
		{
			if(this.texto=="")
			{
				this.erro = this.erro.substr(1);
			}
			
			form.prepend('<a name=msg_erro></a><pre id=erro><h3>' + this.texto + '</h3>' + this.erro + '</pre>');
			
			location = '#msg_erro';
		}
		
		return this.validou;
	};
	
	/**
	 * Valida String
	 * @param string_nome string <p>
	 * Nome da string que será validada
	 * </p>
	 * @param nullable string <p>
	 * Permite nulo (YES) ou não (NO)
	 * </p>
	 * @param string_tamanho string <p>
	 * Tamanho limite da string que será validada (0 para ilimitado)
	 * </p>
	 * @param msg_erro_vazio string <p>
	 * Mensagem de erro para string vazia
	 * </p>
	 * @param msg_erro_tamanho string <p>
	 * Mensagem de erro para string maior do que o limite
	 * </p> 
	 */		
	this.valida_string = function(string_nome, nullable, string_tamanho, msg_erro_vazio, msg_erro_tamanho)
	{
		tmpvalidou = true;
		strlen = $("[name=" + string_nome + "]").val().length;
		
		if(strlen == 0 && nullable=='NO')
		{
			this.erro += "\n" + msg_erro_vazio;
			tmpvalidou = false;
		}
		else if(strlen > string_tamanho && string_tamanho > 0)
		{
			this.erro += "\n" + msg_erro_tamanho;
			tmpvalidou = false;
		}
		
		if(tmpvalidou == false)
		{			
			this.validou = false;
		}
		
		this.borda(string_nome, tmpvalidou);
	};
	
	/**
	 * Valida E-mail
	 * @param string_nome string <p>
	 * Nome da string que será validada
	 * </p>
	 * @param nullable string <p>
	 * Permite nulo (YES) ou não (NO)
	 * </p>
	 * @param msg_erro_vazio string <p>
	 * Mensagem de erro para string vazia
	 * </p>
	 * @param msg_erro_formato string <p>
	 * Mensagem de erro para e-mail com formato inválido
	 * </p> 
	 */		
	this.valida_email = function(string_nome, nullable, msg_erro_vazio, msg_erro_formato)
	{
		tmpvalidou = true;
		strlen = $("[name=" + string_nome + "]").val().length;
		pattern = /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/i;
		
		if(strlen == 0)
		{
			if(nullable=='NO')
			{
				this.erro += "\n" + msg_erro_vazio;
				tmpvalidou = false;
			}
		}
		else if(pattern.test($("[name=" + string_nome + "]").val())==false)
		{
			this.erro += "\n" + msg_erro_formato;
			tmpvalidou = false;
		}
		
		if(tmpvalidou == false)
		{
			this.validou = false;
		}

		this.borda(string_nome, tmpvalidou);
	};
	
	/**
	 * Valida Data
	 * @param string_nome string <p>
	 * Nome da string que será validada
	 * </p>
	 * @param nullable string <p>
	 * Permite nulo (YES) ou não (NO)
	 * </p>
	 * @param msg_erro_tamanho string <p>
	 * Mensagem de erro para data inválida
	 * </p> 
	 */	
	this.valida_data = function(string_nome, nullable, msg_erro_formato)
	{
		tmpvalidou = true;
		strlen = $("[name=" + string_nome + "]").val().length;
		pattern = /^(19|20)\d\d\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$/;

		if(strlen == 0)
		{
			if(nullable=='NO')
			{
				this.erro += "\n" + msg_erro_formato;
				tmpvalidou = false;
			}
		}
		else if(pattern.test($("[name=" + string_nome + "]").val())==false)
		{ 
			this.erro += "\n" + msg_erro_formato;
			tmpvalidou = false;
		}
		
		this.borda(string_nome, tmpvalidou);
	};

	/**
	 * Valida Senha
	 * @param senha string <p>
	 * Senha que será validada
	 * </p>
	 * @param senha2 string <p>
	 * Confirmação da Senha que será validada
	 * </p> 
	 * @param msg_erro_vazio string <p>
	 * Mensagem de erro para string vazia
	 * </p>
	 * @param msg_erro_diferente string <p>
	 * Mensagem de erro para senhas diferentes
	 * </p> 
	 * @param msg_erro_minimo string <p>
	 * Mensagem de erro para senha com tamanho mínimo (6 caracteres) inválido
	 * </p>  
	 */	
	this.valida_senha = function(senha, senha2, msg_erro_vazio, msg_erro_diferente, msg_erro_minimo)
	{
		tmpvalidou = true;
		
		senha = $("[name=" + senha + "]").val();
		senha2 = $("[name=" + senha2 + "]").val();
		
		if(senha.length == 0)
		{
			this.erro += "\n" + msg_erro_vazio;
			tmpvalidou = false;
		}
		else if(senha.length < 6)
		{
			this.erro += "\n" + msg_erro_minimo;
			tmpvalidou = false;
		}
		else if(senha != senha2)
		{
			this.erro += "\n" + msg_erro_diferente;
			tmpvalidou = false;
		}
		
		if(tmpvalidou == false)
		{
			this.validou = false;
		}

		this.borda(string_nome, tmpvalidou);
	};
	
	/**
	 * Valida Checkbox e Radio
	 * @param string_nome string <p>
	 * Nome da string que será validada
	 * </p>
	 * @param msg_erro_vazio string <p>
	 * Mensagem de erro para string vazia
	 * </p>
	 */		
	this.valida_opcao = function(string_nome, msg_erro_vazio)
	{
		tmpvalidou = true;

		if($("[name='" + string_nome + "'][type=radio]:checked,[name='" + string_nome + "[]'][type=checkbox]:checked").size()==0)
		{
			this.erro += "\n" + msg_erro_vazio;
			tmpvalidou = false;
		}
		
		if(tmpvalidou == false)
		{			
			this.validou = false;
		}
	};	
	
	/**
	 * Valida Data2
	 * @param string_nome string <p>
	 * Nome da string que será validada
	 * </p>
	 * @param msg_erro_vazio string <p>
	 * Mensagem de erro para string vazia
	 * </p>
	 * @param msg_erro_tamanho string <p>
	 * Mensagem de erro para data inválida
	 * </p> 
	 */	
	this.valida_data2 = function(string_nome, msg_erro_vazio, msg_erro_formato)
	{
		tmpvalidou = true;
		pattern = /^(0[1-9]|[12][0-9]|3[01])\/(0[1-9]|1[012])\/(1[5-9]|20)\d\d$/;
		strlen = $("[name=" + string_nome + "]").val().length;
		
		if(strlen == 0)
		{
			this.erro += "\n" + msg_erro_vazio;
			tmpvalidou = false;
		}
		else if(pattern.test($("[name=" + string_nome + "]").val())==false)
		{ 
			this.erro += "\n" + msg_erro_formato;
			tmpvalidou = false;
		}
		
		this.borda(string_nome, tmpvalidou);
	};	
	
	/**
	 * Valida o CPF
	 * @param string_nome string <p>
	 * Nome da string que será validada
	 * </p>
	 * @param msg_erro_vazio string <p>
	 * Mensagem de erro para string vazia
	 * </p>
	 * @param msg_erro_formato string <p>
	 * Mensagem de erro para e-mail com formato inválido
	 * </p> 
	 */
	this.valida_cpf = function(string_nome, msg_erro_vazio, msg_erro_formato)
	{
		tmpvalidou = true;
		
		value = $("[name=" + string_nome + "]").val();
		value = value.replace(/\./g,'');
		cpf = value.replace(/\-/g,'');
		
		if(cpf.length==0)
		{
			this.erro += "\n" + msg_erro_vazio;
			tmpvalidou = false;
		}
		else
		{
			while(cpf.length < 11) cpf = "0"+ cpf;
			
			var expReg = /^0+$|^1+$|^2+$|^3+$|^4+$|^5+$|^6+$|^7+$|^8+$|^9+$/;
			var a = [];
			var b = new Number;
			var c = 11;
			
			for (i=0; i<11; i++)
			{
				a[i] = cpf.charAt(i);
				if (i < 9) b += (a[i] * --c);
			}
			
			if ((x = b % 11) < 2) { a[9] = 0; } else { a[9] = 11-x; }
			b = 0;
			c = 11;
			for (y=0; y<10; y++) b += (a[y] * c--);
			if ((x = b % 11) < 2) { a[10] = 0; } else { a[10] = 11-x; }

			if ((cpf.charAt(9) != a[9]) || (cpf.charAt(10) != a[10]) || cpf.match(expReg))
			{
				this.erro += "\n" + msg_erro_formato;
				tmpvalidou = false;
			}
		}
		
		if(tmpvalidou == false)
		{			
			this.validou = false;
		}		
		
		this.borda(string_nome, tmpvalidou);
	};

	
	/**
	 * Valida Arquivo
	 * @param string_nome string <p>
	 * Nome da string que será validada
	 * </p>
	 * @param extensoes string <p>
	 * Extensões permitidas
	 * </p>
	 * @param nullable string <p>
	 * Permite nulo (YES) ou não (NO)
	 * </p>
	 * @param msg_erro_vazio string <p>
	 * Mensagem de erro para string vazia
	 * </p>
	 * @param msg_erro_formato string <p>
	 * Mensagem de erro para e-mail com formato inválido
	 * </p> 
	 */		
	this.valida_arquivo = function(string_nome, nullable, extensoes, msg_erro_vazio, msg_erro_formato)
	{
		tmpvalidou = true;
		strlen = $("[name=" + string_nome + "]").val().length;
		pattern = new RegExp("\.(" + extensoes + ")$", "gi");
		
		if(strlen == 0)
		{
			if(nullable=='NO')
			{
				this.erro += "\n" + msg_erro_vazio;
				tmpvalidou = false;
			}
		}
		else if(pattern.test($("[name=" + string_nome + "]").val())==false)
		{
			this.erro += "\n" + msg_erro_formato;
			tmpvalidou = false;
		}
		
		if(tmpvalidou == false)
		{
			this.validou = false;
		}

		this.borda(string_nome, tmpvalidou);
	};	
	
	/**
	 * Valida URL
	 * @param string_tabela string <p>
	 * Nome da tabela que será validada
	 * </p>
	 * @param string_nome string <p>
	 * Nome da string que será validada
	 * </p>
	 * @param url_original string <p>
	 * URL original para comparação
	 * </p> 
	 * @param msg_erro_vazio string <p>
	 * Mensagem de erro para string vazia
	 * </p>
	 * @param msg_erro_UK string <p>
	 * Mensagem de erro para URL que já existe
	 * </p> 
	 */		
	this.valida_url = function(string_tabela, string_nome, url_original, msg_erro_vazio, msg_erro_UK)
	{
		tmpvalidou = true;
		strlen = $("[name=" + string_nome + "]").val().length;
		
		if(strlen == 0)
		{
			this.erro += "\n" + msg_erro_vazio;
			tmpvalidou = false;
		}
		else 
		{		
			if($("[name=" + string_nome + "]").val() != url_original)
			{
				var ajax_erro = '';
				
				$.ajax(
				{
					async: false,
					type: 'POST',
					url: "/admin/includes/valida.url.php", 
					data:
					{ 
						language_id: $("[name=language_id]").val(),
						table: string_tabela, 
						url: $("[name=" + string_nome + "]").val() 
					},
					success: function(data)
					{
				        if(data=='1')
				        {
				        	ajax_erro = "\n" + msg_erro_UK.replace('%url%', "'" + $("[name=" + string_nome + "]").val() + "'");
				        }
					}
				});
				
				if(ajax_erro!='')
				{
					this.erro += ajax_erro;
					tmpvalidou = false;
				}
			}
		}
		
		if(tmpvalidou == false)
		{
			this.validou = false;
		}
		
		this.borda(string_nome, tmpvalidou);	
	};
	
	this.borda = function(input, tmpvalidou)
	{
		if(typeof input == 'string')
		{
			input = $("[name=" + input + "]");
		}
		
		if(tmpvalidou == false)
		{
			input.css('border', 'solid 1px red');			
			this.validou = false;
		}
		else
		{
			input.css('border', 'solid 1px #d6d6d6');
		}
		
		input.bind('blur change', function()
		{
			if($(this).val()=='')
			{
				$(this).css('border', 'solid 1px red');
			}
			else
			{
				$(this).css('border', 'solid 1px #d6d6d6');
			}
		});
	};
};
