﻿/// <reference path="../../../lib/jquery-1.2.6.js" />
/*
	Masked Input plugin for jQuery
	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
	Version: 1.2.2 (03/09/2009 22:39:06)
*/
(function($) {
	var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask";
	var iPhone = (window.orientation != undefined);

	$.mask = {
		//Predefined character definitions
		definitions: {
			'0': "[0-9]",
			'1': "[0-9]",
			'2': "[0-9]",
			'3': "[0-9]",
			'4': "[0-9]",
			'5': "[0-9]",
			'6': "[0-9]",
			'7': "[0-9]",
			'8': "[0-9]",
			'9': "[0-9]",
			'a': "[A-Za-z]",
			'b': "[A-Za-z]",
			'c': "[A-Za-z]",
			'd': "[A-Za-z]",
			'e': "[A-Za-z]",
			'f': "[A-Za-z]",
			'g': "[A-Za-z]",
			'h': "[A-Za-z]",
			'i': "[A-Za-z]",
			'j': "[A-Za-z]",
			'k': "[A-Za-z]",
			'l': "[A-Za-z]",
			'm': "[A-Za-z]",
			'n': "[A-Za-z]",
			'o': "[A-Za-z]",
			'p': "[A-Za-z]",
			'q': "[A-Za-z]",
			'r': "[A-Za-z]",
			's': "[A-Za-z]",
			't': "[A-Za-z]",
			'u': "[A-Za-z]",
			'v': "[A-Za-z]",
			'w': "[A-Za-z]",
			'x': "[A-Za-z]",
			'y': "[A-Za-z]",
			'z': "[A-Za-z]",
			'A': "[A-Za-z]",
			'B': "[A-Za-z]",
			'C': "[A-Za-z]",
			'D': "[A-Za-z]",
			'E': "[A-Za-z]",
			'F': "[A-Za-z]",
			'G': "[A-Za-z]",
			'H': "[A-Za-z]",
			'I': "[A-Za-z]",
			'J': "[A-Za-z]",
			'K': "[A-Za-z]",
			'L': "[A-Za-z]",
			'M': "[A-Za-z]",
			'N': "[A-Za-z]",
			'O': "[A-Za-z]",
			'P': "[A-Za-z]",
			'Q': "[A-Za-z]",
			'R': "[A-Za-z]",
			'S': "[A-Za-z]",
			'T': "[A-Za-z]",
			'U': "[A-Za-z]",
			'V': "[A-Za-z]",
			'W': "[A-Za-z]",
			'X': "[A-Za-z]",
			'Y': "[A-Za-z]",
			'Z': "[A-Za-z]"
			//'u': "[A-Za-z]",
			//'n': "[A-Za-z]",
			//'a': "[A-Za-z]",
			//'*': "[A-Za-z0-9]"
		}
	};

	$.fn.extend({
		//Helper Function for Caret positioning
		caret: function(begin, end) {
			if (this.length == 0) return;
			if (typeof begin == 'number') {
				end = (typeof end == 'number') ? end : begin;
				return this.each(function() {
					if (this.setSelectionRange) {
						this.focus();
						this.setSelectionRange(begin, end);
					} else if (this.createTextRange) {
						var range = this.createTextRange();
						range.collapse(true);
						range.moveEnd('character', end);
						range.moveStart('character', begin);
						range.select();
					}
				});
			} else {
				if (this[0].setSelectionRange) {
					begin = this[0].selectionStart;
					end = this[0].selectionEnd;
				} else if (document.selection && document.selection.createRange) {
					var range = document.selection.createRange();
					begin = 0 - range.duplicate().moveStart('character', -100000);
					end = begin + range.text.length;
				}
				return { begin: begin, end: end };
			}
		},
		unmask: function() { return this.trigger("unmask"); },
		mask: function(mask, settings) {
			if('$$$'==mask){
				$(this).maskMoney({symbol:"",decimal:",",thousands:".",precision:3});
			}else{
			if('$$'==mask){
				$(this).maskMoney({symbol:"",decimal:",",thousands:"."});
			}else{
				if (!mask && this.length > 0) {				
					var input = $(this[0]);
					var tests = input.data("tests");
					return $.map(input.data("buffer"), function(c, i) {
						return tests[i] ? c : null;
					}).join('');
				}
				
				settings = $.extend({
					placeholder: "",
					completed: null
				}, settings);
	
				var defs = $.mask.definitions;
				var tests = [];
				var partialPosition = mask.length;
				var firstNonMaskPos = null;
				var len = mask.length;
	
				$.each(mask.split(""), function(i, c) {
					if (c == '?') {
						len--;
						partialPosition = i;
					} else if (defs[c]) {
						tests.push(new RegExp(defs[c]));
						if(firstNonMaskPos==null)
							firstNonMaskPos =  tests.length - 1;
					} else {
						tests.push(null);
					}
				});
	
				return this.each(function() {
					var input = $(this);
					var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c });
					var ignore = false;  			//Variable for ignoring control keys
					var focusText = input.val();
	
					input.data("buffer", buffer).data("tests", tests);
	
					function seekNext(pos) {
						while (++pos <= len && !tests[pos]);
						return pos;
					};
	
					function shiftL(pos) {
						while (!tests[pos] && --pos >= 0);
						for (var i = pos; i < len; i++) {
							if (tests[i]) {
								buffer[i] = settings.placeholder;
								var j = seekNext(i);
								if (j < len && tests[i].test(buffer[j])) {
									buffer[i] = buffer[j];
								} else
									break;
							}
						}
						writeBuffer();
						input.caret(Math.max(firstNonMaskPos, pos));
					};
	
					function shiftR(pos) {
						for (var i = pos, c = settings.placeholder; i < len; i++) {
							if (tests[i]) {
								var j = seekNext(i);
								var t = buffer[i];
								buffer[i] = c;
								if (j < len && tests[j].test(t))
									c = t;
								else
									break;
							}
						}
					};
	
					function keydownEvent(e) {
						var pos = $(this).caret();
						var k = e.keyCode;
						ignore = (k < 16 || (k > 16 && k < 32) || (k > 32 && k < 41));
	
						//delete selection before proceeding
						if ((pos.begin - pos.end) != 0 && (!ignore || k == 8 || k == 46))
							clearBuffer(pos.begin, pos.end);
	
						//backspace, delete, and escape get special treatment
						if (k == 8 || k == 46 || (iPhone && k == 127)) {//backspace/delete
							shiftL(pos.begin + (k == 46 ? 0 : -1));
							return false;
						} else if (k == 27) {//escape
							input.val(focusText);
							input.caret(0, checkVal());
							return false;
						}
					};
	
					function keypressEvent(e) {
						if (ignore) {
							ignore = false;
							//Fixes Mac FF bug on backspace
							return (e.keyCode == 8) ? false : null;
						}
						e = e || window.event;
						var k = e.charCode || e.keyCode || e.which;
						var pos = $(this).caret();
	
						if (e.ctrlKey || e.altKey || e.metaKey) {//Ignore
							return true;
						} else if ((k >= 32 && k <= 125) || k > 186) {//typeable characters
							var p = seekNext(pos.begin - 1);
							if (p < len) {
								var c = String.fromCharCode(k);
								if (tests[p].test(c)) {
									shiftR(p);
									buffer[p] = c;
									writeBuffer();
									var next = seekNext(p);
									$(this).caret(next);
									if (settings.completed && next == len)
										settings.completed.call(input);
								}
							}
						}
						return false;
					};
	
					function clearBuffer(start, end) {
						for (var i = start; i < end && i < len; i++) {
							if (tests[i])
								buffer[i] = settings.placeholder;
						}
					};
	
					function writeBuffer() {					
						return input.val(buffer.join('')).val(); 
					};
	
					function checkVal(allow) {
						//try to place characters where they belong
						var test = input.val();
						var lastMatch = -1;
						for (var i = 0, pos = 0; i < len; i++) {
							if (tests[i]) {
								buffer[i] = settings.placeholder;
								while (pos++ < test.length) {
									var c = test.charAt(pos - 1);
									if (tests[i].test(c)) {
										buffer[i] = c;
										lastMatch = i;
										break;
									}
								}
								if (pos > test.length)
									break;
							} else if (buffer[i] == test[pos] && i!=partialPosition) {
								pos++;
								lastMatch = i;
							} 
						}
						if (!allow && lastMatch + 1 < partialPosition) {
							input.val("");
							clearBuffer(0, len);
						} else if (allow || lastMatch + 1 >= partialPosition) {
							writeBuffer();						
							if (!allow) input.val(input.val().substring(0, lastMatch + 1));						
						}
						return (partialPosition ? i : firstNonMaskPos);
					};
	
									
					if (!input.attr("readonly"))
						input
						.one("unmask", function() {
							
							input
								.unbind(".mask")
								.removeData("buffer")
								.removeData("tests");
						})
						.bind("focus.mask", function() {
							focusText = input.val();
							var pos = checkVal(focusText);						
							writeBuffer();
							setTimeout(function() {							
								if (pos == mask.length)
									input.caret(0, pos);
								else
									input.caret(pos);
							}, 0);
						})
						.bind("blur.mask", function() {
							posicaoAtual = checkVal(input.val());
						
							input.val(input.val().substring(-1, posicaoAtual));
							
							if(input.val() == '('){
								input.val('');
							}
							
							if (input.val() != focusText)
								input.change();
						})
						.bind("keydown.mask", keydownEvent)
						.bind("keypress.mask", keypressEvent)
						.bind(pasteEventName, function() {
							setTimeout(function() { input.caret(checkVal(true)); }, 0);
						});
					
					posicaoAtual = checkVal(input.val());
					
					input.val(input.val().substring(0, posicaoAtual));
					
					input.bind("focus.mask", function() {
						focusText = input.val();
						var pos = checkVal(focusText);						
						writeBuffer();
						setTimeout(function() {							
							if (pos == mask.length)
								input.caret(0, pos);
							else
								input.caret(pos);
						}, 0);
					});
					
					//alert(posicaoAtual);				
					//alert(input.val());
					
					checkVal(); //Perform initial check for existing values
				});
			}
			}
		}
	});
})(jQuery);

