﻿/*
Script desenvolvido por: Klonder
Postagem exclusiva em: http://www.forum.imasters.com.br
Versão 13.01.2010 - 20:05h;

Esse script poderá ser utilizado sem a necessidade de citação do autor.
Entretanto, não diga que o script é de sua autoria, pois o mesmo será postado nesse fórum, com a data precisa da publicação e com o nome do autor ao lado.
A capacidade em respeitar o trabalho do outro mostra o tipo de indivíduo que você realmente é.
*/

var trava = false;
var iCount1, iCount2, iCount, iTexto, nChar;
/*
iCount1 --> Comprimento da máscara no evento onkeydown (Referência para filtrar teclas de aderência!!!);
iCount2 --> Comprimento da máscara no evento onkeyup;
iTexto --> Texto atual na máscara, antes da função mascara() ser chamada com onkeyup;
nChar --> Variável controle;
*/

//Função chamada a partir do evento onkeydown;
function MaskDown(e) {
    if (trava == false) {
        //Armazenando a frase em uma variável, para ser utilizada durante o backspace;
        iTexto = e.value;

        //Comprimento da máscara no evento onkeydown;
        iCount1 = e.value.length;
        //alert(iCount1);
        //Adicionando trava para evitar possível tecla de aderência:
        trava = true;
    }
}

//Função chamada a partir do evento onkeyup;
function MaskUp(e, msc) {
    //Comprimento da máscara no evento onkeyup;
    iCount2 = e.value.length;

    //Verificando se o usuário inseriu novos caracteres, ou se apertou a tecla DELETE/BACKSPACE:

    // -------------------- Caso 1: Inserção de novos caracteres --------------------
    //Quantidade caracteres final (onkeydown) maior que a inicial (onkeyup) -> Houve inserção de caracteres;
    if (iCount2 > iCount1) {

        //Pequena correção para bug que estava ocorrendo com navegação com tecla TAB;
        //A tecla TAB não dispara keydown, fazendo com que iCount1 seja 0 e iCount2 o valor normal;
        //Por isso, vamos corrigir (Agradecimentos ao -rafael- pela observação do bug) :-)
        if (iCount2 - iCount1 > 1) {
            iCount1 = iCount2 - 1;
            e.select;
        } else {
            //Recortando a máscara para filtrar possível tecla de aderência:
            e.value = e.value.substr(0, iCount1 + 1);
            //Verificando se o comprimento da máscara não é excedido;
            if (e.value.length > msc.length) {
                e.value = e.value.substr(0, msc.length);
            }
            //Antes de mais nada, verificar se a máscara já inicia com caracteres especiais e já inserí-los;
            if (iCount1 == 0) {
                //Contando o número de caracteres especiais (se porventura existirem):
                if (msc.substring(iCount1, iCount1 + 1) != "#") {
                    nChar = 1;
                    //Contar as ocorrências de símbolos especiais, diferentes de: #, que iniciam a máscara:
                    while (msc.substring(iCount1 + nChar, iCount1 + nChar + 1) != "#" && nChar <= msc.length) {
                        nChar++;
                    }
                    e.value = msc.substring(0, iCount1 + nChar) + e.value.substr(0, iCount1 + 1);
                }
                //Se não iniciar com caracteres especiais:
            } else {
                //Verificando se existe caracteres especiais à frente do último caractere inserido:
                if (msc.substring(iCount1 + 1, iCount1 + 2) != "#") {
                    var nChar = 1;
                    //Contar as ocorrências de símbolos especiais que sucedem o último caractere inserido;
                    while (msc.substring(iCount1 + nChar, iCount1 + nChar + 1) != "#" && nChar <= msc.length) {
                        nChar++;
                    }
                    e.value = e.value.substr(0, iCount1 + 1) + msc.substring(iCount1 + 1, iCount1 + nChar);
                }
            }
        }
        // -------------------- Caso 2: Deleção de caracteres | Backspace --------------------
    } else {
        //Verificando se o caractere apagado é um símbolo especial ou não:
        if (msc.substr(iCount2, 1) != "#") {

            nChar = 1;
            //alert(msc.substr(iCount2,1));
            //Looping para percorrer os caracteres especiais retrocedentes:
            while (msc.substr(iCount1 - nChar, 1) != "#" && nChar <= iCount1) {
                //alert(msc.substr(iCount1-nChar,1)+" -- "+nChar);
                nChar++;
            }
            //Apagando os caracteres retrocedentes, conforme o valor atribuído a nChar:
            e.value = iTexto.substr(0, iCount2 - nChar + 1);
        } /*else {
        //Recortando a máscara para filtrar possível tecla de aderência: Default: desabilitado.
        objCampoMascara.value = iTexto.substr(0,iCount1-1);
        }*/
    }
    //Liberando a trava para possibilitar novo evento onkeydown:
    trava = false;
}
