//******************************************************************************************
// Common_Functions.js
//
// Este arquivo armazena as funções e procedimentos em JavaScript utilizados em todo site
// 
// Copyright © 2004 - Direction Systems Ltda. - Todos os direitos reservados.
//******************************************************************************************



//********************************************************************
// Nome:               CriaRegistro
// Autor:              Éric Cordeiro
// Criação:            22/01/2004
// Última modificação: 22/01/2004 14:46
// 
// Esta função cria um registro com duas propriedades: ID e Descricao.
// 
// SINTAXE:
//   CriaRegistro (vntId: Variant, strDescricao: Variant)
// 
//   Onde,
//     vntId        -> Valor da propriedade ID;
//     strDescricao -> Valor da propriedade Descricao;
//
//
// EXEMPLO:
//   var aProduto = new Array(10);
//
//   aProduto[1]  = new CriaRegistro(3, "Produto01");
//   ...
//   aProduto[10] = new CriaRegistro(23, "Produto10");
// 
// 
//   frmProduto.txtId.value        = aProduto[7].ID;
//   frmProduto.txtDescricao.value = aProduto[7].Descricao;
//********************************************************************

function CriaRegistro(vntId, strDescricao){
	this.ID        = vntId;
	this.Descricao = strDescricao;
}



//********************************************************************
// Nome:               Expande
// Autor:              Éric Cordeiro
// Criação:            22/01/2004
// Última modificação: 22/01/2004 16:11
// 
// Função para expandir/recolher uma table ou span.
// 
// SINTAXE:
//   Expande (strIdObj: String[, strIdImg: String, strImgExp: String, strImgCol: String])
// 
//   Onde,
//     strIdObj  -> Id do objeto a ser modificado;
//     strIdImg  -> Opcional. Id da imagem a ser modificada;
//     strImgExp -> Opcional. Imagem exibida quando expandido;
//     strImgCol -> Opcional. Imagem exibida quando encolhido;
//
// EXEMPLO:
//   <table id="Table1" name="Table1">
//     <tr><td>
//         <a href="JavaScript:Expande('Table11','Image1','closed.gif','opened.gif');">
//           <img id="Image1" name="Image1" src="closed.gif" border=0>Opção 01
//         </a>
//         <table id="Table11" name="Table11" style="display:none;">
//           <tr><td>Opção 1.1</td></tr>
//           <tr><td>Opção 1.2</td></tr>
//           <tr><td>Opção 1.3</td></tr>
//         </table>
//     </td></tr>
//   </table>
//********************************************************************

function Expande(strIdObj, strIdImg, strImgExp, strImgCol) {
	if (document.getElementById(strIdObj).style.display == 'block'){
		document.getElementById(strIdObj).style.display = 'none'; 
		if(strIdImg != undefined) document.getElementById(strIdImg).src = strImgCol;
	}else{
		document.getElementById(strIdObj).style.display ='block';
		if(strIdImg != undefined) document.getElementById(strIdImg).src = strImgExp;
	}
}



//********************************************************************
// Nome:               NewOption
// Autor:              Éric Cordeiro
// Criação:            22/01/2004
// Última modificação: 22/01/2004 16:39
// 
// Procedimento de inserção de um valor (option) num combobox.
// 
// SINTAXE:
//   NewOption (objComboBox: Object, vntValor: Variant, strDescricao: String)
// 
//   Onde,
//     objComboBox  -> Objeto combo box;
//     vntValor     -> Valor da opção;
//     strDescricao -> Descrição da opção;
//
// EXEMPLO:
//   <form name="Form1">
//     Descrição: <input type="text" name="Text1"> Valor: <input type="text" name="Text2"><br>
//     <input type="button" value="Incluir"
//       onClick="NewOption(document.Form1.ComboBox1, document.Form1.Text2.value, document.Form1.Text1.value);">
//     <p align=center><select name="ComboBox1"></select></p>
//   </form>
//********************************************************************

function NewOption(objComboBox, vntValor, strDescricao){
	var objOption = new Option(strDescricao,vntValor);
	objComboBox.options[objComboBox.length] = objOption;
}



