1/*1789557306000*/
vendor: 22,104 bytes, lines 2-574
2/** 3 * jquery.mask.js 4 * @version: v1.14.16 5 * @author: Igor Escobar 6 * 7 * Created by Igor Escobar on 2012-03-10. Please report any bug at github.com/igorescobar/jQuery-Mask-Plugin 8 * 9 * Copyright (c) 2012 Igor Escobar http://igorescobar.com 10 * 11 * The MIT License (http://www.opensource.org/licenses/mit-license.php) 12 * 13 * Permission is hereby granted, free of charge, to any person 14 * obtaining a copy of this software and associated documentation 15 * files (the "Software"), to deal in the Software without 16 * restriction, including without limitation the rights to use, 17 * copy, modify, merge, publish, distribute, sublicense, and/or sell 18 * copies of the Software, and to permit persons to whom the 19 * Software is furnished to do so, subject to the following 20 * conditions: 21 * 22 * The above copyright notice and this permission notice shall be 23 * included in all copies or substantial portions of the Software. 24 * 25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 27 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 29 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 30 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 31 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 32 * OTHER DEALINGS IN THE SOFTWARE. 33 */ 34 35/* jshint laxbreak: true */ 36/* jshint maxcomplexity:17 */ 37/* global define */ 38 39// UMD (Universal Module Definition) patterns for JavaScript modules that work everywhere. 40// https://github.com/umdjs/umd/blob/master/templates/jqueryPlugin.js 41(function (factory, jQuery, Zepto) { 42 43 if (typeof define === 'function' && define.amd) { 44 define(['jquery'], factory); 45 } else if (typeof exports === 'object' && typeof Meteor === 'undefined') { 46 module.exports = factory(require('jquery')); 47 } else { 48 factory(jQuery || Zepto); 49 } 50 51}(function ($) { 52 'use strict'; 53 54 var Mask = function (el, mask, options) { 55 56 var p = { 57 invalid: [], 58 getCaret: function () { 59 try { 60 var sel, 61 pos = 0, 62 ctrl = el.get(0), 63 dSel = document.selection, 64 cSelStart = ctrl.selectionStart; 65 66 // IE Support 67 if (dSel && navigator.appVersion.indexOf('MSIE 10') === -1) { 68 sel = dSel.createRange(); 69 sel.moveStart('character', -p.val().length); 70 pos = sel.text.length; 71 } 72 // Firefox support 73 else if (cSelStart || cSelStart === '0') { 74 pos = cSelStart; 75 } 76 77 return pos; 78 } catch (e) {} 79 }, 80 setCaret: function(pos) { 81 try { 82 if (el.is(':focus')) { 83 var range, ctrl = el.get(0); 84 85 // Firefox, WebKit, etc.. 86 if (ctrl.setSelectionRange) { 87 ctrl.setSelectionRange(pos, pos); 88 } else { // IE 89 range = ctrl.createTextRange(); 90 range.collapse(true); 91 range.moveEnd('character', pos); 92 range.moveStart('character', pos); 93 range.select(); 94 } 95 } 96 } catch (e) {} 97 }, 98 events: function() { 99 el 100 .on('keydown.mask', function(e) { 101 el.data('mask-keycode', e.keyCode || e.which); 102 el.data('mask-previus-value', el.val()); 103 el.data('mask-previus-caret-pos', p.getCaret()); 104 p.maskDigitPosMapOld = p.maskDigitPosMap; 105 }) 106 .on($.jMaskGlobals.useInput ? 'input.mask' : 'keyup.mask', p.behaviour) 107 .on('paste.mask drop.mask', function() { 108 setTimeout(function() { 109 el.keydown().keyup(); 110 }, 100); 111 }) 112 .on('change.mask', function(){ 113 el.data('changed', true); 114 }) 115 .on('blur.mask', function(){ 116 if (oldValue !== p.val() && !el.data('changed')) { 117 el.trigger('change'); 118 } 119 el.data('changed', false); 120 }) 121 // it's very important that this callback remains in this position 122 // otherwhise oldValue it's going to work buggy 123 .on('blur.mask', function() { 124 oldValue = p.val(); 125 }) 126 // select all text on focus 127 .on('focus.mask', function (e) { 128 if (options.selectOnFocus === true) { 129 $(e.target).select(); 130 } 131 }) 132 // clear the value if it not complete the mask 133 .on('focusout.mask', function() { 134 if (options.clearIfNotMatch && !regexMask.test(p.val())) { 135 p.val(''); 136 } 137 }); 138 }, 139 getRegexMask: function() { 140 var maskChunks = [], translation, pattern, optional, recursive, oRecursive, r; 141 142 for (var i = 0; i < mask.length; i++) { 143 translation = jMask.translation[mask.charAt(i)]; 144 145 if (translation) { 146 147 pattern = translation.pattern.toString().replace(/.{1}$|^.{1}/g, ''); 148 optional = translation.optional; 149 recursive = translation.recursive; 150 151 if (recursive) { 152 maskChunks.push(mask.charAt(i)); 153 oRecursive = {digit: mask.charAt(i), pattern: pattern}; 154 } else { 155 maskChunks.push(!optional && !recursive ? pattern : (pattern + '?')); 156 } 157 158 } else { 159 maskChunks.push(mask.charAt(i).replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')); 160 } 161 } 162 163 r = maskChunks.join(''); 164 165 if (oRecursive) { 166 r = r.replace(new RegExp('(' + oRecursive.digit + '(.*' + oRecursive.digit + ')?)'), '($1)?') 167 .replace(new RegExp(oRecursive.digit, 'g'), oRecursive.pattern); 168 } 169 170 return new RegExp(r); 171 }, 172 destroyEvents: function() { 173 el.off(['input', 'keydown', 'keyup', 'paste', 'drop', 'blur', 'focusout', ''].join('.mask ')); 174 }, 175 val: function(v) { 176 var isInput = el.is('input'), 177 method = isInput ? 'val' : 'text', 178 r; 179 180 if (arguments.length > 0) { 181 if (el[method]() !== v) { 182 el[method](v); 183 } 184 r = el; 185 } else { 186 r = el[method](); 187 } 188 189 return r; 190 }, 191 calculateCaretPosition: function(oldVal) { 192 var newVal = p.getMasked(), 193 caretPosNew = p.getCaret(); 194 if (oldVal !== newVal) { 195 var caretPosOld = el.data('mask-previus-caret-pos') || 0, 196 newValL = newVal.length, 197 oldValL = oldVal.length, 198 maskDigitsBeforeCaret = 0, 199 maskDigitsAfterCaret = 0, 200 maskDigitsBeforeCaretAll = 0, 201 maskDigitsBeforeCaretAllOld = 0, 202 i = 0; 203 204 for (i = caretPosNew; i < newValL; i++) { 205 if (!p.maskDigitPosMap[i]) { 206 break; 207 } 208 maskDigitsAfterCaret++; 209 } 210 211 for (i = caretPosNew - 1; i >= 0; i--) { 212 if (!p.maskDigitPosMap[i]) { 213 break; 214 } 215 maskDigitsBeforeCaret++; 216 } 217 218 for (i = caretPosNew - 1; i >= 0; i--) { 219 if (p.maskDigitPosMap[i]) { 220 maskDigitsBeforeCaretAll++; 221 } 222 } 223 224 for (i = caretPosOld - 1; i >= 0; i--) { 225 if (p.maskDigitPosMapOld[i]) { 226 maskDigitsBeforeCaretAllOld++; 227 } 228 } 229 230 // if the cursor is at the end keep it there 231 if (caretPosNew > oldValL) { 232 caretPosNew = newValL * 10; 233 } else if (caretPosOld >= caretPosNew && caretPosOld !== oldValL) { 234 if (!p.maskDigitPosMapOld[caretPosNew]) { 235 var caretPos = caretPosNew; 236 caretPosNew -= maskDigitsBeforeCaretAllOld - maskDigitsBeforeCaretAll; 237 caretPosNew -= maskDigitsBeforeCaret; 238 if (p.maskDigitPosMap[caretPosNew]) { 239 caretPosNew = caretPos; 240 } 241 } 242 } 243 else if (caretPosNew > caretPosOld) { 244 caretPosNew += maskDigitsBeforeCaretAll - maskDigitsBeforeCaretAllOld; 245 caretPosNew += maskDigitsAfterCaret; 246 } 247 } 248 return caretPosNew; 249 }, 250 behaviour: function(e) { 251 e = e || window.event; 252 p.invalid = []; 253 254 var keyCode = el.data('mask-keycode'); 255 256 if ($.inArray(keyCode, jMask.byPassKeys) === -1) { 257 var newVal = p.getMasked(), 258 caretPos = p.getCaret(), 259 oldVal = el.data('mask-previus-value') || ''; 260 261 // this is a compensation to devices/browsers that don't compensate 262 // caret positioning the right way 263 setTimeout(function() { 264 p.setCaret(p.calculateCaretPosition(oldVal)); 265 }, $.jMaskGlobals.keyStrokeCompensation); 266 267 p.val(newVal); 268 p.setCaret(caretPos); 269 return p.callbacks(e); 270 } 271 }, 272 getMasked: function(skipMaskChars, val) { 273 var buf = [], 274 value = val === undefined ? p.val() : val + '', 275 m = 0, maskLen = mask.length, 276 v = 0, valLen = value.length, 277 offset = 1, addMethod = 'push', 278 resetPos = -1, 279 maskDigitCount = 0, 280 maskDigitPosArr = [], 281 lastMaskChar, 282 check; 283 284 if (options.reverse) { 285 addMethod = 'unshift'; 286 offset = -1; 287 lastMaskChar = 0; 288 m = maskLen - 1; 289 v = valLen - 1; 290 check = function () { 291 return m > -1 && v > -1; 292 }; 293 } else { 294 lastMaskChar = maskLen - 1; 295 check = function () { 296 return m < maskLen && v < valLen; 297 }; 298 } 299 300 var lastUntranslatedMaskChar; 301 while (check()) { 302 var maskDigit = mask.charAt(m), 303 valDigit = value.charAt(v), 304 translation = jMask.translation[maskDigit]; 305 306 if (translation) { 307 if (valDigit.match(translation.pattern)) { 308 buf[addMethod](valDigit); 309 if (translation.recursive) { 310 if (resetPos === -1) { 311 resetPos = m; 312 } else if (m === lastMaskChar && m !== resetPos) { 313 m = resetPos - offset; 314 } 315 316 if (lastMaskChar === resetPos) { 317 m -= offset; 318 } 319 } 320 m += offset; 321 } else if (valDigit === lastUntranslatedMaskChar) { 322 // matched the last untranslated (raw) mask character that we encountered 323 // likely an insert offset the mask character from the last entry; fall 324 // through and only increment v 325 maskDigitCount--; 326 lastUntranslatedMaskChar = undefined; 327 } else if (translation.optional) { 328 m += offset; 329 v -= offset; 330 } else if (translation.fallback) { 331 buf[addMethod](translation.fallback); 332 m += offset; 333 v -= offset; 334 } else { 335 p.invalid.push({p: v, v: valDigit, e: translation.pattern}); 336 } 337 v += offset; 338 } else { 339 if (!skipMaskChars) { 340 buf[addMethod](maskDigit); 341 } 342 343 if (valDigit === maskDigit) { 344 maskDigitPosArr.push(v); 345 v += offset; 346 } else { 347 lastUntranslatedMaskChar = maskDigit; 348 maskDigitPosArr.push(v + maskDigitCount); 349 maskDigitCount++; 350 } 351 352 m += offset; 353 } 354 } 355 356 var lastMaskCharDigit = mask.charAt(lastMaskChar); 357 if (maskLen === valLen + 1 && !jMask.translation[lastMaskCharDigit]) { 358 buf.push(lastMaskCharDigit); 359 } 360 361 var newVal = buf.join(''); 362 p.mapMaskdigitPositions(newVal, maskDigitPosArr, valLen); 363 return newVal; 364 }, 365 mapMaskdigitPositions: function(newVal, maskDigitPosArr, valLen) { 366 var maskDiff = options.reverse ? newVal.length - valLen : 0; 367 p.maskDigitPosMap = {}; 368 for (var i = 0; i < maskDigitPosArr.length; i++) { 369 p.maskDigitPosMap[maskDigitPosArr[i] + maskDiff] = 1; 370 } 371 }, 372 callbacks: function (e) { 373 var val = p.val(), 374 changed = val !== oldValue, 375 defaultArgs = [val, e, el, options], 376 callback = function(name, criteria, args) { 377 if (typeof options[name] === 'function' && criteria) { 378 options[name].apply(this, args); 379 } 380 }; 381 382 callback('onChange', changed === true, defaultArgs); 383 callback('onKeyPress', changed === true, defaultArgs); 384 callback('onComplete', val.length === mask.length, defaultArgs); 385 callback('onInvalid', p.invalid.length > 0, [val, e, el, p.invalid, options]); 386 } 387 }; 388 389 el = $(el); 390 var jMask = this, oldValue = p.val(), regexMask; 391 392 mask = typeof mask === 'function' ? mask(p.val(), undefined, el, options) : mask; 393 394 // public methods 395 jMask.mask = mask; 396 jMask.options = options; 397 jMask.remove = function() { 398 var caret = p.getCaret(); 399 if (jMask.options.placeholder) { 400 el.removeAttr('placeholder'); 401 } 402 if (el.data('mask-maxlength')) { 403 el.removeAttr('maxlength'); 404 } 405 p.destroyEvents(); 406 p.val(jMask.getCleanVal()); 407 p.setCaret(caret); 408 return el; 409 }; 410 411 // get value without mask 412 jMask.getCleanVal = function() { 413 return p.getMasked(true); 414 }; 415 416 // get masked value without the value being in the input or element 417 jMask.getMaskedVal = function(val) { 418 return p.getMasked(false, val); 419 }; 420 421 jMask.init = function(onlyMask) { 422 onlyMask = onlyMask || false; 423 options = options || {}; 424 425 jMask.clearIfNotMatch = $.jMaskGlobals.clearIfNotMatch; 426 jMask.byPassKeys = $.jMaskGlobals.byPassKeys; 427 jMask.translation = $.extend({}, $.jMaskGlobals.translation, options.translation); 428 429 jMask = $.extend(true, {}, jMask, options); 430 431 regexMask = p.getRegexMask(); 432 433 if (onlyMask) { 434 p.events(); 435 p.val(p.getMasked()); 436 } else { 437 if (options.placeholder) { 438 el.attr('placeholder' , options.placeholder); 439 } 440 441 // this is necessary, otherwise if the user submit the form 442 // and then press the "back" button, the autocomplete will erase 443 // the data. Works fine on IE9+, FF, Opera, Safari. 444 if (el.data('mask')) { 445 el.attr('autocomplete', 'off'); 446 } 447 448 // detect if is necessary let the user type freely. 449 // for is a lot faster than forEach. 450 for (var i = 0, maxlength = true; i < mask.length; i++) { 451 var translation = jMask.translation[mask.charAt(i)]; 452 if (translation && translation.recursive) { 453 maxlength = false; 454 break; 455 } 456 } 457 458 if (maxlength) { 459 el.attr('maxlength', mask.length).data('mask-maxlength', true); 460 } 461 462 p.destroyEvents(); 463 p.events(); 464 465 var caret = p.getCaret(); 466 p.val(p.getMasked()); 467 p.setCaret(caret); 468 } 469 }; 470 471 jMask.init(!el.is('input')); 472 }; 473 474 $.maskWatchers = {}; 475 var HTMLAttributes = function () { 476 var input = $(this), 477 options = {}, 478 prefix = 'data-mask-', 479 mask = input.attr('data-mask'); 480 481 if (input.attr(prefix + 'reverse')) { 482 options.reverse = true; 483 } 484 485 if (input.attr(prefix + 'clearifnotmatch')) { 486 options.clearIfNotMatch = true; 487 } 488 489 if (input.attr(prefix + 'selectonfocus') === 'true') { 490 options.selectOnFocus = true; 491 } 492 493 if (notSameMaskObject(input, mask, options)) { 494 return input.data('mask', new Mask(this, mask, options)); 495 } 496 }, 497 notSameMaskObject = function(field, mask, options) { 498 options = options || {}; 499 var maskObject = $(field).data('mask'), 500 stringify = JSON.stringify, 501 value = $(field).val() || $(field).text(); 502 try { 503 if (typeof mask === 'function') { 504 mask = mask(value); 505 } 506 return typeof maskObject !== 'object' || stringify(maskObject.options) !== stringify(options) || maskObject.mask !== mask; 507 } catch (e) {} 508 }, 509 eventSupported = function(eventName) { 510 var el = document.createElement('div'), isSupported; 511 512 eventName = 'on' + eventName; 513 isSupported = (eventName in el); 514 515 if ( !isSupported ) { 516 el.setAttribute(eventName, 'return;'); 517 isSupported = typeof el[eventName] === 'function'; 518 } 519 el = null; 520 521 return isSupported; 522 }; 523 524 $.fn.mask = function(mask, options) { 525 options = options || {}; 526 var selector = this.selector, 527 globals = $.jMaskGlobals, 528 interval = globals.watchInterval, 529 watchInputs = options.watchInputs || globals.watchInputs, 530 maskFunction = function() { 531 if (notSameMaskObject(this, mask, options)) { 532 return $(this).data('mask', new Mask(this, mask, options)); 533 } 534 }; 535 536 $(this).each(maskFunction); 537 538 if (selector && selector !== '' && watchInputs) { 539 clearInterval($.maskWatchers[selector]); 540 $.maskWatchers[selector] = setInterval(function(){ 541 $(document).find(selector).each(maskFunction); 542 }, interval); 543 } 544 return this; 545 }; 546 547 $.fn.masked = function(val) { 548 return this.data('mask').getMaskedVal(val); 549 }; 550 551 $.fn.unmask = function() { 552 clearInterval($.maskWatchers[this.selector]); 553 delete $.maskWatchers[this.selector]; 554 return this.each(function() { 555 var dataMask = $(this).data('mask'); 556 if (dataMask) { 557 dataMask.remove().removeData('mask'); 558 } 559 }); 560 }; 561 562 $.fn.cleanVal = function() { 563 return this.data('mask').getCleanVal(); 564 }; 565 566 $.applyDataMask = function(selector) { 567 selector = selector || $.jMaskGlobals.maskElements; 568 var $selector = (selector instanceof $) ? selector : $(selector); 569 $selector.filter($.jMaskGlobals.dataMaskAttr).each(HTMLAttributes); 570 }; 571 572 var globals = { 573 maskElements: 'input,td,span,div', 574 dataMaskAttr: '
vendor: 1,072 bytes, lines 574-605
574[data-mask]', 575 dataMask: true, 576 watchInterval: 300, 577 watchInputs: true, 578 keyStrokeCompensation: 10, 579 // old versions of chrome dont work great with input event 580 useInput: !/Chrome\/[2-4][0-9]|SamsungBrowser/.test(window.navigator.userAgent) && eventSupported('input'), 581 watchDataMask: false, 582 byPassKeys: [9, 16, 17, 18, 36, 37, 38, 39, 40, 91], 583 translation: { 584 '9': {pattern: /\d/}, 585 '0': {pattern: /\d/, optional: true}, 586 '#': {pattern: /\d/, recursive: true}, 587 'A': {pattern: /[a-zA-Z0-9]/}, 588 'S': {pattern: /[a-zA-Z]/} 589 } 590 }; 591 592 $.jMaskGlobals = $.jMaskGlobals || {}; 593 globals = $.jMaskGlobals = $.extend(true, {}, globals, $.jMaskGlobals); 594 595 // looking for inputs with data-mask attribute 596 if (globals.dataMask) { 597 $.applyDataMask(); 598 } 599 600 setInterval(function() { 601 if ($.jMaskGlobals.watchDataMask) { 602 $.applyDataMask(); 603 } 604 }, globals.watchInterval); 605}, window.jQuery, window.Zepto));
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.