/**
    Validador de Formulários  v1.6 
	****************************************************************
	OUTDATED - As técnicas utilizadas nesse código são ultrapassadas
	Só use em último caso
	****************************************************************
	Copyright 2003 - Virtech Informática
	Autor: Vinicius de Freitas Reis
	Data: 03/11/2003
	Última modificação: 08/10/2004
*/
/**
	Versão 1.2 - 29/12/2003, modificações:
	-Criação da função lowlight.
	-Suporte a textareas.
	-Validação de horários.
*/
/**
	Versão 1.3 - 30/12/2003, modificações:
	-Validação falha de radios.
	-Validação de campos opcionais(se preenchidos).
*/
/**
	Versão 1.4 - 06/01/2003, modificações:
	-Validação de telefones.
*/
/**
	Versão 1.5 - 22/06/2004, modificações:
	-Criação do autoDetect
	-Correção das mensagens de telefone
*/
/**
	Versão 1.6 - 07/10/2004
	- Criação da validação de CPF
	- Criação da validação de CNPJ
	- Criação da validação de CPF/CNPJ
	- Criação da validação de confirmação de senha
	- Criação da validação de caracteres mínimos
	- Criação da validação de valores mínimos e máximos
*/
/**
	Exemplo de uso:
	var validador = new Validador(document.forms[0], null);
	validador.valida();
*/

/*Parametros: 1 - o formulário a ser validado.(Obrigatório) 2 - Opcões dos campos.(Opcional)*/
function Validador(formulario, opcoes, autoDetecta)
{
	this.formulario = formulario;
	/*Referência para a função que valida o formulário*/
	this.valida = validadorValida;
	/*Eventos de erro*/
	this.erro = validadorErro;
	/*Mensagens de erro*/
	this.msgErro = new Array();
	this.msgErro[0] = "Você deve preencher todos os campos!";
	this.msgErro[1] = "Você deve digitar uma data válida!";
	this.msgErro[2] = "Você deve digitar um e-mail válido!";
	this.msgErro[3] = "Você deve selecionar uma opção válida!";
	this.msgErro[4] = "Você deve digitar um número válido!";
	this.msgErro[5] = "Você deve digitar um número válido!";
	this.msgErro[6] = "Você deve digitar um horário válido!";
	this.msgErro[7] = "Você deve selecionar uma opção válida!";
	this.msgErro[8] = "Você deve digitar um telefone/celular válido!";
	this.msgErro[9] = "Você deve digitar um cep válido!";
	this.msgErro[10] = "Você deve digitar um CPF válido!";
	this.msgErro[11] = "Você deve digitar um CNPJ válido!";
	this.msgErro[12] = "Você deve digitar um CPF ou CPNJ válido!";
	this.msgErro[13] = "Você deve digitar pelo menos %d caracteres!";
	this.msgErro[14] = "O valor mínimo para este campo é %d!";
	this.msgErro[15] = "O valor máximo para este campo é %d!";
	this.msgErro[16] = "A senha%d e a confirmação não coincidem!";
	/*O formulário está inválido?*/
	this.invalido = true;
	/*Auto detecta configurações de campos de acordo com o nome*/
	if ( autoDetecta ) {
		for (var i = 0; i < this.formulario.elements.length; i++)
			eval("this.formulario.elements[i]."+ this.formulario.elements[i].name.toLowerCase() +" = true;");
	}
	/*Preenche as opcões de acordo com o array*/
	if ( opcoes )
		for (var cont = 0;cont < opcoes.length;cont++)
		{
		  if ( opcoes[cont] )
		  eval("this.formulario.elements[ cont ]." + opcoes[cont] + " = true;");
		}
}
/*
	Atributos do array:
	inteiro:  valida um número inteiro.
	decimal:  valida um número decimal.
	data:     valida uma data.
	opcional: não valida o campo.
	email:    valida um email.
	horario:  valida um horário.
	telefone: valida um telefone.
	cep:      valida um cep.
	cpf:      valida um cpf.
	cnpj:     valida um cnpj.
	cpfcnpj:  valida um cpf ou um cnpj.	
*/

