// Limpa os <OPTION> do <SELECT> antes de inserir os novos <OPTION>
function validaNum(obj){
	if (obj.value!=""){
		if(unformatNumber(obj.value)==""){
			obj.value="";
			obj.focus();
			alert("Número tem que ser maior que zero.");
		}else{
			obj.value=unformatNumber(obj.value);
		}
	}
}
function limpaSelect(obj_select) {
  qtd = obj_select.length;
  for (j = qtd; j > 0 ; j--) {
    obj_select.remove(j);
  }
}

// Insere um novo <OPTION> no <SELECT>
function insereOption(obj_select, nome, valor) {
  oNewOption = new Option();
  oNewOption.value = valor;
  oNewOption.text = nome;
  obj_select.add(oNewOption, 1);
}


//Insere um novo <option> no <select> na ultima posicao do option
function insereOptionUltimaPosicao(obj_select, nome, valor){
	qtd = obj_select.length;
	qtd = qtd + 1;
  oNewOption = new Option();
  oNewOption.value = valor;
  oNewOption.text = nome;
  obj_select.add(oNewOption, qtd);
}

// Função que a partir do CEP carrega o UF, Cidade, Bairro e Logradouro
function consultaCEP(cep_entrada, obj_rua, obj_bairro, obj_cidade, obj_estado, completa_diretorio ,Mesmo_End, obj_cep_res, obj_rua_res, obj_bairro_res, obj_cidade_res, obj_estado_res) {
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      if (oXml.parseError.reason == "") {
	    i = 0;
	    limpaSelect(obj_cidade);
	    limpaSelect(obj_bairro);
	    
        while (i < oXml.documentElement.childNodes.length) {
          obj_rua.value = oXml.documentElement.childNodes.item(i).text;
          i++;
          insereOption(obj_bairro, oXml.documentElement.childNodes.item(i).text, oXml.documentElement.childNodes.item(i).text);
          obj_bairro.value = oXml.documentElement.childNodes.item(i).text;
          i++;
          obj_estado.value = oXml.documentElement.childNodes.item(i).text;
          i++;
          if (i < 4) {
            insereOption(obj_cidade, oXml.documentElement.childNodes.item(i).text, oXml.documentElement.childNodes.item(i).text);
            obj_cidade.value = oXml.documentElement.childNodes.item(i).text;
          }
          i++;
          flag = true;
        }
        
        if (Mesmo_End.value == "S") {

          i = 0;
	
          limpaSelect(obj_cidade_res);
	  limpaSelect(obj_bairro_res);

          while (i < oXml.documentElement.childNodes.length) {
            obj_rua_res.value = oXml.documentElement.childNodes.item(i).text;
            i++;
            insereOption(obj_bairro_res, oXml.documentElement.childNodes.item(i).text, oXml.documentElement.childNodes.item(i).text);
            obj_bairro_res.value = oXml.documentElement.childNodes.item(i).text;
            i++;
            obj_estado_res.value = oXml.documentElement.childNodes.item(i).text;
            i++;
            if (i < 4) {
              insereOption(obj_cidade_res, oXml.documentElement.childNodes.item(i).text, oXml.documentElement.childNodes.item(i).text);
              obj_cidade_res.value = oXml.documentElement.childNodes.item(i).text;
            }
            i++;
            flag = true;
          }

          obj_cep_res.value = cep_entrada;
          obj_rua_res.value = obj_rua.value;  

          obj_cidade_res.value = obj_cidade.value;  
          obj_bairro_res.value = obj_bairro.value;  
          obj_estado_res.value = obj_estado.value;  
        }
		
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }

  var cep = cep_entrada.toString()
  cep = cep.replace("-", "");
  cep = cep.replace(".", "");
  oSelNode = null;


  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  if (cep.substr(5,3) == '000') {
    oXml.load(completa_diretorio +"xml/default.asp?tipo=4&chave="+ cep);
    obj_bairro.value = '';

    if (Mesmo_End.value == "S") {
      obj_bairro_res.value = '';
    }
  }
  else {
    oXml.load(completa_diretorio +"xml/default.asp?tipo=1&chave="+ cep);
  }
  
  // Não foi encontrado nenhum registro para o CEP informado.
  if (!flag) {
    //obj_rua.value = '';
    obj_bairro.value = '';
    obj_cidade.value = '';
    obj_estado.value = '';
  }
}