//********************************************************************
// Nome:               ClearOptions
// Autor:              Éric Cordeiro
// Criação:            22/01/2004
// Última modificação: 22/01/2004 17:09
// 
// Procedimento que limpa num combobox.
// 
// SINTAXE:
//   ClearOptions (objComboBox: Object)
// 
//   Onde,
//     objComboBox  -> Objeto combo box;
//
// EXEMPLO:
//   <form name="Form1">
//     <select name="ComboBox1">
//       <option>Valor 1</option>
//       <option>Valor 2</option>
//       <option>Valor 3</option>
//     </select>
//     <input type="button" value="Limpar" onClick="ClearOptions(document.Form1.ComboBox1);">
//   </form>
//********************************************************************

function ClearOptions(objComboBox){
	for(var item = objComboBox.length; item >= 0; item--){
		objComboBox.options[item] = null;
	}
}



//********************************************************************
// Nome:               ReplaceAll
// Autor:              Éric Cordeiro
// Criação:            26/01/2004
// Última modificação: 26/01/2004 11:53
// 
// Função que substitue todas as ocorrências de uma substring numa string.
// 
// SINTAXE:
//   ReplaceAll(strString: String, strFind: String, strReplace: String): String
// 
//   Onde,
//     strString  -> String que será pesquisada;
//     strFind    -> Substring a ser substituída;
//     strReplace -> Substring que será inserida no lugar de strFind.
//
// EXEMPLO:
//   var Texto1 = "Que mulher feia!";
//   Texto1 = ReplaceAll(Texto1, "feia", "linda"); 
//********************************************************************

function ReplaceAll(strString, strFind, strReplace){
		var blnChave = true;
		
		while(blnChave){
			if(strString.indexOf(strFind) == -1){
				blnChave = false;
			}else{
				strString = strString.replace(strFind, strReplace);
			}
		}
		return strString;
	}
	
	

//********************************************************************
// Nome:               CampoNumerico
// Autor:              Éric Cordeiro
// Criação:            22/01/2004
// Última modificação: 22/01/2004 17:19
// 
// Procedimento que obriga a entrada de somente valores numéricos num campo texto,
// com exceção do "." e do "-" para campos de CPF, CEP, CNPJ, etc.
// 
// SINTAXE:
//   CampoNumerico (evnEvento: Event, strEscecoes: String)
// 
//   Onde,
//     evnEvento   -> Evento da tecla pressionada;
//     strExcecoes -> String contendo os caracteres permitidos.
//
// EXEMPLO:
//   <input type="text" name="Text1" onKeyPress="return CampoNumerico(event,'.-');">
//********************************************************************

function CampoNumerico(evnEvento, strExcecoes){
	var blnRetorno = false;

	if(document.all){	//Internet Explorer
		var tecla = event.keyCode;
	}else{
		if(document.layers){ //Nestcape
			var tecla = evnEvento.which;
		}
	}
				
	if(tecla > 47 && tecla < 58){	//numeros de 0 a 9
		return true;
	}else{
		if(tecla == 8){ //backspace
			return true;
		}else{
			if(strExcecoes != undefined){
				for(i = 0; i < strExcecoes.length; i++){
					if(tecla == strExcecoes.charCodeAt(i)){
						blnRetorno = true;
					}
				}
				if(blnRetorno){
					return true;
				}else{
					event.keyCode = 0;
				}
			}else{
				event.keyCode = 0;
			}
		}
	}
}



//********************************************************************
// Nome:               ValidaMail
// Autor:              Éric Cordeiro
// Criação:            26/01/2004
// Última modificação: 26/01/2004 11:38
// 
// Função que valida o formato de um e-mail.
// 
// SINTAXE:
//   ValidaMail(strMail: String): Boolean
// 
//   Onde,
//     strMail  -> E-mail a ser verificado;
//
// EXEMPLO:
//   return ValidaMail("eric@direction.com.br");
//********************************************************************

