 /**
 * Função Pai: controlaCampos('campo','tipo de campo','teclas permitidas');
 * Versão: 0.1
 */
 
	// Variáveis
	var teclas
	var tecPermitido = new Array();
	
	/* Teclas Permitidas por Padrão*/
	
	tecPermitido[0] 	= 8;  // backspace 
	tecPermitido[1] 	= 46; // delete
	tecPermitido[2] 	= 13; // enter
	tecPermitido[3] 	= 37; // seta esquerda
	tecPermitido[4] 	= 38; // seta direita
	tecPermitido[5] 	= 39; // seta baixo
	tecPermitido[6] 	= 40; // seta cima
	tecPermitido[7]  	= 9;  // tabulação
	tecPermitido[8]  	= 16; // shift
	tecPermitido[9]  	= 17; // ctrl
	tecPermitido[10] 	= 18; // alt
	tecPermitido[11] 	= 33; // page up
	tecPermitido[12] 	= 34; // page down
	tecPermitido[13] 	= 35; // end
	tecPermitido[14] 	= 36; // home

	/**
	* Function
	*  - Nome: controlaCampos(campo,campoTipo,novasTeclas);
	*  - Parâmetros: campo				= campo que será verificado com a função
	*				 tipo 				= tipo de verificação para o campo
	*				 //novasTeclas		= novas teclas permitadas (v 0.2)
	*
	*
	*  Exemplo: // informa que o campo deve conter um cpf válido
	*    onKeyDown="controlaCampo(this,'cpf');"
	*/

	function controlaCampo(campo,evento,tipo)
	{
		// window.alert(campo);
		// Recebe a Tecla Pessionada
		var ie = (typeof window.ActiveXObject != 'undefined');
		if (ie){
		   var tecla 	  = event.keyCode;
		   var teclaShift = evento.shiftKey;
		} else {
		   var tecla 	  = evento.which;
		   var teclaShift = evento.shiftKey;
		}
		
		// Nome do campo
		var nome = campo.name;
		// Valor do campo
		var valor = campo.value;

		// Verifica o tipo de campo para verificação
		switch (tipo)
		{
			////////////////
			case "numero" : // se o campo for número, ---> onKeyDown
				if ((tecla < 45 || tecla > 57) && (tecla < 96 || tecla > 105) && verificaTeclas(tecla) == false){
					if (ie){
					   event.returnValue = false;
					} else {
					   evento.preventDefault();
					}
				}
			break;
			////////////////
			case "texto" : // se o campo for texto, ---> onKeyDown
				if (((tecla > 44 && tecla < 58) || (tecla > 95 && tecla < 106)) && verificaTeclas(tecla) == false){
					if (ie){
					   event.returnValue = false;
					} else {
					   evento.preventDefault();
					}
				}
			break;
			////////////////
			case "email" : // verifica se existe o arroba '@' e um ponto '.', ---> onBlur
					var tamanho = campo.value.length;
					var val = '';
					var arroba = 0;
					var ponto = 0;
					for(i=0; i < tamanho; i++){
						val = campo.value.charAt(i);
						if(val == '@'){
							arroba = 1;
						}
						if(val == '.'){
							ponto = 1;
						}
					}
					if(((arroba == 0 || ponto == 0) && campo.value != "") || (campo.value.length < 7 && campo.value != "")){
						alert('O email deve ser válido!');
						campo.value = "";
						campo.focus();
					}
			break;
			////////////////
			case "semAspas" : // se o campo for texto, ---> onKeyDown
				if (tecla == 39 || tecla == 34){
					if (ie){
					   event.returnValue = false;
					} else {
					   evento.preventDefault();
					}
				}
			break;
			////////////////
			case "cep" : // coloca o traço no cep, ---> onKeyUp
				if((valor.length == 5) && verificaTeclas(tecla) == false){
					campo.value += "-";
				}
			break;
			////////////////
			case "hora" : // coloca os dois pontos na hora, ---> onKeyUp
				if((valor.length == 2) && verificaTeclas(tecla) == false){
					campo.value += ":";
				}
			break;
			////////////////
			case "fone" : // coloca os parenteses no ddd, ---> onKeyDown
				if((valor.length == 2) && verificaTeclas(tecla) == false){
					campo.value = "("+valor+") ";
				}
			break;
			////////////////
			case "data" : // Coloca as barras na data, ---> onKeyUp
				if(((valor.length == 2) || (valor.length == 5)) && verificaTeclas(tecla) == false){
					campo.value += "/";
				}
				if(valor.length == 10){
					var div    = valor.split("/");
					var mostra = '';
					if(div[0] < 1 || div[0] > 31){
						mostra += "\nDia inválido!";
					}
					if(div[1] < 1 || div[1] > 31){
						mostra += "\nMês inválido!";
					}
					if(div[2] < 1900){
						mostra += "\nAno inválido!";
					}
					if((div[0] < 1 || div[0] > 31) || (div[1] < 1 || div[1] > 12) || div[2] < 1900){
						alert('Data incorreta: '+campo.value+'\n'+mostra);
						campo.value = "";
					}
				}
			break;
			////////////////
			case "cnpj" : // Formata o campo cnpj, ---> onKeyUp
				if(((valor.length == 2) || (valor.length == 6)) && verificaTeclas(tecla) == false){
					campo.value += ".";
				}
				else if((valor.length == 10) && verificaTeclas(tecla) == false){
					campo.value += "/";
				}
				else if((valor.length == 15) && verificaTeclas(tecla) == false){
					campo.value += "-";
				}
				else if(valor.length > 17 && verificaTeclas(tecla) == false){
					var CNPJ = valor;
					var erro = 0;
					if (CNPJ.length < 18) erro = 1; 
					if ((CNPJ.charAt(2) != ".") || (CNPJ.charAt(6) != ".") || (CNPJ.charAt(10) != "/") || (CNPJ.charAt(15) != "-")){
						if (erro.length == 0) erro = 1;
						}
						//substituir os caracteres que não são números
						if(document.layers && parseInt(navigator.appVersion) == 4){
							x = CNPJ.substring(0,2);
							x += CNPJ. substring (3,6);
							x += CNPJ. substring (7,10);
							x += CNPJ. substring (11,15);
							x += CNPJ. substring (16,18);
							CNPJ = x; 
						} else {
							CNPJ = CNPJ. replace (".","");
							CNPJ = CNPJ. replace (".","");
							CNPJ = CNPJ. replace ("-","");
							CNPJ = CNPJ. replace ("/","");
						}
						var nonNumbers = /\D/;
						if (nonNumbers.test(CNPJ)) erro = 1; 
						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] = 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 ((CNPJ.charAt(12) != a[12]) || (CNPJ.charAt(13) != a[13])){
							erro = 1;
						}
						if (erro == 1){
							alert("CNPJ Inválido!");
							campo.value = '';
							campo.focus();
							return false;
					}
					if (ie){
					   event.returnValue = false;
					} else {
					   evento.preventDefault();
					}
				}
			break;
			////////////////
			case "cpf" : // verifica se o cpf é válido, ---> onKeyUp
				if(((valor.length == 3) || (valor.length==7)) && verificaTeclas(tecla) == false){
					campo.value += ".";
				}
				if((valor.length == 11) && verificaTeclas(tecla) == false){
					campo.value += "-";
				}
				if((valor.length == 14) && verificaTeclas(tecla) == false){
					// Recebe o valor digitado no campo
					var valor_cpf = campo.value; 
					var cpf = '';
					for(i=0; i < valor_cpf.length; i++){
						if(valor_cpf.charAt(i) != "-" && valor_cpf.charAt(i) != "."){
							cpf += valor_cpf.charAt(i);
						}
					}
					// aqui começa a checagem do cpf
					var posicao, i, soma, dv, dv_informado;
					var digito = new Array(10);
					// retira os dois últimos dígitos do número informado
					dv_informado = cpf.substr(9, 2); 
					// desemembra o número do cpf na array digito
					for (i=0; i<=8; i++) {
					  digito[i] = cpf.substr( i, 1);
					}
					// calcula o valor do 10º dígito da verificação
					posicao = 10;
					soma = 0;
				   for (i=0; i<=8; i++) {
					  soma = soma + digito[i] * posicao;
					  posicao = posicao - 1;
				   }
					digito[9] = soma % 11;
					if (digito[9] < 2) {
						digito[9] = 0;
					}
					else {
					   digito[9] = 11 - digito[9];
					}
					// calcula o valor do 11º dígito da verificação
					posicao = 11;
					soma = 0;
				   for (i=0; i<=9; i++) {
					  soma = soma + digito[i] * posicao;
					  posicao = posicao - 1;
				   }
				   digito[10] = soma % 11;
				   if (digito[10] < 2) {
						digito[10] = 0;
				   }
				   else {
						digito[10] = 11 - digito[10];
				   }
					// verifica se os valores dos dígitos verificadores conferem
				   dv = digito[9] * 10 + digito[10];
				   if (dv != dv_informado) {
					  alert('CPF inválido');
					  campo.value = '';
					  campo.focus();
					  return false;
				   } 
				}
			break;
		}
	}
	
	
	
	
	/**
	* Function
	*  - Nome: verificaTeclas
	*  - Função: -
	*  - Usado pela função: controlaCampos(...)
	*/	
	
	function verificaTeclas(tecla)
	{
		var cg,verifica;

		for (cg = 0; cg < tecPermitido.length; cg++)
		{
			if (tecla == tecPermitido[cg])
				verifica = true;
			else
				if (verifica != true)
					verifica = false;
		}
		
		return verifica;
	}
	
 /**
 * Fim Função Pai
 */
 
 
 //#################################################################################################
 
	/**
	 * Função para submeter formularios com type=button.
	 * Deve-se colocar o id de todos os inputs que se deseja controlar.
	 * Ex: onClick="submeter('this','cnpj=>CNPJ,cpf=>CPF,fone=>Telefone');"
	 * Neste exemplo no formulario chamado 'cadastro' foi 
	 * passado o id cnpj, cpf e o fone para utilizar-se como
	 * campos obrigatórios.
	*/

	function submeter(botao,valores){
		if(valores != ''){
			var vals 		= Array();
			var formulario  = botao.form;
			if(valores.search(',') > 0){
				vals	= valores.split(',');
			} else {
				vals[0]	= valores;
			}
		
			var junta	= 'Campo(s) obrigatório(s) não preenchido(s): ';
			var conta	= 0;
			for(i=0; i < vals.length; i++){
				var campo 		= vals[i];
				var div			= campo.split("=>");
				var nome		= div[0];
				var descricao	= div[1];
				var campoAtual	= document.getElementById(nome);
				if(campoAtual.value == ""){
					junta += '\n- '+descricao; //.toUpperCase();
					conta++;
				}
				
			}
	
			if(conta > 0){
				alert(junta);
			} else {
				document.getElementById(formulario.name).submit();
			}
		}
	}


	
	
 //#################################################################################################
 
	/**
	 * Função para selecionar varios options num select. (não multiply)
	 * Deve-se colocar o id do formulário.
	 * Ex: <select name='xxx' onClick='marcador(this,"cadastro","usuarios");'>
	 * Neste exemplo o formulario é chamado 'cadastro', também foi 
	 * passado o nome do input que é 'usuarios'.
	*/
	function marcador(objeto,nomeInput){
		var formulario	= objeto.form;
		// pega o indice do option selecionado
		var num	= objeto.selectedIndex;
		if(objeto.value != ""){
			if(objeto.options[num].style.background == "#ffffff" || objeto.options[num].style.background == "" 
				|| objeto.options[num].style.backgroundColor == "rgb(255, 255, 255)"){
				objeto.options[num].style.background = '#ffaaaa';
				// cria o elemento e seta seus atributos
				var elemento = document.createElement("input");
				elemento.setAttribute('type','hidden');
				elemento.setAttribute('name',nomeInput+'[]');
				elemento.setAttribute('value',objeto.value);
				elemento.setAttribute('id','marcador_'+num);
				// adiciona o input no formulario
				formulario.appendChild(elemento);
			} else {
				objeto.options[num].style.background = '#ffffff';
				// remove o input do formulario
				formulario.removeChild(document.getElementById('marcador_'+num));
			}
			var proximo = num+1;
			if(objeto.options[num]){
				objeto.options[num].selected = true;
			}
			// remove a seleção do input
			objeto.selectedIndex = -1;
		}
	}
	
	
	
 //#################################################################################################
 
 	/**
	 * Função para deixar amarelo os campos texto com foco
	 * Ex: <select name='xxx' type='text' onFocus='foco(this);' onBlur='foco(this);'>
	*/
	function foco(t) {
		var cor = t.style.backgroundColor;
		//alert(cor);
		if (cor == "") {
			t.style.backgroundColor="#ffffcc";
		}
		if (cor == "#ffffff" || cor == 'rgb(255, 255, 255)') {
			t.style.backgroundColor="#ffffcc";
		}
		if (cor == "#ffffcc" || cor == 'rgb(255, 255, 204)') {
			t.style.backgroundColor="#ffffff";
		}	
	}
