/*
 * Arquivo java script que contém funcionalidades específicas de
 * mascaração de campos html.
 *
 *
 * Todas as funções de formatação de campo possui o prefixo mascarar.
 *
 * Caso exitir funções neste arquivo com outro prefixo, então são funções internas
 * que não devem ser chamadas externamente.
 *
 * @autor Rodrigo Lopes
 * @data 31/07/2009
 * @versão 1.0
 *
 */


/**
 * Função para formatar automáticamente um campo dado um tipo de mascara.
 * @param objeto Campo a ser formatado.
 * @param evt Evento que é gerado ao digitar ao campo.
 * @param mask Formatação da mascara do campo.
 *             As formatação deve ser da seguinte maneira:
 *             #  - Para números
 *             A  - Para letras maiusculas
 *             a  - Para letras minusculas
 *             Z  - Para qualquer tipo de letra
 *             *  - Para qualquer valor.
 *
 * Exemplo de utilização:
 * <input type="text" name="cpf" onkeypress="return Mascara(this, event, '###.###.###-##')">
 *
 * @author Emmanuel Silva
 * @version 1.0, 02/02/2007
 *
 * @version 1.1 31/07/2009
 * @author Rodrigo Lopes
 * Alterado o nome da função de "Mascara" para "mascarar" para ficar nos padrões
 * de nomes dos outros arquivo.
 **/
function mascarar(objeto, evt, mask) {
  var LetrasU = 'ABCDEFGHIJKLMNOPQRSTUVWiXYZ';
  var LetrasL = 'abcdefghijklmnopqrstuvwxyz';
  var Letras  = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
  var Numeros = '0123456789';
  var Fixos  = '().-:/ ';
  var Charset = " !\"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_/`abcdefghijklmnopqrstuvwxyz{|}~";
  var selecionado = false;
  //gecko
  var ini = objeto.selectionStart;
  var fim = objeto.selectionEnd;
  //trata o evento
  evt = (evt) ? evt : (window.event) ? window.event : "";
  //recupera o valor dentro do objeto
  var value = objeto.value;
  if (evt) {
    //código ascii da tecla digitada
    var ntecla = (evt.which) ? evt.which : evt.keyCode;
    //se for alguma das teclas: HOME, END, DELETE, -> e <- return true
    if(ntecla == 39 || ntecla == 37 || ntecla == 36 || ntecla == 35 || ntecla == 46) return true;
    //recupera a tecla que o usuário digitou
    tecla = Charset.substr(ntecla - 32, 1);
    if (ntecla < 32) return true;
    //se o texto foi selecionado, recebe um tratamento difirente
    if(ini != fim && fim > 0) {
      selecionado = true;
      var digitado = tecla;
      var maskField = mask.substr(ini, 1);
      switch (maskField) {
        case '#' : if (Numeros.indexOf(tecla) == -1) return false; break;
        case 'A' : if (LetrasU.indexOf(tecla) == -1) return false; break;
        case 'a' : if (LetrasL.indexOf(tecla) == -1) return false; break;
        case 'Z' : if (Letras.indexOf(tecla) == -1) return false; break;
        case '*' : objeto.value = value; return true; break;
        default : return false; break;
      }
      return true;
    }
    var tamanho = value.length;
    if (tamanho >= mask.length) return false;
    //percorre as mascaras para saber se o que o usuario digitou é valido
    var pos = mask.substr(tamanho,1);
    while (Fixos.indexOf(pos) != -1) {
      value += pos;
      tamanho = value.length;
      if (tamanho >= mask.length) return false;
      pos = mask.substr(tamanho,1);
    }
    //verifica se o que o usuario digitou é valido.
    switch (pos) {
      case '#' : if (Numeros.indexOf(tecla) == -1) return false; break;
      case 'A' : if (LetrasU.indexOf(tecla) == -1) return false; break;
      case 'a' : if (LetrasL.indexOf(tecla) == -1) return false; break;
      case 'Z' : if (Letras.indexOf(tecla) == -1) return false; break;
      case '*' : objeto.value = value; return true; break;
      default : return false; break;
    }
  }
  objeto.value = value;
  return true;
}