/*
* @Copyright (c) 2008 Aurélio Saraiva (aureliosaraiva@gmail.com)
* @Page http://inovaideia.com.br/maskInputMoney

* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/

/*
* @Version: 0.2
* @Release: 2008-07-25
*/
(function($) {
	$.fn.maskMoney = function(settings) {
		settings = $.extend({
			symbol: "R$",
			decimal: ".",
			precision: 2,
			thousands: ",",
			showSymbol:true
		}, settings);

		settings.symbol=settings.symbol+" ";

		return this.each(function() {
			var input=$(this);
			function money(e) {
				e=e||window.event;
				var k=e.charCode||e.keyCode||e.which;
				if (k == 8) { // tecla backspace
					preventDefault(e);
					var x = input.val().substring(0,input.val().length-1);
					input.val(maskValue(x));
					return false;
				} else if (k == 9) { // tecla tab
					return true;
				}
				if (k < 48 || k > 57) {
					preventDefault(e);
					return true;
				}
				var key = String.fromCharCode(k);  // Valor para o código da Chave
				preventDefault(e);
				input.val(maskValue(input.val()+key));
			}

			function preventDefault(e) {
				if (e.preventDefault) { //standart browsers
					e.preventDefault()
				} else { // internet explorer
					e.returnValue = false
				}
			}

			function maskValue(v) {
				v = v.replace(settings.symbol,"");
				var a = '';
				var strCheck = '0123456789';
				var len = v.length;
				var t = "";
				if (len== 0) {
					t = "0.00";
				}
				for (var i = 0; i < len; i++)
					if ((v.charAt(i) != '0') && (v.charAt(i) != settings.decimal))
						break;

				for (; i < len; i++) {
					if (strCheck.indexOf(v.charAt(i))!=-1) a+= v.charAt(i);
				}

				var n = parseFloat(a);
				n = isNaN(n) ? 0 : n/Math.pow(10, settings.precision);
				t = n.toFixed(settings.precision);

				var p, d = (t=t.split("."))[1].substr(0, settings.precision);
				for (p = (t=t[0]).length; (p-=3) >= 1;) {
					t = t.substr(0,p) + settings.thousands + t.substr(p);
				}
				return setSymbol(t+settings.decimal+d+Array(
					(settings.precision+1)-d.length).join(0));
			}

			function focusEvent() {
				if (input.val()=="") {
					input.val(setSymbol(getDefaultMask()));
				} else {
					input.val(setSymbol(input.val()));
				}
			}

			function blurEvent() {
				if (input.val()==setSymbol(getDefaultMask())) {
					//input.val("");
				} else {
					input.val(input.val().replace(settings.symbol,""))
				}
			}

			function getDefaultMask() {
				var n = parseFloat("0")/Math.pow(10, settings.precision);
				return (n.toFixed(settings.precision)).replace(
					new RegExp("\\.", "g"), settings.decimal);
			}

			function setSymbol(v) {
				if (settings.showSymbol) {
					return settings.symbol+v;
				}
				return v;
			}

			input.bind("keypress",money);
			input.bind("blur",blurEvent);
			input.bind("focus",focusEvent);

			input.one("unmaskMoney",function() {
				input.unbind("focus",focusEvent);
				input.unbind("blur",blurEvent);
				input.unbind("keypress",money);
				if ($.browser.msie)
				this.onpaste= null;
				else if ($.browser.mozilla)
				this.removeEventListener('input',blurEvent,false);
			});
		});
	}

	$.fn.unmaskMoney=function() {
		return this.trigger("unmaskMoney");
	};
})(jQuery);
