// Ivan Campos Valadares
// ivanvaladares@hotmail.com

function mask(obj,exp,isCur){
	var ControlKeys = [0x08,0x09,0x0D,0x10,0x11,0x12,0x1B,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x2E];
	var C=/[a-zA-ZÂ-ÖÙ-Ýà-öù-ýÿ]/;
	var N=/[0-9]/;
	var A=/[a-zA-ZÂ-ÖÙ-Ýà-öù-ýÿ0-9]/;
	var S=/[^a-zA-ZÂ-ÖÙ-Ýà-öù-ýÿ0-9]/;
	var Z=/[.]/;

	if(!obj.maxlength||obj.maxLength>exp.length)obj.maxLength=exp.length;
	if(isCur){
		obj.style.textAlign="right";
		if(window.attachEvent){
			obj.attachEvent( 'onkeyup', function(){ eval('maskNumber(event);'); });
		}else{
			attachEventFF("keyup",function(){ eval('maskNumber(event);'); });
		}
	}else{
		if(window.attachEvent){
			obj.attachEvent( 'onkeypress', function(){ eval('maskString(event);'); });
		}else{
			attachEventFF("keypress",function(){ eval('maskString(event);'); });
		}
	}

	function maskString(evt){
		var p=getCaret(evt);
		var k=evt.keyCode ? evt.keyCode : evt.which;
		var m=exp.charAt(p);
	
	
		if(m!=""){
			for (var i=0;i<ControlKeys.length;i++){
				if (k==ControlKeys[i]){
					return;
				}
			}
			var sf = String.fromCharCode(k);
			if("CNASZ".indexOf(m)!=-1 && !eval(m).test(sf)){
				if (document.all){
					evt.returnValue=false;
				}else{
					evt.preventDefault();
				}
			}else{
				if("CNASZ".indexOf(m)==-1){
					if(obj.value.charAt(p)!=m)
						obj.value=obj.value.substr(0,p)+m+obj.value.substr(p,obj.value.length);
					setCaret(evt, p+1);
					maskString(evt);
				}
			}
		}
	}
	function maskNumber(evt) {
		var negative=(obj.value.indexOf("-") != -1)?1:0;
		var STR=obj.value.replace(/[^0-9]+/gi,"");
		var eL=exp.length-1, vL=STR.length-1, res="", c, m;
		while (vL>=0){
			c = STR.charAt(vL--);
			m = exp.charAt(eL--);
			if (m != "N" && m != c){
				res = c + m + res;
				eL--;
			}else{
				res = c + res;
			}
		}
		obj.value = ((negative)?"-":"") + res;	
		setCaret(evt, obj.value.length);
	}
	function setCaret(evt, i){
		// IE
		if( document.selection != null )
		{
			var r=obj.createTextRange();
			r.moveStart("character",i+1);
			r.moveEnd("character",i-obj.value.length);
			r.select();
		}
		// FF
		else if( obj.selectionStart != null ){
			obj.setSelectionRange(i, i);
			obj.selectionStart = i;
			obj.selectionEnd = i;
		}

	}
	function getCaret(evt){
		// IE
		if( document.selection != null )
		{
			var t=document.selection.createRange().duplicate();
			t.moveEnd("character",obj.value.length);
			return (t.text=="")?obj.value.length:obj.value.lastIndexOf(t.text);
		}
		//FF
		else if( obj.selectionStart != null ){
			return obj.selectionStart;
		}
		else{
			return -1;
		}
	}
	function attachEventFF(evt, hnd){
		hnd.func=function(e){
			window.event=e;
			return hnd();
		}
		obj.addEventListener(evt, hnd.func, false);
	}
}