// Função que a partir do UF preenche o <SELECT> de Cidades
function consultaUF(ds_uf_entrada, obj_rua, obj_bairro, obj_cidade, completa_diretorio) {
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      if (oXml.parseError.reason == "") {
	    i = 0;
	    limpaSelect(obj_cidade);
	    
        while (i < oXml.documentElement.childNodes.length) {
          insereOption(obj_cidade, oXml.documentElement.childNodes.item(i).text, oXml.documentElement.childNodes.item(i).text);
          i++;
          flag = true;
        }		
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }

  //obj_rua.value = '';
  limpaSelect(obj_bairro);
  obj_bairro.value = '';
  oSelNode = null;
  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  oXml.load(completa_diretorio +"xml/default.asp?tipo=2&chave="+ ds_uf_entrada);
  
  // Não foi encontrado nenhum registro para o UF informado.
  if (!flag) {
    obj_cidade.value = '';
  }
}

// Função que a partir da Cidade preenche o <SELECT> de Bairros
function consultaCidade(ds_cidade_entrada, obj_rua, obj_bairro, completa_diretorio) {
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      if (oXml.parseError.reason == "") {
	    i = 0;
	    limpaSelect(obj_bairro);
	    
        while (i < oXml.documentElement.childNodes.length) {
          insereOption(obj_bairro, oXml.documentElement.childNodes.item(i).text, oXml.documentElement.childNodes.item(i).text);
          i++;
          flag = true;
        }		
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }

  //obj_rua.value = '';
  oSelNode = null;
  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  //alert(ds_cidade_entrada +" "+obj_rua + " " + " " +obj_bairro+" " +completa_diretorio )
  oXml.load(completa_diretorio +"xml/default.asp?tipo=3&chave="+ ds_cidade_entrada);
  
  // Não foi encontrado nenhum registro para o UF informado.
  if (!flag) {
    obj_bairro.value = '';
  }
}

// Função que a partir da Cidade preenche o <SELECT> de Agencias dos Correios
// unica diferenca da funcao acima eh o valor do parametro passado para o .asp
function consultaCidadeAgCorreios(ds_cidade_entrada, fl_agencia, obj_bairro, completa_diretorio) {
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      if (oXml.parseError.reason == "") {
	    i = 0;
	    limpaSelect(obj_bairro);
	    
        while (i < oXml.documentElement.childNodes.length) {
          insereOption(obj_bairro, oXml.documentElement.childNodes.item(i).text, oXml.documentElement.childNodes.item(i).text);
          i++;
          flag = true;
        }		
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }

  oSelNode = null;
  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  oXml.load(completa_diretorio +"xml/default.asp?tipo=7&chave="+ ds_cidade_entrada);
  
  // Não foi encontrado nenhum registro para o UF informado.
  if (!flag) {
    obj_bairro.value = '';
  }
}


// Função que a partir de um logradouro descobre o numero do cep e preenche um edit
function consultaLogradouro(ds_uf, ds_cidade, ds_bairro, ds_logradouro, obj_cep, completa_diretorio) {
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      i = 0;
      if (oXml.parseError.reason == "") {
	    if (oXml.documentElement.childNodes.item(i).text != "") {
			obj_cep.value = oXml.documentElement.childNodes.item(i).text;
			flag = true;
		}
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }
  oSelNode = null;
  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  oXml.load(completa_diretorio +"cep/monta_xml_cep.asp?uf="+ds_uf+"&cidade="+ds_cidade+"&bairro="+ds_bairro+"&logradouro="+ds_logradouro);
  
  // Não foi encontrado nenhum registro para o UF informado.
  if (!flag) {
    obj_cep.value = '';
  }
  return true;
}

