/**
 * @author Agência Interagir - Departamento de Programação
 */

//Todas as funções de validação retornam boolean

/*
 * 
	--- Modo de uso ---
	
	CONSTANTES:
	
	cor_acerto e cor_erro:
	* Responsáveis pela cor de borda dos campos validados com erro/acerto
	
	bgAcerto e bgErro:
	*Responsáveis pela cor de borda dos campos validados com erro/acerto
	
	Maneira de utilizar:
	* validaForm(ID DO formulário)
	
	Estilos necessários:
	.campoForm{
		border-color:#999999;
		border-style:solid;
		border-width:2px;
	}
	.divSelect{
		border-color:#999999;
		border-style:solid;
		border-width:2px;
		float:left;
	}
	textarea{
		border-color:#999999;
		border-style:solid;
		border-width:2px;
	}
	
	
	REGRAS PARA USO CORRETO DA VALIDAÇÃO:
	
	Para ser corretamente validado, os campos devem possuir qualquer um dos ids abaixo:
	- txt
	- email
	- numero
	- data
	- cep
	- cpf
	- cnpj
	- txtarea
	- combo
	- radio
	- check
	
	É importante utilizar o atributo maxlength para assegurar o máximo de caracteres permitidos em um determinado campo
	
	Os campos <select> devem possuir uma div ao seu redor com as seguintes condições:
	* id = divSelect + NOME DO CAMPO (name)
	* class = divSelect
	
	Para validar como campo obrigatório utilize o seguinte atributo:
	* alt="Campo obrigatório", para campos input
	* title="Campo obrigatório", para campos textarea e select
	
	Checkboxes e RadioButtons que pertençam a um mesmo grupo devem possuir o mesmo atributo "name"
	
	Não se esqueça de, em campos de texto, usar OBRIGATORIAMENTE o atributo maxlength para determinar o máximo de caracteres que o campo aceita

 * 
 */

/*
 * 
 * IMPORTANTE:
 * Para utilizar o validaForm.js é obrigatório referenciar o validaJs.js antes do validaForm.js
 * 
 * Variáveis para cor da borda dos campos em caso de acerto ou erro
 * 
 */
var cor_acerto;
var cor_erro = "#FF0000";
var bgAcerto;
var bgErro = "#FFCCCC";

/*
 * 
 * Função que valida formulários
 * Forma de chamar:
 * return validaForm(document.id_do_form);
 * 
 */
function validaForm(objForm, cor, fn){
    var qtd = objForm.elements.length;
	var i, tipo;
	bgAcerto = cor;
	cor_acerto = "#AEAC93";
	/*
	 * 
	 * Para efetuar a validação do formulário é feita uma análise campo a campo (iteração/loop)
	 * Cada instrução case trata de um formato de campo, determinado pelo atributo id das tags input, textearea, select, etc...
	 * Caso o campo passe na validação (resposta true):
	 * - O contador permanece com o mesmo valor e o código continua a percorrer o formulário
	 * Caso o campo não passe na validação (resposta false):
	 * - O contador é jogado para um valor acima do limite da iteração e o código pára de percorrer o formulário
	 * 
	 */
	for(i = 0; i < qtd; i++){
		tipo = objForm.elements[i].id;

		switch(tipo){
			case "txt":
				i = (campoTxt(objForm.elements[i])?i:qtd+1);
				break;
			case "email":
				i = (campoEmail(objForm.elements[i])?i:qtd+1);
				break;
			case "numero":
				i = (campoNum(objForm.elements[i])?i:qtd+1);
				break;
			case "fone":
				i = (campoFone(objForm.elements[i])?i:qtd+1);
				break;
			case "data":
				i = (campoData(objForm.elements[i])?i:qtd+1);
				break;
			case "cep":
				i = (campoCEP(objForm.elements[i])?i:qtd+1);
				break;
			case "cpf":
				i = (campoCPF(objForm.elements[i])?i:qtd+1);
				break;
			case "cnpj":
				i = (campoCNPJ(objForm.elements[i])?i:qtd+1);
				break;
			case "txtarea":
				i = (campoTextArea(objForm.elements[i])?i:qtd+1);
				break;
			case "combo":
				i = (campoComboBox(objForm.elements[i])?i:qtd+1);
				break;
			case "radio":
				i = (campoRadio(objForm.elements[i])?i:qtd+1);
				break;
			case "check":
				i = (campoCheck(objForm.elements[i])?i:qtd+1);
				break;
			default:
				break;
		}
	}
	
	if(i == qtd){
		var ex = setTimeout(fn,1);
	}
	else
		return false;
}