function validadorHighlight( campo )
{
	if (campo.type != "radio")
		campo.style.border = "1px solid #CC0000";
}
function validadorLowlight( campo )
{
	//campo.style.border = "2px outset";//para forçar o redraw do campo.
	if (campo.type != "radio")
		campo.style.border = "1px solid #999999";
}

/*
	-----Tipos de erro-----
	0 - Campo nulo.
	1 - Data inválida
	2 - E-mail inválido
	3 - Opção do select inválida
	4 - Número inteiro inválido
	5 - Número decimal inválido
	6 - Horário inválido.
	7 - Radio box não selecionado.
	8 - Telefone inválido.
	9 - Cep inválido.
	10 - CPF inválido.
	11 - CNPJ inválido.
	12 - CPF/CNPJ inválido.
	13 - Texto menor que o tamanho mínimo.
	14 - Valor menor que o tamanho mínimo.
	15 - Valor maior que o tamanho máximo.
	16 - Senha e confirmação não coincidem.
*/

function validadorErro( campo, tipo, param )
{
	validadorHighlight( campo );
	if (!this.invalido)
	  alert( this.msgErro[tipo].replace("%d", param) );
	this.invalido = true;
}
/* Função interna para remover digitos de uma string */
function validadorLimpa( texto, digitos, validos ) {
	var result = "";
	for ( var cont = 0; cont < texto.length; cont++ )
		if (  validos ? (digitos.indexOf( texto.substring( cont, cont+1 ) ) != -1)
			 : (digitos.indexOf( texto.substring( cont, cont+1 ) ) == -1) )
			result += texto.substring( cont, cont+1 );
	return result;
}
function validadorValidaCPFCNPJ( valor ) {
	
	if ( (valor.length == 11) || (valor.length == 13) )
		return validadorValidaCPF( valor );
	else if ( (valor.length == 15) || (valor.length == 19) )
		return validadorValidaCNPJ( valor );
	else
		return false;
}

/* Função interna para validação de CPF */
function validadorValidaCPF( cpf )
{
	var numeros, digitos, soma, i, resultado, digitos_iguais;
	
	cpf = validadorLimpa( cpf, "0123456789", true );
	
	digitos_iguais = 1; 
	
	if (cpf.length < 11)
		return false; 
	for (i = 0; i < cpf.length - 1; i++) 
		if (cpf.charAt(i) != cpf.charAt(i + 1)) { 
			digitos_iguais = 0; 
			break; 
		} 
	
	if (!digitos_iguais) { 
		numeros = cpf.substring(0,9); 
		digitos = cpf.substring(9); 
		soma = 0; 
		for (i = 10; i > 1; i--) 
			soma += numeros.charAt(10 - i) * i; 
		resultado = soma % 11 < 2 ? 0 : 11 - soma % 11; 
		if (resultado != digitos.charAt(0)) 
			return false; 
		numeros = cpf.substring(0,10); 
		soma = 0;
		for (i = 11; i > 1; i--) 
			soma += numeros.charAt(11 - i) * i; 
		resultado = soma % 11 < 2 ? 0 : 11 - soma % 11; 
		if (resultado != digitos.charAt(1)) 
			return false; 
		return true; 
	} 
	else
		return false;
}
/* Função interna para validação de CNPJ */
function validadorValidaCNPJ( cnpj )
{
	var numeros, digitos, soma, i, resultado, pos, tamanho, digitos_iguais; 
	
	cnpj = validadorLimpa( cnpj, "0123456789", true );
	digitos_iguais = 1; 
	
	if (cnpj.length < 14 && cnpj.length < 15) 
		return false;
	for (i = 0; i < cnpj.length - 1; i++) 
		if (cnpj.charAt(i) != cnpj.charAt(i + 1)) { 
			digitos_iguais = 0; 
			break; 
		} 
	if (!digitos_iguais) { 
		tamanho = cnpj.length - 2;
		numeros = cnpj.substring(0,tamanho); 
		digitos = cnpj.substring(tamanho); 
		soma = 0;
		pos = tamanho - 7; 
		for (i = tamanho; i >= 1; i--) { 
			soma += numeros.charAt(tamanho - i) * pos--; 
			if (pos < 2) 
				pos = 9; 
		} 
		resultado = soma % 11 < 2 ? 0 : 11 - soma % 11; 
		if (resultado != digitos.charAt(0)) 
			return false; 
		tamanho = tamanho + 1; 
		numeros = cnpj.substring(0,tamanho); 
		soma = 0; 
		pos = tamanho - 7; 
		for (i = tamanho; i >= 1; i--) { 
			soma += numeros.charAt(tamanho - i) * pos--; 
			if (pos < 2) 
				pos = 9; 
		} 
		resultado = soma % 11 < 2 ? 0 : 11 - soma % 11; 
		if (resultado != digitos.charAt(1)) 
			return false; 
		return true; 
	}
	else 
		return false; 
}