function ValidaMail(strMail){
	if(strMail.search(/^\w+((-\w+)|(\.\w+))*\@\w+((\.|-)\w+)*\.\w+$/) == -1){
		return false;
	}else{
		return true;
	}
}



//********************************************************************
// Nome:               ValidaCPF
// Autor:              Éric Cordeiro
// Criação:            26/01/2004
// Última modificação: 26/01/2004 11:43
// 
// Função que valida um CPF.
// 
// SINTAXE:
//   ValidaCPF(strCPF: String): Boolean
// 
//   Onde,
//     strCPF  -> CPF a ser verificado;
//
// EXEMPLO:
//   return ValidaCPF("125.444.652-25");
//********************************************************************

function ValidaCPF(strCPF){
	var nSoma = 0;
	var nResto;
			
	strCPF = ReplaceAll(strCPF, ".", "");
	strCPF = ReplaceAll(strCPF, "-", "");
		
	if(strCPF.length != 11 || strCPF == "00000000000" || strCPF == "11111111111" || strCPF == "22222222222" || strCPF == "33333333333" || strCPF == "44444444444" || strCPF == "55555555555" || strCPF == "66666666666" || strCPF == "77777777777" || strCPF == "88888888888" || strCPF == "99999999999")	return false;
	for(i = 0; i < 9; i++) nSoma += parseInt(strCPF.charAt(i)) * (10 - i);
	nResto = 11 - (nSoma % 11);
	if(nResto == 10 || nResto == 11) nResto = 0;
	if(nResto != parseInt(strCPF.charAt(9))) return false;
	nSoma = 0;
	for(i = 0; i < 10; i ++) nSoma += parseInt(strCPF.charAt(i)) * (11 - i);
	nResto = 11 - (nSoma % 11);
	if(nResto == 10 || nResto == 11) nResto = 0;
	if(nResto != parseInt(strCPF.charAt(10)))	return false;
	return true;
}



//********************************************************************
// Nome:               ValidaCEP
// Autor:              Éric Cordeiro
// Criação:            26/01/2004
// Última modificação: 26/01/2004 12:04
// 
// Função que valida um CEP.
// 
// SINTAXE:
//   ValidaCEP(strCep: String, strEstado: String): Boolean
// 
//   Onde,
//     strCep    -> CEP a ser verificado;
//     strEstado -> Estado (Sigla) brasileiro. Informar "--", caso não seja um estado brasileiro.
//
// EXEMPLO:
//   return ValidaCEP("54440-050", "PE");
//********************************************************************