/*
 * 
 * Função que valida o CNPJ
 * Forma de chamar:
 * validaCNPJ(string_cnpj)
 * 
 */
function validaCNPJ(emp_cnpj)
{
	var erro = new String;
	
	if(emp_cnpj.length < 14 || emp_cnpj == 00000000000000) erro += "CNPJ inválido!\nPor favor, informe o CNPJ novamente."; 
	
	var nonNumbers = /\D/;
	
	if(nonNumbers.test(emp_cnpj)) erro += "A verificação de CNPJ suporta apenas números! "; 
	
	var a = [];
	var b = new Number;
	var c = [6,5,4,3,2,9,8,7,6,5,4,3,2];
	
	for(i = 0; i < 12; i++){
		a[i] = emp_cnpj.charAt(i);
		b += a[i] * c[i+1];
	}
	
	if((x = b % 11) < 2)
		a[12] = 0;
	else
		a[12] = 11-x;

	b = 0;
	
	for(y = 0; y < 13; y++)
		b += (a[y] * c[y]); 
	
	if((x = b % 11) < 2)
		a[13] = 0;
	else
		a[13] = 11 - x;
	
	if((emp_cnpj.charAt(12) != a[12]) || (emp_cnpj.charAt(13) != a[13]))
		erro = "CNPJ Inválido!";
	
	if (erro.length > 0)
		return false;
	else
		return true;
}

/*
 * 
 * Função que valida o CPF
 * Forma de chamar:
 * validaCPF(string_cnpj)
 * 
 */
function validaCPF(cpf){
	erro = new String;
	
	if(cpf.length < 11)
		erro += "São necessários 11 dígitos para verificacao do CPF!";
	
	var nonNumbers = /\D/;
	
	if(nonNumbers.test(cpf))
		erro += "A verificacao de CPF suporta apenas numeros! \n\n";
	
	if(cpf == "00000000000" || cpf == "11111111111" || cpf == "22222222222" || cpf == "33333333333" || cpf == "44444444444" || cpf == "55555555555" || cpf == "66666666666" || cpf == "77777777777" || cpf == "88888888888" || cpf == "99999999999")
		erro += "Numero de CPF inválido!"
	
	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]))
		erro +="Digito verificador com problema!";
	
	if (erro.length > 0)
		return false;
	else
		return true;
}

/*
 * 
 * Função para validar um campo do tipo text do formulário
 * Usada na validaForm
 * Forma de chamar:
 * campoTxt(obj_campo_texto)
 * Obs.: O que define a obrigatoriedade do campo é o atributo alt da tag input
 * 
 */
function campoTxt(campo){
	var tam, obrigatorio, max;
	tam = campo.value.length;
	max = campo.maxLength;
	obrigatorio = (campo.alt.length>0);
	
	if((obrigatorio && tam==0) || tam > max){
		alert("Preencha o campo corretamente!");
		campo.style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;
	}
	else{
		campo.style.borderColor = cor_acerto;
		campo.style.backgroundColor = bgAcerto;
		return true;
	}
	
}

/*
 * 
 * Função para validar um campo do tipo text do formulário como email válido
 * Usada na validaForm
 * Forma de chamar:
 * campoEmail(obj_campo_texto)
 * Obs.: O que define a obrigatoriedade do campo é o atributo alt da tag input
 * 
 */
