// constantes para máscara var msNenhuma = 0; var msCustom = 1; var msData = 2; var msHoraS = 3; var msHoraC = 4; var msDataHoraS = 5; var msDataHoraC = 6; var msCEP = 7; var msCPF = 8; var msCNPJ = 9; var msCPFCNPJ = 10; var msDDI = 11; var msISBN = 12; var msNumerico = 13; var msValor = 14; var msAlphaNum = 15; var msEmail = 16; // máscaras var mscData = '99/99/9999'; var mscHoraS = '99:99'; var mscHoraC = '99:99:99'; var mscDataHoraS = '99/99/9999 99:99'; var mscDataHoraC = '99/99/9999 99:99:99'; var mscCEP = '99999-999'; var mscCPF = '999.999.999-99'; var mscCNPJ = '99.999.999/9999-99'; var mscISBN = '999-99-999-9999-9'; var mscAlpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; var mscEmail = '-._'; // tipos de valor var tvNenhum = 0; var tvMoeda = 11; var tvPercentual = 12; // estado das teclas Shift/Ctrl/Alt var ShiftState = false; var CtrlState = false; var AltState = false; var Selecao = ''; var MascaraAtual = ''; var Mascara = msNenhuma; var TipoValor = tvNenhum; var CasasDecimais = 2; var Tamanho = 0; var TeclaAnterior = 0; var Apagou = false; var Seguido = false; var Colando = false; var UltimaTecla = false; var CampoAtual = null; var CampoFocar = null; var TratarNumero = true; var CaracteresExtras = ''; // Código das teclas var VK_BACKSPACE = 8; var VK_TAB = 9; var VK_ENTER = 13; var VK_SHIFT = 16; var VK_CTRL = 17; var VK_ALT = 18; var VK_ESC = 27; var VK_SPACE = 32; var VK_LEFT = 37; var VK_UP = 38; var VK_RIGHT = 39; var VK_DOWN = 40; var VK_DELETE = 46 function PreencheMascara(texto, mascara) { var temp = ''; var j = 0; texto = FiltraTexto(texto, '0123456789AX'); for (var i = 0; i < texto.length; i++) { while ((mascara.substr(j, 1) != '9') && (mascara.substr(j, 1) != 'A') && (mascara.substr(j, 1) != 'X') && (mascara.substr(j, 1) != '')) { temp = temp + mascara.substr(j, 1); j++; } temp = temp + texto.substr(i, 1); j++; } return temp.substr(0, mascara.length); } function RestauraMascara(mascara) { return str_replace('A', '_', str_replace('X', '_', str_replace('9', '_', mascara))); } function FocarCampo() { if (CampoFocar != null) { CampoFocar.focus(); if (CampoFocar.select) { CampoFocar.select(); } CampoFocar = null; } } function ValorInvalido(mensagem) { CampoFocar = CampoAtual; alert(mensagem); setTimeout('FocarCampo()', 100); return false; } function SetaMascara() { if (arguments[0] == null) { if (CampoAtual != null) { if (CampoAtual.readOnly) { CampoAtual = null; return false; } if ((Mascara == msValor) || ((Mascara == msNumerico) && TratarNumero)) { CampoAtual.style.textAlign = 'right'; } if (CampoAtual.value == '') { if (Mascara == msValor) { var valor = FloatToStr(0, CasasDecimais, false); if (TipoValor == tvMoeda) { CampoAtual.value = 'R$ '+valor; } else if (TipoValor == tvPercentual) { CampoAtual.value = valor+'%'; } else { CampoAtual.value = valor; } } else if (MascaraAtual != '$') { CampoAtual.value = RestauraMascara(MascaraAtual); } } else { switch (Mascara) { case msData: var data = SomenteNumeros(CampoAtual.value); var invalida = (data.length != 6) && (data.length != 8); if (!invalida) { var dia = data.substr(0, 2); var mes = data.substr(2, 2); var ano = data.substr(4, 4); if (ano.length <= 2) { ano = parseInt(ano, 10); if (ano > 40) { ano += 1900; } else { ano += 2000; } CampoAtual.value = dia+'/'+mes+'/'+ano; } invalida = !DataValida(CampoAtual.value); } if (invalida) { return ValorInvalido('Data inválida.'); } else if (arguments[2] != null) { var valor = arguments[2]; var data = CampoAtual.value; var hoje = new Date(); var dia = hoje.getDate(); var mes = (hoje.getMonth()+1); var ano = hoje.getYear(); if (dia < 10) { dia = '0'+dia; } if (mes < 10) { mes = '0'+mes; } hoje = dia+'/'+mes+'/'+ano; if ((valor == '>') || (valor == '>=')) { var menor = false; if (data == hoje) { if (valor == '>') { menor = true; } } else { menor = DataMaior(hoje, data); } if (menor) { if (valor == '>=') { return ValorInvalido('Data informada deve ser maior ou igual a data atual.'); } else { return ValorInvalido('Data informada deve ser maior que a data atual.'); } } } else if ((valor == '<') || (valor == '<=')) { var maior = false; if (data == hoje) { if (valor == '<') { maior = true; } } else { maior = DataMaior(data, hoje); } if (maior) { if (valor == '<=') { return ValorInvalido('Data informada deve ser menor ou igual a data atual.'); } else { return ValorInvalido('Data informada deve ser menor que a data atual.'); } } } } break; case msHoraS: case msHoraC: if ((arguments[2] == null) || (arguments[2] !== false)) { if (!HoraValida(CampoAtual.value, (Mascara == msHoraC))) { return ValorInvalido('Hora inválida.'); } } break; case msDataHoraS: case msDataHoraC: /* var data_hora = SomenteNumeros(CampoAtual.value); if (msDataHoraS) { ; } var invalida = (data.length != 6); if (!invalida) { var dia = data.substr(0, 2); var mes = data.substr(2, 2); var ano = data.substr(4, 4); if (ano.length <= 2) { ano = parseInt(ano, 10); if (ano > 40) { ano += 1900; } else { ano += 2000; } CampoAtual.value = dia+'/'+mes+'/'+ano; } invalida = !DataValida(CampoAtual.value); } if (invalida) { return ValorInvalido('Data inválida.'); } if (!HoraValida(CampoAtual.value, (Mascara == msDataHoraC))) { return ValorInvalido('Hora inválida.'); } */ break; case msCEP: var temp = SomenteNumeros(CampoAtual.value); if ((temp.length > 0) && (temp.length != 8)) { return ValorInvalido('CEP inválido.'); } break; case msCPF: if (!CPFValido(CampoAtual.value)) { return ValorInvalido('CPF inválido.'); } break; case msCNPJ: if (!CNPJValido(CampoAtual.value)) { return ValorInvalido('CNPJ inválido.'); } break; case msCPFCNPJ: if (CampoAtual.value != '') { var valido = (CampoAtual.value.length == 14) || (CampoAtual.value.length == 18); if (valido) { if (CampoAtual.value.length == 18) { valido = CNPJValido(CampoAtual.value); } else { valido = CPFValido(CampoAtual.value); } } if (!valido) { return ValorInvalido('CPF / CPNJ inválido.'); } } break; case msISBN: if (!ISBNValido(CampoAtual.value)) { return ValorInvalido('ISBN inválido.'); } break; case msNumerico: if (TratarNumero) { CampoAtual.value = parseInt(CampoAtual.value, 10); } break; case msValor: if (TipoValor != tvPercentual) { CampoAtual.value = FloatToStr(StrToFloat(CampoAtual.value), CasasDecimais, (TipoValor == tvMoeda)); } else { CampoAtual.value = FloatToStr(StrToFloat(CampoAtual.value), CasasDecimais, false)+'%'; } break; case msEmail: if (!EmailValido(CampoAtual.value)) { return ValorInvalido('E-mail inválido.'); } break; } switch (Mascara) { case msData: case msHoraS: case msHoraC: case msDataHoraS: case msDataHoraC: case msCEP: case msCPF: case msCNPJ: case msISBN: temp = PreencheMascara(CampoAtual.value, MascaraAtual); if (CampoAtual.value != temp) { CampoAtual.value = temp; } break; case msCPFCNPJ: if (CampoAtual.value != '') { var temp = SomenteNumeros(CampoAtual.value); if (temp.length > 11) { temp = PreencheMascara(temp, mscCNPJ); } else { temp = PreencheMascara(temp, mscCPF); } if (CampoAtual.value != temp) { CampoAtual.value = temp; } } break; } } } Apagou = false; Seguido = false; Tamanho = 0; Colando = false; UltimaTecla = false; TeclaAnterior = 0; Mascara = 0; } CampoAtual = arguments[0]; if ((CampoAtual != null) && CampoAtual.readOnly) { CampoAtual = null; return false; } Mascara = arguments[1]; switch (Mascara) { case msNenhuma: case msNumerico: case msEmail: MascaraAtual = ''; if (arguments[2] != null) { TratarNumero = arguments[2]; } else { TratarNumero = true; } if (arguments[3] != null) { CaracteresExtras = arguments[3]; } else { CaracteresExtras = ''; } break; case msAlphaNum: MascaraAtual = ''; Mascara = msNumerico; TratarNumero = false; CaracteresExtras = mscAlpha; break; case msCustom: MascaraAtual = arguments[2]; break; case msData: MascaraAtual = mscData; break; case msHoraS: MascaraAtual = mscHoraS; break; case msHoraC: MascaraAtual = mscHoraC; break; case msDataHoraS: MascaraAtual = mscDataHoraS; break; case msDataHoraC: MascaraAtual = mscDataHoraC; break; case msCEP: MascaraAtual = mscCEP; break; case msCPF: MascaraAtual = mscCPF; break; case msCNPJ: MascaraAtual = mscCNPJ; break; case msCPFCNPJ: MascaraAtual = ''; break; case msDDI: MascaraAtual = ''; break; case msISBN: MascaraAtual = mscISBN; break; case msValor: MascaraAtual = '$'; if ((arguments[2] != null) && !isNaN(arguments[2])) { CasasDecimais = parseInt(arguments[2], 10); } else { CasasDecimais = 2; } if ((Mascara == msValor) && (arguments[3] != null)) { TipoValor = arguments[3]; } else { TipoValor = tvNenhum; } CaracteresExtras = ''; break; } if (CampoAtual != null) { if ((Mascara != msNumerico) && (Mascara != msValor) && (Mascara != msEmail)) { if (Mascara == msCPFCNPJ) { CampoAtual.maxLength = 18; } else if (Mascara == msDDI) { CampoAtual.maxLength = 5; } else { CampoAtual.maxLength = MascaraAtual.length; if ((CampoAtual.value == '0,00') || (CampoAtual.value == '0,000') || (CampoAtual.value == RestauraMascara(MascaraAtual))) { CampoAtual.value = ''; } } } else { if (Mascara == msValor) { var zeros = ''; for (var i = 0; i < CasasDecimais; i++) { zeros += '0'; } CampoAtual.value = str_replace('.', '', str_replace('R$ ', '', str_replace('%', '', CampoAtual.value))); var i = CampoAtual.value.indexOf(','+zeros); if (i > -1) { CampoAtual.value = CampoAtual.value.substr(0, i); } CampoAtual.select(); } if (TratarNumero) { CampoAtual.style.textAlign = 'left'; } } } return true; } function DocumentKeyDown(e) { if (navigator.appName != 'Netscape') { var key = window.event.keyCode; } else { var key = e.which; } switch (key) { case VK_SHIFT: ShiftState = true; break; case VK_CTRL: CtrlState = true; break; case VK_ALT: AltState = true; break; } if (CampoAtual != null) { Colando = (CtrlState && (String.fromCharCode(key).toLowerCase() == 'v')) if ((Mascara != msNumerico) && (Mascara != msValor) && (Mascara != msEmail)) { if ((key == VK_BACKSPACE) || (key == VK_DELETE)) { Apagou = true; if (!Seguido) { Tamanho = SomenteNumeros(CampoAtual.value).length; } Seguido = true; } else if (key == VK_ESC) { Apagou = false; if (CampoAtual.defaultValue != MascaraAtual) { CampoAtual.value = CampoAtual.defaultValue; } else { CampoAtual.value = ''; } } else { Apagou = (SomenteNumeros(CampoAtual.value).length < (Tamanho - 1)) && (CampoAtual.value != ''); Seguido = false; } } } } function DocumentKeyUp(e) { if (navigator.appName != 'Netscape') { var key = window.event.keyCode; } else { var key = e.which; } switch (key) { case VK_SHIFT: ShiftState = false; break; case VK_CTRL: CtrlState = false; break; case VK_ALT: AltState = false; break; } if (CampoAtual != null) { if (Mascara == msCPFCNPJ) { var temp = SomenteNumeros(CampoAtual.value); if (temp.length > 11) { temp = PreencheMascara(temp, mscCNPJ); } else { temp = PreencheMascara(temp, mscCPF); } if (CampoAtual.value != temp) { CampoAtual.value = temp; } } else if (Mascara == msDDI) { if (CampoAtual.value.substr(0, 1) != '+') { var temp = SomenteNumeros(CampoAtual.value); if (temp != '') { CampoAtual.value = '+'+temp; } } } else if ((Mascara != msNumerico) && (Mascara != msValor)&& (Mascara != msEmail)) { if (CampoAtual.value == '') { Tamanho = 0; } if ((key == VK_BACKSPACE) || (key == VK_DELETE)) { var len = CampoAtual.value.length; var temp = CampoAtual.value.substr((len - 1), 1); if (SomenteNumeros(temp) == '') { CampoAtual.value = CampoAtual.value.substr(0, (len - 1)); } return; } var tecla_valida = (UltimaTecla && (((key >= 48) && (key <= 57)) || ((key >= 96) && (key <= 105)))) || Colando; if (!tecla_valida || Apagou) { return false; } temp = PreencheMascara(CampoAtual.value, MascaraAtual); if (CampoAtual.value != temp) { CampoAtual.value = temp; } } } } function DocumentKeyPress(e) { if (CampoAtual != null) { if (navigator.appName != 'Netscape') { var key = window.event.keyCode; } else { var key = e.which; } if (key != VK_ENTER) { var caracter = String.fromCharCode(key); var tecla_valida = !isNaN(caracter); if (window.getSelection) { Selecao = window.getSelection(); } else if (document.getSelection) { Selecao = document.getSelection(); } else if (document.selection) { Selecao = document.selection.createRange().text; } else { Selecao = ''; } if (CampoAtual.createTextRange) { var range = document.selection.createRange().duplicate(); range.moveEnd('character', CampoAtual.value.length); if (range.text != '') { var cursor_position = CampoAtual.value.lastIndexOf(range.text); } else { var cursor_position = CampoAtual.value.length; } } else { var cursor_position = CampoAtual.selectionStart; } if (MascaraAtual.length > 1) { if (Selecao.length == 0) { tecla_valida = tecla_valida && (CampoAtual.value.length < MascaraAtual.length); } else if (Selecao.length < MascaraAtual.length) { Tamanho = CampoAtual.value.length; } } else if (MascaraAtual == '$') { if (caracter == ',') { tecla_valida = (CampoAtual.value.indexOf(',') == -1); } } else if (Mascara == msEmail) { if (caracter == '@') { tecla_valida = (CampoAtual.value.indexOf('@') == -1); } else if (caracter == '_') { tecla_valida = (CampoAtual.value.indexOf('@') == -1) || (cursor_position <= CampoAtual.value.indexOf('@')); } else { tecla_valida = tecla_valida || (mscAlpha.indexOf(caracter) > -1) || (mscEmail.indexOf(caracter) > -1); } } if (Mascara == msNumerico) { if (CaracteresExtras) tecla_valida = tecla_valida || (CaracteresExtras.indexOf(caracter) > -1); } tecla_valida = tecla_valida && (key != VK_SPACE); if (navigator.appName == 'Netscape') { tecla_valida = tecla_valida || (key == 0) || (key == 8); tecla_valida = tecla_valida || Colando; tecla_valida = tecla_valida || (CtrlState && (key == 99)); tecla_valida = tecla_valida || (CtrlState && (key == 120)); tecla_valida = tecla_valida || (CtrlState && (key == 122)); } UltimaTecla = tecla_valida; if (!tecla_valida) { return false; } if (MascaraAtual.length > 1) { if (Selecao.length == 0) { if ((TeclaAnterior == key) && !Apagou) { DocumentKeyUp(e); } } TeclaAnterior = key; } } } } document.onkeydown = DocumentKeyDown; document.onkeyup = DocumentKeyUp; document.onkeypress = DocumentKeyPress;