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 14 var 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 var nextPos = checkVal(true); 211 var curPos = pos.end; 212 while (curPos > 0 && !tests[curPos-1]) { 213 curPos--; 214 } 215 if (curPos === 0) { 216 curPos = nextPos; 217 } 218 pos.begin = curPos; 219 setTimeout(function() { 220 proxy();
221 tryFireCompleted(); 222 }, 0); 223 } else { 224 pos.begin = checkVal(true); 225 setTimeout(function() { 226 proxy(); 227 tryFireCompleted(); 228 }, 0); 229 } 230 } 231 232 233 function blurEvent(e) { 234 checkVal(); 235 236 if (input.val() != focusText) 237 input.change(); 238 } 239 240 function keydownEvent(e) { 241 if (input.prop("readonly")){ 242 return; 243 } 244 245 var k = e.which || e.keyCode, 246 pos, 247 begin, 248 end; 249 oldVal = input.val(); 250 //backspace, delete, and escape get special treatment 251 if (k === 8 || k === 46 || (iPhone && k === 127)) { 252 pos = input.caret(); 253 begin = pos.begin; 254 end = pos.end; 255 256 if (end - begin === 0) { 257 begin=k!==46?seekPrev(begin):(end=seekNext(begin-1)); 258 end=k===46?seekNext(end):end; 259 } 260 clearBuffer(begin, end); 261 shiftL(begin, end - 1); 262 263 e.preventDefault(); 264 } else if( k === 13 ) { // enter 265 blurEvent.call(this, e); 266 } else if (k === 27) { // escape 267 input.val(focusText); 268 input.caret(0, checkVal()); 269 e.preventDefault(); 270 } 271 } 272 273 function keypressEvent(e) { 274 if (input.prop("readonly")){ 275 return; 276 } 277 278 var k = e.which || e.keyCode, 279 pos = input.caret(), 280 p, 281 c, 282 next; 283 if (e.ctrlKey || e.altKey || e.metaKey || k < 32) {//Ignore 284 return; 285 } else if ( k && k !== 13 ) { 286 if (pos.end - pos.begin !== 0){ 287 clearBuffer(pos.begin, pos.end); 288 shiftL(pos.begin, pos.end-1); 289 } 290 291 p = seekNext(pos.begin - 1); 292 if (p < len) { 293 c = String.fromCharCode(k); 294 if (tests[p].test(c)) { 295 shiftR(p); 296 297 buffer[p] = c; 298 writeBuffer(); 299 next = seekNext(p); 300 301 if(android){ 302 //Path for CSP Violation on FireFox OS 1.1 303 var proxy = function() { 304 $.proxy($.fn.caret,input,next)(); 305 }; 306 307 setTimeout(proxy,0); 308 }else{ 309 input.caret(next); 310 } 311 if(pos.begin <= lastRequiredNonMaskPos){ 312 tryFireCompleted(); 313 } 314 } 315 } 316 e.preventDefault(); 317 } 318 } 319 320 function clearBuffer(start, end) { 321 var i; 322 for (i = start; i < end && i < len; i++) { 323 if (tests[i]) { 324 buffer[i] = getPlaceholder(i); 325 } 326 } 327 } 328 329 function writeBuffer() { input.val(buffer.join('')); } 330 331 function checkVal(allow) { 332 //try to place characters where they belong 333 var test = input.val(), 334 lastMatch = -1, 335 i, 336 c, 337 pos; 338 339 for (i = 0, pos = 0; i < len; i++) { 340 if (tests[i]) { 341 buffer[i] = getPlaceholder(i); 342 while (pos++ < test.length) { 343 c = test.charAt(pos - 1); 344 if (tests[i].test(c)) { 345 buffer[i] = c; 346 lastMatch = i; 347 break; 348 } 349 } 350 if (pos > test.length) { 351 clearBuffer(i + 1, len); 352 break; 353 } 354 } else { 355 if (buffer[i] === test.charAt(pos)) { 356 pos++; 357 } 358 if( i < partialPosition){ 359 lastMatch = i; 360 } 361 } 362 } 363 if (allow) { 364 writeBuffer(); 365 } else if (lastMatch + 1 < partialPosition) { 366 if (settings.autoclear || buffer.join('') === defaultBuffer) { 367 // Invalid value. Remove it and replace it with the 368 // mask, which is the default behavior. 369 if(input.val()) input.val(""); 370 clearBuffer(0, len); 371 } else { 372 // Invalid value, but we opt to show the value to the 373 // user and allow them to correct their mistake. 374 writeBuffer(); 375 } 376 } else { 377 writeBuffer(); 378 input.val(input.val().substring(0, lastMatch + 1)); 379 } 380 return (partialPosition ? i : firstNonMaskPos); 381 } 382 383 input.data($.mask.dataName,function(){ 384 return $.map(buffer, function(c, i) { 385 return tests[i]&&c!=getPlaceholder(i) ? c : null; 386 }).join(''); 387 }); 388 389 390 input 391 .one("unmask", function() { 392 input 393 .off(".mask") 394 .removeData($.mask.dataName); 395 }) 396 .on("focus.mask", function() { 397 if (input.prop("readonly")){ 398 return; 399 } 400 401 clearTimeout(caretTimeoutId); 402 var pos; 403 404 focusText = input.val(); 405 406 pos = checkVal(); 407 408 caretTimeoutId = setTimeout(function(){ 409 if(input.get(0) !== document.activeElement){ 410 return; 411 } 412 writeBuffer(); 413 if (pos == mask.replace("?","").length) { 414 input.caret(0, pos); 415 } else { 416 input.caret(pos); 417 } 418 }, 10); 419 }) 420 .on("blur.mask", blurEvent)
421 .on("keydown.mask", keydownEvent) 422 .on("keypress.mask", keypressEvent) 423 .on("input.mask paste.mask", function() { 424 if (input.prop("readonly")){ 425 return; 426 } 427 428 setTimeout(function() { 429 var pos=checkVal(true); 430 input.caret(pos); 431 tryFireCompleted(); 432 }, 0); 433 }); 434 if (chrome && android) 435 { 436 input 437 .off('input.mask') 438 .on('input.mask', androidInputEvent); 439 } 440 checkVal(); //Perform initial check for existing values 441 }); 442 } 443 }); 444}));
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.