function campoEmail(campo){
	var tam, obrigatorio, max;
	max = campo.maxLength;
	var parte1, parte2, parte3;
	tam = campo.value.length;
	obrigatorio = (campo.alt.length>0);
	var arrobaNoComeco, pontoDepoisDoArroba;
	
	if(obrigatorio){
		parte1 = campo.value.indexOf("@");
		parte2 = campo.value.indexOf(".");
		parte3 = campo.value.length;
		arrobaNoComeco = (parte1 <= 0);
		if(!arrobaNoComeco){
			pontoDepoisDoArroba = campo.value.substr(parte1).indexOf(".");
		}
		else
			pontoDepoisDoArroba = -1;
			
		if((tam > max || tam == 0) || arrobaNoComeco || pontoDepoisDoArroba <= 1 || !(parte3 >= 8)){
			campo.style.borderColor = cor_erro;
			campo.style.backgroundColor = bgErro;
			campo.focus();
			alert("Preencha o campo corretamente!");
			return false;			
		}
		else{
			campo.style.borderColor = cor_acerto;
			campo.style.backgroundColor = bgAcerto;
			return true;
		}
		
	}
	
	else{
		if(tam > max || (tam > 0 && (arrobaNoComeco || pontoDepoisDoArroba <= 0 || !(parte3 >= 8)))){
			campo.style.borderColor = cor_erro;
			campo.style.backgroundColor = bgErro;
			campo.focus();
			alert("Preencha o campo corretamente!");
			return false;
		}
		else{
			campo.style.borderColor = cor_acerto;
			campo.style.backgroundColor = bgAcerto;
			return true;
		}
		
	}
}

/*
 * 
 * Função para validar um campo do tipo text do formulário como número
 * Usada na validaForm
 * Forma de chamar:
 * campoNum(obj_campo_texto)
 * Obs.: O que define a obrigatoriedade do campo é o atributo alt da tag input
 * 
 */
function campoNum(campo){
	var tam, obrigatorio, max;
	max = campo.maxLength;
	tam = campo.value.length;
	obrigatorio = (campo.alt.length>0);
	
	var num = !isNaN(campo.value);
	var vazio = eVazio(campo.value);
	
	if((obrigatorio && (vazio || !num)) || !num || tam > max){
		alert("Preencha o campo corretamente!");
		campo.style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;		
	}
	else{
		campo.style.borderColor = cor_acerto;
		campo.style.backgroundColor = bgAcerto;
		return true;
	}
}

/*
 * 
 * Função para validar um campo do tipo text do formulário como data
 * Usada na validaForm
 * Forma de chamar:
 * campoData(obj_campo_texto)
 * Obs.: O que define a obrigatoriedade do campo é o atributo alt da tag input
 * 
 */
function campoData(campo){
	var tam, obrigatorio, max;
	max = campo.maxLength;
	tam = campo.value.length;
	obrigatorio = (campo.alt.length>0);
	
	var dia, mes, ano;
	var dt = campo.value.split("/");

	if(tam > max){
		alert("Preencha o campo corretamente!");
		campo.style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;	
	}

	if(obrigatorio){
		if(dt.length == 3){
			dia = dt[0];
			mes = dt[1];
			ano = dt[2];
			
			if(eData(dia,mes,ano)){
				campo.style.borderColor = cor_acerto;
				campo.style.backgroundColor = bgAcerto;
				return true;
			}
			else{
				alert("Preencha o campo corretamente!");
				campo.style.borderColor = cor_erro;
				campo.style.backgroundColor = bgErro;
				campo.focus();
				return false;	
			}
		}
		else{
			alert("Preencha o campo corretamente!");
			campo.style.borderColor = cor_erro;
			campo.style.backgroundColor = bgErro;
			campo.focus();
			return false;
		}
	}
	else{
		if(eVazio(campo.value)){
			campo.style.borderColor = cor_acerto;
			campo.style.backgroundColor = bgAcerto;
			return true;
		}
		else{
			if(dt.length == 3){
				dia = dt[0];
				mes = dt[1];
				ano = dt[2];
				
				if(eData(dia,mes,ano)){
					campo.style.borderColor = cor_acerto;
					campo.style.backgroundColor = bgAcerto;
					return true;
				}
				else{
					alert("Preencha o campo corretamente!");
					campo.style.borderColor = cor_erro;
					campo.style.backgroundColor = bgErro;
					campo.focus();
					return false;	
				}
				
			}
			else{
				alert("Preencha o campo corretamente!");
				campo.style.borderColor = cor_erro;
				campo.style.backgroundColor = bgErro;
				campo.focus();
				return false;
			}
			
		}
		
	}
	
}