function ValidaCEP(strCep, strEstado){
	var strCep1
	var blnValido

	if((strCep.length < 8) || (strCep.length > 9)) blnValido = false;
	
	strCep  = ReplaceAll(strCep,"-","");
	strCep1 = strCep.substr(0,3);

	if(strCep.length > 0){
		if(strCep <= 1000000){
			blnValido = false;
		}else{
			if((strEstado == "SP") && (strCep1 >= 10) && (strCep1 <= 199))  blnValido = true; else
			if((strEstado == "RJ") && (strCep1 >= 200) && (strCep1 <= 289)) blnValido = true; else
			if((strEstado == "ES") && (strCep1 >= 290) && (strCep1 <= 299)) blnValido = true; else
			if((strEstado == "MG") && (strCep1 >= 300) && (strCep1 <= 399)) blnValido = true; else
			if((strEstado == "BA") && (strCep1 >= 400) && (strCep1 <= 489)) blnValido = true; else
			if((strEstado == "SE") && (strCep1 >= 490) && (strCep1 <= 499)) blnValido = true; else
			if((strEstado == "PE") && (strCep1 >= 500) && (strCep1 <= 569)) blnValido = true; else
			if((strEstado == "AL") && (strCep1 >= 570) && (strCep1 <= 579)) blnValido = true; else
			if((strEstado == "PB") && (strCep1 >= 580) && (strCep1 <= 589)) blnValido = true; else
			if((strEstado == "RN") && (strCep1 >= 590) && (strCep1 <= 599)) blnValido = true; else
			if((strEstado == "CE") && (strCep1 >= 600) && (strCep1 <= 639)) blnValido = true; else
			if((strEstado == "PI") && (strCep1 >= 640) && (strCep1 <= 649)) blnValido = true; else
			if((strEstado == "MA") && (strCep1 >= 650) && (strCep1 <= 659)) blnValido = true; else
			if((strEstado == "PA") && (strCep1 >= 660) && (strCep1 <= 688)) blnValido = true; else
			if((strEstado == "AM") && ((strCep1 >= 690) && (strCep1 <= 692) || (strCep1 >= 694) && (strCep1 <= 698))) blnValido = true; else
			if((strEstado == "AP") && (strCep1 == 689)) blnValido = true; else
			if((strEstado == "RR") && (strCep1 == 693)) blnValido = true; else
			if((strEstado == "AC") && (strCep1 == 699)) blnValido = true; else
			if(((strEstado == "DF") || (strEstado == "GO")) && (strCep1 >= 700) && (strCep1 <= 769)) blnValido = true; else
			if((strEstado == "TO") && (strCep1 >= 770) && (strCep1 <= 779)) blnValido = true; else
			if((strEstado == "MT") && (strCep1 >= 780) && (strCep1 <= 788)) blnValido = true; else
			if((strEstado == "MS") && (strCep1 >= 790) && (strCep1 <= 799)) blnValido = true; else
			if((strEstado == "RO") && (strCep1 == 789)) blnValido = true; else
			if((strEstado == "PR") && (strCep1 >= 800) && (strCep1 <= 879)) blnValido = true; else
			if((strEstado == "SC") && (strCep1 >= 880) && (strCep1 <= 899)) blnValido = true; else
			if((strEstado == "RS") && (strCep1 >= 900) && (strCep1 <= 999)) blnValido = true; else
			if((strEstado == "--")) blnValido = true; else blnValido = false;
		}
	}else{
		blnValido = true;
	}

	return blnValido;
}



//********************************************************************
// Nome:               ValidaCNPJ
// Autor:              Éric Cordeiro
// Criação:            26/01/2004
// Última modificação: 26/01/2004 14:31
// 
// Função que valida um CNPJ.
// 
// SINTAXE:
//   ValidaCNPJ(strCNPJ: String): Boolean
// 
//   Onde,
//     strCNPJ    -> CNPJ a ser verificado;
//
// EXEMPLO:
//   return ValidaCNPJ("04.031.921/0001-04");
//********************************************************************

function ValidaCNPJ(strCNPJ){
	var aNumero    = new Array(14);
	var nSoma      = 0;
	var blnValido  = true;
	var nNum       = 5;
	var nResultado = 0;
		
	strCNPJ = ReplaceAll(strCNPJ,".","");
	strCNPJ = ReplaceAll(strCNPJ,"-","");
	strCNPJ = ReplaceAll(strCNPJ,"/","");

	if(strCNPJ.length != 14){
		blnValido = false;
	}else{
		if(strCNPJ == "00000000000000"){
			blnValido = false;
		}else{
			for(i = 1; i <= 14; i++){
				aNumero[i]  = strCNPJ.charAt(i - 1);
			}
				
			for(i = 1; i <= 12; i++){
				nSoma += aNumero[i] * nNum;
				nNum -= 1;
				if(nNum == 1) nNum = 9;
			}
				
			nSoma -= 11 * (parseInt(nSoma / 11));

			if((nSoma != 0) && (nSoma != 1)) nResultado = 11 - nSoma;

			if(nResultado == aNumero[13]){
				nNum = 6;
				nSoma = 0;
				for(i = 1; i <= 13; i++){
					nSoma += aNumero[i] * nNum;
					nNum -= 1;
					if(nNum == 1) nNum = 9;
				}
					
				nSoma     -= 11 * (parseInt(nSoma / 11));
				nResultado = 0;
					
				if((nSoma != 0) && (nSoma != 1)) nResultado = 11 - nSoma;
					
				blnValido = (nResultado == aNumero[14]);
			}else{
				blnValido = false;
			}
		}
		return blnValido;
	}
}