//Função para trazer os dados de endereço
function consultaEndereco(obj_cep,completa_diretorio) {
  var End = "";
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      i = 0;
	  if (oXml.parseError.reason == "") {
	    if (oXml.documentElement.childNodes.item(i).text != "") {
			End = "Logradouro: "+oXml.documentElement.childNodes.item(0).text;
			End += "\nBairro: "+oXml.documentElement.childNodes.item(1).text;
			End += "\nCidade: "+oXml.documentElement.childNodes.item(2).text;
			End += "\nEstado: "+oXml.documentElement.childNodes.item(3).text;
			flag = true;
		}
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }
  oSelNode = null;
  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  var queryString = obj_cep.value.replace("-","");
  queryString = queryString.replace(".","");
  oXml.load(completa_diretorio +"cep/monta_xml_cep.asp?cep="+queryString);

  return End;
}

//Consultar CEP e Endereco de uma Unidade Operacional dos Correios
function consultaEndUnidadeOperacional(obj_bairro, ds_uf, completa_diretorio) {

  var campos = new Array(); 
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      i = 0;
	  if (oXml.parseError.reason == "") {
	    if (oXml.documentElement.childNodes.item(i).text != "") {
			campos[0] = oXml.documentElement.childNodes.item(0).text;
			campos[1] = oXml.documentElement.childNodes.item(1).text;

			flag = true;
		}
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }
  oSelNode = null;
  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  var queryString = obj_bairro;
  //var queryStringResult = queryString.split(" ");
  queryString = queryString.replace(" ","_");
  oXml.load(completa_diretorio +"cep/monta_xml_end_uop.asp?bairro="+queryString+"&uf="+ds_uf);

  return campos;
	
}



// Função que a partir de um cep descobre os logradouros e preenche um box
function consultaCEPLogradouro(cep_entrada, obj_logradouro, completa_diretorio) {
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      if (oXml.parseError.reason == "") {
	    i = 0;
	    limpaSelect(obj_logradouro);
	    
        while (i < oXml.documentElement.childNodes.length) {
          insereOption(obj_logradouro, oXml.documentElement.childNodes.item(i).text, oXml.documentElement.childNodes.item(i).text);
          obj_logradouro.value = oXml.documentElement.childNodes.item(i).text;
          i++;
          flag = true;
        }
        
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }

  var cep = cep_entrada.toString()
  cep = cep.replace("-", "");
  cep = cep.replace(".", "");
  oSelNode = null;

  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  oXml.load(completa_diretorio +"xml/default.asp?tipo=5&chave="+ cep);
}



// Função que a partir de um tipo de cartao descobre as Unidades e preenche um box
function consultaUnidades(tipo_cartao, obj_unidade, completa_diretorio) {
  function onLoadXml() {
    if (oXml.readyState == 4) {
      flag = false;
      if (oXml.parseError.reason == "") {
	    i = 0;
	    limpaSelect(obj_unidade);
	    
        while (i < oXml.documentElement.childNodes.length) {
		  var itemNo = oXml.documentElement.childNodes.item(i).text;
		  var vetItem = itemNo.split(';');
		  var valor = vetItem[0];
		  var desc  = vetItem[1];
		  
		  insereOption(obj_unidade, desc, valor);
          obj_unidade.value = desc;//oXml.documentElement.childNodes.item(i).text;
          i++;
          flag = true;
        }
        
      }
      else {
        alert('ERRO - '+ oXml.parseError.reason);
      }
    }
  }

  var tipoCartao = tipo_cartao.toString()
  oSelNode = null;

  loadingNode = document.all("Tree");
  oXml = new ActiveXObject("Microsoft.XMLDOM");
  oXml.async = false;
  oXml.onreadystatechange = onLoadXml;
  oXml.load(completa_diretorio +"xml/default.asp?tipo=6&chave="+ tipoCartao);
}


/**
 * @author Márcio d'Ávila
 * @version 1.01, 2004
 *
 * PROTÓTIPOS:
 * método String.lpad(int pSize, char pCharPad)
 * método String.trim()
 *
 * String unformatNumber(String pNum)
 * String formatCpfCnpj(String pCpfCnpj, boolean pUseSepar, boolean pIsCnpj)
 * String dvCpfCnpj(String pEfetivo, boolean pIsCnpj)
 * boolean isCpf(String pCpf)
 * boolean isCnpj(String pCnpj)
 * boolean isCpfCnpj(String pCpfCnpj)
 */