/*
 * 
 * Função que valida um campo do tipo text do formulário como CEP
 * Usada na validaForm
 * Forma de chamar:
 * campoCEP(obj_campo)
 * Obs.: O que define a obrigatoriedade do campo é o atributo alt da tag input
 * 
 */
function campoCEP(campo){
	var cep = campo.value.replace("-","");
	
	var tam, obrigatorio;
	tam = cep.length;
	obrigatorio = (campo.alt.length>0);
	
	if(obrigatorio){
		if(tam != 8){
			alert("Preencha o campo corretamente!");
			campo.style.borderColor = cor_erro;
			campo.style.backgroundColor = bgErro;
			campo.focus();
			return false;
		}
		
	}
	
	if(tam > 8 || isNaN(cep)){
		alert("Preencha o campo corretamente!");
		campo.style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;
	}
	else{
		campo.style.borderColor = cor_acerto;
		campo.style.backgroundColor = bgAcerto;
		return true;
	}
	
}

/*
 * 
 * Função que valida um campo do tipo text do formulário como CNPJ
 * Usada na validaForm
 * Forma de chamar:
 * campoCNPJ(obj_campo)
 * Obs.: O que define a obrigatoriedade do campo é o atributo alt da tag input
 * 
 */
function campoCNPJ(campo){
	var tam, obrigatorio;
	tam = campo.value.length;
	obrigatorio = (campo.alt.length>0);
	
	if((obrigatorio && eVazio(campo.value)) || (tam > 0 && !validaCNPJ(campo.value))){
		alert("Preencha o campo corretamente!");
		campo.style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;
	}
	else{
		campo.style.borderColor = cor_acerto;
		campo.style.backgroundColor = bgAcerto;
		return true;
	}
	
}

/*
 * 
 * Função que valida um campo do tipo text do formulário como CPF
 * Usada na validaForm
 * Forma de chamar:
 * campoCPF(obj_campo)
 * Obs.: O que define a obrigatoriedade do campo é o atributo alt da tag input
 * 
 */
function campoCPF(campo){
	var tam, obrigatorio;
	tam = campo.value.length;
	obrigatorio = (campo.alt.length>0);
	
	if((obrigatorio && eVazio(campo.value)) || (tam > 0 && !validaCPF(campo.value))){
		alert("Preencha o campo corretamente!");
		campo.style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;
	}
	else{
		campo.style.borderColor = cor_acerto;
		campo.style.backgroundColor = bgAcerto;
		return true;
	}
	
}

/*
 * 
 * Função que valida um campo do tipo textarea
 * Usada na validaForm
 * Forma de chamar:
 * campoTextArea(obj_campo)
 * Obs.: 
 * - O que define a obrigatoriedade do campo é o atributo title da tag textarea
 * - O que define o número máximo de caracteres é o atributo label da tag textarea
 * 
 */
function campoTextArea(campo){
	var tam, obrigatorio, limite;
	tam = campo.value.length;
	obrigatorio = (campo.title.length>0);
	limite = campo.label;
	
	if((obrigatorio && eVazio(campo.value)) || tam > limite){
		alert("Preencha o campo corretamente!");
		campo.style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;
	}
	else{
		campo.style.borderColor = cor_acerto;
		campo.style.backgroundColor = bgAcerto;
		return true;
	}
	
}