/*Função interna para validação de cep.*/
function validadorValidaCep( cep )
{
	var validos = "0123456789- ";
	for (var cont = 0; cont < cep.length; cont++)
	  if ( !(validos.indexOf(cep.substring( cont, cont+1 )) > -1) )
	    return false;
	return true;
}
/*Função interna para validação de telefone/celular.*/
function validadorValidaTelefone( telefone )
{
	var validos = "0123456789-() ";
	for (var cont = 0; cont < telefone.length; cont++)
	  if ( !(validos.indexOf(telefone.substring( cont, cont+1 )) > -1) )
	    return false;
	return true;
}

/*Função interna para validação do e-mail*/
function validadorValidaEmail( email )
{
	var result = false;
	result = ( email != null );
	result = result && ( email.indexOf("@") != -1 );
	result = result && ( email.lastIndexOf(".") > email.indexOf( "@" ) );
	return result;
}
/*Função interna para validação da data*/
function validadorValidaData( data )
{
	/*var result = false;
	result = data != null;
	result = result && (data.substring(2,3) == "/");
	result = result && (data.substring(5,6) == "/");
	result = result && (parseInt(data.substring(0,3)) <= 31);
	result = result && (parseInt(data.substring(0,3)) != 0);
	result = result && (parseInt(data.substring(3,5)) <= 12);
	result = result && (parseInt(data.substring(3,5)) != 0);
	return result;*/
	var pos = 0, anterior = 0, variavel = "", result = true;
	var d = "", m = "", a = "";
	data = data+"/";
	for(var cont = 0; cont < data.length; cont++)
	  if (data.substring(cont, cont+1) == "/")
	  {
	    if (pos == 0)
			variavel = "d";
		if (pos == 1)
			variavel = "m";
		if (pos == 2)
	    	variavel = "a";
		eval(variavel+" = data.substring(anterior, cont)");
		anterior = cont+1;
		pos++;
	  }
	result = result && (d != "");
	result = result && (m != "");
	result = result && (a != "");
	result = result && (!isNaN(d));
	result = result && (!isNaN(m));
	result = result && (!isNaN(a));
	result = result && ((parseInt(d) <= 31) && (parseInt(d) >= 0));
	result = result && ((parseInt(m) <= 12) && (parseInt(m) >= 0));
	return result;
}
/*Função interna para validação de horário*/
function validadorValidaHora( hora )
{
	var pos = 0, anterior = 0, variavel = "", result = true;
	var h = "", m = "", s = "";
	hora = hora+":";
	for(var cont = 0; cont < hora.length; cont++)
	  if (hora.substring(cont, cont+1) == ":")
	  {
	    if (pos == 0)
			variavel = "h";
		if (pos == 1)
			variavel = "m";
		if (pos == 2)
	    	variavel = "s";
		eval(variavel+" = hora.substring(anterior, cont)");
		anterior = cont+1;
		pos++;
	  }
	result = result && (h != "");
	result = result && (m != "");
	result = result && (!isNaN(h));
	result = result && (!isNaN(m));
	result = result && ((parseInt(h) <= 23) && (parseInt(h) >= 0));
	result = result && ((parseInt(m) <= 59) && (parseInt(m) >= 0));
	if (s != "")
	{
		result = result && (!isNaN(s));
		result = result && ((parseInt(s) <= 59) && (parseInt(s) >= 0));
	}
	return result;
}