var NUM_DIGITOS_CPF  = 11;
var NUM_DIGITOS_CNPJ = 14;
var NUM_DGT_CNPJ_BASE = 8;


/**
 * Adiciona método lpad() à classe String.
 * Preenche a String à esquerda com o caractere fornecido,
 * até que ela atinja o tamanho especificado.
 */
String.prototype.lpad = function(pSize, pCharPad)
{
	var str = this;
	var dif = pSize - str.length;
	var ch = String(pCharPad).charAt(0);
	for (; dif>0; dif--) str = ch + str;
	return (str);
} //String.lpad



/**
 * Adiciona método trim() à classe String.
 * Elimina brancos no início e fim da String.
 */
String.prototype.trim = function()
{
	return this.replace(/^\s*/, "").replace(/\s*$/, "");
} //String.trim


/**
 * Elimina caracteres de formatação e zeros à esquerda da string
 * de número fornecida.
 * @param String pNum
 *      String de número fornecida para ser desformatada.
 * @return String de número desformatada.
 */
function unformatNumber(pNum)
{
	return String(pNum).replace(/\D/g, "").replace(/^0+/, "");
} //unformatNumber


/**
 * Formata a string fornecida como CNPJ ou CPF, adicionando zeros
 * à esquerda se necessário e caracteres separadores, conforme solicitado.
 * @param String pCpfCnpj
 *      String fornecida para ser formatada.
 * @param boolean pUseSepar
 *      Indica se devem ser usados caracteres separadores (. - /).
 * @param boolean pIsCnpj
 *      Indica se a string fornecida é um CNPJ.
 *      Caso contrário, é CPF. Default = false (CPF).
 * @return String de CPF ou CNPJ devidamente formatada.
 */
function formatCpfCnpj(pCpfCnpj, pUseSepar, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	if (pUseSepar==null) pUseSepar = true;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var numero = unformatNumber(pCpfCnpj);

	numero = numero.lpad(maxDigitos, '0');
	if (!pUseSepar) return numero;

	if (pIsCnpj)
	{
		reCnpj = /(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})$/;
		numero = numero.replace(reCnpj, "$1.$2.$3/$4-$5");
	}
	else
	{
		reCpf  = /(\d{3})(\d{3})(\d{3})(\d{2})$/;
		numero = numero.replace(reCpf, "$1.$2.$3-$4");
	}
	return numero;
} //formatCpfCnpj




/**
 * Calcula os 2 dígitos verificadores para o número-efetivo pEfetivo de
 * CNPJ (12 dígitos) ou CPF (9 dígitos) fornecido. pIsCnpj é booleano e
 * informa se o número-efetivo fornecido é CNPJ (default = false).
 * @param String pEfetivo
 *      String do número-efetivo (SEM dígitos verificadores) de CNPJ ou CPF.
 * @param boolean pIsCnpj
 *      Indica se a string fornecida é de um CNPJ.
 *      Caso contrário, é CPF. Default = false (CPF).
 * @return String com os dois dígitos verificadores.
 */
function dvCpfCnpj(pEfetivo, pIsCnpj)
{
	if (pIsCnpj==null) pIsCnpj = false;
	var i, j, k, soma, dv;
	var cicloPeso = pIsCnpj? NUM_DGT_CNPJ_BASE: NUM_DIGITOS_CPF;
	var maxDigitos = pIsCnpj? NUM_DIGITOS_CNPJ: NUM_DIGITOS_CPF;
	var calculado = formatCpfCnpj(pEfetivo, false, pIsCnpj);
	calculado = calculado.substring(2, maxDigitos);
	var result = "";

	for (j = 1; j <= 2; j++)
	{
		k = 2;
		soma = 0;
		for (i = calculado.length-1; i >= 0; i--)
		{
			soma += (calculado.charAt(i) - '0') * k;
			k = (k-1) % cicloPeso + 2;
		}
		dv = 11 - soma % 11;
		if (dv > 9) dv = 0;
		calculado += dv;
		result += dv
	}

	return result;
} //dvCpfCnpj




/**
 * Testa se a String pCpf fornecida é um CPF válido.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCpf
 *      String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CPF válido.
 */
