/**
 * @version: 1.1.3
 * Created by Fabio M. Costa on 2008-09-16. Please report any bug at http://www.meiocodigo.com
 * Copyright (c) 2008 Fabio M. Costa http://www.meiocodigo.com
 * The MIT License (http://www.opensource.org/licenses/mit-license.php)
 */
(function(D){
	var C=(window.orientation!=undefined),A=((D.browser.opera||(D.browser.mozilla&&parseFloat(D.browser.version.substr(0,3))<1.9))?"input":"paste");
	D.event.special.paste={
		setup:function(){
			if(this.addEventListener){
				this.addEventListener(A,B,false)
				}else{
				if(this.attachEvent){
					this.attachEvent(A,B)
					}
				}
		},
teardown:function(){
	if(this.removeEventListener){
		this.removeEventListener(A,B,false)
		}else{
		if(this.detachEvent){
			this.detachEvent(A,B)
			}
		}
}
};

function B(F){
	var E=this;
	F=D.event.fix(F||window.e);
	F.type="paste";
	setTimeout(function(){
		D.event.handle.call(E,F)
		},1)
	}
	D.extend({
	mask:{
		rules:{
			"z":/[a-z]/,
			"Z":/[A-Z]/,
			"a":/[a-zA-Z]/,
			"*":/[0-9a-zA-Z]/,
			"@":/[0-9a-zA-ZçÇáàãâéèêíìóòôõúùü]/
		},
		keyRepresentation:{
			8:"backspace",
			9:"tab",
			13:"enter",
			16:"shift",
			17:"control",
			18:"alt",
			27:"esc",
			33:"page up",
			34:"page down",
			35:"end",
			36:"home",
			37:"left",
			38:"up",
			39:"right",
			40:"down",
			45:"insert",
			46:"delete",
			116:"f5",
			123:"f12",
			224:"command"
		},
		iphoneKeyRepresentation:{
			10:"go",
			127:"delete"
		},
		signals:{
			"+":"",
			"-":"-"
		},
		options:{
			attr:"alt",
			mask:null,
			type:"fixed",
			maxLength:-1,
			defaultValue:"",
			signal:false,
			textAlign:true,
			selectCharsOnFocus:true,
			autoTab:true,
			setSize:false,
			fixedChars:"[(),.:/ -]",
			onInvalid:function(){},
			onValid:function(){},
			onOverflow:function(){}
		},
	masks:{
		"phone":{
			mask:"(99) 9999-9999"
		},
		"phone-us":{
			mask:"(999) 999-9999"
		},
		"cpf":{
			mask:"999.999.999-99"
		},
		"cnpj":{
			mask:"99.999.999/9999-99"
		},
		"date":{
			mask:"39/19/9999"
		},
		"date-us":{
			mask:"19/39/9999"
		},
		"cep":{
			mask:"99999-999"
		},
		"time":{
			mask:"29:59"
		},
		"cc":{
			mask:"9999 9999 9999 9999"
		},
		"integer":{
			mask:"999.999.999.999",
			type:"reverse"
		},
		"tinyint":{
			mask:"999",
			type:"reverse"
		},
		"decimal":{
			mask:"99,999.999.999.999",
			type:"reverse",
			defaultValue:"000"
		},
		"decimal-us":{
			mask:"99.999,999,999,999",
			type:"reverse",
			defaultValue:"000"
		},
		"signed-decimal":{
			mask:"99,999.999.999.999",
			type:"reverse",
			defaultValue:"+000"
		},
		"signed-decimal-us":{
			mask:"99,999.999.999.999",
			type:"reverse",
			defaultValue:"+000"
		},
		"desconto":{
			mask:"99,99",
			type:"reverse",
			defaultValue:"000"
		}
	},
init:function(){
	if(!this.hasInit){
		var E=this,F,G=(C)?this.iphoneKeyRepresentation:this.keyRepresentation;
		this.ignore=false;
		for(F=0;F<=9;F++){
			this.rules[F]=new RegExp("[0-"+F+"]")
			}
			this.keyRep=G;
		this.ignoreKeys=[];
		D.each(G,function(H){
			E.ignoreKeys.push(parseInt(H))
			});
		this.hasInit=true
		}
	},
set:function(I,F){
	var E=this,G=D(I),H="maxLength";
	F=F||{};

	this.init();
	return G.each(function(){
		if(F.attr){
			E.options.attr=F.attr
			}
			var O=D(this),Q=D.extend({},E.options),N=O.attr(Q.attr),J="";
		J=(typeof F=="string")?F:(N!="")?N:null;
		if(J){
			Q.mask=J
			}
			if(E.masks[J]){
			Q=D.extend(Q,E.masks[J])
			}
			if(typeof F=="object"&&F.constructor!=Array){
			Q=D.extend(Q,F)
			}
			if(D.metadata){
			Q=D.extend(Q,O.metadata())
			}
			if(Q.mask!=null){
			if(O.data("mask")){
				E.unset(O)
				}
				var K=Q.defaultValue,L=(Q.type=="reverse"),M=new RegExp(Q.fixedChars,"g");
			if(Q.maxLength==-1){
				Q.maxLength=O.attr(H)
				}
				Q=D.extend({},Q,{
				fixedCharsReg:new RegExp(Q.fixedChars),
				fixedCharsRegG:M,
				maskArray:Q.mask.split(""),
				maskNonFixedCharsArray:Q.mask.replace(M,"").split("")
				});
			if((Q.type=="fixed"||L)&&Q.setSize&&!O.attr("size")){
				O.attr("size",Q.mask.length)
				}
				if(L&&Q.textAlign){
				O.css("text-align","right")
				}
				if(this.value!=""||K!=""){
				var P=E.string((this.value!="")?this.value:K,Q);
				this.defaultValue=P;
				O.val(P)
				}
				if(Q.type=="infinite"){
				Q.type="repeat"
				}
				O.data("mask",Q);
			O.removeAttr(H);
			O.bind("keydown.mask",{
				func:E._onKeyDown,
				thisObj:E
			},E._onMask).bind("keypress.mask",{
				func:E._onKeyPress,
				thisObj:E
			},E._onMask).bind("keyup.mask",{
				func:E._onKeyUp,
				thisObj:E
			},E._onMask).bind("paste.mask",{
				func:E._onPaste,
				thisObj:E
			},E._onMask).bind("focus.mask",E._onFocus).bind("blur.mask",E._onBlur).bind("change.mask",E._onChange)
			}
		})
},
unset:function(F){
	var E=D(F);
	return E.each(function(){
		var H=D(this);
		if(H.data("mask")){
			var G=H.data("mask").maxLength;
			if(G!=-1){
				H.attr("maxLength",G)
				}
				H.unbind(".mask").removeData("mask")
			}
		})
},
string:function(J,F){
	this.init();
	var I={};

	if(typeof J!="string"){
		J=String(J)
		}
		switch(typeof F){
		case"string":
			if(this.masks[F]){
			I=D.extend(I,this.masks[F])
			}else{
			I.mask=F
			}
			break;
		case"object":
			I=F
			}
			if(!I.fixedChars){
		I.fixedChars=this.options.fixedChars
		}
		var E=new RegExp(I.fixedChars),G=new RegExp(I.fixedChars,"g");
	if((I.type=="reverse")&&I.defaultValue){
		if(typeof this.signals[I.defaultValue.charAt(0)]!="undefined"){
			var H=J.charAt(0);
			I.signal=(typeof this.signals[H]!="undefined")?this.signals[H]:this.signals[I.defaultValue.charAt(0)];
			I.defaultValue=I.defaultValue.substring(1)
			}
		}
	return this.__maskArray(J.split(""),I.mask.replace(G,"").split(""),I.mask.split(""),I.type,I.maxLength,I.defaultValue,E,I.signal)
},
_onFocus:function(G){
	var F=D(this),E=F.data("mask");
	E.inputFocusValue=F.val();
	E.changed=false;
	if(E.selectCharsOnFocus){
		F.select()
		}
	},
_onBlur:function(G){
	var F=D(this),E=F.data("mask");
	if(E.inputFocusValue!=F.val()&&!E.changed){
		F.trigger("change")
		}
	},
_onChange:function(E){
	D(this).data("mask").changed=true
	},
_onMask:function(E){
	var G=E.data.thisObj,F={};

	F._this=E.target;
	F.$this=D(F._this);
	if(F.$this.attr("readonly")){
		return true
		}
		F.data=F.$this.data("mask");
	F[F.data.type]=true;
	F.value=F.$this.val();
	F.nKey=G.__getKeyNumber(E);
	F.range=G.__getRange(F._this);
	F.valueArray=F.value.split("");
	return E.data.func.call(G,E,F)
	},
_onKeyDown:function(F,G){
	this.ignore=D.inArray(G.nKey,this.ignoreKeys)>-1||F.ctrlKey||F.metaKey||F.altKey;
	if(this.ignore){
		var E=this.keyRep[G.nKey];
		G.data.onValid.call(G._this,E?E:"",G.nKey)
		}
		return C?this._keyPress(F,G):true
	},
_onKeyUp:function(E,F){
	if(F.nKey==9||F.nKey==16){
		return true
		}
		if(F.data.type=="repeat"){
		this.__autoTab(F);
		return true
		}
		return this._onPaste(E,F)
	},
_onPaste:function(F,G){
	if(G.reverse){
		this.__changeSignal(F.type,G)
		}
		var E=this.__maskArray(G.valueArray,G.data.maskNonFixedCharsArray,G.data.maskArray,G.data.type,G.data.maxLength,G.data.defaultValue,G.data.fixedCharsReg,G.data.signal);
	G.$this.val(E);
	if(!G.reverse&&G.data.defaultValue.length&&(G.range.start==G.range.end)){
		this.__setRange(G._this,G.range.start,G.range.end)
		}
		if((D.browser.msie||D.browser.safari)&&!G.reverse){
		this.__setRange(G._this,G.range.start,G.range.end)
		}
		if(this.ignore){
		return true
		}
		this.__autoTab(G);
	return true
	},
_onKeyPress:function(L,E){
	if(this.ignore){
		return true
		}
		if(E.reverse){
		this.__changeSignal(L.type,E)
		}
		var M=String.fromCharCode(E.nKey),O=E.range.start,I=E.value,G=E.data.maskArray;
	if(E.reverse){
		var H=I.substr(0,O),K=I.substr(E.range.end,I.length);
		I=H+M+K;
		if(E.data.signal&&(O-E.data.signal.length>0)){
			O-=E.data.signal.length
			}
		}
	var N=I.replace(E.data.fixedCharsRegG,"").split(""),F=this.__extraPositionsTill(O,G,E.data.fixedCharsReg);
E.rsEp=O+F;
if(E.repeat){
	E.rsEp=0
	}
	if(!this.rules[G[E.rsEp]]||(E.data.maxLength!=-1&&N.length>=E.data.maxLength&&E.repeat)){
	E.data.onOverflow.call(E._this,M,E.nKey);
	return false
	}else{
	if(!this.rules[G[E.rsEp]].test(M)){
		E.data.onInvalid.call(E._this,M,E.nKey);
		return false
		}else{
		E.data.onValid.call(E._this,M,E.nKey)
		}
	}
var J=this.__maskArray(N,E.data.maskNonFixedCharsArray,G,E.data.type,E.data.maxLength,E.data.defaultValue,E.data.fixedCharsReg,E.data.signal,F);
E.$this.val(J);
return(E.reverse)?this._keyPressReverse(L,E):(E.fixed)?this._keyPressFixed(L,E):true
},
_keyPressFixed:function(E,F){
	if(F.range.start==F.range.end){
		if((F.rsEp==0&&F.value.length==0)||F.rsEp<F.value.length){
			this.__setRange(F._this,F.rsEp,F.rsEp+1)
			}
		}else{
	this.__setRange(F._this,F.range.start,F.range.end)
	}
	return true
},
_keyPressReverse:function(E,F){
	if(D.browser.msie&&((F.range.start==0&&F.range.end==0)||F.range.start!=F.range.end)){
		this.__setRange(F._this,F.value.length)
		}
		return false
	},
__autoTab:function(F){
	if(F.data.autoTab&&((F.$this.val().length>=F.data.maskArray.length&&!F.repeat)||(F.data.maxLength!=-1&&F.valueArray.length>=F.data.maxLength&&F.repeat))){
		var E=this.__getNextInput(F._this,F.data.autoTab);
		if(E){
			F.$this.trigger("blur");
			E.focus().select()
			}
		}
},
__changeSignal:function(F,G){
	if(G.data.signal!==false){
		var E=(F=="paste")?G.value.charAt(0):String.fromCharCode(G.nKey);
		if(this.signals&&(typeof this.signals[E]!="undefined")){
			G.data.signal=this.signals[E]
			}
		}
},
__getKeyNumber:function(E){
	return(E.charCode||E.keyCode||E.which)
	},
__maskArray:function(M,H,G,J,E,K,N,L,F){
	if(J=="reverse"){
		M.reverse()
		}
		M=this.__removeInvalidChars(M,H,J=="repeat"||J=="infinite");
	if(K){
		M=this.__applyDefaultValue.call(M,K)
		}
		M=this.__applyMask(M,G,F,N);
	switch(J){
		case"reverse":
			M.reverse();
			return(L||"")+M.join("").substring(M.length-G.length);
		case"infinite":case"repeat":
			var I=M.join("");
			return(E!=-1&&M.length>=E)?I.substring(0,E):I;
		default:
			return M.join("").substring(0,G.length)
			}
			return""
	},
__applyDefaultValue:function(G){
	var E=G.length,F=this.length,H;
	for(H=F-1;H>=0;H--){
		if(this[H]==G.charAt(0)){
			this.pop()
			}else{
			break
		}
	}
	for(H=0;H<E;H++){
	if(!this[H]){
		this[H]=G.charAt(H)
		}
	}
return this
},
__removeInvalidChars:function(H,G,E){
	for(var F=0,I=0;F<H.length;F++){
		if(G[I]&&this.rules[G[I]]&&!this.rules[G[I]].test(H[F])){
			H.splice(F,1);
			if(!E){
				I--
			}
			F--
		}
		if(!E){
			I++
		}
	}
	return H
},
__applyMask:function(H,F,I,E){
	if(typeof I=="undefined"){
		I=0
		}
		for(var G=0;G<H.length+I;G++){
		if(F[G]&&E.test(F[G])){
			H.splice(G,0,F[G])
			}
		}
	return H
},
__extraPositionsTill:function(H,F,E){
	var G=0;
	while(E.test(F[H++])){
		G++
	}
	return G
	},
__getNextInput:function(N,F){
	var I=N.form.elements,H=D.inArray(N,I)+1,M=null,J;
	for(J=H;J<I.length;J++){
		M=D(I[J]);
		if(this.__isNextInput(M,F)){
			return M
			}
		}
	var E=document.forms,G=D.inArray(N.form,E)+1,L,K=null;
for(L=G;L<E.length;L++){
	K=E[L].elements;
	for(J=0;J<K.length;J++){
		M=D(K[J]);
		if(this.__isNextInput(M,F)){
			return M
			}
		}
	}
return null
},
__isNextInput:function(G,E){
	var F=G.get(0);
	return F&&(F.offsetWidth>0||F.offsetHeight>0)&&F.nodeName!="FIELDSET"&&(E===true||(typeof E=="string"&&G.is(E)))
	},
__setRange:function(G,H,E){
	if(typeof E=="undefined"){
		E=H
		}
		if(G.setSelectionRange){
		G.setSelectionRange(H,E)
		}else{
		var F=G.createTextRange();
		F.collapse();
		F.moveStart("character",H);
		F.moveEnd("character",E-H);
		F.select()
		}
	},
__getRange:function(F){
	if(!D.browser.msie){
		return{
			start:F.selectionStart,
			end:F.selectionEnd
			}
		}
	var G={
	start:0,
	end:0
},E=document.selection.createRange();
G.start=0-E.duplicate().moveStart("character",-100000);
G.end=G.start+E.text.length;
return G
},
unmaskedVal:function(E){
	return D(E).val().replace(D.mask.fixedCharsRegG,"")
	}
}
});
D.fn.extend({
	setMask:function(E){
		return D.mask.set(this,E)
		},
	unsetMask:function(){
		return D.mask.unset(this)
		},
	unmaskedVal:function(){
		return D.mask.unmaskedVal(this[0])
		}
	})
})(jQuery)