function validadorValidaRadio( campo )
{
	/*var cont = 0;
	alert("document."+this.formulario.name+"."+campo.name+".length");
	for (cont = 0; cont < eval("document."+this.formulario.name+"."+campo.name+".length"); cont++)
	{
		if ( eval("document."+this.formulario.name+"."+campo.name+"[cont].checked") )
		  break;
	}
	alert(campo.checked);
	if (cont == campo.length-1)
		return false;
	//return campo.checked;*/
	/*Código modificado em 21/01/2004 para compatibilidade com os radios dos forms da GSP*/
	if (campo.opcional) return true;
	var rd, rd2;
	if (!isNaN(campo.name.substring(campo.name.length-1, campo.name.length)))
	{
		var indiceCampo = parseInt(campo.name.substring(campo.name.length-1, campo.name.length));
		var nomeCampo   = campo.name.substring(0, campo.name.length-1);
		if (eval("document."+this.formulario.name+"."+nomeCampo+(indiceCampo+1)))
		  return true;
		//alert("Nome do campo: "+nomeCampo+"\nIndice do campo: "+indiceCampo);
		for (var cont = indiceCampo; cont > 0; cont--) {
		  //alert("Loop do "+nomeCampo+":\nContador: "+cont+"\nObjeto: "+eval("document."+this.formulario.name+"."+nomeCampo+cont));
		  if (cont == 1)
		    cont = "";
		  if (eval("document."+this.formulario.name+"."+nomeCampo+cont)) {
		  	if (eval("document."+this.formulario.name+"."+nomeCampo+cont).checked)
				return true;
		  }
		}
		return false;
	} else {
		return true;//campo.checked;
	}
		/*rd  = campo.name.substring(0, campo.name.length-1);
		rd2 = campo.name;
	} else {
		rd = campo.name;
		rd2 = campo.name+"2";
	}
	alert(campo.name);
	if (eval("document."+this.formulario.name+"."+rd) != null)
	{
	  if (!eval("document."+this.formulario.name+"."+rd).checked)
	  {
		if (eval("document."+this.formulario.name+"."+rd2))
		{
			if (!eval("document."+this.formulario.name+"."+rd2).checked)
			  return false;
			else
			  return true;
		}
		return false;
	  } else {
		return true;
	  }
	}*/
	/*if (eval("document."+this.formulario.name+"."+rd2) != null)
	  if (!eval("document."+this.formulario.name+"."+rd2).checked)
		return false;		  
	*//*if ((!eval("document."+this.formulario.name+"."+rd).checked) && (!eval("document."+this.formulario.name+"."+rd2).checked))
	  return false;
	else
	  return true;*/
}
function validadorValida()
{
	//var jaRadio = false;
	formulario = this.formulario;
	this.invalido = false;
	for (var cont = 0; cont < formulario.elements.length;cont++)
	{
		campo = formulario.elements[cont];
		if ((campo.opcional) && (campo.value == "")){validadorLowlight(campo); continue;}
		/*Se for um campo texto...*/
		if ((campo.type == "text") || (campo.type == "textarea"))
		{
			validadorLowlight(campo);
			/*Se o campo conter uma string...*/
			if ((campo.value == ""))
			{
               this.erro(campo,0);
			   continue;
			}
			/*Se o campo conter um número...*/
			if (campo.inteiro)
			  if ((parseInt(campo.value) == 0) || (isNaN(campo.value)))
			  {
			     this.erro(campo,4);
				 continue;
			  }
			if (campo.decimal) {
			  if ((parseFloat(campo.value) == 0) || (isNaN(campo.value)))
			  {
			  	this.erro(campo,5);
				continue;
			  }
			}
			/*Se o campo conter uma data...*/
			if (campo.data)
			  if (!validadorValidaData(campo.value))
			  {
			    this.erro(campo,1);
				continue;
			  }//fim do if(campo.data)
			/*Se o campo for um e-mail*/
			if (campo.email)
			  if (!validadorValidaEmail(campo.value))
			  {
			    this.erro(campo,2);
				continue;
			  }
			/*Se o campo for um horário*/
			if (campo.horario)
			  if (!validadorValidaHora(campo.value))
			  {
			  	this.erro(campo, 6);
				continue;
			  }
			/*Se o campo for um telefone*/
			if (campo.telefone)
			  if (!validadorValidaTelefone(campo.value))
			  {
			  	this.erro(campo, 8);
				continue;
			  }
			/*Se o campo for um cep*/
			if (campo.cep)
			  if (!validadorValidaCep(campo.value))
			  {
			  	this.erro(campo, 9);
				continue;
			  }
			/*Se o campo for um CPF*/
			if (campo.cpf) {
			  campo.value = validadorLimpa(campo.value, "0123456789", true);
			  if (!validadorValidaCPF(campo.value))
			  {
			  	this.erro(campo, 10);
				continue;
			  }
			}
			/*Se o campo for um cep*/
			if (campo.cnpj) {
			  campo.value = validadorLimpa(campo.value, "0123456789", true);
			  if (!validadorValidaCNPJ(campo.value))
			  {
			  	this.erro(campo, 11);
				continue;
			  }
			}
			/*Se o campo for um cep*/
			if (campo.cpfcnpj) {
			  campo.value = validadorLimpa(campo.value, "0123456789", true);
			  if (!validadorValidaCPFCNPJ(campo.value))
			  {
			  	this.erro(campo, 12);
				continue;
			  }
			}
			if (campo.tamMinimo)
				if ( campo.tamMinimo > campo.value.length )
				{
					this.erro(campo,  13, campo.tamMinimo);
					continue;
				}			
		}//fim do if campo.type == "text"
		/*Se o campo for um select...*/
		if ((campo.type == "select-one") && (!campo.opcional))
		{
			if (campo.options[campo.selectedIndex].defaultSelected)
			{
			  this.erro(campo,3);
			  continue;
			} //fim do if 
		}//fim do if
		/*Se o campo for um radio*/
		if (campo.type == "radio")
		{
			validadorLowlight(campo);
			if (!validadorValidaRadio(campo))
			{
				this.erro(campo, 7);
				continue;
			}
			//jaRadio = true;
		}
		if (campo.valorMinimo || campo.valorMaximo) {
			if ((parseInt(campo.value) == 0) || (isNaN(campo.value))) {
				this.erro(campo,4);
				continue;
			}
			if ( parseInt(campo.value) < campo.valorMinimo ) {
				this.erro( campo, 14, campo.valorMinimo );
				continue;
			}
			if ( parseInt(campo.value) > campo.valorMaximo ) {
				this.erro( campo, 15, campo.valorMaximo );
				continue;
			}
		}
		if (campo.confirma){
				if (campo.value != campo.confirma.value) {
					(campo.tipoSenha) ? this.erro(campo, 16, campo.tipoSenha) : this.erro(campo, 16, "");
					continue;
				}
		}
		if (campo.tamMinimo) {
				if ( campo.tamMinimo > campo.value.length )
				{
					this.erro(campo,  13, campo.tamMinimo);
					continue;
				}
		}
		
	}//fim do for
	return !this.invalido;
}//fim da function