function isCpf(obj, pCpf)
{
	var numero = formatCpfCnpj(pCpf, false, false);
	var base = numero.substring(0, numero.length - 2);
	var digitos = dvCpfCnpj(base, false);
	var algUnico, i;
	var aux = pCpf;
	aux = aux.replace(".","");
	aux = aux.replace(".","");
	aux = aux.replace("-","");
	//alert(aux);
	
	if( aux.length!=11 && aux != "" ){
		alert('Cpf ' + pCpf + ' Invalido!');
	  	obj.value = '';
	  	obj.focus();
          return false;
     }
	// Valida dígitos verificadores
	if (numero != base + digitos) {
	  alert('Cpf ' + pCpf + ' Invalido!');
	  obj.value = '';
	  obj.focus();
          return false;
        } 


	/* Não serão considerados válidos os seguintes CPF:
	 * 000.000.000-00, 111.111.111-11, 222.222.222-22, 333.333.333-33, 444.444.444-44,
	 * 555.555.555-55, 666.666.666-66, 777.777.777-77, 888.888.888-88, 999.999.999-99.
	 */
	algUnico = true;
	for (i=1; i<NUM_DIGITOS_CPF; i++)
	{
		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
	}


	return (!algUnico);


} //isCpf


/**
 * Testa se a String pCnpj fornecida é um CNPJ válido.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCnpj
 *      String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CNPJ válido.
 */
function isCnpj(obj, pCnpj)
{
	var numero = formatCpfCnpj(pCnpj, false, true);
	var base = numero.substring(0, NUM_DGT_CNPJ_BASE);
	var ordem = numero.substring(NUM_DGT_CNPJ_BASE, 12);
	var digitos = dvCpfCnpj(base + ordem, true);
	var algUnico;

	// Valida dígitos verificadores
	if (numero != base + ordem + digitos) {
	  alert('CNPJ ' + pCnpj + ' Invalido!');
	  obj.value = '';
	  obj.focus();
          return false;
        } 

	/* Não serão considerados válidos os CNPJ com os seguintes números BÁSICOS:
	 * 11.111.111, 22.222.222, 33.333.333, 44.444.444, 55.555.555,
	 * 66.666.666, 77.777.777, 88.888.888, 99.999.999.
	 */
	algUnico = numero.charAt(0) != '0';
	for (i=1; i<NUM_DGT_CNPJ_BASE; i++)
	{
		algUnico = algUnico && (numero.charAt(i-1) == numero.charAt(i));
	}
	
	if (algUnico) {
	  alert('CNPJ ' + pCnpj + ' Invalido!');
	  obj.value = '';
	  obj.focus();
          return false;
        }

	/* Não será considerado válido CNPJ com número de ORDEM igual a 0000.
	 * Não será considerado válido CNPJ com número de ORDEM maior do que 0300
	 * e com as três primeiras posições do número BÁSICO com 000 (zeros).
	 * Esta crítica não será feita quando o no BÁSICO do CNPJ for igual a 00.000.000.
	 */
	if (ordem == "0000") {
	  alert('CNPJ ' + pCnpj + ' Invalido!');
	  obj.value = '';
	  obj.focus();
          return false;
        }


	if (base == "00000000" || parseInt(ordem, 10) <= 300 || base.substring(0, 3) != "000") {
          return true        
        } else {
	  alert('CNPJ ' + pCnpj + ' Invalido!');
	  obj.value = '';
	  obj.focus();
          return false;
        }

} //isCnpj


/**
 * Testa se a String pCpfCnpj fornecida é um CPF ou CNPJ válido.
 * Se a String tiver uma quantidade de dígitos igual ou inferior
 * a 11, valida como CPF. Se for maior que 11, valida como CNPJ.
 * Qualquer formatação que não seja algarismos é desconsiderada.
 * @param String pCpfCnpj
 *      String fornecida para ser testada.
 * @return <code>true</code> se a String fornecida for um CPF ou CNPJ válido.
 */
function isCpfCnpj(obj, pCpfCnpj)
{
	var numero = pCpfCnpj.replace(/\D/g, "");
	if (numero.length > NUM_DIGITOS_CPF)
		return isCnpj(obj, pCpfCnpj)
	else
		return isCpf(obj, pCpfCnpj);
} //isCpfCnpj