//********************************************************************
// Nome:               ValidaForm
// Autor:              Éric Cordeiro
// Criação:            26/01/2004
// Última modificação: 26/01/2004 14:47
// 
// Função para validar dados de um form como campos obrigatórios, senhas, CPF, CNPJ, E-mail e CEP.
// 
// SINTAXE:
//   ValidaForm(theForm: Form[, strObrigatorio: String[, fldPasswd: Field, fldConfPasswd: Field[, nLenPass: Integer[, fldMail: Field[, fldCPF: Field[, fldCNPJ: Field[, fldCEP: Field, fldUF: Field]]]]]]]): Boolean
// 
//   Onde,
//     theForm        -> Formulário a ser verificado. O form deve conter uma tabela onde os labels dos campos são o nome o valor das células, como mostrado no exemplo.
//     strObrigatorio -> Opcional. String com os índices dos campos ou intervalo de índices que são obrigatórios. Os índices são Zero-based.
//                       quando omitidos, todos os campos passam a ser obrigatórios. Cada índice é separado por uma vírgula (,) e os intervalos, por um hífem (-).
//     fldPasswd      -> Opcional. Campo de senha a ser verificado. Requer o atributo fldConfPasswd.
//     fldConfPasswd  -> Opcional. Campo de confirmação de senha.
//     nLenPass       -> Opcional. Número mínimo de caracteres para a senha.
//     fldMail        -> Opcional. Campo de e-mail.
//     fldCPF         -> Opcional. Campo de CPF.
//     fldCNPJ        -> Opcional. Campo de CNPJ.
//     fldCEP         -> Opcional. Campo de CEP. Requer o atributo fldUF.
//     fldUF          -> Opcional. Campo do Estado para verificação do CEP.
//
// EXEMPLO:
//   <form name="Form1" onsubmit="return ValidaForm(this, '0,2-6', this.txtSenha, this.txtConfSenha, 6, this.txtEmail, this.txtCPF,'',this.txtCEP, this.cboEstado);">
//		<table>
//			<tr>
//				<td name="lblNome" id="lblNome" value="Nome">Nome:</td>
//				<td><input type="text" id=txtNome name=txtNome></td>
//			</tr>
//			<tr>
//				<td name="lblEmail" id="lblEmail" value="Email">Email:</td>
//				<td><input type="text" id=txtEmail name=txtEmail></td>
//			</tr>
//			<tr>
//				<td name="lblSenha" id="lblSenha" value="Senha">Senha:</td>
//				<td><input type="password" id=txtSenha name=txtSenha></td>
//			</tr>
//			<tr>
//				<td name="lblConfSenha" id="lblConfSenha" value="Confirmação da senha">Confirme sua senha:</td>
//				<td><input type="password" id=txtConfSenha name=txtConfSenha></td>
//      </tr>
//   ...
//    </table>
//  <form>
//********************************************************************

