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);