/**
 * @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 : false,
	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.2999"
	},
	"cep" : { mask : "99999-999"
	},
	"time" : { mask : "29:59"
	},
	"cc" : { mask : "9999 9999 9999 9999"
	},
	"integer" : { mask : "999.999.999.999",
	type : "reverse"
	},
	"cost" : { mask : "9",
		type : "repeat"
		},
		"wmid" : { mask : "999999999999"},
		"million" : { mask : "9999999", defaultValue : "1000"},
	"decimal" : { mask : "999,999999.999.999",
	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)