/*
 * 
 * Função que valida um campo do tipo select
 * Usada na validaForm
 * Forma de chamar:
 * campoComboBox(obj_campo)
 * Obs.: 
 * - O que define a obrigatoriedade do campo é o atributo title da tag select
 * - O que define a div que envolve a select é o atributo name da tag select
 * 
 */
function campoComboBox(campo){
	var obrigatorio, nome, div;
	obrigatorio = (campo.title.length>0);
	nome = campo.name;
	div = "divSelect"+nome;
	
	if(obrigatorio && campo.options[campo.selectedIndex].value == "#"){
		alert("Selecione uma opção válida!");
		document.getElementById(div).style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;
	}
	else{
		document.getElementById(div).style.borderColor = cor_acerto;
		campo.style.backgroundColor = bgAcerto;
		return true;
	}
	
}

/*
 * 
 * Função que valida um campo do tipo radio
 * Usada na validaForm
 * Forma de chamar:
 * campoRadio(obj_campo)
 * Obs.:
 * - O que define a obrigatoriedade do campo é o atributo alt da tag input do primeiro radiobutton do grupo
 * - Os radiobuttons são agrupados pelo atriubuito name
 * 
 */
function campoRadio(campo){
		var obrigatorio, nome, j, marcado;
		obrigatorio = false;
		marcado = false;
		nome = campo.name;
		
		for(j = 0;j < document.getElementsByName(nome).length;j++){
			marcado = marcado || (document.getElementsByName(nome)[j].checked)
			
			if(document.getElementsByName(nome)[j].alt.length > 0 && !obrigatorio)
				obrigatorio = true;
				
		}
		
		if(obrigatorio && !marcado){
			alert("Selecione uma das opções!");
			campo.focus();
			return false;
		}
		else
			return true;
}

/*
 * 
 * Função que valida um campo do tipo radio
 * Usada na validaForm
 * Forma de chamar:
 * campoCheck(obj_campo)
 * Obs.:
 * - O que define a obrigatoriedade do campo é o atributo alt da tag input do primeiro checkbox do grupo
 * - Os checkboxes são agrupados pelo atriubuito name
 * 
 */
function campoCheck(campo){
		var obrigatorio, nome, j, marcado;
		obrigatorio = false;
		marcado = false;
		nome = campo.name;
		
		for(j = 0;j < document.getElementsByName(nome).length;j++){
			marcado = marcado || (document.getElementsByName(nome)[j].checked)
			
			if(document.getElementsByName(nome)[j].alt.length > 0 && !obrigatorio)
				obrigatorio = true;
			

			j = (document.getElementsByName(nome)[j].checked)?document.getElementsByName(nome).length+1:j;
		}
		
		if(obrigatorio && !marcado){
			alert("Selecione uma ou mais opções!");
			campo.focus();
			return false;
		}
		else
			return true;
}

/*
 * 
 * Função para validar um campo do tipo text do formulário como telefone ou celular (somente números e com ou sem o código de área)
 * Usada na validaForm
 * Forma de chamar:
 * campoFone(obj_campo_texto)
 * Obs.: O que define a obrigatoriedade do campo é o atributo alt da tag input
 * 
 */
function campoFone(campo){
	var tam, obrigatorio, max;
	max = campo.maxLength;
	tam = campo.value.length;
	obrigatorio = (campo.alt.length>0);
	
	var num = !isNaN(campo.value);
	var vazio = eVazio(campo.value);
	
	if((obrigatorio && (vazio || !num)) || !num || tam > max || !(tam >= 8 && tam <= 10)){
		alert("Preencha o campo corretamente!");
		campo.style.borderColor = cor_erro;
		campo.style.backgroundColor = bgErro;
		campo.focus();
		return false;		
	}
	else{
		campo.style.borderColor = cor_acerto;
		campo.style.backgroundColor = bgAcerto;
		return true;
	}
}

