mascaras = {
        IsIE: navigator.appName.toLowerCase().indexOf('microsoft')!=-1,
        AZ: /[A-Z]/i,
        Acentos: /[À-ÿ]/i,
        Num: /[0-9]/,
        carregar: function(parte){
                var Tags = ['input','textarea'];
                var i = 0;
                if (typeof parte == "undefined") parte = document;
                for(z=0;z<Tags.length;z++){
                        Inputs=parte.getElementsByTagName(Tags[z]);
                        for(i=0;i<Inputs.length;i++)
                                if(('button,image,hidden,submit,reset').indexOf(Inputs[i].type.toLowerCase())==-1)
                                        this.aplicar(Inputs[i]);
                }
        },
        aplicar: function(campo){
                tipo = campo.getAttribute('tipo');
                readonly = campo.getAttribute('readonly');
                if (!tipo) return;
                if (readonly) return;
                orientacao = campo.getAttribute('orientacao');
                mascara = campo.getAttribute('mascara');
                if (tipo.toLowerCase() == "decimal"){
                        orientacao = "esquerda";
                        casasdecimais = campo.getAttribute('casasdecimais');
                        tamanho = campo.getAttribute('maxLength');
                        if (!tamanho || tamanho > 50)
                                tamanho = 10;
                        if (!casasdecimais)
                                casasdecimais = 2;
                        campo.setAttribute("mascara", this.geraMascaraDecimal(tamanho, casasdecimais));
                        campo.setAttribute("tipo", "num");
                        campo.setAttribute("orientacao", orientacao);
                }
                if (orientacao && orientacao.toLowerCase() == "esquerda") campo.style.textAlign = "right";
                if (mascara) campo.setAttribute("maxLength", mascara.length);
                if (tipo){
                        campo.onkeypress = function(e){ return mascaras.onkeypress(e?e:event); };
                        campo.onkeyup = function(e){ mascaras.onkeyup(e?e:event, campo) };
                }
                campo.setAttribute("snegativo", ((campo.value).substr(0,1) == "-" ? "s" : "n"));
        },
        onkeypress: function(e){
                KeyCode = this.IsIE ? event.keyCode : e.which;
                campo =  this.IsIE ? event.srcElement : e.target;
                maxlength = campo.getAttribute('maxlength');
                selecao = this.selecao(campo);
                if (selecao.length > 0 && KeyCode != 0){
                        campo.value = ""; return true;
                }
                if (KeyCode == 0) return true;
                Char = String.fromCharCode(KeyCode);
                valor = campo.value;
                mascara = campo.getAttribute('mascara');
                if (KeyCode != 8){
                        tipo = campo.getAttribute('tipo').toLowerCase();
                        negativo = campo.getAttribute('negativo');
                        if(negativo && KeyCode == 45){
                                snegativo = campo.getAttribute('snegativo');
                                snegativo = (snegativo == "s" ? "n" : "s");
                                campo.setAttribute("snegativo", snegativo);
                        }else{
                                valor += Char
                                if (tipo == "num" && Char.search(this.Num) == -1) return false;
                                if (KeyCode != 32 && tipo == "caracter" && Char.search(this.AZ) == -1 && Char.search(this.Acentos) == -1) return false;
                        }
                }
                if (mascara){
                        this.aplicarMascara(campo, valor);
                        return false;
                }
                return true;
        },
        onkeyup: function(e, campo){
                KeyCode = this.IsIE ? event.keyCode : e.which;
                if (KeyCode != 9 && KeyCode != 16 && KeyCode != 109){
                        valor = campo.value;
                        if (KeyCode == 8 && !this.IsIE) valor = valor.substr(0,valor.length-1);
                        mascaras.aplicarMascara(campo, valor);
                }
        },
        aplicarMascara: function(campo, valor){
                mascara = campo.getAttribute('mascara');
                if (!mascara) return;
                negativo = campo.getAttribute('negativo');
                snegativo = campo.getAttribute('snegativo');
                if (negativo && valor.substr(0,1) == "-")
                        valor = valor.substr(1,valor.length-1);
                orientacao = campo.getAttribute('orientacao');
                var i = 0;
                for(i=0;i<mascara.length;i++){
                        caracter = mascara.substr(i,1);
                        if (caracter != "#") valor = valor.replace(caracter, "");
                }
                retorno = "";
                if (orientacao != "esquerda"){
                        contador = 0;
                        for(i=0;i<mascara.length;i++){
                                caracter = mascara.substr(i,1);
                                if (caracter == "#"){
                                        retorno += valor.substr(contador,1);
                                        contador++;
                                }else
                                        retorno += caracter;
                                if(contador >= valor.length) break;
                        }
                }else{
                        contador = valor.length-1;
                        for(i=mascara.length-1;i>=0;i--){
                                if(contador < 0) break;
                                caracter = mascara.substr(i,1);
                                if (caracter == "#"){
                                        retorno = valor.substr(contador,1) + retorno;
                                        contador--;
                                }else
                                        retorno = caracter + retorno;
                        }
                }
                if (negativo && snegativo == "s")
                        retorno = "-" + retorno;
                campo.value = retorno;
        },
        geraMascaraDecimal: function(tam, decimais){
                var retorno = ""; var contador = 0; var i = 0;
                decimais = parseInt(decimais);
                for (i=0;i<(tam-(decimais+1));i++){
                        retorno = "#" + retorno;
                        contador++;
                        if (contador == 3){
                                retorno = "." + retorno;
                                contador=0;
                        }
                }
                retorno = retorno + ",";
                for (i=0;i<decimais;i++) retorno += "#";
                return retorno;
        },
        selecao: function(campo){
                if (this.IsIE)
                        return document.selection.createRange().text;
                else
                        return (campo.value).substr(campo.selectionStart, (campo.selectionEnd - campo.selectionStart));
        }
}
carregar(['mascaras.carregar();']);

