1(function (factory) { 2 if (typeof define === 'function' && define.amd) { 3 // AMD. Register as an anonymous module. 4 define(['jquery'], factory); 5 } else if (typeof exports === 'object') { 6 // Node/CommonJS 7 factory(require('jquery')); 8 } else { 9 // Browser globals 10 factory(jQuery); 11 } 12}(function ($) { 13 14var ua = navigator.userAgent, 15 iPhone = /iphone/i.test(ua), 16 chrome = /chrome/i.test(ua), 17 android = /android/i.test(ua), 18 caretTimeoutId; 19 20$.mask = { 21 //Predefined character definitions 22 definitions: { 23 '9': "[0-9]", 24 'a': "[A-Za-z]", 25 '*': "[A-Za-z0-9]" 26 }, 27 autoclear: true, 28 dataName: "rawMaskFn", 29 placeholder: '_' 30}; 31 32$.fn.extend({ 33 //Helper Function for Caret positioning 34 caret: function(begin, end) { 35 var range; 36 37 if (this.length === 0 || this.is(":hidden") || this.get(0) !== document.activeElement) { 38 return; 39 } 40 41 if (typeof begin == 'number') { 42 end = (typeof end === 'number') ? end : begin; 43 return this.each(function() { 44 if (this.setSelectionRange) { 45 this.setSelectionRange(begin, end); 46 } else if (this.createTextRange) { 47 range = this.createTextRange(); 48 range.collapse(true); 49 range.moveEnd('character', end); 50 range.moveStart('character', begin); 51 range.select(); 52 } 53 }); 54 } else { 55 if (this[0].setSelectionRange) { 56 begin = this[0].selectionStart; 57 end = this[0].selectionEnd; 58 } else if (document.selection && document.selection.createRange) { 59 range = document.selection.createRange(); 60 begin = 0 - range.duplicate().moveStart('character', -100000); 61 end = begin + range.text.length; 62 } 63 return { begin: begin, end: end }; 64 } 65 }, 66 unmask: function() { 67 return this.trigger("unmask"); 68 }, 69 mask: function(mask, settings) { 70 var input, 71 defs, 72 tests, 73 partialPosition, 74 firstNonMaskPos, 75 lastRequiredNonMaskPos, 76 len, 77 oldVal; 78 79 if (!mask && this.length > 0) { 80 input = $(this[0]); 81 var fn = input.data($.mask.dataName) 82 return fn?fn():undefined; 83 } 84 85 settings = $.extend({ 86 autoclear: $.mask.autoclear, 87 placeholder: $.mask.placeholder, // Load default placeholder 88 completed: null 89 }, settings); 90 91 92 defs = $.mask.definitions; 93 tests = []; 94 partialPosition = len = mask.length; 95 firstNonMaskPos = null; 96 97 mask = String(mask); 98 99 $.each(mask.split(""), function(i, c) { 100 if (c == '?') { 101 len--; 102 partialPosition = i; 103 } else if (defs[c]) { 104 tests.push(new RegExp(defs[c])); 105 if (firstNonMaskPos === null) { 106 firstNonMaskPos = tests.length - 1; 107 } 108 if(i < partialPosition){ 109 lastRequiredNonMaskPos = tests.length - 1; 110 } 111 } else { 112 tests.push(null); 113 } 114 }); 115 116 return this.trigger("unmask").each(function() { 117 var input = $(this), 118 buffer = $.map( 119 mask.split(""), 120 function(c, i) { 121 if (c != '?') { 122 return defs[c] ? getPlaceholder(i) : c; 123 } 124 }), 125 defaultBuffer = buffer.join(''), 126 focusText = input.val(); 127 128 function tryFireCompleted(){ 129 if (!settings.completed) { 130 return; 131 } 132 133 for (var i = firstNonMaskPos; i <= lastRequiredNonMaskPos; i++) { 134 if (tests[i] && buffer[i] === getPlaceholder(i)) { 135 return; 136 } 137 } 138 settings.completed.call(input); 139 } 140 141 function getPlaceholder(i){ 142 if(i < settings.placeholder.length) 143 return settings.placeholder.charAt(i); 144 return settings.placeholder.charAt(0);
145 } 146 147 function seekNext(pos) { 148 while (++pos < len && !tests[pos]); 149 return pos; 150 } 151 152 function seekPrev(pos) { 153 while (--pos >= 0 && !tests[pos]); 154 return pos; 155 } 156 157 function shiftL(begin,end) { 158 var i, 159 j; 160 161 if (begin<0) { 162 return; 163 } 164 165 for (i = begin, j = seekNext(end); i < len; i++) { 166 if (tests[i]) { 167 if (j < len && tests[i].test(buffer[j])) { 168 buffer[i] = buffer[j]; 169 buffer[j] = getPlaceholder(j); 170 } else { 171 break; 172 } 173 174 j = seekNext(j); 175 } 176 } 177 writeBuffer(); 178 input.caret(Math.max(firstNonMaskPos, begin)); 179 } 180 181 function shiftR(pos) { 182 var i, 183 c, 184 j, 185 t; 186 187 for (i = pos, c = getPlaceholder(pos); i < len; i++) { 188 if (tests[i]) { 189 j = seekNext(i); 190 t = buffer[i]; 191 buffer[i] = c; 192 if (j < len && tests[j].test(t)) { 193 c = t; 194 } else { 195 break; 196 } 197 } 198 } 199 } 200 201 function androidInputEvent(e) { 202 var curVal = input.val(); 203 var pos = input.caret(); 204 var proxy = function () { 205 $.proxy($.fn.caret, input, pos.begin, pos.begin)(); 206 }; 207 208 if (oldVal && oldVal.length && oldVal.length > curVal.length ) { 209 // a deletion or backspace happened 210 checkVal(true); 211 while (pos.begin > 0 && !tests[pos.begin-1]) 212 pos.begin--; 213 if (pos.begin === 0) 214 { 215 while (pos.begin < firstNonMaskPos && !tests[pos.begin]) 216 pos.begin++; 217 } 218 setTimeout(proxy, 0); 219 } else { 220 var pos2 = checkVal(true); 221 var lastEnteredValue = curVal.charAt(pos.begin); 222 if (pos.begin < len){ 223 if(!tests[pos.begin]){ 224 pos.begin = pos2; 225 }else{ 226 if(tests[pos.begin].test(lastEnteredValue)){ 227 pos.begin++; 228 } 229 } 230 } 231 setTimeout(proxy, 0); 232 } 233 tryFireCompleted(); 234 } 235 236 237 function blurEvent(e) { 238 checkVal(); 239 240 if (input.val() != focusText) 241 input.change(); 242 } 243 244 function keydownEvent(e) { 245 if (input.prop("readonly")){ 246 return; 247 } 248 249 var k = e.which || e.keyCode, 250 pos, 251 begin, 252 end; 253 oldVal = input.val(); 254 //backspace, delete, and escape get special treatment 255 if (k === 8 || k === 46 || (iPhone && k === 127)) { 256 pos = input.caret(); 257 begin = pos.begin; 258 end = pos.end; 259 260 if (end - begin === 0) { 261 begin=k!==46?seekPrev(begin):(end=seekNext(begin-1)); 262 end=k===46?seekNext(end):end; 263 } 264 clearBuffer(begin, end); 265 shiftL(begin, end - 1); 266 267 e.preventDefault(); 268 } else if( k === 13 ) { // enter 269 blurEvent.call(this, e); 270 } else if (k === 27) { // escape 271 input.val(focusText); 272 input.caret(0, checkVal()); 273 e.preventDefault(); 274 } 275 } 276 277 function keypressEvent(e) { 278 if (input.prop("readonly")){ 279 return; 280 } 281 282 var k = e.which || e.keyCode, 283 pos = input.caret(), 284 p, 285 c, 286 next; 287 288 if (e.ctrlKey || e.altKey || e.metaKey || k < 32) {//Ignore 289 return; 290 } else if ( k && k !== 13 ) { 291 if (pos.end - pos.begin !== 0){ 292 clearBuffer(pos.begin, pos.end); 293 shiftL(pos.begin, pos.end-1); 294 } 295 296 p = seekNext(pos.begin - 1); 297 if (p < len) { 298 c = String.fromCharCode(k); 299 if (tests[p].test(c)) { 300 shiftR(p); 301 302 buffer[p] = c; 303 writeBuffer(); 304 next = seekNext(p); 305 306 if(android){ 307 //Path for CSP Violation on FireFox OS 1.1 308 var proxy = function() { 309 $.proxy($.fn.caret,input,next)(); 310 }; 311 312 setTimeout(proxy,0); 313 }else{ 314 input.caret(next); 315 } 316 if(pos.begin <= lastRequiredNonMaskPos){ 317 tryFireCompleted(); 318 } 319 } 320 } 321 e.preventDefault(); 322 } 323 } 324 325 function clearBuffer(start, end) { 326 var i; 327 for (i = start; i < end && i < len; i++) { 328 if (tests[i]) { 329 buffer[i] = getPlaceholder(i); 330 } 331 } 332 } 333 334 function writeBuffer() { input.val(buffer.join('')); } 335 336 function checkVal(allow) { 337 //try to place characters where they belong 338 var test = input.val(), 339 lastMatch = -1, 340 i, 341 c, 342 pos; 343 344 for (i = 0, pos = 0; i < len; i++) { 345 if (tests[i]) { 346 buffer[i] = getPlaceholder(i); 347 while (pos++ < test.length) { 348 c = test.charAt(pos - 1); 349 if (tests[i].test(c)) { 350 buffer[i] = c; 351 lastMatch = i; 352 break; 353 } 354 } 355 if (pos > test.length) { 356 clearBuffer(i + 1, len); 357 break; 358 } 359 } else { 360 if (buffer[i] === test.charAt(pos)) { 361 pos++; 362 } 363 if( i < partialPosition){ 364 lastMatch = i; 365 } 366 } 367 } 368 if (allow) { 369 writeBuffer(); 370 } else if (lastMatch + 1 < partialPosition) { 371 if (settings.autoclear || buffer.join('') === defaultBuffer) { 372 // Invalid value. Remove it and replace it with the 373 // mask, which is the default behavior. 374 if(input.val()) input.val(""); 375 clearBuffer(0, len); 376 } else { 377 // Invalid value, but we opt to show the value to the 378 // user and allow them to correct their mistake. 379 writeBuffer(); 380 } 381 } else { 382 writeBuffer(); 383 input.val(input.val().substring(0, lastMatch + 1)); 384 } 385 return (partialPosition ? i : firstNonMaskPos);
386 } 387 388 input.data($.mask.dataName,function(){ 389 return $.map(buffer, function(c, i) { 390 return tests[i]&&c!=getPlaceholder(i) ? c : null; 391 }).join(''); 392 }); 393 394 395 input 396 .one("unmask", function() { 397 input 398 .off(".mask") 399 .removeData($.mask.dataName); 400 }) 401 .on("focus.mask", function() { 402 if (input.prop("readonly")){ 403 return; 404 } 405 406 clearTimeout(caretTimeoutId); 407 var pos; 408 409 focusText = input.val(); 410 411 pos = checkVal(); 412 413 caretTimeoutId = setTimeout(function(){ 414 if(input.get(0) !== document.activeElement){ 415 return; 416 } 417 writeBuffer(); 418 if (pos == mask.replace("?","").length) { 419 input.caret(0, pos); 420 } else { 421 input.caret(pos); 422 } 423 }, 10); 424 }) 425 .on("blur.mask", blurEvent) 426 .on("keydown.mask", keydownEvent) 427 .on("keypress.mask", keypressEvent) 428 .on("input.mask paste.mask", function() { 429 if (input.prop("readonly")){ 430 return; 431 } 432 433 setTimeout(function() { 434 var pos=checkVal(true); 435 input.caret(pos); 436 tryFireCompleted(); 437 }, 0); 438 }); 439 if (chrome && android) 440 { 441 input 442 .off('input.mask') 443 .on('input.mask', androidInputEvent); 444 } 445 checkVal(); //Perform initial check for existing values 446 }); 447 } 448}); 449}));
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.