/** * @author marcos.regis * Contém funções necessárias para tratamento de campos * de formulário */ /** * Permite apenas caracteres numéricos ou que estejam * na lista de permissões (quarto parâmetro) de acordo com o tipo * de mascara passado * @param {Event} e o evento (pressionamento de tecla) * @param {Object} obj (o campo a ser mascarado) * @param {String} tipo ( o tipo de máscara) * @param {String} chars ( lista de caracteres que serão permitidos ) * @return boolean */ function soNums(e,obj,tipo,chars){ var kc = document.all?null:e.keyCode; if (kc>0) return true; if (obj.getAttribute('maxlength')) { if (obj.value.length >= obj.getAttribute('maxlength')) return false; } var evt= (e.keyCode?e.keyCode:e.charCode); var tecla= String.fromCharCode(evt); // pegando a tecla digitada var pos = getPosCursor(obj); var nextStr=obj.value.substring(0,pos)+tecla+obj.value.substring(pos); var returnStr =obj.value; if(chars && chars.indexOf(tecla)>-1){ return true; } if(tipo){ switch(tipo){ case 'moeda': if(tecla==',' && returnStr.indexOf(',')>-1 ){ return false; } // campo vazio e digitado virgula ou ponto if(/^[\.,]$/.test(nextStr)){ obj.value ='0,00'; return false; } // campo vazio e digitado virgula ou ponto if(/^\d$/.test(nextStr)){ obj.value ='0,0'+nextStr; return false; } // mascaras validas if(/^(\d{1,3}|\d{1,3}.\d{3}|\d{1,3}.\d{3}.\d{3}),\d{2}$/.test(nextStr)){ return true; } // formatando var a =nextStr.replace(/\D/g,''); a = a.replace(/(\d)(\d{2})$/g,"$1,$2"); a = a.replace(/^0+(\d+)/g,"$1"); var b = Array(); while(a.length>0){ b.push(a.match(/\d{1,3}(?:,\d{0,2})?$/)); a = a.replace(/\d{1,3}(,\d{0,2})?$/,""); } b.reverse(); obj.value= b.join('.'); return false; break; case 'data': if(obj.value.length>=10) return false; if (/^(\d{1,2}\/?|\d{1,2}\/\d{1,2}\/?|\d{1,2}\/\d{1,2}\/\d{1,4})$/.test(nextStr)){ return true; }else if(/\d/.test(tecla) && /^(\d{2}|\d{1,2}\/\d{2})$/.test(obj.value)){ returnStr +='/'; } var validString = /^(\d{1,2}\/?|\d{1,2}\/\d{1,2}\/?|\d{1,2}\/\d{1,2}\/\d{1,4})$/.test(returnStr+tecla); break; case 'cnpj': // se já está no tamanho máximo de um cnpj, ignora pressionamento da tecla if(obj.value.length>=18) return false; // posições válidas if (/^(\d{1,2}|\d{2}\.\d{0,3}|\d{2}\.\d{3}\.\d{0,3}|\d{2}\.\d{3}\.\d{3}\/\d{0,4}|\d{2}\.\d{3}\.\d{3}\/\d{4}\-\d{0,2})$/.test(nextStr)) return true; // formatações if(/^(\d{3}|\d{2}\.\d{4})/.test(nextStr)){ returnStr +='.'; var validString=true; }else if(/^(\d{2}\.\d{3}\.\d{4}(\d{1,4}|\d{4}\-{0,2})?$)/.test(nextStr)){ returnStr +='/'; var validString=true; }else if(/^(\d{2}\.\d{3}\.\d{3}\/\d{5}(\d{1,2})?)$/.test(nextStr)){ returnStr +='-'; var validString=true; }else if(/\d/.test(tecla) && !/(\d{2}\.\d{4}|\/\d{5})/.test(nextStr)) return true; break; case 'cep': // se já está no tamanho máximo de um cep brasileiro, ignora pressionamento da tecla if(obj.value.length>=9) return false; // posições válidas if (/^(\d{1,5}|\d{5}\-\d{0,3})$/.test(nextStr)) return true; // formatações if(/^\d{6}$/.test(nextStr)){ returnStr +='-'; var validString=true; }else if(/\d/.test(tecla) && !/^\d{6}/.test(nextStr)) return true; break; case 'hms': if(obj.value.length>=8) return false; if (/^(\d{1,2}:?|\d{2}:\d{1,2}:?|\d{2}:\d{2}:\d{1,2})$/.test(nextStr)){ return true; }else if(/\d/.test(tecla) && /^(\d{2}|\d{2}:\d{2})$/.test(obj.value)){ returnStr +=':'; } var validString = /^(\d{1,2}:?|\d{2}:\d{1,2}:?|\d{2}:\d{2}:\d{1,2})$/.test(returnStr+tecla); break; case 'hm': if(obj.value.length>=5) return false; if (/^(\d{1,2}:?|\d{2}:\d{1,2})$/.test(nextStr)){ return true; }else if(/\d/.test(tecla) && /^\d{2}$/.test(obj.value)){ returnStr +=':'; } var validString = /^(\d{1,2}:?|\d{2}:\d{1,2})$/.test(returnStr+tecla); break; case 'tel': if(obj.value.length>=17) return false; // apenas digitos do número if(/^(\d{1,4}\-?|\d{4}\-\d{1,4})$/.test(nextStr)){ return true; } // código de área + número if(/^(\(\d{2}\)\s\d{1,4}|\(\d{2}\)\s\d{4}\-?|\(\d{2}\)\s\d{4}\-\d{1,4})$/.test(nextStr)){ return true; } // codigo de país + código de área + número if(/^(\d{2}\s\(|\d{2}\s\(\d{1,2}|\d{2}\s\(\d{2}\)\s\d{1,4}|\d{2}\s\(\d{2}\)\s\d{4}\-\d{0,4})$/.test(nextStr)){ return true; } // posições válidas if(/^(\(\d{2}\)\s?|\(\d{2}\)\s\d{4}\-|\d{2}\s\(|\d{2}\s\(\d{2}\)\s?)$/.test(nextStr)){ return true; } if(/^(\d{5}|(\d{2}\s)?\(\d{2}\)\s\d{5})$/.test(nextStr)){ returnStr +='-'; var validString=true; }else if(/^\d{2}\s$/.test(nextStr)){ returnStr ='('+returnStr+')'; var validString=true; }else if(/^\(\d{2}\)\s?\d{2}\s$/.test(nextStr)){ returnStr =returnStr.replace(/\((\d{2})\)\s(\d{2})/,'$1 ($2)'); var validString=true; }else if(/^(\d{2}\s)?\(\d{3}$/.test(nextStr)){ returnStr +=') '; var validString=true; }else if(/^\d{2}\(\d{2}\)\d$/.test(nextStr)){ returnStr +=' '; var validString=true; } break; case 'tel2': if(obj.value.length>=14) return false; // adicionando o parentese de inicio if(/^\d$/.test(nextStr)){ returnStr +='('; var validString=true; }else // fechando o parentese do codigo de area if(/^\(\d{3}$/.test(nextStr)){ returnStr +=') '; var validString=true; } else if(/^\(\d{2}\)\s?\d{5}$/.test(nextStr)){ returnStr +='-'; var validString=true; } // código de área + número if(/^(\(\d{1,2}|\(\d{2}\)\s?\d{1,4}|\(\d{2}\)\s?\d{4}\-?|\(\d{2}\)\s?\d{4}\-\d{1,4})$/.test(nextStr)){ return true; } // posições válidas if(/^(\(\d{2}\)\s?|\(\d{2}\)\s?\d{4}\-|\(|\(\d{2}\))$/.test(nextStr)){ return true; } break; case 'ag': if(obj.value.length>=6) return false; // código da agencia if(/^(\d{1,4}\-?|\d{4}\-\d)$/.test(nextStr)){ return true; } if(/^\d{5}$/.test(nextStr)){ returnStr +='-'; var validString=true; } break; case 'tx_aa': if(obj.value.length>=9) return false; if( (tecla=='.' || tecla==',') && obj.value.indexOf('.')>0){ return false; } if (/^(\d{1,3}\.?|\d{1,3}\.\d{1,5})$/.test(nextStr)){ return true; } if(/^\d{4}$/.test(nextStr)){ returnStr +='.'; var validString=true; } if(tecla==',' && obj.value.indexOf('.')<1){ obj.value+='.'; return false; } break; case 'cpf': // se já está no tamanho máximo de um cpf, ignora pressionamento da tecla if(obj.value.length>=14) return false; // posições válidas if (/^(\d{1,3}|\d{3}\.\d{0,3}|\d{3}\.\d{3}\.\d{0,3}|\d{3}\.\d{3}\.\d{3}\-\d{0,2}|\d{3}\.\d{3}\.\d{3}\-\d{2})$/.test(nextStr)) return true; // formatações if(/^(\d{4}|\d{3}\.\d{4})/.test(nextStr)){ returnStr +='.'; var validString=true; }else if(/^(\d{3}\.\d{3}\.\d{4}$)/.test(nextStr)){ returnStr +='-'; var validString=true; }else if(/\d/.test(tecla) && !/(\d{3}\.\d{4}|\-\d{2})/.test(nextStr)) return true; break; // usando o quarto argumento como uma lista de caracteres válidos case 'lista': if (chars.indexOf(tecla)>-1){ return true; } break; } }else{ return /\d/.test(tecla); } if (validString){ // se a tecla estiver na lista de permissão permite-a obj.value = returnStr; return true; } return false; } /** * Retorna a posição atual do cursor em um texto * @param {object} obj * @return {int} Ínidice da posição do cursor no texto */ function getPosCursor(obj){ var pos=-1 if(document.all){ var txt = obj.value; var len = txt.length; var erg = txt.split("\n"); range_sel = document.selection.createRange(); range_obj = obj.createTextRange(); range_obj.moveToBookmark(range_sel.getBookmark()); range_obj.moveEnd('character',obj.value.length); pos = len - range_obj.text.length; }else{ pos = obj.selectionStart; } return pos; }