1 
  2 goog.provide('thirdparty.jquerymaskedinput122');
  3 
  4 /// <reference path="../../../lib/jquery-1.2.6.js" />
  5 /*
  6 	Masked Input plugin for jQuery
  7 	Copyright (c) 2007-2009 Josh Bush (digitalbush.com)
  8 	Licensed under the MIT license (http://digitalbush.com/projects/masked-input-plugin/#license) 
  9 	Version: 1.2.2 (03/09/2009 22:39:06)
 10 */
 11 (function($) {
 12 	var pasteEventName = ($.browser.msie ? 'paste' : 'input') + ".mask";
 13 	var iPhone = (window.orientation != undefined);
 14 
 15 	$.mask = {
 16 		//Predefined character definitions
 17 		definitions: {
 18 			'9': "[0-9]",
 19 			'a': "[A-Za-z]",
 20 			'*': "[A-Za-z0-9]"
 21 		}
 22 	};
 23 
 24 	$.fn.extend({
 25 		//Helper Function for Caret positioning
 26 		caret: function(begin, end) {
 27 			if (this.length == 0) return;
 28 			if (typeof begin == 'number') {
 29 				end = (typeof end == 'number') ? end : begin;
 30 				return this.each(function() {
 31 					if (this.setSelectionRange) {
 32 						this.focus();
 33 						this.setSelectionRange(begin, end);
 34 					} else if (this.createTextRange) {
 35 						var range = this.createTextRange();
 36 						range.collapse(true);
 37 						range.moveEnd('character', end);
 38 						range.moveStart('character', begin);
 39 						range.select();
 40 					}
 41 				});
 42 			} else {
 43 				if (this[0].setSelectionRange) {
 44 					begin = this[0].selectionStart;
 45 					end = this[0].selectionEnd;
 46 				} else if (document.selection && document.selection.createRange) {
 47 					var range = document.selection.createRange();
 48 					begin = 0 - range.duplicate().moveStart('character', -100000);
 49 					end = begin + range.text.length;
 50 				}
 51 				return { begin: begin, end: end };
 52 			}
 53 		},
 54 		unmask: function() { return this.trigger("unmask"); },
 55 		mask: function(mask, settings) {
 56 			if (!mask && this.length > 0) {
 57 				var input = $(this[0]);
 58 				var tests = input.data("tests");
 59 				return $.map(input.data("buffer"), function(c, i) {
 60 					return tests[i] ? c : null;
 61 				}).join('');
 62 			}
 63 			settings = $.extend({
 64 				placeholder: "_",
 65 				completed: null
 66 			}, settings);
 67 
 68 			var defs = $.mask.definitions;
 69 			var tests = [];
 70 			var partialPosition = mask.length;
 71 			var firstNonMaskPos = null;
 72 			var len = mask.length;
 73 
 74 			$.each(mask.split(""), function(i, c) {
 75 				if (c == '?') {
 76 					len--;
 77 					partialPosition = i;
 78 				} else if (defs[c]) {
 79 					tests.push(new RegExp(defs[c]));
 80 					if(firstNonMaskPos==null)
 81 						firstNonMaskPos =  tests.length - 1;
 82 				} else {
 83 					tests.push(null);
 84 				}
 85 			});
 86 
 87 			return this.each(function() {
 88 				var input = $(this);
 89 				var buffer = $.map(mask.split(""), function(c, i) { if (c != '?') return defs[c] ? settings.placeholder : c });
 90 				var ignore = false;  			//Variable for ignoring control keys
 91 				var focusText = input.val();
 92 
 93 				input.data("buffer", buffer).data("tests", tests);
 94 
 95 				function seekNext(pos) {
 96 					while (++pos <= len && !tests[pos]);
 97 					return pos;
 98 				};
 99 
100 				function shiftL(pos) {
101 					while (!tests[pos] && --pos >= 0);
102 					for (var i = pos; i < len; i++) {
103 						if (tests[i]) {
104 							buffer[i] = settings.placeholder;
105 							var j = seekNext(i);
106 							if (j < len && tests[i].test(buffer[j])) {
107 								buffer[i] = buffer[j];
108 							} else
109 								break;
110 						}
111 					}
112 					writeBuffer();
113 					input.caret(Math.max(firstNonMaskPos, pos));
114 				};
115 
116 				function shiftR(pos) {
117 					for (var i = pos, c = settings.placeholder; i < len; i++) {
118 						if (tests[i]) {
119 							var j = seekNext(i);
120 							var t = buffer[i];
121 							buffer[i] = c;
122 							if (j < len && tests[j].test(t))
123 								c = t;
124 							else
125 								break;
126 						}
127 					}
128 				};
129 
130 				function keydownEvent(e) {
131 					var pos = $(this).caret();
132 					var k = e.keyCode;
133 					ignore = (k < 16 || (k > 16 && k < 32) || (k > 32 && k < 41));
134 
135 					//delete selection before proceeding
136 					if ((pos.begin - pos.end) != 0 && (!ignore || k == 8 || k == 46))
137 						clearBuffer(pos.begin, pos.end);
138 
139 					//backspace, delete, and escape get special treatment
140 					if (k == 8 || k == 46 || (iPhone && k == 127)) {//backspace/delete
141 						shiftL(pos.begin + (k == 46 ? 0 : -1));
142 						return false;
143 					} else if (k == 27) {//escape
144 						input.val(focusText);
145 						input.caret(0, checkVal());
146 						return false;
147 					}
148 				};
149 
150 				function keypressEvent(e) {
151 					if (ignore) {
152 						ignore = false;
153 						//Fixes Mac FF bug on backspace
154 						return (e.keyCode == 8) ? false : null;
155 					}
156 					e = e || window.event;
157 					var k = e.charCode || e.keyCode || e.which;
158 					var pos = $(this).caret();
159 
160 					if (e.ctrlKey || e.altKey || e.metaKey) {//Ignore
161 						return true;
162 					} else if ((k >= 32 && k <= 125) || k > 186) {//typeable characters
163 						var p = seekNext(pos.begin - 1);
164 						if (p < len) {
165 							var c = String.fromCharCode(k);
166 							if (tests[p].test(c)) {
167 								shiftR(p);
168 								buffer[p] = c;
169 								writeBuffer();
170 								var next = seekNext(p);
171 								$(this).caret(next);
172 								if (settings.completed && next == len)
173 									settings.completed.call(input);
174 							}
175 						}
176 					}
177 					return false;
178 				};
179 
180 				function clearBuffer(start, end) {
181 					for (var i = start; i < end && i < len; i++) {
182 						if (tests[i])
183 							buffer[i] = settings.placeholder;
184 					}
185 				};
186 
187 				function writeBuffer() { return input.val(buffer.join('')).val(); };
188 
189 				function checkVal(allow) {
190 					//try to place characters where they belong
191 					var test = input.val();
192 					var lastMatch = -1;
193 					for (var i = 0, pos = 0; i < len; i++) {
194 						if (tests[i]) {
195 							buffer[i] = settings.placeholder;
196 							while (pos++ < test.length) {
197 								var c = test.charAt(pos - 1);
198 								if (tests[i].test(c)) {
199 									buffer[i] = c;
200 									lastMatch = i;
201 									break;
202 								}
203 							}
204 							if (pos > test.length)
205 								break;
206 						} else if (buffer[i] == test[pos] && i!=partialPosition) {
207 							pos++;
208 							lastMatch = i;
209 						} 
210 					}
211 					if (!allow && lastMatch + 1 < partialPosition) {
212 						input.val("");
213 						clearBuffer(0, len);
214 					} else if (allow || lastMatch + 1 >= partialPosition) {
215 						writeBuffer();
216 						if (!allow) input.val(input.val().substring(0, lastMatch + 1));
217 					}
218 					return (partialPosition ? i : firstNonMaskPos);
219 				};
220 
221 				if (!input.attr("readonly"))
222 					input
223 					.one("unmask", function() {
224 						input
225 							.unbind(".mask")
226 							.removeData("buffer")
227 							.removeData("tests");
228 					})
229 					.bind("focus.mask", function() {
230 						focusText = input.val();
231 						var pos = checkVal();
232 						writeBuffer();
233 						setTimeout(function() {
234 							if (pos == mask.length)
235 								input.caret(0, pos);
236 							else
237 								input.caret(pos);
238 						}, 0);
239 					})
240 					.bind("blur.mask", function() {
241 						checkVal();
242 						if (input.val() != focusText)
243 							input.change();
244 					})
245 					.bind("keydown.mask", keydownEvent)
246 					.bind("keypress.mask", keypressEvent)
247 					.bind(pasteEventName, function() {
248 						setTimeout(function() { input.caret(checkVal(true)); }, 0);
249 					});
250 
251 				checkVal(); //Perform initial check for existing values
252 			});
253 		}
254 	});
255 })(jQuery);