/**
 * 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
**/
function Mascara(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;
}


