Потесть в разных браузерах, о багах пиши сюда...
function setMask(I,M){
M = M.split('').join('|');
if (/z/.test(M)) M = M.replace(/z/g,'[a-z]');
else if (/я/.test(M)) M = M.replace(/я/g,'[а-яё]');
else if (/a/.test(M)) M = M.replace(/a/g,'[a-zа-яё]');
else if (/\*/.test(M)) M = M.replace(/\*/g,'[a-zа-яё0-9]');
M = M.replace(/\(/g,'\\(').replace(/\)/g,'\\)').replace(/\//g,'\\/').replace(/9/g,'\\d').replace(/\./g,'\\.');
var r = new RegExp(M,'i');
function P(c,n){
if(c<38||c==39||(c==45&&n)||(c==46&&!n)||r.test(String.fromCharCode(c)))return true;
return false
}
function V(){
setTimeout(function(k){
var a=I.value.split(''),x=[];
for(var i=0;i<a.length;i++)if(r.test(a[i]))x.push(a[i]);
I.value=x.join('')
},0)
}
I = typeof I=='string' ? document.getElementById(I) : I;
I.onkeypress = function(e){
e=e||event;
return P(e.keyCode||e.charCode,e.charCode);
}
if (document.all&&!window.opera) I.onpaste=V;
else I.addEventListener('input',V,false)
}