function ValidaForm(theForm, strObrigatorio, fldPasswd, fldConfPasswd, nLenPass, fldMail, fldCPF, fldCNPJ, fldCEP, fldUF){
	var aTemp               = new Array;
	var aCamposObrigatorios = new Array;
	var strMsgObrigatorio   = "";
	var strMsgPasswd        = "";
	var strMsgOther         = "";
	var strMsg              = "";
	var blnErro             = false;
	var nFirstNumber;
	var nLastNumber;

	if(strObrigatorio == undefined || strObrigatorio == "") strObrigatorio = "0-" + (theForm.length - 1);
	aTemp = strObrigatorio.split(",");
		
	for(i = 0; i < aTemp.length; i++){
		if(aTemp[i].indexOf("-") != -1){
			nFirstNumber = new Number(aTemp[i].substring(0, aTemp[i].indexOf("-")))
			nLastNumber  = new Number(aTemp[i].substring(aTemp[i].indexOf("-") + 1))
				
			for(n = nFirstNumber; n <= nLastNumber; n++) aCamposObrigatorios[aCamposObrigatorios.length] = n;
		}else aCamposObrigatorios[aCamposObrigatorios.length] = aTemp[i];
	}
		
	for(i = 0; i < aCamposObrigatorios.length; i++){
		if(theForm.elements[aCamposObrigatorios[i]].value == ""){
			strMsgObrigatorio += "\n\t" + (document.getElementById("lbl" + theForm.elements[aCamposObrigatorios[i]].name.substring(3)).value);
			blnErro            = true;
		}
	}
		
	if(strMsgObrigatorio != ""){
		strMsgObrigatorio = "\n Os campos abaixo são de preenchimento obrigatório: \n ================================" + strMsgObrigatorio + " \n\n";
	}
		
		
	if((fldPasswd != undefined) && (fldPasswd != "") && (fldConfPasswd.value != "") && (fldPasswd.value != "")){
		if((nLenPass != undefined) && (fldPasswd.value.length < nLenPass)){
			strMsgPasswd += "\n\t A senha deve ter no mínimo " + nLenPass + " dígitos.";
			blnErro       = true;
		}else{
			if((fldPasswd.value != fldConfPasswd.value)){
				strMsgPasswd += "\n\t Você digitou uma senha diferente na confirmação de senha.";
				blnErro       = true;
			}
		}
	}
		
	if(strMsgPasswd != ""){
		strMsgPasswd = "\n Problemas com a senha: \n ===============" + strMsgPasswd + " \n\t Por favor, redigite-a. \n\n";
	}
		
		
	if((fldMail != undefined) && (fldMail != "") && (fldMail.value != "")){
		if(! ValidaMail(fldMail.value))	strMsgOther += "\n\t E-mail inválido.";
	}
	if((fldCPF != undefined) && (fldCPF != "") && (fldCPF.value != "")){
		if(! ValidaCPF(fldCPF.value))	strMsgOther += "\n\t O CPF fornecido é inválido.";
	}
	if((fldCNPJ != undefined) && (fldCNPJ != "") && (fldCNPJ.value != "")){
		if(! ValidaCNPJ(fldCNPJ.value))	strMsgOther += "\n\t O CNPJ fornecido é inválido.";
	}
	if((fldCEP != undefined) && (fldCEP != "") && (fldCEP.value != "")){
		if(! ValidaCEP(fldCEP.value, fldUF.value))	strMsgOther += "\n\t O CEP é inválido para o estado informado.";
	}
		
	if(strMsgOther != ""){
		strMsgOther = "\n Demais problemas: \n =============" + strMsgOther + " \n\n";
		blnErro     = true;
	}
			
		
	if(blnErro){
		strMsg = "_________________________________________________________________\n\n";
		strMsg += "O formulário não pode ser submetido devido ao(s) problema(s) descrito(s) abaixo.\n";
		strMsg += "Por favor, corrija-o(s) e, em seguida, clique em Avançar.\n";
		strMsg += "_________________________________________________________________\n\n";
		strMsg += strMsgObrigatorio + strMsgPasswd + strMsgOther;
			
		alert(strMsg);
		return false;
	}else	return true;
}



//********************************************************************
// Nome:               SelectByValue
// Autor:              Éric Cordeiro
// Criação:            26/01/2004
// Última modificação: 26/01/2004 14:31
// 
// Procedimento para selecionar uma opção num ComboBox pelo seu valor.
// 
// SINTAXE:
//   SelectByValue(cboComboBox: ComboBox, strValue: String)
// 
//   Onde,
//     cboComboBox    -> ComboBox que irá sofre influência do procedimento;
//     strValue       -> Valor da opção que será selecionada
//
// EXEMPLO:
//   <script>SelectByValue(Form1.cboPais, 'Brazil');</script>
//********************************************************************

function SelectByValue(cboComboBox, strValue){
	for(i = 0; i < cboComboBox.length; i++){
		if(cboComboBox.options[i].value == strValue){
			cboComboBox.selectedIndex = i;
			break;
		}
	}
}
