1/******/ (function(modules) { // webpackBootstrap 2/******/ // The module cache 3/******/ var installedModules = {}; 4/******/ 5/******/ // The require function 6/******/ function __webpack_require__(moduleId) { 7/******/ 8/******/ // Check if module is in cache 9/******/ if(installedModules[moduleId]) { 10/******/ return installedModules[moduleId].exports; 11/******/ } 12/******/ // Create a new module (and put it into the cache) 13/******/ var module = installedModules[moduleId] = { 14/******/ i: moduleId, 15/******/ l: false, 16/******/ exports: {} 17/******/ }; 18/******/ 19/******/ // Execute the module function 20/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21/******/ 22/******/ // Flag the module as loaded 23/******/ module.l = true; 24/******/ 25/******/ // Return the exports of the module 26/******/ return module.exports; 27/******/ } 28/******/ 29/******/ 30/******/ // expose the modules object (__webpack_modules__) 31/******/ __webpack_require__.m = modules; 32/******/ 33/******/ // expose the module cache 34/******/ __webpack_require__.c = installedModules; 35/******/ 36/******/ // define getter function for harmony exports 37/******/ __webpack_require__.d = function(exports, name, getter) { 38/******/ if(!__webpack_require__.o(exports, name)) { 39/******/ Object.defineProperty(exports, name, { 40/******/ configurable: false, 41/******/ enumerable: true, 42/******/ get: getter 43/******/ }); 44/******/ } 45/******/ }; 46/******/ 47/******/ // getDefaultExport function for compatibility with non-harmony modules 48/******/ __webpack_require__.n = function(module) { 49/******/ var getter = module && module.__esModule ? 50/******/ function getDefault() { return module['default']; } : 51/******/ function getModuleExports() { return module; }; 52/******/ __webpack_require__.d(getter, 'a', getter); 53/******/ return getter; 54/******/ }; 55/******/ 56/******/ // Object.prototype.hasOwnProperty.call 57/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 58/******/ 59/******/ // __webpack_public_path__ 60/******/ __webpack_require__.p = ""; 61/******/ 62/******/ // Load entry module and return exports 63/******/ return __webpack_require__(__webpack_require__.s = 35); 64/******/ }) 65/************************************************************************/ 66/******/ ([ 67/* 0 */ 68/***/ (function(module, exports, __webpack_require__) { 69 70var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! 71 * jQuery JavaScript Library v1.12.4 72 * http://jquery.com/ 73 * 74 * Includes Sizzle.js 75 * http://sizzlejs.com/ 76 * 77 * Copyright jQuery Foundation and other contributors 78 * Released under the MIT license 79 * http://jquery.org/license 80 * 81 * Date: 2016-05-20T17:17Z 82 */ 83 84(function (global, factory) { 85 86 if (typeof module === "object" && typeof module.exports === "object") { 87 // For CommonJS and CommonJS-like environments where a proper `window` 88 // is present, execute the factory and get jQuery. 89 // For environments that do not have a `window` with a `document` 90 // (such as Node.js), expose a factory as module.exports. 91 // This accentuates the need for the creation of a real `window`. 92 // e.g. var jQuery = require("jquery")(window); 93 // See ticket #14549 for more info. 94 module.exports = global.document ? factory(global, true) : function (w) { 95 if (!w.document) { 96 throw new Error("jQuery requires a window with a document"); 97 } 98 return factory(w); 99 }; 100 } else { 101 factory(global); 102 } 103 104 // Pass this if window is not defined yet 105})(typeof window !== "undefined" ? window : this, function (window, noGlobal) { 106 107 // Support: Firefox 18+ 108 // Can't be in strict mode, several libs including ASP.NET trace 109 // the stack via arguments.caller.callee and Firefox dies if
vendor: 4,159 bytes, lines 110-294
110 // you try to trace through "use strict" call chains. (#13335) 111 //"use strict"; 112 var deletedIds = []; 113 114 var document = window.document; 115 116 var slice = deletedIds.slice; 117 118 var concat = deletedIds.concat; 119 120 var push = deletedIds.push; 121 122 var indexOf = deletedIds.indexOf; 123 124 var class2type = {}; 125 126 var toString = class2type.toString; 127 128 var hasOwn = class2type.hasOwnProperty; 129 130 var support = {}; 131 132 var version = "1.12.4", 133 134 135 // Define a local copy of jQuery 136 jQuery = function (selector, context) { 137 138 // The jQuery object is actually just the init constructor 'enhanced' 139 // Need init if jQuery is called (just allow error to be thrown if not included) 140 return new jQuery.fn.init(selector, context); 141 }, 142 143 144 // Support: Android<4.1, IE<9 145 // Make sure we trim BOM and NBSP 146 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, 147 148 149 // Matches dashed string for camelizing 150 rmsPrefix = /^-ms-/, 151 rdashAlpha = /-([\da-z])/gi, 152 153 154 // Used by jQuery.camelCase as callback to replace() 155 fcamelCase = function (all, letter) { 156 return letter.toUpperCase(); 157 }; 158 159 jQuery.fn = jQuery.prototype = { 160 161 // The current version of jQuery being used 162 jquery: version, 163 164 constructor: jQuery, 165 166 // Start with an empty selector 167 selector: "", 168 169 // The default length of a jQuery object is 0 170 length: 0, 171 172 toArray: function () { 173 return slice.call(this); 174 }, 175 176 // Get the Nth element in the matched element set OR 177 // Get the whole matched element set as a clean array 178 get: function (num) { 179 return num != null ? 180 181 // Return just the one element from the set 182 num < 0 ? this[num + this.length] : this[num] : 183 184 // Return all the elements in a clean array 185 slice.call(this); 186 }, 187 188 // Take an array of elements and push it onto the stack 189 // (returning the new matched element set) 190 pushStack: function (elems) { 191 192 // Build a new jQuery matched element set 193 var ret = jQuery.merge(this.constructor(), elems); 194 195 // Add the old object onto the stack (as a reference) 196 ret.prevObject = this; 197 ret.context = this.context; 198 199 // Return the newly-formed element set 200 return ret; 201 }, 202 203 // Execute a callback for every element in the matched set. 204 each: function (callback) { 205 return jQuery.each(this, callback); 206 }, 207 208 map: function (callback) { 209 return this.pushStack(jQuery.map(this, function (elem, i) { 210 return callback.call(elem, i, elem); 211 })); 212 }, 213 214 slice: function () { 215 return this.pushStack(slice.apply(this, arguments)); 216 }, 217 218 first: function () { 219 return this.eq(0); 220 }, 221 222 last: function () { 223 return this.eq(-1); 224 }, 225 226 eq: function (i) { 227 var len = this.length, 228 j = +i + (i < 0 ? len : 0); 229 return this.pushStack(j >= 0 && j < len ? [this[j]] : []); 230 }, 231 232 end: function () { 233 return this.prevObject || this.constructor(); 234 }, 235 236 // For internal use only. 237 // Behaves like an Array's method, not like a jQuery method. 238 push: push, 239 sort: deletedIds.sort, 240 splice: deletedIds.splice 241 }; 242 243 jQuery.extend = jQuery.fn.extend = function () { 244 var src, 245 copyIsArray, 246 copy, 247 name, 248 options, 249 clone, 250 target = arguments[0] || {}, 251 i = 1, 252 length = arguments.length, 253 deep = false; 254 255 // Handle a deep copy situation 256 if (typeof target === "boolean") { 257 deep = target; 258 259 // skip the boolean and the target 260 target = arguments[i] || {}; 261 i++; 262 } 263 264 // Handle case when target is a string or something (possible in deep copy) 265 if (typeof target !== "object" && !jQuery.isFunction(target)) { 266 target = {}; 267 } 268 269 // extend jQuery itself if only one argument is passed 270 if (i === length) { 271 target = this; 272 i--; 273 } 274 275 for (; i < length; i++) { 276 277 // Only deal with non-null/undefined values 278 if ((options = arguments[i]) != null) { 279 280 // Extend the base object 281 for (name in options) { 282 src = target[name]; 283 copy = options[name]; 284 285 // Prevent never-ending loop 286 if (target === copy) { 287 continue; 288 } 289 290 // Recurse if we're merging plain objects or arrays 291 if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) { 292 293 if (copyIsArray) { 294 copyIsArray = false;
vendor: 8,553 bytes, lines 295-636
295 clone = src && jQuery.isArray(src) ? src : []; 296 } else { 297 clone = src && jQuery.isPlainObject(src) ? src : {}; 298 } 299 300 // Never move original objects, clone them 301 target[name] = jQuery.extend(deep, clone, copy); 302 303 // Don't bring in undefined values 304 } else if (copy !== undefined) { 305 target[name] = copy; 306 } 307 } 308 } 309 } 310 311 // Return the modified object 312 return target; 313 }; 314 315 jQuery.extend({ 316 317 // Unique for each copy of jQuery on the page 318 expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""), 319 320 // Assume jQuery is ready without the ready module 321 isReady: true, 322 323 error: function (msg) { 324 throw new Error(msg); 325 }, 326 327 noop: function () {}, 328 329 // See test/unit/core.js for details concerning isFunction. 330 // Since version 1.3, DOM methods and functions like alert 331 // aren't supported. They return false on IE (#2968). 332 isFunction: function (obj) { 333 return jQuery.type(obj) === "function"; 334 }, 335 336 isArray: Array.isArray || function (obj) { 337 return jQuery.type(obj) === "array"; 338 }, 339 340 isWindow: function (obj) { 341 /* jshint eqeqeq: false */ 342 return obj != null && obj == obj.window; 343 }, 344 345 isNumeric: function (obj) { 346 347 // parseFloat NaNs numeric-cast false positives (null|true|false|"") 348 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 349 // subtraction forces infinities to NaN 350 // adding 1 corrects loss of precision from parseFloat (#15100) 351 var realStringObj = obj && obj.toString(); 352 return !jQuery.isArray(obj) && realStringObj - parseFloat(realStringObj) + 1 >= 0; 353 }, 354 355 isEmptyObject: function (obj) { 356 var name; 357 for (name in obj) { 358 return false; 359 } 360 return true; 361 }, 362 363 isPlainObject: function (obj) { 364 var key; 365 366 // Must be an Object. 367 // Because of IE, we also have to check the presence of the constructor property. 368 // Make sure that DOM nodes and window objects don't pass through, as well 369 if (!obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow(obj)) { 370 return false; 371 } 372 373 try { 374 375 // Not own constructor property must be Object 376 if (obj.constructor && !hasOwn.call(obj, "constructor") && !hasOwn.call(obj.constructor.prototype, "isPrototypeOf")) { 377 return false; 378 } 379 } catch (e) { 380 381 // IE8,9 Will throw exceptions on certain host objects #9897 382 return false; 383 } 384 385 // Support: IE<9 386 // Handle iteration over inherited properties before own properties. 387 if (!support.ownFirst) { 388 for (key in obj) { 389 return hasOwn.call(obj, key); 390 } 391 } 392 393 // Own properties are enumerated firstly, so to speed up, 394 // if last one is own, then all properties are own. 395 for (key in obj) {} 396 397 return key === undefined || hasOwn.call(obj, key); 398 }, 399 400 type: function (obj) { 401 if (obj == null) { 402 return obj + ""; 403 } 404 return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj; 405 }, 406 407 // Workarounds based on findings by Jim Driscoll 408 // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context 409 globalEval: function (data) { 410 if (data && jQuery.trim(data)) { 411 412 // We use execScript on Internet Explorer 413 // We use an anonymous function so that context is window 414 // rather than jQuery in Firefox 415 (window.execScript || function (data) { 416 window["eval"].call(window, data); // jscs:ignore requireDotNotation 417 })(data); 418 } 419 }, 420 421 // Convert dashed to camelCase; used by the css and data modules 422 // Microsoft forgot to hump their vendor prefix (#9572) 423 camelCase: function (string) { 424 return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase); 425 }, 426 427 nodeName: function (elem, name) { 428 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 429 }, 430 431 each: function (obj, callback) { 432 var length, 433 i = 0; 434 435 if (isArrayLike(obj)) { 436 length = obj.length; 437 for (; i < length; i++) { 438 if (callback.call(obj[i], i, obj[i]) === false) { 439 break; 440 } 441 } 442 } else { 443 for (i in obj) { 444 if (callback.call(obj[i], i, obj[i]) === false) { 445 break; 446 } 447 } 448 } 449 450 return obj; 451 }, 452 453 // Support: Android<4.1, IE<9 454 trim: function (text) { 455 return text == null ? "" : (text + "").replace(rtrim, ""); 456 }, 457 458 // results is for internal usage only 459 makeArray: function (arr, results) { 460 var ret = results || []; 461 462 if (arr != null) { 463 if (isArrayLike(Object(arr))) { 464 jQuery.merge(ret, typeof arr === "string" ? [arr] : arr); 465 } else { 466 push.call(ret, arr); 467 } 468 } 469 470 return ret; 471 }, 472 473 inArray: function (elem, arr, i) { 474 var len; 475 476 if (arr) { 477 if (indexOf) { 478 return indexOf.call(arr, elem, i); 479 } 480 481 len = arr.length; 482 i = i ? i < 0 ? Math.max(0, len + i) : i : 0; 483 484 for (; i < len; i++) { 485 486 // Skip accessing in sparse arrays 487 if (i in arr && arr[i] === elem) { 488 return i; 489 } 490 } 491 } 492 493 return -1; 494 }, 495 496 merge: function (first, second) { 497 var len = +second.length, 498 j = 0, 499 i = first.length; 500 501 while (j < len) { 502 first[i++] = second[j++]; 503 } 504 505 // Support: IE<9 506 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) 507 if (len !== len) { 508 while (second[j] !== undefined) { 509 first[i++] = second[j++]; 510 } 511 } 512 513 first.length = i; 514 515 return first; 516 }, 517 518 grep: function (elems, callback, invert) { 519 var callbackInverse, 520 matches = [], 521 i = 0, 522 length = elems.length, 523 callbackExpect = !invert; 524 525 // Go through the array, only saving the items 526 // that pass the validator function 527 for (; i < length; i++) { 528 callbackInverse = !callback(elems[i], i); 529 if (callbackInverse !== callbackExpect) { 530 matches.push(elems[i]); 531 } 532 } 533 534 return matches; 535 }, 536 537 // arg is for internal usage only 538 map: function (elems, callback, arg) { 539 var length, 540 value, 541 i = 0, 542 ret = []; 543 544 // Go through the array, translating each of the items to their new values 545 if (isArrayLike(elems)) { 546 length = elems.length; 547 for (; i < length; i++) { 548 value = callback(elems[i], i, arg); 549 550 if (value != null) { 551 ret.push(value); 552 } 553 } 554 555 // Go through every key on the object, 556 } else { 557 for (i in elems) { 558 value = callback(elems[i], i, arg); 559 560 if (value != null) { 561 ret.push(value); 562 } 563 } 564 } 565 566 // Flatten any nested arrays 567 return concat.apply([], ret); 568 }, 569 570 // A global GUID counter for objects 571 guid: 1, 572 573 // Bind a function to a context, optionally partially applying any 574 // arguments. 575 proxy: function (fn, context) { 576 var args, proxy, tmp; 577 578 if (typeof context === "string") { 579 tmp = fn[context]; 580 context = fn; 581 fn = tmp; 582 } 583 584 // Quick check to determine if target is callable, in the spec 585 // this throws a TypeError, but we will just return undefined. 586 if (!jQuery.isFunction(fn)) { 587 return undefined; 588 } 589 590 // Simulated bind 591 args = slice.call(arguments, 2); 592 proxy = function () { 593 return fn.apply(context || this, args.concat(slice.call(arguments))); 594 }; 595 596 // Set the guid of unique handler to the same of original handler, so it can be removed 597 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 598 599 return proxy; 600 }, 601 602 now: function () { 603 return +new Date(); 604 }, 605 606 // jQuery.support is not used in Core but other projects attach their 607 // properties to it so it needs to exist. 608 support: support 609 }); 610 611 // JSHint would error on this code due to the Symbol not being defined in ES5. 612 // Defining this global in .jshintrc would create a danger of using the global 613 // unguarded in another place, it seems safer to just disable JSHint for these 614 // three lines. 615 /* jshint ignore: start */ 616 if (typeof Symbol === "function") { 617 jQuery.fn[Symbol.iterator] = deletedIds[Symbol.iterator]; 618 } 619 /* jshint ignore: end */ 620 621 // Populate the class2type map 622 jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (i, name) { 623 class2type["[object " + name + "]"] = name.toLowerCase(); 624 }); 625 626 function isArrayLike(obj) { 627 628 // Support: iOS 8.2 (not reproducible in simulator) 629 // `in` check used to prevent JIT error (gh-2145) 630 // hasOwn isn't used here due to false negatives 631 // regarding Nodelist length in IE 632 var length = !!obj && "length" in obj && obj.length, 633 type = jQuery.type(obj); 634 635 if (type === "function" || jQuery.isWindow(obj)) { 636 return false;
vendor: 4,770 bytes, lines 637-782
637 } 638 639 return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj; 640 } 641 var Sizzle = 642 /*! 643 * Sizzle CSS Selector Engine v2.2.1 644 * http://sizzlejs.com/ 645 * 646 * Copyright jQuery Foundation and other contributors 647 * Released under the MIT license 648 * http://jquery.org/license 649 * 650 * Date: 2015-10-17 651 */ 652 function (window) { 653 654 var i, 655 support, 656 Expr, 657 getText, 658 isXML, 659 tokenize, 660 compile, 661 select, 662 outermostContext, 663 sortInput, 664 hasDuplicate, 665 666 667 // Local document vars 668 setDocument, 669 document, 670 docElem, 671 documentIsHTML, 672 rbuggyQSA, 673 rbuggyMatches, 674 matches, 675 contains, 676 677 678 // Instance-specific data 679 expando = "sizzle" + 1 * new Date(), 680 preferredDoc = window.document, 681 dirruns = 0, 682 done = 0, 683 classCache = createCache(), 684 tokenCache = createCache(), 685 compilerCache = createCache(), 686 sortOrder = function (a, b) { 687 if (a === b) { 688 hasDuplicate = true; 689 } 690 return 0; 691 }, 692 693 694 // General-purpose constants 695 MAX_NEGATIVE = 1 << 31, 696 697 698 // Instance methods 699 hasOwn = {}.hasOwnProperty, 700 arr = [], 701 pop = arr.pop, 702 push_native = arr.push, 703 push = arr.push, 704 slice = arr.slice, 705 706 // Use a stripped-down indexOf as it's faster than native 707 // http://jsperf.com/thor-indexof-vs-for/5 708 indexOf = function (list, elem) { 709 var i = 0, 710 len = list.length; 711 for (; i < len; i++) { 712 if (list[i] === elem) { 713 return i; 714 } 715 } 716 return -1; 717 }, 718 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", 719 720 721 // Regular expressions 722 723 // http://www.w3.org/TR/css3-selectors/#whitespace 724 whitespace = "[\\x20\\t\\r\\n\\f]", 725 726 727 // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier 728 identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", 729 730 731 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 732 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 733 // Operator (capture 2) 734 "*([*^$|!~]?=)" + whitespace + 735 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 736 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", 737 pseudos = ":(" + identifier + ")(?:\\((" + 738 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 739 // 1. quoted (capture 3; capture 4 or capture 5) 740 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 741 // 2. simple (capture 6) 742 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 743 // 3. anything else (capture 2) 744 ".*" + ")\\)|)", 745 746 747 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 748 rwhitespace = new RegExp(whitespace + "+", "g"), 749 rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), 750 rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), 751 rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), 752 rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"), 753 rpseudo = new RegExp(pseudos), 754 ridentifier = new RegExp("^" + identifier + "$"), 755 matchExpr = { 756 "ID": new RegExp("^#(" + identifier + ")"), 757 "CLASS": new RegExp("^\\.(" + identifier + ")"), 758 "TAG": new RegExp("^(" + identifier + "|[*])"), 759 "ATTR": new RegExp("^" + attributes), 760 "PSEUDO": new RegExp("^" + pseudos), 761 "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"), 762 "bool": new RegExp("^(?:" + booleans + ")$", "i"), 763 // For use in libraries implementing .is() 764 // We use this for POS matching in `select` 765 "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i") 766 }, 767 rinputs = /^(?:input|select|textarea|button)$/i, 768 rheader = /^h\d$/i, 769 rnative = /^[^{]+\{\s*\[native \w/, 770 771 772 // Easily-parseable/retrievable ID or TAG or CLASS selectors 773 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 774 rsibling = /[+~]/, 775 rescape = /'|\\/g, 776 777 778 // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 779 runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"), 780 funescape = function (_, escaped, escapedWhitespace) { 781 var high = "0x" + escaped - 0x10000; 782 // NaN means non-codepoint
783 // Support: Firefox<24 784 // Workaround erroneous numeric interpretation of +"0x" 785 return high !== high || escapedWhitespace ? escaped : high < 0 ? 786 // BMP codepoint 787 String.fromCharCode(high + 0x10000) : 788 // Supplemental Plane codepoint (surrogate pair) 789 String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00); 790 }, 791 792 793 // Used for iframes 794 // See setDocument() 795 // Removing the function wrapper causes a "Permission Denied" 796 // error in IE 797 unloadHandler = function () { 798 setDocument(); 799 }; 800 801 // Optimize for push.apply( _, NodeList ) 802 try { 803 push.apply(arr = slice.call(preferredDoc.childNodes), preferredDoc.childNodes); 804 // Support: Android<4.0 805 // Detect silently failing push.apply 806 arr[preferredDoc.childNodes.length].nodeType; 807 } catch (e) { 808 push = { apply: arr.length ? 809 810 // Leverage slice if possible 811 function (target, els) { 812 push_native.apply(target, slice.call(els)); 813 } : 814 815 // Support: IE<9 816 // Otherwise append directly 817 function (target, els) { 818 var j = target.length, 819 i = 0; 820 // Can't trust NodeList.length 821 while (target[j++] = els[i++]) {} 822 target.length = j - 1; 823 } 824 }; 825 } 826 827 function Sizzle(selector, context, results, seed) { 828 var m, 829 i, 830 elem, 831 nid, 832 nidselect, 833 match, 834 groups, 835 newSelector, 836 newContext = context && context.ownerDocument, 837 838 839 // nodeType defaults to 9, since context defaults to document 840 nodeType = context ? context.nodeType : 9; 841 842 results = results || []; 843 844 // Return early from calls with invalid selector or context 845 if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) { 846 847 return results; 848 } 849 850 // Try to shortcut find operations (as opposed to filters) in HTML documents 851 if (!seed) { 852 853 if ((context ? context.ownerDocument || context : preferredDoc) !== document) { 854 setDocument(context); 855 } 856 context = context || document; 857 858 if (documentIsHTML) { 859 860 // If the selector is sufficiently simple, try using a "get*By*" DOM method 861 // (excepting DocumentFragment context, where the methods don't exist) 862 if (nodeType !== 11 && (match = rquickExpr.exec(selector))) { 863 864 // ID selector 865 if (m = match[1]) { 866 867 // Document context 868 if (nodeType === 9) { 869 if (elem = context.getElementById(m)) { 870 871 // Support: IE, Opera, Webkit 872 // TODO: identify versions 873 // getElementById can match elements by name instead of ID 874 if (elem.id === m) { 875 results.push(elem); 876 return results; 877 } 878 } else { 879 return results; 880 } 881 882 // Element context 883 } else { 884 885 // Support: IE, Opera, Webkit 886 // TODO: identify versions 887 // getElementById can match elements by name instead of ID 888 if (newContext && (elem = newContext.getElementById(m)) && contains(context, elem) && elem.id === m) { 889 890 results.push(elem); 891 return results; 892 } 893 } 894 895 // Type selector 896 } else if (match[2]) { 897 push.apply(results, context.getElementsByTagName(selector)); 898 return results; 899 900 // Class selector 901 } else if ((m = match[3]) && support.getElementsByClassName && context.getElementsByClassName) { 902 903 push.apply(results, context.getElementsByClassName(m)); 904 return results; 905 } 906 } 907 908 // Take advantage of querySelectorAll 909 if (support.qsa && !compilerCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector))) { 910 911 if (nodeType !== 1) { 912 newContext = context; 913 newSelector = selector; 914 915 // qSA looks outside Element context, which is not what we want 916 // Thanks to Andrew Dupont for this workaround technique 917 // Support: IE <=8 918 // Exclude object elements 919 } else if (context.nodeName.toLowerCase() !== "object") { 920 921 // Capture the context ID, setting it first if necessary 922 if (nid = context.getAttribute("id")) { 923 nid = nid.replace(rescape, "\\$&"); 924 } else { 925 context.setAttribute("id", nid = expando); 926 } 927 928 // Prefix every selector in the list 929 groups = tokenize(selector); 930 i = groups.length; 931 nidselect = ridentifier.test(nid) ? "#" + nid : "[id='" + nid + "']"; 932 while (i--) { 933 groups[i] = nidselect + " " + toSelector(groups[i]); 934 } 935 newSelector = groups.join(","); 936 937 // Expand context for sibling selectors
vendor: 18,442 bytes, lines 938-1532
938 newContext = rsibling.test(selector) && testContext(context.parentNode) || context; 939 } 940 941 if (newSelector) { 942 try { 943 push.apply(results, newContext.querySelectorAll(newSelector)); 944 return results; 945 } catch (qsaError) {} finally { 946 if (nid === expando) { 947 context.removeAttribute("id"); 948 } 949 } 950 } 951 } 952 } 953 } 954 955 // All others 956 return select(selector.replace(rtrim, "$1"), context, results, seed); 957 } 958 959 /** 960 * Create key-value caches of limited size 961 * @returns {function(string, object)} Returns the Object data after storing it on itself with 962 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 963 * deleting the oldest entry 964 */ 965 function createCache() { 966 var keys = []; 967 968 function cache(key, value) { 969 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 970 if (keys.push(key + " ") > Expr.cacheLength) { 971 // Only keep the most recent entries 972 delete cache[keys.shift()]; 973 } 974 return cache[key + " "] = value; 975 } 976 return cache; 977 } 978 979 /** 980 * Mark a function for special use by Sizzle 981 * @param {Function} fn The function to mark 982 */ 983 function markFunction(fn) { 984 fn[expando] = true; 985 return fn; 986 } 987 988 /** 989 * Support testing using an element 990 * @param {Function} fn Passed the created div and expects a boolean result 991 */ 992 function assert(fn) { 993 var div = document.createElement("div"); 994 995 try { 996 return !!fn(div); 997 } catch (e) { 998 return false; 999 } finally { 1000 // Remove from its parent by default 1001 if (div.parentNode) { 1002 div.parentNode.removeChild(div); 1003 } 1004 // release memory in IE 1005 div = null; 1006 } 1007 } 1008 1009 /** 1010 * Adds the same handler for all of the specified attrs 1011 * @param {String} attrs Pipe-separated list of attributes 1012 * @param {Function} handler The method that will be applied 1013 */ 1014 function addHandle(attrs, handler) { 1015 var arr = attrs.split("|"), 1016 i = arr.length; 1017 1018 while (i--) { 1019 Expr.attrHandle[arr[i]] = handler; 1020 } 1021 } 1022 1023 /** 1024 * Checks document order of two siblings 1025 * @param {Element} a 1026 * @param {Element} b 1027 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 1028 */ 1029 function siblingCheck(a, b) { 1030 var cur = b && a, 1031 diff = cur && a.nodeType === 1 && b.nodeType === 1 && (~b.sourceIndex || MAX_NEGATIVE) - (~a.sourceIndex || MAX_NEGATIVE); 1032 1033 // Use IE sourceIndex if available on both nodes 1034 if (diff) { 1035 return diff; 1036 } 1037 1038 // Check if b follows a 1039 if (cur) { 1040 while (cur = cur.nextSibling) { 1041 if (cur === b) { 1042 return -1; 1043 } 1044 } 1045 } 1046 1047 return a ? 1 : -1; 1048 } 1049 1050 /** 1051 * Returns a function to use in pseudos for input types 1052 * @param {String} type 1053 */ 1054 function createInputPseudo(type) { 1055 return function (elem) { 1056 var name = elem.nodeName.toLowerCase(); 1057 return name === "input" && elem.type === type; 1058 }; 1059 } 1060 1061 /** 1062 * Returns a function to use in pseudos for buttons 1063 * @param {String} type 1064 */ 1065 function createButtonPseudo(type) { 1066 return function (elem) { 1067 var name = elem.nodeName.toLowerCase(); 1068 return (name === "input" || name === "button") && elem.type === type; 1069 }; 1070 } 1071 1072 /** 1073 * Returns a function to use in pseudos for positionals 1074 * @param {Function} fn 1075 */ 1076 function createPositionalPseudo(fn) { 1077 return markFunction(function (argument) { 1078 argument = +argument; 1079 return markFunction(function (seed, matches) { 1080 var j, 1081 matchIndexes = fn([], seed.length, argument), 1082 i = matchIndexes.length; 1083 1084 // Match elements found at the specified indexes 1085 while (i--) { 1086 if (seed[j = matchIndexes[i]]) { 1087 seed[j] = !(matches[j] = seed[j]); 1088 } 1089 } 1090 }); 1091 }); 1092 } 1093 1094 /** 1095 * Checks a node for validity as a Sizzle context 1096 * @param {Element|Object=} context 1097 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 1098 */ 1099 function testContext(context) { 1100 return context && typeof context.getElementsByTagName !== "undefined" && context; 1101 } 1102 1103 // Expose support vars for convenience 1104 support = Sizzle.support = {}; 1105 1106 /** 1107 * Detects XML nodes 1108 * @param {Element|Object} elem An element or a document 1109 * @returns {Boolean} True iff elem is a non-HTML XML node 1110 */ 1111 isXML = Sizzle.isXML = function (elem) { 1112 // documentElement is verified for cases where it doesn't yet exist 1113 // (such as loading iframes in IE - #4833) 1114 var documentElement = elem && (elem.ownerDocument || elem).documentElement; 1115 return documentElement ? documentElement.nodeName !== "HTML" : false; 1116 }; 1117 1118 /** 1119 * Sets document-related variables once based on the current document 1120 * @param {Element|Object} [doc] An element or document object to use to set the document 1121 * @returns {Object} Returns the current document 1122 */ 1123 setDocument = Sizzle.setDocument = function (node) { 1124 var hasCompare, 1125 parent, 1126 doc = node ? node.ownerDocument || node : preferredDoc; 1127 1128 // Return early if doc is invalid or already selected 1129 if (doc === document || doc.nodeType !== 9 || !doc.documentElement) { 1130 return document; 1131 } 1132 1133 // Update global variables 1134 document = doc; 1135 docElem = document.documentElement; 1136 documentIsHTML = !isXML(document); 1137 1138 // Support: IE 9-11, Edge 1139 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 1140 if ((parent = document.defaultView) && parent.top !== parent) { 1141 // Support: IE 11 1142 if (parent.addEventListener) { 1143 parent.addEventListener("unload", unloadHandler, false); 1144 1145 // Support: IE 9 - 10 only 1146 } else if (parent.attachEvent) { 1147 parent.attachEvent("onunload", unloadHandler); 1148 } 1149 } 1150 1151 /* Attributes 1152 ---------------------------------------------------------------------- */ 1153 1154 // Support: IE<8 1155 // Verify that getAttribute really returns attributes and not properties 1156 // (excepting IE8 booleans) 1157 support.attributes = assert(function (div) { 1158 div.className = "i"; 1159 return !div.getAttribute("className"); 1160 }); 1161 1162 /* getElement(s)By* 1163 ---------------------------------------------------------------------- */ 1164 1165 // Check if getElementsByTagName("*") returns only elements 1166 support.getElementsByTagName = assert(function (div) { 1167 div.appendChild(document.createComment("")); 1168 return !div.getElementsByTagName("*").length; 1169 }); 1170 1171 // Support: IE<9 1172 support.getElementsByClassName = rnative.test(document.getElementsByClassName); 1173 1174 // Support: IE<10 1175 // Check if getElementById returns elements by name 1176 // The broken getElementById methods don't pick up programatically-set names, 1177 // so use a roundabout getElementsByName test 1178 support.getById = assert(function (div) { 1179 docElem.appendChild(div).id = expando; 1180 return !document.getElementsByName || !document.getElementsByName(expando).length; 1181 }); 1182 1183 // ID find and filter 1184 if (support.getById) { 1185 Expr.find["ID"] = function (id, context) { 1186 if (typeof context.getElementById !== "undefined" && documentIsHTML) { 1187 var m = context.getElementById(id); 1188 return m ? [m] : []; 1189 } 1190 }; 1191 Expr.filter["ID"] = function (id) { 1192 var attrId = id.replace(runescape, funescape); 1193 return function (elem) { 1194 return elem.getAttribute("id") === attrId; 1195 }; 1196 }; 1197 } else { 1198 // Support: IE6/7 1199 // getElementById is not reliable as a find shortcut 1200 delete Expr.find["ID"]; 1201 1202 Expr.filter["ID"] = function (id) { 1203 var attrId = id.replace(runescape, funescape); 1204 return function (elem) { 1205 var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); 1206 return node && node.value === attrId; 1207 }; 1208 }; 1209 } 1210 1211 // Tag 1212 Expr.find["TAG"] = support.getElementsByTagName ? function (tag, context) { 1213 if (typeof context.getElementsByTagName !== "undefined") { 1214 return context.getElementsByTagName(tag); 1215 1216 // DocumentFragment nodes don't have gEBTN 1217 } else if (support.qsa) { 1218 return context.querySelectorAll(tag); 1219 } 1220 } : function (tag, context) { 1221 var elem, 1222 tmp = [], 1223 i = 0, 1224 1225 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 1226 results = context.getElementsByTagName(tag); 1227 1228 // Filter out possible comments 1229 if (tag === "*") { 1230 while (elem = results[i++]) { 1231 if (elem.nodeType === 1) { 1232 tmp.push(elem); 1233 } 1234 } 1235 1236 return tmp; 1237 } 1238 return results; 1239 }; 1240 1241 // Class 1242 Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) { 1243 if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) { 1244 return context.getElementsByClassName(className); 1245 } 1246 }; 1247 1248 /* QSA/matchesSelector 1249 ---------------------------------------------------------------------- */ 1250 1251 // QSA and matchesSelector support 1252 1253 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 1254 rbuggyMatches = []; 1255 1256 // qSa(:focus) reports false when true (Chrome 21) 1257 // We allow this because of a bug in IE8/9 that throws an error 1258 // whenever `document.activeElement` is accessed on an iframe 1259 // So, we allow :focus to pass through QSA all the time to avoid the IE error 1260 // See http://bugs.jquery.com/ticket/13378 1261 rbuggyQSA = []; 1262 1263 if (support.qsa = rnative.test(document.querySelectorAll)) { 1264 // Build QSA regex 1265 // Regex strategy adopted from Diego Perini 1266 assert(function (div) { 1267 // Select is set to empty string on purpose 1268 // This is to test IE's treatment of not explicitly 1269 // setting a boolean content attribute, 1270 // since its presence should be enough 1271 // http://bugs.jquery.com/ticket/12359 1272 docElem.appendChild(div).innerHTML = "<a id='" + expando + "'></a>" + "<select id='" + expando + "-\r\\' msallowcapture=''>" + "<option selected=''></option></select>"; 1273 1274 // Support: IE8, Opera 11-12.16 1275 // Nothing should be selected when empty strings follow ^= or $= or *= 1276 // The test attribute must be unknown in Opera but "safe" for WinRT 1277 // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 1278 if (div.querySelectorAll("[msallowcapture^='']").length) { 1279 rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")"); 1280 } 1281 1282 // Support: IE8 1283 // Boolean attributes and "value" are not treated correctly 1284 if (!div.querySelectorAll("[selected]").length) { 1285 rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")"); 1286 } 1287 1288 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 1289 if (!div.querySelectorAll("[id~=" + expando + "-]").length) { 1290 rbuggyQSA.push("~="); 1291 } 1292 1293 // Webkit/Opera - :checked should return selected option elements 1294 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1295 // IE8 throws error here and will not see later tests 1296 if (!div.querySelectorAll(":checked").length) { 1297 rbuggyQSA.push(":checked"); 1298 } 1299 1300 // Support: Safari 8+, iOS 8+ 1301 // https://bugs.webkit.org/show_bug.cgi?id=136851 1302 // In-page `selector#id sibing-combinator selector` fails 1303 if (!div.querySelectorAll("a#" + expando + "+*").length) { 1304 rbuggyQSA.push(".#.+[+~]"); 1305 } 1306 }); 1307 1308 assert(function (div) { 1309 // Support: Windows 8 Native Apps 1310 // The type and name attributes are restricted during .innerHTML assignment 1311 var input = document.createElement("input"); 1312 input.setAttribute("type", "hidden"); 1313 div.appendChild(input).setAttribute("name", "D"); 1314 1315 // Support: IE8 1316 // Enforce case-sensitivity of name attribute 1317 if (div.querySelectorAll("[name=d]").length) { 1318 rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?="); 1319 } 1320 1321 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 1322 // IE8 throws error here and will not see later tests 1323 if (!div.querySelectorAll(":enabled").length) { 1324 rbuggyQSA.push(":enabled", ":disabled"); 1325 } 1326 1327 // Opera 10-11 does not throw on post-comma invalid pseudos 1328 div.querySelectorAll("*,:x"); 1329 rbuggyQSA.push(",.*:"); 1330 }); 1331 } 1332 1333 if (support.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) { 1334 1335 assert(function (div) { 1336 // Check to see if it's possible to do matchesSelector 1337 // on a disconnected node (IE 9) 1338 support.disconnectedMatch = matches.call(div, "div"); 1339 1340 // This should fail with an exception 1341 // Gecko does not error, returns false instead 1342 matches.call(div, "[s!='']:x"); 1343 rbuggyMatches.push("!=", pseudos); 1344 }); 1345 } 1346 1347 rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|")); 1348 rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|")); 1349 1350 /* Contains 1351 ---------------------------------------------------------------------- */ 1352 hasCompare = rnative.test(docElem.compareDocumentPosition); 1353 1354 // Element contains another 1355 // Purposefully self-exclusive 1356 // As in, an element does not contain itself 1357 contains = hasCompare || rnative.test(docElem.contains) ? function (a, b) { 1358 var adown = a.nodeType === 9 ? a.documentElement : a, 1359 bup = b && b.parentNode; 1360 return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16)); 1361 } : function (a, b) { 1362 if (b) { 1363 while (b = b.parentNode) { 1364 if (b === a) { 1365 return true; 1366 } 1367 } 1368 } 1369 return false; 1370 }; 1371 1372 /* Sorting 1373 ---------------------------------------------------------------------- */ 1374 1375 // Document order sorting 1376 sortOrder = hasCompare ? function (a, b) { 1377 1378 // Flag for duplicate removal 1379 if (a === b) { 1380 hasDuplicate = true; 1381 return 0; 1382 } 1383 1384 // Sort on method existence if only one input has compareDocumentPosition 1385 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 1386 if (compare) { 1387 return compare; 1388 } 1389 1390 // Calculate position if both inputs belong to the same document 1391 compare = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1392 1393 // Otherwise we know they are disconnected 1394 1; 1395 1396 // Disconnected nodes 1397 if (compare & 1 || !support.sortDetached && b.compareDocumentPosition(a) === compare) { 1398 1399 // Choose the first element that is related to our preferred document 1400 if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) { 1401 return -1; 1402 } 1403 if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) { 1404 return 1; 1405 } 1406 1407 // Maintain original order 1408 return sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0; 1409 } 1410 1411 return compare & 4 ? -1 : 1; 1412 } : function (a, b) { 1413 // Exit early if the nodes are identical 1414 if (a === b) { 1415 hasDuplicate = true; 1416 return 0; 1417 } 1418 1419 var cur, 1420 i = 0, 1421 aup = a.parentNode, 1422 bup = b.parentNode, 1423 ap = [a], 1424 bp = [b]; 1425 1426 // Parentless nodes are either documents or disconnected 1427 if (!aup || !bup) { 1428 return a === document ? -1 : b === document ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf(sortInput, a) - indexOf(sortInput, b) : 0; 1429 1430 // If the nodes are siblings, we can do a quick check 1431 } else if (aup === bup) { 1432 return siblingCheck(a, b); 1433 } 1434 1435 // Otherwise we need full lists of their ancestors for comparison 1436 cur = a; 1437 while (cur = cur.parentNode) { 1438 ap.unshift(cur); 1439 } 1440 cur = b; 1441 while (cur = cur.parentNode) { 1442 bp.unshift(cur); 1443 } 1444 1445 // Walk down the tree looking for a discrepancy 1446 while (ap[i] === bp[i]) { 1447 i++; 1448 } 1449 1450 return i ? 1451 // Do a sibling check if the nodes have a common ancestor 1452 siblingCheck(ap[i], bp[i]) : 1453 1454 // Otherwise nodes in our document sort first 1455 ap[i] === preferredDoc ? -1 : bp[i] === preferredDoc ? 1 : 0; 1456 }; 1457 1458 return document; 1459 }; 1460 1461 Sizzle.matches = function (expr, elements) { 1462 return Sizzle(expr, null, null, elements); 1463 }; 1464 1465 Sizzle.matchesSelector = function (elem, expr) { 1466 // Set document vars if needed 1467 if ((elem.ownerDocument || elem) !== document) { 1468 setDocument(elem); 1469 } 1470 1471 // Make sure that attribute selectors are quoted 1472 expr = expr.replace(rattributeQuotes, "='$1']"); 1473 1474 if (support.matchesSelector && documentIsHTML && !compilerCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) { 1475 1476 try { 1477 var ret = matches.call(elem, expr); 1478 1479 // IE 9's matchesSelector returns false on disconnected nodes 1480 if (ret || support.disconnectedMatch || 1481 // As well, disconnected nodes are said to be in a document 1482 // fragment in IE 9 1483 elem.document && elem.document.nodeType !== 11) { 1484 return ret; 1485 } 1486 } catch (e) {} 1487 } 1488 1489 return Sizzle(expr, document, null, [elem]).length > 0; 1490 }; 1491 1492 Sizzle.contains = function (context, elem) { 1493 // Set document vars if needed 1494 if ((context.ownerDocument || context) !== document) { 1495 setDocument(context); 1496 } 1497 return contains(context, elem); 1498 }; 1499 1500 Sizzle.attr = function (elem, name) { 1501 // Set document vars if needed 1502 if ((elem.ownerDocument || elem) !== document) { 1503 setDocument(elem); 1504 } 1505 1506 var fn = Expr.attrHandle[name.toLowerCase()], 1507 1508 // Don't get fooled by Object.prototype properties (jQuery #13807) 1509 val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ? fn(elem, name, !documentIsHTML) : undefined; 1510 1511 return val !== undefined ? val : support.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; 1512 }; 1513 1514 Sizzle.error = function (msg) { 1515 throw new Error("Syntax error, unrecognized expression: " + msg); 1516 }; 1517 1518 /** 1519 * Document sorting and removing duplicates 1520 * @param {ArrayLike} results 1521 */ 1522 Sizzle.uniqueSort = function (results) { 1523 var elem, 1524 duplicates = [], 1525 j = 0, 1526 i = 0; 1527 1528 // Unless we *know* we can detect duplicates, assume their presence 1529 hasDuplicate = !support.detectDuplicates; 1530 sortInput = !support.sortStable && results.slice(0); 1531 results.sort(sortOrder); 1532
vendor: 12,805 bytes, lines 1533-1939
1533 if (hasDuplicate) { 1534 while (elem = results[i++]) { 1535 if (elem === results[i]) { 1536 j = duplicates.push(i); 1537 } 1538 } 1539 while (j--) { 1540 results.splice(duplicates[j], 1); 1541 } 1542 } 1543 1544 // Clear input after sorting to release objects 1545 // See https://github.com/jquery/sizzle/pull/225 1546 sortInput = null; 1547 1548 return results; 1549 }; 1550 1551 /** 1552 * Utility function for retrieving the text value of an array of DOM nodes 1553 * @param {Array|Element} elem 1554 */ 1555 getText = Sizzle.getText = function (elem) { 1556 var node, 1557 ret = "", 1558 i = 0, 1559 nodeType = elem.nodeType; 1560 1561 if (!nodeType) { 1562 // If no nodeType, this is expected to be an array 1563 while (node = elem[i++]) { 1564 // Do not traverse comment nodes 1565 ret += getText(node); 1566 } 1567 } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) { 1568 // Use textContent for elements 1569 // innerText usage removed for consistency of new lines (jQuery #11153) 1570 if (typeof elem.textContent === "string") { 1571 return elem.textContent; 1572 } else { 1573 // Traverse its children 1574 for (elem = elem.firstChild; elem; elem = elem.nextSibling) { 1575 ret += getText(elem); 1576 } 1577 } 1578 } else if (nodeType === 3 || nodeType === 4) { 1579 return elem.nodeValue; 1580 } 1581 // Do not include comment or processing instruction nodes 1582 1583 return ret; 1584 }; 1585 1586 Expr = Sizzle.selectors = { 1587 1588 // Can be adjusted by the user 1589 cacheLength: 50, 1590 1591 createPseudo: markFunction, 1592 1593 match: matchExpr, 1594 1595 attrHandle: {}, 1596 1597 find: {}, 1598 1599 relative: { 1600 ">": { dir: "parentNode", first: true }, 1601 " ": { dir: "parentNode" }, 1602 "+": { dir: "previousSibling", first: true }, 1603 "~": { dir: "previousSibling" } 1604 }, 1605 1606 preFilter: { 1607 "ATTR": function (match) { 1608 match[1] = match[1].replace(runescape, funescape); 1609 1610 // Move the given value to match[3] whether quoted or unquoted 1611 match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape); 1612 1613 if (match[2] === "~=") { 1614 match[3] = " " + match[3] + " "; 1615 } 1616 1617 return match.slice(0, 4); 1618 }, 1619 1620 "CHILD": function (match) { 1621 /* matches from matchExpr["CHILD"] 1622 1 type (only|nth|...) 1623 2 what (child|of-type) 1624 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 1625 4 xn-component of xn+y argument ([+-]?\d*n|) 1626 5 sign of xn-component 1627 6 x of xn-component 1628 7 sign of y-component 1629 8 y of y-component 1630 */ 1631 match[1] = match[1].toLowerCase(); 1632 1633 if (match[1].slice(0, 3) === "nth") { 1634 // nth-* requires argument 1635 if (!match[3]) { 1636 Sizzle.error(match[0]); 1637 } 1638 1639 // numeric x and y parameters for Expr.filter.CHILD 1640 // remember that false/true cast respectively to 0/1 1641 match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd")); 1642 match[5] = +(match[7] + match[8] || match[3] === "odd"); 1643 1644 // other types prohibit arguments 1645 } else if (match[3]) { 1646 Sizzle.error(match[0]); 1647 } 1648 1649 return match; 1650 }, 1651 1652 "PSEUDO": function (match) { 1653 var excess, 1654 unquoted = !match[6] && match[2]; 1655 1656 if (matchExpr["CHILD"].test(match[0])) { 1657 return null; 1658 } 1659 1660 // Accept quoted arguments as-is 1661 if (match[3]) { 1662 match[2] = match[4] || match[5] || ""; 1663 1664 // Strip excess characters from unquoted arguments 1665 } else if (unquoted && rpseudo.test(unquoted) && ( 1666 // Get excess from tokenize (recursively) 1667 excess = tokenize(unquoted, true)) && ( 1668 // advance to the next closing parenthesis 1669 excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) { 1670 1671 // excess is a negative index 1672 match[0] = match[0].slice(0, excess); 1673 match[2] = unquoted.slice(0, excess); 1674 } 1675 1676 // Return only captures needed by the pseudo filter method (type and argument) 1677 return match.slice(0, 3); 1678 } 1679 }, 1680 1681 filter: { 1682 1683 "TAG": function (nodeNameSelector) { 1684 var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase(); 1685 return nodeNameSelector === "*" ? function () { 1686 return true; 1687 } : function (elem) { 1688 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 1689 }; 1690 }, 1691 1692 "CLASS": function (className) { 1693 var pattern = classCache[className + " "]; 1694 1695 return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(className, function (elem) { 1696 return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || ""); 1697 }); 1698 }, 1699 1700 "ATTR": function (name, operator, check) { 1701 return function (elem) { 1702 var result = Sizzle.attr(elem, name); 1703 1704 if (result == null) { 1705 return operator === "!="; 1706 } 1707 if (!operator) { 1708 return true; 1709 } 1710 1711 result += ""; 1712 1713 return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false; 1714 }; 1715 }, 1716 1717 "CHILD": function (type, what, argument, first, last) { 1718 var simple = type.slice(0, 3) !== "nth", 1719 forward = type.slice(-4) !== "last", 1720 ofType = what === "of-type"; 1721 1722 return first === 1 && last === 0 ? 1723 1724 // Shortcut for :nth-*(n) 1725 function (elem) { 1726 return !!elem.parentNode; 1727 } : function (elem, context, xml) { 1728 var cache, 1729 uniqueCache, 1730 outerCache, 1731 node, 1732 nodeIndex, 1733 start, 1734 dir = simple !== forward ? "nextSibling" : "previousSibling", 1735 parent = elem.parentNode, 1736 name = ofType && elem.nodeName.toLowerCase(), 1737 useCache = !xml && !ofType, 1738 diff = false; 1739 1740 if (parent) { 1741 1742 // :(first|last|only)-(child|of-type) 1743 if (simple) { 1744 while (dir) { 1745 node = elem; 1746 while (node = node[dir]) { 1747 if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) { 1748 1749 return false; 1750 } 1751 } 1752 // Reverse direction for :only-* (if we haven't yet done so) 1753 start = dir = type === "only" && !start && "nextSibling"; 1754 } 1755 return true; 1756 } 1757 1758 start = [forward ? parent.firstChild : parent.lastChild]; 1759 1760 // non-xml :nth-child(...) stores cache data on `parent` 1761 if (forward && useCache) { 1762 1763 // Seek `elem` from a previously-cached index 1764 1765 // ...in a gzip-friendly way 1766 node = parent; 1767 outerCache = node[expando] || (node[expando] = {}); 1768 1769 // Support: IE <9 only 1770 // Defend against cloned attroperties (jQuery gh-1709) 1771 uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {}); 1772 1773 cache = uniqueCache[type] || []; 1774 nodeIndex = cache[0] === dirruns && cache[1]; 1775 diff = nodeIndex && cache[2]; 1776 node = nodeIndex && parent.childNodes[nodeIndex]; 1777 1778 while (node = ++nodeIndex && node && node[dir] || ( 1779 1780 // Fallback to seeking `elem` from the start 1781 diff = nodeIndex = 0) || start.pop()) { 1782 1783 // When found, cache indexes on `parent` and break 1784 if (node.nodeType === 1 && ++diff && node === elem) { 1785 uniqueCache[type] = [dirruns, nodeIndex, diff]; 1786 break; 1787 } 1788 } 1789 } else { 1790 // Use previously-cached element index if available 1791 if (useCache) { 1792 // ...in a gzip-friendly way 1793 node = elem; 1794 outerCache = node[expando] || (node[expando] = {}); 1795 1796 // Support: IE <9 only 1797 // Defend against cloned attroperties (jQuery gh-1709) 1798 uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {}); 1799 1800 cache = uniqueCache[type] || []; 1801 nodeIndex = cache[0] === dirruns && cache[1]; 1802 diff = nodeIndex; 1803 } 1804 1805 // xml :nth-child(...) 1806 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 1807 if (diff === false) { 1808 // Use the same loop as above to seek `elem` from the start 1809 while (node = ++nodeIndex && node && node[dir] || (diff = nodeIndex = 0) || start.pop()) { 1810 1811 if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) { 1812 1813 // Cache the index of each encountered element 1814 if (useCache) { 1815 outerCache = node[expando] || (node[expando] = {}); 1816 1817 // Support: IE <9 only 1818 // Defend against cloned attroperties (jQuery gh-1709) 1819 uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {}); 1820 1821 uniqueCache[type] = [dirruns, diff]; 1822 } 1823 1824 if (node === elem) { 1825 break; 1826 } 1827 } 1828 } 1829 } 1830 } 1831 1832 // Incorporate the offset, then check against cycle size 1833 diff -= last; 1834 return diff === first || diff % first === 0 && diff / first >= 0; 1835 } 1836 }; 1837 }, 1838 1839 "PSEUDO": function (pseudo, argument) { 1840 // pseudo-class names are case-insensitive 1841 // http://www.w3.org/TR/selectors/#pseudo-classes 1842 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 1843 // Remember that setFilters inherits from pseudos 1844 var args, 1845 fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle.error("unsupported pseudo: " + pseudo); 1846 1847 // The user may use createPseudo to indicate that 1848 // arguments are needed to create the filter function 1849 // just as Sizzle does 1850 if (fn[expando]) { 1851 return fn(argument); 1852 } 1853 1854 // But maintain support for old signatures 1855 if (fn.length > 1) { 1856 args = [pseudo, pseudo, "", argument]; 1857 return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function (seed, matches) { 1858 var idx, 1859 matched = fn(seed, argument), 1860 i = matched.length; 1861 while (i--) { 1862 idx = indexOf(seed, matched[i]); 1863 seed[idx] = !(matches[idx] = matched[i]); 1864 } 1865 }) : function (elem) { 1866 return fn(elem, 0, args); 1867 }; 1868 } 1869 1870 return fn; 1871 } 1872 }, 1873 1874 pseudos: { 1875 // Potentially complex pseudos 1876 "not": markFunction(function (selector) { 1877 // Trim the selector passed to compile 1878 // to avoid treating leading and trailing 1879 // spaces as combinators 1880 var input = [], 1881 results = [], 1882 matcher = compile(selector.replace(rtrim, "$1")); 1883 1884 return matcher[expando] ? markFunction(function (seed, matches, context, xml) { 1885 var elem, 1886 unmatched = matcher(seed, null, xml, []), 1887 i = seed.length; 1888 1889 // Match elements unmatched by `matcher` 1890 while (i--) { 1891 if (elem = unmatched[i]) { 1892 seed[i] = !(matches[i] = elem); 1893 } 1894 } 1895 }) : function (elem, context, xml) { 1896 input[0] = elem; 1897 matcher(input, null, xml, results); 1898 // Don't keep the element (issue #299) 1899 input[0] = null; 1900 return !results.pop(); 1901 }; 1902 }), 1903 1904 "has": markFunction(function (selector) { 1905 return function (elem) { 1906 return Sizzle(selector, elem).length > 0; 1907 }; 1908 }), 1909 1910 "contains": markFunction(function (text) { 1911 text = text.replace(runescape, funescape); 1912 return function (elem) { 1913 return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1; 1914 }; 1915 }), 1916 1917 // "Whether an element is represented by a :lang() selector 1918 // is based solely on the element's language value 1919 // being equal to the identifier C, 1920 // or beginning with the identifier C immediately followed by "-". 1921 // The matching of C against the element's language value is performed case-insensitively. 1922 // The identifier C does not have to be a valid language name." 1923 // http://www.w3.org/TR/selectors/#lang-pseudo 1924 "lang": markFunction(function (lang) { 1925 // lang value must be a valid identifier 1926 if (!ridentifier.test(lang || "")) { 1927 Sizzle.error("unsupported lang: " + lang); 1928 } 1929 lang = lang.replace(runescape, funescape).toLowerCase(); 1930 return function (elem) { 1931 var elemLang; 1932 do { 1933 if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) { 1934 1935 elemLang = elemLang.toLowerCase(); 1936 return elemLang === lang || elemLang.indexOf(lang + "-") === 0; 1937 } 1938 } while ((elem = elem.parentNode) && elem.nodeType === 1); 1939 return false;
vendor: 4,299 bytes, lines 1940-2093
1940 }; 1941 }), 1942 1943 // Miscellaneous 1944 "target": function (elem) { 1945 var hash = window.location && window.location.hash; 1946 return hash && hash.slice(1) === elem.id; 1947 }, 1948 1949 "root": function (elem) { 1950 return elem === docElem; 1951 }, 1952 1953 "focus": function (elem) { 1954 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); 1955 }, 1956 1957 // Boolean properties 1958 "enabled": function (elem) { 1959 return elem.disabled === false; 1960 }, 1961 1962 "disabled": function (elem) { 1963 return elem.disabled === true; 1964 }, 1965 1966 "checked": function (elem) { 1967 // In CSS3, :checked should return both checked and selected elements 1968 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1969 var nodeName = elem.nodeName.toLowerCase(); 1970 return nodeName === "input" && !!elem.checked || nodeName === "option" && !!elem.selected; 1971 }, 1972 1973 "selected": function (elem) { 1974 // Accessing this property makes selected-by-default 1975 // options in Safari work properly 1976 if (elem.parentNode) { 1977 elem.parentNode.selectedIndex; 1978 } 1979 1980 return elem.selected === true; 1981 }, 1982 1983 // Contents 1984 "empty": function (elem) { 1985 // http://www.w3.org/TR/selectors/#empty-pseudo 1986 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 1987 // but not by others (comment: 8; processing instruction: 7; etc.) 1988 // nodeType < 6 works because attributes (2) do not appear as children 1989 for (elem = elem.firstChild; elem; elem = elem.nextSibling) { 1990 if (elem.nodeType < 6) { 1991 return false; 1992 } 1993 } 1994 return true; 1995 }, 1996 1997 "parent": function (elem) { 1998 return !Expr.pseudos["empty"](elem); 1999 }, 2000 2001 // Element/input types 2002 "header": function (elem) { 2003 return rheader.test(elem.nodeName); 2004 }, 2005 2006 "input": function (elem) { 2007 return rinputs.test(elem.nodeName); 2008 }, 2009 2010 "button": function (elem) { 2011 var name = elem.nodeName.toLowerCase(); 2012 return name === "input" && elem.type === "button" || name === "button"; 2013 }, 2014 2015 "text": function (elem) { 2016 var attr; 2017 return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && ( 2018 2019 // Support: IE<8 2020 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 2021 (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text"); 2022 }, 2023 2024 // Position-in-collection 2025 "first": createPositionalPseudo(function () { 2026 return [0]; 2027 }), 2028 2029 "last": createPositionalPseudo(function (matchIndexes, length) { 2030 return [length - 1]; 2031 }), 2032 2033 "eq": createPositionalPseudo(function (matchIndexes, length, argument) { 2034 return [argument < 0 ? argument + length : argument]; 2035 }), 2036 2037 "even": createPositionalPseudo(function (matchIndexes, length) { 2038 var i = 0; 2039 for (; i < length; i += 2) { 2040 matchIndexes.push(i); 2041 } 2042 return matchIndexes; 2043 }), 2044 2045 "odd": createPositionalPseudo(function (matchIndexes, length) { 2046 var i = 1; 2047 for (; i < length; i += 2) { 2048 matchIndexes.push(i); 2049 } 2050 return matchIndexes; 2051 }), 2052 2053 "lt": createPositionalPseudo(function (matchIndexes, length, argument) { 2054 var i = argument < 0 ? argument + length : argument; 2055 for (; --i >= 0;) { 2056 matchIndexes.push(i); 2057 } 2058 return matchIndexes; 2059 }), 2060 2061 "gt": createPositionalPseudo(function (matchIndexes, length, argument) { 2062 var i = argument < 0 ? argument + length : argument; 2063 for (; ++i < length;) { 2064 matchIndexes.push(i); 2065 } 2066 return matchIndexes; 2067 }) 2068 } 2069 }; 2070 2071 Expr.pseudos["nth"] = Expr.pseudos["eq"]; 2072 2073 // Add button/input type pseudos 2074 for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) { 2075 Expr.pseudos[i] = createInputPseudo(i); 2076 } 2077 for (i in { submit: true, reset: true }) { 2078 Expr.pseudos[i] = createButtonPseudo(i); 2079 } 2080 2081 // Easy API for creating new setFilters 2082 function setFilters() {} 2083 setFilters.prototype = Expr.filters = Expr.pseudos; 2084 Expr.setFilters = new setFilters(); 2085 2086 tokenize = Sizzle.tokenize = function (selector, parseOnly) { 2087 var matched, 2088 match, 2089 tokens, 2090 type, 2091 soFar, 2092 groups, 2093 preFilters,
vendor: 7,182 bytes, lines 2094-2359
2094 cached = tokenCache[selector + " "]; 2095 2096 if (cached) { 2097 return parseOnly ? 0 : cached.slice(0); 2098 } 2099 2100 soFar = selector; 2101 groups = []; 2102 preFilters = Expr.preFilter; 2103 2104 while (soFar) { 2105 2106 // Comma and first run 2107 if (!matched || (match = rcomma.exec(soFar))) { 2108 if (match) { 2109 // Don't consume trailing commas as valid 2110 soFar = soFar.slice(match[0].length) || soFar; 2111 } 2112 groups.push(tokens = []); 2113 } 2114 2115 matched = false; 2116 2117 // Combinators 2118 if (match = rcombinators.exec(soFar)) { 2119 matched = match.shift(); 2120 tokens.push({ 2121 value: matched, 2122 // Cast descendant combinators to space 2123 type: match[0].replace(rtrim, " ") 2124 }); 2125 soFar = soFar.slice(matched.length); 2126 } 2127 2128 // Filters 2129 for (type in Expr.filter) { 2130 if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) { 2131 matched = match.shift(); 2132 tokens.push({ 2133 value: matched, 2134 type: type, 2135 matches: match 2136 }); 2137 soFar = soFar.slice(matched.length); 2138 } 2139 } 2140 2141 if (!matched) { 2142 break; 2143 } 2144 } 2145 2146 // Return the length of the invalid excess 2147 // if we're just parsing 2148 // Otherwise, throw an error or return tokens 2149 return parseOnly ? soFar.length : soFar ? Sizzle.error(selector) : 2150 // Cache the tokens 2151 tokenCache(selector, groups).slice(0); 2152 }; 2153 2154 function toSelector(tokens) { 2155 var i = 0, 2156 len = tokens.length, 2157 selector = ""; 2158 for (; i < len; i++) { 2159 selector += tokens[i].value; 2160 } 2161 return selector; 2162 } 2163 2164 function addCombinator(matcher, combinator, base) { 2165 var dir = combinator.dir, 2166 checkNonElements = base && dir === "parentNode", 2167 doneName = done++; 2168 2169 return combinator.first ? 2170 // Check against closest ancestor/preceding element 2171 function (elem, context, xml) { 2172 while (elem = elem[dir]) { 2173 if (elem.nodeType === 1 || checkNonElements) { 2174 return matcher(elem, context, xml); 2175 } 2176 } 2177 } : 2178 2179 // Check against all ancestor/preceding elements 2180 function (elem, context, xml) { 2181 var oldCache, 2182 uniqueCache, 2183 outerCache, 2184 newCache = [dirruns, doneName]; 2185 2186 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 2187 if (xml) { 2188 while (elem = elem[dir]) { 2189 if (elem.nodeType === 1 || checkNonElements) { 2190 if (matcher(elem, context, xml)) { 2191 return true; 2192 } 2193 } 2194 } 2195 } else { 2196 while (elem = elem[dir]) { 2197 if (elem.nodeType === 1 || checkNonElements) { 2198 outerCache = elem[expando] || (elem[expando] = {}); 2199 2200 // Support: IE <9 only 2201 // Defend against cloned attroperties (jQuery gh-1709) 2202 uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {}); 2203 2204 if ((oldCache = uniqueCache[dir]) && oldCache[0] === dirruns && oldCache[1] === doneName) { 2205 2206 // Assign to newCache so results back-propagate to previous elements 2207 return newCache[2] = oldCache[2]; 2208 } else { 2209 // Reuse newcache so results back-propagate to previous elements 2210 uniqueCache[dir] = newCache; 2211 2212 // A match means we're done; a fail means we have to keep checking 2213 if (newCache[2] = matcher(elem, context, xml)) { 2214 return true; 2215 } 2216 } 2217 } 2218 } 2219 } 2220 }; 2221 } 2222 2223 function elementMatcher(matchers) { 2224 return matchers.length > 1 ? function (elem, context, xml) { 2225 var i = matchers.length; 2226 while (i--) { 2227 if (!matchers[i](elem, context, xml)) { 2228 return false; 2229 } 2230 } 2231 return true; 2232 } : matchers[0]; 2233 } 2234 2235 function multipleContexts(selector, contexts, results) { 2236 var i = 0, 2237 len = contexts.length; 2238 for (; i < len; i++) { 2239 Sizzle(selector, contexts[i], results); 2240 } 2241 return results; 2242 } 2243 2244 function condense(unmatched, map, filter, context, xml) { 2245 var elem, 2246 newUnmatched = [], 2247 i = 0, 2248 len = unmatched.length, 2249 mapped = map != null; 2250 2251 for (; i < len; i++) { 2252 if (elem = unmatched[i]) { 2253 if (!filter || filter(elem, context, xml)) { 2254 newUnmatched.push(elem); 2255 if (mapped) { 2256 map.push(i); 2257 } 2258 } 2259 } 2260 } 2261 2262 return newUnmatched; 2263 } 2264 2265 function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) { 2266 if (postFilter && !postFilter[expando]) { 2267 postFilter = setMatcher(postFilter); 2268 } 2269 if (postFinder && !postFinder[expando]) { 2270 postFinder = setMatcher(postFinder, postSelector); 2271 } 2272 return markFunction(function (seed, results, context, xml) { 2273 var temp, 2274 i, 2275 elem, 2276 preMap = [], 2277 postMap = [], 2278 preexisting = results.length, 2279 2280 2281 // Get initial elements from seed or context 2282 elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []), 2283 2284 2285 // Prefilter to get matcher input, preserving a map for seed-results synchronization 2286 matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems, 2287 matcherOut = matcher ? 2288 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 2289 postFinder || (seed ? preFilter : preexisting || postFilter) ? 2290 2291 // ...intermediate processing is necessary 2292 [] : 2293 2294 // ...otherwise use results directly 2295 results : matcherIn; 2296 2297 // Find primary matches 2298 if (matcher) { 2299 matcher(matcherIn, matcherOut, context, xml); 2300 } 2301 2302 // Apply postFilter 2303 if (postFilter) { 2304 temp = condense(matcherOut, postMap); 2305 postFilter(temp, [], context, xml); 2306 2307 // Un-match failing elements by moving them back to matcherIn 2308 i = temp.length; 2309 while (i--) { 2310 if (elem = temp[i]) { 2311 matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem); 2312 } 2313 } 2314 } 2315 2316 if (seed) { 2317 if (postFinder || preFilter) { 2318 if (postFinder) { 2319 // Get the final matcherOut by condensing this intermediate into postFinder contexts 2320 temp = []; 2321 i = matcherOut.length; 2322 while (i--) { 2323 if (elem = matcherOut[i]) { 2324 // Restore matcherIn since elem is not yet a final match 2325 temp.push(matcherIn[i] = elem); 2326 } 2327 } 2328 postFinder(null, matcherOut = [], temp, xml); 2329 } 2330 2331 // Move matched elements from seed to results to keep them synchronized 2332 i = matcherOut.length; 2333 while (i--) { 2334 if ((elem = matcherOut[i]) && (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) { 2335 2336 seed[temp] = !(results[temp] = elem); 2337 } 2338 } 2339 } 2340 2341 // Add elements to results, through postFinder if defined 2342 } else { 2343 matcherOut = condense(matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut); 2344 if (postFinder) { 2345 postFinder(null, results, matcherOut, xml); 2346 } else { 2347 push.apply(results, matcherOut); 2348 } 2349 } 2350 }); 2351 } 2352 2353 function matcherFromTokens(tokens) { 2354 var checkContext, 2355 matcher, 2356 j, 2357 len = tokens.length, 2358 leadingRelative = Expr.relative[tokens[0].type], 2359 implicitRelative = leadingRelative || Expr.relative[" "],
vendor: 7,952 bytes, lines 2360-2596
2360 i = leadingRelative ? 1 : 0, 2361 2362 2363 // The foundational matcher ensures that elements are reachable from top-level context(s) 2364 matchContext = addCombinator(function (elem) { 2365 return elem === checkContext; 2366 }, implicitRelative, true), 2367 matchAnyContext = addCombinator(function (elem) { 2368 return indexOf(checkContext, elem) > -1; 2369 }, implicitRelative, true), 2370 matchers = [function (elem, context, xml) { 2371 var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml)); 2372 // Avoid hanging onto element (issue #299) 2373 checkContext = null; 2374 return ret; 2375 }]; 2376 2377 for (; i < len; i++) { 2378 if (matcher = Expr.relative[tokens[i].type]) { 2379 matchers = [addCombinator(elementMatcher(matchers), matcher)]; 2380 } else { 2381 matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches); 2382 2383 // Return special upon seeing a positional matcher 2384 if (matcher[expando]) { 2385 // Find the next relative operator (if any) for proper handling 2386 j = ++i; 2387 for (; j < len; j++) { 2388 if (Expr.relative[tokens[j].type]) { 2389 break; 2390 } 2391 } 2392 return setMatcher(i > 1 && elementMatcher(matchers), i > 1 && toSelector( 2393 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 2394 tokens.slice(0, i - 1).concat({ value: tokens[i - 2].type === " " ? "*" : "" })).replace(rtrim, "$1"), matcher, i < j && matcherFromTokens(tokens.slice(i, j)), j < len && matcherFromTokens(tokens = tokens.slice(j)), j < len && toSelector(tokens)); 2395 } 2396 matchers.push(matcher); 2397 } 2398 } 2399 2400 return elementMatcher(matchers); 2401 } 2402 2403 function matcherFromGroupMatchers(elementMatchers, setMatchers) { 2404 var bySet = setMatchers.length > 0, 2405 byElement = elementMatchers.length > 0, 2406 superMatcher = function (seed, context, xml, results, outermost) { 2407 var elem, 2408 j, 2409 matcher, 2410 matchedCount = 0, 2411 i = "0", 2412 unmatched = seed && [], 2413 setMatched = [], 2414 contextBackup = outermostContext, 2415 2416 // We must always have either seed elements or outermost context 2417 elems = seed || byElement && Expr.find["TAG"]("*", outermost), 2418 2419 // Use integer dirruns iff this is the outermost matcher 2420 dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, 2421 len = elems.length; 2422 2423 if (outermost) { 2424 outermostContext = context === document || context || outermost; 2425 } 2426 2427 // Add elements passing elementMatchers directly to results 2428 // Support: IE<9, Safari 2429 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 2430 for (; i !== len && (elem = elems[i]) != null; i++) { 2431 if (byElement && elem) { 2432 j = 0; 2433 if (!context && elem.ownerDocument !== document) { 2434 setDocument(elem); 2435 xml = !documentIsHTML; 2436 } 2437 while (matcher = elementMatchers[j++]) { 2438 if (matcher(elem, context || document, xml)) { 2439 results.push(elem); 2440 break; 2441 } 2442 } 2443 if (outermost) { 2444 dirruns = dirrunsUnique; 2445 } 2446 } 2447 2448 // Track unmatched elements for set filters 2449 if (bySet) { 2450 // They will have gone through all possible matchers 2451 if (elem = !matcher && elem) { 2452 matchedCount--; 2453 } 2454 2455 // Lengthen the array for every element, matched or not 2456 if (seed) { 2457 unmatched.push(elem); 2458 } 2459 } 2460 } 2461 2462 // `i` is now the count of elements visited above, and adding it to `matchedCount` 2463 // makes the latter nonnegative. 2464 matchedCount += i; 2465 2466 // Apply set filters to unmatched elements 2467 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 2468 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 2469 // no element matchers and no seed. 2470 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 2471 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 2472 // numerically zero. 2473 if (bySet && i !== matchedCount) { 2474 j = 0; 2475 while (matcher = setMatchers[j++]) { 2476 matcher(unmatched, setMatched, context, xml); 2477 } 2478 2479 if (seed) { 2480 // Reintegrate element matches to eliminate the need for sorting 2481 if (matchedCount > 0) { 2482 while (i--) { 2483 if (!(unmatched[i] || setMatched[i])) { 2484 setMatched[i] = pop.call(results); 2485 } 2486 } 2487 } 2488 2489 // Discard index placeholder values to get only actual matches 2490 setMatched = condense(setMatched); 2491 } 2492 2493 // Add matches to results 2494 push.apply(results, setMatched); 2495 2496 // Seedless set matches succeeding multiple successful matchers stipulate sorting 2497 if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) { 2498 2499 Sizzle.uniqueSort(results); 2500 } 2501 } 2502 2503 // Override manipulation of globals by nested matchers 2504 if (outermost) { 2505 dirruns = dirrunsUnique; 2506 outermostContext = contextBackup; 2507 } 2508 2509 return unmatched; 2510 }; 2511 2512 return bySet ? markFunction(superMatcher) : superMatcher; 2513 } 2514 2515 compile = Sizzle.compile = function (selector, match /* Internal Use Only */) { 2516 var i, 2517 setMatchers = [], 2518 elementMatchers = [], 2519 cached = compilerCache[selector + " "]; 2520 2521 if (!cached) { 2522 // Generate a function of recursive functions that can be used to check each element 2523 if (!match) { 2524 match = tokenize(selector); 2525 } 2526 i = match.length; 2527 while (i--) { 2528 cached = matcherFromTokens(match[i]); 2529 if (cached[expando]) { 2530 setMatchers.push(cached); 2531 } else { 2532 elementMatchers.push(cached); 2533 } 2534 } 2535 2536 // Cache the compiled function 2537 cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers)); 2538 2539 // Save selector and tokenization 2540 cached.selector = selector; 2541 } 2542 return cached; 2543 }; 2544 2545 /** 2546 * A low-level selection function that works with Sizzle's compiled 2547 * selector functions 2548 * @param {String|Function} selector A selector or a pre-compiled 2549 * selector function built with Sizzle.compile 2550 * @param {Element} context 2551 * @param {Array} [results] 2552 * @param {Array} [seed] A set of elements to match against 2553 */ 2554 select = Sizzle.select = function (selector, context, results, seed) { 2555 var i, 2556 tokens, 2557 token, 2558 type, 2559 find, 2560 compiled = typeof selector === "function" && selector, 2561 match = !seed && tokenize(selector = compiled.selector || selector); 2562 2563 results = results || []; 2564 2565 // Try to minimize operations if there is only one selector in the list and no seed 2566 // (the latter of which guarantees us context) 2567 if (match.length === 1) { 2568 2569 // Reduce context if the leading compound selector is an ID 2570 tokens = match[0] = match[0].slice(0); 2571 if (tokens.length > 2 && (token = tokens[0]).type === "ID" && support.getById && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) { 2572 2573 context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0]; 2574 if (!context) { 2575 return results; 2576 2577 // Precompiled matchers will still verify ancestry, so step up a level 2578 } else if (compiled) { 2579 context = context.parentNode; 2580 } 2581 2582 selector = selector.slice(tokens.shift().value.length); 2583 } 2584 2585 // Fetch a seed set for right-to-left matching 2586 i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length; 2587 while (i--) { 2588 token = tokens[i]; 2589 2590 // Abort if we hit a combinator 2591 if (Expr.relative[type = token.type]) { 2592 break; 2593 } 2594 if (find = Expr.find[type]) { 2595 // Search, expanding context for leading sibling combinators 2596 if (seed = find(token.matches[0].replace(runescape, funescape), rsibling.test(tokens[0].type) && testC
vendor: 5,935 bytes, lines 2596-2810
2596ontext(context.parentNode) || context)) { 2597 2598 // If seed is empty or no tokens remain, we can return early 2599 tokens.splice(i, 1); 2600 selector = seed.length && toSelector(tokens); 2601 if (!selector) { 2602 push.apply(results, seed); 2603 return results; 2604 } 2605 2606 break; 2607 } 2608 } 2609 } 2610 } 2611 2612 // Compile and execute a filtering function if one is not provided 2613 // Provide `match` to avoid retokenization if we modified the selector above 2614 (compiled || compile(selector, match))(seed, context, !documentIsHTML, results, !context || rsibling.test(selector) && testContext(context.parentNode) || context); 2615 return results; 2616 }; 2617 2618 // One-time assignments 2619 2620 // Sort stability 2621 support.sortStable = expando.split("").sort(sortOrder).join("") === expando; 2622 2623 // Support: Chrome 14-35+ 2624 // Always assume duplicates if they aren't passed to the comparison function 2625 support.detectDuplicates = !!hasDuplicate; 2626 2627 // Initialize against the default document 2628 setDocument(); 2629 2630 // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 2631 // Detached nodes confoundingly follow *each other* 2632 support.sortDetached = assert(function (div1) { 2633 // Should return 1, but returns 4 (following) 2634 return div1.compareDocumentPosition(document.createElement("div")) & 1; 2635 }); 2636 2637 // Support: IE<8 2638 // Prevent attribute/property "interpolation" 2639 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 2640 if (!assert(function (div) { 2641 div.innerHTML = "<a href='#'></a>"; 2642 return div.firstChild.getAttribute("href") === "#"; 2643 })) { 2644 addHandle("type|href|height|width", function (elem, name, isXML) { 2645 if (!isXML) { 2646 return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2); 2647 } 2648 }); 2649 } 2650 2651 // Support: IE<9 2652 // Use defaultValue in place of getAttribute("value") 2653 if (!support.attributes || !assert(function (div) { 2654 div.innerHTML = "<input/>"; 2655 div.firstChild.setAttribute("value", ""); 2656 return div.firstChild.getAttribute("value") === ""; 2657 })) { 2658 addHandle("value", function (elem, name, isXML) { 2659 if (!isXML && elem.nodeName.toLowerCase() === "input") { 2660 return elem.defaultValue; 2661 } 2662 }); 2663 } 2664 2665 // Support: IE<9 2666 // Use getAttributeNode to fetch booleans when getAttribute lies 2667 if (!assert(function (div) { 2668 return div.getAttribute("disabled") == null; 2669 })) { 2670 addHandle(booleans, function (elem, name, isXML) { 2671 var val; 2672 if (!isXML) { 2673 return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null; 2674 } 2675 }); 2676 } 2677 2678 return Sizzle; 2679 }(window); 2680 2681 jQuery.find = Sizzle; 2682 jQuery.expr = Sizzle.selectors; 2683 jQuery.expr[":"] = jQuery.expr.pseudos; 2684 jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 2685 jQuery.text = Sizzle.getText; 2686 jQuery.isXMLDoc = Sizzle.isXML; 2687 jQuery.contains = Sizzle.contains; 2688 2689 var dir = function (elem, dir, until) { 2690 var matched = [], 2691 truncate = until !== undefined; 2692 2693 while ((elem = elem[dir]) && elem.nodeType !== 9) { 2694 if (elem.nodeType === 1) { 2695 if (truncate && jQuery(elem).is(until)) { 2696 break; 2697 } 2698 matched.push(elem); 2699 } 2700 } 2701 return matched; 2702 }; 2703 2704 var siblings = function (n, elem) { 2705 var matched = []; 2706 2707 for (; n; n = n.nextSibling) { 2708 if (n.nodeType === 1 && n !== elem) { 2709 matched.push(n); 2710 } 2711 } 2712 2713 return matched; 2714 }; 2715 2716 var rneedsContext = jQuery.expr.match.needsContext; 2717 2718 var rsingleTag = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/; 2719 2720 var risSimple = /^.[^:#\[\.,]*$/; 2721 2722 // Implement the identical functionality for filter and not 2723 function winnow(elements, qualifier, not) { 2724 if (jQuery.isFunction(qualifier)) { 2725 return jQuery.grep(elements, function (elem, i) { 2726 /* jshint -W018 */ 2727 return !!qualifier.call(elem, i, elem) !== not; 2728 }); 2729 } 2730 2731 if (qualifier.nodeType) { 2732 return jQuery.grep(elements, function (elem) { 2733 return elem === qualifier !== not; 2734 }); 2735 } 2736 2737 if (typeof qualifier === "string") { 2738 if (risSimple.test(qualifier)) { 2739 return jQuery.filter(qualifier, elements, not); 2740 } 2741 2742 qualifier = jQuery.filter(qualifier, elements); 2743 } 2744 2745 return jQuery.grep(elements, function (elem) { 2746 return jQuery.inArray(elem, qualifier) > -1 !== not; 2747 }); 2748 } 2749 2750 jQuery.filter = function (expr, elems, not) { 2751 var elem = elems[0]; 2752 2753 if (not) { 2754 expr = ":not(" + expr + ")"; 2755 } 2756 2757 return elems.length === 1 && elem.nodeType === 1 ? jQuery.find.matchesSelector(elem, expr) ? [elem] : [] : jQuery.find.matches(expr, jQuery.grep(elems, function (elem) { 2758 return elem.nodeType === 1; 2759 })); 2760 }; 2761 2762 jQuery.fn.extend({ 2763 find: function (selector) { 2764 var i, 2765 ret = [], 2766 self = this, 2767 len = self.length; 2768 2769 if (typeof selector !== "string") { 2770 return this.pushStack(jQuery(selector).filter(function () { 2771 for (i = 0; i < len; i++) { 2772 if (jQuery.contains(self[i], this)) { 2773 return true; 2774 } 2775 } 2776 })); 2777 } 2778 2779 for (i = 0; i < len; i++) { 2780 jQuery.find(selector, self[i], ret); 2781 } 2782 2783 // Needed because $( selector, context ) becomes $( context ).find( selector ) 2784 ret = this.pushStack(len > 1 ? jQuery.unique(ret) : ret); 2785 ret.selector = this.selector ? this.selector + " " + selector : selector; 2786 return ret; 2787 }, 2788 filter: function (selector) { 2789 return this.pushStack(winnow(this, selector || [], false)); 2790 }, 2791 not: function (selector) { 2792 return this.pushStack(winnow(this, selector || [], true)); 2793 }, 2794 is: function (selector) { 2795 return !!winnow(this, 2796 2797 // If this is a positional/relative selector, check membership in the returned set 2798 // so $("p:first").is("p:last") won't return true for a doc with two "p". 2799 typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [], false).length; 2800 } 2801 }); 2802 2803 // Initialize a jQuery object 2804 2805 2806 // A central reference to the root jQuery(document) 2807 var rootjQuery, 2808 2809 2810 // A simple way to check for HTML strings
vendor: 9,553 bytes, lines 2811-3167
2811 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 2812 // Strict HTML recognition (#11290: must start with <) 2813 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, 2814 init = jQuery.fn.init = function (selector, context, root) { 2815 var match, elem; 2816 2817 // HANDLE: $(""), $(null), $(undefined), $(false) 2818 if (!selector) { 2819 return this; 2820 } 2821 2822 // init accepts an alternate rootjQuery 2823 // so migrate can support jQuery.sub (gh-2101) 2824 root = root || rootjQuery; 2825 2826 // Handle HTML strings 2827 if (typeof selector === "string") { 2828 if (selector.charAt(0) === "<" && selector.charAt(selector.length - 1) === ">" && selector.length >= 3) { 2829 2830 // Assume that strings that start and end with <> are HTML and skip the regex check 2831 match = [null, selector, null]; 2832 } else { 2833 match = rquickExpr.exec(selector); 2834 } 2835 2836 // Match html or make sure no context is specified for #id 2837 if (match && (match[1] || !context)) { 2838 2839 // HANDLE: $(html) -> $(array) 2840 if (match[1]) { 2841 context = context instanceof jQuery ? context[0] : context; 2842 2843 // scripts is true for back-compat 2844 // Intentionally let the error be thrown if parseHTML is not present 2845 jQuery.merge(this, jQuery.parseHTML(match[1], context && context.nodeType ? context.ownerDocument || context : document, true)); 2846 2847 // HANDLE: $(html, props) 2848 if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) { 2849 for (match in context) { 2850 2851 // Properties of context are called as methods if possible 2852 if (jQuery.isFunction(this[match])) { 2853 this[match](context[match]); 2854 2855 // ...and otherwise set as attributes 2856 } else { 2857 this.attr(match, context[match]); 2858 } 2859 } 2860 } 2861 2862 return this; 2863 2864 // HANDLE: $(#id) 2865 } else { 2866 elem = document.getElementById(match[2]); 2867 2868 // Check parentNode to catch when Blackberry 4.6 returns 2869 // nodes that are no longer in the document #6963 2870 if (elem && elem.parentNode) { 2871 2872 // Handle the case where IE and Opera return items 2873 // by name instead of ID 2874 if (elem.id !== match[2]) { 2875 return rootjQuery.find(selector); 2876 } 2877 2878 // Otherwise, we inject the element directly into the jQuery object 2879 this.length = 1; 2880 this[0] = elem; 2881 } 2882 2883 this.context = document; 2884 this.selector = selector; 2885 return this; 2886 } 2887 2888 // HANDLE: $(expr, $(...)) 2889 } else if (!context || context.jquery) { 2890 return (context || root).find(selector); 2891 2892 // HANDLE: $(expr, context) 2893 // (which is just equivalent to: $(context).find(expr) 2894 } else { 2895 return this.constructor(context).find(selector); 2896 } 2897 2898 // HANDLE: $(DOMElement) 2899 } else if (selector.nodeType) { 2900 this.context = this[0] = selector; 2901 this.length = 1; 2902 return this; 2903 2904 // HANDLE: $(function) 2905 // Shortcut for document ready 2906 } else if (jQuery.isFunction(selector)) { 2907 return typeof root.ready !== "undefined" ? root.ready(selector) : 2908 2909 // Execute immediately if ready is not present 2910 selector(jQuery); 2911 } 2912 2913 if (selector.selector !== undefined) { 2914 this.selector = selector.selector; 2915 this.context = selector.context; 2916 } 2917 2918 return jQuery.makeArray(selector, this); 2919 }; 2920 2921 // Give the init function the jQuery prototype for later instantiation 2922 init.prototype = jQuery.fn; 2923 2924 // Initialize central reference 2925 rootjQuery = jQuery(document); 2926 2927 var rparentsprev = /^(?:parents|prev(?:Until|All))/, 2928 2929 2930 // methods guaranteed to produce a unique set when starting from a unique set 2931 guaranteedUnique = { 2932 children: true, 2933 contents: true, 2934 next: true, 2935 prev: true 2936 }; 2937 2938 jQuery.fn.extend({ 2939 has: function (target) { 2940 var i, 2941 targets = jQuery(target, this), 2942 len = targets.length; 2943 2944 return this.filter(function () { 2945 for (i = 0; i < len; i++) { 2946 if (jQuery.contains(this, targets[i])) { 2947 return true; 2948 } 2949 } 2950 }); 2951 }, 2952 2953 closest: function (selectors, context) { 2954 var cur, 2955 i = 0, 2956 l = this.length, 2957 matched = [], 2958 pos = rneedsContext.test(selectors) || typeof selectors !== "string" ? jQuery(selectors, context || this.context) : 0; 2959 2960 for (; i < l; i++) { 2961 for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) { 2962 2963 // Always skip document fragments 2964 if (cur.nodeType < 11 && (pos ? pos.index(cur) > -1 : 2965 2966 // Don't pass non-elements to Sizzle 2967 cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) { 2968 2969 matched.push(cur); 2970 break; 2971 } 2972 } 2973 } 2974 2975 return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched); 2976 }, 2977 2978 // Determine the position of an element within 2979 // the matched set of elements 2980 index: function (elem) { 2981 2982 // No argument, return index in parent 2983 if (!elem) { 2984 return this[0] && this[0].parentNode ? this.first().prevAll().length : -1; 2985 } 2986 2987 // index in selector 2988 if (typeof elem === "string") { 2989 return jQuery.inArray(this[0], jQuery(elem)); 2990 } 2991 2992 // Locate the position of the desired element 2993 return jQuery.inArray( 2994 2995 // If it receives a jQuery object, the first element is used 2996 elem.jquery ? elem[0] : elem, this); 2997 }, 2998 2999 add: function (selector, context) { 3000 return this.pushStack(jQuery.uniqueSort(jQuery.merge(this.get(), jQuery(selector, context)))); 3001 }, 3002 3003 addBack: function (selector) { 3004 return this.add(selector == null ? this.prevObject : this.prevObject.filter(selector)); 3005 } 3006 }); 3007 3008 function sibling(cur, dir) { 3009 do { 3010 cur = cur[dir]; 3011 } while (cur && cur.nodeType !== 1); 3012 3013 return cur; 3014 } 3015 3016 jQuery.each({ 3017 parent: function (elem) { 3018 var parent = elem.parentNode; 3019 return parent && parent.nodeType !== 11 ? parent : null; 3020 }, 3021 parents: function (elem) { 3022 return dir(elem, "parentNode"); 3023 }, 3024 parentsUntil: function (elem, i, until) { 3025 return dir(elem, "parentNode", until); 3026 }, 3027 next: function (elem) { 3028 return sibling(elem, "nextSibling"); 3029 }, 3030 prev: function (elem) { 3031 return sibling(elem, "previousSibling"); 3032 }, 3033 nextAll: function (elem) { 3034 return dir(elem, "nextSibling"); 3035 }, 3036 prevAll: function (elem) { 3037 return dir(elem, "previousSibling"); 3038 }, 3039 nextUntil: function (elem, i, until) { 3040 return dir(elem, "nextSibling", until); 3041 }, 3042 prevUntil: function (elem, i, until) { 3043 return dir(elem, "previousSibling", until); 3044 }, 3045 siblings: function (elem) { 3046 return siblings((elem.parentNode || {}).firstChild, elem); 3047 }, 3048 children: function (elem) { 3049 return siblings(elem.firstChild); 3050 }, 3051 contents: function (elem) { 3052 return jQuery.nodeName(elem, "iframe") ? elem.contentDocument || elem.contentWindow.document : jQuery.merge([], elem.childNodes); 3053 } 3054 }, function (name, fn) { 3055 jQuery.fn[name] = function (until, selector) { 3056 var ret = jQuery.map(this, fn, until); 3057 3058 if (name.slice(-5) !== "Until") { 3059 selector = until; 3060 } 3061 3062 if (selector && typeof selector === "string") { 3063 ret = jQuery.filter(selector, ret); 3064 } 3065 3066 if (this.length > 1) { 3067 3068 // Remove duplicates 3069 if (!guaranteedUnique[name]) { 3070 ret = jQuery.uniqueSort(ret); 3071 } 3072 3073 // Reverse order for parents* and prev-derivatives 3074 if (rparentsprev.test(name)) { 3075 ret = ret.reverse(); 3076 } 3077 } 3078 3079 return this.pushStack(ret); 3080 }; 3081 }); 3082 var rnotwhite = /\S+/g; 3083 3084 // Convert String-formatted options into Object-formatted ones 3085 function createOptions(options) { 3086 var object = {}; 3087 jQuery.each(options.match(rnotwhite) || [], function (_, flag) { 3088 object[flag] = true; 3089 }); 3090 return object; 3091 } 3092 3093 /* 3094 * Create a callback list using the following parameters: 3095 * 3096 * options: an optional list of space-separated options that will change how 3097 * the callback list behaves or a more traditional option object 3098 * 3099 * By default a callback list will act like an event callback list and can be 3100 * "fired" multiple times. 3101 * 3102 * Possible options: 3103 * 3104 * once: will ensure the callback list can only be fired once (like a Deferred) 3105 * 3106 * memory: will keep track of previous values and will call any callback added 3107 * after the list has been fired right away with the latest "memorized" 3108 * values (like a Deferred) 3109 * 3110 * unique: will ensure a callback can only be added once (no duplicate in the list) 3111 * 3112 * stopOnFalse: interrupt callings when a callback returns false 3113 * 3114 */ 3115 jQuery.Callbacks = function (options) { 3116 3117 // Convert options from String-formatted to Object-formatted if needed 3118 // (we check in cache first) 3119 options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options); 3120 3121 var // Flag to know if list is currently firing 3122 firing, 3123 3124 3125 // Last fire value for non-forgettable lists 3126 memory, 3127 3128 3129 // Flag to know if list was already fired 3130 fired, 3131 3132 3133 // Flag to prevent firing 3134 locked, 3135 3136 3137 // Actual callback list 3138 list = [], 3139 3140 3141 // Queue of execution data for repeatable lists 3142 queue = [], 3143 3144 3145 // Index of currently firing callback (modified by add/remove as needed) 3146 firingIndex = -1, 3147 3148 3149 // Fire callbacks 3150 fire = function () { 3151 3152 // Enforce single-firing 3153 locked = options.once; 3154 3155 // Execute callbacks for all pending executions, 3156 // respecting firingIndex overrides and runtime changes 3157 fired = firing = true; 3158 for (; queue.length; firingIndex = -1) { 3159 memory = queue.shift(); 3160 while (++firingIndex < list.length) { 3161 3162 // Run callback and check for early termination 3163 if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) { 3164 3165 // Jump to end and forget the data so .add doesn't re-fire 3166 firingIndex = list.length; 3167 memory = false;
vendor: 8,134 bytes, lines 3168-3497
3168 } 3169 } 3170 } 3171 3172 // Forget the data if we're done with it 3173 if (!options.memory) { 3174 memory = false; 3175 } 3176 3177 firing = false; 3178 3179 // Clean up if we're done firing for good 3180 if (locked) { 3181 3182 // Keep an empty list if we have data for future add calls 3183 if (memory) { 3184 list = []; 3185 3186 // Otherwise, this object is spent 3187 } else { 3188 list = ""; 3189 } 3190 } 3191 }, 3192 3193 3194 // Actual Callbacks object 3195 self = { 3196 3197 // Add a callback or a collection of callbacks to the list 3198 add: function () { 3199 if (list) { 3200 3201 // If we have memory from a past run, we should fire after adding 3202 if (memory && !firing) { 3203 firingIndex = list.length - 1; 3204 queue.push(memory); 3205 } 3206 3207 (function add(args) { 3208 jQuery.each(args, function (_, arg) { 3209 if (jQuery.isFunction(arg)) { 3210 if (!options.unique || !self.has(arg)) { 3211 list.push(arg); 3212 } 3213 } else if (arg && arg.length && jQuery.type(arg) !== "string") { 3214 3215 // Inspect recursively 3216 add(arg); 3217 } 3218 }); 3219 })(arguments); 3220 3221 if (memory && !firing) { 3222 fire(); 3223 } 3224 } 3225 return this; 3226 }, 3227 3228 // Remove a callback from the list 3229 remove: function () { 3230 jQuery.each(arguments, function (_, arg) { 3231 var index; 3232 while ((index = jQuery.inArray(arg, list, index)) > -1) { 3233 list.splice(index, 1); 3234 3235 // Handle firing indexes 3236 if (index <= firingIndex) { 3237 firingIndex--; 3238 } 3239 } 3240 }); 3241 return this; 3242 }, 3243 3244 // Check if a given callback is in the list. 3245 // If no argument is given, return whether or not list has callbacks attached. 3246 has: function (fn) { 3247 return fn ? jQuery.inArray(fn, list) > -1 : list.length > 0; 3248 }, 3249 3250 // Remove all callbacks from the list 3251 empty: function () { 3252 if (list) { 3253 list = []; 3254 } 3255 return this; 3256 }, 3257 3258 // Disable .fire and .add 3259 // Abort any current/pending executions 3260 // Clear all callbacks and values 3261 disable: function () { 3262 locked = queue = []; 3263 list = memory = ""; 3264 return this; 3265 }, 3266 disabled: function () { 3267 return !list; 3268 }, 3269 3270 // Disable .fire 3271 // Also disable .add unless we have memory (since it would have no effect) 3272 // Abort any pending executions 3273 lock: function () { 3274 locked = true; 3275 if (!memory) { 3276 self.disable(); 3277 } 3278 return this; 3279 }, 3280 locked: function () { 3281 return !!locked; 3282 }, 3283 3284 // Call all callbacks with the given context and arguments 3285 fireWith: function (context, args) { 3286 if (!locked) { 3287 args = args || []; 3288 args = [context, args.slice ? args.slice() : args]; 3289 queue.push(args); 3290 if (!firing) { 3291 fire(); 3292 } 3293 } 3294 return this; 3295 }, 3296 3297 // Call all the callbacks with the given arguments 3298 fire: function () { 3299 self.fireWith(this, arguments); 3300 return this; 3301 }, 3302 3303 // To know if the callbacks have already been called at least once 3304 fired: function () { 3305 return !!fired; 3306 } 3307 }; 3308 3309 return self; 3310 }; 3311 3312 jQuery.extend({ 3313 3314 Deferred: function (func) { 3315 var tuples = [ 3316 3317 // action, add listener, listener list, final state 3318 ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"], ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"], ["notify", "progress", jQuery.Callbacks("memory")]], 3319 state = "pending", 3320 promise = { 3321 state: function () { 3322 return state; 3323 }, 3324 always: function () { 3325 deferred.done(arguments).fail(arguments); 3326 return this; 3327 }, 3328 then: function () /* fnDone, fnFail, fnProgress */{ 3329 var fns = arguments; 3330 return jQuery.Deferred(function (newDefer) { 3331 jQuery.each(tuples, function (i, tuple) { 3332 var fn = jQuery.isFunction(fns[i]) && fns[i]; 3333 3334 // deferred[ done | fail | progress ] for forwarding actions to newDefer 3335 deferred[tuple[1]](function () { 3336 var returned = fn && fn.apply(this, arguments); 3337 if (returned && jQuery.isFunction(returned.promise)) { 3338 returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject); 3339 } else { 3340 newDefer[tuple[0] + "With"](this === promise ? newDefer.promise() : this, fn ? [returned] : arguments); 3341 } 3342 }); 3343 }); 3344 fns = null; 3345 }).promise(); 3346 }, 3347 3348 // Get a promise for this deferred 3349 // If obj is provided, the promise aspect is added to the object 3350 promise: function (obj) { 3351 return obj != null ? jQuery.extend(obj, promise) : promise; 3352 } 3353 }, 3354 deferred = {}; 3355 3356 // Keep pipe for back-compat 3357 promise.pipe = promise.then; 3358 3359 // Add list-specific methods 3360 jQuery.each(tuples, function (i, tuple) { 3361 var list = tuple[2], 3362 stateString = tuple[3]; 3363 3364 // promise[ done | fail | progress ] = list.add 3365 promise[tuple[1]] = list.add; 3366 3367 // Handle state 3368 if (stateString) { 3369 list.add(function () { 3370 3371 // state = [ resolved | rejected ] 3372 state = stateString; 3373 3374 // [ reject_list | resolve_list ].disable; progress_list.lock 3375 }, tuples[i ^ 1][2].disable, tuples[2][2].lock); 3376 } 3377 3378 // deferred[ resolve | reject | notify ] 3379 deferred[tuple[0]] = function () { 3380 deferred[tuple[0] + "With"](this === deferred ? promise : this, arguments); 3381 return this; 3382 }; 3383 deferred[tuple[0] + "With"] = list.fireWith; 3384 }); 3385 3386 // Make the deferred a promise 3387 promise.promise(deferred); 3388 3389 // Call given func if any 3390 if (func) { 3391 func.call(deferred, deferred); 3392 } 3393 3394 // All done! 3395 return deferred; 3396 }, 3397 3398 // Deferred helper 3399 when: function (subordinate /* , ..., subordinateN */) { 3400 var i = 0, 3401 resolveValues = slice.call(arguments), 3402 length = resolveValues.length, 3403 3404 3405 // the count of uncompleted subordinates 3406 remaining = length !== 1 || subordinate && jQuery.isFunction(subordinate.promise) ? length : 0, 3407 3408 3409 // the master Deferred. 3410 // If resolveValues consist of only a single Deferred, just use that. 3411 deferred = remaining === 1 ? subordinate : jQuery.Deferred(), 3412 3413 3414 // Update function for both resolve and progress values 3415 updateFunc = function (i, contexts, values) { 3416 return function (value) { 3417 contexts[i] = this; 3418 values[i] = arguments.length > 1 ? slice.call(arguments) : value; 3419 if (values === progressValues) { 3420 deferred.notifyWith(contexts, values); 3421 } else if (! --remaining) { 3422 deferred.resolveWith(contexts, values); 3423 } 3424 }; 3425 }, 3426 progressValues, 3427 progressContexts, 3428 resolveContexts; 3429 3430 // add listeners to Deferred subordinates; treat others as resolved 3431 if (length > 1) { 3432 progressValues = new Array(length); 3433 progressContexts = new Array(length); 3434 resolveContexts = new Array(length); 3435 for (; i < length; i++) { 3436 if (resolveValues[i] && jQuery.isFunction(resolveValues[i].promise)) { 3437 resolveValues[i].promise().progress(updateFunc(i, progressContexts, progressValues)).done(updateFunc(i, resolveContexts, resolveValues)).fail(deferred.reject); 3438 } else { 3439 --remaining; 3440 } 3441 } 3442 } 3443 3444 // if we're not waiting on anything, resolve the master 3445 if (!remaining) { 3446 deferred.resolveWith(resolveContexts, resolveValues); 3447 } 3448 3449 return deferred.promise(); 3450 } 3451 }); 3452 3453 // The deferred used on DOM ready 3454 var readyList; 3455 3456 jQuery.fn.ready = function (fn) { 3457 3458 // Add the callback 3459 jQuery.ready.promise().done(fn); 3460 3461 return this; 3462 }; 3463 3464 jQuery.extend({ 3465 3466 // Is the DOM ready to be used? Set to true once it occurs. 3467 isReady: false, 3468 3469 // A counter to track how many items to wait for before 3470 // the ready event fires. See #6781 3471 readyWait: 1, 3472 3473 // Hold (or release) the ready event 3474 holdReady: function (hold) { 3475 if (hold) { 3476 jQuery.readyWait++; 3477 } else { 3478 jQuery.ready(true); 3479 } 3480 }, 3481 3482 // Handle when the DOM is ready 3483 ready: function (wait) { 3484 3485 // Abort if there are pending holds or we're already ready 3486 if (wait === true ? --jQuery.readyWait : jQuery.isReady) { 3487 return; 3488 } 3489 3490 // Remember that the DOM is ready 3491 jQuery.isReady = true; 3492 3493 // If a normal DOM Ready event fired, decrement, and wait if need be 3494 if (wait !== true && --jQuery.readyWait > 0) { 3495 return; 3496 } 3497
3498 // If there are functions bound, to execute 3499 readyList.resolveWith(document, [jQuery]); 3500 3501 // Trigger any bound ready events 3502 if (jQuery.fn.triggerHandler) { 3503 jQuery(document).triggerHandler("ready"); 3504 jQuery(document).off("ready"); 3505 } 3506 } 3507 }); 3508 3509 /** 3510 * Clean-up method for dom ready events 3511 */ 3512 function detach() { 3513 if (document.addEventListener) { 3514 document.removeEventListener("DOMContentLoaded", completed); 3515 window.removeEventListener("load", completed); 3516 } else { 3517 document.detachEvent("onreadystatechange", completed); 3518 window.detachEvent("onload", completed); 3519 } 3520 } 3521 3522 /** 3523 * The ready event handler and self cleanup method 3524 */ 3525 function completed() { 3526 3527 // readyState === "complete" is good enough for us to call the dom ready in oldIE 3528 if (document.addEventListener || window.event.type === "load" || document.readyState === "complete") { 3529 3530 detach(); 3531 jQuery.ready(); 3532 } 3533 } 3534 3535 jQuery.ready.promise = function (obj) { 3536 if (!readyList) { 3537 3538 readyList = jQuery.Deferred(); 3539 3540 // Catch cases where $(document).ready() is called 3541 // after the browser event has already occurred. 3542 // Support: IE6-10 3543 // Older IE sometimes signals "interactive" too soon 3544 if (document.readyState === "complete" || document.readyState !== "loading" && !document.documentElement.doScroll) { 3545 3546 // Handle it asynchronously to allow scripts the opportunity to delay ready 3547 window.setTimeout(jQuery.ready); 3548 3549 // Standards-based browsers support DOMContentLoaded 3550 } else if (document.addEventListener) { 3551 3552 // Use the handy event callback 3553 document.addEventListener("DOMContentLoaded", completed); 3554 3555 // A fallback to window.onload, that will always work 3556 window.addEventListener("load", completed); 3557 3558 // If IE event model is used 3559 } else { 3560 3561 // Ensure firing before onload, maybe late but safe also for iframes 3562 document.attachEvent("onreadystatechange", completed); 3563 3564 // A fallback to window.onload, that will always work 3565 window.attachEvent("onload", completed); 3566 3567 // If IE and not a frame 3568 // continually check to see if the document is ready 3569 var top = false; 3570 3571 try { 3572 top = window.frameElement == null && document.documentElement; 3573 } catch (e) {} 3574 3575 if (top && top.doScroll) { 3576 (function doScrollCheck() { 3577 if (!jQuery.isReady) { 3578 3579 try { 3580 3581 // Use the trick by Diego Perini 3582 // http://javascript.nwbox.com/IEContentLoaded/ 3583 top.doScroll("left"); 3584 } catch (e) { 3585 return window.setTimeout(doScrollCheck, 50); 3586 } 3587 3588 // detach all dom ready events 3589 detach(); 3590 3591 // and execute any waiting functions 3592 jQuery.ready(); 3593 } 3594 })(); 3595 } 3596 } 3597 } 3598 return readyList.promise(obj); 3599 }; 3600 3601 // Kick off the DOM ready check even if the user does not 3602 jQuery.ready.promise(); 3603 3604 // Support: IE<9 3605 // Iteration over object's inherited properties before its own 3606 var i; 3607 for (i in jQuery(support)) { 3608 break; 3609 } 3610 support.ownFirst = i === "0"; 3611 3612 // Note: most support tests are defined in their respective modules. 3613 // false until the test is run 3614 support.inlineBlockNeedsLayout = false; 3615 3616 // Execute ASAP in case we need to set body.style.zoom 3617 jQuery(function () { 3618 3619 // Minified: var a,b,c,d 3620 var val, div, body, container; 3621 3622 body = document.getElementsByTagName("body")[0]; 3623 if (!body || !body.style) { 3624 3625 // Return for frameset docs that don't have a body 3626 return; 3627 } 3628 3629 // Setup 3630 div = document.createElement("div"); 3631 container = document.createElement("div"); 3632 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; 3633 body.appendChild(container).appendChild(div); 3634 3635 if (typeof div.style.zoom !== "undefined") { 3636 3637 // Support: IE<8 3638 // Check if natively block-level elements act like inline-block 3639 // elements when setting their display to 'inline' and giving 3640 // them layout 3641 div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; 3642 3643 support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; 3644 if (val) { 3645 3646 // Prevent IE 6 from affecting layout for positioned elements #11048 3647 // Prevent IE from shrinking the body in IE 7 mode #12869
vendor: 12,463 bytes, lines 3648-4159
3648 // Support: IE<8 3649 body.style.zoom = 1; 3650 } 3651 } 3652 3653 body.removeChild(container); 3654 }); 3655 3656 (function () { 3657 var div = document.createElement("div"); 3658 3659 // Support: IE<9 3660 support.deleteExpando = true; 3661 try { 3662 delete div.test; 3663 } catch (e) { 3664 support.deleteExpando = false; 3665 } 3666 3667 // Null elements to avoid leaks in IE. 3668 div = null; 3669 })(); 3670 var acceptData = function (elem) { 3671 var noData = jQuery.noData[(elem.nodeName + " ").toLowerCase()], 3672 nodeType = +elem.nodeType || 1; 3673 3674 // Do not set data on non-element DOM nodes because it will not be cleared (#8335). 3675 return nodeType !== 1 && nodeType !== 9 ? false : 3676 3677 // Nodes accept data unless otherwise specified; rejection can be conditional 3678 !noData || noData !== true && elem.getAttribute("classid") === noData; 3679 }; 3680 3681 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 3682 rmultiDash = /([A-Z])/g; 3683 3684 function dataAttr(elem, key, data) { 3685 3686 // If nothing was found internally, try to fetch any 3687 // data from the HTML5 data-* attribute 3688 if (data === undefined && elem.nodeType === 1) { 3689 3690 var name = "data-" + key.replace(rmultiDash, "-$1").toLowerCase(); 3691 3692 data = elem.getAttribute(name); 3693 3694 if (typeof data === "string") { 3695 try { 3696 data = data === "true" ? true : data === "false" ? false : data === "null" ? null : 3697 3698 // Only convert to a number if it doesn't change the string 3699 +data + "" === data ? +data : rbrace.test(data) ? jQuery.parseJSON(data) : data; 3700 } catch (e) {} 3701 3702 // Make sure we set the data so it isn't changed later 3703 jQuery.data(elem, key, data); 3704 } else { 3705 data = undefined; 3706 } 3707 } 3708 3709 return data; 3710 } 3711 3712 // checks a cache object for emptiness 3713 function isEmptyDataObject(obj) { 3714 var name; 3715 for (name in obj) { 3716 3717 // if the public data object is empty, the private is still empty 3718 if (name === "data" && jQuery.isEmptyObject(obj[name])) { 3719 continue; 3720 } 3721 if (name !== "toJSON") { 3722 return false; 3723 } 3724 } 3725 3726 return true; 3727 } 3728 3729 function internalData(elem, name, data, pvt /* Internal Use Only */) { 3730 if (!acceptData(elem)) { 3731 return; 3732 } 3733 3734 var ret, 3735 thisCache, 3736 internalKey = jQuery.expando, 3737 3738 3739 // We have to handle DOM nodes and JS objects differently because IE6-7 3740 // can't GC object references properly across the DOM-JS boundary 3741 isNode = elem.nodeType, 3742 3743 3744 // Only DOM nodes need the global jQuery cache; JS object data is 3745 // attached directly to the object so GC can occur automatically 3746 cache = isNode ? jQuery.cache : elem, 3747 3748 3749 // Only defining an ID for JS objects if its cache already exists allows 3750 // the code to shortcut on the same path as a DOM node with no cache 3751 id = isNode ? elem[internalKey] : elem[internalKey] && internalKey; 3752 3753 // Avoid doing any more work than we need to when trying to get data on an 3754 // object that has no data at all 3755 if ((!id || !cache[id] || !pvt && !cache[id].data) && data === undefined && typeof name === "string") { 3756 return; 3757 } 3758 3759 if (!id) { 3760 3761 // Only DOM nodes need a new unique ID for each element since their data 3762 // ends up in the global cache 3763 if (isNode) { 3764 id = elem[internalKey] = deletedIds.pop() || jQuery.guid++; 3765 } else { 3766 id = internalKey; 3767 } 3768 } 3769 3770 if (!cache[id]) { 3771 3772 // Avoid exposing jQuery metadata on plain JS objects when the object 3773 // is serialized using JSON.stringify 3774 cache[id] = isNode ? {} : { toJSON: jQuery.noop }; 3775 } 3776 3777 // An object can be passed to jQuery.data instead of a key/value pair; this gets 3778 // shallow copied over onto the existing cache 3779 if (typeof name === "object" || typeof name === "function") { 3780 if (pvt) { 3781 cache[id] = jQuery.extend(cache[id], name); 3782 } else { 3783 cache[id].data = jQuery.extend(cache[id].data, name); 3784 } 3785 } 3786 3787 thisCache = cache[id]; 3788 3789 // jQuery data() is stored in a separate object inside the object's internal data 3790 // cache in order to avoid key collisions between internal data and user-defined 3791 // data. 3792 if (!pvt) { 3793 if (!thisCache.data) { 3794 thisCache.data = {}; 3795 } 3796 3797 thisCache = thisCache.data; 3798 } 3799 3800 if (data !== undefined) { 3801 thisCache[jQuery.camelCase(name)] = data; 3802 } 3803 3804 // Check for both converted-to-camel and non-converted data property names 3805 // If a data property was specified 3806 if (typeof name === "string") { 3807 3808 // First Try to find as-is property data 3809 ret = thisCache[name]; 3810 3811 // Test for null|undefined property data 3812 if (ret == null) { 3813 3814 // Try to find the camelCased property 3815 ret = thisCache[jQuery.camelCase(name)]; 3816 } 3817 } else { 3818 ret = thisCache; 3819 } 3820 3821 return ret; 3822 } 3823 3824 function internalRemoveData(elem, name, pvt) { 3825 if (!acceptData(elem)) { 3826 return; 3827 } 3828 3829 var thisCache, 3830 i, 3831 isNode = elem.nodeType, 3832 3833 3834 // See jQuery.data for more information 3835 cache = isNode ? jQuery.cache : elem, 3836 id = isNode ? elem[jQuery.expando] : jQuery.expando; 3837 3838 // If there is already no cache entry for this object, there is no 3839 // purpose in continuing 3840 if (!cache[id]) { 3841 return; 3842 } 3843 3844 if (name) { 3845 3846 thisCache = pvt ? cache[id] : cache[id].data; 3847 3848 if (thisCache) { 3849 3850 // Support array or space separated string names for data keys 3851 if (!jQuery.isArray(name)) { 3852 3853 // try the string as a key before any manipulation 3854 if (name in thisCache) { 3855 name = [name]; 3856 } else { 3857 3858 // split the camel cased version by spaces unless a key with the spaces exists 3859 name = jQuery.camelCase(name); 3860 if (name in thisCache) { 3861 name = [name]; 3862 } else { 3863 name = name.split(" "); 3864 } 3865 } 3866 } else { 3867 3868 // If "name" is an array of keys... 3869 // When data is initially created, via ("key", "val") signature, 3870 // keys will be converted to camelCase. 3871 // Since there is no way to tell _how_ a key was added, remove 3872 // both plain key and camelCase key. #12786 3873 // This will only penalize the array argument path. 3874 name = name.concat(jQuery.map(name, jQuery.camelCase)); 3875 } 3876 3877 i = name.length; 3878 while (i--) { 3879 delete thisCache[name[i]]; 3880 } 3881 3882 // If there is no data left in the cache, we want to continue 3883 // and let the cache object itself get destroyed 3884 if (pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache)) { 3885 return; 3886 } 3887 } 3888 } 3889 3890 // See jQuery.data for more information 3891 if (!pvt) { 3892 delete cache[id].data; 3893 3894 // Don't destroy the parent cache unless the internal data object 3895 // had been the only thing left in it 3896 if (!isEmptyDataObject(cache[id])) { 3897 return; 3898 } 3899 } 3900 3901 // Destroy the cache 3902 if (isNode) { 3903 jQuery.cleanData([elem], true); 3904 3905 // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) 3906 /* jshint eqeqeq: false */ 3907 } else if (support.deleteExpando || cache != cache.window) { 3908 /* jshint eqeqeq: true */ 3909 delete cache[id]; 3910 3911 // When all else fails, undefined 3912 } else { 3913 cache[id] = undefined; 3914 } 3915 } 3916 3917 jQuery.extend({ 3918 cache: {}, 3919 3920 // The following elements (space-suffixed to avoid Object.prototype collisions) 3921 // throw uncatchable exceptions if you attempt to set expando properties 3922 noData: { 3923 "applet ": true, 3924 "embed ": true, 3925 3926 // ...but Flash objects (which have this classid) *can* handle expandos 3927 "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 3928 }, 3929 3930 hasData: function (elem) { 3931 elem = elem.nodeType ? jQuery.cache[elem[jQuery.expando]] : elem[jQuery.expando]; 3932 return !!elem && !isEmptyDataObject(elem); 3933 }, 3934 3935 data: function (elem, name, data) { 3936 return internalData(elem, name, data); 3937 }, 3938 3939 removeData: function (elem, name) { 3940 return internalRemoveData(elem, name); 3941 }, 3942 3943 // For internal use only. 3944 _data: function (elem, name, data) { 3945 return internalData(elem, name, data, true); 3946 }, 3947 3948 _removeData: function (elem, name) { 3949 return internalRemoveData(elem, name, true); 3950 } 3951 }); 3952 3953 jQuery.fn.extend({ 3954 data: function (key, value) { 3955 var i, 3956 name, 3957 data, 3958 elem = this[0], 3959 attrs = elem && elem.attributes; 3960 3961 // Special expections of .data basically thwart jQuery.access, 3962 // so implement the relevant behavior ourselves 3963 3964 // Gets all values 3965 if (key === undefined) { 3966 if (this.length) { 3967 data = jQuery.data(elem); 3968 3969 if (elem.nodeType === 1 && !jQuery._data(elem, "parsedAttrs")) { 3970 i = attrs.length; 3971 while (i--) { 3972 3973 // Support: IE11+ 3974 // The attrs elements can be null (#14894) 3975 if (attrs[i]) { 3976 name = attrs[i].name; 3977 if (name.indexOf("data-") === 0) { 3978 name = jQuery.camelCase(name.slice(5)); 3979 dataAttr(elem, name, data[name]); 3980 } 3981 } 3982 } 3983 jQuery._data(elem, "parsedAttrs", true); 3984 } 3985 } 3986 3987 return data; 3988 } 3989 3990 // Sets multiple values 3991 if (typeof key === "object") { 3992 return this.each(function () { 3993 jQuery.data(this, key); 3994 }); 3995 } 3996 3997 return arguments.length > 1 ? 3998 3999 // Sets one value 4000 this.each(function () { 4001 jQuery.data(this, key, value); 4002 }) : 4003 4004 // Gets one value 4005 // Try to fetch any internally stored data first 4006 elem ? dataAttr(elem, key, jQuery.data(elem, key)) : undefined; 4007 }, 4008 4009 removeData: function (key) { 4010 return this.each(function () { 4011 jQuery.removeData(this, key); 4012 }); 4013 } 4014 }); 4015 4016 jQuery.extend({ 4017 queue: function (elem, type, data) { 4018 var queue; 4019 4020 if (elem) { 4021 type = (type || "fx") + "queue"; 4022 queue = jQuery._data(elem, type); 4023 4024 // Speed up dequeue by getting out quickly if this is just a lookup 4025 if (data) { 4026 if (!queue || jQuery.isArray(data)) { 4027 queue = jQuery._data(elem, type, jQuery.makeArray(data)); 4028 } else { 4029 queue.push(data); 4030 } 4031 } 4032 return queue || []; 4033 } 4034 }, 4035 4036 dequeue: function (elem, type) { 4037 type = type || "fx"; 4038 4039 var queue = jQuery.queue(elem, type), 4040 startLength = queue.length, 4041 fn = queue.shift(), 4042 hooks = jQuery._queueHooks(elem, type), 4043 next = function () { 4044 jQuery.dequeue(elem, type); 4045 }; 4046 4047 // If the fx queue is dequeued, always remove the progress sentinel 4048 if (fn === "inprogress") { 4049 fn = queue.shift(); 4050 startLength--; 4051 } 4052 4053 if (fn) { 4054 4055 // Add a progress sentinel to prevent the fx queue from being 4056 // automatically dequeued 4057 if (type === "fx") { 4058 queue.unshift("inprogress"); 4059 } 4060 4061 // clear up the last queue stop function 4062 delete hooks.stop; 4063 fn.call(elem, next, hooks); 4064 } 4065 4066 if (!startLength && hooks) { 4067 hooks.empty.fire(); 4068 } 4069 }, 4070 4071 // not intended for public consumption - generates a queueHooks object, 4072 // or returns the current one 4073 _queueHooks: function (elem, type) { 4074 var key = type + "queueHooks"; 4075 return jQuery._data(elem, key) || jQuery._data(elem, key, { 4076 empty: jQuery.Callbacks("once memory").add(function () { 4077 jQuery._removeData(elem, type + "queue"); 4078 jQuery._removeData(elem, key); 4079 }) 4080 }); 4081 } 4082 }); 4083 4084 jQuery.fn.extend({ 4085 queue: function (type, data) { 4086 var setter = 2; 4087 4088 if (typeof type !== "string") { 4089 data = type; 4090 type = "fx"; 4091 setter--; 4092 } 4093 4094 if (arguments.length < setter) { 4095 return jQuery.queue(this[0], type); 4096 } 4097 4098 return data === undefined ? this : this.each(function () { 4099 var queue = jQuery.queue(this, type, data); 4100 4101 // ensure a hooks for this queue 4102 jQuery._queueHooks(this, type); 4103 4104 if (type === "fx" && queue[0] !== "inprogress") { 4105 jQuery.dequeue(this, type); 4106 } 4107 }); 4108 }, 4109 dequeue: function (type) { 4110 return this.each(function () { 4111 jQuery.dequeue(this, type); 4112 }); 4113 }, 4114 clearQueue: function (type) { 4115 return this.queue(type || "fx", []); 4116 }, 4117 4118 // Get a promise resolved when queues of a certain type 4119 // are emptied (fx is the type by default) 4120 promise: function (type, obj) { 4121 var tmp, 4122 count = 1, 4123 defer = jQuery.Deferred(), 4124 elements = this, 4125 i = this.length, 4126 resolve = function () { 4127 if (! --count) { 4128 defer.resolveWith(elements, [elements]); 4129 } 4130 }; 4131 4132 if (typeof type !== "string") { 4133 obj = type; 4134 type = undefined; 4135 } 4136 type = type || "fx"; 4137 4138 while (i--) { 4139 tmp = jQuery._data(elements[i], type + "queueHooks"); 4140 if (tmp && tmp.empty) { 4141 count++; 4142 tmp.empty.add(resolve); 4143 } 4144 } 4145 resolve(); 4146 return defer.promise(obj); 4147 } 4148 }); 4149 4150 (function () { 4151 var shrinkWrapBlocksVal; 4152 4153 support.shrinkWrapBlocks = function () { 4154 if (shrinkWrapBlocksVal != null) { 4155 return shrinkWrapBlocksVal; 4156 } 4157 4158 // Will be changed later if needed. 4159 shrinkWrapBlocksVal = false;
4160 4161 // Minified: var b,c,d 4162 var div, body, container; 4163 4164 body = document.getElementsByTagName("body")[0]; 4165 if (!body || !body.style) { 4166 4167 // Test fired too early or in an unsupported environment, exit. 4168 return; 4169 } 4170 4171 // Setup 4172 div = document.createElement("div"); 4173 container = document.createElement("div"); 4174 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; 4175 body.appendChild(container).appendChild(div); 4176 4177 // Support: IE6 4178 // Check if elements with layout shrink-wrap their children 4179 if (typeof div.style.zoom !== "undefined") { 4180 4181 // Reset CSS: box-sizing; display; margin; border 4182 div.style.cssText = 4183 4184 // Support: Firefox<29, Android 2.3 4185 // Vendor-prefix box-sizing 4186 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + "box-sizing:content-box;display:block;margin:0;border:0;" + "padding:1px;width:1px;zoom:1"; 4187 div.appendChild(document.createElement("div")).style.width = "5px"; 4188 shrinkWrapBlocksVal = div.offsetWidth !== 3; 4189 } 4190 4191 body.removeChild(container); 4192 4193 return shrinkWrapBlocksVal; 4194 }; 4195 })(); 4196 var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source; 4197 4198 var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i"); 4199 4200 var cssExpand = ["Top", "Right", "Bottom", "Left"]; 4201 4202 var isHidden = function (elem, el) { 4203 4204 // isHidden might be called from jQuery#filter function; 4205 // in that case, element will be second argument 4206 elem = el || elem; 4207 return jQuery.css(elem, "display") === "none" || !jQuery.contains(elem.ownerDocument, elem); 4208 }; 4209 4210 function adjustCSS(elem, prop, valueParts, tween) { 4211 var adjusted, 4212 scale = 1, 4213 maxIterations = 20, 4214 currentValue = tween ? function () { 4215 return tween.cur(); 4216 } : function () { 4217 return jQuery.css(elem, prop, ""); 4218 }, 4219 initial = currentValue(), 4220 unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), 4221 4222 4223 // Starting value computation is required for potential unit mismatches 4224 initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop)); 4225 4226 if (initialInUnit && initialInUnit[3] !== unit) { 4227 4228 // Trust units reported by jQuery.css 4229 unit = unit || initialInUnit[3]; 4230 4231 // Make sure we update the tween properties later on 4232 valueParts = valueParts || []; 4233 4234 // Iteratively approximate from a nonzero starting point 4235 initialInUnit = +initial || 1; 4236 4237 do { 4238 4239 // If previous iteration zeroed out, double until we get *something*. 4240 // Use string for doubling so we don't accidentally see scale as unchanged below 4241 scale = scale || ".5"; 4242 4243 // Adjust and apply 4244 initialInUnit = initialInUnit / scale; 4245 jQuery.style(elem, prop, initialInUnit + unit); 4246 4247 // Update scale, tolerating zero or NaN from tween.cur() 4248 // Break the loop if scale is unchanged or perfect, or if we've just had enough. 4249 } while (scale !== (scale = currentValue() / initial) && scale !== 1 && --maxIterations); 4250 } 4251 4252 if (valueParts) { 4253 initialInUnit = +initialInUnit || +initial || 0; 4254 4255 // Apply relative offset (+=/-=) if specified 4256 adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2]; 4257 if (tween) { 4258 tween.unit = unit; 4259 tween.start = initialInUnit; 4260 tween.end = adjusted; 4261 } 4262 } 4263 return adjusted; 4264 } 4265 4266 // Multifunctional method to get and set values of a collection 4267 // The value/s can optionally be executed if it's a function 4268 var access = function (elems, fn, key, value, chainable, emptyGet, raw) { 4269 var i = 0, 4270 length = elems.length, 4271 bulk = key == null; 4272 4273 // Sets many values 4274 if (jQuery.type(key) === "object") { 4275 chainable = true; 4276 for (i in key) { 4277 access(elems, fn, i, key[i], true, emptyGet, raw); 4278 } 4279 4280 // Sets one value 4281 } else if (value !== undefined) { 4282 chainable = true; 4283 4284 if (!jQuery.isFunction(value)) { 4285 raw = true; 4286 } 4287 4288 if (bulk) { 4289 4290 // Bulk operations run against the entire set 4291 if (raw) { 4292 fn.call(elems, value); 4293 fn = null; 4294 4295 // ...except when executing function values 4296 } else { 4297 bulk = fn; 4298 fn = function (elem, key, value) {
4299 return bulk.call(jQuery(elem), value); 4300 }; 4301 } 4302 } 4303 4304 if (fn) { 4305 for (; i < length; i++) { 4306 fn(elems[i], key, raw ? value : value.call(elems[i], i, fn(elems[i], key))); 4307 } 4308 } 4309 } 4310 4311 return chainable ? elems : 4312 4313 // Gets 4314 bulk ? fn.call(elems) : length ? fn(elems[0], key) : emptyGet; 4315 }; 4316 var rcheckableType = /^(?:checkbox|radio)$/i; 4317 4318 var rtagName = /<([\w:-]+)/; 4319 4320 var rscriptType = /^$|\/(?:java|ecma)script/i; 4321 4322 var rleadingWhitespace = /^\s+/; 4323 4324 var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; 4325 4326 function createSafeFragment(document) { 4327 var list = nodeNames.split("|"), 4328 safeFrag = document.createDocumentFragment(); 4329 4330 if (safeFrag.createElement) { 4331 while (list.length) { 4332 safeFrag.createElement(list.pop()); 4333 } 4334 } 4335 return safeFrag; 4336 } 4337 4338 (function () { 4339 var div = document.createElement("div"), 4340 fragment = document.createDocumentFragment(), 4341 input = document.createElement("input"); 4342 4343 // Setup 4344 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; 4345 4346 // IE strips leading whitespace when .innerHTML is used 4347 support.leadingWhitespace = div.firstChild.nodeType === 3; 4348 4349 // Make sure that tbody elements aren't automatically inserted 4350 // IE will insert them into empty tables 4351 support.tbody = !div.getElementsByTagName("tbody").length; 4352 4353 // Make sure that link elements get serialized correctly by innerHTML 4354 // This requires a wrapper element in IE 4355 support.htmlSerialize = !!div.getElementsByTagName("link").length; 4356 4357 // Makes sure cloning an html5 element does not cause problems 4358 // Where outerHTML is undefined, this still works 4359 support.html5Clone = document.createElement("nav").cloneNode(true).outerHTML !== "<:nav></:nav>"; 4360 4361 // Check if a disconnected checkbox will retain its checked 4362 // value of true after appended to the DOM (IE6/7) 4363 input.type = "checkbox"; 4364 input.checked = true; 4365 fragment.appendChild(input); 4366 support.appendChecked = input.checked; 4367 4368 // Make sure textarea (and checkbox) defaultValue is properly cloned 4369 // Support: IE6-IE11+ 4370 div.innerHTML = "<textarea>x</textarea>"; 4371 support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue; 4372 4373 // #11217 - WebKit loses check when the name is after the checked attribute 4374 fragment.appendChild(div); 4375 4376 // Support: Windows Web Apps (WWA) 4377 // `name` and `type` must use .setAttribute for WWA (#14901) 4378 input = document.createElement("input"); 4379 input.setAttribute("type", "radio"); 4380 input.setAttribute("checked", "checked"); 4381 input.setAttribute("name", "t"); 4382 4383 div.appendChild(input); 4384 4385 // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 4386 // old WebKit doesn't clone checked state correctly in fragments 4387 support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked; 4388 4389 // Support: IE<9 4390 // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ 4391 support.noCloneEvent = !!div.addEventListener; 4392 4393 // Support: IE<9 4394 // Since attributes and properties are the same in IE, 4395 // cleanData must set properties to undefined rather than use removeAttribute 4396 div[jQuery.expando] = 1; 4397 support.attributes = !div.getAttribute(jQuery.expando); 4398 })(); 4399 4400 // We have to close these tags to support XHTML (#13200) 4401 var wrapMap = { 4402 option: [1, "<select multiple='multiple'>", "</select>"], 4403 legend: [1, "<fieldset>", "</fieldset>"], 4404 area: [1, "<map>", "</map>"], 4405 4406 // Support: IE8 4407 param: [1, "<object>", "</object>"], 4408 thead: [1, "<table>", "</table>"], 4409 tr: [2, "<table><tbody>", "</tbody></table>"], 4410 col: [2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"], 4411 td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], 4412 4413 // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, 4414 // unless wrapped in a div with non-breaking characters in front of it. 4415 _default: support.htmlSerialize ? [0, "", ""] : [1, "X<div>", "</div>"] 4416 }; 4417 4418 // Support: IE8-IE9 4419 wrapMap.optgroup = wrapMap.option; 4420 4421 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 4422 wrapMap.th = wrapMap.td; 4423 4424 function getAll(context, tag) { 4425 var elems, 4426 elem, 4427 i = 0, 4428 found = typeof context.getElementsByTagName !== "undefined" ? context.getElementsByTagName(tag || "*") : typeof context.querySelectorAll !== "undefined" ? context.querySelectorAll(tag || "*") : undefined; 4429 4430 if (!found) { 4431 for (found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++) { 4432 if (!tag || jQuery.nodeName(elem, tag)) { 4433 found.push(elem); 4434 } else { 4435 jQuery.merge(found, getAll(elem, tag)); 4436 } 4437 } 4438 } 4439 4440 return tag === undefined || tag && jQuery.nodeName(context, tag) ? jQuery.merge([context], found) : found; 4441 } 4442 4443 // Mark scripts as having already been evaluated 4444 function setGlobalEval(elems, refElements) { 4445 var elem, 4446 i = 0; 4447 for (; (elem = elems[i]) != null; i++) { 4448 jQuery._data(elem, "globalEval", !refElements || jQuery._data(refElements[i], "globalEval")); 4449 } 4450 } 4451
4452 var rhtml = /<|&#?\w+;/, 4453 rtbody = /<tbody/i; 4454 4455 function fixDefaultChecked(elem) { 4456 if (rcheckableType.test(elem.type)) { 4457 elem.defaultChecked = elem.checked; 4458 } 4459 } 4460 4461 function buildFragment(elems, context, scripts, selection, ignored) { 4462 var j, 4463 elem, 4464 contains, 4465 tmp, 4466 tag, 4467 tbody, 4468 wrap, 4469 l = elems.length, 4470 4471 4472 // Ensure a safe fragment 4473 safe = createSafeFragment(context), 4474 nodes = [], 4475 i = 0; 4476 4477 for (; i < l; i++) { 4478 elem = elems[i]; 4479 4480 if (elem || elem === 0) { 4481 4482 // Add nodes directly 4483 if (jQuery.type(elem) === "object") { 4484 jQuery.merge(nodes, elem.nodeType ? [elem] : elem); 4485 4486 // Convert non-html into a text node 4487 } else if (!rhtml.test(elem)) { 4488 nodes.push(context.createTextNode(elem)); 4489 4490 // Convert html into DOM nodes 4491 } else { 4492 tmp = tmp || safe.appendChild(context.createElement("div")); 4493 4494 // Deserialize a standard representation 4495 tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase(); 4496 wrap = wrapMap[tag] || wrapMap._default; 4497 4498 tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2]; 4499 4500 // Descend through wrappers to the right content 4501 j = wrap[0]; 4502 while (j--) { 4503 tmp = tmp.lastChild; 4504 } 4505 4506 // Manually add leading whitespace removed by IE 4507 if (!support.leadingWhitespace && rleadingWhitespace.test(elem)) { 4508 nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0])); 4509 } 4510 4511 // Remove IE's autoinserted <tbody> from table fragments 4512 if (!support.tbody) { 4513 4514 // String was a <table>, *may* have spurious <tbody> 4515 elem = tag === "table" && !rtbody.test(elem) ? tmp.firstChild : 4516 4517 // String was a bare <thead> or <tfoot> 4518 wrap[1] === "<table>" && !rtbody.test(elem) ? tmp : 0; 4519 4520 j = elem && elem.childNodes.length; 4521 while (j--) { 4522 if (jQuery.nodeName(tbody = elem.childNodes[j], "tbody") && !tbody.childNodes.length) { 4523 4524 elem.removeChild(tbody); 4525 } 4526 } 4527 } 4528 4529 jQuery.merge(nodes, tmp.childNodes); 4530 4531 // Fix #12392 for WebKit and IE > 9 4532 tmp.textContent = ""; 4533 4534 // Fix #12392 for oldIE 4535 while (tmp.firstChild) { 4536 tmp.removeChild(tmp.firstChild); 4537 } 4538 4539 // Remember the top-level container for proper cleanup 4540 tmp = safe.lastChild; 4541 } 4542 } 4543 } 4544 4545 // Fix #11356: Clear elements from fragment 4546 if (tmp) { 4547 safe.removeChild(tmp); 4548 } 4549 4550 // Reset defaultChecked for any radios and checkboxes 4551 // about to be appended to the DOM in IE 6/7 (#8060) 4552 if (!support.appendChecked) { 4553 jQuery.grep(getAll(nodes, "input"), fixDefaultChecked); 4554 } 4555 4556 i = 0; 4557 while (elem = nodes[i++]) { 4558 4559 // Skip elements already in the context collection (trac-4087) 4560 if (selection && jQuery.inArray(elem, selection) > -1) { 4561 if (ignored) { 4562 ignored.push(elem); 4563 } 4564 4565 continue; 4566 } 4567 4568 contains = jQuery.contains(elem.ownerDocument, elem); 4569 4570 // Append to fragment 4571 tmp = getAll(safe.appendChild(elem), "script"); 4572 4573 // Preserve script evaluation history 4574 if (contains) { 4575 setGlobalEval(tmp); 4576 } 4577 4578 // Capture executables 4579 if (scripts) { 4580 j = 0; 4581 while (elem = tmp[j++]) { 4582 if (rscriptType.test(elem.type || "")) { 4583 scripts.push(elem); 4584 } 4585 } 4586 } 4587 } 4588 4589 tmp = null; 4590 4591 return safe; 4592 } 4593 4594 (function () { 4595 var i, 4596 eventName, 4597 div = document.createElement("div"); 4598 4599 // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) 4600 for (i in { submit: true, change: true, focusin: true }) { 4601 eventName = "on" + i; 4602
vendor: 28,100 bytes, lines 4603-5571
4603 if (!(support[i] = eventName in window)) { 4604 4605 // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) 4606 div.setAttribute(eventName, "t"); 4607 support[i] = div.attributes[eventName].expando === false; 4608 } 4609 } 4610 4611 // Null elements to avoid leaks in IE. 4612 div = null; 4613 })(); 4614 4615 var rformElems = /^(?:input|select|textarea)$/i, 4616 rkeyEvent = /^key/, 4617 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, 4618 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 4619 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 4620 4621 function returnTrue() { 4622 return true; 4623 } 4624 4625 function returnFalse() { 4626 return false; 4627 } 4628 4629 // Support: IE9 4630 // See #13393 for more info 4631 function safeActiveElement() { 4632 try { 4633 return document.activeElement; 4634 } catch (err) {} 4635 } 4636 4637 function on(elem, types, selector, data, fn, one) { 4638 var origFn, type; 4639 4640 // Types can be a map of types/handlers 4641 if (typeof types === "object") { 4642 4643 // ( types-Object, selector, data ) 4644 if (typeof selector !== "string") { 4645 4646 // ( types-Object, data ) 4647 data = data || selector; 4648 selector = undefined; 4649 } 4650 for (type in types) { 4651 on(elem, type, selector, data, types[type], one); 4652 } 4653 return elem; 4654 } 4655 4656 if (data == null && fn == null) { 4657 4658 // ( types, fn ) 4659 fn = selector; 4660 data = selector = undefined; 4661 } else if (fn == null) { 4662 if (typeof selector === "string") { 4663 4664 // ( types, selector, fn ) 4665 fn = data; 4666 data = undefined; 4667 } else { 4668 4669 // ( types, data, fn ) 4670 fn = data; 4671 data = selector; 4672 selector = undefined; 4673 } 4674 } 4675 if (fn === false) { 4676 fn = returnFalse; 4677 } else if (!fn) { 4678 return elem; 4679 } 4680 4681 if (one === 1) { 4682 origFn = fn; 4683 fn = function (event) { 4684 4685 // Can use an empty set, since event contains the info 4686 jQuery().off(event); 4687 return origFn.apply(this, arguments); 4688 }; 4689 4690 // Use same guid so caller can remove using origFn 4691 fn.guid = origFn.guid || (origFn.guid = jQuery.guid++); 4692 } 4693 return elem.each(function () { 4694 jQuery.event.add(this, types, fn, data, selector); 4695 }); 4696 } 4697 4698 /* 4699 * Helper functions for managing events -- not part of the public interface. 4700 * Props to Dean Edwards' addEvent library for many of the ideas. 4701 */ 4702 jQuery.event = { 4703 4704 global: {}, 4705 4706 add: function (elem, types, handler, data, selector) { 4707 var tmp, 4708 events, 4709 t, 4710 handleObjIn, 4711 special, 4712 eventHandle, 4713 handleObj, 4714 handlers, 4715 type, 4716 namespaces, 4717 origType, 4718 elemData = jQuery._data(elem); 4719 4720 // Don't attach events to noData or text/comment nodes (but allow plain objects) 4721 if (!elemData) { 4722 return; 4723 } 4724 4725 // Caller can pass in an object of custom data in lieu of the handler 4726 if (handler.handler) { 4727 handleObjIn = handler; 4728 handler = handleObjIn.handler; 4729 selector = handleObjIn.selector; 4730 } 4731 4732 // Make sure that the handler has a unique ID, used to find/remove it later 4733 if (!handler.guid) { 4734 handler.guid = jQuery.guid++; 4735 } 4736 4737 // Init the element's event structure and main handler, if this is the first 4738 if (!(events = elemData.events)) { 4739 events = elemData.events = {}; 4740 } 4741 if (!(eventHandle = elemData.handle)) { 4742 eventHandle = elemData.handle = function (e) { 4743 4744 // Discard the second event of a jQuery.event.trigger() and 4745 // when an event is called after a page has unloaded 4746 return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? jQuery.event.dispatch.apply(eventHandle.elem, arguments) : undefined; 4747 }; 4748 4749 // Add elem as a property of the handle fn to prevent a memory leak 4750 // with IE non-native events 4751 eventHandle.elem = elem; 4752 } 4753 4754 // Handle multiple events separated by a space 4755 types = (types || "").match(rnotwhite) || [""]; 4756 t = types.length; 4757 while (t--) { 4758 tmp = rtypenamespace.exec(types[t]) || []; 4759 type = origType = tmp[1]; 4760 namespaces = (tmp[2] || "").split(".").sort(); 4761 4762 // There *must* be a type, no attaching namespace-only handlers 4763 if (!type) { 4764 continue; 4765 } 4766 4767 // If event changes its type, use the special event handlers for the changed type 4768 special = jQuery.event.special[type] || {}; 4769 4770 // If selector defined, determine special event api type, otherwise given type 4771 type = (selector ? special.delegateType : special.bindType) || type; 4772 4773 // Update special based on newly reset type 4774 special = jQuery.event.special[type] || {}; 4775 4776 // handleObj is passed to all event handlers 4777 handleObj = jQuery.extend({ 4778 type: type, 4779 origType: origType, 4780 data: data, 4781 handler: handler, 4782 guid: handler.guid, 4783 selector: selector, 4784 needsContext: selector && jQuery.expr.match.needsContext.test(selector), 4785 namespace: namespaces.join(".") 4786 }, handleObjIn); 4787 4788 // Init the event handler queue if we're the first 4789 if (!(handlers = events[type])) { 4790 handlers = events[type] = []; 4791 handlers.delegateCount = 0; 4792 4793 // Only use addEventListener/attachEvent if the special events handler returns false 4794 if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) { 4795 4796 // Bind the global event handler to the element 4797 if (elem.addEventListener) { 4798 elem.addEventListener(type, eventHandle, false); 4799 } else if (elem.attachEvent) { 4800 elem.attachEvent("on" + type, eventHandle); 4801 } 4802 } 4803 } 4804 4805 if (special.add) { 4806 special.add.call(elem, handleObj); 4807 4808 if (!handleObj.handler.guid) { 4809 handleObj.handler.guid = handler.guid; 4810 } 4811 } 4812 4813 // Add to the element's handler list, delegates in front 4814 if (selector) { 4815 handlers.splice(handlers.delegateCount++, 0, handleObj); 4816 } else { 4817 handlers.push(handleObj); 4818 } 4819 4820 // Keep track of which events have ever been used, for event optimization 4821 jQuery.event.global[type] = true; 4822 } 4823 4824 // Nullify elem to prevent memory leaks in IE 4825 elem = null; 4826 }, 4827 4828 // Detach an event or set of events from an element 4829 remove: function (elem, types, handler, selector, mappedTypes) { 4830 var j, 4831 handleObj, 4832 tmp, 4833 origCount, 4834 t, 4835 events, 4836 special, 4837 handlers, 4838 type, 4839 namespaces, 4840 origType, 4841 elemData = jQuery.hasData(elem) && jQuery._data(elem); 4842 4843 if (!elemData || !(events = elemData.events)) { 4844 return; 4845 } 4846 4847 // Once for each type.namespace in types; type may be omitted 4848 types = (types || "").match(rnotwhite) || [""]; 4849 t = types.length; 4850 while (t--) { 4851 tmp = rtypenamespace.exec(types[t]) || []; 4852 type = origType = tmp[1]; 4853 namespaces = (tmp[2] || "").split(".").sort(); 4854 4855 // Unbind all events (on this namespace, if provided) for the element 4856 if (!type) { 4857 for (type in events) { 4858 jQuery.event.remove(elem, type + types[t], handler, selector, true); 4859 } 4860 continue; 4861 } 4862 4863 special = jQuery.event.special[type] || {}; 4864 type = (selector ? special.delegateType : special.bindType) || type; 4865 handlers = events[type] || []; 4866 tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)"); 4867 4868 // Remove matching events 4869 origCount = j = handlers.length; 4870 while (j--) { 4871 handleObj = handlers[j]; 4872 4873 if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) { 4874 handlers.splice(j, 1); 4875 4876 if (handleObj.selector) { 4877 handlers.delegateCount--; 4878 } 4879 if (special.remove) { 4880 special.remove.call(elem, handleObj); 4881 } 4882 } 4883 } 4884 4885 // Remove generic event handler if we removed something and no more handlers exist 4886 // (avoids potential for endless recursion during removal of special event handlers) 4887 if (origCount && !handlers.length) { 4888 if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) { 4889 4890 jQuery.removeEvent(elem, type, elemData.handle); 4891 } 4892 4893 delete events[type]; 4894 } 4895 } 4896 4897 // Remove the expando if it's no longer used 4898 if (jQuery.isEmptyObject(events)) { 4899 delete elemData.handle; 4900 4901 // removeData also checks for emptiness and clears the expando if empty 4902 // so use it instead of delete 4903 jQuery._removeData(elem, "events"); 4904 } 4905 }, 4906 4907 trigger: function (event, data, elem, onlyHandlers) { 4908 var handle, 4909 ontype, 4910 cur, 4911 bubbleType, 4912 special, 4913 tmp, 4914 i, 4915 eventPath = [elem || document], 4916 type = hasOwn.call(event, "type") ? event.type : event, 4917 namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : []; 4918 4919 cur = tmp = elem = elem || document; 4920 4921 // Don't do events on text and comment nodes 4922 if (elem.nodeType === 3 || elem.nodeType === 8) { 4923 return; 4924 } 4925 4926 // focus/blur morphs to focusin/out; ensure we're not firing them right now 4927 if (rfocusMorph.test(type + jQuery.event.triggered)) { 4928 return; 4929 } 4930 4931 if (type.indexOf(".") > -1) { 4932 4933 // Namespaced trigger; create a regexp to match event type in handle() 4934 namespaces = type.split("."); 4935 type = namespaces.shift(); 4936 namespaces.sort(); 4937 } 4938 ontype = type.indexOf(":") < 0 && "on" + type; 4939 4940 // Caller can pass in a jQuery.Event object, Object, or just an event type string 4941 event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event); 4942 4943 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 4944 event.isTrigger = onlyHandlers ? 2 : 3; 4945 event.namespace = namespaces.join("."); 4946 event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null; 4947 4948 // Clean up the event in case it is being reused 4949 event.result = undefined; 4950 if (!event.target) { 4951 event.target = elem; 4952 } 4953 4954 // Clone any incoming data and prepend the event, creating the handler arg list 4955 data = data == null ? [event] : jQuery.makeArray(data, [event]); 4956 4957 // Allow special events to draw outside the lines 4958 special = jQuery.event.special[type] || {}; 4959 if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) { 4960 return; 4961 } 4962 4963 // Determine event propagation path in advance, per W3C events spec (#9951) 4964 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 4965 if (!onlyHandlers && !special.noBubble && !jQuery.isWindow(elem)) { 4966 4967 bubbleType = special.delegateType || type; 4968 if (!rfocusMorph.test(bubbleType + type)) { 4969 cur = cur.parentNode; 4970 } 4971 for (; cur; cur = cur.parentNode) { 4972 eventPath.push(cur); 4973 tmp = cur; 4974 } 4975 4976 // Only add window if we got to document (e.g., not plain obj or detached DOM) 4977 if (tmp === (elem.ownerDocument || document)) { 4978 eventPath.push(tmp.defaultView || tmp.parentWindow || window); 4979 } 4980 } 4981 4982 // Fire handlers on the event path 4983 i = 0; 4984 while ((cur = eventPath[i++]) && !event.isPropagationStopped()) { 4985 4986 event.type = i > 1 ? bubbleType : special.bindType || type; 4987 4988 // jQuery handler 4989 handle = (jQuery._data(cur, "events") || {})[event.type] && jQuery._data(cur, "handle"); 4990 4991 if (handle) { 4992 handle.apply(cur, data); 4993 } 4994 4995 // Native handler 4996 handle = ontype && cur[ontype]; 4997 if (handle && handle.apply && acceptData(cur)) { 4998 event.result = handle.apply(cur, data); 4999 if (event.result === false) { 5000 event.preventDefault(); 5001 } 5002 } 5003 } 5004 event.type = type; 5005 5006 // If nobody prevented the default action, do it now 5007 if (!onlyHandlers && !event.isDefaultPrevented()) { 5008 5009 if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) { 5010 5011 // Call a native DOM method on the target with the same name name as the event. 5012 // Can't use an .isFunction() check here because IE6/7 fails that test. 5013 // Don't do default actions on window, that's where global variables be (#6170) 5014 if (ontype && elem[type] && !jQuery.isWindow(elem)) { 5015 5016 // Don't re-trigger an onFOO event when we call its FOO() method 5017 tmp = elem[ontype]; 5018 5019 if (tmp) { 5020 elem[ontype] = null; 5021 } 5022 5023 // Prevent re-triggering of the same event, since we already bubbled it above 5024 jQuery.event.triggered = type; 5025 try { 5026 elem[type](); 5027 } catch (e) { 5028 5029 // IE<9 dies on focus/blur to hidden element (#1486,#12518) 5030 // only reproducible on winXP IE8 native, not IE9 in IE8 mode 5031 } 5032 jQuery.event.triggered = undefined; 5033 5034 if (tmp) { 5035 elem[ontype] = tmp; 5036 } 5037 } 5038 } 5039 } 5040 5041 return event.result; 5042 }, 5043 5044 dispatch: function (event) { 5045 5046 // Make a writable jQuery.Event from the native event object 5047 event = jQuery.event.fix(event); 5048 5049 var i, 5050 j, 5051 ret, 5052 matched, 5053 handleObj, 5054 handlerQueue = [], 5055 args = slice.call(arguments), 5056 handlers = (jQuery._data(this, "events") || {})[event.type] || [], 5057 special = jQuery.event.special[event.type] || {}; 5058 5059 // Use the fix-ed jQuery.Event rather than the (read-only) native event 5060 args[0] = event; 5061 event.delegateTarget = this; 5062 5063 // Call the preDispatch hook for the mapped type, and let it bail if desired 5064 if (special.preDispatch && special.preDispatch.call(this, event) === false) { 5065 return; 5066 } 5067 5068 // Determine handlers 5069 handlerQueue = jQuery.event.handlers.call(this, event, handlers); 5070 5071 // Run delegates first; they may want to stop propagation beneath us 5072 i = 0; 5073 while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) { 5074 event.currentTarget = matched.elem; 5075 5076 j = 0; 5077 while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) { 5078 5079 // Triggered event must either 1) have no namespace, or 2) have namespace(s) 5080 // a subset or equal to those in the bound event (both can have no namespace). 5081 if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) { 5082 5083 event.handleObj = handleObj; 5084 event.data = handleObj.data; 5085 5086 ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args); 5087 5088 if (ret !== undefined) { 5089 if ((event.result = ret) === false) { 5090 event.preventDefault(); 5091 event.stopPropagation(); 5092 } 5093 } 5094 } 5095 } 5096 } 5097 5098 // Call the postDispatch hook for the mapped type 5099 if (special.postDispatch) { 5100 special.postDispatch.call(this, event); 5101 } 5102 5103 return event.result; 5104 }, 5105 5106 handlers: function (event, handlers) { 5107 var i, 5108 matches, 5109 sel, 5110 handleObj, 5111 handlerQueue = [], 5112 delegateCount = handlers.delegateCount, 5113 cur = event.target; 5114 5115 // Support (at least): Chrome, IE9 5116 // Find delegate handlers 5117 // Black-hole SVG <use> instance trees (#13180) 5118 // 5119 // Support: Firefox<=42+ 5120 // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) 5121 if (delegateCount && cur.nodeType && (event.type !== "click" || isNaN(event.button) || event.button < 1)) { 5122 5123 /* jshint eqeqeq: false */ 5124 for (; cur != this; cur = cur.parentNode || this) { 5125 /* jshint eqeqeq: true */ 5126 5127 // Don't check non-elements (#13208) 5128 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 5129 if (cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click")) { 5130 matches = []; 5131 for (i = 0; i < delegateCount; i++) { 5132 handleObj = handlers[i]; 5133 5134 // Don't conflict with Object.prototype properties (#13203) 5135 sel = handleObj.selector + " "; 5136 5137 if (matches[sel] === undefined) { 5138 matches[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length; 5139 } 5140 if (matches[sel]) { 5141 matches.push(handleObj); 5142 } 5143 } 5144 if (matches.length) { 5145 handlerQueue.push({ elem: cur, handlers: matches }); 5146 } 5147 } 5148 } 5149 } 5150 5151 // Add the remaining (directly-bound) handlers 5152 if (delegateCount < handlers.length) { 5153 handlerQueue.push({ elem: this, handlers: handlers.slice(delegateCount) }); 5154 } 5155 5156 return handlerQueue; 5157 }, 5158 5159 fix: function (event) { 5160 if (event[jQuery.expando]) { 5161 return event; 5162 } 5163 5164 // Create a writable copy of the event object and normalize some properties 5165 var i, 5166 prop, 5167 copy, 5168 type = event.type, 5169 originalEvent = event, 5170 fixHook = this.fixHooks[type]; 5171 5172 if (!fixHook) { 5173 this.fixHooks[type] = fixHook = rmouseEvent.test(type) ? this.mouseHooks : rkeyEvent.test(type) ? this.keyHooks : {}; 5174 } 5175 copy = fixHook.props ? this.props.concat(fixHook.props) : this.props; 5176 5177 event = new jQuery.Event(originalEvent); 5178 5179 i = copy.length; 5180 while (i--) { 5181 prop = copy[i]; 5182 event[prop] = originalEvent[prop]; 5183 } 5184 5185 // Support: IE<9 5186 // Fix target property (#1925) 5187 if (!event.target) { 5188 event.target = originalEvent.srcElement || document; 5189 } 5190 5191 // Support: Safari 6-8+ 5192 // Target should not be a text node (#504, #13143) 5193 if (event.target.nodeType === 3) { 5194 event.target = event.target.parentNode; 5195 } 5196 5197 // Support: IE<9 5198 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) 5199 event.metaKey = !!event.metaKey; 5200 5201 return fixHook.filter ? fixHook.filter(event, originalEvent) : event; 5202 }, 5203 5204 // Includes some event props shared by KeyEvent and MouseEvent 5205 props: ("altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + "metaKey relatedTarget shiftKey target timeStamp view which").split(" "), 5206 5207 fixHooks: {}, 5208 5209 keyHooks: { 5210 props: "char charCode key keyCode".split(" "), 5211 filter: function (event, original) { 5212 5213 // Add which for key events 5214 if (event.which == null) { 5215 event.which = original.charCode != null ? original.charCode : original.keyCode; 5216 } 5217 5218 return event; 5219 } 5220 }, 5221 5222 mouseHooks: { 5223 props: ("button buttons clientX clientY fromElement offsetX offsetY " + "pageX pageY screenX screenY toElement").split(" "), 5224 filter: function (event, original) { 5225 var body, 5226 eventDoc, 5227 doc, 5228 button = original.button, 5229 fromElement = original.fromElement; 5230 5231 // Calculate pageX/Y if missing and clientX/Y available 5232 if (event.pageX == null && original.clientX != null) { 5233 eventDoc = event.target.ownerDocument || document; 5234 doc = eventDoc.documentElement; 5235 body = eventDoc.body; 5236 5237 event.pageX = original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); 5238 event.pageY = original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); 5239 } 5240 5241 // Add relatedTarget, if necessary 5242 if (!event.relatedTarget && fromElement) { 5243 event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; 5244 } 5245 5246 // Add which for click: 1 === left; 2 === middle; 3 === right 5247 // Note: button is not normalized, so don't use it 5248 if (!event.which && button !== undefined) { 5249 event.which = button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0; 5250 } 5251 5252 return event; 5253 } 5254 }, 5255 5256 special: { 5257 load: { 5258 5259 // Prevent triggered image.load events from bubbling to window.load 5260 noBubble: true 5261 }, 5262 focus: { 5263 5264 // Fire native event if possible so blur/focus sequence is correct 5265 trigger: function () { 5266 if (this !== safeActiveElement() && this.focus) { 5267 try { 5268 this.focus(); 5269 return false; 5270 } catch (e) { 5271 5272 // Support: IE<9 5273 // If we error on focus to hidden element (#1486, #12518), 5274 // let .trigger() run the handlers 5275 } 5276 } 5277 }, 5278 delegateType: "focusin" 5279 }, 5280 blur: { 5281 trigger: function () { 5282 if (this === safeActiveElement() && this.blur) { 5283 this.blur(); 5284 return false; 5285 } 5286 }, 5287 delegateType: "focusout" 5288 }, 5289 click: { 5290 5291 // For checkbox, fire native event so checked state will be right 5292 trigger: function () { 5293 if (jQuery.nodeName(this, "input") && this.type === "checkbox" && this.click) { 5294 this.click(); 5295 return false; 5296 } 5297 }, 5298 5299 // For cross-browser consistency, don't fire native .click() on links 5300 _default: function (event) { 5301 return jQuery.nodeName(event.target, "a"); 5302 } 5303 }, 5304 5305 beforeunload: { 5306 postDispatch: function (event) { 5307 5308 // Support: Firefox 20+ 5309 // Firefox doesn't alert if the returnValue field is not set. 5310 if (event.result !== undefined && event.originalEvent) { 5311 event.originalEvent.returnValue = event.result; 5312 } 5313 } 5314 } 5315 }, 5316 5317 // Piggyback on a donor event to simulate a different one 5318 simulate: function (type, elem, event) { 5319 var e = jQuery.extend(new jQuery.Event(), event, { 5320 type: type, 5321 isSimulated: true 5322 5323 // Previously, `originalEvent: {}` was set here, so stopPropagation call 5324 // would not be triggered on donor event, since in our own 5325 // jQuery.event.stopPropagation function we had a check for existence of 5326 // originalEvent.stopPropagation method, so, consequently it would be a noop. 5327 // 5328 // Guard for simulated events was moved to jQuery.event.stopPropagation function 5329 // since `originalEvent` should point to the original event for the 5330 // constancy with other events and for more focused logic 5331 }); 5332 5333 jQuery.event.trigger(e, null, elem); 5334 5335 if (e.isDefaultPrevented()) { 5336 event.preventDefault(); 5337 } 5338 } 5339 }; 5340 5341 jQuery.removeEvent = document.removeEventListener ? function (elem, type, handle) { 5342 5343 // This "if" is needed for plain objects 5344 if (elem.removeEventListener) { 5345 elem.removeEventListener(type, handle); 5346 } 5347 } : function (elem, type, handle) { 5348 var name = "on" + type; 5349 5350 if (elem.detachEvent) { 5351 5352 // #8545, #7054, preventing memory leaks for custom events in IE6-8 5353 // detachEvent needed property on element, by name of that event, 5354 // to properly expose it to GC 5355 if (typeof elem[name] === "undefined") { 5356 elem[name] = null; 5357 } 5358 5359 elem.detachEvent(name, handle); 5360 } 5361 }; 5362 5363 jQuery.Event = function (src, props) { 5364 5365 // Allow instantiation without the 'new' keyword 5366 if (!(this instanceof jQuery.Event)) { 5367 return new jQuery.Event(src, props); 5368 } 5369 5370 // Event object 5371 if (src && src.type) { 5372 this.originalEvent = src; 5373 this.type = src.type; 5374 5375 // Events bubbling up the document may have been marked as prevented 5376 // by a handler lower down the tree; reflect the correct value. 5377 this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && 5378 5379 // Support: IE < 9, Android < 4.0 5380 src.returnValue === false ? returnTrue : returnFalse; 5381 5382 // Event type 5383 } else { 5384 this.type = src; 5385 } 5386 5387 // Put explicitly provided properties onto the event object 5388 if (props) { 5389 jQuery.extend(this, props); 5390 } 5391 5392 // Create a timestamp if incoming event doesn't have one 5393 this.timeStamp = src && src.timeStamp || jQuery.now(); 5394 5395 // Mark it as fixed 5396 this[jQuery.expando] = true; 5397 }; 5398 5399 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 5400 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 5401 jQuery.Event.prototype = { 5402 constructor: jQuery.Event, 5403 isDefaultPrevented: returnFalse, 5404 isPropagationStopped: returnFalse, 5405 isImmediatePropagationStopped: returnFalse, 5406 5407 preventDefault: function () { 5408 var e = this.originalEvent; 5409 5410 this.isDefaultPrevented = returnTrue; 5411 if (!e) { 5412 return; 5413 } 5414 5415 // If preventDefault exists, run it on the original event 5416 if (e.preventDefault) { 5417 e.preventDefault(); 5418 5419 // Support: IE 5420 // Otherwise set the returnValue property of the original event to false 5421 } else { 5422 e.returnValue = false; 5423 } 5424 }, 5425 stopPropagation: function () { 5426 var e = this.originalEvent; 5427 5428 this.isPropagationStopped = returnTrue; 5429 5430 if (!e || this.isSimulated) { 5431 return; 5432 } 5433 5434 // If stopPropagation exists, run it on the original event 5435 if (e.stopPropagation) { 5436 e.stopPropagation(); 5437 } 5438 5439 // Support: IE 5440 // Set the cancelBubble property of the original event to true 5441 e.cancelBubble = true; 5442 }, 5443 stopImmediatePropagation: function () { 5444 var e = this.originalEvent; 5445 5446 this.isImmediatePropagationStopped = returnTrue; 5447 5448 if (e && e.stopImmediatePropagation) { 5449 e.stopImmediatePropagation(); 5450 } 5451 5452 this.stopPropagation(); 5453 } 5454 }; 5455 5456 // Create mouseenter/leave events using mouseover/out and event-time checks 5457 // so that event delegation works in jQuery. 5458 // Do the same for pointerenter/pointerleave and pointerover/pointerout 5459 // 5460 // Support: Safari 7 only 5461 // Safari sends mouseenter too often; see: 5462 // https://code.google.com/p/chromium/issues/detail?id=470258 5463 // for the description of the bug (it existed in older Chrome versions as well). 5464 jQuery.each({ 5465 mouseenter: "mouseover", 5466 mouseleave: "mouseout", 5467 pointerenter: "pointerover", 5468 pointerleave: "pointerout" 5469 }, function (orig, fix) { 5470 jQuery.event.special[orig] = { 5471 delegateType: fix, 5472 bindType: fix, 5473 5474 handle: function (event) { 5475 var ret, 5476 target = this, 5477 related = event.relatedTarget, 5478 handleObj = event.handleObj; 5479 5480 // For mouseenter/leave call the handler if related is outside the target. 5481 // NB: No relatedTarget if the mouse left/entered the browser window 5482 if (!related || related !== target && !jQuery.contains(target, related)) { 5483 event.type = handleObj.origType; 5484 ret = handleObj.handler.apply(this, arguments); 5485 event.type = fix; 5486 } 5487 return ret; 5488 } 5489 }; 5490 }); 5491 5492 // IE submit delegation 5493 if (!support.submit) { 5494 5495 jQuery.event.special.submit = { 5496 setup: function () { 5497 5498 // Only need this for delegated form submit events 5499 if (jQuery.nodeName(this, "form")) { 5500 return false; 5501 } 5502 5503 // Lazy-add a submit handler when a descendant form may potentially be submitted 5504 jQuery.event.add(this, "click._submit keypress._submit", function (e) { 5505 5506 // Node name check avoids a VML-related crash in IE (#9807) 5507 var elem = e.target, 5508 form = jQuery.nodeName(elem, "input") || jQuery.nodeName(elem, "button") ? 5509 5510 // Support: IE <=8 5511 // We use jQuery.prop instead of elem.form 5512 // to allow fixing the IE8 delegated submit issue (gh-2332) 5513 // by 3rd party polyfills/workarounds. 5514 jQuery.prop(elem, "form") : undefined; 5515 5516 if (form && !jQuery._data(form, "submit")) { 5517 jQuery.event.add(form, "submit._submit", function (event) { 5518 event._submitBubble = true; 5519 }); 5520 jQuery._data(form, "submit", true); 5521 } 5522 }); 5523 5524 // return undefined since we don't need an event listener 5525 }, 5526 5527 postDispatch: function (event) { 5528 5529 // If form was submitted by the user, bubble the event up the tree 5530 if (event._submitBubble) { 5531 delete event._submitBubble; 5532 if (this.parentNode && !event.isTrigger) { 5533 jQuery.event.simulate("submit", this.parentNode, event); 5534 } 5535 } 5536 }, 5537 5538 teardown: function () { 5539 5540 // Only need this for delegated form submit events 5541 if (jQuery.nodeName(this, "form")) { 5542 return false; 5543 } 5544 5545 // Remove delegated handlers; cleanData eventually reaps submit handlers attached above 5546 jQuery.event.remove(this, "._submit"); 5547 } 5548 }; 5549 } 5550 5551 // IE change delegation and checkbox/radio fix 5552 if (!support.change) { 5553 5554 jQuery.event.special.change = { 5555 5556 setup: function () { 5557 5558 if (rformElems.test(this.nodeName)) { 5559 5560 // IE doesn't fire change on a check/radio until blur; trigger it on click 5561 // after a propertychange. Eat the blur-change in special.change.handle. 5562 // This still fires onchange a second time for check/radio after blur. 5563 if (this.type === "checkbox" || this.type === "radio") { 5564 jQuery.event.add(this, "propertychange._change", function (event) { 5565 if (event.originalEvent.propertyName === "checked") { 5566 this._justChanged = true; 5567 } 5568 }); 5569 jQuery.event.add(this, "click._change", function (event) { 5570 if (this._justChanged && !event.isTrigger) { 5571 this._justChanged = false;
5572 } 5573 5574 // Allow triggered, simulated change events (#11500) 5575 jQuery.event.simulate("change", this, event); 5576 }); 5577 } 5578 return false; 5579 } 5580 5581 // Delegated event; lazy-add a change handler on descendant inputs 5582 jQuery.event.add(this, "beforeactivate._change", function (e) { 5583 var elem = e.target; 5584 5585 if (rformElems.test(elem.nodeName) && !jQuery._data(elem, "change")) { 5586 jQuery.event.add(elem, "change._change", function (event) { 5587 if (this.parentNode && !event.isSimulated && !event.isTrigger) { 5588 jQuery.event.simulate("change", this.parentNode, event); 5589 } 5590 }); 5591 jQuery._data(elem, "change", true); 5592 } 5593 }); 5594 }, 5595 5596 handle: function (event) { 5597 var elem = event.target; 5598 5599 // Swallow native change events from checkbox/radio, we already triggered them above 5600 if (this !== elem || event.isSimulated || event.isTrigger || elem.type !== "radio" && elem.type !== "checkbox") { 5601 5602 return event.handleObj.handler.apply(this, arguments); 5603 } 5604 }, 5605 5606 teardown: function () { 5607 jQuery.event.remove(this, "._change"); 5608 5609 return !rformElems.test(this.nodeName); 5610 } 5611 }; 5612 } 5613 5614 // Support: Firefox 5615 // Firefox doesn't have focus(in | out) events
vendor: 1,180 bytes, lines 5616-5647
5616 // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 5617 // 5618 // Support: Chrome, Safari 5619 // focus(in | out) events fire after focus & blur events, 5620 // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 5621 // Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 5622 if (!support.focusin) { 5623 jQuery.each({ focus: "focusin", blur: "focusout" }, function (orig, fix) { 5624 5625 // Attach a single capturing handler on the document while someone wants focusin/focusout 5626 var handler = function (event) { 5627 jQuery.event.simulate(fix, event.target, jQuery.event.fix(event)); 5628 }; 5629 5630 jQuery.event.special[fix] = { 5631 setup: function () { 5632 var doc = this.ownerDocument || this, 5633 attaches = jQuery._data(doc, fix); 5634 5635 if (!attaches) { 5636 doc.addEventListener(orig, handler, true); 5637 } 5638 jQuery._data(doc, fix, (attaches || 0) + 1); 5639 }, 5640 teardown: function () { 5641 var doc = this.ownerDocument || this, 5642 attaches = jQuery._data(doc, fix) - 1; 5643 5644 if (!attaches) { 5645 doc.removeEventListener(orig, handler, true); 5646 jQuery._removeData(doc, fix); 5647 } else {
vendor: 11,646 bytes, lines 5648-6057
5648 jQuery._data(doc, fix, attaches); 5649 } 5650 } 5651 }; 5652 }); 5653 } 5654 5655 jQuery.fn.extend({ 5656 5657 on: function (types, selector, data, fn) { 5658 return on(this, types, selector, data, fn); 5659 }, 5660 one: function (types, selector, data, fn) { 5661 return on(this, types, selector, data, fn, 1); 5662 }, 5663 off: function (types, selector, fn) { 5664 var handleObj, type; 5665 if (types && types.preventDefault && types.handleObj) { 5666 5667 // ( event ) dispatched jQuery.Event 5668 handleObj = types.handleObj; 5669 jQuery(types.delegateTarget).off(handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, handleObj.selector, handleObj.handler); 5670 return this; 5671 } 5672 if (typeof types === "object") { 5673 5674 // ( types-object [, selector] ) 5675 for (type in types) { 5676 this.off(type, selector, types[type]); 5677 } 5678 return this; 5679 } 5680 if (selector === false || typeof selector === "function") { 5681 5682 // ( types [, fn] ) 5683 fn = selector; 5684 selector = undefined; 5685 } 5686 if (fn === false) { 5687 fn = returnFalse; 5688 } 5689 return this.each(function () { 5690 jQuery.event.remove(this, types, fn, selector); 5691 }); 5692 }, 5693 5694 trigger: function (type, data) { 5695 return this.each(function () { 5696 jQuery.event.trigger(type, data, this); 5697 }); 5698 }, 5699 triggerHandler: function (type, data) { 5700 var elem = this[0]; 5701 if (elem) { 5702 return jQuery.event.trigger(type, data, elem, true); 5703 } 5704 } 5705 }); 5706 5707 var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, 5708 rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), 5709 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, 5710 5711 5712 // Support: IE 10-11, Edge 10240+ 5713 // In IE/Edge using regex groups here causes severe slowdowns. 5714 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 5715 rnoInnerhtml = /<script|<style|<link/i, 5716 5717 5718 // checked="checked" or checked 5719 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5720 rscriptTypeMasked = /^true\/(.*)/, 5721 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, 5722 safeFragment = createSafeFragment(document), 5723 fragmentDiv = safeFragment.appendChild(document.createElement("div")); 5724 5725 // Support: IE<8 5726 // Manipulating tables requires a tbody 5727 function manipulationTarget(elem, content) { 5728 return jQuery.nodeName(elem, "table") && jQuery.nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr") ? elem.getElementsByTagName("tbody")[0] || elem.appendChild(elem.ownerDocument.createElement("tbody")) : elem; 5729 } 5730 5731 // Replace/restore the type attribute of script elements for safe DOM manipulation 5732 function disableScript(elem) { 5733 elem.type = (jQuery.find.attr(elem, "type") !== null) + "/" + elem.type; 5734 return elem; 5735 } 5736 function restoreScript(elem) { 5737 var match = rscriptTypeMasked.exec(elem.type); 5738 if (match) { 5739 elem.type = match[1]; 5740 } else { 5741 elem.removeAttribute("type"); 5742 } 5743 return elem; 5744 } 5745 5746 function cloneCopyEvent(src, dest) { 5747 if (dest.nodeType !== 1 || !jQuery.hasData(src)) { 5748 return; 5749 } 5750 5751 var type, 5752 i, 5753 l, 5754 oldData = jQuery._data(src), 5755 curData = jQuery._data(dest, oldData), 5756 events = oldData.events; 5757 5758 if (events) { 5759 delete curData.handle; 5760 curData.events = {}; 5761 5762 for (type in events) { 5763 for (i = 0, l = events[type].length; i < l; i++) { 5764 jQuery.event.add(dest, type, events[type][i]); 5765 } 5766 } 5767 } 5768 5769 // make the cloned public data object a copy from the original 5770 if (curData.data) { 5771 curData.data = jQuery.extend({}, curData.data); 5772 } 5773 } 5774 5775 function fixCloneNodeIssues(src, dest) { 5776 var nodeName, e, data; 5777 5778 // We do not need to do anything for non-Elements 5779 if (dest.nodeType !== 1) { 5780 return; 5781 } 5782 5783 nodeName = dest.nodeName.toLowerCase(); 5784 5785 // IE6-8 copies events bound via attachEvent when using cloneNode. 5786 if (!support.noCloneEvent && dest[jQuery.expando]) { 5787 data = jQuery._data(dest); 5788 5789 for (e in data.events) { 5790 jQuery.removeEvent(dest, e, data.handle); 5791 } 5792 5793 // Event data gets referenced instead of copied if the expando gets copied too 5794 dest.removeAttribute(jQuery.expando); 5795 } 5796 5797 // IE blanks contents when cloning scripts, and tries to evaluate newly-set text 5798 if (nodeName === "script" && dest.text !== src.text) { 5799 disableScript(dest).text = src.text; 5800 restoreScript(dest); 5801 5802 // IE6-10 improperly clones children of object elements using classid. 5803 // IE10 throws NoModificationAllowedError if parent is null, #12132. 5804 } else if (nodeName === "object") { 5805 if (dest.parentNode) { 5806 dest.outerHTML = src.outerHTML; 5807 } 5808 5809 // This path appears unavoidable for IE9. When cloning an object 5810 // element in IE9, the outerHTML strategy above is not sufficient. 5811 // If the src has innerHTML and the destination does not, 5812 // copy the src.innerHTML into the dest.innerHTML. #10324 5813 if (support.html5Clone && src.innerHTML && !jQuery.trim(dest.innerHTML)) { 5814 dest.innerHTML = src.innerHTML; 5815 } 5816 } else if (nodeName === "input" && rcheckableType.test(src.type)) { 5817 5818 // IE6-8 fails to persist the checked state of a cloned checkbox 5819 // or radio button. Worse, IE6-7 fail to give the cloned element 5820 // a checked appearance if the defaultChecked value isn't also set 5821 5822 dest.defaultChecked = dest.checked = src.checked; 5823 5824 // IE6-7 get confused and end up setting the value of a cloned 5825 // checkbox/radio button to an empty string instead of "on" 5826 if (dest.value !== src.value) { 5827 dest.value = src.value; 5828 } 5829 5830 // IE6-8 fails to return the selected option to the default selected 5831 // state when cloning options 5832 } else if (nodeName === "option") { 5833 dest.defaultSelected = dest.selected = src.defaultSelected; 5834 5835 // IE6-8 fails to set the defaultValue to the correct value when 5836 // cloning other types of input fields 5837 } else if (nodeName === "input" || nodeName === "textarea") { 5838 dest.defaultValue = src.defaultValue; 5839 } 5840 } 5841 5842 function domManip(collection, args, callback, ignored) { 5843 5844 // Flatten any nested arrays 5845 args = concat.apply([], args); 5846 5847 var first, 5848 node, 5849 hasScripts, 5850 scripts, 5851 doc, 5852 fragment, 5853 i = 0, 5854 l = collection.length, 5855 iNoClone = l - 1, 5856 value = args[0], 5857 isFunction = jQuery.isFunction(value); 5858 5859 // We can't cloneNode fragments that contain checked, in WebKit 5860 if (isFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) { 5861 return collection.each(function (index) { 5862 var self = collection.eq(index); 5863 if (isFunction) { 5864 args[0] = value.call(this, index, self.html()); 5865 } 5866 domManip(self, args, callback, ignored); 5867 }); 5868 } 5869 5870 if (l) { 5871 fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored); 5872 first = fragment.firstChild; 5873 5874 if (fragment.childNodes.length === 1) { 5875 fragment = first; 5876 } 5877 5878 // Require either new content or an interest in ignored elements to invoke the callback 5879 if (first || ignored) { 5880 scripts = jQuery.map(getAll(fragment, "script"), disableScript); 5881 hasScripts = scripts.length; 5882 5883 // Use the original fragment for the last item 5884 // instead of the first because it can end up 5885 // being emptied incorrectly in certain situations (#8070). 5886 for (; i < l; i++) { 5887 node = fragment; 5888 5889 if (i !== iNoClone) { 5890 node = jQuery.clone(node, true, true); 5891 5892 // Keep references to cloned scripts for later restoration 5893 if (hasScripts) { 5894 5895 // Support: Android<4.1, PhantomJS<2 5896 // push.apply(_, arraylike) throws on ancient WebKit 5897 jQuery.merge(scripts, getAll(node, "script")); 5898 } 5899 } 5900 5901 callback.call(collection[i], node, i); 5902 } 5903 5904 if (hasScripts) { 5905 doc = scripts[scripts.length - 1].ownerDocument; 5906 5907 // Reenable scripts 5908 jQuery.map(scripts, restoreScript); 5909 5910 // Evaluate executable scripts on first document insertion 5911 for (i = 0; i < hasScripts; i++) { 5912 node = scripts[i]; 5913 if (rscriptType.test(node.type || "") && !jQuery._data(node, "globalEval") && jQuery.contains(doc, node)) { 5914 5915 if (node.src) { 5916 5917 // Optional AJAX dependency, but won't run scripts if not present 5918 if (jQuery._evalUrl) { 5919 jQuery._evalUrl(node.src); 5920 } 5921 } else { 5922 jQuery.globalEval((node.text || node.textContent || node.innerHTML || "").replace(rcleanScript, "")); 5923 } 5924 } 5925 } 5926 } 5927 5928 // Fix #11809: Avoid leaking memory 5929 fragment = first = null; 5930 } 5931 } 5932 5933 return collection; 5934 } 5935 5936 function remove(elem, selector, keepData) { 5937 var node, 5938 elems = selector ? jQuery.filter(selector, elem) : elem, 5939 i = 0; 5940 5941 for (; (node = elems[i]) != null; i++) { 5942 5943 if (!keepData && node.nodeType === 1) { 5944 jQuery.cleanData(getAll(node)); 5945 } 5946 5947 if (node.parentNode) { 5948 if (keepData && jQuery.contains(node.ownerDocument, node)) { 5949 setGlobalEval(getAll(node, "script")); 5950 } 5951 node.parentNode.removeChild(node); 5952 } 5953 } 5954 5955 return elem; 5956 } 5957 5958 jQuery.extend({ 5959 htmlPrefilter: function (html) { 5960 return html.replace(rxhtmlTag, "<$1></$2>"); 5961 }, 5962 5963 clone: function (elem, dataAndEvents, deepDataAndEvents) { 5964 var destElements, 5965 node, 5966 clone, 5967 i, 5968 srcElements, 5969 inPage = jQuery.contains(elem.ownerDocument, elem); 5970 5971 if (support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test("<" + elem.nodeName + ">")) { 5972 5973 clone = elem.cloneNode(true); 5974 5975 // IE<=8 does not properly clone detached, unknown element nodes 5976 } else { 5977 fragmentDiv.innerHTML = elem.outerHTML; 5978 fragmentDiv.removeChild(clone = fragmentDiv.firstChild); 5979 } 5980 5981 if ((!support.noCloneEvent || !support.noCloneChecked) && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) { 5982 5983 // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 5984 destElements = getAll(clone); 5985 srcElements = getAll(elem); 5986 5987 // Fix all IE cloning issues 5988 for (i = 0; (node = srcElements[i]) != null; ++i) { 5989 5990 // Ensure that the destination node is not null; Fixes #9587 5991 if (destElements[i]) { 5992 fixCloneNodeIssues(node, destElements[i]); 5993 } 5994 } 5995 } 5996 5997 // Copy the events from the original to the clone 5998 if (dataAndEvents) { 5999 if (deepDataAndEvents) { 6000 srcElements = srcElements || getAll(elem); 6001 destElements = destElements || getAll(clone); 6002 6003 for (i = 0; (node = srcElements[i]) != null; i++) { 6004 cloneCopyEvent(node, destElements[i]); 6005 } 6006 } else { 6007 cloneCopyEvent(elem, clone); 6008 } 6009 } 6010 6011 // Preserve script evaluation history 6012 destElements = getAll(clone, "script"); 6013 if (destElements.length > 0) { 6014 setGlobalEval(destElements, !inPage && getAll(elem, "script")); 6015 } 6016 6017 destElements = srcElements = node = null; 6018 6019 // Return the cloned set 6020 return clone; 6021 }, 6022 6023 cleanData: function (elems, /* internal */forceAcceptData) { 6024 var elem, 6025 type, 6026 id, 6027 data, 6028 i = 0, 6029 internalKey = jQuery.expando, 6030 cache = jQuery.cache, 6031 attributes = support.attributes, 6032 special = jQuery.event.special; 6033 6034 for (; (elem = elems[i]) != null; i++) { 6035 if (forceAcceptData || acceptData(elem)) { 6036 6037 id = elem[internalKey]; 6038 data = id && cache[id]; 6039 6040 if (data) { 6041 if (data.events) { 6042 for (type in data.events) { 6043 if (special[type]) { 6044 jQuery.event.remove(elem, type); 6045 6046 // This is a shortcut to avoid jQuery.event.remove's overhead 6047 } else { 6048 jQuery.removeEvent(elem, type, data.handle); 6049 } 6050 } 6051 } 6052 6053 // Remove cache only if it was not already removed by jQuery.event.remove 6054 if (cache[id]) { 6055 6056 delete cache[id]; 6057
6058 // Support: IE<9 6059 // IE does not allow us to delete expando properties from nodes 6060 // IE creates expando attributes along with the property 6061 // IE does not have a removeAttribute function on Document nodes 6062 if (!attributes && typeof elem.removeAttribute !== "undefined") { 6063 elem.removeAttribute(internalKey); 6064 6065 // Webkit & Blink performance suffers when deleting properties 6066 // from DOM nodes, so set to undefined instead 6067 // https://code.google.com/p/chromium/issues/detail?id=378607 6068 } else { 6069 elem[internalKey] = undefined; 6070 } 6071 6072 deletedIds.push(id); 6073 } 6074 } 6075 } 6076 } 6077 } 6078 }); 6079 6080 jQuery.fn.extend({ 6081 6082 // Keep domManip exposed until 3.0 (gh-2225) 6083 domManip: domManip, 6084 6085 detach: function (selector) { 6086 return remove(this, selector, true); 6087 }, 6088 6089 remove: function (selector) { 6090 return remove(this, selector); 6091 }, 6092 6093 text: function (value) { 6094 return access(this, function (value) { 6095 return value === undefined ? jQuery.text(this) : this.empty().append((this[0] && this[0].ownerDocument || document).createTextNode(value)); 6096 }, null, value, arguments.length); 6097 }, 6098 6099 append: function () { 6100 return domManip(this, arguments, function (elem) { 6101 if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { 6102 var target = manipulationTarget(this, elem); 6103 target.appendChild(elem); 6104 } 6105 }); 6106 }, 6107 6108 prepend: function () { 6109 return domManip(this, arguments, function (elem) { 6110 if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { 6111 var target = manipulationTarget(this, elem); 6112 target.insertBefore(elem, target.firstChild); 6113 } 6114 }); 6115 }, 6116 6117 before: function () { 6118 return domManip(this, arguments, function (elem) { 6119 if (this.parentNode) { 6120 this.parentNode.insertBefore(elem, this); 6121 } 6122 }); 6123 }, 6124 6125 after: function () { 6126 return domManip(this, arguments, function (elem) { 6127 if (this.parentNode) { 6128 this.parentNode.insertBefore(elem, this.nextSibling); 6129 } 6130 }); 6131 }, 6132 6133 empty: function () { 6134 var elem, 6135 i = 0; 6136 6137 for (; (elem = this[i]) != null; i++) { 6138 6139 // Remove element nodes and prevent memory leaks 6140 if (elem.nodeType === 1) { 6141 jQuery.cleanData(getAll(elem, false)); 6142 } 6143 6144 // Remove any remaining nodes 6145 while (elem.firstChild) { 6146 elem.removeChild(elem.firstChild); 6147 } 6148 6149 // If this is a select, ensure that it displays empty (#12336) 6150 // Support: IE<9 6151 if (elem.options && jQuery.nodeName(elem, "select")) { 6152 elem.options.length = 0; 6153 } 6154 } 6155 6156 return this; 6157 }, 6158 6159 clone: function (dataAndEvents, deepDataAndEvents) { 6160 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 6161 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 6162 6163 return this.map(function () { 6164 return jQuery.clone(this, dataAndEvents, deepDataAndEvents); 6165 }); 6166 }, 6167 6168 html: function (value) { 6169 return access(this, function (value) { 6170 var elem = this[0] || {}, 6171 i = 0, 6172 l = this.length; 6173 6174 if (value === undefined) { 6175 return elem.nodeType === 1 ? elem.innerHTML.replace(rinlinejQuery, "") : undefined; 6176 } 6177 6178 // See if we can take a shortcut and just use innerHTML 6179 if (typeof value === "string" && !rnoInnerhtml.test(value) && (support.htmlSerialize || !rnoshimcache.test(value)) && (support.leadingWhitespace || !rleadingWhitespace.test(value)) && !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) { 6180 6181 value = jQuery.htmlPrefilter(value); 6182 6183 try { 6184 for (; i < l; i++) { 6185 6186 // Remove element nodes and prevent memory leaks 6187 elem = this[i] || {}; 6188 if (elem.nodeType === 1) { 6189 jQuery.cleanData(getAll(elem, false)); 6190 elem.innerHTML = value; 6191 } 6192 } 6193 6194 elem = 0; 6195 6196 // If using innerHTML throws an exception, use the fallback method 6197 } catch (e) {} 6198 } 6199 6200 if (elem) { 6201 this.empty().append(value); 6202 } 6203 }, null, value, arguments.length); 6204 }, 6205 6206 replaceWith: function () { 6207 var ignored = []; 6208 6209 // Make the changes, replacing each non-ignored context element with the new content 6210 return domManip(this, arguments, function (elem) { 6211 var parent = this.parentNode; 6212 6213 if (jQuery.inArray(this, ignored) < 0) { 6214 jQuery.cleanData(getAll(this)); 6215 if (parent) { 6216 parent.replaceChild(elem, this); 6217 } 6218 } 6219 6220 // Force callback invocation 6221 }, ignored); 6222 } 6223 }); 6224 6225 jQuery.each({ 6226 appendTo: "append",
vendor: 1,203 bytes, lines 6227-6274
6227 prependTo: "prepend", 6228 insertBefore: "before", 6229 insertAfter: "after", 6230 replaceAll: "replaceWith" 6231 }, function (name, original) { 6232 jQuery.fn[name] = function (selector) { 6233 var elems, 6234 i = 0, 6235 ret = [], 6236 insert = jQuery(selector), 6237 last = insert.length - 1; 6238 6239 for (; i <= last; i++) { 6240 elems = i === last ? this : this.clone(true); 6241 jQuery(insert[i])[original](elems); 6242 6243 // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() 6244 push.apply(ret, elems.get()); 6245 } 6246 6247 return this.pushStack(ret); 6248 }; 6249 }); 6250 6251 var iframe, 6252 elemdisplay = { 6253 6254 // Support: Firefox 6255 // We have to pre-define these values for FF (#10227) 6256 HTML: "block", 6257 BODY: "block" 6258 }; 6259 6260 /** 6261 * Retrieve the actual display of a element 6262 * @param {String} name nodeName of the element 6263 * @param {Object} doc Document object 6264 */ 6265 6266 // Called only from within defaultDisplay 6267 function actualDisplay(name, doc) { 6268 var elem = jQuery(doc.createElement(name)).appendTo(doc.body), 6269 display = jQuery.css(elem[0], "display"); 6270 6271 // We don't have any data stored on the element, 6272 // so use "detach" method as fast way to get rid of the element 6273 elem.detach(); 6274
6275 return display; 6276 } 6277 6278 /** 6279 * Try to determine the default display value of an element 6280 * @param {String} nodeName 6281 */ 6282 function defaultDisplay(nodeName) { 6283 var doc = document, 6284 display = elemdisplay[nodeName]; 6285 6286 if (!display) { 6287 display = actualDisplay(nodeName, doc); 6288 6289 // If the simple way fails, read from inside an iframe 6290 if (display === "none" || !display) { 6291 6292 // Use the already-created iframe if possible 6293 iframe = (iframe || jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement); 6294 6295 // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse 6296 doc = (iframe[0].contentWindow || iframe[0].contentDocument).document; 6297 6298 // Support: IE 6299 doc.write(); 6300 doc.close(); 6301 6302 display = actualDisplay(nodeName, doc); 6303 iframe.detach(); 6304 } 6305 6306 // Store the correct default display 6307 elemdisplay[nodeName] = display; 6308 } 6309 6310 return display; 6311 } 6312 var rmargin = /^margin/; 6313 6314 var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i"); 6315 6316 var swap = function (elem, options, callback, args) { 6317 var ret, 6318 name, 6319 old = {}; 6320 6321 // Remember the old values, and insert the new ones 6322 for (name in options) { 6323 old[name] = elem.style[name]; 6324 elem.style[name] = options[name]; 6325 } 6326 6327 ret = callback.apply(elem, args || []); 6328 6329 // Revert the old values 6330 for (name in options) { 6331 elem.style[name] = old[name]; 6332 } 6333 6334 return ret; 6335 }; 6336 6337 var documentElement = document.documentElement; 6338 6339 (function () { 6340 var pixelPositionVal, 6341 pixelMarginRightVal, 6342 boxSizingReliableVal, 6343 reliableHiddenOffsetsVal, 6344 reliableMarginRightVal, 6345 reliableMarginLeftVal, 6346 container = document.createElement("div"), 6347 div = document.createElement("div"); 6348 6349 // Finish early in limited (non-browser) environments 6350 if (!div.style) { 6351 return; 6352 } 6353 6354 div.style.cssText = "float:left;opacity:.5"; 6355 6356 // Support: IE<9 6357 // Make sure that element opacity exists (as opposed to filter) 6358 support.opacity = div.style.opacity === "0.5"; 6359 6360 // Verify style float existence 6361 // (IE uses styleFloat instead of cssFloat) 6362 support.cssFloat = !!div.style.cssFloat; 6363 6364 div.style.backgroundClip = "content-box"; 6365 div.cloneNode(true).style.backgroundClip = ""; 6366 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 6367 6368 container = document.createElement("div"); 6369 container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + "padding:0;margin-top:1px;position:absolute"; 6370 div.innerHTML = ""; 6371 container.appendChild(div); 6372 6373 // Support: Firefox<29, Android 2.3 6374 // Vendor-prefix box-sizing 6375 support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" || div.style.WebkitBoxSizing === ""; 6376 6377 jQuery.extend(support, { 6378 reliableHiddenOffsets: function () { 6379 if (pixelPositionVal == null) { 6380 computeStyleTests(); 6381 } 6382 return reliableHiddenOffsetsVal; 6383 }, 6384 6385 boxSizingReliable: function () { 6386 6387 // We're checking for pixelPositionVal here instead of boxSizingReliableVal 6388 // since that compresses better and they're computed together anyway. 6389 if (pixelPositionVal == null) { 6390 computeStyleTests(); 6391 } 6392 return boxSizingReliableVal; 6393 }, 6394 6395 pixelMarginRight: function () { 6396 6397 // Support: Android 4.0-4.3 6398 if (pixelPositionVal == null) { 6399 computeStyleTests(); 6400 } 6401 return pixelMarginRightVal; 6402 }, 6403 6404 pixelPosition: function () { 6405 if (pixelPositionVal == null) { 6406 computeStyleTests(); 6407 } 6408 return pixelPositionVal; 6409 }, 6410 6411 reliableMarginRight: function () { 6412 6413 // Support: Android 2.3 6414 if (pixelPositionVal == null) { 6415 computeStyleTests(); 6416 } 6417 return reliableMarginRightVal; 6418 }, 6419 6420 reliableMarginLeft: function () { 6421 6422 // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37 6423 if (pixelPositionVal == null) { 6424 computeStyleTests(); 6425 } 6426 return reliableMarginLeftVal; 6427 } 6428 }); 6429 6430 function computeStyleTests() { 6431 var contents, 6432 divStyle, 6433 documentElement = document.documentElement; 6434 6435 // Setup 6436 documentElement.appendChild(container); 6437 6438 div.style.cssText = 6439
6440 // Support: Android 2.3 6441 // Vendor-prefix box-sizing 6442 "-webkit-box-sizing:border-box;box-sizing:border-box;" + "position:relative;display:block;" + "margin:auto;border:1px;padding:1px;" + "top:1%;width:50%"; 6443 6444 // Support: IE<9 6445 // Assume reasonable values in the absence of getComputedStyle 6446 pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false; 6447 pixelMarginRightVal = reliableMarginRightVal = true; 6448 6449 // Check for getComputedStyle so that this code is not run in IE<9. 6450 if (window.getComputedStyle) { 6451 divStyle = window.getComputedStyle(div); 6452 pixelPositionVal = (divStyle || {}).top !== "1%"; 6453 reliableMarginLeftVal = (divStyle || {}).marginLeft === "2px"; 6454 boxSizingReliableVal = (divStyle || { width: "4px" }).width === "4px"; 6455 6456 // Support: Android 4.0 - 4.3 only 6457 // Some styles come back with percentage values, even though they shouldn't 6458 div.style.marginRight = "50%"; 6459 pixelMarginRightVal = (divStyle || { marginRight: "4px" }).marginRight === "4px"; 6460 6461 // Support: Android 2.3 only 6462 // Div with explicit width and no margin-right incorrectly 6463 // gets computed margin-right based on width of container (#3333) 6464 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right 6465 contents = div.appendChild(document.createElement("div")); 6466 6467 // Reset CSS: box-sizing; display; margin; border; padding 6468 contents.style.cssText = div.style.cssText = 6469 6470 // Support: Android 2.3 6471 // Vendor-prefix box-sizing 6472 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + "box-sizing:content-box;display:block;margin:0;border:0;padding:0"; 6473 contents.style.marginRight = contents.style.width = "0"; 6474 div.style.width = "1px"; 6475 6476 reliableMarginRightVal = !parseFloat((window.getComputedStyle(contents) || {}).marginRight); 6477 6478 div.removeChild(contents); 6479 } 6480 6481 // Support: IE6-8 6482 // First check that getClientRects works as expected 6483 // Check if table cells still have offsetWidth/Height when they are set 6484 // to display:none and there are still other visible table cells in a 6485 // table row; if so, offsetWidth/Height are not reliable for use when 6486 // determining if an element has been hidden directly using 6487 // display:none (it is still safe to use offsets if a parent element is 6488 // hidden; don safety goggles and see bug #4512 for more information). 6489 div.style.display = "none"; 6490 reliableHiddenOffsetsVal = div.getClientRects().length === 0; 6491 if (reliableHiddenOffsetsVal) { 6492 div.style.display = ""; 6493 div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>"; 6494 div.childNodes[0].style.borderCollapse = "separate"; 6495 contents = div.getElementsByTagName("td"); 6496 contents[0].style.cssText = "margin:0;border:0;padding:0;display:none"; 6497 reliableHiddenOffsetsVal = contents[0].offsetHeight === 0; 6498 if (reliableHiddenOffsetsVal) { 6499 contents[0].style.display = ""; 6500 contents[1].style.display = "none"; 6501 reliableHiddenOffsetsVal = contents[0].offsetHeight === 0; 6502 } 6503 } 6504 6505 // Teardown 6506 documentElement.removeChild(container); 6507 } 6508 })(); 6509 6510 var getStyles, 6511 curCSS, 6512 rposition = /^(top|right|bottom|left)$/; 6513 6514 if (window.getComputedStyle) { 6515 getStyles = function (elem) { 6516 6517 // Support: IE<=11+, Firefox<=30+ (#15098, #14150) 6518 // IE throws on elements created in popups 6519 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 6520 var view = elem.ownerDocument.defaultView; 6521 6522 if (!view || !view.opener) { 6523 view = window; 6524 } 6525 6526 return view.getComputedStyle(elem); 6527 }; 6528 6529 curCSS = function (elem, name, computed) { 6530 var width, 6531 minWidth, 6532 maxWidth, 6533 ret, 6534 style = elem.style; 6535 6536 computed = computed || getStyles(elem); 6537 6538 // getPropertyValue is only needed for .css('filter') in IE9, see #12537 6539 ret = computed ? computed.getPropertyValue(name) || computed[name] : undefined; 6540 6541 // Support: Opera 12.1x only 6542 // Fall back to style even without computed 6543 // computed is undefined for elems on document fragments 6544 if ((ret === "" || ret === undefined) && !jQuery.contains(elem.ownerDocument, elem)) { 6545 ret = jQuery.style(elem, name); 6546 } 6547 6548 if (computed) { 6549 6550 // A tribute to the "awesome hack by Dean Edwards" 6551 // Chrome < 17 and Safari 5.0 uses "computed value" 6552 // instead of "used value" for margin-right 6553 // Safari 5.1.7 (at least) returns percentage for a larger set of values, 6554 // but width seems to be reliably pixels 6555 // this is against the CSSOM draft spec: 6556 // http://dev.w3.org/csswg/cssom/#resolved-values 6557 if (!support.pixelMarginRight() && rnumnonpx.test(ret) && rmargin.test(name)) { 6558 6559 // Remember the original values 6560 width = style.width; 6561 minWidth = style.minWidth; 6562 maxWidth = style.maxWidth; 6563 6564 // Put in the new values to get a computed value out 6565 style.minWidth = style.maxWidth = style.width = ret; 6566 ret = computed.width; 6567 6568 // Revert the changed values 6569 style.width = width; 6570 style.minWidth = minWidth; 6571 style.maxWidth = maxWidth; 6572 } 6573 } 6574
vendor: 4,252 bytes, lines 6575-6727
6575 // Support: IE 6576 // IE returns zIndex value as an integer. 6577 return ret === undefined ? ret : ret + ""; 6578 }; 6579 } else if (documentElement.currentStyle) { 6580 getStyles = function (elem) { 6581 return elem.currentStyle; 6582 }; 6583 6584 curCSS = function (elem, name, computed) { 6585 var left, 6586 rs, 6587 rsLeft, 6588 ret, 6589 style = elem.style; 6590 6591 computed = computed || getStyles(elem); 6592 ret = computed ? computed[name] : undefined; 6593 6594 // Avoid setting ret to empty string here 6595 // so we don't default to auto 6596 if (ret == null && style && style[name]) { 6597 ret = style[name]; 6598 } 6599 6600 // From the awesome hack by Dean Edwards 6601 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 6602 6603 // If we're not dealing with a regular pixel number 6604 // but a number that has a weird ending, we need to convert it to pixels 6605 // but not position css attributes, as those are 6606 // proportional to the parent element instead 6607 // and we can't measure the parent instead because it 6608 // might trigger a "stacking dolls" problem 6609 if (rnumnonpx.test(ret) && !rposition.test(name)) { 6610 6611 // Remember the original values 6612 left = style.left; 6613 rs = elem.runtimeStyle; 6614 rsLeft = rs && rs.left; 6615 6616 // Put in the new values to get a computed value out 6617 if (rsLeft) { 6618 rs.left = elem.currentStyle.left; 6619 } 6620 style.left = name === "fontSize" ? "1em" : ret; 6621 ret = style.pixelLeft + "px"; 6622 6623 // Revert the changed values 6624 style.left = left; 6625 if (rsLeft) { 6626 rs.left = rsLeft; 6627 } 6628 } 6629 6630 // Support: IE 6631 // IE returns zIndex value as an integer. 6632 return ret === undefined ? ret : ret + "" || "auto"; 6633 }; 6634 } 6635 6636 function addGetHookIf(conditionFn, hookFn) { 6637 6638 // Define the hook, we'll check on the first run if it's really needed. 6639 return { 6640 get: function () { 6641 if (conditionFn()) { 6642 6643 // Hook not needed (or it's not possible to use it due 6644 // to missing dependency), remove it. 6645 delete this.get; 6646 return; 6647 } 6648 6649 // Hook needed; redefine it so that the support test is not executed again. 6650 return (this.get = hookFn).apply(this, arguments); 6651 } 6652 }; 6653 } 6654 6655 var ralpha = /alpha\([^)]*\)/i, 6656 ropacity = /opacity\s*=\s*([^)]*)/i, 6657 6658 6659 // swappable if display is none or starts with table except 6660 // "table", "table-cell", or "table-caption" 6661 // see here for display values: 6662 // https://developer.mozilla.org/en-US/docs/CSS/display 6663 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 6664 rnumsplit = new RegExp("^(" + pnum + ")(.*)$", "i"), 6665 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6666 cssNormalTransform = { 6667 letterSpacing: "0", 6668 fontWeight: "400" 6669 }, 6670 cssPrefixes = ["Webkit", "O", "Moz", "ms"], 6671 emptyStyle = document.createElement("div").style; 6672 6673 // return a css property mapped to a potentially vendor prefixed property 6674 function vendorPropName(name) { 6675 6676 // shortcut for names that are not vendor prefixed 6677 if (name in emptyStyle) { 6678 return name; 6679 } 6680 6681 // check for vendor prefixed names 6682 var capName = name.charAt(0).toUpperCase() + name.slice(1), 6683 i = cssPrefixes.length; 6684 6685 while (i--) { 6686 name = cssPrefixes[i] + capName; 6687 if (name in emptyStyle) { 6688 return name; 6689 } 6690 } 6691 } 6692 6693 function showHide(elements, show) { 6694 var display, 6695 elem, 6696 hidden, 6697 values = [], 6698 index = 0, 6699 length = elements.length; 6700 6701 for (; index < length; index++) { 6702 elem = elements[index]; 6703 if (!elem.style) { 6704 continue; 6705 } 6706 6707 values[index] = jQuery._data(elem, "olddisplay"); 6708 display = elem.style.display; 6709 if (show) { 6710 6711 // Reset the inline display of this element to learn if it is 6712 // being hidden by cascaded rules or not 6713 if (!values[index] && display === "none") { 6714 elem.style.display = ""; 6715 } 6716 6717 // Set elements which have been overridden with display: none 6718 // in a stylesheet to whatever the default browser style is 6719 // for such an element 6720 if (elem.style.display === "" && isHidden(elem)) { 6721 values[index] = jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName)); 6722 } 6723 } else { 6724 hidden = isHidden(elem); 6725 6726 if (display && display !== "none" || !hidden) { 6727 jQuery._data(elem, "olddisplay", hidden ? display : jQuery.css(elem, "dis
vendor: 6,095 bytes, lines 6727-6928
6727play")); 6728 } 6729 } 6730 } 6731 6732 // Set the display of most of the elements in a second loop 6733 // to avoid the constant reflow 6734 for (index = 0; index < length; index++) { 6735 elem = elements[index]; 6736 if (!elem.style) { 6737 continue; 6738 } 6739 if (!show || elem.style.display === "none" || elem.style.display === "") { 6740 elem.style.display = show ? values[index] || "" : "none"; 6741 } 6742 } 6743 6744 return elements; 6745 } 6746 6747 function setPositiveNumber(elem, value, subtract) { 6748 var matches = rnumsplit.exec(value); 6749 return matches ? 6750 6751 // Guard against undefined "subtract", e.g., when used as in cssHooks 6752 Math.max(0, matches[1] - (subtract || 0)) + (matches[2] || "px") : value; 6753 } 6754 6755 function augmentWidthOrHeight(elem, name, extra, isBorderBox, styles) { 6756 var i = extra === (isBorderBox ? "border" : "content") ? 6757 6758 // If we already have the right measurement, avoid augmentation 6759 4 : 6760 6761 // Otherwise initialize for horizontal or vertical properties 6762 name === "width" ? 1 : 0, 6763 val = 0; 6764 6765 for (; i < 4; i += 2) { 6766 6767 // both box models exclude margin, so add it if we want it 6768 if (extra === "margin") { 6769 val += jQuery.css(elem, extra + cssExpand[i], true, styles); 6770 } 6771 6772 if (isBorderBox) { 6773 6774 // border-box includes padding, so remove it if we want content 6775 if (extra === "content") { 6776 val -= jQuery.css(elem, "padding" + cssExpand[i], true, styles); 6777 } 6778 6779 // at this point, extra isn't border nor margin, so remove border 6780 if (extra !== "margin") { 6781 val -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); 6782 } 6783 } else { 6784 6785 // at this point, extra isn't content, so add padding 6786 val += jQuery.css(elem, "padding" + cssExpand[i], true, styles); 6787 6788 // at this point, extra isn't content nor padding, so add border 6789 if (extra !== "padding") { 6790 val += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles); 6791 } 6792 } 6793 } 6794 6795 return val; 6796 } 6797 6798 function getWidthOrHeight(elem, name, extra) { 6799 6800 // Start with offset property, which is equivalent to the border-box value 6801 var valueIsBorderBox = true, 6802 val = name === "width" ? elem.offsetWidth : elem.offsetHeight, 6803 styles = getStyles(elem), 6804 isBorderBox = support.boxSizing && jQuery.css(elem, "boxSizing", false, styles) === "border-box"; 6805 6806 // some non-html elements return undefined for offsetWidth, so check for null/undefined 6807 // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 6808 // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 6809 if (val <= 0 || val == null) { 6810 6811 // Fall back to computed then uncomputed css if necessary 6812 val = curCSS(elem, name, styles); 6813 if (val < 0 || val == null) { 6814 val = elem.style[name]; 6815 } 6816 6817 // Computed unit is not pixels. Stop here and return. 6818 if (rnumnonpx.test(val)) { 6819 return val; 6820 } 6821 6822 // we need the check for style in case a browser which returns unreliable values 6823 // for getComputedStyle silently falls back to the reliable elem.style 6824 valueIsBorderBox = isBorderBox && (support.boxSizingReliable() || val === elem.style[name]); 6825 6826 // Normalize "", auto, and prepare for extra 6827 val = parseFloat(val) || 0; 6828 } 6829 6830 // use the active box-sizing model to add/subtract irrelevant styles 6831 return val + augmentWidthOrHeight(elem, name, extra || (isBorderBox ? "border" : "content"), valueIsBorderBox, styles) + "px"; 6832 } 6833 6834 jQuery.extend({ 6835 6836 // Add in style property hooks for overriding the default 6837 // behavior of getting and setting a style property 6838 cssHooks: { 6839 opacity: { 6840 get: function (elem, computed) { 6841 if (computed) { 6842 6843 // We should always get a number back from opacity 6844 var ret = curCSS(elem, "opacity"); 6845 return ret === "" ? "1" : ret; 6846 } 6847 } 6848 } 6849 }, 6850 6851 // Don't automatically add "px" to these possibly-unitless properties 6852 cssNumber: { 6853 "animationIterationCount": true, 6854 "columnCount": true, 6855 "fillOpacity": true, 6856 "flexGrow": true, 6857 "flexShrink": true, 6858 "fontWeight": true, 6859 "lineHeight": true, 6860 "opacity": true, 6861 "order": true, 6862 "orphans": true, 6863 "widows": true, 6864 "zIndex": true, 6865 "zoom": true 6866 }, 6867 6868 // Add in properties whose names you wish to fix before 6869 // setting or getting the value 6870 cssProps: { 6871 6872 // normalize float css property 6873 "float": support.cssFloat ? "cssFloat" : "styleFloat" 6874 }, 6875 6876 // Get and set the style property on a DOM Node 6877 style: function (elem, name, value, extra) { 6878 6879 // Don't set styles on text and comment nodes 6880 if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) { 6881 return; 6882 } 6883 6884 // Make sure that we're working with the right name 6885 var ret, 6886 type, 6887 hooks, 6888 origName = jQuery.camelCase(name), 6889 style = elem.style; 6890 6891 name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName); 6892 6893 // gets hook for the prefixed version 6894 // followed by the unprefixed version 6895 hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; 6896 6897 // Check if we're setting a value 6898 if (value !== undefined) { 6899 type = typeof value; 6900 6901 // Convert "+=" or "-=" to relative numbers (#7345) 6902 if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) { 6903 value = adjustCSS(elem, name, ret); 6904 6905 // Fixes bug #9237 6906 type = "number"; 6907 } 6908 6909 // Make sure that null and NaN values aren't set. See: #7116 6910 if (value == null || value !== value) { 6911 return; 6912 } 6913 6914 // If a number was passed in, add the unit (except for certain CSS properties) 6915 if (type === "number") { 6916 value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px"); 6917 } 6918 6919 // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, 6920 // but it would mean to define eight 6921 // (for every problematic property) identical functions 6922 if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) { 6923 style[name] = "inherit"; 6924 } 6925 6926 // If a hook was provided, use that value, otherwise just set the specified value 6927 if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== undefined) { 6928
vendor: 4,360 bytes, lines 6929-7055
6929 // Support: IE 6930 // Swallow errors from 'invalid' CSS values (#5509) 6931 try { 6932 style[name] = value; 6933 } catch (e) {} 6934 } 6935 } else { 6936 6937 // If a hook was provided get the non-computed value from there 6938 if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== undefined) { 6939 6940 return ret; 6941 } 6942 6943 // Otherwise just get the value from the style object 6944 return style[name]; 6945 } 6946 }, 6947 6948 css: function (elem, name, extra, styles) { 6949 var num, 6950 val, 6951 hooks, 6952 origName = jQuery.camelCase(name); 6953 6954 // Make sure that we're working with the right name 6955 name = jQuery.cssProps[origName] || (jQuery.cssProps[origName] = vendorPropName(origName) || origName); 6956 6957 // gets hook for the prefixed version 6958 // followed by the unprefixed version 6959 hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName]; 6960 6961 // If a hook was provided get the computed value from there 6962 if (hooks && "get" in hooks) { 6963 val = hooks.get(elem, true, extra); 6964 } 6965 6966 // Otherwise, if a way to get the computed value exists, use that 6967 if (val === undefined) { 6968 val = curCSS(elem, name, styles); 6969 } 6970 6971 //convert "normal" to computed value 6972 if (val === "normal" && name in cssNormalTransform) { 6973 val = cssNormalTransform[name]; 6974 } 6975 6976 // Return, converting to number if forced or a qualifier was provided and val looks numeric 6977 if (extra === "" || extra) { 6978 num = parseFloat(val); 6979 return extra === true || isFinite(num) ? num || 0 : val; 6980 } 6981 return val; 6982 } 6983 }); 6984 6985 jQuery.each(["height", "width"], function (i, name) { 6986 jQuery.cssHooks[name] = { 6987 get: function (elem, computed, extra) { 6988 if (computed) { 6989 6990 // certain elements can have dimension info if we invisibly show them 6991 // however, it must have a current display style that would benefit from this 6992 return rdisplayswap.test(jQuery.css(elem, "display")) && elem.offsetWidth === 0 ? swap(elem, cssShow, function () { 6993 return getWidthOrHeight(elem, name, extra); 6994 }) : getWidthOrHeight(elem, name, extra); 6995 } 6996 }, 6997 6998 set: function (elem, value, extra) { 6999 var styles = extra && getStyles(elem); 7000 return setPositiveNumber(elem, value, extra ? augmentWidthOrHeight(elem, name, extra, support.boxSizing && jQuery.css(elem, "boxSizing", false, styles) === "border-box", styles) : 0); 7001 } 7002 }; 7003 }); 7004 7005 if (!support.opacity) { 7006 jQuery.cssHooks.opacity = { 7007 get: function (elem, computed) { 7008 7009 // IE uses filters for opacity 7010 return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ? 0.01 * parseFloat(RegExp.$1) + "" : computed ? "1" : ""; 7011 }, 7012 7013 set: function (elem, value) { 7014 var style = elem.style, 7015 currentStyle = elem.currentStyle, 7016 opacity = jQuery.isNumeric(value) ? "alpha(opacity=" + value * 100 + ")" : "", 7017 filter = currentStyle && currentStyle.filter || style.filter || ""; 7018 7019 // IE has trouble with opacity if it does not have layout 7020 // Force it by setting the zoom level 7021 style.zoom = 1; 7022 7023 // if setting opacity to 1, and no other filters exist - 7024 // attempt to remove filter attribute #6652 7025 // if value === "", then remove inline opacity #12685 7026 if ((value >= 1 || value === "") && jQuery.trim(filter.replace(ralpha, "")) === "" && style.removeAttribute) { 7027 7028 // Setting style.filter to null, "" & " " still leave "filter:" in the cssText 7029 // if "filter:" is present at all, clearType is disabled, we want to avoid this 7030 // style.removeAttribute is IE Only, but so apparently is this code path... 7031 style.removeAttribute("filter"); 7032 7033 // if there is no filter style applied in a css rule 7034 // or unset inline opacity, we are done 7035 if (value === "" || currentStyle && !currentStyle.filter) { 7036 return; 7037 } 7038 } 7039 7040 // otherwise, set new filter values 7041 style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : filter + " " + opacity; 7042 } 7043 }; 7044 } 7045 7046 jQuery.cssHooks.marginRight = addGetHookIf(support.reliableMarginRight, function (elem, computed) { 7047 if (computed) { 7048 return swap(elem, { "display": "inline-block" }, curCSS, [elem, "marginRight"]); 7049 } 7050 }); 7051 7052 jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft, function (elem, computed) { 7053 if (computed) { 7054 return (parseFloat(curCSS(elem, "marginLeft")) || ( 7055
vendor: 4,554 bytes, lines 7056-7219
7056 // Support: IE<=11+ 7057 // Running getBoundingClientRect on a disconnected node in IE throws an error 7058 // Support: IE8 only 7059 // getClientRects() errors on disconnected elems 7060 jQuery.contains(elem.ownerDocument, elem) ? elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function () { 7061 return elem.getBoundingClientRect().left; 7062 }) : 0)) + "px"; 7063 } 7064 }); 7065 7066 // These hooks are used by animate to expand properties 7067 jQuery.each({ 7068 margin: "", 7069 padding: "", 7070 border: "Width" 7071 }, function (prefix, suffix) { 7072 jQuery.cssHooks[prefix + suffix] = { 7073 expand: function (value) { 7074 var i = 0, 7075 expanded = {}, 7076 7077 7078 // assumes a single number if not a string 7079 parts = typeof value === "string" ? value.split(" ") : [value]; 7080 7081 for (; i < 4; i++) { 7082 expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0]; 7083 } 7084 7085 return expanded; 7086 } 7087 }; 7088 7089 if (!rmargin.test(prefix)) { 7090 jQuery.cssHooks[prefix + suffix].set = setPositiveNumber; 7091 } 7092 }); 7093 7094 jQuery.fn.extend({ 7095 css: function (name, value) { 7096 return access(this, function (elem, name, value) { 7097 var styles, 7098 len, 7099 map = {}, 7100 i = 0; 7101 7102 if (jQuery.isArray(name)) { 7103 styles = getStyles(elem); 7104 len = name.length; 7105 7106 for (; i < len; i++) { 7107 map[name[i]] = jQuery.css(elem, name[i], false, styles); 7108 } 7109 7110 return map; 7111 } 7112 7113 return value !== undefined ? jQuery.style(elem, name, value) : jQuery.css(elem, name); 7114 }, name, value, arguments.length > 1); 7115 }, 7116 show: function () { 7117 return showHide(this, true); 7118 }, 7119 hide: function () { 7120 return showHide(this); 7121 }, 7122 toggle: function (state) { 7123 if (typeof state === "boolean") { 7124 return state ? this.show() : this.hide(); 7125 } 7126 7127 return this.each(function () { 7128 if (isHidden(this)) { 7129 jQuery(this).show(); 7130 } else { 7131 jQuery(this).hide(); 7132 } 7133 }); 7134 } 7135 }); 7136 7137 function Tween(elem, options, prop, end, easing) { 7138 return new Tween.prototype.init(elem, options, prop, end, easing); 7139 } 7140 jQuery.Tween = Tween; 7141 7142 Tween.prototype = { 7143 constructor: Tween, 7144 init: function (elem, options, prop, end, easing, unit) { 7145 this.elem = elem; 7146 this.prop = prop; 7147 this.easing = easing || jQuery.easing._default; 7148 this.options = options; 7149 this.start = this.now = this.cur(); 7150 this.end = end; 7151 this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px"); 7152 }, 7153 cur: function () { 7154 var hooks = Tween.propHooks[this.prop]; 7155 7156 return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this); 7157 }, 7158 run: function (percent) { 7159 var eased, 7160 hooks = Tween.propHooks[this.prop]; 7161 7162 if (this.options.duration) { 7163 this.pos = eased = jQuery.easing[this.easing](percent, this.options.duration * percent, 0, 1, this.options.duration); 7164 } else { 7165 this.pos = eased = percent; 7166 } 7167 this.now = (this.end - this.start) * eased + this.start; 7168 7169 if (this.options.step) { 7170 this.options.step.call(this.elem, this.now, this); 7171 } 7172 7173 if (hooks && hooks.set) { 7174 hooks.set(this); 7175 } else { 7176 Tween.propHooks._default.set(this); 7177 } 7178 return this; 7179 } 7180 }; 7181 7182 Tween.prototype.init.prototype = Tween.prototype; 7183 7184 Tween.propHooks = { 7185 _default: { 7186 get: function (tween) { 7187 var result; 7188 7189 // Use a property on the element directly when it is not a DOM element, 7190 // or when there is no matching style property that exists. 7191 if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) { 7192 return tween.elem[tween.prop]; 7193 } 7194 7195 // passing an empty string as a 3rd parameter to .css will automatically 7196 // attempt a parseFloat and fallback to a string if the parse fails 7197 // so, simple values such as "10px" are parsed to Float. 7198 // complex values such as "rotate(1rad)" are returned as is. 7199 result = jQuery.css(tween.elem, tween.prop, ""); 7200 7201 // Empty strings, null, undefined and "auto" are converted to 0. 7202 return !result || result === "auto" ? 0 : result; 7203 }, 7204 set: function (tween) { 7205 7206 // use step hook for back compat - use cssHook if its there - use .style if its 7207 // available and use plain properties where available 7208 if (jQuery.fx.step[tween.prop]) { 7209 jQuery.fx.step[tween.prop](tween); 7210 } else if (tween.elem.nodeType === 1 && (tween.elem.style[jQuery.cssProps[tween.prop]] != null || jQuery.cssHooks[tween.prop])) { 7211 jQuery.style(tween.elem, tween.prop, tween.now + tween.unit); 7212 } else { 7213 tween.elem[tween.prop] = tween.now; 7214 } 7215 } 7216 } 7217 }; 7218 7219 // Support: IE <=9
vendor: 5,745 bytes, lines 7220-7439
7220 // Panic based approach to setting things on disconnected nodes 7221 7222 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 7223 set: function (tween) { 7224 if (tween.elem.nodeType && tween.elem.parentNode) { 7225 tween.elem[tween.prop] = tween.now; 7226 } 7227 } 7228 }; 7229 7230 jQuery.easing = { 7231 linear: function (p) { 7232 return p; 7233 }, 7234 swing: function (p) { 7235 return 0.5 - Math.cos(p * Math.PI) / 2; 7236 }, 7237 _default: "swing" 7238 }; 7239 7240 jQuery.fx = Tween.prototype.init; 7241 7242 // Back Compat <1.8 extension point 7243 jQuery.fx.step = {}; 7244 7245 var fxNow, 7246 timerId, 7247 rfxtypes = /^(?:toggle|show|hide)$/, 7248 rrun = /queueHooks$/; 7249 7250 // Animations created synchronously will run synchronously 7251 function createFxNow() { 7252 window.setTimeout(function () { 7253 fxNow = undefined; 7254 }); 7255 return fxNow = jQuery.now(); 7256 } 7257 7258 // Generate parameters to create a standard animation 7259 function genFx(type, includeWidth) { 7260 var which, 7261 attrs = { height: type }, 7262 i = 0; 7263 7264 // if we include width, step value is 1 to do all cssExpand values, 7265 // if we don't include width, step value is 2 to skip over Left and Right 7266 includeWidth = includeWidth ? 1 : 0; 7267 for (; i < 4; i += 2 - includeWidth) { 7268 which = cssExpand[i]; 7269 attrs["margin" + which] = attrs["padding" + which] = type; 7270 } 7271 7272 if (includeWidth) { 7273 attrs.opacity = attrs.width = type; 7274 } 7275 7276 return attrs; 7277 } 7278 7279 function createTween(value, prop, animation) { 7280 var tween, 7281 collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]), 7282 index = 0, 7283 length = collection.length; 7284 for (; index < length; index++) { 7285 if (tween = collection[index].call(animation, prop, value)) { 7286 7287 // we're done with this property 7288 return tween; 7289 } 7290 } 7291 } 7292 7293 function defaultPrefilter(elem, props, opts) { 7294 /* jshint validthis: true */ 7295 var prop, 7296 value, 7297 toggle, 7298 tween, 7299 hooks, 7300 oldfire, 7301 display, 7302 checkDisplay, 7303 anim = this, 7304 orig = {}, 7305 style = elem.style, 7306 hidden = elem.nodeType && isHidden(elem), 7307 dataShow = jQuery._data(elem, "fxshow"); 7308 7309 // handle queue: false promises 7310 if (!opts.queue) { 7311 hooks = jQuery._queueHooks(elem, "fx"); 7312 if (hooks.unqueued == null) { 7313 hooks.unqueued = 0; 7314 oldfire = hooks.empty.fire; 7315 hooks.empty.fire = function () { 7316 if (!hooks.unqueued) { 7317 oldfire(); 7318 } 7319 }; 7320 } 7321 hooks.unqueued++; 7322 7323 anim.always(function () { 7324 7325 // doing this makes sure that the complete handler will be called 7326 // before this completes 7327 anim.always(function () { 7328 hooks.unqueued--; 7329 if (!jQuery.queue(elem, "fx").length) { 7330 hooks.empty.fire(); 7331 } 7332 }); 7333 }); 7334 } 7335 7336 // height/width overflow pass 7337 if (elem.nodeType === 1 && ("height" in props || "width" in props)) { 7338 7339 // Make sure that nothing sneaks out 7340 // Record all 3 overflow attributes because IE does not 7341 // change the overflow attribute when overflowX and 7342 // overflowY are set to the same value 7343 opts.overflow = [style.overflow, style.overflowX, style.overflowY]; 7344 7345 // Set display property to inline-block for height/width 7346 // animations on inline elements that are having width/height animated 7347 display = jQuery.css(elem, "display"); 7348 7349 // Test default display if display is currently "none" 7350 checkDisplay = display === "none" ? jQuery._data(elem, "olddisplay") || defaultDisplay(elem.nodeName) : display; 7351 7352 if (checkDisplay === "inline" && jQuery.css(elem, "float") === "none") { 7353 7354 // inline-level elements accept inline-block; 7355 // block-level elements need to be inline with layout 7356 if (!support.inlineBlockNeedsLayout || defaultDisplay(elem.nodeName) === "inline") { 7357 style.display = "inline-block"; 7358 } else { 7359 style.zoom = 1; 7360 } 7361 } 7362 } 7363 7364 if (opts.overflow) { 7365 style.overflow = "hidden"; 7366 if (!support.shrinkWrapBlocks()) { 7367 anim.always(function () { 7368 style.overflow = opts.overflow[0]; 7369 style.overflowX = opts.overflow[1]; 7370 style.overflowY = opts.overflow[2]; 7371 }); 7372 } 7373 } 7374 7375 // show/hide pass 7376 for (prop in props) { 7377 value = props[prop]; 7378 if (rfxtypes.exec(value)) { 7379 delete props[prop]; 7380 toggle = toggle || value === "toggle"; 7381 if (value === (hidden ? "hide" : "show")) { 7382 7383 // If there is dataShow left over from a stopped hide or show 7384 // and we are going to proceed with show, we should pretend to be hidden 7385 if (value === "show" && dataShow && dataShow[prop] !== undefined) { 7386 hidden = true; 7387 } else { 7388 continue; 7389 } 7390 } 7391 orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop); 7392 7393 // Any non-fx value stops us from restoring the original display value 7394 } else { 7395 display = undefined; 7396 } 7397 } 7398 7399 if (!jQuery.isEmptyObject(orig)) { 7400 if (dataShow) { 7401 if ("hidden" in dataShow) { 7402 hidden = dataShow.hidden; 7403 } 7404 } else { 7405 dataShow = jQuery._data(elem, "fxshow", {}); 7406 } 7407 7408 // store state if its toggle - enables .stop().toggle() to "reverse" 7409 if (toggle) { 7410 dataShow.hidden = !hidden; 7411 } 7412 if (hidden) { 7413 jQuery(elem).show(); 7414 } else { 7415 anim.done(function () { 7416 jQuery(elem).hide(); 7417 }); 7418 } 7419 anim.done(function () { 7420 var prop; 7421 jQuery._removeData(elem, "fxshow"); 7422 for (prop in orig) { 7423 jQuery.style(elem, prop, orig[prop]); 7424 } 7425 }); 7426 for (prop in orig) { 7427 tween = createTween(hidden ? dataShow[prop] : 0, prop, anim); 7428 7429 if (!(prop in dataShow)) { 7430 dataShow[prop] = tween.start; 7431 if (hidden) { 7432 tween.end = tween.start; 7433 tween.start = prop === "width" || prop === "height" ? 1 : 0; 7434 } 7435 } 7436 } 7437 7438 // If this is a noop like .hide().hide(), restore an overwritten display value 7439 } else if ((display === "none" ? defaultDisplay(elem.nodeName) : dis
vendor: 5,869 bytes, lines 7439-7665
7439play) === "inline") { 7440 style.display = display; 7441 } 7442 } 7443 7444 function propFilter(props, specialEasing) { 7445 var index, name, easing, value, hooks; 7446 7447 // camelCase, specialEasing and expand cssHook pass 7448 for (index in props) { 7449 name = jQuery.camelCase(index); 7450 easing = specialEasing[name]; 7451 value = props[index]; 7452 if (jQuery.isArray(value)) { 7453 easing = value[1]; 7454 value = props[index] = value[0]; 7455 } 7456 7457 if (index !== name) { 7458 props[name] = value; 7459 delete props[index]; 7460 } 7461 7462 hooks = jQuery.cssHooks[name]; 7463 if (hooks && "expand" in hooks) { 7464 value = hooks.expand(value); 7465 delete props[name]; 7466 7467 // not quite $.extend, this wont overwrite keys already present. 7468 // also - reusing 'index' from above because we have the correct "name" 7469 for (index in value) { 7470 if (!(index in props)) { 7471 props[index] = value[index]; 7472 specialEasing[index] = easing; 7473 } 7474 } 7475 } else { 7476 specialEasing[name] = easing; 7477 } 7478 } 7479 } 7480 7481 function Animation(elem, properties, options) { 7482 var result, 7483 stopped, 7484 index = 0, 7485 length = Animation.prefilters.length, 7486 deferred = jQuery.Deferred().always(function () { 7487 7488 // don't match elem in the :animated selector 7489 delete tick.elem; 7490 }), 7491 tick = function () { 7492 if (stopped) { 7493 return false; 7494 } 7495 var currentTime = fxNow || createFxNow(), 7496 remaining = Math.max(0, animation.startTime + animation.duration - currentTime), 7497 7498 7499 // Support: Android 2.3 7500 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) 7501 temp = remaining / animation.duration || 0, 7502 percent = 1 - temp, 7503 index = 0, 7504 length = animation.tweens.length; 7505 7506 for (; index < length; index++) { 7507 animation.tweens[index].run(percent); 7508 } 7509 7510 deferred.notifyWith(elem, [animation, percent, remaining]); 7511 7512 if (percent < 1 && length) { 7513 return remaining; 7514 } else { 7515 deferred.resolveWith(elem, [animation]); 7516 return false; 7517 } 7518 }, 7519 animation = deferred.promise({ 7520 elem: elem, 7521 props: jQuery.extend({}, properties), 7522 opts: jQuery.extend(true, { 7523 specialEasing: {}, 7524 easing: jQuery.easing._default 7525 }, options), 7526 originalProperties: properties, 7527 originalOptions: options, 7528 startTime: fxNow || createFxNow(), 7529 duration: options.duration, 7530 tweens: [], 7531 createTween: function (prop, end) { 7532 var tween = jQuery.Tween(elem, animation.opts, prop, end, animation.opts.specialEasing[prop] || animation.opts.easing); 7533 animation.tweens.push(tween); 7534 return tween; 7535 }, 7536 stop: function (gotoEnd) { 7537 var index = 0, 7538 7539 7540 // if we are going to the end, we want to run all the tweens 7541 // otherwise we skip this part 7542 length = gotoEnd ? animation.tweens.length : 0; 7543 if (stopped) { 7544 return this; 7545 } 7546 stopped = true; 7547 for (; index < length; index++) { 7548 animation.tweens[index].run(1); 7549 } 7550 7551 // resolve when we played the last frame 7552 // otherwise, reject 7553 if (gotoEnd) { 7554 deferred.notifyWith(elem, [animation, 1, 0]); 7555 deferred.resolveWith(elem, [animation, gotoEnd]); 7556 } else { 7557 deferred.rejectWith(elem, [animation, gotoEnd]); 7558 } 7559 return this; 7560 } 7561 }), 7562 props = animation.props; 7563 7564 propFilter(props, animation.opts.specialEasing); 7565 7566 for (; index < length; index++) { 7567 result = Animation.prefilters[index].call(animation, elem, props, animation.opts); 7568 if (result) { 7569 if (jQuery.isFunction(result.stop)) { 7570 jQuery._queueHooks(animation.elem, animation.opts.queue).stop = jQuery.proxy(result.stop, result); 7571 } 7572 return result; 7573 } 7574 } 7575 7576 jQuery.map(props, createTween, animation); 7577 7578 if (jQuery.isFunction(animation.opts.start)) { 7579 animation.opts.start.call(elem, animation); 7580 } 7581 7582 jQuery.fx.timer(jQuery.extend(tick, { 7583 elem: elem, 7584 anim: animation, 7585 queue: animation.opts.queue 7586 })); 7587 7588 // attach callbacks from options 7589 return animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always); 7590 } 7591 7592 jQuery.Animation = jQuery.extend(Animation, { 7593 7594 tweeners: { 7595 "*": [function (prop, value) { 7596 var tween = this.createTween(prop, value); 7597 adjustCSS(tween.elem, prop, rcssNum.exec(value), tween); 7598 return tween; 7599 }] 7600 }, 7601 7602 tweener: function (props, callback) { 7603 if (jQuery.isFunction(props)) { 7604 callback = props; 7605 props = ["*"]; 7606 } else { 7607 props = props.match(rnotwhite); 7608 } 7609 7610 var prop, 7611 index = 0, 7612 length = props.length; 7613 7614 for (; index < length; index++) { 7615 prop = props[index]; 7616 Animation.tweeners[prop] = Animation.tweeners[prop] || []; 7617 Animation.tweeners[prop].unshift(callback); 7618 } 7619 }, 7620 7621 prefilters: [defaultPrefilter], 7622 7623 prefilter: function (callback, prepend) { 7624 if (prepend) { 7625 Animation.prefilters.unshift(callback); 7626 } else { 7627 Animation.prefilters.push(callback); 7628 } 7629 } 7630 }); 7631 7632 jQuery.speed = function (speed, easing, fn) { 7633 var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : { 7634 complete: fn || !fn && easing || jQuery.isFunction(speed) && speed, 7635 duration: speed, 7636 easing: fn && easing || easing && !jQuery.isFunction(easing) && easing 7637 }; 7638 7639 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default; 7640 7641 // normalize opt.queue - true/undefined/null -> "fx" 7642 if (opt.queue == null || opt.queue === true) { 7643 opt.queue = "fx"; 7644 } 7645 7646 // Queueing 7647 opt.old = opt.complete; 7648 7649 opt.complete = function () { 7650 if (jQuery.isFunction(opt.old)) { 7651 opt.old.call(this); 7652 } 7653 7654 if (opt.queue) { 7655 jQuery.dequeue(this, opt.queue); 7656 } 7657 }; 7658 7659 return opt; 7660 }; 7661 7662 jQuery.fn.extend({ 7663 fadeTo: function (speed, to, easing, callback) { 7664 7665 // show any hidden elements after setting opacity to 0
vendor: 8,995 bytes, lines 7666-8006
7666 return this.filter(isHidden).css("opacity", 0).show() 7667 7668 // animate to the value specified 7669 .end().animate({ opacity: to }, speed, easing, callback); 7670 }, 7671 animate: function (prop, speed, easing, callback) { 7672 var empty = jQuery.isEmptyObject(prop), 7673 optall = jQuery.speed(speed, easing, callback), 7674 doAnimation = function () { 7675 7676 // Operate on a copy of prop so per-property easing won't be lost 7677 var anim = Animation(this, jQuery.extend({}, prop), optall); 7678 7679 // Empty animations, or finishing resolves immediately 7680 if (empty || jQuery._data(this, "finish")) { 7681 anim.stop(true); 7682 } 7683 }; 7684 doAnimation.finish = doAnimation; 7685 7686 return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation); 7687 }, 7688 stop: function (type, clearQueue, gotoEnd) { 7689 var stopQueue = function (hooks) { 7690 var stop = hooks.stop; 7691 delete hooks.stop; 7692 stop(gotoEnd); 7693 }; 7694 7695 if (typeof type !== "string") { 7696 gotoEnd = clearQueue; 7697 clearQueue = type; 7698 type = undefined; 7699 } 7700 if (clearQueue && type !== false) { 7701 this.queue(type || "fx", []); 7702 } 7703 7704 return this.each(function () { 7705 var dequeue = true, 7706 index = type != null && type + "queueHooks", 7707 timers = jQuery.timers, 7708 data = jQuery._data(this); 7709 7710 if (index) { 7711 if (data[index] && data[index].stop) { 7712 stopQueue(data[index]); 7713 } 7714 } else { 7715 for (index in data) { 7716 if (data[index] && data[index].stop && rrun.test(index)) { 7717 stopQueue(data[index]); 7718 } 7719 } 7720 } 7721 7722 for (index = timers.length; index--;) { 7723 if (timers[index].elem === this && (type == null || timers[index].queue === type)) { 7724 7725 timers[index].anim.stop(gotoEnd); 7726 dequeue = false; 7727 timers.splice(index, 1); 7728 } 7729 } 7730 7731 // start the next in the queue if the last step wasn't forced 7732 // timers currently will call their complete callbacks, which will dequeue 7733 // but only if they were gotoEnd 7734 if (dequeue || !gotoEnd) { 7735 jQuery.dequeue(this, type); 7736 } 7737 }); 7738 }, 7739 finish: function (type) { 7740 if (type !== false) { 7741 type = type || "fx"; 7742 } 7743 return this.each(function () { 7744 var index, 7745 data = jQuery._data(this), 7746 queue = data[type + "queue"], 7747 hooks = data[type + "queueHooks"], 7748 timers = jQuery.timers, 7749 length = queue ? queue.length : 0; 7750 7751 // enable finishing flag on private data 7752 data.finish = true; 7753 7754 // empty the queue first 7755 jQuery.queue(this, type, []); 7756 7757 if (hooks && hooks.stop) { 7758 hooks.stop.call(this, true); 7759 } 7760 7761 // look for any active animations, and finish them 7762 for (index = timers.length; index--;) { 7763 if (timers[index].elem === this && timers[index].queue === type) { 7764 timers[index].anim.stop(true); 7765 timers.splice(index, 1); 7766 } 7767 } 7768 7769 // look for any animations in the old queue and finish them 7770 for (index = 0; index < length; index++) { 7771 if (queue[index] && queue[index].finish) { 7772 queue[index].finish.call(this); 7773 } 7774 } 7775 7776 // turn off finishing flag 7777 delete data.finish; 7778 }); 7779 } 7780 }); 7781 7782 jQuery.each(["toggle", "show", "hide"], function (i, name) { 7783 var cssFn = jQuery.fn[name]; 7784 jQuery.fn[name] = function (speed, easing, callback) { 7785 return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback); 7786 }; 7787 }); 7788 7789 // Generate shortcuts for custom animations 7790 jQuery.each({ 7791 slideDown: genFx("show"), 7792 slideUp: genFx("hide"), 7793 slideToggle: genFx("toggle"), 7794 fadeIn: { opacity: "show" }, 7795 fadeOut: { opacity: "hide" }, 7796 fadeToggle: { opacity: "toggle" } 7797 }, function (name, props) { 7798 jQuery.fn[name] = function (speed, easing, callback) { 7799 return this.animate(props, speed, easing, callback); 7800 }; 7801 }); 7802 7803 jQuery.timers = []; 7804 jQuery.fx.tick = function () { 7805 var timer, 7806 timers = jQuery.timers, 7807 i = 0; 7808 7809 fxNow = jQuery.now(); 7810 7811 for (; i < timers.length; i++) { 7812 timer = timers[i]; 7813 7814 // Checks the timer has not already been removed 7815 if (!timer() && timers[i] === timer) { 7816 timers.splice(i--, 1); 7817 } 7818 } 7819 7820 if (!timers.length) { 7821 jQuery.fx.stop(); 7822 } 7823 fxNow = undefined; 7824 }; 7825 7826 jQuery.fx.timer = function (timer) { 7827 jQuery.timers.push(timer); 7828 if (timer()) { 7829 jQuery.fx.start(); 7830 } else { 7831 jQuery.timers.pop(); 7832 } 7833 }; 7834 7835 jQuery.fx.interval = 13; 7836 7837 jQuery.fx.start = function () { 7838 if (!timerId) { 7839 timerId = window.setInterval(jQuery.fx.tick, jQuery.fx.interval); 7840 } 7841 }; 7842 7843 jQuery.fx.stop = function () { 7844 window.clearInterval(timerId); 7845 timerId = null; 7846 }; 7847 7848 jQuery.fx.speeds = { 7849 slow: 600, 7850 fast: 200, 7851 7852 // Default speed 7853 _default: 400 7854 }; 7855 7856 // Based off of the plugin by Clint Helfers, with permission. 7857 // http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ 7858 jQuery.fn.delay = function (time, type) { 7859 time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; 7860 type = type || "fx"; 7861 7862 return this.queue(type, function (next, hooks) { 7863 var timeout = window.setTimeout(next, time); 7864 hooks.stop = function () { 7865 window.clearTimeout(timeout); 7866 }; 7867 }); 7868 }; 7869 7870 (function () { 7871 var a, 7872 input = document.createElement("input"), 7873 div = document.createElement("div"), 7874 select = document.createElement("select"), 7875 opt = select.appendChild(document.createElement("option")); 7876 7877 // Setup 7878 div = document.createElement("div"); 7879 div.setAttribute("className", "t"); 7880 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; 7881 a = div.getElementsByTagName("a")[0]; 7882 7883 // Support: Windows Web Apps (WWA) 7884 // `type` must use .setAttribute for WWA (#14901) 7885 input.setAttribute("type", "checkbox"); 7886 div.appendChild(input); 7887 7888 a = div.getElementsByTagName("a")[0]; 7889 7890 // First batch of tests. 7891 a.style.cssText = "top:1px"; 7892 7893 // Test setAttribute on camelCase class. 7894 // If it works, we need attrFixes when doing get/setAttribute (ie6/7) 7895 support.getSetAttribute = div.className !== "t"; 7896 7897 // Get the style information from getAttribute 7898 // (IE uses .cssText instead) 7899 support.style = /top/.test(a.getAttribute("style")); 7900 7901 // Make sure that URLs aren't manipulated 7902 // (IE normalizes it by default) 7903 support.hrefNormalized = a.getAttribute("href") === "/a"; 7904 7905 // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) 7906 support.checkOn = !!input.value; 7907 7908 // Make sure that a selected-by-default option has a working selected property. 7909 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) 7910 support.optSelected = opt.selected; 7911 7912 // Tests for enctype support on a form (#6743) 7913 support.enctype = !!document.createElement("form").enctype; 7914 7915 // Make sure that the options inside disabled selects aren't marked as disabled 7916 // (WebKit marks them as disabled) 7917 select.disabled = true; 7918 support.optDisabled = !opt.disabled; 7919 7920 // Support: IE8 only 7921 // Check if we can trust getAttribute("value") 7922 input = document.createElement("input"); 7923 input.setAttribute("value", ""); 7924 support.input = input.getAttribute("value") === ""; 7925 7926 // Check if an input maintains its value after becoming a radio 7927 input.value = "t"; 7928 input.setAttribute("type", "radio"); 7929 support.radioValue = input.value === "t"; 7930 })(); 7931 7932 var rreturn = /\r/g, 7933 rspaces = /[\x20\t\r\n\f]+/g; 7934 7935 jQuery.fn.extend({ 7936 val: function (value) { 7937 var hooks, 7938 ret, 7939 isFunction, 7940 elem = this[0]; 7941 7942 if (!arguments.length) { 7943 if (elem) { 7944 hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()]; 7945 7946 if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== undefined) { 7947 return ret; 7948 } 7949 7950 ret = elem.value; 7951 7952 return typeof ret === "string" ? 7953 7954 // handle most common string cases 7955 ret.replace(rreturn, "") : 7956 7957 // handle cases where value is null/undef or number 7958 ret == null ? "" : ret; 7959 } 7960 7961 return; 7962 } 7963 7964 isFunction = jQuery.isFunction(value); 7965 7966 return this.each(function (i) { 7967 var val; 7968 7969 if (this.nodeType !== 1) { 7970 return; 7971 } 7972 7973 if (isFunction) { 7974 val = value.call(this, i, jQuery(this).val()); 7975 } else { 7976 val = value; 7977 } 7978 7979 // Treat null/undefined as ""; convert numbers to string 7980 if (val == null) { 7981 val = ""; 7982 } else if (typeof val === "number") { 7983 val += ""; 7984 } else if (jQuery.isArray(val)) { 7985 val = jQuery.map(val, function (value) { 7986 return value == null ? "" : value + ""; 7987 }); 7988 } 7989 7990 hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()]; 7991 7992 // If set returns undefined, fall back to normal setting 7993 if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) { 7994 this.value = val; 7995 } 7996 }); 7997 } 7998 }); 7999 8000 jQuery.extend({ 8001 valHooks: { 8002 option: { 8003 get: function (elem) { 8004 var val = jQuery.find.attr(elem, "value"); 8005 return val != null ? val : 8006
vendor: 4,966 bytes, lines 8007-8195
8007 // Support: IE10-11+ 8008 // option.text throws exceptions (#14686, #14858) 8009 // Strip and collapse whitespace 8010 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 8011 jQuery.trim(jQuery.text(elem)).replace(rspaces, " "); 8012 } 8013 }, 8014 select: { 8015 get: function (elem) { 8016 var value, 8017 option, 8018 options = elem.options, 8019 index = elem.selectedIndex, 8020 one = elem.type === "select-one" || index < 0, 8021 values = one ? null : [], 8022 max = one ? index + 1 : options.length, 8023 i = index < 0 ? max : one ? index : 0; 8024 8025 // Loop through all the selected options 8026 for (; i < max; i++) { 8027 option = options[i]; 8028 8029 // oldIE doesn't update selected after form reset (#2551) 8030 if ((option.selected || i === index) && ( 8031 8032 // Don't return options that are disabled or in a disabled optgroup 8033 support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && (!option.parentNode.disabled || !jQuery.nodeName(option.parentNode, "optgroup"))) { 8034 8035 // Get the specific value for the option 8036 value = jQuery(option).val(); 8037 8038 // We don't need an array for one selects 8039 if (one) { 8040 return value; 8041 } 8042 8043 // Multi-Selects return an array 8044 values.push(value); 8045 } 8046 } 8047 8048 return values; 8049 }, 8050 8051 set: function (elem, value) { 8052 var optionSet, 8053 option, 8054 options = elem.options, 8055 values = jQuery.makeArray(value), 8056 i = options.length; 8057 8058 while (i--) { 8059 option = options[i]; 8060 8061 if (jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) { 8062 8063 // Support: IE6 8064 // When new option element is added to select box we need to 8065 // force reflow of newly added node in order to workaround delay 8066 // of initialization properties 8067 try { 8068 option.selected = optionSet = true; 8069 } catch (_) { 8070 8071 // Will be executed only in IE6 8072 option.scrollHeight; 8073 } 8074 } else { 8075 option.selected = false; 8076 } 8077 } 8078 8079 // Force browsers to behave consistently when non-matching value is set 8080 if (!optionSet) { 8081 elem.selectedIndex = -1; 8082 } 8083 8084 return options; 8085 } 8086 } 8087 } 8088 }); 8089 8090 // Radios and checkboxes getter/setter 8091 jQuery.each(["radio", "checkbox"], function () { 8092 jQuery.valHooks[this] = { 8093 set: function (elem, value) { 8094 if (jQuery.isArray(value)) { 8095 return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1; 8096 } 8097 } 8098 }; 8099 if (!support.checkOn) { 8100 jQuery.valHooks[this].get = function (elem) { 8101 return elem.getAttribute("value") === null ? "on" : elem.value; 8102 }; 8103 } 8104 }); 8105 8106 var nodeHook, 8107 boolHook, 8108 attrHandle = jQuery.expr.attrHandle, 8109 ruseDefault = /^(?:checked|selected)$/i, 8110 getSetAttribute = support.getSetAttribute, 8111 getSetInput = support.input; 8112 8113 jQuery.fn.extend({ 8114 attr: function (name, value) { 8115 return access(this, jQuery.attr, name, value, arguments.length > 1); 8116 }, 8117 8118 removeAttr: function (name) { 8119 return this.each(function () { 8120 jQuery.removeAttr(this, name); 8121 }); 8122 } 8123 }); 8124 8125 jQuery.extend({ 8126 attr: function (elem, name, value) { 8127 var ret, 8128 hooks, 8129 nType = elem.nodeType; 8130 8131 // Don't get/set attributes on text, comment and attribute nodes 8132 if (nType === 3 || nType === 8 || nType === 2) { 8133 return; 8134 } 8135 8136 // Fallback to prop when attributes are not supported 8137 if (typeof elem.getAttribute === "undefined") { 8138 return jQuery.prop(elem, name, value); 8139 } 8140 8141 // All attributes are lowercase 8142 // Grab necessary hook if one is defined 8143 if (nType !== 1 || !jQuery.isXMLDoc(elem)) { 8144 name = name.toLowerCase(); 8145 hooks = jQuery.attrHooks[name] || (jQuery.expr.match.bool.test(name) ? boolHook : nodeHook); 8146 } 8147 8148 if (value !== undefined) { 8149 if (value === null) { 8150 jQuery.removeAttr(elem, name); 8151 return; 8152 } 8153 8154 if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { 8155 return ret; 8156 } 8157 8158 elem.setAttribute(name, value + ""); 8159 return value; 8160 } 8161 8162 if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { 8163 return ret; 8164 } 8165 8166 ret = jQuery.find.attr(elem, name); 8167 8168 // Non-existent attributes return null, we normalize to undefined 8169 return ret == null ? undefined : ret; 8170 }, 8171 8172 attrHooks: { 8173 type: { 8174 set: function (elem, value) { 8175 if (!support.radioValue && value === "radio" && jQuery.nodeName(elem, "input")) { 8176 8177 // Setting the type on a radio button after the value resets the value in IE8-9 8178 // Reset value to default in case type is set after value during creation 8179 var val = elem.value; 8180 elem.setAttribute("type", value); 8181 if (val) { 8182 elem.value = val; 8183 } 8184 return value; 8185 } 8186 } 8187 } 8188 }, 8189 8190 removeAttr: function (elem, value) { 8191 var name, 8192 propName, 8193 i = 0, 8194 attrNames = value && value.match(rnotwhite); 8195
vendor: 4,714 bytes, lines 8196-8359
8196 if (attrNames && elem.nodeType === 1) { 8197 while (name = attrNames[i++]) { 8198 propName = jQuery.propFix[name] || name; 8199 8200 // Boolean attributes get special treatment (#10870) 8201 if (jQuery.expr.match.bool.test(name)) { 8202 8203 // Set corresponding property to false 8204 if (getSetInput && getSetAttribute || !ruseDefault.test(name)) { 8205 elem[propName] = false; 8206 8207 // Support: IE<9 8208 // Also clear defaultChecked/defaultSelected (if appropriate) 8209 } else { 8210 elem[jQuery.camelCase("default-" + name)] = elem[propName] = false; 8211 } 8212 8213 // See #9699 for explanation of this approach (setting first, then removal) 8214 } else { 8215 jQuery.attr(elem, name, ""); 8216 } 8217 8218 elem.removeAttribute(getSetAttribute ? name : propName); 8219 } 8220 } 8221 } 8222 }); 8223 8224 // Hooks for boolean attributes 8225 boolHook = { 8226 set: function (elem, value, name) { 8227 if (value === false) { 8228 8229 // Remove boolean attributes when set to false 8230 jQuery.removeAttr(elem, name); 8231 } else if (getSetInput && getSetAttribute || !ruseDefault.test(name)) { 8232 8233 // IE<8 needs the *property* name 8234 elem.setAttribute(!getSetAttribute && jQuery.propFix[name] || name, name); 8235 } else { 8236 8237 // Support: IE<9 8238 // Use defaultChecked and defaultSelected for oldIE 8239 elem[jQuery.camelCase("default-" + name)] = elem[name] = true; 8240 } 8241 return name; 8242 } 8243 }; 8244 8245 jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) { 8246 var getter = attrHandle[name] || jQuery.find.attr; 8247 8248 if (getSetInput && getSetAttribute || !ruseDefault.test(name)) { 8249 attrHandle[name] = function (elem, name, isXML) { 8250 var ret, handle; 8251 if (!isXML) { 8252 8253 // Avoid an infinite loop by temporarily removing this function from the getter 8254 handle = attrHandle[name]; 8255 attrHandle[name] = ret; 8256 ret = getter(elem, name, isXML) != null ? name.toLowerCase() : null; 8257 attrHandle[name] = handle; 8258 } 8259 return ret; 8260 }; 8261 } else { 8262 attrHandle[name] = function (elem, name, isXML) { 8263 if (!isXML) { 8264 return elem[jQuery.camelCase("default-" + name)] ? name.toLowerCase() : null; 8265 } 8266 }; 8267 } 8268 }); 8269 8270 // fix oldIE attroperties 8271 if (!getSetInput || !getSetAttribute) { 8272 jQuery.attrHooks.value = { 8273 set: function (elem, value, name) { 8274 if (jQuery.nodeName(elem, "input")) { 8275 8276 // Does not return so that setAttribute is also used 8277 elem.defaultValue = value; 8278 } else { 8279 8280 // Use nodeHook if defined (#1954); otherwise setAttribute is fine 8281 return nodeHook && nodeHook.set(elem, value, name); 8282 } 8283 } 8284 }; 8285 } 8286 8287 // IE6/7 do not support getting/setting some attributes with get/setAttribute 8288 if (!getSetAttribute) { 8289 8290 // Use this for any attribute in IE6/7 8291 // This fixes almost every IE6/7 issue 8292 nodeHook = { 8293 set: function (elem, value, name) { 8294 8295 // Set the existing or create a new attribute node 8296 var ret = elem.getAttributeNode(name); 8297 if (!ret) { 8298 elem.setAttributeNode(ret = elem.ownerDocument.createAttribute(name)); 8299 } 8300 8301 ret.value = value += ""; 8302 8303 // Break association with cloned elements by also using setAttribute (#9646) 8304 if (name === "value" || value === elem.getAttribute(name)) { 8305 return value; 8306 } 8307 } 8308 }; 8309 8310 // Some attributes are constructed with empty-string values when not defined 8311 attrHandle.id = attrHandle.name = attrHandle.coords = function (elem, name, isXML) { 8312 var ret; 8313 if (!isXML) { 8314 return (ret = elem.getAttributeNode(name)) && ret.value !== "" ? ret.value : null; 8315 } 8316 }; 8317 8318 // Fixing value retrieval on a button requires this module 8319 jQuery.valHooks.button = { 8320 get: function (elem, name) { 8321 var ret = elem.getAttributeNode(name); 8322 if (ret && ret.specified) { 8323 return ret.value; 8324 } 8325 }, 8326 set: nodeHook.set 8327 }; 8328 8329 // Set contenteditable to false on removals(#10429) 8330 // Setting to empty string throws an error as an invalid value 8331 jQuery.attrHooks.contenteditable = { 8332 set: function (elem, value, name) { 8333 nodeHook.set(elem, value === "" ? false : value, name); 8334 } 8335 }; 8336 8337 // Set width and height to auto instead of 0 on empty string( Bug #8150 ) 8338 // This is for removals 8339 jQuery.each(["width", "height"], function (i, name) { 8340 jQuery.attrHooks[name] = { 8341 set: function (elem, value) { 8342 if (value === "") { 8343 elem.setAttribute(name, "auto"); 8344 return value; 8345 } 8346 } 8347 }; 8348 }); 8349 } 8350 8351 if (!support.style) { 8352 jQuery.attrHooks.style = { 8353 get: function (elem) { 8354 8355 // Return undefined in the case of empty string 8356 // Note: IE uppercases css property names, but if we were to .toLowerCase() 8357 // .cssText, that would destroy case sensitivity in URL's, like in "background" 8358 return elem.style.cssText || undefined; 8359 },
8360 set: function (elem, value) { 8361 return elem.style.cssText = value + ""; 8362 } 8363 }; 8364 } 8365 8366 var rfocusable = /^(?:input|select|textarea|button|object)$/i, 8367 rclickable = /^(?:a|area)$/i; 8368 8369 jQuery.fn.extend({ 8370 prop: function (name, value) { 8371 return access(this, jQuery.prop, name, value, arguments.length > 1); 8372 }, 8373 8374 removeProp: function (name) { 8375 name = jQuery.propFix[name] || name; 8376 return this.each(function () { 8377 8378 // try/catch handles cases where IE balks (such as removing a property on window) 8379 try { 8380 this[name] = undefined; 8381 delete this[name]; 8382 } catch (e) {} 8383 }); 8384 } 8385 }); 8386 8387 jQuery.extend({ 8388 prop: function (elem, name, value) { 8389 var ret, 8390 hooks, 8391 nType = elem.nodeType; 8392 8393 // Don't get/set properties on text, comment and attribute nodes 8394 if (nType === 3 || nType === 8 || nType === 2) { 8395 return; 8396 } 8397 8398 if (nType !== 1 || !jQuery.isXMLDoc(elem)) { 8399 8400 // Fix name and attach hooks 8401 name = jQuery.propFix[name] || name; 8402 hooks = jQuery.propHooks[name]; 8403 } 8404 8405 if (value !== undefined) { 8406 if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== undefined) { 8407 return ret; 8408 } 8409 8410 return elem[name] = value; 8411 } 8412 8413 if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) { 8414 return ret; 8415 } 8416 8417 return elem[name]; 8418 }, 8419 8420 propHooks: { 8421 tabIndex: { 8422 get: function (elem) { 8423 8424 // elem.tabIndex doesn't always return the 8425 // correct value when it hasn't been explicitly set 8426 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 8427 // Use proper attribute retrieval(#12072) 8428 var tabindex = jQuery.find.attr(elem, "tabindex"); 8429 8430 return tabindex ? parseInt(tabindex, 10) : rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href ? 0 : -1; 8431 } 8432 } 8433 }, 8434 8435 propFix: { 8436 "for": "htmlFor", 8437 "class": "className" 8438 } 8439 }); 8440 8441 // Some attributes require a special call on IE 8442 // http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 8443 if (!support.hrefNormalized) { 8444 8445 // href/src property should get the full normalized URL (#10299/#12915) 8446 jQuery.each(["href", "src"], function (i, name) { 8447 jQuery.propHooks[name] = { 8448 get: function (elem) { 8449 return elem.getAttribute(name, 4); 8450 } 8451 }; 8452 }); 8453 } 8454 8455 // Support: Safari, IE9+ 8456 // Accessing the selectedIndex property 8457 // forces the browser to respect setting selected 8458 // on the option 8459 // The getter ensures a default option is selected 8460 // when in an optgroup 8461 if (!support.optSelected) { 8462 jQuery.propHooks.selected = { 8463 get: function (elem) { 8464 var parent = elem.parentNode; 8465 8466 if (parent) { 8467 parent.selectedIndex; 8468 8469 // Make sure that it also works with optgroups, see #5701 8470 if (parent.parentNode) { 8471 parent.parentNode.selectedIndex; 8472 } 8473 } 8474 return null; 8475 }, 8476 set: function (elem) { 8477 var parent = elem.parentNode; 8478 if (parent) { 8479 parent.selectedIndex; 8480 8481 if (parent.parentNode) { 8482 parent.parentNode.selectedIndex; 8483 } 8484 } 8485 } 8486 }; 8487 } 8488 8489 jQuery.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { 8490 jQuery.propFix[this.toLowerCase()] = this; 8491 }); 8492 8493 // IE6/7 call enctype encoding 8494 if (!support.enctype) { 8495 jQuery.propFix.enctype = "encoding"; 8496 } 8497 8498 var rclass = /[\t\r\n\f]/g; 8499 8500 function getClass(elem) { 8501 return jQuery.attr(elem, "class") || ""; 8502 } 8503 8504 jQuery.fn.extend({ 8505 addClass: function (value) { 8506 var classes, 8507 elem, 8508 cur, 8509 curValue, 8510 clazz, 8511 j, 8512 finalValue, 8513 i = 0; 8514 8515 if (jQuery.isFunction(value)) { 8516 return this.each(function (j) { 8517 jQuery(this).addClass(value.call(this, j, getClass(this))); 8518 }); 8519 } 8520 8521 if (typeof value === "string" && value) { 8522 classes = value.match(rnotwhite) || []; 8523 8524 while (elem = this[i++]) { 8525 curValue = getClass(elem); 8526 cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " "); 8527 8528 if (cur) { 8529 j = 0; 8530 while (clazz = classes[j++]) { 8531 if (cur.indexOf(" " + clazz + " ") < 0) { 8532 cur += clazz + " "; 8533 } 8534 } 8535 8536 // only assign if different to avoid unneeded rendering. 8537 finalValue = jQuery.trim(cur); 8538 if (curValue !== finalValue) { 8539 jQuery.attr(elem, "class", finalValue); 8540 } 8541 } 8542 } 8543 } 8544 8545 return this; 8546 }, 8547 8548 removeClass: function (value) { 8549 var classes, 8550 elem, 8551 cur, 8552 curValue, 8553 clazz, 8554 j, 8555 finalValue, 8556 i = 0; 8557 8558 if (jQuery.isFunction(value)) { 8559 return this.each(function (j) { 8560 jQuery(this).removeClass(value.call(this, j, getClass(this))); 8561 }); 8562 } 8563 8564 if (!arguments.length) { 8565 return this.attr("class", ""); 8566 } 8567 8568 if (typeof value === "string" && value) { 8569 classes = value.match(rnotwhite) || []; 8570 8571 while (elem = this[i++]) { 8572 curValue = getClass(elem); 8573 8574 // This expression is here for better compressibility (see addClass) 8575 cur = elem.nodeType === 1 && (" " + curValue + " ").replace(rclass, " "); 8576 8577 if (cur) { 8578 j = 0; 8579 while (clazz = classes[j++]) { 8580
8581 // Remove *all* instances 8582 while (cur.indexOf(" " + clazz + " ") > -1) { 8583 cur = cur.replace(" " + clazz + " ", " "); 8584 } 8585 } 8586 8587 // Only assign if different to avoid unneeded rendering. 8588 finalValue = jQuery.trim(cur); 8589 if (curValue !== finalValue) { 8590 jQuery.attr(elem, "class", finalValue); 8591 } 8592 } 8593 } 8594 } 8595 8596 return this; 8597 }, 8598 8599 toggleClass: function (value, stateVal) { 8600 var type = typeof value; 8601 8602 if (typeof stateVal === "boolean" && type === "string") { 8603 return stateVal ? this.addClass(value) : this.removeClass(value); 8604 } 8605 8606 if (jQuery.isFunction(value)) { 8607 return this.each(function (i) { 8608 jQuery(this).toggleClass(value.call(this, i, getClass(this), stateVal), stateVal); 8609 }); 8610 } 8611 8612 return this.each(function () { 8613 var className, i, self, classNames; 8614 8615 if (type === "string") { 8616 8617 // Toggle individual class names 8618 i = 0; 8619 self = jQuery(this); 8620 classNames = value.match(rnotwhite) || []; 8621 8622 while (className = classNames[i++]) { 8623 8624 // Check each className given, space separated list 8625 if (self.hasClass(className)) { 8626 self.removeClass(className); 8627 } else { 8628 self.addClass(className); 8629 } 8630 } 8631 8632 // Toggle whole class name 8633 } else if (value === undefined || type === "boolean") { 8634 className = getClass(this); 8635 if (className) { 8636 8637 // store className if set 8638 jQuery._data(this, "__className__", className); 8639 } 8640 8641 // If the element has a class name or if we're passed "false", 8642 // then remove the whole classname (if there was one, the above saved it). 8643 // Otherwise bring back whatever was previously saved (if anything), 8644 // falling back to the empty string if nothing was stored. 8645 jQuery.attr(this, "class", className || value === false ? "" : jQuery._data(this, "__className__") || ""); 8646 } 8647 }); 8648 }, 8649 8650 hasClass: function (selector) { 8651 var className, 8652 elem, 8653 i = 0; 8654 8655 className = " " + selector + " "; 8656 while (elem = this[i++]) { 8657 if (elem.nodeType === 1 && (" " + getClass(elem) + " ").replace(rclass, " ").indexOf(className) > -1) { 8658 return true; 8659 } 8660 } 8661 8662 return false; 8663 } 8664 }); 8665 8666 // Return jQuery for attributes-only inclusion 8667 8668 8669 jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup error contextmenu").split(" "), function (i, name) { 8670 8671 // Handle event binding 8672 jQuery.fn[name] = function (data, fn) { 8673 return arguments.length > 0 ? this.on(name, null, data, fn) : this.trigger(name); 8674 }; 8675 }); 8676 8677 jQuery.fn.extend({ 8678 hover: function (fnOver, fnOut) { 8679 return this.mouseenter(fnOver).mouseleave(fnOut || fnOver); 8680 } 8681 }); 8682 8683 var location = window.location; 8684 8685 var nonce = jQuery.now(); 8686 8687 var rquery = /\?/; 8688 8689 var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g; 8690 8691 jQuery.parseJSON = function (data) { 8692 8693 // Attempt to parse using the native JSON parser first 8694 if (window.JSON && window.JSON.parse) { 8695 8696 // Support: Android 2.3 8697 // Workaround failure to string-cast null input 8698 return window.JSON.parse(data + ""); 8699 } 8700 8701 var requireNonComma, 8702 depth = null, 8703 str = jQuery.trim(data + ""); 8704 8705 // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains 8706 // after removing valid tokens 8707 return str && !jQuery.trim(str.replace(rvalidtokens, function (token, comma, open, close) { 8708 8709 // Force termination if we see a misplaced comma 8710 if (requireNonComma && comma) { 8711 depth = 0; 8712 } 8713 8714 // Perform no more replacements after returning to outermost depth 8715 if (depth === 0) { 8716 return token; 8717 } 8718 8719 // Commas must not follow "[", "{", or "," 8720 requireNonComma = open || comma; 8721 8722 // Determine new depth 8723 // array/object open ("[" or "{"): depth += true - false (increment) 8724 // array/object close ("]" or "}"): depth += false - true (decrement) 8725 // other cases ("," or primitive): depth += true - true (numeric cast) 8726 depth += !close - !open; 8727 8728 // Remove this token 8729 return ""; 8730 })) ? Function("return " + str)() : jQuery.error("Invalid JSON: " + data); 8731 }; 8732 8733 // Cross-browser xml parsing 8734 jQuery.parseXML = function (data) { 8735 var xml, tmp; 8736 if (!data || typeof data !== "string") { 8737 return null; 8738 } 8739 try { 8740 if (window.DOMParser) { 8741 // Standard 8742 tmp = new window.DOMParser(); 8743 xml = tmp.parseFromString(data, "text/xml"); 8744 } else { 8745 // IE 8746 xml = new window.ActiveXObject("Microsoft.XMLDOM"); 8747 xml.async = "false"; 8748 xml.loadXML(data); 8749 } 8750 } catch (e) { 8751 xml = undefined; 8752 } 8753 if (!xml || !xml.documentElement || xml.getElementsByTagName("parsererror").length) { 8754 jQuery.error("Invalid XML: " + data); 8755 } 8756 return xml; 8757 }; 8758 8759 var rhash = /#.*$/, 8760 rts = /([?&])_=[^&]*/, 8761 8762 8763 // IE leaves an \r character at EOL 8764 rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, 8765 8766
vendor: 13,733 bytes, lines 8767-9311
8767 // #7653, #8125, #8152: local protocol detection 8768 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 8769 rnoContent = /^(?:GET|HEAD)$/, 8770 rprotocol = /^\/\//, 8771 rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/, 8772 8773 8774 /* Prefilters 8775 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 8776 * 2) These are called: 8777 * - BEFORE asking for a transport 8778 * - AFTER param serialization (s.data is a string if s.processData is true) 8779 * 3) key is the dataType 8780 * 4) the catchall symbol "*" can be used 8781 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 8782 */ 8783 prefilters = {}, 8784 8785 8786 /* Transports bindings 8787 * 1) key is the dataType 8788 * 2) the catchall symbol "*" can be used 8789 * 3) selection will start with transport dataType and THEN go to "*" if needed 8790 */ 8791 transports = {}, 8792 8793 8794 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 8795 allTypes = "*/".concat("*"), 8796 8797 8798 // Document location 8799 ajaxLocation = location.href, 8800 8801 8802 // Segment location into parts 8803 ajaxLocParts = rurl.exec(ajaxLocation.toLowerCase()) || []; 8804 8805 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 8806 function addToPrefiltersOrTransports(structure) { 8807 8808 // dataTypeExpression is optional and defaults to "*" 8809 return function (dataTypeExpression, func) { 8810 8811 if (typeof dataTypeExpression !== "string") { 8812 func = dataTypeExpression; 8813 dataTypeExpression = "*"; 8814 } 8815 8816 var dataType, 8817 i = 0, 8818 dataTypes = dataTypeExpression.toLowerCase().match(rnotwhite) || []; 8819 8820 if (jQuery.isFunction(func)) { 8821 8822 // For each dataType in the dataTypeExpression 8823 while (dataType = dataTypes[i++]) { 8824 8825 // Prepend if requested 8826 if (dataType.charAt(0) === "+") { 8827 dataType = dataType.slice(1) || "*"; 8828 (structure[dataType] = structure[dataType] || []).unshift(func); 8829 8830 // Otherwise append 8831 } else { 8832 (structure[dataType] = structure[dataType] || []).push(func); 8833 } 8834 } 8835 } 8836 }; 8837 } 8838 8839 // Base inspection function for prefilters and transports 8840 function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) { 8841 8842 var inspected = {}, 8843 seekingTransport = structure === transports; 8844 8845 function inspect(dataType) { 8846 var selected; 8847 inspected[dataType] = true; 8848 jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) { 8849 var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR); 8850 if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) { 8851 8852 options.dataTypes.unshift(dataTypeOrTransport); 8853 inspect(dataTypeOrTransport); 8854 return false; 8855 } else if (seekingTransport) { 8856 return !(selected = dataTypeOrTransport); 8857 } 8858 }); 8859 return selected; 8860 } 8861 8862 return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*"); 8863 } 8864 8865 // A special extend for ajax options 8866 // that takes "flat" options (not to be deep extended) 8867 // Fixes #9887 8868 function ajaxExtend(target, src) { 8869 var deep, 8870 key, 8871 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 8872 8873 for (key in src) { 8874 if (src[key] !== undefined) { 8875 (flatOptions[key] ? target : deep || (deep = {}))[key] = src[key]; 8876 } 8877 } 8878 if (deep) { 8879 jQuery.extend(true, target, deep); 8880 } 8881 8882 return target; 8883 } 8884 8885 /* Handles responses to an ajax request: 8886 * - finds the right dataType (mediates between content-type and expected dataType) 8887 * - returns the corresponding response 8888 */ 8889 function ajaxHandleResponses(s, jqXHR, responses) { 8890 var firstDataType, 8891 ct, 8892 finalDataType, 8893 type, 8894 contents = s.contents, 8895 dataTypes = s.dataTypes; 8896 8897 // Remove auto dataType and get content-type in the process 8898 while (dataTypes[0] === "*") { 8899 dataTypes.shift(); 8900 if (ct === undefined) { 8901 ct = s.mimeType || jqXHR.getResponseHeader("Content-Type"); 8902 } 8903 } 8904 8905 // Check if we're dealing with a known content-type 8906 if (ct) { 8907 for (type in contents) { 8908 if (contents[type] && contents[type].test(ct)) { 8909 dataTypes.unshift(type); 8910 break; 8911 } 8912 } 8913 } 8914 8915 // Check to see if we have a response for the expected dataType 8916 if (dataTypes[0] in responses) { 8917 finalDataType = dataTypes[0]; 8918 } else { 8919 8920 // Try convertible dataTypes 8921 for (type in responses) { 8922 if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) { 8923 finalDataType = type; 8924 break; 8925 } 8926 if (!firstDataType) { 8927 firstDataType = type; 8928 } 8929 } 8930 8931 // Or just use first one 8932 finalDataType = finalDataType || firstDataType; 8933 } 8934 8935 // If we found a dataType 8936 // We add the dataType to the list if needed 8937 // and return the corresponding response 8938 if (finalDataType) { 8939 if (finalDataType !== dataTypes[0]) { 8940 dataTypes.unshift(finalDataType); 8941 } 8942 return responses[finalDataType]; 8943 } 8944 } 8945 8946 /* Chain conversions given the request and the original response 8947 * Also sets the responseXXX fields on the jqXHR instance 8948 */ 8949 function ajaxConvert(s, response, jqXHR, isSuccess) { 8950 var conv2, 8951 current, 8952 conv, 8953 tmp, 8954 prev, 8955 converters = {}, 8956 8957 8958 // Work with a copy of dataTypes in case we need to modify it for conversion 8959 dataTypes = s.dataTypes.slice(); 8960 8961 // Create converters map with lowercased keys 8962 if (dataTypes[1]) { 8963 for (conv in s.converters) { 8964 converters[conv.toLowerCase()] = s.converters[conv]; 8965 } 8966 } 8967 8968 current = dataTypes.shift(); 8969 8970 // Convert to each sequential dataType 8971 while (current) { 8972 8973 if (s.responseFields[current]) { 8974 jqXHR[s.responseFields[current]] = response; 8975 } 8976 8977 // Apply the dataFilter if provided 8978 if (!prev && isSuccess && s.dataFilter) { 8979 response = s.dataFilter(response, s.dataType); 8980 } 8981 8982 prev = current; 8983 current = dataTypes.shift(); 8984 8985 if (current) { 8986 8987 // There's only work to do if current dataType is non-auto 8988 if (current === "*") { 8989 8990 current = prev; 8991 8992 // Convert response if prev dataType is non-auto and differs from current 8993 } else if (prev !== "*" && prev !== current) { 8994 8995 // Seek a direct converter 8996 conv = converters[prev + " " + current] || converters["* " + current]; 8997 8998 // If none found, seek a pair 8999 if (!conv) { 9000 for (conv2 in converters) { 9001 9002 // If conv2 outputs current 9003 tmp = conv2.split(" "); 9004 if (tmp[1] === current) { 9005 9006 // If prev can be converted to accepted input 9007 conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]]; 9008 if (conv) { 9009 9010 // Condense equivalence converters 9011 if (conv === true) { 9012 conv = converters[conv2]; 9013 9014 // Otherwise, insert the intermediate dataType 9015 } else if (converters[conv2] !== true) { 9016 current = tmp[0]; 9017 dataTypes.unshift(tmp[1]); 9018 } 9019 break; 9020 } 9021 } 9022 } 9023 } 9024 9025 // Apply converter (if not an equivalence) 9026 if (conv !== true) { 9027 9028 // Unless errors are allowed to bubble, catch and return them 9029 if (conv && s["throws"]) { 9030 // jscs:ignore requireDotNotation 9031 response = conv(response); 9032 } else { 9033 try { 9034 response = conv(response); 9035 } catch (e) { 9036 return { 9037 state: "parsererror", 9038 error: conv ? e : "No conversion from " + prev + " to " + current 9039 }; 9040 } 9041 } 9042 } 9043 } 9044 } 9045 } 9046 9047 return { state: "success", data: response }; 9048 } 9049 9050 jQuery.extend({ 9051 9052 // Counter for holding the number of active queries 9053 active: 0, 9054 9055 // Last-Modified header cache for next request 9056 lastModified: {}, 9057 etag: {}, 9058 9059 ajaxSettings: { 9060 url: ajaxLocation, 9061 type: "GET", 9062 isLocal: rlocalProtocol.test(ajaxLocParts[1]), 9063 global: true, 9064 processData: true, 9065 async: true, 9066 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 9067 /* 9068 timeout: 0, 9069 data: null, 9070 dataType: null, 9071 username: null, 9072 password: null, 9073 cache: null, 9074 throws: false, 9075 traditional: false, 9076 headers: {}, 9077 */ 9078 9079 accepts: { 9080 "*": allTypes, 9081 text: "text/plain", 9082 html: "text/html", 9083 xml: "application/xml, text/xml", 9084 json: "application/json, text/javascript" 9085 }, 9086 9087 contents: { 9088 xml: /\bxml\b/, 9089 html: /\bhtml/, 9090 json: /\bjson\b/ 9091 }, 9092 9093 responseFields: { 9094 xml: "responseXML", 9095 text: "responseText", 9096 json: "responseJSON" 9097 }, 9098 9099 // Data converters 9100 // Keys separate source (or catchall "*") and destination types with a single space 9101 converters: { 9102 9103 // Convert anything to text 9104 "* text": String, 9105 9106 // Text to html (true = no transformation) 9107 "text html": true, 9108 9109 // Evaluate text as a json expression 9110 "text json": jQuery.parseJSON, 9111 9112 // Parse text as xml 9113 "text xml": jQuery.parseXML 9114 }, 9115 9116 // For options that shouldn't be deep extended: 9117 // you can add your own custom options here if 9118 // and when you create one that shouldn't be 9119 // deep extended (see ajaxExtend) 9120 flatOptions: { 9121 url: true, 9122 context: true 9123 } 9124 }, 9125 9126 // Creates a full fledged settings object into target 9127 // with both ajaxSettings and settings fields. 9128 // If target is omitted, writes into ajaxSettings. 9129 ajaxSetup: function (target, settings) { 9130 return settings ? 9131 9132 // Building a settings object 9133 ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : 9134 9135 // Extending ajaxSettings 9136 ajaxExtend(jQuery.ajaxSettings, target); 9137 }, 9138 9139 ajaxPrefilter: addToPrefiltersOrTransports(prefilters), 9140 ajaxTransport: addToPrefiltersOrTransports(transports), 9141 9142 // Main method 9143 ajax: function (url, options) { 9144 9145 // If url is an object, simulate pre-1.5 signature 9146 if (typeof url === "object") { 9147 options = url; 9148 url = undefined; 9149 } 9150 9151 // Force options to be an object 9152 options = options || {}; 9153 9154 var 9155 9156 // Cross-domain detection vars 9157 parts, 9158 9159 9160 // Loop variable 9161 i, 9162 9163 9164 // URL without anti-cache param 9165 cacheURL, 9166 9167 9168 // Response headers as string 9169 responseHeadersString, 9170 9171 9172 // timeout handle 9173 timeoutTimer, 9174 9175 9176 // To know if global events are to be dispatched 9177 fireGlobals, 9178 transport, 9179 9180 9181 // Response headers 9182 responseHeaders, 9183 9184 9185 // Create the final options object 9186 s = jQuery.ajaxSetup({}, options), 9187 9188 9189 // Callbacks context 9190 callbackContext = s.context || s, 9191 9192 9193 // Context for global events is callbackContext if it is a DOM node or jQuery collection 9194 globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event, 9195 9196 9197 // Deferreds 9198 deferred = jQuery.Deferred(), 9199 completeDeferred = jQuery.Callbacks("once memory"), 9200 9201 9202 // Status-dependent callbacks 9203 statusCode = s.statusCode || {}, 9204 9205 9206 // Headers (they are sent all at once) 9207 requestHeaders = {}, 9208 requestHeadersNames = {}, 9209 9210 9211 // The jqXHR state 9212 state = 0, 9213 9214 9215 // Default abort message 9216 strAbort = "canceled", 9217 9218 9219 // Fake xhr 9220 jqXHR = { 9221 readyState: 0, 9222 9223 // Builds headers hashtable if needed 9224 getResponseHeader: function (key) { 9225 var match; 9226 if (state === 2) { 9227 if (!responseHeaders) { 9228 responseHeaders = {}; 9229 while (match = rheaders.exec(responseHeadersString)) { 9230 responseHeaders[match[1].toLowerCase()] = match[2]; 9231 } 9232 } 9233 match = responseHeaders[key.toLowerCase()]; 9234 } 9235 return match == null ? null : match; 9236 }, 9237 9238 // Raw string 9239 getAllResponseHeaders: function () { 9240 return state === 2 ? responseHeadersString : null; 9241 }, 9242 9243 // Caches the header 9244 setRequestHeader: function (name, value) { 9245 var lname = name.toLowerCase(); 9246 if (!state) { 9247 name = requestHeadersNames[lname] = requestHeadersNames[lname] || name; 9248 requestHeaders[name] = value; 9249 } 9250 return this; 9251 }, 9252 9253 // Overrides response content-type header 9254 overrideMimeType: function (type) { 9255 if (!state) { 9256 s.mimeType = type; 9257 } 9258 return this; 9259 }, 9260 9261 // Status-dependent callbacks 9262 statusCode: function (map) { 9263 var code; 9264 if (map) { 9265 if (state < 2) { 9266 for (code in map) { 9267 9268 // Lazy-add the new callback in a way that preserves old ones 9269 statusCode[code] = [statusCode[code], map[code]]; 9270 } 9271 } else { 9272 9273 // Execute the appropriate callbacks 9274 jqXHR.always(map[jqXHR.status]); 9275 } 9276 } 9277 return this; 9278 }, 9279 9280 // Cancel the request 9281 abort: function (statusText) { 9282 var finalText = statusText || strAbort; 9283 if (transport) { 9284 transport.abort(finalText); 9285 } 9286 done(0, finalText); 9287 return this; 9288 } 9289 }; 9290 9291 // Attach deferreds 9292 deferred.promise(jqXHR).complete = completeDeferred.add; 9293 jqXHR.success = jqXHR.done; 9294 jqXHR.error = jqXHR.fail; 9295 9296 // Remove hash character (#7531: and string promotion) 9297 // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) 9298 // Handle falsy url in the settings object (#10093: consistency with old signature) 9299 // We also use the url parameter if available 9300 s.url = ((url || s.url || ajaxLocation) + "").replace(rhash, "").replace(rprotocol, ajaxLocParts[1] + "//"); 9301 9302 // Alias method option to type as per ticket #12004 9303 s.type = options.method || options.type || s.method || s.type; 9304 9305 // Extract dataTypes list 9306 s.dataTypes = jQuery.trim(s.dataType || "*").toLowerCase().match(rnotwhite) || [""]; 9307 9308 // A cross-domain request is in order when we have a protocol:host:port mismatch 9309 if (s.crossDomain == null) { 9310 parts = rurl.exec(s.url.toLowerCase()); 9311 s.crossDomain = !!(parts && (parts[1] !== ajaxLocParts[1] || parts[2] !== ajaxLocParts[2] || (parts[3] || (parts[1] === "http:" ? "80" : "443")) !== (ajaxLocParts[3] || (ajaxLocParts[1] === "http:" ? "80" : "443")))
vendor: 9,321 bytes, lines 9311-9682
9311); 9312 } 9313 9314 // Convert data if not already a string 9315 if (s.data && s.processData && typeof s.data !== "string") { 9316 s.data = jQuery.param(s.data, s.traditional); 9317 } 9318 9319 // Apply prefilters 9320 inspectPrefiltersOrTransports(prefilters, s, options, jqXHR); 9321 9322 // If request was aborted inside a prefilter, stop there 9323 if (state === 2) { 9324 return jqXHR; 9325 } 9326 9327 // We can fire global events as of now if asked to 9328 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 9329 fireGlobals = jQuery.event && s.global; 9330 9331 // Watch for a new set of requests 9332 if (fireGlobals && jQuery.active++ === 0) { 9333 jQuery.event.trigger("ajaxStart"); 9334 } 9335 9336 // Uppercase the type 9337 s.type = s.type.toUpperCase(); 9338 9339 // Determine if request has content 9340 s.hasContent = !rnoContent.test(s.type); 9341 9342 // Save the URL in case we're toying with the If-Modified-Since 9343 // and/or If-None-Match header later on 9344 cacheURL = s.url; 9345 9346 // More options handling for requests with no content 9347 if (!s.hasContent) { 9348 9349 // If data is available, append data to url 9350 if (s.data) { 9351 cacheURL = s.url += (rquery.test(cacheURL) ? "&" : "?") + s.data; 9352 9353 // #9682: remove data so that it's not used in an eventual retry 9354 delete s.data; 9355 } 9356 9357 // Add anti-cache in url if needed 9358 if (s.cache === false) { 9359 s.url = rts.test(cacheURL) ? 9360 9361 // If there is already a '_' parameter, set its value 9362 cacheURL.replace(rts, "$1_=" + nonce++) : 9363 9364 // Otherwise add one to the end 9365 cacheURL + (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce++; 9366 } 9367 } 9368 9369 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9370 if (s.ifModified) { 9371 if (jQuery.lastModified[cacheURL]) { 9372 jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]); 9373 } 9374 if (jQuery.etag[cacheURL]) { 9375 jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]); 9376 } 9377 } 9378 9379 // Set the correct header, if data is being sent 9380 if (s.data && s.hasContent && s.contentType !== false || options.contentType) { 9381 jqXHR.setRequestHeader("Content-Type", s.contentType); 9382 } 9383 9384 // Set the Accepts header for the server, depending on the dataType 9385 jqXHR.setRequestHeader("Accept", s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]); 9386 9387 // Check for headers option 9388 for (i in s.headers) { 9389 jqXHR.setRequestHeader(i, s.headers[i]); 9390 } 9391 9392 // Allow custom headers/mimetypes and early abort 9393 if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || state === 2)) { 9394 9395 // Abort if not done already and return 9396 return jqXHR.abort(); 9397 } 9398 9399 // aborting is no longer a cancellation 9400 strAbort = "abort"; 9401 9402 // Install callbacks on deferreds 9403 for (i in { success: 1, error: 1, complete: 1 }) { 9404 jqXHR[i](s[i]); 9405 } 9406 9407 // Get transport 9408 transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR); 9409 9410 // If no transport, we auto-abort 9411 if (!transport) { 9412 done(-1, "No Transport"); 9413 } else { 9414 jqXHR.readyState = 1; 9415 9416 // Send global event 9417 if (fireGlobals) { 9418 globalEventContext.trigger("ajaxSend", [jqXHR, s]); 9419 } 9420 9421 // If request was aborted inside ajaxSend, stop there 9422 if (state === 2) { 9423 return jqXHR; 9424 } 9425 9426 // Timeout 9427 if (s.async && s.timeout > 0) { 9428 timeoutTimer = window.setTimeout(function () { 9429 jqXHR.abort("timeout"); 9430 }, s.timeout); 9431 } 9432 9433 try { 9434 state = 1; 9435 transport.send(requestHeaders, done); 9436 } catch (e) { 9437 9438 // Propagate exception as error if not done 9439 if (state < 2) { 9440 done(-1, e); 9441 9442 // Simply rethrow otherwise 9443 } else { 9444 throw e; 9445 } 9446 } 9447 } 9448 9449 // Callback for when everything is done 9450 function done(status, nativeStatusText, responses, headers) { 9451 var isSuccess, 9452 success, 9453 error, 9454 response, 9455 modified, 9456 statusText = nativeStatusText; 9457 9458 // Called once 9459 if (state === 2) { 9460 return; 9461 } 9462 9463 // State is "done" now 9464 state = 2; 9465 9466 // Clear timeout if it exists 9467 if (timeoutTimer) { 9468 window.clearTimeout(timeoutTimer); 9469 } 9470 9471 // Dereference transport for early garbage collection 9472 // (no matter how long the jqXHR object will be used) 9473 transport = undefined; 9474 9475 // Cache response headers 9476 responseHeadersString = headers || ""; 9477 9478 // Set readyState 9479 jqXHR.readyState = status > 0 ? 4 : 0; 9480 9481 // Determine if successful 9482 isSuccess = status >= 200 && status < 300 || status === 304; 9483 9484 // Get response data 9485 if (responses) { 9486 response = ajaxHandleResponses(s, jqXHR, responses); 9487 } 9488 9489 // Convert no matter what (that way responseXXX fields are always set) 9490 response = ajaxConvert(s, response, jqXHR, isSuccess); 9491 9492 // If successful, handle type chaining 9493 if (isSuccess) { 9494 9495 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9496 if (s.ifModified) { 9497 modified = jqXHR.getResponseHeader("Last-Modified"); 9498 if (modified) { 9499 jQuery.lastModified[cacheURL] = modified; 9500 } 9501 modified = jqXHR.getResponseHeader("etag"); 9502 if (modified) { 9503 jQuery.etag[cacheURL] = modified; 9504 } 9505 } 9506 9507 // if no content 9508 if (status === 204 || s.type === "HEAD") { 9509 statusText = "nocontent"; 9510 9511 // if not modified 9512 } else if (status === 304) { 9513 statusText = "notmodified"; 9514 9515 // If we have data, let's convert it 9516 } else { 9517 statusText = response.state; 9518 success = response.data; 9519 error = response.error; 9520 isSuccess = !error; 9521 } 9522 } else { 9523 9524 // We extract error from statusText 9525 // then normalize statusText and status for non-aborts 9526 error = statusText; 9527 if (status || !statusText) { 9528 statusText = "error"; 9529 if (status < 0) { 9530 status = 0; 9531 } 9532 } 9533 } 9534 9535 // Set data for the fake xhr object 9536 jqXHR.status = status; 9537 jqXHR.statusText = (nativeStatusText || statusText) + ""; 9538 9539 // Success/Error 9540 if (isSuccess) { 9541 deferred.resolveWith(callbackContext, [success, statusText, jqXHR]); 9542 } else { 9543 deferred.rejectWith(callbackContext, [jqXHR, statusText, error]); 9544 } 9545 9546 // Status-dependent callbacks 9547 jqXHR.statusCode(statusCode); 9548 statusCode = undefined; 9549 9550 if (fireGlobals) { 9551 globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError", [jqXHR, s, isSuccess ? success : error]); 9552 } 9553 9554 // Complete 9555 completeDeferred.fireWith(callbackContext, [jqXHR, statusText]); 9556 9557 if (fireGlobals) { 9558 globalEventContext.trigger("ajaxComplete", [jqXHR, s]); 9559 9560 // Handle the global AJAX counter 9561 if (! --jQuery.active) { 9562 jQuery.event.trigger("ajaxStop"); 9563 } 9564 } 9565 } 9566 9567 return jqXHR; 9568 }, 9569 9570 getJSON: function (url, data, callback) { 9571 return jQuery.get(url, data, callback, "json"); 9572 }, 9573 9574 getScript: function (url, callback) { 9575 return jQuery.get(url, undefined, callback, "script"); 9576 } 9577 }); 9578 9579 jQuery.each(["get", "post"], function (i, method) { 9580 jQuery[method] = function (url, data, callback, type) { 9581 9582 // shift arguments if data argument was omitted 9583 if (jQuery.isFunction(data)) { 9584 type = type || callback; 9585 callback = data; 9586 data = undefined; 9587 } 9588 9589 // The url can be an options object (which then must have .url) 9590 return jQuery.ajax(jQuery.extend({ 9591 url: url, 9592 type: method, 9593 dataType: type, 9594 data: data, 9595 success: callback 9596 }, jQuery.isPlainObject(url) && url)); 9597 }; 9598 }); 9599 9600 jQuery._evalUrl = function (url) { 9601 return jQuery.ajax({ 9602 url: url, 9603 9604 // Make this explicit, since user can override this through ajaxSetup (#11264) 9605 type: "GET", 9606 dataType: "script", 9607 cache: true, 9608 async: false, 9609 global: false, 9610 "throws": true 9611 }); 9612 }; 9613 9614 jQuery.fn.extend({ 9615 wrapAll: function (html) { 9616 if (jQuery.isFunction(html)) { 9617 return this.each(function (i) { 9618 jQuery(this).wrapAll(html.call(this, i)); 9619 }); 9620 } 9621 9622 if (this[0]) { 9623 9624 // The elements to wrap the target around 9625 var wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true); 9626 9627 if (this[0].parentNode) { 9628 wrap.insertBefore(this[0]); 9629 } 9630 9631 wrap.map(function () { 9632 var elem = this; 9633 9634 while (elem.firstChild && elem.firstChild.nodeType === 1) { 9635 elem = elem.firstChild; 9636 } 9637 9638 return elem; 9639 }).append(this); 9640 } 9641 9642 return this; 9643 }, 9644 9645 wrapInner: function (html) { 9646 if (jQuery.isFunction(html)) { 9647 return this.each(function (i) { 9648 jQuery(this).wrapInner(html.call(this, i)); 9649 }); 9650 } 9651 9652 return this.each(function () { 9653 var self = jQuery(this), 9654 contents = self.contents(); 9655 9656 if (contents.length) { 9657 contents.wrapAll(html); 9658 } else { 9659 self.append(html); 9660 } 9661 }); 9662 }, 9663 9664 wrap: function (html) { 9665 var isFunction = jQuery.isFunction(html); 9666 9667 return this.each(function (i) { 9668 jQuery(this).wrapAll(isFunction ? html.call(this, i) : html); 9669 }); 9670 }, 9671 9672 unwrap: function () { 9673 return this.parent().each(function () { 9674 if (!jQuery.nodeName(this, "body")) { 9675 jQuery(this).replaceWith(this.childNodes); 9676 } 9677 }).end(); 9678 } 9679 }); 9680 9681 function getDisplay(elem) { 9682 return elem.style && elem.style.display || jQuery.css(elem, "dis
9682play"); 9683 } 9684 9685 function filterHidden(elem) { 9686 9687 // Disconnected elements are considered hidden 9688 if (!jQuery.contains(elem.ownerDocument || document, elem)) { 9689 return true; 9690 } 9691 while (elem && elem.nodeType === 1) { 9692 if (getDisplay(elem) === "none" || elem.type === "hidden") { 9693 return true; 9694 } 9695 elem = elem.parentNode; 9696 } 9697 return false; 9698 } 9699 9700 jQuery.expr.filters.hidden = function (elem) { 9701 9702 // Support: Opera <= 12.12 9703 // Opera reports offsetWidths and offsetHeights less than zero on some elements 9704 return support.reliableHiddenOffsets() ? elem.offsetWidth <= 0 && elem.offsetHeight <= 0 && !elem.getClientRects().length : filterHidden(elem); 9705 }; 9706 9707 jQuery.expr.filters.visible = function (elem) { 9708 return !jQuery.expr.filters.hidden(elem); 9709 }; 9710 9711 var r20 = /%20/g, 9712 rbracket = /\[\]$/, 9713 rCRLF = /\r?\n/g, 9714 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 9715 rsubmittable = /^(?:input|select|textarea|keygen)/i; 9716 9717 function buildParams(prefix, obj, traditional, add) { 9718 var name; 9719 9720 if (jQuery.isArray(obj)) { 9721 9722 // Serialize array item. 9723 jQuery.each(obj, function (i, v) { 9724 if (traditional || rbracket.test(prefix)) { 9725 9726 // Treat each array item as a scalar. 9727 add(prefix, v); 9728 } else { 9729 9730 // Item is non-scalar (array or object), encode its numeric index. 9731 buildParams(prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]", v, traditional, add); 9732 } 9733 }); 9734 } else if (!traditional && jQuery.type(obj) === "object") { 9735 9736 // Serialize object item. 9737 for (name in obj) { 9738 buildParams(prefix + "[" + name + "]", obj[name], traditional, add); 9739 } 9740 } else { 9741 9742 // Serialize scalar item. 9743 add(prefix, obj); 9744 } 9745 } 9746 9747 // Serialize an array of form elements or a set of 9748 // key/values into a query string 9749 jQuery.param = function (a, traditional) { 9750 var prefix, 9751 s = [], 9752 add = function (key, value) { 9753 9754 // If value is a function, invoke it and return its value 9755 value = jQuery.isFunction(value) ? value() : value == null ? "" : value; 9756 s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value); 9757 }; 9758 9759 // Set traditional to true for jQuery <= 1.3.2 behavior. 9760 if (traditional === undefined) { 9761 traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; 9762 } 9763 9764 // If an array was passed in, assume that it is an array of form elements. 9765 if (jQuery.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) { 9766 9767 // Serialize the form elements 9768 jQuery.each(a, function () { 9769 add(this.name, this.value); 9770 }); 9771 } else { 9772 9773 // If traditional, encode the "old" way (the way 1.3.2 or older 9774 // did it), otherwise encode params recursively. 9775 for (prefix in a) { 9776 buildParams(prefix, a[prefix], traditional, add); 9777 } 9778 } 9779 9780 // Return the resulting serialization 9781 return s.join("&").replace(r20, "+"); 9782 }; 9783 9784 jQuery.fn.extend({ 9785 serialize: function () { 9786 return jQuery.param(this.serializeArray()); 9787 }, 9788 serializeArray: function () { 9789 return this.map(function () { 9790 9791 // Can add propHook for "elements" to filter or add form elements 9792 var elements = jQuery.prop(this, "elements"); 9793 return elements ? jQuery.makeArray(elements) : this; 9794 }).filter(function () { 9795 var type = this.type; 9796 9797 // Use .is(":disabled") so that fieldset[disabled] works 9798 return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type)); 9799 }).map(function (i, elem) { 9800 var val = jQuery(this).val(); 9801 9802 return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val) { 9803 return { name: elem.name, value: val.replace(rCRLF, "\r\n") }; 9804 }) : { name: elem.name, value: val.replace(rCRLF, "\r\n") }; 9805 }).get(); 9806 } 9807 }); 9808 9809 // Create the request object 9810 // (This is still attached to ajaxSettings for backward compatibility) 9811 jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ? 9812 9813 // Support: IE6-IE8 9814 function () { 9815 9816 // XHR cannot access local files, always use ActiveX for that case 9817 if (this.isLocal) { 9818 return createActiveXHR(); 9819 } 9820
9821 // Support: IE 9-11 9822 // IE seems to error on cross-domain PATCH requests when ActiveX XHR 9823 // is used. In IE 9+ always use the native XHR. 9824 // Note: this condition won't catch Edge as it doesn't define 9825 // document.documentMode but it also doesn't support ActiveX so it won't 9826 // reach this code. 9827 if (document.documentMode > 8) { 9828 return createStandardXHR(); 9829 } 9830 9831 // Support: IE<9 9832 // oldIE XHR does not support non-RFC2616 methods (#13240) 9833 // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx 9834 // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9 9835 // Although this check for six methods instead of eight 9836 // since IE also does not support "trace" and "connect" 9837 return (/^(get|post|head|put|delete|options)$/i.test(this.type) && createStandardXHR() || createActiveXHR() 9838 ); 9839 } : 9840 9841 // For all other browsers, use the standard XMLHttpRequest object 9842 createStandardXHR; 9843 9844 var xhrId = 0, 9845 xhrCallbacks = {}, 9846 xhrSupported = jQuery.ajaxSettings.xhr(); 9847 9848 // Support: IE<10 9849 // Open requests must be manually aborted on unload (#5280) 9850 // See https://support.microsoft.com/kb/2856746 for more info 9851 if (window.attachEvent) { 9852 window.attachEvent("onunload", function () { 9853 for (var key in xhrCallbacks) { 9854 xhrCallbacks[key](undefined, true); 9855 } 9856 }); 9857 } 9858 9859 // Determine support properties 9860 support.cors = !!xhrSupported && "withCredentials" in xhrSupported; 9861 xhrSupported = support.ajax = !!xhrSupported; 9862 9863 // Create transport if the browser can provide an xhr 9864 if (xhrSupported) { 9865 9866 jQuery.ajaxTransport(function (options) { 9867 9868 // Cross domain only allowed if supported through XMLHttpRequest 9869 if (!options.crossDomain || support.cors) { 9870 9871 var callback; 9872 9873 return { 9874 send: function (headers, complete) { 9875 var i, 9876 xhr = options.xhr(), 9877 id = ++xhrId; 9878 9879 // Open the socket 9880 xhr.open(options.type, options.url, options.async, options.username, options.password); 9881 9882 // Apply custom fields if provided 9883 if (options.xhrFields) { 9884 for (i in options.xhrFields) { 9885 xhr[i] = options.xhrFields[i]; 9886 } 9887 } 9888 9889 // Override mime type if needed 9890 if (options.mimeType && xhr.overrideMimeType) { 9891 xhr.overrideMimeType(options.mimeType); 9892 } 9893 9894 // X-Requested-With header 9895 // For cross-domain requests, seeing as conditions for a preflight are 9896 // akin to a jigsaw puzzle, we simply never set it to be sure. 9897 // (it can always be set on a per-request basis or even using ajaxSetup)
vendor: 8,552 bytes, lines 9898-10207
9898 // For same-domain requests, won't change header if already provided. 9899 if (!options.crossDomain && !headers["X-Requested-With"]) { 9900 headers["X-Requested-With"] = "XMLHttpRequest"; 9901 } 9902 9903 // Set headers 9904 for (i in headers) { 9905 9906 // Support: IE<9 9907 // IE's ActiveXObject throws a 'Type Mismatch' exception when setting 9908 // request header to a null-value. 9909 // 9910 // To keep consistent with other XHR implementations, cast the value 9911 // to string and ignore `undefined`. 9912 if (headers[i] !== undefined) { 9913 xhr.setRequestHeader(i, headers[i] + ""); 9914 } 9915 } 9916 9917 // Do send the request 9918 // This may raise an exception which is actually 9919 // handled in jQuery.ajax (so no try/catch here) 9920 xhr.send(options.hasContent && options.data || null); 9921 9922 // Listener 9923 callback = function (_, isAbort) { 9924 var status, statusText, responses; 9925 9926 // Was never called and is aborted or complete 9927 if (callback && (isAbort || xhr.readyState === 4)) { 9928 9929 // Clean up 9930 delete xhrCallbacks[id]; 9931 callback = undefined; 9932 xhr.onreadystatechange = jQuery.noop; 9933 9934 // Abort manually if needed 9935 if (isAbort) { 9936 if (xhr.readyState !== 4) { 9937 xhr.abort(); 9938 } 9939 } else { 9940 responses = {}; 9941 status = xhr.status; 9942 9943 // Support: IE<10 9944 // Accessing binary-data responseText throws an exception 9945 // (#11426) 9946 if (typeof xhr.responseText === "string") { 9947 responses.text = xhr.responseText; 9948 } 9949 9950 // Firefox throws an exception when accessing 9951 // statusText for faulty cross-domain requests 9952 try { 9953 statusText = xhr.statusText; 9954 } catch (e) { 9955 9956 // We normalize with Webkit giving an empty statusText 9957 statusText = ""; 9958 } 9959 9960 // Filter status for non standard behaviors 9961 9962 // If the request is local and we have data: assume a success 9963 // (success with no data won't get notified, that's the best we 9964 // can do given current implementations) 9965 if (!status && options.isLocal && !options.crossDomain) { 9966 status = responses.text ? 200 : 404; 9967 9968 // IE - #1450: sometimes returns 1223 when it should be 204 9969 } else if (status === 1223) { 9970 status = 204; 9971 } 9972 } 9973 } 9974 9975 // Call complete if needed 9976 if (responses) { 9977 complete(status, statusText, responses, xhr.getAllResponseHeaders()); 9978 } 9979 }; 9980 9981 // Do send the request 9982 // `xhr.send` may raise an exception, but it will be 9983 // handled in jQuery.ajax (so no try/catch here) 9984 if (!options.async) { 9985 9986 // If we're in sync mode we fire the callback 9987 callback(); 9988 } else if (xhr.readyState === 4) { 9989 9990 // (IE6 & IE7) if it's in cache and has been 9991 // retrieved directly we need to fire the callback 9992 window.setTimeout(callback); 9993 } else { 9994 9995 // Register the callback, but delay it in case `xhr.send` throws 9996 // Add to the list of active xhr callbacks 9997 xhr.onreadystatechange = xhrCallbacks[id] = callback; 9998 } 9999 }, 10000 10001 abort: function () { 10002 if (callback) { 10003 callback(undefined, true); 10004 } 10005 } 10006 }; 10007 } 10008 }); 10009 } 10010 10011 // Functions to create xhrs 10012 function createStandardXHR() { 10013 try { 10014 return new window.XMLHttpRequest(); 10015 } catch (e) {} 10016 } 10017 10018 function createActiveXHR() { 10019 try { 10020 return new window.ActiveXObject("Microsoft.XMLHTTP"); 10021 } catch (e) {} 10022 } 10023 10024 // Install script dataType 10025 jQuery.ajaxSetup({ 10026 accepts: { 10027 script: "text/javascript, application/javascript, " + "application/ecmascript, application/x-ecmascript" 10028 }, 10029 contents: { 10030 script: /\b(?:java|ecma)script\b/ 10031 }, 10032 converters: { 10033 "text script": function (text) { 10034 jQuery.globalEval(text); 10035 return text; 10036 } 10037 } 10038 }); 10039 10040 // Handle cache's special case and global 10041 jQuery.ajaxPrefilter("script", function (s) { 10042 if (s.cache === undefined) { 10043 s.cache = false; 10044 } 10045 if (s.crossDomain) { 10046 s.type = "GET"; 10047 s.global = false; 10048 } 10049 }); 10050 10051 // Bind script tag hack transport 10052 jQuery.ajaxTransport("script", function (s) { 10053 10054 // This transport only deals with cross domain requests 10055 if (s.crossDomain) { 10056 10057 var script, 10058 head = document.head || jQuery("head")[0] || document.documentElement; 10059 10060 return { 10061 10062 send: function (_, callback) { 10063 10064 script = document.createElement("script"); 10065 10066 script.async = true; 10067 10068 if (s.scriptCharset) { 10069 script.charset = s.scriptCharset; 10070 } 10071 10072 script.src = s.url; 10073 10074 // Attach handlers for all browsers 10075 script.onload = script.onreadystatechange = function (_, isAbort) { 10076 10077 if (isAbort || !script.readyState || /loaded|complete/.test(script.readyState)) { 10078 10079 // Handle memory leak in IE 10080 script.onload = script.onreadystatechange = null; 10081 10082 // Remove the script 10083 if (script.parentNode) { 10084 script.parentNode.removeChild(script); 10085 } 10086 10087 // Dereference the script 10088 script = null; 10089 10090 // Callback if not abort 10091 if (!isAbort) { 10092 callback(200, "success"); 10093 } 10094 } 10095 }; 10096 10097 // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending 10098 // Use native DOM manipulation to avoid our domManip AJAX trickery 10099 head.insertBefore(script, head.firstChild); 10100 }, 10101 10102 abort: function () { 10103 if (script) { 10104 script.onload(undefined, true); 10105 } 10106 } 10107 }; 10108 } 10109 }); 10110 10111 var oldCallbacks = [], 10112 rjsonp = /(=)\?(?=&|$)|\?\?/; 10113 10114 // Default jsonp settings 10115 jQuery.ajaxSetup({ 10116 jsonp: "callback", 10117 jsonpCallback: function () { 10118 var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce++; 10119 this[callback] = true; 10120 return callback; 10121 } 10122 }); 10123 10124 // Detect, normalize options and install callbacks for jsonp requests 10125 jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) { 10126 10127 var callbackName, 10128 overwritten, 10129 responseContainer, 10130 jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data"); 10131 10132 // Handle iff the expected data type is "jsonp" or we have a parameter to set 10133 if (jsonProp || s.dataTypes[0] === "jsonp") { 10134 10135 // Get callback name, remembering preexisting value associated with it 10136 callbackName = s.jsonpCallback = jQuery.isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback; 10137 10138 // Insert callback into url or form data 10139 if (jsonProp) { 10140 s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName); 10141 } else if (s.jsonp !== false) { 10142 s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName; 10143 } 10144 10145 // Use data converter to retrieve json after script execution 10146 s.converters["script json"] = function () { 10147 if (!responseContainer) { 10148 jQuery.error(callbackName + " was not called"); 10149 } 10150 return responseContainer[0]; 10151 }; 10152 10153 // force json dataType 10154 s.dataTypes[0] = "json"; 10155 10156 // Install callback 10157 overwritten = window[callbackName]; 10158 window[callbackName] = function () { 10159 responseContainer = arguments; 10160 }; 10161 10162 // Clean-up function (fires after converters) 10163 jqXHR.always(function () { 10164 10165 // If previous value didn't exist - remove it 10166 if (overwritten === undefined) { 10167 jQuery(window).removeProp(callbackName); 10168 10169 // Otherwise restore preexisting value 10170 } else { 10171 window[callbackName] = overwritten; 10172 } 10173 10174 // Save back as free 10175 if (s[callbackName]) { 10176 10177 // make sure that re-using the options doesn't screw things around 10178 s.jsonpCallback = originalSettings.jsonpCallback; 10179 10180 // save the callback name for future use 10181 oldCallbacks.push(callbackName); 10182 } 10183 10184 // Call if it was a function and we have a response 10185 if (responseContainer && jQuery.isFunction(overwritten)) { 10186 overwritten(responseContainer[0]); 10187 } 10188 10189 responseContainer = overwritten = undefined; 10190 }); 10191 10192 // Delegate to script 10193 return "script"; 10194 } 10195 }); 10196 10197 // data: string of html 10198 // context (optional): If specified, the fragment will be created in this context, 10199 // defaults to document 10200 // keepScripts (optional): If true, will include scripts passed in the html string 10201 jQuery.parseHTML = function (data, context, keepScripts) { 10202 if (!data || typeof data !== "string") { 10203 return null; 10204 } 10205 if (typeof context === "boolean") { 10206 keepScripts = context; 10207 context = false;
10208 } 10209 context = context || document; 10210 10211 var parsed = rsingleTag.exec(data), 10212 scripts = !keepScripts && []; 10213 10214 // Single tag 10215 if (parsed) { 10216 return [context.createElement(parsed[1])]; 10217 } 10218 10219 parsed = buildFragment([data], context, scripts); 10220 10221 if (scripts && scripts.length) { 10222 jQuery(scripts).remove(); 10223 } 10224 10225 return jQuery.merge([], parsed.childNodes); 10226 }; 10227 10228 // Keep a copy of the old load method 10229 var _load = jQuery.fn.load; 10230 10231 /** 10232 * Load a url into a page 10233 */ 10234 jQuery.fn.load = function (url, params, callback) { 10235 if (typeof url !== "string" && _load) { 10236 return _load.apply(this, arguments); 10237 } 10238 10239 var selector, 10240 type, 10241 response, 10242 self = this, 10243 off = url.indexOf(" "); 10244 10245 if (off > -1) { 10246 selector = jQuery.trim(url.slice(off, url.length)); 10247 url = url.slice(0, off); 10248 } 10249 10250 // If it's a function 10251 if (jQuery.isFunction(params)) { 10252 10253 // We assume that it's the callback 10254 callback = params; 10255 params = undefined; 10256 10257 // Otherwise, build a param string 10258 } else if (params && typeof params === "object") { 10259 type = "POST"; 10260 } 10261 10262 // If we have elements to modify, make the request 10263 if (self.length > 0) { 10264 jQuery.ajax({ 10265 url: url, 10266 10267 // If "type" variable is undefined, then "GET" method will be used. 10268 // Make value of this field explicit since 10269 // user can override it through ajaxSetup method 10270 type: type || "GET", 10271 dataType: "html", 10272 data: params 10273 }).done(function (responseText) { 10274 10275 // Save response for use in complete callback 10276 response = arguments; 10277 10278 self.html(selector ? 10279 10280 // If a selector was specified, locate the right elements in a dummy div 10281 // Exclude scripts to avoid IE 'Permission Denied' errors 10282 jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : 10283 10284 // Otherwise use the full result 10285 responseText); 10286 10287 // If the request succeeds, this function gets "data", "status", "jqXHR" 10288 // but they are ignored because response was set above. 10289 // If it fails, this function gets "jqXHR", "status", "error" 10290 }).always(callback && function (jqXHR, status) { 10291 self.each(function () { 10292 callback.apply(this, response || [jqXHR.responseText, status, jqXHR]); 10293 }); 10294 }); 10295 } 10296 10297 return this; 10298 }; 10299 10300 // Attach a bunch of functions for handling common AJAX events 10301 jQuery.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (i, type) { 10302 jQuery.fn[type] = function (fn) { 10303 return this.on(type, fn); 10304 }; 10305 }); 10306 10307 jQuery.expr.filters.animated = function (elem) { 10308 return jQuery.grep(jQuery.timers, function (fn) { 10309 return elem === fn.elem; 10310 }).length; 10311 }; 10312 10313 /** 10314 * Gets a window from an element 10315 */ 10316 function getWindow(elem) { 10317 return jQuery.isWindow(elem) ? elem : elem.nodeType === 9 ? elem.defaultView || elem.parentWindow : false; 10318 } 10319 10320 jQuery.offset = { 10321 setOffset: function (elem, options, i) { 10322 var curPosition, 10323 curLeft, 10324 curCSSTop, 10325 curTop, 10326 curOffset, 10327 curCSSLeft, 10328 calculatePosition, 10329 position = jQuery.css(elem, "position"), 10330 curElem = jQuery(elem), 10331 props = {}; 10332 10333 // set position first, in-case top/left are set even on static elem 10334 if (position === "static") { 10335 elem.style.position = "relative"; 10336 } 10337 10338 curOffset = curElem.offset(); 10339 curCSSTop = jQuery.css(elem, "top"); 10340 curCSSLeft = jQuery.css(elem, "left"); 10341 calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1; 10342 10343 // need to be able to calculate position if either top or left 10344 // is auto and position is either absolute or fixed 10345 if (calculatePosition) { 10346 curPosition = curElem.position(); 10347 curTop = curPosition.top; 10348 curLeft = curPosition.left; 10349 } else { 10350 curTop = parseFloat(curCSSTop) || 0; 10351 curLeft = parseFloat(curCSSLeft) || 0; 10352 } 10353 10354 if (jQuery.isFunction(options)) { 10355 10356 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 10357 options = options.call(elem, i, jQuery.extend({}, curOffset)); 10358 } 10359 10360 if (options.top != null) { 10361 props.top = options.top - curOffset.top + curTop; 10362 } 10363 if (options.left != null) { 10364 props.left = options.left - curOffset.left + curLeft; 10365 } 10366 10367 if ("using" in options) { 10368 options.using.call(elem, props); 10369 } else { 10370 curElem.css(props); 10371 } 10372 } 10373 }; 10374 10375 jQuery.fn.extend({ 10376 offset: function (options) { 10377 if (arguments.length) {
vendor: 7,971 bytes, lines 10378-10625
10378 return options === undefined ? this : this.each(function (i) { 10379 jQuery.offset.setOffset(this, options, i); 10380 }); 10381 } 10382 10383 var docElem, 10384 win, 10385 box = { top: 0, left: 0 }, 10386 elem = this[0], 10387 doc = elem && elem.ownerDocument; 10388 10389 if (!doc) { 10390 return; 10391 } 10392 10393 docElem = doc.documentElement; 10394 10395 // Make sure it's not a disconnected DOM node 10396 if (!jQuery.contains(docElem, elem)) { 10397 return box; 10398 } 10399 10400 // If we don't have gBCR, just use 0,0 rather than error 10401 // BlackBerry 5, iOS 3 (original iPhone) 10402 if (typeof elem.getBoundingClientRect !== "undefined") { 10403 box = elem.getBoundingClientRect(); 10404 } 10405 win = getWindow(doc); 10406 return { 10407 top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0), 10408 left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0) 10409 }; 10410 }, 10411 10412 position: function () { 10413 if (!this[0]) { 10414 return; 10415 } 10416 10417 var offsetParent, 10418 offset, 10419 parentOffset = { top: 0, left: 0 }, 10420 elem = this[0]; 10421 10422 // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, 10423 // because it is its only offset parent 10424 if (jQuery.css(elem, "position") === "fixed") { 10425 10426 // we assume that getBoundingClientRect is available when computed position is fixed 10427 offset = elem.getBoundingClientRect(); 10428 } else { 10429 10430 // Get *real* offsetParent 10431 offsetParent = this.offsetParent(); 10432 10433 // Get correct offsets 10434 offset = this.offset(); 10435 if (!jQuery.nodeName(offsetParent[0], "html")) { 10436 parentOffset = offsetParent.offset(); 10437 } 10438 10439 // Add offsetParent borders 10440 parentOffset.top += jQuery.css(offsetParent[0], "borderTopWidth", true); 10441 parentOffset.left += jQuery.css(offsetParent[0], "borderLeftWidth", true); 10442 } 10443 10444 // Subtract parent offsets and element margins 10445 // note: when an element has margin: auto the offsetLeft and marginLeft 10446 // are the same in Safari causing offset.left to incorrectly be 0 10447 return { 10448 top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true), 10449 left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true) 10450 }; 10451 }, 10452 10453 offsetParent: function () { 10454 return this.map(function () { 10455 var offsetParent = this.offsetParent; 10456 10457 while (offsetParent && !jQuery.nodeName(offsetParent, "html") && jQuery.css(offsetParent, "position") === "static") { 10458 offsetParent = offsetParent.offsetParent; 10459 } 10460 return offsetParent || documentElement; 10461 }); 10462 } 10463 }); 10464 10465 // Create scrollLeft and scrollTop methods 10466 jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function (method, prop) { 10467 var top = /Y/.test(prop); 10468 10469 jQuery.fn[method] = function (val) { 10470 return access(this, function (elem, method, val) { 10471 var win = getWindow(elem); 10472 10473 if (val === undefined) { 10474 return win ? prop in win ? win[prop] : win.document.documentElement[method] : elem[method]; 10475 } 10476 10477 if (win) { 10478 win.scrollTo(!top ? val : jQuery(win).scrollLeft(), top ? val : jQuery(win).scrollTop()); 10479 } else { 10480 elem[method] = val; 10481 } 10482 }, method, val, arguments.length, null); 10483 }; 10484 }); 10485 10486 // Support: Safari<7-8+, Chrome<37-44+ 10487 // Add the top/left cssHooks using jQuery.fn.position 10488 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 10489 // getComputedStyle returns percent when specified for top/left/bottom/right 10490 // rather than make the css module depend on the offset module, we just check for it here 10491 jQuery.each(["top", "left"], function (i, prop) { 10492 jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition, function (elem, computed) { 10493 if (computed) { 10494 computed = curCSS(elem, prop); 10495 10496 // if curCSS returns percentage, fallback to offset 10497 return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed; 10498 } 10499 }); 10500 }); 10501 10502 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 10503 jQuery.each({ Height: "height", Width: "width" }, function (name, type) { 10504 jQuery.each({ padding: "inner" + name, content: type, "": "outer" + name }, function (defaultExtra, funcName) { 10505 10506 // margin is only for outerHeight, outerWidth 10507 jQuery.fn[funcName] = function (margin, value) { 10508 var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"), 10509 extra = defaultExtra || (margin === true || value === true ? "margin" : "border"); 10510 10511 return access(this, function (elem, type, value) { 10512 var doc; 10513 10514 if (jQuery.isWindow(elem)) { 10515 10516 // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there 10517 // isn't a whole lot we can do. See pull request at this URL for discussion: 10518 // https://github.com/jquery/jquery/pull/764 10519 return elem.document.documentElement["client" + name]; 10520 } 10521 10522 // Get document width or height 10523 if (elem.nodeType === 9) { 10524 doc = elem.documentElement; 10525 10526 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 10527 // whichever is greatest 10528 // unfortunately, this causes bug #3838 in IE6/8 only, 10529 // but there is currently no good, small way to fix it. 10530 return Math.max(elem.body["scroll" + name], doc["scroll" + name], elem.body["offset" + name], doc["offset" + name], doc["client" + name]); 10531 } 10532 10533 return value === undefined ? 10534 10535 // Get width or height on the element, requesting but not forcing parseFloat 10536 jQuery.css(elem, type, extra) : 10537 10538 // Set width or height on the element 10539 jQuery.style(elem, type, value, extra); 10540 }, type, chainable ? margin : undefined, chainable, null); 10541 }; 10542 }); 10543 }); 10544 10545 jQuery.fn.extend({ 10546 10547 bind: function (types, data, fn) { 10548 return this.on(types, null, data, fn); 10549 }, 10550 unbind: function (types, fn) { 10551 return this.off(types, null, fn); 10552 }, 10553 10554 delegate: function (selector, types, data, fn) { 10555 return this.on(types, selector, data, fn); 10556 }, 10557 undelegate: function (selector, types, fn) { 10558 10559 // ( namespace ) or ( selector, types [, fn] ) 10560 return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn); 10561 } 10562 }); 10563 10564 // The number of elements contained in the matched element set 10565 jQuery.fn.size = function () { 10566 return this.length; 10567 }; 10568 10569 jQuery.fn.andSelf = jQuery.fn.addBack; 10570 10571 // Register as a named AMD module, since jQuery can be concatenated with other 10572 // files that may use define, but not via a proper concatenation script that 10573 // understands anonymous AMD modules. A named AMD is safest and most robust 10574 // way to register. Lowercase jquery is used because AMD module names are 10575 // derived from file names, and jQuery is normally delivered in a lowercase 10576 // file name. Do this after creating the global so that if an AMD module wants 10577 // to call noConflict to hide this version of jQuery, it will work. 10578 10579 // Note that for maximum portability, libraries that are not jQuery should 10580 // declare themselves as anonymous modules, and avoid setting a global if an 10581 // AMD loader is present. jQuery is a special case. For more information, see 10582 // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 10583 10584 if (true) { 10585 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () { 10586 return jQuery; 10587 }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), 10588 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 10589 } 10590 10591 var 10592 10593 // Map over jQuery in case of overwrite 10594 _jQuery = window.jQuery, 10595 10596 10597 // Map over the $ in case of overwrite 10598 _$ = window.$; 10599 10600 jQuery.noConflict = function (deep) { 10601 if (window.$ === jQuery) { 10602 window.$ = _$; 10603 } 10604 10605 if (deep && window.jQuery === jQuery) { 10606 window.jQuery = _jQuery; 10607 } 10608 10609 return jQuery; 10610 }; 10611 10612 // Expose jQuery and $ identifiers, even in 10613 // AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 10614 // and CommonJS for browser emulators (#13566) 10615 if (!noGlobal) { 10616 window.jQuery = window.$ = jQuery; 10617 } 10618 10619 return jQuery; 10620}); 10621 10622/***/ }), 10623/* 1 */, 10624/* 2 */, 10625/* 3 */
vendor: 10,907 bytes, lines 10626-11049
10626/***/ (function(module, exports) { 10627 10628/* 10629 MIT License http://www.opensource.org/licenses/mit-license.php 10630 Author Tobias Koppers @sokra 10631*/ 10632// css base code, injected by the css-loader 10633module.exports = function (useSourceMap) { 10634 var list = []; 10635 10636 // return the list of modules as css string 10637 list.toString = function toString() { 10638 return this.map(function (item) { 10639 var content = cssWithMappingToString(item, useSourceMap); 10640 if (item[2]) { 10641 return "@media " + item[2] + "{" + content + "}"; 10642 } else { 10643 return content; 10644 } 10645 }).join(""); 10646 }; 10647 10648 // import a list of modules into the list 10649 list.i = function (modules, mediaQuery) { 10650 if (typeof modules === "string") modules = [[null, modules, ""]]; 10651 var alreadyImportedModules = {}; 10652 for (var i = 0; i < this.length; i++) { 10653 var id = this[i][0]; 10654 if (typeof id === "number") alreadyImportedModules[id] = true; 10655 } 10656 for (i = 0; i < modules.length; i++) { 10657 var item = modules[i]; 10658 // skip already imported module 10659 // this implementation is not 100% perfect for weird media query combinations 10660 // when a module is imported multiple times with different media queries. 10661 // I hope this will never occur (Hey this way we have smaller bundles) 10662 if (typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) { 10663 if (mediaQuery && !item[2]) { 10664 item[2] = mediaQuery; 10665 } else if (mediaQuery) { 10666 item[2] = "(" + item[2] + ") and (" + mediaQuery + ")"; 10667 } 10668 list.push(item); 10669 } 10670 } 10671 }; 10672 return list; 10673}; 10674 10675function cssWithMappingToString(item, useSourceMap) { 10676 var content = item[1] || ''; 10677 var cssMapping = item[3]; 10678 if (!cssMapping) { 10679 return content; 10680 } 10681 10682 if (useSourceMap && typeof btoa === 'function') { 10683 var sourceMapping = toComment(cssMapping); 10684 var sourceURLs = cssMapping.sources.map(function (source) { 10685 return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'; 10686 }); 10687 10688 return [content].concat(sourceURLs).concat([sourceMapping]).join('\n'); 10689 } 10690 10691 return [content].join('\n'); 10692} 10693 10694// Adapted from convert-source-map (MIT) 10695function toComment(sourceMap) { 10696 // eslint-disable-next-line no-undef 10697 var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))); 10698 var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64; 10699 10700 return '/*# ' + data + ' */'; 10701} 10702 10703/***/ }), 10704/* 4 */ 10705/***/ (function(module, exports, __webpack_require__) { 10706 10707/* 10708 MIT License http://www.opensource.org/licenses/mit-license.php 10709 Author Tobias Koppers @sokra 10710*/ 10711 10712var stylesInDom = {}; 10713 10714var memoize = function (fn) { 10715 var memo; 10716 10717 return function () { 10718 if (typeof memo === "undefined") memo = fn.apply(this, arguments); 10719 return memo; 10720 }; 10721}; 10722 10723var isOldIE = memoize(function () { 10724 // Test for IE <= 9 as proposed by Browserhacks 10725 // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805 10726 // Tests for existence of standard globals is to allow style-loader 10727 // to operate correctly into non-standard environments 10728 // @see https://github.com/webpack-contrib/style-loader/issues/177 10729 return window && document && document.all && !window.atob; 10730}); 10731 10732var getElement = (function (fn) { 10733 var memo = {}; 10734 10735 return function(selector) { 10736 if (typeof memo[selector] === "undefined") { 10737 memo[selector] = fn.call(this, selector); 10738 } 10739 10740 return memo[selector] 10741 }; 10742})(function (target) { 10743 return document.querySelector(target) 10744}); 10745 10746var singleton = null; 10747var singletonCounter = 0; 10748var stylesInsertedAtTop = []; 10749 10750var fixUrls = __webpack_require__(11); 10751 10752module.exports = function(list, options) { 10753 if (typeof DEBUG !== "undefined" && DEBUG) { 10754 if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment"); 10755 } 10756 10757 options = options || {}; 10758 10759 options.attrs = typeof options.attrs === "object" ? options.attrs : {}; 10760 10761 // Force single-tag solution on IE6-9, which has a hard limit on the # of <style> 10762 // tags it will allow on a page 10763 if (!options.singleton) options.singleton = isOldIE(); 10764 10765 // By default, add <style> tags to the <head> element 10766 if (!options.insertInto) options.insertInto = "head"; 10767 10768 // By default, add <style> tags to the bottom of the target 10769 if (!options.insertAt) options.insertAt = "bottom"; 10770 10771 var styles = listToStyles(list, options); 10772 10773 addStylesToDom(styles, options); 10774 10775 return function update (newList) { 10776 var mayRemove = []; 10777 10778 for (var i = 0; i < styles.length; i++) { 10779 var item = styles[i]; 10780 var domStyle = stylesInDom[item.id]; 10781 10782 domStyle.refs--; 10783 mayRemove.push(domStyle); 10784 } 10785 10786 if(newList) { 10787 var newStyles = listToStyles(newList, options); 10788 addStylesToDom(newStyles, options); 10789 } 10790 10791 for (var i = 0; i < mayRemove.length; i++) { 10792 var domStyle = mayRemove[i]; 10793 10794 if(domStyle.refs === 0) { 10795 for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j](); 10796 10797 delete stylesInDom[domStyle.id]; 10798 } 10799 } 10800 }; 10801}; 10802 10803function addStylesToDom (styles, options) { 10804 for (var i = 0; i < styles.length; i++) { 10805 var item = styles[i]; 10806 var domStyle = stylesInDom[item.id]; 10807 10808 if(domStyle) { 10809 domStyle.refs++; 10810 10811 for(var j = 0; j < domStyle.parts.length; j++) { 10812 domStyle.parts[j](item.parts[j]); 10813 } 10814 10815 for(; j < item.parts.length; j++) { 10816 domStyle.parts.push(addStyle(item.parts[j], options)); 10817 } 10818 } else { 10819 var parts = []; 10820 10821 for(var j = 0; j < item.parts.length; j++) { 10822 parts.push(addStyle(item.parts[j], options)); 10823 } 10824 10825 stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts}; 10826 } 10827 } 10828} 10829 10830function listToStyles (list, options) { 10831 var styles = []; 10832 var newStyles = {}; 10833 10834 for (var i = 0; i < list.length; i++) { 10835 var item = list[i]; 10836 var id = options.base ? item[0] + options.base : item[0]; 10837 var css = item[1]; 10838 var media = item[2]; 10839 var sourceMap = item[3]; 10840 var part = {css: css, media: media, sourceMap: sourceMap}; 10841 10842 if(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]}); 10843 else newStyles[id].parts.push(part); 10844 } 10845 10846 return styles; 10847} 10848 10849function insertStyleElement (options, style) { 10850 var target = getElement(options.insertInto) 10851 10852 if (!target) { 10853 throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid."); 10854 } 10855 10856 var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1]; 10857 10858 if (options.insertAt === "top") { 10859 if (!lastStyleElementInsertedAtTop) { 10860 target.insertBefore(style, target.firstChild); 10861 } else if (lastStyleElementInsertedAtTop.nextSibling) { 10862 target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling); 10863 } else { 10864 target.appendChild(style); 10865 } 10866 stylesInsertedAtTop.push(style); 10867 } else if (options.insertAt === "bottom") { 10868 target.appendChild(style); 10869 } else { 10870 throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'."); 10871 } 10872} 10873 10874function removeStyleElement (style) { 10875 if (style.parentNode === null) return false; 10876 style.parentNode.removeChild(style); 10877 10878 var idx = stylesInsertedAtTop.indexOf(style); 10879 if(idx >= 0) { 10880 stylesInsertedAtTop.splice(idx, 1); 10881 } 10882} 10883 10884function createStyleElement (options) { 10885 var style = document.createElement("style"); 10886 10887 options.attrs.type = "text/css"; 10888 10889 addAttrs(style, options.attrs); 10890 insertStyleElement(options, style); 10891 10892 return style; 10893} 10894 10895function createLinkElement (options) { 10896 var link = document.createElement("link"); 10897 10898 options.attrs.type = "text/css"; 10899 options.attrs.rel = "stylesheet"; 10900 10901 addAttrs(link, options.attrs); 10902 insertStyleElement(options, link); 10903 10904 return link; 10905} 10906 10907function addAttrs (el, attrs) { 10908 Object.keys(attrs).forEach(function (key) { 10909 el.setAttribute(key, attrs[key]); 10910 }); 10911} 10912 10913function addStyle (obj, options) { 10914 var style, update, remove, result; 10915 10916 // If a transform function was defined, run it on the css 10917 if (options.transform && obj.css) { 10918 result = options.transform(obj.css); 10919 10920 if (result) { 10921 // If transform returns a value, use that instead of the original css. 10922 // This allows running runtime transformations on the css. 10923 obj.css = result; 10924 } else { 10925 // If the transform function returns a falsy value, don't add this css. 10926 // This allows conditional loading of css 10927 return function() { 10928 // noop 10929 }; 10930 } 10931 } 10932 10933 if (options.singleton) { 10934 var styleIndex = singletonCounter++; 10935 10936 style = singleton || (singleton = createStyleElement(options)); 10937 10938 update = applyToSingletonTag.bind(null, style, styleIndex, false); 10939 remove = applyToSingletonTag.bind(null, style, styleIndex, true); 10940 10941 } else if ( 10942 obj.sourceMap && 10943 typeof URL === "function" && 10944 typeof URL.createObjectURL === "function" && 10945 typeof URL.revokeObjectURL === "function" && 10946 typeof Blob === "function" && 10947 typeof btoa === "function" 10948 ) { 10949 style = createLinkElement(options); 10950 update = updateLink.bind(null, style, options); 10951 remove = function () { 10952 removeStyleElement(style); 10953 10954 if(style.href) URL.revokeObjectURL(style.href); 10955 }; 10956 } else { 10957 style = createStyleElement(options); 10958 update = applyToTag.bind(null, style); 10959 remove = function () { 10960 removeStyleElement(style); 10961 }; 10962 } 10963 10964 update(obj); 10965 10966 return function updateStyle (newObj) { 10967 if (newObj) { 10968 if ( 10969 newObj.css === obj.css && 10970 newObj.media === obj.media && 10971 newObj.sourceMap === obj.sourceMap 10972 ) { 10973 return; 10974 } 10975 10976 update(obj = newObj); 10977 } else { 10978 remove(); 10979 } 10980 }; 10981} 10982 10983var replaceText = (function () { 10984 var textStore = []; 10985 10986 return function (index, replacement) { 10987 textStore[index] = replacement; 10988 10989 return textStore.filter(Boolean).join('\n'); 10990 }; 10991})(); 10992 10993function applyToSingletonTag (style, index, remove, obj) { 10994 var css = remove ? "" : obj.css; 10995 10996 if (style.styleSheet) { 10997 style.styleSheet.cssText = replaceText(index, css); 10998 } else { 10999 var cssNode = document.createTextNode(css); 11000 var childNodes = style.childNodes; 11001 11002 if (childNodes[index]) style.removeChild(childNodes[index]); 11003 11004 if (childNodes.length) { 11005 style.insertBefore(cssNode, childNodes[index]); 11006 } else { 11007 style.appendChild(cssNode); 11008 } 11009 } 11010} 11011 11012function applyToTag (style, obj) { 11013 var css = obj.css; 11014 var media = obj.media; 11015 11016 if(media) { 11017 style.setAttribute("media", media) 11018 } 11019 11020 if(style.styleSheet) { 11021 style.styleSheet.cssText = css; 11022 } else { 11023 while(style.firstChild) { 11024 style.removeChild(style.firstChild); 11025 } 11026 11027 style.appendChild(document.createTextNode(css)); 11028 } 11029} 11030 11031function updateLink (link, options, obj) { 11032 var css = obj.css; 11033 var sourceMap = obj.sourceMap; 11034 11035 /* 11036 If convertToAbsoluteUrls isn't defined, but sourcemaps are enabled 11037 and there is no publicPath defined then lets turn convertToAbsoluteUrls 11038 on by default. Otherwise default to the convertToAbsoluteUrls option 11039 directly 11040 */ 11041 var autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap; 11042 11043 if (options.convertToAbsoluteUrls || autoFixUrls) { 11044 css = fixUrls(css); 11045 } 11046 11047 if (sourceMap) { 11048 // http://stackoverflow.com/a/26603875 11049 css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)
11049))) + " */"; 11050 } 11051 11052 var blob = new Blob([css], { type: "text/css" }); 11053 11054 var oldSrc = link.href; 11055 11056 link.href = URL.createObjectURL(blob); 11057 11058 if(oldSrc) URL.revokeObjectURL(oldSrc); 11059} 11060 11061 11062/***/ }), 11063/* 5 */, 11064/* 6 */, 11065/* 7 */, 11066/* 8 */, 11067/* 9 */, 11068/* 10 */, 11069/* 11 */ 11070/***/ (function(module, exports) { 11071 11072 11073/** 11074 * When source maps are enabled, `style-loader` uses a link element with a data-uri to 11075 * embed the css on the page. This breaks all relative urls because now they are relative to a 11076 * bundle instead of the current page. 11077 * 11078 * One solution is to only use full urls, but that may be impossible. 11079 * 11080 * Instead, this function "fixes" the relative urls to be absolute according to the current page location. 11081 * 11082 * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command. 11083 * 11084 */ 11085 11086module.exports = function (css) { 11087 // get current location 11088 var location = typeof window !== "undefined" && window.location; 11089 11090 if (!location) { 11091 throw new Error("fixUrls requires window.location"); 11092 } 11093 11094 // blank or null? 11095 if (!css || typeof css !== "string") { 11096 return css; 11097 } 11098 11099 var baseUrl = location.protocol + "//" + location.host; 11100 var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/"); 11101 11102 // convert each url(...) 11103 /* 11104 This regular expression is just a way to recursively match brackets within 11105 a string. 11106 /url\s*\( = Match on the word "url" with any whitespace after it and then a parens 11107 ( = Start a capturing group 11108 (?: = Start a non-capturing group 11109 [^)(] = Match anything that isn't a parentheses 11110 | = OR 11111 \( = Match a start parentheses 11112 (?: = Start another non-capturing groups 11113 [^)(]+ = Match anything that isn't a parentheses 11114 | = OR 11115 \( = Match a start parentheses 11116 [^)(]* = Match anything that isn't a parentheses 11117 \) = Match a end parentheses 11118 ) = End Group 11119 *\) = Match anything and then a close parens 11120 ) = Close non-capturing group 11121 * = Match anything 11122 ) = Close capturing group 11123 \) = Match a close parens 11124 /gi = Get all matches, not the first. Be case insensitive. 11125 */ 11126 var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function (fullMatch, origUrl) { 11127 // strip quotes (if they exist) 11128 var unquotedOrigUrl = origUrl.trim().replace(/^"(.*)"$/, function (o, $1) { 11129 return $1; 11130 }).replace(/^'(.*)'$/, function (o, $1) { 11131 return $1; 11132 }); 11133 11134 // already a full url? no change 11135 if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/)/i.test(unquotedOrigUrl)) { 11136 return fullMatch; 11137 } 11138 11139 // convert the url to a full url 11140 var newUrl; 11141 11142 if (unquotedOrigUrl.indexOf("//") === 0) { 11143 //TODO: should we add protocol? 11144 newUrl = unquotedOrigUrl; 11145 } else if (unquotedOrigUrl.indexOf("/") === 0) { 11146 // path should be relative to the base url 11147 newUrl = baseUrl + unquotedOrigUrl; // already starts with '/' 11148 } else { 11149 // path should be relative to current directory 11150 newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './' 11151 } 11152 11153 // send back the fixed url(...) 11154 return "url(" + JSON.stringify(newUrl) + ")"; 11155 }); 11156 11157 // send back the fixed css 11158 return fixedCss; 11159}; 11160 11161/***/ }), 11162/* 12 */, 11163/* 13 */, 11164/* 14 */, 11165/* 15 */, 11166/* 16 */, 11167/* 17 */, 11168/* 18 */, 11169/* 19 */, 11170/* 20 */, 11171/* 21 */, 11172/* 22 */, 11173/* 23 */, 11174/* 24 */, 11175/* 25 */, 11176/* 26 */, 11177/* 27 */ 11178/***/ (function(module, exports, __webpack_require__) { 11179 11180var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* 11181 _ _ _ _ 11182 ___| (_) ___| | __ (_)___ 11183/ __| | |/ __| |/ / | / __| 11184\__ \ | | (__| < _ | \__ \ 11185|___/_|_|\___|_|\_(_)/ |___/ 11186 |__/ 11187 11188 Version: 1.9.0 11189 Author: Ken Wheeler 11190 Website: http://kenwheeler.github.io 11191 Docs: http://kenwheeler.github.io/slick 11192 Repo: http://github.com/kenwheeler/slick 11193 Issues: http://github.com/kenwheeler/slick/issues 11194 11195 */ 11196/* global window, document, define, jQuery, setInterval, clearInterval */ 11197(function (factory) { 11198 11199 if (true) { 11200 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(0)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 11201 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 11202 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
11203 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 11204 } else if (typeof exports !== 'undefined') { 11205 module.exports = factory(require('jquery')); 11206 } else { 11207 factory(jQuery); 11208 } 11209})($ => { 11210 'use strict'; 11211 11212 var Slick = window.Slick || {}; 11213 11214 Slick = function () { 11215 let instanceUid = 0; 11216 11217 function Slick(element, settings) { 11218 let _ = this, 11219 dataSettings; 11220 11221 _.defaults = { 11222 accessibility: true, 11223 adaptiveHeight: false, 11224 appendArrows: $(element), 11225 appendDots: $(element), 11226 arrows: true, 11227 asNavFor: null, 11228 prevArrow: '<button class="slick-prev" aria-label="Previous" type="button">Previous</button>', 11229 nextArrow: '<button class="slick-next" aria-label="Next" type="button">Next</button>', 11230 autoplay: false, 11231 autoplaySpeed: 3000, 11232 centerMode: false, 11233 centerPadding: '50px', 11234 cssEase: 'ease', 11235 customPaging: function (slider, i) { 11236 return $('<button type="button" />').text(i + 1); 11237 }, 11238 dots: false, 11239 dotsClass: 'slick-dots', 11240 draggable: true, 11241 easing: 'linear', 11242 edgeFriction: 0.35, 11243 fade: false, 11244 focusOnSelect: false, 11245 focusOnChange: false, 11246 infinite: true, 11247 initialSlide: 0, 11248 lazyLoad: 'ondemand', 11249 mobileFirst: false, 11250 pauseOnHover: true, 11251 pauseOnFocus: true, 11252 pauseOnDotsHover: false, 11253 respondTo: 'window', 11254 responsive: null, 11255 rows: 1, 11256 rtl: false, 11257 slide: '', 11258 slidesPerRow: 1, 11259 slidesToShow: 1, 11260 slidesToScroll: 1, 11261 speed: 500, 11262 swipe: true, 11263 swipeToSlide: false, 11264 touchMove: true, 11265 touchThreshold: 5, 11266 useCSS: true, 11267 useTransform: true, 11268 variableWidth: false, 11269 vertical: false, 11270 verticalSwiping: false, 11271 waitForAnimate: true, 11272 zIndex: 1000 11273 }; 11274 11275 _.initials = { 11276 animating: false, 11277 dragging: false, 11278 autoPlayTimer: null, 11279 currentDirection: 0, 11280 currentLeft: null, 11281 currentSlide: 0, 11282 direction: 1, 11283 $dots: null, 11284 listWidth: null, 11285 listHeight: null, 11286 loadIndex: 0, 11287 $nextArrow: null, 11288 $prevArrow: null, 11289 scrolling: false, 11290 slideCount: null, 11291 slideWidth: null, 11292 $slideTrack: null, 11293 $slides: null, 11294 sliding: false, 11295 slideOffset: 0, 11296 swipeLeft: null, 11297 swiping: false, 11298 $list: null, 11299 touchObject: {}, 11300 transformsEnabled: false, 11301 unslicked: false 11302 }; 11303 11304 $.extend(_, _.initials); 11305 11306 _.activeBreakpoint = null; 11307 _.animType = null; 11308 _.animProp = null; 11309 _.breakpoints = []; 11310 _.breakpointSettings = []; 11311 _.cssTransitions = false; 11312 _.focussed = false; 11313 _.interrupted = false; 11314 _.hidden = 'hidden'; 11315 _.paused = true; 11316 _.positionProp = null; 11317 _.respondTo = null; 11318 _.rowCount = 1; 11319 _.shouldClick = true; 11320 _.$slider = $(element); 11321 _.$slidesCache = null; 11322 _.transformType = null; 11323 _.transitionType = null; 11324 _.visibilityChange = 'visibilitychange'; 11325 _.windowWidth = 0; 11326 _.windowTimer = null; 11327 11328 dataSettings = $(element).data('slick') || {}; 11329 11330 _.options = $.extend({}, _.defaults, settings, dataSettings); 11331 11332 _.currentSlide = _.options.initialSlide; 11333 11334 _.originalSettings = _.options; 11335 11336 if (typeof document.mozHidden !== 'undefined') { 11337 _.hidden = 'mozHidden'; 11338 _.visibilityChange = 'mozvisibilitychange'; 11339 } else if (typeof document.webkitHidden !== 'undefined') { 11340 _.hidden = 'webkitHidden'; 11341 _.visibilityChange = 'webkitvisibilitychange'; 11342 } 11343 11344 _.autoPlay = $.proxy(_.autoPlay, _); 11345 _.autoPlayClear = $.proxy(_.autoPlayClear, _); 11346 _.autoPlayIterator = $.proxy(_.autoPlayIterator, _); 11347 _.changeSlide = $.proxy(_.changeSlide, _); 11348 _.clickHandler = $.proxy(_.clickHandler, _); 11349 _.selectHandler = $.proxy(_.selectHandler, _); 11350 _.setPosition = $.proxy(_.setPosition, _); 11351 _.swipeHandler = $.proxy(_.swipeHandler, _); 11352 _.dragHandler = $.proxy(_.dragHandler, _); 11353 _.keyHandler = $.proxy(_.keyHandler, _); 11354 11355 _.instanceUid = instanceUid++; 11356 11357 // A simple way to check for HTML strings 11358 // Strict HTML recognition (must start with <) 11359 // Extracted from jQuery v1.11 source 11360 _.htmlExpr = /^(?:\s*(<[\w\W]+>)[^>]*)$/; 11361 11362 _.registerBreakpoints(); 11363 _.init(true); 11364 } 11365 11366 return Slick; 11367 }(); 11368 11369 Slick.prototype.activateADA = function () { 11370 var _ = this; 11371 11372 _.$slideTrack.find('.slick-active').attr({ 11373 'aria-hidden': 'false' 11374 }).find('a, input, button, select').attr({ 11375 'tabindex': '0' 11376 }); 11377 }; 11378 11379 Slick.prototype.addSlide = Slick.prototype.slickAdd = function (markup, index, addBefore) { 11380 let _ = this; 11381 11382 if (typeof index === 'boolean') { 11383 addBefore = index; 11384 index = null; 11385 } else if (index < 0 || index >= _.slideCount) { 11386 return false;
vendor: 7,284 bytes, lines 11387-11649
11387 } 11388 11389 _.unload(); 11390 11391 if (typeof index === 'number') { 11392 if (index === 0 && _.$slides.length === 0) { 11393 $(markup).appendTo(_.$slideTrack); 11394 } else if (addBefore) { 11395 $(markup).insertBefore(_.$slides.eq(index)); 11396 } else { 11397 $(markup).insertAfter(_.$slides.eq(index)); 11398 } 11399 } else if (addBefore === true) { 11400 $(markup).prependTo(_.$slideTrack); 11401 } else { 11402 $(markup).appendTo(_.$slideTrack); 11403 } 11404 11405 _.$slides = _.$slideTrack.children(this.options.slide); 11406 11407 _.$slideTrack.children(this.options.slide).detach(); 11408 11409 _.$slideTrack.append(_.$slides); 11410 11411 _.$slides.each((index, element) => { 11412 $(element).attr('data-slick-index', index); 11413 }); 11414 11415 _.$slidesCache = _.$slides; 11416 11417 _.reinit(); 11418 }; 11419 11420 Slick.prototype.animateHeight = function () { 11421 var _ = this; 11422 if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) { 11423 var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true); 11424 _.$list.animate({ 11425 height: targetHeight 11426 }, _.options.speed); 11427 } 11428 }; 11429 11430 Slick.prototype.animateSlide = function (targetLeft, callback) { 11431 let animProps = {}, 11432 _ = this; 11433 11434 _.animateHeight(); 11435 11436 if (_.options.rtl === true && _.options.vertical === false) { 11437 targetLeft = -targetLeft; 11438 } 11439 if (_.transformsEnabled === false) { 11440 if (_.options.vertical === false) { 11441 _.$slideTrack.animate({ 11442 left: targetLeft 11443 }, _.options.speed, _.options.easing, callback); 11444 } else { 11445 _.$slideTrack.animate({ 11446 top: targetLeft 11447 }, _.options.speed, _.options.easing, callback); 11448 } 11449 } else if (_.cssTransitions === false) { 11450 if (_.options.rtl === true) { 11451 _.currentLeft = -_.currentLeft; 11452 } 11453 $({ 11454 animStart: _.currentLeft 11455 }).animate({ 11456 animStart: targetLeft 11457 }, { 11458 duration: _.options.speed, 11459 easing: _.options.easing, 11460 step: function (now) { 11461 now = Math.ceil(now); 11462 if (_.options.vertical === false) { 11463 animProps[_.animType] = 'translate(' + now + 'px, 0px)'; 11464 _.$slideTrack.css(animProps); 11465 } else { 11466 animProps[_.animType] = 'translate(0px,' + now + 'px)'; 11467 _.$slideTrack.css(animProps); 11468 } 11469 }, 11470 complete: function () { 11471 if (callback) { 11472 callback.call(); 11473 } 11474 } 11475 }); 11476 } else { 11477 11478 _.applyTransition(); 11479 targetLeft = Math.ceil(targetLeft); 11480 11481 if (_.options.vertical === false) { 11482 animProps[_.animType] = 'translate3d(' + targetLeft + 'px, 0px, 0px)'; 11483 } else { 11484 animProps[_.animType] = 'translate3d(0px,' + targetLeft + 'px, 0px)'; 11485 } 11486 _.$slideTrack.css(animProps); 11487 11488 if (callback) { 11489 setTimeout(function () { 11490 11491 _.disableTransition(); 11492 11493 callback.call(); 11494 }, _.options.speed); 11495 } 11496 } 11497 }; 11498 11499 Slick.prototype.getNavTarget = function () { 11500 let _ = this, 11501 asNavFor = _.options.asNavFor; 11502 11503 if (asNavFor && asNavFor !== null) { 11504 asNavFor = $(asNavFor).not(_.$slider); 11505 } 11506 11507 return asNavFor; 11508 }; 11509 11510 Slick.prototype.asNavFor = function (index) { 11511 let _ = this, 11512 asNavFor = _.getNavTarget(); 11513 11514 if (asNavFor !== null && typeof asNavFor === 'object') { 11515 asNavFor.each(function () { 11516 var target = $(this).slick('getSlick'); 11517 if (!target.unslicked) { 11518 target.slideHandler(index, true); 11519 } 11520 }); 11521 } 11522 }; 11523 11524 Slick.prototype.applyTransition = function (slide) { 11525 let _ = this, 11526 transition = {}; 11527 11528 if (_.options.fade === false) { 11529 transition[_.transitionType] = `${_.transformType} ${_.options.speed}ms ${_.options.cssEase}`; 11530 } else { 11531 transition[_.transitionType] = `opacity ${_.options.speed}ms ${_.options.cssEase}`; 11532 } 11533 11534 if (_.options.fade === false) { 11535 _.$slideTrack.css(transition); 11536 } else { 11537 _.$slides.eq(slide).css(transition); 11538 } 11539 }; 11540 11541 Slick.prototype.autoPlay = function () { 11542 let _ = this; 11543 11544 _.autoPlayClear(); 11545 11546 if (_.slideCount > _.options.slidesToShow) { 11547 _.autoPlayTimer = setInterval(_.autoPlayIterator, _.options.autoplaySpeed); 11548 } 11549 }; 11550 11551 Slick.prototype.autoPlayClear = function () { 11552 let _ = this; 11553 11554 if (_.autoPlayTimer) { 11555 clearInterval(_.autoPlayTimer); 11556 } 11557 }; 11558 11559 Slick.prototype.autoPlayIterator = function () { 11560 let _ = this, 11561 slideTo = _.currentSlide + _.options.slidesToScroll; 11562 11563 if (!_.paused && !_.interrupted && !_.focussed) { 11564 if (_.options.infinite === false) { 11565 if (_.direction === 1 && _.currentSlide + 1 === _.slideCount - 1) { 11566 _.direction = 0; 11567 } else if (_.direction === 0) { 11568 slideTo = _.currentSlide - _.options.slidesToScroll; 11569 11570 if (_.currentSlide - 1 === 0) { 11571 _.direction = 1; 11572 } 11573 } 11574 } 11575 11576 _.slideHandler(slideTo); 11577 } 11578 }; 11579 11580 Slick.prototype.buildArrows = function () { 11581 let _ = this; 11582 11583 if (_.options.arrows === true) { 11584 _.$prevArrow = $(_.options.prevArrow).addClass('slick-arrow'); 11585 _.$nextArrow = $(_.options.nextArrow).addClass('slick-arrow'); 11586 11587 if (_.slideCount > _.options.slidesToShow) { 11588 _.$prevArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex'); 11589 _.$nextArrow.removeClass('slick-hidden').removeAttr('aria-hidden tabindex'); 11590 11591 if (_.htmlExpr.test(_.options.prevArrow)) { 11592 _.$prevArrow.prependTo(_.options.appendArrows); 11593 } 11594 11595 if (_.htmlExpr.test(_.options.nextArrow)) { 11596 _.$nextArrow.appendTo(_.options.appendArrows); 11597 } 11598 11599 if (_.options.infinite !== true) { 11600 _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true'); 11601 } 11602 } else { 11603 _.$prevArrow.add(_.$nextArrow).addClass('slick-hidden').attr({ 11604 'aria-disabled': 'true', 11605 'tabindex': '-1' 11606 }); 11607 } 11608 } 11609 }; 11610 11611 Slick.prototype.buildDots = function () { 11612 let _ = this, 11613 i, 11614 dot; 11615 11616 if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { 11617 _.$slider.addClass('slick-dotted'); 11618 11619 dot = $('<ul />').addClass(_.options.dotsClass); 11620 11621 for (i = 0; i <= _.getDotCount(); i += 1) { 11622 dot.append($('<li />').append(_.options.customPaging.call(this, _, i))); 11623 } 11624 11625 _.$dots = dot.appendTo(_.options.appendDots); 11626 11627 _.$dots.find('li').first().addClass('slick-active'); 11628 } 11629 }; 11630 11631 Slick.prototype.buildOut = function () { 11632 let _ = this; 11633 11634 _.$slides = _.$slider.children(_.options.slide + ':not(.slick-cloned)').addClass('slick-slide'); 11635 11636 _.slideCount = _.$slides.length; 11637 11638 _.$slides.each((index, element) => { 11639 $(element).attr('data-slick-index', index).data('originalStyling', $(element).attr('style') || ''); 11640 }); 11641 11642 _.$slider.addClass('slick-slider'); 11643 11644 _.$slideTrack = _.slideCount === 0 ? $('<div class="slick-track"/>').appendTo(_.$slider) : _.$slides.wrapAll('<div class="slick-track"/>').parent(); 11645 11646 _.$list = _.$slideTrack.wrap('<div class="slick-list"/>').parent(); 11647 _.$slideTrack.css('opacity', 0); 11648 11649 if (_.options.centerMode === true || _.options.swipeToSlide === true) {
11650 _.options.slidesToScroll = 1; 11651 } 11652 11653 $('img[data-lazy]', _.$slider).not('[src]').addClass('slick-loading'); 11654 11655 _.setupInfinite(); 11656 11657 _.buildArrows(); 11658 11659 _.buildDots(); 11660 11661 _.updateDots(); 11662 11663 _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0); 11664 11665 if (_.options.draggable === true) { 11666 _.$list.addClass('draggable'); 11667 } 11668 }; 11669 11670 Slick.prototype.buildRows = function () { 11671 let _ = this, 11672 a, 11673 b, 11674 c, 11675 newSlides, 11676 numOfSlides, 11677 originalSlides, 11678 slidesPerSection; 11679 11680 newSlides = document.createDocumentFragment(); 11681 originalSlides = _.$slider.children(); 11682 11683 if (_.options.rows > 0) { 11684 slidesPerSection = _.options.slidesPerRow * _.options.rows; 11685 numOfSlides = Math.ceil(originalSlides.length / slidesPerSection); 11686 11687 for (a = 0; a < numOfSlides; a++) { 11688 var slide = document.createElement('div'); 11689 for (b = 0; b < _.options.rows; b++) { 11690 var row = document.createElement('div'); 11691 for (c = 0; c < _.options.slidesPerRow; c++) { 11692 var target = a * slidesPerSection + (b * _.options.slidesPerRow + c); 11693 if (originalSlides.get(target)) { 11694 row.appendChild(originalSlides.get(target)); 11695 } 11696 } 11697 slide.appendChild(row); 11698 } 11699 newSlides.appendChild(slide); 11700 } 11701 11702 _.$slider.empty().append(newSlides); 11703 _.$slider.children().children().children().css({ 11704 'width': 100 / _.options.slidesPerRow + '%', 11705 'display': 'inline-block' 11706 }); 11707 } 11708 }; 11709 11710 Slick.prototype.checkResponsive = function (initial, forceUpdate) { 11711 let _ = this, 11712 breakpoint, 11713 targetBreakpoint, 11714 respondToWidth, 11715 triggerBreakpoint = false; 11716 var sliderWidth = _.$slider.width(); 11717 var windowWidth = window.innerWidth || $(window).width(); 11718 11719 if (_.respondTo === 'window') { 11720 respondToWidth = windowWidth; 11721 } else if (_.respondTo === 'slider') { 11722 respondToWidth = sliderWidth; 11723 } else if (_.respondTo === 'min') { 11724 respondToWidth = Math.min(windowWidth, sliderWidth); 11725 } 11726 11727 if (_.options.responsive && _.options.responsive.length && _.options.responsive !== null) { 11728 targetBreakpoint = null; 11729 11730 for (breakpoint in _.breakpoints) { 11731 if (_.breakpoints.hasOwnProperty(breakpoint)) { 11732 if (_.originalSettings.mobileFirst === false) { 11733 if (respondToWidth < _.breakpoints[breakpoint]) { 11734 targetBreakpoint = _.breakpoints[breakpoint]; 11735 } 11736 } else if (respondToWidth > _.breakpoints[breakpoint]) { 11737 targetBreakpoint = _.breakpoints[breakpoint]; 11738 } 11739 } 11740 } 11741 11742 if (targetBreakpoint !== null) { 11743 if (_.activeBreakpoint !== null) { 11744 if (targetBreakpoint !== _.activeBreakpoint || forceUpdate) { 11745 _.activeBreakpoint = targetBreakpoint; 11746 if (_.breakpointSettings[targetBreakpoint] === 'unslick') { 11747 _.unslick(targetBreakpoint); 11748 } else { 11749 _.options = $.extend({}, _.originalSettings, _.breakpointSettings[targetBreakpoint]); 11750 if (initial === true) { 11751 _.currentSlide = _.options.initialSlide; 11752 } 11753 _.refresh(initial); 11754 } 11755 triggerBreakpoint = targetBreakpoint; 11756 } 11757 } else { 11758 _.activeBreakpoint = targetBreakpoint; 11759 if (_.breakpointSettings[targetBreakpoint] === 'unslick') { 11760 _.unslick(targetBreakpoint); 11761 } else { 11762 _.options = $.extend({}, _.originalSettings, _.breakpointSettings[targetBreakpoint]); 11763 if (initial === true) { 11764 _.currentSlide = _.options.initialSlide; 11765 } 11766 _.refresh(initial); 11767 } 11768 triggerBreakpoint = targetBreakpoint; 11769 } 11770 } else if (_.activeBreakpoint !== null) { 11771 _.activeBreakpoint = null; 11772 _.options = _.originalSettings; 11773 if (initial === true) { 11774 _.currentSlide = _.options.initialSlide; 11775 } 11776 _.refresh(initial);
vendor: 7,622 bytes, lines 11777-12055
11777 triggerBreakpoint = targetBreakpoint; 11778 } 11779 11780 // only trigger breakpoints during an actual break. not on initialize. 11781 if (!initial && triggerBreakpoint !== false) { 11782 _.$slider.trigger('breakpoint', [_, triggerBreakpoint]); 11783 } 11784 } 11785 }; 11786 11787 Slick.prototype.changeSlide = function (event, dontAnimate) { 11788 11789 var _ = this, 11790 $target = $(event.currentTarget), 11791 indexOffset, 11792 slideOffset, 11793 unevenOffset; 11794 11795 // If target is a link, prevent default action. 11796 if ($target.is('a')) { 11797 event.preventDefault(); 11798 } 11799 11800 // If target is not the <li> element (ie: a child), find the <li>. 11801 if (!$target.is('li')) { 11802 $target = $target.closest('li'); 11803 } 11804 11805 unevenOffset = _.slideCount % _.options.slidesToScroll !== 0; 11806 indexOffset = unevenOffset ? 0 : (_.slideCount - _.currentSlide) % _.options.slidesToScroll; 11807 11808 switch (event.data.message) { 11809 11810 case 'previous': 11811 slideOffset = indexOffset === 0 ? _.options.slidesToScroll : _.options.slidesToShow - indexOffset; 11812 if (_.slideCount > _.options.slidesToShow) { 11813 _.slideHandler(_.currentSlide - slideOffset, false, dontAnimate); 11814 } 11815 break; 11816 11817 case 'next': 11818 slideOffset = indexOffset === 0 ? _.options.slidesToScroll : indexOffset; 11819 if (_.slideCount > _.options.slidesToShow) { 11820 _.slideHandler(_.currentSlide + slideOffset, false, dontAnimate); 11821 } 11822 break; 11823 11824 case 'index': 11825 var index = event.data.index === 0 ? 0 : event.data.index || $target.index() * _.options.slidesToScroll; 11826 11827 _.slideHandler(_.checkNavigable(index), false, dontAnimate); 11828 $target.children().trigger('focus'); 11829 break; 11830 11831 default: 11832 11833 } 11834 }; 11835 11836 Slick.prototype.checkNavigable = function (index) { 11837 let _ = this, 11838 navigables, 11839 prevNavigable; 11840 11841 navigables = _.getNavigableIndexes(); 11842 prevNavigable = 0; 11843 if (index > navigables[navigables.length - 1]) { 11844 index = navigables[navigables.length - 1]; 11845 } else { 11846 for (let n in navigables) { 11847 if (index < navigables[n]) { 11848 index = prevNavigable; 11849 break; 11850 } 11851 prevNavigable = navigables[n]; 11852 } 11853 } 11854 11855 return index; 11856 }; 11857 11858 Slick.prototype.cleanUpEvents = function () { 11859 let _ = this; 11860 11861 if (_.options.dots && _.$dots !== null) { 11862 $('li', _.$dots).off('click.slick', _.changeSlide).off('mouseenter.slick', $.proxy(_.interrupt, _, true)).off('mouseleave.slick', $.proxy(_.interrupt, _, false)); 11863 11864 if (_.options.accessibility === true) { 11865 _.$dots.off('keydown.slick', _.keyHandler); 11866 } 11867 } 11868 11869 _.$slider.off('focus.slick blur.slick'); 11870 11871 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { 11872 _.$prevArrow && _.$prevArrow.off('click.slick', _.changeSlide); 11873 _.$nextArrow && _.$nextArrow.off('click.slick', _.changeSlide); 11874 11875 if (_.options.accessibility === true) { 11876 _.$prevArrow && _.$prevArrow.off('keydown.slick', _.keyHandler); 11877 _.$nextArrow && _.$nextArrow.off('keydown.slick', _.keyHandler); 11878 } 11879 } 11880 11881 _.$list.off('touchstart.slick mousedown.slick', _.swipeHandler); 11882 _.$list.off('touchmove.slick mousemove.slick', _.swipeHandler); 11883 _.$list.off('touchend.slick mouseup.slick', _.swipeHandler); 11884 _.$list.off('touchcancel.slick mouseleave.slick', _.swipeHandler); 11885 11886 _.$list.off('click.slick', _.clickHandler); 11887 11888 $(document).off(_.visibilityChange, _.visibility); 11889 11890 _.cleanUpSlideEvents(); 11891 11892 if (_.options.accessibility === true) { 11893 _.$list.off('keydown.slick', _.keyHandler); 11894 } 11895 11896 if (_.options.focusOnSelect === true) { 11897 $(_.$slideTrack).children().off('click.slick', _.selectHandler); 11898 } 11899 11900 $(window).off(`orientationchange.slick.slick-${_.instanceUid}`, _.orientationChange); 11901 11902 $(window).off(`resize.slick.slick-${_.instanceUid}`, _.resize); 11903 11904 $('[draggable!=true]', _.$slideTrack).off('dragstart', _.preventDefault); 11905 11906 $(window).off(`load.slick.slick-${_.instanceUid}`, _.setPosition); 11907 }; 11908 11909 Slick.prototype.cleanUpSlideEvents = function () { 11910 let _ = this; 11911 11912 _.$list.off('mouseenter.slick', $.proxy(_.interrupt, _, true)); 11913 _.$list.off('mouseleave.slick', $.proxy(_.interrupt, _, false)); 11914 }; 11915 11916 Slick.prototype.cleanUpRows = function () { 11917 let _ = this, 11918 originalSlides; 11919 11920 if (_.options.rows > 0) { 11921 originalSlides = _.$slides.children().children(); 11922 originalSlides.removeAttr('style'); 11923 _.$slider.empty().append(originalSlides); 11924 } 11925 }; 11926 11927 Slick.prototype.clickHandler = function (event) { 11928 let _ = this; 11929 11930 if (_.shouldClick === false) { 11931 event.stopImmediatePropagation(); 11932 event.stopPropagation(); 11933 event.preventDefault(); 11934 } 11935 }; 11936 11937 Slick.prototype.destroy = function (refresh) { 11938 let _ = this; 11939 11940 _.autoPlayClear(); 11941 11942 _.touchObject = {}; 11943 11944 _.cleanUpEvents(); 11945 11946 $('.slick-cloned', _.$slider).detach(); 11947 11948 if (_.$dots) { 11949 _.$dots.remove(); 11950 } 11951 11952 if (_.$prevArrow && _.$prevArrow.length) { 11953 _.$prevArrow.removeClass('slick-disabled slick-arrow slick-hidden').removeAttr('aria-hidden aria-disabled tabindex').css('display', ''); 11954 11955 if (_.htmlExpr.test(_.options.prevArrow)) { 11956 _.$prevArrow.remove(); 11957 } 11958 } 11959 11960 if (_.$nextArrow && _.$nextArrow.length) { 11961 _.$nextArrow.removeClass('slick-disabled slick-arrow slick-hidden').removeAttr('aria-hidden aria-disabled tabindex').css('display', ''); 11962 11963 if (_.htmlExpr.test(_.options.nextArrow)) { 11964 _.$nextArrow.remove(); 11965 } 11966 } 11967 11968 if (_.$slides) { 11969 _.$slides.removeClass('slick-slide slick-active slick-center slick-visible slick-current').removeAttr('aria-hidden').removeAttr('data-slick-index').each(function () { 11970 $(this).attr('style', $(this).data('originalStyling')); 11971 }); 11972 11973 _.$slideTrack.children(this.options.slide).detach(); 11974 11975 _.$slideTrack.detach(); 11976 11977 _.$list.detach(); 11978 11979 _.$slider.append(_.$slides); 11980 } 11981 11982 _.cleanUpRows(); 11983 11984 _.$slider.removeClass('slick-slider'); 11985 _.$slider.removeClass('slick-initialized'); 11986 _.$slider.removeClass('slick-dotted'); 11987 11988 _.unslicked = true; 11989 11990 if (!refresh) { 11991 _.$slider.trigger('destroy', [_]); 11992 } 11993 }; 11994 11995 Slick.prototype.disableTransition = function (slide) { 11996 let _ = this, 11997 transition = {}; 11998 11999 transition[_.transitionType] = ''; 12000 12001 if (_.options.fade === false) { 12002 _.$slideTrack.css(transition); 12003 } else { 12004 _.$slides.eq(slide).css(transition); 12005 } 12006 }; 12007 12008 Slick.prototype.fadeSlide = function (slideIndex, callback) { 12009 let _ = this; 12010 12011 if (_.cssTransitions === false) { 12012 _.$slides.eq(slideIndex).css({ 12013 zIndex: _.options.zIndex 12014 }); 12015 12016 _.$slides.eq(slideIndex).animate({ 12017 opacity: 1 12018 }, _.options.speed, _.options.easing, callback); 12019 } else { 12020 _.applyTransition(slideIndex); 12021 12022 _.$slides.eq(slideIndex).css({ 12023 opacity: 1, 12024 zIndex: _.options.zIndex 12025 }); 12026 12027 if (callback) { 12028 setTimeout(() => { 12029 12030 _.disableTransition(slideIndex); 12031 12032 callback.call(); 12033 }, _.options.speed); 12034 } 12035 } 12036 }; 12037 12038 Slick.prototype.fadeSlideOut = function (slideIndex) { 12039 let _ = this; 12040 12041 if (_.cssTransitions === false) { 12042 _.$slides.eq(slideIndex).animate({ 12043 opacity: 0, 12044 zIndex: _.options.zIndex - 2 12045 }, _.options.speed, _.options.easing); 12046 } else { 12047 _.applyTransition(slideIndex); 12048 12049 _.$slides.eq(slideIndex).css({ 12050 opacity: 0, 12051 zIndex: _.options.zIndex - 2 12052 }); 12053 } 12054 }; 12055
12056 Slick.prototype.filterSlides = Slick.prototype.slickFilter = function (filter) { 12057 let _ = this; 12058 12059 if (filter !== null) { 12060 _.$slidesCache = _.$slides; 12061 12062 _.unload(); 12063 12064 _.$slideTrack.children(this.options.slide).detach(); 12065 12066 _.$slidesCache.filter(filter).appendTo(_.$slideTrack); 12067 12068 _.reinit(); 12069 } 12070 }; 12071 12072 Slick.prototype.focusHandler = function () { 12073 let _ = this; 12074 12075 // If any child element receives focus within the slider we need to pause the autoplay 12076 _.$slider.off('focus.slick blur.slick').on('focus.slick', '*', function (event) { 12077 var $sf = $(this); 12078 12079 setTimeout(() => { 12080 if (_.options.pauseOnFocus) { 12081 if ($sf.is(':focus')) { 12082 _.focussed = true; 12083 _.autoPlay(); 12084 } 12085 } 12086 }, 0); 12087 }).on('blur.slick', '*', function (event) { 12088 var $sf = $(this); 12089 12090 // When a blur occurs on any elements within the slider we become unfocused 12091 if (_.options.pauseOnFocus) { 12092 _.focussed = false; 12093 _.autoPlay(); 12094 } 12095 }); 12096 }; 12097 12098 Slick.prototype.getCurrent = Slick.prototype.slickCurrentSlide = function () { 12099 let _ = this; 12100 return _.currentSlide; 12101 }; 12102 12103 Slick.prototype.getDotCount = function () { 12104 let _ = this; 12105 12106 var breakPoint = 0; 12107 var counter = 0; 12108 var pagerQty = 0; 12109 12110 if (_.options.infinite === true) { 12111 if (_.slideCount <= _.options.slidesToShow) { 12112 ++pagerQty; 12113 } else { 12114 while (breakPoint < _.slideCount) { 12115 ++pagerQty; 12116 breakPoint = counter + _.options.slidesToScroll; 12117 counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; 12118 } 12119 } 12120 } else if (_.options.centerMode === true) { 12121 pagerQty = _.slideCount; 12122 } else if (!_.options.asNavFor) { 12123 pagerQty = 1 + Math.ceil((_.slideCount - _.options.slidesToShow) / _.options.slidesToScroll); 12124 } else { 12125 while (breakPoint < _.slideCount) { 12126 ++pagerQty; 12127 breakPoint = counter + _.options.slidesToScroll; 12128 counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; 12129 } 12130 } 12131 12132 return pagerQty - 1; 12133 }; 12134 12135 Slick.prototype.getLeft = function (slideIndex) { 12136 let _ = this, 12137 targetLeft, 12138 verticalHeight, 12139 verticalOffset = 0, 12140 targetSlide, 12141 coef; 12142 12143 _.slideOffset = 0; 12144 verticalHeight = _.$slides.first().outerHeight(true); 12145 12146 if (_.options.infinite === true) { 12147 if (_.slideCount > _.options.slidesToShow) { 12148 _.slideOffset = _.slideWidth * _.options.slidesToShow * -1; 12149 coef = -1; 12150 12151 if (_.options.vertical === true && _.options.centerMode === true) { 12152 if (_.options.slidesToShow === 2) { 12153 coef = -1.5; 12154 } else if (_.options.slidesToShow === 1) { 12155 coef = -2; 12156 } 12157 } 12158 verticalOffset = verticalHeight * _.options.slidesToShow * coef; 12159 } 12160 if (_.slideCount % _.options.slidesToScroll !== 0) { 12161 if (slideIndex + _.options.slidesToScroll > _.slideCount && _.slideCount > _.options.slidesToShow) { 12162 if (slideIndex > _.slideCount) {
12163 _.slideOffset = (_.options.slidesToShow - (slideIndex - _.slideCount)) * _.slideWidth * -1; 12164 verticalOffset = (_.options.slidesToShow - (slideIndex - _.slideCount)) * verticalHeight * -1; 12165 } else { 12166 _.slideOffset = _.slideCount % _.options.slidesToScroll * _.slideWidth * -1; 12167 verticalOffset = _.slideCount % _.options.slidesToScroll * verticalHeight * -1; 12168 } 12169 } 12170 } 12171 } else if (slideIndex + _.options.slidesToShow > _.slideCount) { 12172 _.slideOffset = (slideIndex + _.options.slidesToShow - _.slideCount) * _.slideWidth; 12173 verticalOffset = (slideIndex + _.options.slidesToShow - _.slideCount) * verticalHeight; 12174 } 12175 12176 if (_.slideCount <= _.options.slidesToShow) { 12177 _.slideOffset = 0; 12178 verticalOffset = 0; 12179 } 12180 12181 if (_.options.centerMode === true && _.slideCount <= _.options.slidesToShow) { 12182 _.slideOffset = _.slideWidth * Math.floor(_.options.slidesToShow) / 2 - _.slideWidth * _.slideCount / 2; 12183 } else if (_.options.centerMode === true && _.options.infinite === true) { 12184 _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2) - _.slideWidth; 12185 } else if (_.options.centerMode === true) { 12186 _.slideOffset = 0; 12187 _.slideOffset += _.slideWidth * Math.floor(_.options.slidesToShow / 2); 12188 } 12189 12190 if (_.options.vertical === false) { 12191 targetLeft = slideIndex * _.slideWidth * -1 + _.slideOffset; 12192 } else { 12193 targetLeft = slideIndex * verticalHeight * -1 + verticalOffset; 12194 } 12195 12196 if (_.options.variableWidth === true) {
12197 if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) { 12198 targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex); 12199 } else { 12200 targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow); 12201 } 12202 12203 if (_.options.rtl === true) { 12204 if (targetSlide[0]) { 12205 targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1; 12206 } else { 12207 targetLeft = 0; 12208 } 12209 } else { 12210 targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0; 12211 } 12212 12213 if (_.options.centerMode === true) { 12214 if (_.slideCount <= _.options.slidesToShow || _.options.infinite === false) { 12215 targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex); 12216 } else { 12217 targetSlide = _.$slideTrack.children('.slick-slide').eq(slideIndex + _.options.slidesToShow + 1); 12218 } 12219 12220 if (_.options.rtl === true) { 12221 if (targetSlide[0]) { 12222 targetLeft = (_.$slideTrack.width() - targetSlide[0].offsetLeft - targetSlide.width()) * -1; 12223 } else { 12224 targetLeft = 0; 12225 } 12226 } else { 12227 targetLeft = targetSlide[0] ? targetSlide[0].offsetLeft * -1 : 0; 12228 } 12229 12230 targetLeft += (_.$list.width() - targetSlide.outerWidth()) / 2; 12231 } 12232 } 12233 12234 return targetLeft; 12235 }; 12236 12237 Slick.prototype.getOption = Slick.prototype.slickGetOption = function (option) { 12238 let _ = this; 12239 12240 return _.options[option]; 12241 }; 12242 12243 Slick.prototype.getNavigableIndexes = function () { 12244 let _ = this, 12245 breakPoint = 0, 12246 counter = 0, 12247 indexes = [], 12248 max; 12249 12250 if (_.options.infinite === false) { 12251 max = _.slideCount; 12252 } else { 12253 breakPoint = _.options.slidesToScroll * -1; 12254 counter = _.options.slidesToScroll * -1; 12255 max = _.slideCount * 2; 12256 } 12257 12258 while (breakPoint < max) { 12259 indexes.push(breakPoint); 12260 breakPoint = counter + _.options.slidesToScroll; 12261 counter += _.options.slidesToScroll <= _.options.slidesToShow ? _.options.slidesToScroll : _.options.slidesToShow; 12262 } 12263 12264 return indexes; 12265 }; 12266 12267 Slick.prototype.getSlick = function () { 12268 return this; 12269 }; 12270 12271 Slick.prototype.getSlideCount = function () { 12272 12273 var _ = this, 12274 slidesTraversed, 12275 swipedSlide, 12276 swipeTarget, 12277 centerOffset; 12278 12279 centerOffset = _.options.centerMode === true ? Math.floor(_.$list.width() / 2) : 0; 12280 swipeTarget = _.swipeLeft * -1 + centerOffset; 12281 12282 if (_.options.swipeToSlide === true) { 12283 12284 _.$slideTrack.find('.slick-slide').each(function (index, slide) { 12285 12286 var slideOuterWidth, slideOffset, slideRightBoundary; 12287 slideOuterWidth = $(slide).outerWidth(); 12288 slideOffset = slide.offsetLeft; 12289 if (_.options.centerMode !== true) { 12290 slideOffset += slideOuterWidth / 2; 12291 } 12292 12293 slideRightBoundary = slideOffset + slideOuterWidth; 12294 12295 if (swipeTarget < slideRightBoundary) { 12296 swipedSlide = slide; 12297 return false; 12298 } 12299 }); 12300 12301 slidesTraversed = Math.abs($(swipedSlide).attr('data-slick-index') - _.currentSlide) || 1; 12302 12303 return slidesTraversed; 12304 } 12305 return _.options.slidesToScroll; 12306 }; 12307 12308 Slick.prototype.goTo = Slick.prototype.slickGoTo = function (slide, dontAnimate) { 12309 let _ = this; 12310 12311 _.changeSlide({ 12312 data: { 12313 message: 'index', 12314 index: parseInt(slide) 12315 } 12316 }, dontAnimate); 12317 }; 12318 12319 Slick.prototype.init = function (creation) { 12320 let _ = this; 12321 12322 if (!$(_.$slider).hasClass('slick-initialized')) { 12323 $(_.$slider).addClass('slick-initialized'); 12324 12325 _.buildRows(); 12326 _.buildOut(); 12327 _.setProps(); 12328 _.startLoad(); 12329 _.loadSlider(); 12330 _.initializeEvents(); 12331 _.updateArrows(); 12332 _.updateDots(); 12333 _.checkResponsive(true); 12334 _.focusHandler(); 12335 } 12336 12337 if (creation) { 12338 _.$slider.trigger('init', [_]); 12339 } 12340 12341 if (_.options.accessibility === true) { 12342 _.initADA(); 12343 } 12344 12345 if (_.options.autoplay) { 12346 _.paused = false;
12347 _.autoPlay(); 12348 } 12349 }; 12350 12351 Slick.prototype.initADA = function () { 12352 var _ = this, 12353 numDotGroups = Math.ceil(_.slideCount / _.options.slidesToShow), 12354 tabControlIndexes = _.getNavigableIndexes().filter(val => { 12355 return val >= 0 && val < _.slideCount; 12356 }); 12357 12358 _.$slides.add(_.$slideTrack.find('.slick-cloned')).attr({ 12359 'aria-hidden': 'true', 12360 'tabindex': '-1' 12361 }).find('a, input, button, select').attr({ 12362 'tabindex': '-1' 12363 }); 12364 12365 if (_.$dots !== null) { 12366 _.$slides.not(_.$slideTrack.find('.slick-cloned')).each(function (i) { 12367 var slideControlIndex = tabControlIndexes.indexOf(i); 12368 12369 $(this).attr({ 12370 'role': 'tabpanel', 12371 'id': `slick-slide${_.instanceUid}${i}`, 12372 'tabindex': -1 12373 }); 12374 12375 if (slideControlIndex !== -1) { 12376 var ariaButtonControl = `slick-slide-control${_.instanceUid}${slideControlIndex}`; 12377 if ($(`#${ariaButtonControl}`).length) { 12378 $(this).attr({ 12379 'aria-describedby': ariaButtonControl 12380 }); 12381 } 12382 } 12383 }); 12384 12385 _.$dots.attr('role', 'tablist').find('li').each(function (i) { 12386 var mappedSlideIndex = tabControlIndexes[i]; 12387 12388 $(this).attr({ 12389 'role': 'presentation' 12390 }); 12391 12392 $(this).find('button').first().attr({ 12393 'role': 'tab', 12394 'id': `slick-slide-control${_.instanceUid}${i}`, 12395 'aria-controls': `slick-slide${_.instanceUid}${mappedSlideIndex}`, 12396 'aria-label': `${i + 1} of ${numDotGroups}`, 12397 'aria-selected': null, 12398 'tabindex': '-1' 12399 }); 12400 }).eq(_.currentSlide).find('button').attr({ 12401 'aria-selected': 'true', 12402 'tabindex': '0' 12403 }).end(); 12404 } 12405 12406 for (let i = _.currentSlide, max = i + _.options.slidesToShow; i < max; i++) { 12407 if (_.options.focusOnChange) { 12408 _.$slides.eq(i).attr({ 'tabindex': '0' }); 12409 } else { 12410 _.$slides.eq(i).removeAttr('tabindex'); 12411 } 12412 } 12413 12414 _.activateADA(); 12415 }; 12416 12417 Slick.prototype.initArrowEvents = function () { 12418 let _ = this; 12419 12420 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { 12421 _.$prevArrow.off('click.slick').on('click.slick', { 12422 message: 'previous' 12423 }, _.changeSlide); 12424 _.$nextArrow.off('click.slick').on('click.slick', { 12425 message: 'next' 12426 }, _.changeSlide); 12427 12428 if (_.options.accessibility === true) { 12429 _.$prevArrow.on('keydown.slick', _.keyHandler); 12430 _.$nextArrow.on('keydown.slick', _.keyHandler); 12431 } 12432 } 12433 }; 12434 12435 Slick.prototype.initDotEvents = function () { 12436 let _ = this; 12437 12438 if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { 12439 $('li', _.$dots).on('click.slick', { 12440 message: 'index' 12441 }, _.changeSlide); 12442 12443 if (_.options.accessibility === true) { 12444 _.$dots.on('keydown.slick', _.keyHandler); 12445 } 12446 } 12447 12448 if (_.options.dots === true && _.options.pauseOnDotsHover === true && _.slideCount > _.options.slidesToShow) { 12449 $('li', _.$dots).on('mouseenter.slick', $.proxy(_.interrupt, _, true)).on('mouseleave.slick', $.proxy(_.interrupt, _, false)); 12450 } 12451 }; 12452 12453 Slick.prototype.initSlideEvents = function () { 12454 let _ = this; 12455 12456 if (_.options.pauseOnHover) { 12457 _.$list.on('mouseenter.slick', $.proxy(_.interrupt, _, true)); 12458 _.$list.on('mouseleave.slick', $.proxy(_.interrupt, _, false)); 12459 } 12460 }; 12461 12462 Slick.prototype.initializeEvents = function () { 12463 let _ = this; 12464 12465 _.initArrowEvents(); 12466 12467 _.initDotEvents(); 12468 _.initSlideEvents(); 12469 12470 _.$list.on('touchstart.slick mousedown.slick', { 12471 action: 'start' 12472 }, _.swipeHandler); 12473 _.$list.on('touchmove.slick mousemove.slick', { 12474 action: 'move' 12475 }, _.swipeHandler); 12476 _.$list.on('touchend.slick mouseup.slick', { 12477 action: 'end' 12478 }, _.swipeHandler);
vendor: 12,224 bytes, lines 12479-12928
12479 _.$list.on('touchcancel.slick mouseleave.slick', { 12480 action: 'end' 12481 }, _.swipeHandler); 12482 12483 _.$list.on('click.slick', _.clickHandler); 12484 12485 $(document).on(_.visibilityChange, $.proxy(_.visibility, _)); 12486 12487 if (_.options.accessibility === true) { 12488 _.$list.on('keydown.slick', _.keyHandler); 12489 } 12490 12491 if (_.options.focusOnSelect === true) { 12492 $(_.$slideTrack).children().on('click.slick', _.selectHandler); 12493 } 12494 12495 $(window).on(`orientationchange.slick.slick-${_.instanceUid}`, $.proxy(_.orientationChange, _)); 12496 12497 $(window).on(`resize.slick.slick-${_.instanceUid}`, $.proxy(_.resize, _)); 12498 12499 $('[draggable!=true]', _.$slideTrack).on('dragstart', _.preventDefault); 12500 12501 $(window).on(`load.slick.slick-${_.instanceUid}`, _.setPosition); 12502 $(_.setPosition); 12503 }; 12504 12505 Slick.prototype.initUI = function () { 12506 let _ = this; 12507 12508 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { 12509 _.$prevArrow.show(); 12510 _.$nextArrow.show(); 12511 } 12512 12513 if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { 12514 _.$dots.show(); 12515 } 12516 }; 12517 12518 Slick.prototype.keyHandler = function (event) { 12519 let _ = this; 12520 // Dont slide if the cursor is inside the form fields and arrow keys are pressed 12521 if (!event.target.tagName.match('TEXTAREA|INPUT|SELECT')) { 12522 if (event.keyCode === 37 && _.options.accessibility === true) { 12523 _.changeSlide({ 12524 data: { 12525 message: _.options.rtl === true ? 'next' : 'previous' 12526 } 12527 }); 12528 } else if (event.keyCode === 39 && _.options.accessibility === true) { 12529 _.changeSlide({ 12530 data: { 12531 message: _.options.rtl === true ? 'previous' : 'next' 12532 } 12533 }); 12534 } 12535 } 12536 }; 12537 12538 Slick.prototype.lazyLoad = function () { 12539 let _ = this, 12540 loadRange, 12541 cloneRange, 12542 rangeStart, 12543 rangeEnd; 12544 12545 function loadImages(imagesScope) { 12546 $('img[data-lazy]', imagesScope).each(function () { 12547 let image = $(this), 12548 imageSource = $(this).attr('data-lazy'), 12549 imageSrcSet = $(this).attr('data-srcset'), 12550 imageSizes = $(this).attr('data-sizes') || _.$slider.attr('data-sizes'), 12551 imageToLoad = document.createElement('img'); 12552 12553 imageToLoad.onload = function () { 12554 image.animate({ opacity: 0 }, 100, () => { 12555 12556 if (imageSrcSet) { 12557 image.attr('srcset', imageSrcSet); 12558 12559 if (imageSizes) { 12560 image.attr('sizes', imageSizes); 12561 } 12562 } 12563 12564 image.attr('src', imageSource).animate({ opacity: 1 }, 200, function () { 12565 image.removeAttr('data-lazy data-srcset data-sizes').removeClass('slick-loading'); 12566 }); 12567 _.$slider.trigger('lazyLoaded', [_, image, imageSource]); 12568 }); 12569 }; 12570 12571 imageToLoad.onerror = function () { 12572 image.removeAttr('data-lazy').removeClass('slick-loading').addClass('slick-lazyload-error'); 12573 12574 _.$slider.trigger('lazyLoadError', [_, image, imageSource]); 12575 }; 12576 12577 imageToLoad.src = imageSource; 12578 }); 12579 } 12580 12581 if (_.options.centerMode === true) { 12582 if (_.options.infinite === true) { 12583 rangeStart = _.currentSlide + (_.options.slidesToShow / 2 + 1); 12584 rangeEnd = rangeStart + _.options.slidesToShow + 2; 12585 } else { 12586 rangeStart = Math.max(0, _.currentSlide - (_.options.slidesToShow / 2 + 1)); 12587 rangeEnd = 2 + (_.options.slidesToShow / 2 + 1) + _.currentSlide; 12588 } 12589 } else { 12590 rangeStart = _.options.infinite ? _.options.slidesToShow + _.currentSlide : _.currentSlide; 12591 rangeEnd = Math.ceil(rangeStart + _.options.slidesToShow); 12592 if (_.options.fade === true) { 12593 if (rangeStart > 0) rangeStart--; 12594 if (rangeEnd <= _.slideCount) rangeEnd++; 12595 } 12596 } 12597 12598 loadRange = _.$slider.find('.slick-slide').slice(rangeStart, rangeEnd); 12599 12600 if (_.options.lazyLoad === 'anticipated') { 12601 var prevSlide = rangeStart - 1, 12602 nextSlide = rangeEnd, 12603 $slides = _.$slider.find('.slick-slide'); 12604 12605 for (let i = 0; i < _.options.slidesToScroll; i++) { 12606 if (prevSlide < 0) prevSlide = _.slideCount - 1; 12607 loadRange = loadRange.add($slides.eq(prevSlide)); 12608 loadRange = loadRange.add($slides.eq(nextSlide)); 12609 prevSlide--; 12610 nextSlide++; 12611 } 12612 } 12613 12614 loadImages(loadRange); 12615 12616 if (_.slideCount <= _.options.slidesToShow) { 12617 cloneRange = _.$slider.find('.slick-slide'); 12618 loadImages(cloneRange); 12619 } else if (_.currentSlide >= _.slideCount - _.options.slidesToShow) { 12620 cloneRange = _.$slider.find('.slick-cloned').slice(0, _.options.slidesToShow); 12621 loadImages(cloneRange); 12622 } else if (_.currentSlide === 0) { 12623 cloneRange = _.$slider.find('.slick-cloned').slice(_.options.slidesToShow * -1); 12624 loadImages(cloneRange); 12625 } 12626 }; 12627 12628 Slick.prototype.loadSlider = function () { 12629 let _ = this; 12630 12631 _.setPosition(); 12632 12633 _.$slideTrack.css({ 12634 opacity: 1 12635 }); 12636 12637 _.$slider.removeClass('slick-loading'); 12638 12639 _.initUI(); 12640 12641 if (_.options.lazyLoad === 'progressive') { 12642 _.progressiveLazyLoad(); 12643 } 12644 }; 12645 12646 Slick.prototype.next = Slick.prototype.slickNext = function () { 12647 let _ = this; 12648 12649 _.changeSlide({ 12650 data: { 12651 message: 'next' 12652 } 12653 }); 12654 }; 12655 12656 Slick.prototype.orientationChange = function () { 12657 let _ = this; 12658 12659 _.checkResponsive(); 12660 _.setPosition(); 12661 }; 12662 12663 Slick.prototype.pause = Slick.prototype.slickPause = function () { 12664 let _ = this; 12665 12666 _.autoPlayClear(); 12667 _.paused = true; 12668 }; 12669 12670 Slick.prototype.play = Slick.prototype.slickPlay = function () { 12671 let _ = this; 12672 12673 _.autoPlay(); 12674 _.options.autoplay = true; 12675 _.paused = false; 12676 _.focussed = false; 12677 _.interrupted = false; 12678 }; 12679 12680 Slick.prototype.postSlide = function (index) { 12681 let _ = this; 12682 12683 if (!_.unslicked) { 12684 _.$slider.trigger('afterChange', [_, index]); 12685 12686 _.animating = false; 12687 12688 if (_.slideCount > _.options.slidesToShow) { 12689 _.setPosition(); 12690 } 12691 12692 _.swipeLeft = null; 12693 12694 if (_.options.autoplay) { 12695 _.autoPlay(); 12696 } 12697 12698 if (_.options.accessibility === true) { 12699 _.initADA(); 12700 12701 if (_.options.focusOnChange) { 12702 var $currentSlide = $(_.$slides.get(_.currentSlide)); 12703 $currentSlide.attr('tabindex', 0).focus(); 12704 } 12705 } 12706 } 12707 }; 12708 12709 Slick.prototype.prev = Slick.prototype.slickPrev = function () { 12710 let _ = this; 12711 12712 _.changeSlide({ 12713 data: { 12714 message: 'previous' 12715 } 12716 }); 12717 }; 12718 12719 Slick.prototype.preventDefault = function (event) { 12720 event.preventDefault(); 12721 }; 12722 12723 Slick.prototype.progressiveLazyLoad = function (tryCount) { 12724 tryCount = tryCount || 1; 12725 12726 var _ = this, 12727 $imgsToLoad = $('img[data-lazy]', _.$slider), 12728 image, 12729 imageSource, 12730 imageSrcSet, 12731 imageSizes, 12732 imageToLoad; 12733 12734 if ($imgsToLoad.length) { 12735 image = $imgsToLoad.first(); 12736 imageSource = image.attr('data-lazy'); 12737 imageSrcSet = image.attr('data-srcset'); 12738 imageSizes = image.attr('data-sizes') || _.$slider.attr('data-sizes'); 12739 imageToLoad = document.createElement('img'); 12740 12741 imageToLoad.onload = function () { 12742 if (imageSrcSet) { 12743 image.attr('srcset', imageSrcSet); 12744 12745 if (imageSizes) { 12746 image.attr('sizes', imageSizes); 12747 } 12748 } 12749 12750 image.attr('src', imageSource).removeAttr('data-lazy data-srcset data-sizes').removeClass('slick-loading'); 12751 12752 if (_.options.adaptiveHeight === true) { 12753 _.setPosition(); 12754 } 12755 12756 _.$slider.trigger('lazyLoaded', [_, image, imageSource]); 12757 _.progressiveLazyLoad(); 12758 }; 12759 12760 imageToLoad.onerror = function () { 12761 if (tryCount < 3) { 12762 /** 12763 * try to load the image 3 times, 12764 * leave a slight delay so we don't get 12765 * servers blocking the request. 12766 */ 12767 setTimeout(function () { 12768 _.progressiveLazyLoad(tryCount + 1); 12769 }, 500); 12770 } else { 12771 image.removeAttr('data-lazy').removeClass('slick-loading').addClass('slick-lazyload-error'); 12772 12773 _.$slider.trigger('lazyLoadError', [_, image, imageSource]); 12774 12775 _.progressiveLazyLoad(); 12776 } 12777 }; 12778 12779 imageToLoad.src = imageSource; 12780 } else { 12781 _.$slider.trigger('allImagesLoaded', [_]); 12782 } 12783 }; 12784 12785 Slick.prototype.refresh = function (initializing) { 12786 let _ = this, 12787 currentSlide, 12788 lastVisibleIndex; 12789 12790 lastVisibleIndex = _.slideCount - _.options.slidesToShow; 12791 12792 // in non-infinite sliders, we don't want to go past the 12793 // last visible index. 12794 if (!_.options.infinite && _.currentSlide > lastVisibleIndex) { 12795 _.currentSlide = lastVisibleIndex; 12796 } 12797 12798 // if less slides than to show, go to start. 12799 if (_.slideCount <= _.options.slidesToShow) { 12800 _.currentSlide = 0; 12801 } 12802 12803 currentSlide = _.currentSlide; 12804 12805 _.destroy(true); 12806 12807 $.extend(_, _.initials, { currentSlide }); 12808 12809 _.init(); 12810 12811 if (!initializing) { 12812 _.changeSlide({ 12813 data: { 12814 message: 'index', 12815 index: currentSlide 12816 } 12817 }, false); 12818 } 12819 }; 12820 12821 Slick.prototype.registerBreakpoints = function () { 12822 let _ = this, 12823 breakpoint, 12824 currentBreakpoint, 12825 l, 12826 responsiveSettings = _.options.responsive || null; 12827 12828 if ($.type(responsiveSettings) === 'array' && responsiveSettings.length) { 12829 _.respondTo = _.options.respondTo || 'window'; 12830 12831 for (breakpoint in responsiveSettings) { 12832 l = _.breakpoints.length - 1; 12833 12834 if (responsiveSettings.hasOwnProperty(breakpoint)) { 12835 currentBreakpoint = responsiveSettings[breakpoint].breakpoint; 12836 12837 // loop through the breakpoints and cut out any existing 12838 // ones with the same breakpoint number, we don't want dupes. 12839 while (l >= 0) { 12840 if (_.breakpoints[l] && _.breakpoints[l] === currentBreakpoint) { 12841 _.breakpoints.splice(l, 1); 12842 } 12843 l--; 12844 } 12845 12846 _.breakpoints.push(currentBreakpoint); 12847 _.breakpointSettings[currentBreakpoint] = responsiveSettings[breakpoint].settings; 12848 } 12849 } 12850 12851 _.breakpoints.sort((a, b) => { 12852 return _.options.mobileFirst ? a - b : b - a; 12853 }); 12854 } 12855 }; 12856 12857 Slick.prototype.reinit = function () { 12858 let _ = this; 12859 12860 _.$slides = _.$slideTrack.children(_.options.slide).addClass('slick-slide'); 12861 12862 _.slideCount = _.$slides.length; 12863 12864 if (_.currentSlide >= _.slideCount && _.currentSlide !== 0) { 12865 _.currentSlide = _.currentSlide - _.options.slidesToScroll; 12866 } 12867 12868 if (_.slideCount <= _.options.slidesToShow) { 12869 _.currentSlide = 0; 12870 } 12871 12872 _.registerBreakpoints(); 12873 12874 _.setProps(); 12875 _.setupInfinite(); 12876 _.buildArrows(); 12877 _.updateArrows(); 12878 _.initArrowEvents(); 12879 _.buildDots(); 12880 _.updateDots(); 12881 _.initDotEvents(); 12882 _.cleanUpSlideEvents(); 12883 _.initSlideEvents(); 12884 12885 _.checkResponsive(false, true); 12886 12887 if (_.options.focusOnSelect === true) { 12888 $(_.$slideTrack).children().on('click.slick', _.selectHandler); 12889 } 12890 12891 _.setSlideClasses(typeof _.currentSlide === 'number' ? _.currentSlide : 0); 12892 12893 _.setPosition(); 12894 _.focusHandler(); 12895 12896 _.paused = !_.options.autoplay; 12897 _.autoPlay(); 12898 12899 _.$slider.trigger('reInit', [_]); 12900 }; 12901 12902 Slick.prototype.resize = function () { 12903 let _ = this; 12904 12905 if ($(window).width() !== _.windowWidth) { 12906 clearTimeout(_.windowDelay); 12907 _.windowDelay = window.setTimeout(() => { 12908 _.windowWidth = $(window).width(); 12909 _.checkResponsive(); 12910 if (!_.unslicked) { 12911 _.setPosition(); 12912 } 12913 }, 50); 12914 } 12915 }; 12916 12917 Slick.prototype.removeSlide = Slick.prototype.slickRemove = function (index, removeBefore, removeAll) { 12918 let _ = this; 12919 12920 if (typeof index === 'boolean') { 12921 removeBefore = index; 12922 index = removeBefore === true ? 0 : _.slideCount - 1; 12923 } else { 12924 index = removeBefore === true ? --index : index; 12925 } 12926 12927 if (_.slideCount < 1 || index < 0 || index > _.slideCount - 1) { 12928 return false;
12929 } 12930 12931 _.unload(); 12932 12933 if (removeAll === true) { 12934 _.$slideTrack.children().remove(); 12935 } else { 12936 _.$slideTrack.children(this.options.slide).eq(index).remove(); 12937 } 12938 12939 _.$slides = _.$slideTrack.children(this.options.slide); 12940 12941 _.$slideTrack.children(this.options.slide).detach(); 12942 12943 _.$slideTrack.append(_.$slides); 12944 12945 _.$slidesCache = _.$slides; 12946 12947 _.reinit(); 12948 }; 12949 12950 Slick.prototype.setCSS = function (position) { 12951 let _ = this, 12952 positionProps = {}, 12953 x, 12954 y; 12955 12956 if (_.options.rtl === true) { 12957 position = -position; 12958 } 12959 x = _.positionProp == 'left' ? `${Math.ceil(position)}px` : '0px'; 12960 y = _.positionProp == 'top' ? `${Math.ceil(position)}px` : '0px'; 12961 12962 positionProps[_.positionProp] = position; 12963 12964 if (_.transformsEnabled === false) { 12965 _.$slideTrack.css(positionProps); 12966 } else { 12967 positionProps = {}; 12968 if (_.cssTransitions === false) { 12969 positionProps[_.animType] = `translate(${x}, ${y})`; 12970 _.$slideTrack.css(positionProps); 12971 } else { 12972 positionProps[_.animType] = `translate3d(${x}, ${y}, 0px)`; 12973 _.$slideTrack.css(positionProps); 12974 } 12975 } 12976 }; 12977 12978 Slick.prototype.setDimensions = function () { 12979 let _ = this; 12980 12981 if (_.options.vertical === false) { 12982 if (_.options.centerMode === true) { 12983 _.$list.css({ 12984 padding: `0px ${_.options.centerPadding}` 12985 }); 12986 } 12987 } else { 12988 _.$list.height(_.$slides.first().outerHeight(true) * _.options.slidesToShow); 12989 if (_.options.centerMode === true) { 12990 _.$list.css({ 12991 padding: `${_.options.centerPadding} 0px` 12992 }); 12993 } 12994 } 12995 12996 _.listWidth = _.$list.width(); 12997 _.listHeight = _.$list.height(); 12998 12999 if (_.options.vertical === false && _.options.variableWidth === false) { 13000 _.slideWidth = Math.ceil(_.listWidth / _.options.slidesToShow); 13001 _.$slideTrack.width(Math.ceil(_.slideWidth * _.$slideTrack.children('.slick-slide').length)); 13002 } else if (_.options.variableWidth === true) { 13003 _.$slideTrack.width(5000 * _.slideCount); 13004 } else { 13005 _.slideWidth = Math.ceil(_.listWidth); 13006 _.$slideTrack.height(Math.ceil(_.$slides.first().outerHeight(true) * _.$slideTrack.children('.slick-slide').length)); 13007 } 13008 13009 var offset = _.$slides.first().outerWidth(true) - _.$slides.first().width(); 13010 if (_.options.variableWidth === false) _.$slideTrack.children('.slick-slide').width(_.slideWidth - offset); 13011 }; 13012 13013 Slick.prototype.setFade = function () { 13014 let _ = this, 13015 targetLeft; 13016 13017 _.$slides.each((index, element) => { 13018 targetLeft = _.slideWidth * index * -1; 13019 if (_.options.rtl === true) { 13020 $(element).css({ 13021 position: 'relative', 13022 right: targetLeft, 13023 top: 0, 13024 zIndex: _.options.zIndex - 2, 13025 opacity: 0 13026 }); 13027 } else { 13028 $(element).css({ 13029 position: 'relative', 13030 left: targetLeft, 13031 top: 0, 13032 zIndex: _.options.zIndex - 2, 13033 opacity: 0 13034 }); 13035 } 13036 }); 13037 13038 _.$slides.eq(_.currentSlide).css({ 13039 zIndex: _.options.zIndex - 1, 13040 opacity: 1 13041 }); 13042 }; 13043 13044 Slick.prototype.setHeight = function () { 13045 let _ = this; 13046 13047 if (_.options.slidesToShow === 1 && _.options.adaptiveHeight === true && _.options.vertical === false) { 13048 var targetHeight = _.$slides.eq(_.currentSlide).outerHeight(true); 13049 _.$list.css('height', targetHeight); 13050 } 13051 }; 13052 13053 Slick.prototype.setOption = Slick.prototype.slickSetOption = function () { 13054 /** 13055 * accepts arguments in format of: 13056 * 13057 * - for changing a single option's value: 13058 * .slick("setOption", option, value, refresh ) 13059 * 13060 * - for changing a set of responsive options: 13061 * .slick("setOption", 'responsive', [{}, ...], refresh ) 13062 * 13063 * - for updating multiple values at once (not responsive) 13064 * .slick("setOption", { 'option': value, ... }, refresh ) 13065 */ 13066 13067 var _ = this, 13068 l, 13069 item, 13070 option, 13071 value, 13072 refresh = false, 13073 type; 13074 13075 if ($.type(arguments[0]) === 'object') { 13076 option = arguments[0]; 13077 refresh = arguments[1]; 13078 type = 'multiple'; 13079 } else if ($.type(arguments[0]) === 'string') { 13080 option = arguments[0]; 13081 value = arguments[1]; 13082 refresh = arguments[2]; 13083 13084 if (arguments[0] === 'responsive' && $.type(arguments[1]) === 'array') { 13085 type = 'responsive'; 13086 } else if (typeof arguments[1] !== 'undefined') { 13087 type = 'single'; 13088 } 13089 } 13090 13091 if (type === 'single') {
vendor: 9,092 bytes, lines 13092-13377
13092 _.options[option] = value; 13093 } else if (type === 'multiple') { 13094 $.each(option, (opt, val) => { 13095 13096 _.options[opt] = val; 13097 }); 13098 } else if (type === 'responsive') { 13099 for (item in value) { 13100 if ($.type(_.options.responsive) !== 'array') { 13101 _.options.responsive = [value[item]]; 13102 } else { 13103 l = _.options.responsive.length - 1; 13104 13105 // loop through the responsive object and splice out duplicates. 13106 while (l >= 0) { 13107 if (_.options.responsive[l].breakpoint === value[item].breakpoint) { 13108 _.options.responsive.splice(l, 1); 13109 } 13110 13111 l--; 13112 } 13113 13114 _.options.responsive.push(value[item]); 13115 } 13116 } 13117 } 13118 13119 if (refresh) { 13120 _.unload(); 13121 _.reinit(); 13122 } 13123 }; 13124 13125 Slick.prototype.setPosition = function () { 13126 let _ = this; 13127 13128 _.setDimensions(); 13129 13130 _.setHeight(); 13131 13132 if (_.options.fade === false) { 13133 _.setCSS(_.getLeft(_.currentSlide)); 13134 } else { 13135 _.setFade(); 13136 } 13137 13138 _.$slider.trigger('setPosition', [_]); 13139 }; 13140 13141 Slick.prototype.setProps = function () { 13142 let _ = this, 13143 bodyStyle = document.body.style; 13144 13145 _.positionProp = _.options.vertical === true ? 'top' : 'left'; 13146 13147 if (_.positionProp === 'top') { 13148 _.$slider.addClass('slick-vertical'); 13149 } else { 13150 _.$slider.removeClass('slick-vertical'); 13151 } 13152 13153 if (bodyStyle.WebkitTransition !== undefined || bodyStyle.MozTransition !== undefined || bodyStyle.msTransition !== undefined) { 13154 if (_.options.useCSS === true) { 13155 _.cssTransitions = true; 13156 } 13157 } 13158 13159 if (_.options.fade) { 13160 if (typeof _.options.zIndex === 'number') { 13161 if (_.options.zIndex < 3) { 13162 _.options.zIndex = 3; 13163 } 13164 } else { 13165 _.options.zIndex = _.defaults.zIndex; 13166 } 13167 } 13168 13169 if (bodyStyle.OTransform !== undefined) { 13170 _.animType = 'OTransform'; 13171 _.transformType = '-o-transform'; 13172 _.transitionType = 'OTransition'; 13173 if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false; 13174 } 13175 if (bodyStyle.MozTransform !== undefined) { 13176 _.animType = 'MozTransform'; 13177 _.transformType = '-moz-transform'; 13178 _.transitionType = 'MozTransition'; 13179 if (bodyStyle.perspectiveProperty === undefined && bodyStyle.MozPerspective === undefined) _.animType = false; 13180 } 13181 if (bodyStyle.webkitTransform !== undefined) { 13182 _.animType = 'webkitTransform'; 13183 _.transformType = '-webkit-transform'; 13184 _.transitionType = 'webkitTransition'; 13185 if (bodyStyle.perspectiveProperty === undefined && bodyStyle.webkitPerspective === undefined) _.animType = false; 13186 } 13187 if (bodyStyle.msTransform !== undefined) { 13188 _.animType = 'msTransform'; 13189 _.transformType = '-ms-transform'; 13190 _.transitionType = 'msTransition'; 13191 if (bodyStyle.msTransform === undefined) _.animType = false; 13192 } 13193 if (bodyStyle.transform !== undefined && _.animType !== false) { 13194 _.animType = 'transform'; 13195 _.transformType = 'transform'; 13196 _.transitionType = 'transition'; 13197 } 13198 _.transformsEnabled = _.options.useTransform && _.animType !== null && _.animType !== false; 13199 }; 13200 13201 Slick.prototype.setSlideClasses = function (index) { 13202 let _ = this, 13203 centerOffset, 13204 allSlides, 13205 indexOffset, 13206 remainder; 13207 13208 allSlides = _.$slider.find('.slick-slide').removeClass('slick-active slick-center slick-current').attr('aria-hidden', 'true'); 13209 13210 _.$slides.eq(index).addClass('slick-current'); 13211 13212 if (_.options.centerMode === true) { 13213 let evenCoef = _.options.slidesToShow % 2 === 0 ? 1 : 0; 13214 13215 centerOffset = Math.floor(_.options.slidesToShow / 2); 13216 13217 if (_.options.infinite === true) { 13218 if (index >= centerOffset && index <= _.slideCount - 1 - centerOffset) { 13219 _.$slides.slice(index - centerOffset + evenCoef, index + centerOffset + 1).addClass('slick-active').attr('aria-hidden', 'false'); 13220 } else { 13221 indexOffset = _.options.slidesToShow + index; 13222 allSlides.slice(indexOffset - centerOffset + 1 + evenCoef, indexOffset + centerOffset + 2).addClass('slick-active').attr('aria-hidden', 'false'); 13223 } 13224 13225 if (index === 0) { 13226 allSlides.eq(allSlides.length - 1 - _.options.slidesToShow).addClass('slick-center'); 13227 } else if (index === _.slideCount - 1) { 13228 allSlides.eq(_.options.slidesToShow).addClass('slick-center'); 13229 } 13230 } 13231 13232 _.$slides.eq(index).addClass('slick-center'); 13233 } else if (index >= 0 && index <= _.slideCount - _.options.slidesToShow) { 13234 13235 _.$slides.slice(index, index + _.options.slidesToShow).addClass('slick-active').attr('aria-hidden', 'false'); 13236 } else if (allSlides.length <= _.options.slidesToShow) { 13237 13238 allSlides.addClass('slick-active').attr('aria-hidden', 'false'); 13239 } else { 13240 13241 remainder = _.slideCount % _.options.slidesToShow; 13242 indexOffset = _.options.infinite === true ? _.options.slidesToShow + index : index; 13243 13244 if (_.options.slidesToShow == _.options.slidesToScroll && _.slideCount - index < _.options.slidesToShow) { 13245 13246 allSlides.slice(indexOffset - (_.options.slidesToShow - remainder), indexOffset + remainder).addClass('slick-active').attr('aria-hidden', 'false'); 13247 } else { 13248 13249 allSlides.slice(indexOffset, indexOffset + _.options.slidesToShow).addClass('slick-active').attr('aria-hidden', 'false'); 13250 } 13251 } 13252 13253 if (_.options.lazyLoad === 'ondemand' || _.options.lazyLoad === 'anticipated') { 13254 _.lazyLoad(); 13255 } 13256 }; 13257 13258 Slick.prototype.setupInfinite = function () { 13259 let _ = this, 13260 i, 13261 slideIndex, 13262 infiniteCount; 13263 13264 if (_.options.fade === true) { 13265 _.options.centerMode = false; 13266 } 13267 13268 if (_.options.infinite === true && _.options.fade === false) { 13269 slideIndex = null; 13270 13271 if (_.slideCount > _.options.slidesToShow) { 13272 if (_.options.centerMode === true) { 13273 infiniteCount = _.options.slidesToShow + 1; 13274 } else { 13275 infiniteCount = _.options.slidesToShow; 13276 } 13277 13278 for (i = _.slideCount; i > _.slideCount - infiniteCount; i -= 1) { 13279 slideIndex = i - 1; 13280 $(_.$slides[slideIndex]).clone(true).attr('id', '').attr('data-slick-index', slideIndex - _.slideCount).prependTo(_.$slideTrack).addClass('slick-cloned'); 13281 } 13282 for (i = 0; i < infiniteCount + _.slideCount; i += 1) { 13283 slideIndex = i; 13284 $(_.$slides[slideIndex]).clone(true).attr('id', '').attr('data-slick-index', slideIndex + _.slideCount).appendTo(_.$slideTrack).addClass('slick-cloned'); 13285 } 13286 _.$slideTrack.find('.slick-cloned').find('[id]').each(function () { 13287 $(this).attr('id', ''); 13288 }); 13289 } 13290 } 13291 }; 13292 13293 Slick.prototype.interrupt = function (toggle) { 13294 let _ = this; 13295 13296 if (!toggle) { 13297 _.autoPlay(); 13298 } 13299 _.interrupted = toggle; 13300 }; 13301 13302 Slick.prototype.selectHandler = function (event) { 13303 let _ = this; 13304 13305 var targetElement = $(event.target).is('.slick-slide') ? $(event.target) : $(event.target).parents('.slick-slide'); 13306 13307 var index = parseInt(targetElement.attr('data-slick-index')); 13308 13309 if (!index) index = 0; 13310 13311 if (_.slideCount <= _.options.slidesToShow) { 13312 _.slideHandler(index, false, true); 13313 return; 13314 } 13315 13316 _.slideHandler(index); 13317 }; 13318 13319 Slick.prototype.slideHandler = function (index, sync, dontAnimate) { 13320 let targetSlide, 13321 animSlide, 13322 oldSlide, 13323 slideLeft, 13324 targetLeft = null, 13325 _ = this, 13326 navTarget; 13327 13328 sync = sync || false; 13329 13330 if (_.animating === true && _.options.waitForAnimate === true) { 13331 return; 13332 } 13333 13334 if (_.options.fade === true && _.currentSlide === index) { 13335 return; 13336 } 13337 13338 if (sync === false) { 13339 _.asNavFor(index); 13340 } 13341 13342 targetSlide = index; 13343 targetLeft = _.getLeft(targetSlide); 13344 slideLeft = _.getLeft(_.currentSlide); 13345 13346 _.currentLeft = _.swipeLeft === null ? slideLeft : _.swipeLeft; 13347 13348 if (_.options.infinite === false && _.options.centerMode === false && (index < 0 || index > _.getDotCount() * _.options.slidesToScroll)) { 13349 if (_.options.fade === false) { 13350 targetSlide = _.currentSlide; 13351 if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { 13352 _.animateSlide(slideLeft, () => { 13353 _.postSlide(targetSlide); 13354 }); 13355 } else { 13356 _.postSlide(targetSlide); 13357 } 13358 } 13359 return; 13360 } else if (_.options.infinite === false && _.options.centerMode === true && (index < 0 || index > _.slideCount - _.options.slidesToScroll)) { 13361 if (_.options.fade === false) { 13362 targetSlide = _.currentSlide; 13363 if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { 13364 _.animateSlide(slideLeft, () => { 13365 _.postSlide(targetSlide); 13366 }); 13367 } else { 13368 _.postSlide(targetSlide); 13369 } 13370 } 13371 return; 13372 } 13373 13374 if (_.options.autoplay) { 13375 clearInterval(_.autoPlayTimer); 13376 } 13377
13378 if (targetSlide < 0) { 13379 if (_.slideCount % _.options.slidesToScroll !== 0) { 13380 animSlide = _.slideCount - _.slideCount % _.options.slidesToScroll; 13381 } else { 13382 animSlide = _.slideCount + targetSlide; 13383 } 13384 } else if (targetSlide >= _.slideCount) { 13385 if (_.slideCount % _.options.slidesToScroll !== 0) { 13386 animSlide = 0; 13387 } else { 13388 animSlide = targetSlide - _.slideCount; 13389 } 13390 } else { 13391 animSlide = targetSlide; 13392 } 13393 13394 _.animating = true; 13395 13396 _.$slider.trigger('beforeChange', [_, _.currentSlide, animSlide]); 13397 13398 oldSlide = _.currentSlide; 13399 _.currentSlide = animSlide; 13400 13401 _.setSlideClasses(_.currentSlide); 13402 13403 if (_.options.asNavFor) { 13404 navTarget = _.getNavTarget(); 13405 navTarget = navTarget.slick('getSlick'); 13406 13407 if (navTarget.slideCount <= navTarget.options.slidesToShow) { 13408 navTarget.setSlideClasses(_.currentSlide); 13409 } 13410 } 13411 13412 _.updateDots(); 13413 _.updateArrows(); 13414 13415 if (_.options.fade === true) { 13416 if (dontAnimate !== true) { 13417 _.fadeSlideOut(oldSlide); 13418 13419 _.fadeSlide(animSlide, () => { 13420 _.postSlide(animSlide); 13421 }); 13422 } else { 13423 _.postSlide(animSlide); 13424 } 13425 _.animateHeight(); 13426 return; 13427 } 13428 13429 if (dontAnimate !== true && _.slideCount > _.options.slidesToShow) { 13430 _.animateSlide(targetLeft, () => { 13431 _.postSlide(animSlide); 13432 }); 13433 } else { 13434 _.postSlide(animSlide); 13435 } 13436 }; 13437 13438 Slick.prototype.startLoad = function () { 13439 let _ = this; 13440 13441 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow) { 13442 _.$prevArrow.hide(); 13443 _.$nextArrow.hide(); 13444 } 13445 13446 if (_.options.dots === true && _.slideCount > _.options.slidesToShow) { 13447 _.$dots.hide(); 13448 } 13449 13450 _.$slider.addClass('slick-loading'); 13451 }; 13452 13453 Slick.prototype.swipeDirection = function () { 13454 13455 var xDist, 13456 yDist, 13457 r, 13458 swipeAngle, 13459 _ = this; 13460 13461 xDist = _.touchObject.startX - _.touchObject.curX; 13462 yDist = _.touchObject.startY - _.touchObject.curY; 13463 r = Math.atan2(yDist, xDist); 13464 13465 swipeAngle = Math.round(r * 180 / Math.PI); 13466 if (swipeAngle < 0) { 13467 swipeAngle = 360 - Math.abs(swipeAngle); 13468 } 13469 13470 if (swipeAngle <= 45 && swipeAngle >= 0) { 13471 return _.options.rtl === false ? 'left' : 'right'; 13472 } 13473 if (swipeAngle <= 360 && swipeAngle >= 315) { 13474 return _.options.rtl === false ? 'left' : 'right'; 13475 } 13476 if (swipeAngle >= 135 && swipeAngle <= 225) { 13477 return _.options.rtl === false ? 'right' : 'left'; 13478 } 13479 if (_.options.verticalSwiping === true) { 13480 if (swipeAngle >= 35 && swipeAngle <= 135) { 13481 return 'down'; 13482 } 13483 return 'up'; 13484 } 13485 13486 return 'vertical'; 13487 }; 13488 13489 Slick.prototype.swipeEnd = function (event) { 13490 let _ = this, 13491 slideCount, 13492 direction; 13493 13494 _.dragging = false; 13495 _.swiping = false; 13496 13497 if (_.scrolling) { 13498 _.scrolling = false; 13499 return false; 13500 } 13501 13502 _.interrupted = false; 13503 _.shouldClick = !(_.touchObject.swipeLength > 10); 13504 13505 if (_.touchObject.curX === undefined) { 13506 return false; 13507 } 13508 13509 if (_.touchObject.edgeHit === true) { 13510 _.$slider.trigger('edge', [_, _.swipeDirection()]); 13511 } 13512 13513 if (_.touchObject.swipeLength >= _.touchObject.minSwipe) { 13514 direction = _.swipeDirection(); 13515 13516 switch (direction) { 13517 case 'left': 13518 case 'down': 13519 13520 slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide + _.getSlideCount()) : _.currentSlide + _.getSlideCount(); 13521 13522 _.currentDirection = 0; 13523 13524 break; 13525 13526 case 'right': 13527 case 'up': 13528 13529 slideCount = _.options.swipeToSlide ? _.checkNavigable(_.currentSlide - _.getSlideCount()) : _.currentSlide - _.getSlideCount(); 13530 13531 _.currentDirection = 1; 13532 13533 break; 13534 13535 default: 13536 } 13537 13538 if (direction != 'vertical') { 13539 _.slideHandler(slideCount); 13540 _.touchObject = {}; 13541 _.$slider.trigger('swipe', [_, direction]); 13542 } 13543 } else if (_.touchObject.startX !== _.touchObject.curX) { 13544 13545 _.slideHandler(_.currentSlide); 13546 _.touchObject = {}; 13547 } 13548 }; 13549 13550 Slick.prototype.swipeHandler = function (event) { 13551 let _ = this; 13552 13553 if (_.options.swipe === false || 'ontouchend' in document && _.options.swipe === false) { 13554 return; 13555 } else if (_.options.draggable === false && event.type.indexOf('mouse') !== -1) { 13556 return; 13557 } 13558 13559 _.touchObject.fingerCount = event.originalEvent && event.originalEvent.touches !== undefined ? event.originalEvent.touches.length : 1; 13560 13561 _.touchObject.minSwipe = _.listWidth / _.options.touchThreshold; 13562 13563 if (_.options.verticalSwiping === true) { 13564 _.touchObject.minSwipe = _.listHeight / _.options.touchThreshold; 13565 } 13566 13567 switch (event.data.action) { 13568 case 'start': 13569 _.swipeStart(event); 13570 break; 13571 13572 case 'move': 13573 _.swipeMove(event); 13574 break; 13575 13576 case 'end': 13577 _.swipeEnd(event); 13578 break; 13579 } 13580 }; 13581 13582 Slick.prototype.swipeMove = function (event) { 13583 let _ = this, 13584 edgeWasHit = false, 13585 curLeft, 13586 swipeDirection, 13587 swipeLength, 13588 positionOffset, 13589 touches, 13590 verticalSwipeLength; 13591 13592 touches = event.originalEvent !== undefined ? event.originalEvent.touches : null; 13593 13594 if (!_.dragging || _.scrolling || touches && touches.length !== 1) { 13595 return false;
vendor: 4,219 bytes, lines 13596-13734
13596 } 13597 13598 curLeft = _.getLeft(_.currentSlide); 13599 13600 _.touchObject.curX = touches !== undefined ? touches[0].pageX : event.clientX; 13601 _.touchObject.curY = touches !== undefined ? touches[0].pageY : event.clientY; 13602 13603 _.touchObject.swipeLength = Math.round(Math.sqrt(Math.pow(_.touchObject.curX - _.touchObject.startX, 2))); 13604 13605 verticalSwipeLength = Math.round(Math.sqrt(Math.pow(_.touchObject.curY - _.touchObject.startY, 2))); 13606 13607 if (!_.options.verticalSwiping && !_.swiping && verticalSwipeLength > 4) { 13608 _.scrolling = true; 13609 return false; 13610 } 13611 13612 if (_.options.verticalSwiping === true) { 13613 _.touchObject.swipeLength = verticalSwipeLength; 13614 } 13615 13616 swipeDirection = _.swipeDirection(); 13617 13618 if (event.originalEvent !== undefined && _.touchObject.swipeLength > 4) { 13619 _.swiping = true; 13620 event.preventDefault(); 13621 } 13622 13623 positionOffset = (_.options.rtl === false ? 1 : -1) * (_.touchObject.curX > _.touchObject.startX ? 1 : -1); 13624 if (_.options.verticalSwiping === true) { 13625 positionOffset = _.touchObject.curY > _.touchObject.startY ? 1 : -1; 13626 } 13627 13628 swipeLength = _.touchObject.swipeLength; 13629 13630 _.touchObject.edgeHit = false; 13631 13632 if (_.options.infinite === false) { 13633 if (_.currentSlide === 0 && swipeDirection === 'right' || _.currentSlide >= _.getDotCount() && swipeDirection === 'left') { 13634 swipeLength = _.touchObject.swipeLength * _.options.edgeFriction; 13635 _.touchObject.edgeHit = true; 13636 } 13637 } 13638 13639 if (_.options.vertical === false) { 13640 _.swipeLeft = curLeft + swipeLength * positionOffset; 13641 } else { 13642 _.swipeLeft = curLeft + swipeLength * (_.$list.height() / _.listWidth) * positionOffset; 13643 } 13644 if (_.options.verticalSwiping === true) { 13645 _.swipeLeft = curLeft + swipeLength * positionOffset; 13646 } 13647 13648 if (_.options.fade === true || _.options.touchMove === false) { 13649 return false; 13650 } 13651 13652 if (_.animating === true) { 13653 _.swipeLeft = null; 13654 return false; 13655 } 13656 13657 _.setCSS(_.swipeLeft); 13658 }; 13659 13660 Slick.prototype.swipeStart = function (event) { 13661 let _ = this, 13662 touches; 13663 13664 _.interrupted = true; 13665 13666 if (_.touchObject.fingerCount !== 1 || _.slideCount <= _.options.slidesToShow) { 13667 _.touchObject = {}; 13668 return false; 13669 } 13670 13671 if (event.originalEvent !== undefined && event.originalEvent.touches !== undefined) { 13672 touches = event.originalEvent.touches[0]; 13673 } 13674 13675 _.touchObject.startX = _.touchObject.curX = touches !== undefined ? touches.pageX : event.clientX; 13676 _.touchObject.startY = _.touchObject.curY = touches !== undefined ? touches.pageY : event.clientY; 13677 13678 _.dragging = true; 13679 }; 13680 13681 Slick.prototype.unfilterSlides = Slick.prototype.slickUnfilter = function () { 13682 let _ = this; 13683 13684 if (_.$slidesCache !== null) { 13685 _.unload(); 13686 13687 _.$slideTrack.children(this.options.slide).detach(); 13688 13689 _.$slidesCache.appendTo(_.$slideTrack); 13690 13691 _.reinit(); 13692 } 13693 }; 13694 13695 Slick.prototype.unload = function () { 13696 let _ = this; 13697 13698 $('.slick-cloned', _.$slider).remove(); 13699 13700 if (_.$dots) { 13701 _.$dots.remove(); 13702 } 13703 13704 if (_.$prevArrow && _.htmlExpr.test(_.options.prevArrow)) { 13705 _.$prevArrow.remove(); 13706 } 13707 13708 if (_.$nextArrow && _.htmlExpr.test(_.options.nextArrow)) { 13709 _.$nextArrow.remove(); 13710 } 13711 13712 _.$slides.removeClass('slick-slide slick-active slick-visible slick-current').attr('aria-hidden', 'true').css('width', ''); 13713 }; 13714 13715 Slick.prototype.unslick = function (fromBreakpoint) { 13716 let _ = this; 13717 _.$slider.trigger('unslick', [_, fromBreakpoint]); 13718 _.destroy(); 13719 }; 13720 13721 Slick.prototype.updateArrows = function () { 13722 let _ = this, 13723 centerOffset; 13724 13725 centerOffset = Math.floor(_.options.slidesToShow / 2); 13726 13727 if (_.options.arrows === true && _.slideCount > _.options.slidesToShow && !_.options.infinite) { 13728 _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); 13729 _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); 13730 13731 if (_.currentSlide === 0) { 13732 _.$prevArrow.addClass('slick-disabled').attr('aria-disabled', 'true'); 13733 _.$nextArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); 13734 } else if (_.currentSlide >
13734= _.slideCount - _.options.slidesToShow && _.options.centerMode === false) { 13735 _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true'); 13736 _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); 13737 } else if (_.currentSlide >= _.slideCount - 1 && _.options.centerMode === true) { 13738 _.$nextArrow.addClass('slick-disabled').attr('aria-disabled', 'true'); 13739 _.$prevArrow.removeClass('slick-disabled').attr('aria-disabled', 'false'); 13740 } 13741 } 13742 }; 13743 13744 Slick.prototype.updateDots = function () { 13745 let _ = this; 13746 13747 if (_.$dots !== null) { 13748 _.$dots.find('li').removeClass('slick-active').end(); 13749 13750 _.$dots.find('li').eq(Math.floor(_.currentSlide / _.options.slidesToScroll)).addClass('slick-active'); 13751 } 13752 }; 13753 13754 Slick.prototype.visibility = function () { 13755 let _ = this; 13756 13757 if (_.options.autoplay) { 13758 if (document[_.hidden]) { 13759 _.interrupted = true; 13760 } else { 13761 _.interrupted = false; 13762 } 13763 } 13764 }; 13765 13766 $.fn.slick = function () { 13767 var _ = this, 13768 opt = arguments[0], 13769 args = Array.prototype.slice.call(arguments, 1), 13770 l = _.length, 13771 i, 13772 ret; 13773 for (i = 0; i < l; i++) { 13774 if (typeof opt === 'object' || typeof opt === 'undefined') _[i].slick = new Slick(_[i], opt);else ret = _[i].slick[opt].apply(_[i].slick, args); 13775 if (typeof ret !== 'undefined') return ret; 13776 } 13777 return _; 13778 }; 13779}); 13780 13781/***/ }), 13782/* 28 */ 13783/***/ (function(module, exports, __webpack_require__) { 13784 13785// style-loader: Adds some css to the DOM by adding a <style> tag 13786 13787// load the styles 13788var content = __webpack_require__(29); 13789if(typeof content === 'string') content = [[module.i, content, '']]; 13790// Prepare cssTransformation 13791var transform; 13792 13793var options = {} 13794options.transform = transform 13795// add the styles to the DOM 13796var update = __webpack_require__(4)(content, options); 13797if(content.locals) module.exports = content.locals; 13798// Hot Module Replacement 13799if(false) { 13800 // When the styles change, update the <style> tags 13801 if(!content.locals) { 13802 module.hot.accept("!!../../../node_modules/css-loader/index.js!./slick.css", function() { 13803 var newContent = require("!!../../../node_modules/css-loader/index.js!./slick.css"); 13804 if(typeof newContent === 'string') newContent = [[module.id, newContent, '']]; 13805 update(newContent); 13806 }); 13807 } 13808 // When the module is disposed, remove the <style> tags 13809 module.hot.dispose(function() { update(); }); 13810} 13811 13812/***/ }), 13813/* 29 */ 13814/***/ (function(module, exports, __webpack_require__) { 13815 13816exports = module.exports = __webpack_require__(3)(undefined); 13817// imports 13818 13819 13820// module 13821exports.push([module.i, "/* Slider */\r\n.slick-slider\r\n{\r\n position: relative;\r\n\r\n display: block;\r\n box-sizing: border-box;\r\n\r\n -webkit-user-select: none;\r\n -moz-user-select: none;\r\n -ms-user-select: none;\r\n user-select: none;\r\n\r\n -webkit-touch-callout: none;\r\n -khtml-user-select: none;\r\n -ms-touch-action: pan-y;\r\n touch-action: pan-y;\r\n -webkit-tap-highlight-color: transparent;\r\n}\r\n\r\n.slick-list\r\n{\r\n position: relative;\r\n\r\n display: block;\r\n overflow: hidden;\r\n\r\n margin: 0;\r\n padding: 0;\r\n}\r\n.slick-list:focus\r\n{\r\n outline: none;\r\n}\r\n.slick-list.dragging\r\n{\r\n cursor: pointer;\r\n cursor: hand;\r\n}\r\n\r\n.slick-slider .slick-track,\r\n.slick-slider .slick-list\r\n{\r\n -webkit-transform: translate3d(0, 0, 0);\r\n -moz-transform: translate3d(0, 0, 0);\r\n -ms-transform: translate3d(0, 0, 0);\r\n -o-transform: translate3d(0, 0, 0);\r\n transform: translate3d(0, 0, 0);\r\n}\r\n\r\n.slick-track\r\n{\r\n position: relative;\r\n top: 0;\r\n left: 0;\r\n\r\n display: block;\r\n margin-left: auto;\r\n margin-right: auto;\r\n}\r\n.slick-track:before,\r\n.slick-track:after\r\n{\r\n display: table;\r\n\r\n content: '';\r\n}\r\n.slick-track:after\r\n{\r\n clear: both;\r\n}\r\n.slick-loading .slick-track\r\n{\r\n visibility: hidden;\r\n}\r\n\r\n.slick-slide\r\n{\r\n display: none;\r\n float: left;\r\n\r\n height: 100%;\r\n min-height: 1px;\r\n}\r\n[dir='rtl'] .slick-slide\r\n{\r\n float: right;\r\n}\r\n.slick-slide img\r\n{\r\n display: block;\r\n}\r\n.slick-slide.slick-loading img\r\n{\r\n display: none;\r\n}\r\n.slick-slide.dragging img\r\n{\r\n pointer-events: none;\r\n}\r\n.slick-initialized .slick-slide\r\n{\r\n display: block;\r\n}\r\n.slick-loading .slick-slide\r\n{\r\n visibility: hidden;\r\n}\r\n.slick-vertical .slick-slide\r\n{\r\n display: block;\r\n\r\n height: auto;\r\n\r\n border: 1px solid transparent;\r\n}\r\n.slick-arrow.slick-hidden {\r\n display: none;\r\n}\r\n", ""]); 13822
13823// exports 13824 13825 13826/***/ }), 13827/* 30 */ 13828/***/ (function(module, exports, __webpack_require__) { 13829 13830/* WEBPACK VAR INJECTION */(function(__webpack_provided_window_dot_jQuery) {typeof JSON != "object" && (JSON = {}), function () { 13831 "use strict"; 13832 function f(e) { 13833 return e < 10 ? "0" + e : e; 13834 }function quote(e) { 13835 return escapable.lastIndex = 0, escapable.test(e) ? '"' + e.replace(escapable, function (e) { 13836 var t = meta[e];return typeof t == "string" ? t : "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4); 13837 }) + '"' : '"' + e + '"'; 13838 }function str(e, t) { 13839 var n, 13840 r, 13841 i, 13842 s, 13843 o = gap, 13844 u, 13845 a = t[e];a && typeof a == "object" && typeof a.toJSON == "function" && (a = a.toJSON(e)), typeof rep == "function" && (a = rep.call(t, e, a));switch (typeof a) {case "string": 13846 return quote(a);case "number": 13847 return isFinite(a) ? String(a) : "null";case "boolean":case "null": 13848 return String(a);case "object": 13849 if (!a) return "null";gap += indent, u = [];if (Object.prototype.toString.apply(a) === "[object Array]") { 13850 s = a.length;for (n = 0; n < s; n += 1) u[n] = str(n, a) || "null";return i = u.length === 0 ? "[]" : gap ? "[\n" + gap + u.join(",\n" + gap) + "\n" + o + "]" : "[" + u.join(",") + "]", gap = o, i; 13851 }if (rep && typeof rep == "object") { 13852 s = rep.length;for (n = 0; n < s; n += 1) typeof rep[n] == "string" && (r = rep[n], i = str(r, a), i && u.push(quote(r) + (gap ? ": " : ":") + i)); 13853 } else for (r in a) Object.prototype.hasOwnProperty.call(a, r) && (i = str(r, a), i && u.push(quote(r) + (gap ? ": " : ":") + i));return i = u.length === 0 ? "{}" : gap ? "{\n" + gap + u.join(",\n" + gap) + "\n" + o + "}" : "{" + u.join(",") + "}", gap = o, i;} 13854 }typeof Date.prototype.toJSON != "function" && (Date.prototype.toJSON = function (e) { 13855 return isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null; 13856 }, String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (e) { 13857 return this.valueOf(); 13858 });var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 13859 escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 13860 gap, 13861 indent, 13862 meta = { "\b": "\\b", " ": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }, 13863 rep;typeof JSON.stringify != "function" && (JSON.stringify = function (e, t, n) { 13864 var r;gap = "", indent = "";if (typeof n == "number") for (r = 0; r < n; r += 1) indent += " ";else typeof n == "string" && (indent = n);rep = t;if (!t || typeof t == "function" || typeof t == "object" && typeof t.length == "number") return str("", { "": e });throw new Error("JSON.stringify"); 13865 }), typeof JSON.parse != "function" && (JSON.parse = function (text, reviver) { 13866 function walk(e, t) { 13867 var n, 13868 r, 13869 i = e[t];if (i && typeof i == "object") for (n in i) Object.prototype.hasOwnProperty.call(i, n) && (r = walk(i, n), r !== undefined ? i[n] = r : delete i[n]);return reviver.call(e, t, i); 13870 }var j;text = String(text), cx.lastIndex = 0, cx.test(text) && (text = text.replace(cx, function (e) { 13871 return "\\u" + ("0000" + e.charCodeAt(0).toString(16)).slice(-4); 13872 }));if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) return j = eval("(" + text + ")"), typeof reviver == "function" ? walk({ "": j }, "") : j;throw new SyntaxError("JSON.parse"); 13873 }); 13874}(), function (e, t) { 13875 "use strict"; 13876 var n = e.History = e.History || {}, 13877 r = __webpack_provided_window_dot_jQuery;if (typeof n.Adapter != "undefined") throw new Error("History.js Adapter has already been loaded...");n.Adapter = { bind: function (e, t, n) { 13878 r(e).bind(t, n); 13879 }, trigger: function (e, t, n) { 13880 r(e).trigger(t, n); 13881 }, extractEventData: function (e, n, r) { 13882 var i = n && n.originalEvent && n.originalEvent[e] || r && r[e] || t;return i; 13883 }, onDomLoad: function (e) { 13884 r(e); 13885 } }, typeof n.init != "undefined" && n.init(); 13886}(window), function (e, t) { 13887 "use strict"; 13888 var n = e.document, 13889 r = e.setTimeout || r, 13890 i = e.clearTimeout || i, 13891 s = e.setInterval || s, 13892 o = e.History = e.History || {};if (typeof o.initHtml4 != "undefined") throw new Error("History.js HTML4 Support has already been loaded...");o.initHtml4 = function () { 13893 if (typeof o.initHtml4.initialized != "undefined") return !1;o.initHtml4.initialized = !0, o.enabled = !0, o.savedHashes = [], o.isLastHash = function (e) { 13894 var t = o.getHashByIndex(), 13895 n;return n = e === t, n; 13896 }, o.isHashEqual = function (e, t) { 13897 return e = encodeURIComponent(e).replace(/%25/g, "%"), t = encodeURIComponent(t).replace(/%25/g, "%"), e === t; 13898 }, o.saveHash = function (e) { 13899 return o.isLastHash(e) ? !1 : (o.savedHashes.push(e), !0); 13900 }, o.getHashByIndex = function (e) { 13901 var t = null;return typeof e == "undefined" ? t = o.savedHashes[o.savedHashes.length - 1] : e < 0 ? t = o.savedHashes[o.savedHashes.length + e] : t = o.savedHashes[e], t; 13902 }, o.discardedHashes = {}, o.discardedStates = {}, o.discardState = function (e, t, n) { 13903 var r = o.getHashByState(e), 13904 i;return i = { discardedState: e, backState: n, forwardState: t }, o.discardedStates[r] = i, !0; 13905 }, o.discardHash = function (e, t, n) { 13906 var r = { discardedHash: e, backState: n, forwardState: t };return o.discardedHashes[e] = r, !0; 13907 }, o.discardedState = function (e) { 13908 var t = o.getHashByState(e), 13909 n;return n = o.discardedStates[t] || !1, n; 13910 }, o.discardedHash = function (e) { 13911 var t = o.discardedHashes[e] || !1;return t; 13912 }, o.recycleState = function (e) { 13913 var t = o.getHashByState(e);return o.discardedState(e) && delete o.discardedStates[t], !0; 13914 }, o.emulated.hashChange && (o.hashChangeInit = function () { 13915 o.checkerFunction = null;var t = "", 13916 r, 13917 i, 13918 u, 13919 a, 13920 f = Boolean(o.getHash());return o.isInternetExplorer() ? (r = "historyjs-iframe", i = n.createElement("iframe"), i.setAttribute("id", r), i.setAttribute("src", "#"), i.style.display = "none", n.body.appendChild(i), i.contentWindow.document.open(), i.contentWindow.document.close(), u = "", a = !1, o.checkerFunction = function () { 13921 if (a) return !1;a = !0;var n = o.getHash(), 13922 r = o.getHash(i.contentWindow.document);return n !== t ? (t = n, r !== n && (u = r = n, i.contentWindow.document.open(), i.contentWindow.document.close(), i.contentWindow.document.location.hash = o.escapeHash(n)), o.Adapter.trigger(e, "hashchange")) : r !== u && (u = r, f && r === "" ? o.back() : o.setHash(r, !1)), a = !1, !0; 13923 }) : o.checkerFunction = function () { 13924 var n = o.getHash() || "";return n !== t && (t = n, o.Adapter.trigger(e, "hashchange")), !0; 13925 }, o.intervalList.push(s(o.checkerFunction, o.options.hashChangeInterval)), !0; 13926 }, o.Adapter.onDomLoad(o.hashChangeInit)), o.emulated.pushState && (o.onHashChange = function (t) { 13927 var n = t && t.newURL || o.getLocationHref(), 13928 r = o.getHashByUrl(n), 13929 i = null, 13930 s = null, 13931 u = null, 13932 a;return o.isLastHash(r) ? (o.busy(!1), !1) : (o.doubleCheckComplete(), o.saveHash(r), r && o.isTraditionalAnchor(r) ? (o.Adapter.trigger(e, "anchorchange"), o.busy(!1), !1) : (i = o.extractState(o.getFullUrl(r || o.getLocationHref()), !0), o.isLastSavedState(i) ? (o.busy(!1), !1) : (s = o.getHashByState(i), a = o.discardedState(i), a ? (o.getHashByIndex(-2) === o.getHashByState(a.forwardState) ? o.back(!1) : o.forward(!1), !1) : (o.pushState(i.data, i.title, encodeURI(i.url), !1), !0)))); 13933 }, o.Adapter.bind(e, "hashchange", o.onHashChange), o.pushState = function (t, n, r, i) { 13934 r = encodeURI(r).replace(/%25/g, "%");if (o.getHashByUrl(r)) throw new Error("History.js does not support states with fragment-identifiers (hashes/anchors).");if (i !== !1 && o.busy()) return o.pushQueue({ scope: o, callback: o.pushState, args: arguments, queue: i }), !1;o.busy(!0);var s = o.createStateObject(t, n, r), 13935 u = o.getHashByState(s), 13936 a = o.getState(!1), 13937 f = o.getHashByState(a), 13938 l = o.getHash(), 13939 c = o.expectedStateId == s.id;return o.storeState(s), o.expectedStateId = s.id, o.recycleState(s), o.setTitle(s), u === f ? (o.busy(!1), !1) : (o.saveState(s), c || o.Adapter.trigger(e, "statechange"), !o.isHashEqual(u, l) && !o.isHashEqual(u, o.getShortUrl(o.getLocationHref())) && o.setHash(u, !1), o.busy(!1), !0); 13940 }, o.replaceState = function (t, n, r, i) { 13941 r = encodeURI(r).replace(/%25/g, "%");if (o.getHashByUrl(r)) throw new Error("History.js does not support states with fragment-identifiers (hashes/anchors).");if (i !== !1 && o.busy()) return o.pushQueue({ scope: o, callback: o.replaceState, args: arguments, queue: i }), !1;o.busy(!0);var s = o.createStateObject(t, n, r), 13942 u = o.getHashByState(s), 13943 a = o.getState(!1), 13944 f = o.getHashByState(a), 13945 l = o.getStateByIndex(-2);return o.discardState(a, s, l), u === f ? (o.storeState(s), o.expectedStateId = s.id, o.recycleState(s), o.setTitle(s), o.saveState(s), o.Adapter.trigger(e, "statechange"), o.busy(!1)) : o.pushState(s.data, s.title, s.url, !1), !0; 13946 }), o.emulated.pushState && o.getHash() && !o.emulated.hashChange && o.Adapter.onDomLoad(function () { 13947 o.Adapter.trigger(e, "hashchange"); 13948 }); 13949 }, typeof o.init != "undefined" && o.init(); 13950}(window), function (e, t) { 13951 "use strict"; 13952 var n = e.console || t, 13953 r = e.document, 13954 i = e.navigator, 13955 s = !1, 13956 o = e.setTimeout, 13957 u = e.clearTimeout, 13958 a = e.setInterval, 13959 f = e.clearInterval, 13960 l = e.JSON, 13961 c = e.alert, 13962 h = e.History = e.History || {}, 13963 p = e.history;try { 13964 s = e.sessionStorage, s.setItem("TEST", "1"), s.removeItem("TEST"); 13965 } catch (d) { 13966 s = !1; 13967 }l.stringify = l.stringify || l.encode, l.parse = l.parse || l.decode;if (typeof h.init != "undefined") throw new Error("History.js Core has already been loaded...");h.init = function (e) { 13968 return typeof h.Adapter == "undefined" ? !1 : (typeof h.initCore != "undefined" && h.initCore(), typeof h.initHtml4 != "undefined" && h.initHtml4(), !0); 13969 }, h.initCore = function (d) { 13970 if (typeof h.initCore.initialized != "undefined") return !1;h.initCore.initialized = !0, h.options = h.options || {}, h.options.hashChangeInterval = h.options.hashChangeInterval || 100, h.options.safariPollInterval = h.options.safariPollInterval || 500, h.options.doubleCheckInterval = h.options.doubleCheckInterval || 500, h.options.disableSuid = h.options.disableSuid || !1, h.options.storeInterval = h.options.storeInterval || 1e3, h.options.busyDelay = h.options.busyDelay || 250, h.options.debug = h.options.debug || !1, h.options.initialTitle = h.options.initialTitle || r.title, h.options.html4Mode = h.options.html4Mode || !1, h.options.delayInit = h.options.delayInit || !1, h.intervalList = [], h.clearAllIntervals = function () { 13971 var e, 13972 t = h.intervalList;if (typeof t != "undefined" && t !== null) { 13973 for (e = 0; e < t.length; e++) f(t[e]);h.intervalList = null; 13974 } 13975 }, h.debug = function () { 13976 (h.options.debug || !1) && h.log.apply(h, arguments); 13977 }, h.log = function () { 13978 var e = typeof n != "undefined" && typeof n.log != "undefined" && typeof n.log.apply != "undefined", 13979 t = r.getElementById("log"), 13980 i, 13981 s, 13982 o, 13983 u, 13984 a;e ? (u = Array.prototype.slice.call(arguments), i = u.shift(), typeof n.debug != "undefined" ? n.debug.apply(n, [i, u]) : n.log.apply(n, [i, u])) : i = "\n" + arguments[0] + "\n";for (s = 1, o = arguments.length; s < o; ++s) { 13985 a = arguments[s];if (typeof a == "object" && typeof l != "undefined") try { 13986 a = l.stringify(a); 13987 } catch (f) {}i += "\n" + a + "\n"; 13988 }return t ? (t.value += i + "\n-----\n", t.scrollTop = t.scrollHeight - t.clientHeight) : e || c(i), !0; 13989 }, h.getInternetExplorerMajorVersion = function () { 13990 var e = h.getInternetExplorerMajorVersion.cached = typeof h.getInternetExplorerMajorVersion.cached != "undefined" ? h.getInternetExplorerMajorVersion.cached : function () { 13991 var e = 3, 13992 t = r.createElement("div"), 13993 n = t.getElementsByTagName("i");while ((t.innerHTML = "<!--[if gt IE " + ++e + "]><i></i><![endif]-->") && n[0]);return e > 4 ? e : !1; 13994 }();return e; 13995 }, h.isInternetExplorer = function () { 13996 var e = h.isInternetExplorer.cached = typeof h.isInternetExplorer.cached != "undefined" ? h.isInternetExplorer.cached : Boolean(h.getInternetExplorerMajorVersion());return e; 13997 }, h.options.html4Mode ? h.emulated = { pushState: !0, hashChange: !0 } : h.emulated = { pushState: !Boolean(e.history && e.history.pushState && e.history.replaceState && !/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(i.userAgent) && !/AppleWeb
13997Kit\/5([0-2]|3[0-2])/i.test(i.userAgent)), hashChange: Boolean(!("onhashchange" in e || "onhashchange" in r) || h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 8) }, h.enabled = !h.emulated.pushState, h.bugs = { setHash: Boolean(!h.emulated.pushState && i.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)), safariPoll: Boolean(!h.emulated.pushState && i.vendor === "Apple Computer, Inc." && /AppleWebKit\/5([0-2]|3[0-3])/.test(i.userAgent)), ieDoubleCheck: Boolean(h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 8), hashEscape: Boolean(h.isInternetExplorer() && h.getInternetExplorerMajorVersion() < 7) }, h.isEmptyObject = function (e) { 13998 for (var t in e) if (e.hasOwnProperty(t)) return !1;return !0; 13999 }, h.cloneObject = function (e) { 14000 var t, n;return e ? (t = l.stringify(e), n = l.parse(t)) : n = {}, n; 14001 }, h.getRootUrl = function () { 14002 var e = r.location.protocol + "//" + (r.location.hostname || r.location.host);if (r.location.port || !1) e += ":" + r.location.port;return e += "/", e; 14003 }, h.getBaseHref = function () { 14004 var e = r.getElementsByTagName("base"), 14005 t = null, 14006 n = "";return e.length === 1 && (t = e[0], n = t.href.replace(/[^\/]+$/, "")), n = n.replace(/\/+$/, ""), n && (n += "/"), n; 14007 }, h.getBaseUrl = function () { 14008 var e = h.getBaseHref() || h.getBasePageUrl() || h.getRootUrl();return e; 14009 }, h.getPageUrl = function () { 14010 var e = h.getState(!1, !1), 14011 t = (e || {}).url || h.getLocationHref(), 14012 n;return n = t.replace(/\/+$/, "").replace(/[^\/]+$/, function (e, t, n) { 14013 return (/\./.test(e) ? e : e + "/" 14014 ); 14015 }), n; 14016 }, h.getBasePageUrl = function () { 14017 var e = h.getLocationHref().replace(/[#\?].*/, "").replace(/[^\/]+$/, function (e, t, n) { 14018 return (/[^\/]$/.test(e) ? "" : e 14019 ); 14020 }).replace(/\/+$/, "") + "/";return e; 14021 }, h.getFullUrl = function (e, t) { 14022 var n = e, 14023 r = e.substring(0, 1);return t = typeof t == "undefined" ? !0 : t, /[a-z]+\:\/\//.test(e) || (r === "/" ? n = h.getRootUrl() + e.replace(/^\/+/, "") : r === "#" ? n = h.getPageUrl().replace(/#.*/, "") + e : r === "?" ? n = h.getPageUrl().replace(/[\?#].*/, "") + e : t ? n = h.getBaseUrl() + e.replace(/^(\.\/)+/, "") : n = h.getBasePageUrl() + e.replace(/^(\.\/)+/, "")), n.replace(/\#$/, ""); 14024 }, h.getShortUrl = function (e) { 14025 var t = e, 14026 n = h.getBaseUrl(), 14027 r = h.getRootUrl();return h.emulated.pushState && (t = t.replace(n, "")), t = t.replace(r, "/"), h.isTraditionalAnchor(t) && (t = "./" + t), t = t.replace(/^(\.\/)+/g, "./").replace(/\#$/, ""), t; 14028 }, h.getLocationHref = function (e) { 14029 return e = e || r, e.URL === e.location.href ? e.location.href : e.location.href === decodeURIComponent(e.URL) ? e.URL : e.location.hash && decodeURIComponent(e.location.href.replace(/^[^#]+/, "")) === e.location.hash ? e.location.href : e.URL.indexOf("#") == -1 && e.location.href.indexOf("#") != -1 ? e.location.href : e.URL || e.location.href; 14030 }, h.store = {}, h.idToState = h.idToState || {}, h.stateToId = h.stateToId || {}, h.urlToId = h.urlToId || {}, h.storedStates = h.storedStates || [], h.savedStates = h.savedStates || [], h.normalizeStore = function () { 14031 h.store.idToState = h.store.idToState || {}, h.store.urlToId = h.store.urlToId || {}, h.store.stateToId = h.store.stateToId || {}; 14032 }, h.getState = function (e, t) { 14033 typeof e == "undefined" && (e = !0), typeof t == "undefined" && (t = !0);var n = h.getLastSavedState();return !n && t && (n = h.createStateObject()), e && (n = h.cloneObject(n), n.url = n.cleanUrl || n.url), n; 14034 }, h.getIdByState = function (e) { 14035 var t = h.extractId(e.url), 14036 n;if (!t) { 14037 n = h.getStateString(e);if (typeof h.stateToId[n] != "undefined") t = h.stateToId[n];else if (typeof h.store.stateToId[n] != "undefined") t = h.store.stateToId[n];else { 14038 for (;;) { 14039 t = new Date().getTime() + String(Math.random()).replace(/\D/g, "");if (typeof h.idToState[t] == "undefined" && typeof h.store.idToState[t] == "undefined") break; 14040 }h.stateToId[n] = t, h.idToState[t] = e; 14041 } 14042 }return t; 14043 }, h.normalizeState = function (e) { 14044 var t, n;if (!e || typeof e != "object") e = {};if (typeof e.normalized != "undefined") return e;if (!e.data || typeof e.data != "object") e.data = {};return t = {}, t.normalized = !0, t.title = e.title || "", t.url = h.getFullUrl(e.url ? e.url : h.getLocationHref()), t.hash = h.getShortUrl(t.url), t.data = h.cloneObject(e.data), t.id = h.getIdByState(t), t.cleanUrl = t.url.replace(/\??\&_suid.*/, ""), t.url = t.cleanUrl, n = !h.isEmptyObject(t.data), (t.title || n) && h.options.disableSuid !== !0 && (t.hash = h.getShortUrl(t.url).replace(/\??\&_suid.*/, ""), /\?/.test(t.hash) || (t.hash += "?"), t.hash += "&_suid=" + t.id), t.hashedUrl = h.getFullUrl(t.hash), (h.emulated.pushState || h.bugs.safariPoll) && h.hasUrlDuplicate(t) && (t.url = t.hashedUrl), t; 14045 }, h.createStateObject = function (e, t, n) { 14046 var r = { data: e, title: t, url: n };return r = h.normalizeState(r), r; 14047 }
14047, h.getStateById = function (e) { 14048 e = String(e);var n = h.idToState[e] || h.store.idToState[e] || t;return n; 14049 }, h.getStateString = function (e) { 14050 var t, n, r;return t = h.normalizeState(e), n = { data: t.data, title: e.title, url: e.url }, r = l.stringify(n), r; 14051 }, h.getStateId = function (e) { 14052 var t, n;return t = h.normalizeState(e), n = t.id, n; 14053 }, h.getHashByState = function (e) { 14054 var t, n;return t = h.normalizeState(e), n = t.hash, n; 14055 }, h.extractId = function (e) { 14056 var t, n, r, i;return e.indexOf("#") != -1 ? i = e.split("#")[0] : i = e, n = /(.*)\&_suid=([0-9]+)$/.exec(i), r = n ? n[1] || e : e, t = n ? String(n[2] || "") : "", t || !1; 14057 }, h.isTraditionalAnchor = function (e) { 14058 var t = !/[\/\?\.]/.test(e);return t; 14059 }, h.extractState = function (e, t) { 14060 var n = null, 14061 r, 14062 i;return t = t || !1, r = h.extractId(e), r && (n = h.getStateById(r)), n || (i = h.getFullUrl(e), r = h.getIdByUrl(i) || !1, r && (n = h.getStateById(r)), !n && t && !h.isTraditionalAnchor(e) && (n = h.createStateObject(null, null, i))), n; 14063 }, h.getIdByUrl = function (e) { 14064 var n = h.urlToId[e] || h.store.urlToId[e] || t;return n; 14065 }, h.getLastSavedState = function () { 14066 return h.savedStates[h.savedStates.length - 1] || t; 14067 }, h.getLastStoredState = function () { 14068 return h.storedStates[h.storedStates.length - 1] || t; 14069 }, h.hasUrlDuplicate = function (e) { 14070 var t = !1, 14071 n;return n = h.extractState(e.url), t = n && n.id !== e.id, t; 14072 }, h.storeState = function (e) { 14073 return h.urlToId[e.url] = e.id, h.storedStates.push(h.cloneObject(e)), e; 14074 }, h.isLastSavedState = function (e) { 14075 var t = !1, 14076 n, 14077 r, 14078 i;return h.savedStates.length && (n = e.id, r = h.getLastSavedState(), i = r.id, t = n === i), t; 14079 }, h.saveState = function (e) { 14080 return h.isLastSavedState(e) ? !1 : (h.savedStates.push(h.cloneObject(e)), !0); 14081 }, h.getStateByIndex = function (e) { 14082 var t = null;return typeof e == "undefined" ? t = h.savedStates[h.savedStates.length - 1] : e < 0 ? t = h.savedStates[h.savedStates.length + e] : t = h.savedStates[e], t; 14083 }, h.getCurrentIndex = function () { 14084 var e = null;return h.savedStates.length < 1 ? e = 0 : e = h.savedStates.length - 1, e; 14085 }, h.getHash = function (e) { 14086 var t = h.getLocationHref(e), 14087 n;return n = h.getHashByUrl(t), n; 14088 }, h.unescapeHash = function (e) { 14089 var t = h.normalizeHash(e);return t = decodeURIComponent(t), t; 14090 }, h.normalizeHash = function (e) { 14091 var t = e.replace(/[^#]*#/, "").replace(/#.*/, "");return t; 14092 }, h.setHash = function (e, t) { 14093 var n, i;return t !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.setHash, args: arguments, queue: t }), !1) : (h.busy(!0), n = h.extractState(e, !0), n && !h.emulated.pushState ? h.pushState(n.data, n.title, n.url, !1) : h.getHash() !== e && (h.bugs.setHash ? (i = h.getPageUrl(), h.pushState(null, null, i + "#" + e, !1)) : r.location.hash = e), h); 14094 }, h.escapeHash = function (t) { 14095 var n = h.normalizeHash(t);return n = e.encodeURIComponent(n), h.bugs.hashEscape || (n = n.replace(/\%21/g, "!").replace(/\%26/g, "&").replace(/\%3D/g, "=").replace(/\%3F/g, "?")), n; 14096 }, h.getHashByUrl = function (e) { 14097 var t = String(e).replace(/([^#]*)#?([^#]*)#?(.*)/, "$2");return t = h.unescapeHash(t), t; 14098 }, h.setTitle = function (e) { 14099 var t = e.title, 14100 n;t || (n = h.getStateByIndex(0), n && n.url === e.url && (t = n.title || h.options.initialTitle));try { 14101 r.getElementsByTagName("title")[0].innerHTML = t.replace("<", "<").replace(">", ">").replace(" & ", " & "); 14102 } catch (i) {}return r.title = t, h; 14103 }, h.queues = [], h.busy = function (e) { 14104 typeof e != "undefined" ? h.busy.flag = e : typeof h.busy.flag == "undefined" && (h.busy.flag = !1);if (!h.busy.flag) { 14105 u(h.busy.timeout);var t = function () { 14106 var e, n, r;if (h.busy.flag) return;for (e = h.queues.length - 1; e >= 0; --e) { 14107 n = h.queues[e];if (n.length === 0) continue;r = n.shift(), h.fireQueueItem(r), h.busy.timeout = o(t, h.options.busyDelay); 14108 } 14109 };h.busy.timeout = o(t, h.options.busyDelay); 14110 }return h.busy.flag; 14111 }, h.busy.flag = !1, h.fireQueueItem = function (e) { 14112 return e.callback.apply(e.scope || h, e.args || []); 14113 }, h.pushQueue = function (e) { 14114 return h.queues[e.queue || 0] = h.queues[e.queue || 0] || [], h.queues[e.queue || 0].push(e), h; 14115 }, h.queue = function (e, t) { 14116 return typeof e == "function" && (e = { callback: e }), typeof t != "undefined" && (e.queue = t), h.busy() ? h.pushQueue(e) : h.fireQueueItem(e), h; 14117 }, h.clearQueue = function () { 14118 return h.busy.flag = !1, h.queues = [], h; 14119 }, h.stateChanged = !1, h.doubleChecker = !1, h.doubleCheckComplete = function () { 14120 return h.stateChanged = !0, h.doubleCheckClear(), h; 14121 }, h.doubleCheckClear = function () { 14122 return h.doubleChecker && (u(h.doubleChecker), h.doubleChecker = !1), h; 14123 }, h.doubleCheck = function (e) { 14124 return h.stateChanged = !1, h.doubleCheckClear(), h.bugs.ieDoubleCheck && (h.doubleChecker = o(function () { 14125 return h.doubleCheckClear(), h.stateChanged || e(), !0; 14126 }, h.options.doubleCheckInterval)), h; 14127 }, h.safariStatePoll = function () { 14128 var t = h.extractState(h.getLocationHref()), 14129 n;if (!h.isLastSavedState(t)) return n = t, n || (n = h.createStateObject()), h.Adapter.trigger(e, "popstate"), h;return; 14130 }, h.back = function (e) { 14131 return e !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.back, args: arguments, queue: e }), !1) : (h.busy(!0), h.doubleCheck(function () { 14132 h.back(!1); 14133 }), p.go(-1), !0); 14134 }, h.forward = function (e) { 14135 return e !== !1 && h.busy() ? (h.pushQueue({ scope: h, callback: h.forward, args: arguments, queue: e }), !1) : (h.busy(!0), h.doubleCheck(function () { 14136 h.forward(!1); 14137 }), p.go(1), !0); 14138 }, h.go = function (e, t) { 14139 var n;if (e > 0) for (n = 1; n <= e; ++n) h.forward(t);else { 14140 if (!(e < 0)) throw new Error("History.go: History.go requires a positive or negative integer passed.");for (n = -1; n >= e; --n) h.back(t); 14141 }return h; 14142 };if (h.emulated.pushState) { 14143 var v = function () {};h.pushState = h.pushState || v, h.replaceState = h.replaceState || v; 14144 } else h.onPopState = function (t, n) { 14145 var r = !1, 14146 i = !1, 14147 s, 14148 o;return h.doubleCheckComplete(), s = h.getHash(), s ? (o = h.extractState(s || h.getLocationHref(), !0), o ? h.replaceState(o.data, o.title, o.url, !1) : (h.Adapter.trigger(e, "anchorchange"), h.busy(!1)), h.expectedStateId = !1, !1) : (r = h.Adapter.extractEventData("state", t, n) || !1, r ? i = h.getStateById(r) : h.expectedStateId ? i = h.getStateById(h.expectedStateId) : i = h.extractState(h.getLocationHref()), i || (i = h.createStateObject(null, null, h.getLocationHref())), h.expectedStateId = !1, h.isLastSavedState(i) ? (h.busy(!1), !1) : (h.storeState(i), h.saveState(i), h.setTitle(i), h.Adapter.trigger(e, "statechange"), h.busy(!1), !0)); 14149 }, h.Adapter.bind(e, "popstate", h.onPopState), h.pushState = function (t, n, r, i) { 14150 if (h.getHashByUrl(r) && h.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if (i !== !1 && h.busy()) return h.pushQueue({ scope: h, callback: h.pushState, args: arguments, queue: i }), !1;h.busy(!0);var s = h.createStateObject(t, n, r);return h.isLastSavedState(s) ? h.busy(!1) : (h.storeState(s), h.expectedStateId = s.id, p.pushState(s.id, s.title, s.url), h.Adapter.trigger(e, "popstate")), !0; 14151 }, h.replaceState = function (t, n, r, i) { 14152 if (h.getHashByUrl(r) && h.emulated.pushState) throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if (i !== !1 && h.busy()) return h.pushQueue({ scope: h, callback: h.replaceState, args: arguments, queue: i }), !1;h.busy(!0);var s = h.createStateObject(t, n, r);return h.isLastSavedState(s) ? h.busy(!1) : (h.storeState(s), h.expectedStateId = s.id, p.replaceState(s.id, s.title, s.url), h.Adapter.trigger(e, "popstate")), !0; 14153 };if (s) {
14154 try { 14155 h.store = l.parse(s.getItem("History.store")) || {}; 14156 } catch (m) { 14157 h.store = {}; 14158 }h.normalizeStore(); 14159 } else h.store = {}, h.normalizeStore();h.Adapter.bind(e, "unload", h.clearAllIntervals), h.saveState(h.storeState(h.extractState(h.getLocationHref(), !0))), s && (h.onUnload = function () { 14160 var e, t, n;try { 14161 e = l.parse(s.getItem("History.store")) || {}; 14162 } catch (r) { 14163 e = {}; 14164 }e.idToState = e.idToState || {}, e.urlToId = e.urlToId || {}, e.stateToId = e.stateToId || {};for (t in h.idToState) { 14165 if (!h.idToState.hasOwnProperty(t)) continue;e.idToState[t] = h.idToState[t]; 14166 }for (t in h.urlToId) { 14167 if (!h.urlToId.hasOwnProperty(t)) continue;e.urlToId[t] = h.urlToId[t]; 14168 }for (t in h.stateToId) { 14169 if (!h.stateToId.hasOwnProperty(t)) continue;e.stateToId[t] = h.stateToId[t]; 14170 }h.store = e, h.normalizeStore(), n = l.stringify(e);try { 14171 s.setItem("History.store", n); 14172 } catch (i) { 14173 if (i.code !== DOMException.QUOTA_EXCEEDED_ERR) throw i;s.length && (s.removeItem("History.store"), s.setItem("History.store", n)); 14174 } 14175 }, h.intervalList.push(a(h.onUnload, h.options.storeInterval)), h.Adapter.bind(e, "beforeunload", h.onUnload), h.Adapter.bind(e, "unload", h.onUnload));if (!h.emulated.pushState) { 14176 h.bugs.safariPoll && h.intervalList.push(a(h.safariStatePoll, h.options.safariPollInterval));if (i.vendor === "Apple Computer, Inc." || (i.appCodeName || "") === "Mozilla") h.Adapter.bind(e, "hashchange", function () { 14177 h.Adapter.trigger(e, "popstate"); 14178 }), h.getHash() && h.Adapter.onDomLoad(function () { 14179 h.Adapter.trigger(e, "hashchange"); 14180 }); 14181 } 14182 }, (!h.options || !h.options.delayInit) && h.init(); 14183}(window); 14184/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(0))) 14185 14186/***/ }), 14187/* 31 */ 14188/***/ (function(module, exports, __webpack_require__) { 14189 14190var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! 14191 * jQuery Cookie Plugin v1.4.1 14192 * https://github.com/carhartl/jquery-cookie 14193 * 14194 * Copyright 2006, 2014 Klaus Hartl 14195 * Released under the MIT license 14196 */ 14197(function (a) { 14198 if (true) { 14199 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(0)], __WEBPACK_AMD_DEFINE_FACTORY__ = (a), 14200 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 14201 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 14202 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 14203 } else { 14204 if (typeof exports === "object") { 14205 module.exports = a(require("jquery")); 14206 } else { 14207 a(jQuery); 14208 } 14209 } 14210})(function (f) { 14211 var e = /\+/g;function a(i) { 14212 return b.raw ? i : encodeURIComponent(i); 14213 }function h(i) { 14214 return b.raw ? i : decodeURIComponent(i); 14215 }function g(i) { 14216 return a(b.json ? JSON.stringify(i) : String(i)); 14217 }function c(i) { 14218 if (i.indexOf('"') === 0) { 14219 i = i.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, "\\"); 14220 }try { 14221 i = decodeURIComponent(i.replace(e, " "));return b.json ? JSON.parse(i) : i; 14222 } catch (j) {} 14223 }function d(j, i) { 14224 var k = b.raw ? j : c(j);return f.isFunction(i) ? i(k) : k; 14225 }var b = f.cookie = function (s, r, p) { 14226 if (arguments.length > 1 && !f.isFunction(r)) { 14227 p = f.extend({}, b.defaults, p);if (typeof p.expires === "number") { 14228 var v = p.expires, 14229 w = p.expires = new Date();w.setMilliseconds(w.getMilliseconds() + v * 86400000); 14230 }return document.cookie = [a(s), "=", g(r), p.expires ? "; expires=" + p.expires.toUTCString() : "", p.path ? "; path=" + p.path : "", p.domain ? "; domain=" + p.domain : "", p.secure ? "; secure" : ""].join(""); 14231 }var q = s ? undefined : {}, 14232 u = document.cookie ? document.cookie.split("; ") : [], 14233 n = 0, 14234 k = u.length;for (; n < k; n++) { 14235 var m = u[n].split("="), 14236 j = h(m.shift()), 14237 o = m.join("=");if (s === j) { 14238 q = d(o, r);break; 14239 }if (!s && (o = d(o)) !== undefined) { 14240 q[j] = o; 14241 } 14242 }return q; 14243 };b.defaults = {};f.removeCookie = function (j, i) {
vendor: 7,876 bytes, lines 14244-14464
14244 f.cookie(j, "", f.extend({}, i, { expires: -1 }));return !f.cookie(j); 14245 }; 14246}); 14247 14248/***/ }), 14249/* 32 */ 14250/***/ (function(module, exports, __webpack_require__) { 14251 14252var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! 14253 * jQuery Mousewheel 3.1.13 14254 * 14255 * Copyright jQuery Foundation and other contributors 14256 * Released under the MIT license 14257 * http://jquery.org/license 14258 */ 14259 14260(function (factory) { 14261 if (true) { 14262 // AMD. Register as an anonymous module. 14263 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(0)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 14264 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 14265 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 14266 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 14267 } else if (typeof exports === 'object') { 14268 // Node/CommonJS style for Browserify 14269 module.exports = factory; 14270 } else { 14271 // Browser globals 14272 factory(jQuery); 14273 } 14274})(function ($) { 14275 14276 var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], 14277 toBind = 'onwheel' in document || document.documentMode >= 9 ? ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], 14278 slice = Array.prototype.slice, 14279 nullLowestDeltaTimeout, 14280 lowestDelta; 14281 14282 if ($.event.fixHooks) { 14283 for (var i = toFix.length; i;) { 14284 $.event.fixHooks[toFix[--i]] = $.event.mouseHooks; 14285 } 14286 } 14287 14288 var special = $.event.special.mousewheel = { 14289 version: '3.1.12', 14290 14291 setup: function () { 14292 if (this.addEventListener) { 14293 for (var i = toBind.length; i;) { 14294 this.addEventListener(toBind[--i], handler, false); 14295 } 14296 } else { 14297 this.onmousewheel = handler; 14298 } 14299 // Store the line height and page height for this particular element 14300 $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); 14301 $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); 14302 }, 14303 14304 teardown: function () { 14305 if (this.removeEventListener) { 14306 for (var i = toBind.length; i;) { 14307 this.removeEventListener(toBind[--i], handler, false); 14308 } 14309 } else { 14310 this.onmousewheel = null; 14311 } 14312 // Clean up the data we added to the element 14313 $.removeData(this, 'mousewheel-line-height'); 14314 $.removeData(this, 'mousewheel-page-height'); 14315 }, 14316 14317 getLineHeight: function (elem) { 14318 var $elem = $(elem), 14319 $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); 14320 if (!$parent.length) { 14321 $parent = $('body'); 14322 } 14323 return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; 14324 }, 14325 14326 getPageHeight: function (elem) { 14327 return $(elem).height(); 14328 }, 14329 14330 settings: { 14331 adjustOldDeltas: true, // see shouldAdjustOldDeltas() below 14332 normalizeOffset: true // calls getBoundingClientRect for each event 14333 } 14334 }; 14335 14336 $.fn.extend({ 14337 mousewheel: function (fn) { 14338 return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); 14339 }, 14340 14341 unmousewheel: function (fn) { 14342 return this.unbind('mousewheel', fn); 14343 } 14344 }); 14345 14346 function handler(event) { 14347 var orgEvent = event || window.event, 14348 args = slice.call(arguments, 1), 14349 delta = 0, 14350 deltaX = 0, 14351 deltaY = 0, 14352 absDelta = 0, 14353 offsetX = 0, 14354 offsetY = 0; 14355 event = $.event.fix(orgEvent); 14356 event.type = 'mousewheel'; 14357 14358 // Old school scrollwheel delta 14359 if ('detail' in orgEvent) { 14360 deltaY = orgEvent.detail * -1; 14361 } 14362 if ('wheelDelta' in orgEvent) { 14363 deltaY = orgEvent.wheelDelta; 14364 } 14365 if ('wheelDeltaY' in orgEvent) { 14366 deltaY = orgEvent.wheelDeltaY; 14367 } 14368 if ('wheelDeltaX' in orgEvent) { 14369 deltaX = orgEvent.wheelDeltaX * -1; 14370 } 14371 14372 // Firefox < 17 horizontal scrolling related to DOMMouseScroll event 14373 if ('axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS) { 14374 deltaX = deltaY * -1; 14375 deltaY = 0; 14376 } 14377 14378 // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy 14379 delta = deltaY === 0 ? deltaX : deltaY; 14380 14381 // New school wheel delta (wheel event) 14382 if ('deltaY' in orgEvent) { 14383 deltaY = orgEvent.deltaY * -1; 14384 delta = deltaY; 14385 } 14386 if ('deltaX' in orgEvent) { 14387 deltaX = orgEvent.deltaX; 14388 if (deltaY === 0) { 14389 delta = deltaX * -1; 14390 } 14391 } 14392 14393 // No change actually happened, no reason to go any further 14394 if (deltaY === 0 && deltaX === 0) { 14395 return; 14396 } 14397 14398 // Need to convert lines and pages to pixels if we aren't already in pixels 14399 // There are three delta modes: 14400 // * deltaMode 0 is by pixels, nothing to do 14401 // * deltaMode 1 is by lines 14402 // * deltaMode 2 is by pages 14403 if (orgEvent.deltaMode === 1) { 14404 var lineHeight = $.data(this, 'mousewheel-line-height'); 14405 delta *= lineHeight; 14406 deltaY *= lineHeight; 14407 deltaX *= lineHeight; 14408 } else if (orgEvent.deltaMode === 2) { 14409 var pageHeight = $.data(this, 'mousewheel-page-height'); 14410 delta *= pageHeight; 14411 deltaY *= pageHeight; 14412 deltaX *= pageHeight; 14413 } 14414 14415 // Store lowest absolute delta to normalize the delta values 14416 absDelta = Math.max(Math.abs(deltaY), Math.abs(deltaX)); 14417 14418 if (!lowestDelta || absDelta < lowestDelta) { 14419 lowestDelta = absDelta; 14420 14421 // Adjust older deltas if necessary 14422 if (shouldAdjustOldDeltas(orgEvent, absDelta)) { 14423 lowestDelta /= 40; 14424 } 14425 } 14426 14427 // Adjust older deltas if necessary 14428 if (shouldAdjustOldDeltas(orgEvent, absDelta)) { 14429 // Divide all the things by 40! 14430 delta /= 40; 14431 deltaX /= 40; 14432 deltaY /= 40; 14433 } 14434 14435 // Get a whole, normalized value for the deltas 14436 delta = Math[delta >= 1 ? 'floor' : 'ceil'](delta / lowestDelta); 14437 deltaX = Math[deltaX >= 1 ? 'floor' : 'ceil'](deltaX / lowestDelta); 14438 deltaY = Math[deltaY >= 1 ? 'floor' : 'ceil'](deltaY / lowestDelta); 14439 14440 // Normalise offsetX and offsetY properties 14441 if (special.settings.normalizeOffset && this.getBoundingClientRect) { 14442 var boundingRect = this.getBoundingClientRect(); 14443 offsetX = event.clientX - boundingRect.left; 14444 offsetY = event.clientY - boundingRect.top; 14445 } 14446 14447 // Add information to the event object 14448 event.deltaX = deltaX; 14449 event.deltaY = deltaY; 14450 event.deltaFactor = lowestDelta; 14451 event.offsetX = offsetX; 14452 event.offsetY = offsetY; 14453 // Go ahead and set deltaMode to 0 since we converted to pixels 14454 // Although this is a little odd since we overwrite the deltaX/Y 14455 // properties with normalized deltas. 14456 event.deltaMode = 0; 14457 14458 // Add event and delta to the front of the arguments 14459 args.unshift(event, delta, deltaX, deltaY); 14460 14461 // Clearout lowestDelta after sometime to better 14462 // handle multiple device types that give different 14463 // a different lowestDelta 14464 // Ex: trackpad = 3 and mouse wheel = 120
14465 if (nullLowestDeltaTimeout) { 14466 clearTimeout(nullLowestDeltaTimeout); 14467 } 14468 nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); 14469 14470 return ($.event.dispatch || $.event.handle).apply(this, args); 14471 } 14472 14473 function nullLowestDelta() { 14474 lowestDelta = null; 14475 } 14476 14477 function shouldAdjustOldDeltas(orgEvent, absDelta) { 14478 // If this is an older event and the delta is divisable by 120, 14479 // then we are assuming that the browser is treating this as an 14480 // older mouse wheel event and that we should divide the deltas 14481 // by 40 to try and get a more usable deltaFactor. 14482 // Side note, this actually impacts the reported scroll distance 14483 // in older browsers and can cause scrolling to be slower than native. 14484 // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. 14485 return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; 14486 } 14487}); 14488 14489/***/ }), 14490/* 33 */, 14491/* 34 */, 14492/* 35 */ 14493/***/ (function(module, __webpack_exports__, __webpack_require__) { 14494 14495"use strict"; 14496Object.defineProperty(__webpack_exports__, "__esModule", { value: true }); 14497/* WEBPACK VAR INJECTION */(function($) {/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery__ = __webpack_require__(0); 14498/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_jquery___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_jquery__); 14499/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_jquery_history__ = __webpack_require__(30); 14500/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_jquery_history___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_jquery_history__); 14501/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_jquery_cookie__ = __webpack_require__(31); 14502/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_jquery_cookie___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_jquery_cookie__); 14503/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_jqWheel__ = __webpack_require__(32); 14504/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_jqWheel___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_jqWheel__); 14505/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_iscroll__ = __webpack_require__(36); 14506/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_iscroll___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_iscroll__); 14507/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_slick__ = __webpack_require__(27); 14508/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5_slick___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_5_slick__); 14509/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__lib_slick_slick_css__ = __webpack_require__(28); 14510/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__lib_slick_slick_css___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_6__lib_slick_slick_css__); 14511/* eslint no-loop-func: 0 */ 14512/* eslint no-unused-vars: 0 */ 14513/* eslint prefer-destructuring: ["off", {VariableDeclarator: {object: false}}] */ 14514/* eslint no-lonely-if: "off" */ 14515/* eslint max-len: ["off", { "code": 200 }] */ 14516/* eslint no-undef: "off" */ 14517/* eslint func-names: ["error", "never"] */ 14518/* eslint consistent-return: "off" */ 14519/* eslint no-restricted-globals: ["off", "screen"] */ 14520/** 14521 * ------------------------------------------------------------------ 14522 * é¦é¡µäºå¨ 14523 * ------------------------------------------------------------------ 14524 * 14525 * @date 2018-01-05 14526 * @author æ²å (å),telliex<[email protected]>(æ¹) 14527 */ 14528 14529/** 14530 * ------------------------------------------------------------------ 14531 * é¦é¡µäºå¨ 14532 * ------------------------------------------------------------------ 14533 * 14534 * isMobileDevice ç¨ä¾å¤æ·æ¡æ©0 ææ©1 æ¡æ©ç¸®æææ©çæ 2 14535 14536 */ 14537 14538 14539 14540 14541 14542 14543 14544 14545// import '../lib/slick/slick-theme.css'; 14546// import 'jqMobile'; 14547 14548$(() => { 14549 // è¨å®å ä»¶ 14550 const $window = $(window); 14551 let windowHeight = 0; // è§çªé«åº¦ 14552 let windoWidth = 0; // è§çªå®½åº¦ 14553 let isMobileDevice = 0; // æ¯å¦ä¸ºææè£ ç½® 14554 let isFirstScreenLoaded = 0; // 第ä¸å±æ¯å¦å·²è½½å ¥ 14555 let isScreenMove = 0; // screen åæ¢ä¸ 14556 let isScreenInMove = 0; // 第äºå±äºå¨æ¯å¦æ»å¨ä¸ 14557 let popIndexOfScreen = 0; // 第äºå± pop index 14558 let curVideoIndex = 0; // å½å video index 14559 let isvideorun = 0; 14560 let videofunc; // video è½®æ 14561 let isvidover = 0;
14562 let isPopBlockShowed = 0; 14563 let currentScreen = 0; // å½åå± 14564 let tempopen = 0; 14565 let orientation = ''; // ä¸å¼å§è¿é¡µé¢æ¶è£ ç½®çæ¹å portrait or landscape 14566 let orientationStatus = false; // æ¯å¦å ä¸ºè£ ç½®è½¬å触å 14567 // let scrollTimer; // window scroll timmer 14568 let resizeTimer; // window resize timmer 14569 const itemNavList = $('#headerForMobile .main-nav-list'); 14570 14571 $('#headerForDesktop').hide(); 14572 $('#headerForMobile').hide(); 14573 $('#home-menu').hide(); 14574 $('#home-step').hide(); 14575 // $('#firstScreenBGViaDesktop').css('opacity', 0); 14576 // $('#firstScreenBGViaMobile').css('opacity', 0); 14577 // $('#indexcut1content').css('opacity', 0); 14578 14579 $('#footer').hide(); 14580 14581 // function tap(element, callBack) { 14582 // // 触æ¸å¼å§çæ¶é´ 14583 // let startTime = 0; 14584 // // å®ä¹touchmoveæ¯å¦è§¦å 14585 // let ismove = false; 14586 // const maxTime = 250; 14587 // let target; 14588 // element.on('touchstart', (e) => { 14589 // startTime = Date.now(); 14590 // ismove = false; 14591 // target = e; 14592 // return false; 14593 // }); 14594 14595 // element.on('touchmove', (e) => { 14596 // //触åå°±èµå¼ä¸ºtrue 14597 // ismove = true; 14598 // return false; 14599 // }); 14600 14601 // element.on('touchend', function (e) { 14602 // // 夿æ¯å¦æ¯touchmoveæ¯å¦è§¦å 14603 // if (ismove) { 14604 // return; 14605 // } 14606 14607 // // 夿æ¯å¦ä¸ºé¿æ 14608 // if ((Date.now() - startTime) > maxTime) { 14609 // return; 14610 // } 14611 14612 // // 妿è½å¤å°è¿é 14613 // callBack($(this)); 14614 // return false; 14615 // }); 14616 // } 14617 14618 /* 14619 | RWD è§å 14620 */ 14621 function checkViewport(viewportF) { 14622 if (viewportF >= 1360) { 14623 return 'desktop'; 14624 } else if (viewportF >= 960 && viewportF < 1360) { 14625 return 'desktop'; 14626 } else if (viewportF >= 768 && viewportF < 960) { 14627 return 'mobile'; 14628 } 14629 return 'mobile'; 14630 } 14631 /* 14632 | å½åç»é¢å®½åº¦ 14633 */ 14634 function viewport() { 14635 let e = window; 14636 let a = 'inner'; 14637 if (!('innerWidth' in window)) { 14638 a = 'client'; 14639 e = document.documentElement || document.body; 14640 } 14641 return e[`${a}Width`]; 14642 } 14643 14644 /* 14645 | Screen3 Video æ é¢å icon å¾ç¤ºæ´æ¢ 14646 */ 14647 function videoone() { 14648 const temp = `text${curVideoIndex}`; 14649 $('.indexcut3-title').html($('.indexcut3-title').data(temp)); 14650 $('.cut3video').hide(); 14651 $('.cut3video').eq(curVideoIndex).fadeIn(300); 14652 14653 const video = $(`#video${curVideoIndex}`).get(0); 14654 if (video.readyState === 4) { 14655 // alert("AA"); 14656 video.currentTime = 0; 14657 video.play(); 14658 } 14659 // $(".cut3video").eq(curVideoIndex).currentTime = 0; 14660 for (let b = 0; b < $('.indexcut3click').length; b += 1) { 14661 if (b === curVideoIndex) { 14662 $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}x.png`); 14663 } else { 14664 $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}.png`); 14665 } 14666 } 14667 } 14668 /* 14669 | Screen3 å¾çæ¿æ¢ 14670 */ 14671 function changcut3img() { 14672 for (let b = 0; b < $('.indexcut3click').length; b += 1) { 14673 if (b === curVideoIndex) { 14674 $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}x.png`); 14675 } else if (isMobileDevice === 0) { 14676 $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}.png`); 14677 } else { 14678 $('.indexcut3click').eq(b).attr('src', `img/${$('.indexcut3click').eq(b).data('src')}b.png`); 14679 } 14680 } 14681 } 14682 /* 14683 | Screen3 Video è½®æ 14684 */ 14685 function runvideos() { 14686 // å¯¼å ¥æé®å¾ç 14687 changcut3img(); 14688 if (isMobileDevice === 0) { 14689 $('.indexcut3mc').hide(); 14690 if (isvideorun === 0) { 14691 isvideorun = 1; 14692 videoone(); 14693 videofunc = setInterval(() => { 14694 if (isvidover === 0) { 14695 curVideoIndex += 1; 14696 if (curVideoIndex >= $('.cut3video').length) { 14697 curVideoIndex = 0; 14698 } 14699 } 14700 videoone(); 14701 }, 3300); 14702 } 14703 } else { 14704 $('.cut3video').hide(); 14705 if (isvideorun === 1) { 14706 clearInterval(videofunc); 14707 isvideorun = 0; 14708 } 14709 $('.indexcut3mc').hide(); 14710 $('.indexcut3mc').eq(curVideoIndex).show(); 14711 } 14712 } 14713 /* 14714 | 忢 Screen FN ï¼ç¨äºå·å¨æ¶æ¢å± 14715 */ 14716 function scrollSlide(direction) { 14717 // è¥é¸å®é®ç½©åºç¾çæ æ³ä¸åæå±ï¼åæ¶åé¸å®é®ç½© 14718 if ($('body').hasClass('screen-mask')) { 14719 itemNavList.slideToggle(); 14720 $('#headerForMobile .panel-btn-icon').toggleClass('status-close'); 14721 $('body').toggleClass('screen-mask'); 14722 } 14723 14724 if (isFirstScreenLoaded === 1) { 14725 // çé¦é è®å® 14726 const fNum = $('.fullcutwrap').length; 14727 let nextScreen; 14728 14729 if (direction === 'U') { 14730 nextScreen = currentScreen - 1; 14731 } else { 14732 nextScreen = currentScreen + 1; 14733 } 14734 14735 if (nextScreen < 0) { 14736 nextScreen = 0; 14737 } else if (nextScreen >= fNum) { 14738 nextScreen = fNum - 1; 14739 } 14740 14741 if (nextScreen === currentScreen) { 14742 14743 // .. 14744 } else { 14745 $('#bodywrap').animate({ top: -windowHeight * nextScreen }, 500); 14746 if (nextScreen === 0) { 14747 if ($('#headerForMobile').css('display') === 'block') { 14748 $('#headerForMobile').fadeOut(600); 14749 } 14750 if (checkViewport(viewport()) === 'mobile') { 14751 // .. 14752 } else { 14753 $('#headerForDesktop').fadeIn(600); 14754 } 14755 } else { 14756 if (checkViewport(viewport()) === 'mobile') { 14757 $('#headerForMobile').fadeIn(600); 14758 } 14759 if ($('#headerForDesktop').css('display') === 'block') { 14760 $('#headerForDesktop').fadeOut(600); 14761 } 14762 } 14763 currentScreen = nextScreen; 14764 if (currentScreen === 0) { 14765 // 忢 Screen3 video è½®æ 14766 clearInterval(videofunc); 14767 isvideorun = 0; 14768 } else if (currentScreen === 1) { 14769 // 忢 Screen3 video è½®æ 14770 clearInterval(videofunc); 14771 isvideorun = 0; 14772 } else if (currentScreen === 2) { 14773 // å¯å¨ Screen3 video 14774 runvideos(); 14775 } 14776 } 14777 const homeIndex = nextScreen+1; 14778 $('#home-step ul li').removeClass('active'); 14779 $('#home-step ul li:nth-child('+homeIndex+')').addClass('active'); 14780 if (checkViewport(viewport()) === 'mobile') { 14781 if (homeIndex === 4) { 14782 $('#home-menu').hide(); 14783 } else { 14784 if (homeIndex > 1) { 14785 $('#home-menu').addClass('home-menu-oth'); 14786 } else { 14787 $('#home-menu').removeClass('home-menu-oth'); 14788 } 14789 $('#home-menu').show(); 14790 } 14791 } 14792 } 14793 } 14794 14795 /* 14796 | Screen1 Startï¼ç¬¬ä¸å±è¿å ¥ 14797 */ 14798 function firstScreenStart() { 14799 console.log('first'); 14800 // 第ä¸å±ç©ä»¶åå§åéè 14801 $('#indexcut1content').css('margin-top', -20).css('opacity', 0); 14802 $('#indexstartclick').css('opacity', 0); 14803 $('#home-step').css('opacity', 0); 14804 $('#home-menu').css('opacity', 0); 14805 $('#firstScreenBGViaDesktop').css('opacity', 0); 14806 $('#firstScreenBGViaMobile').css('opacity', 0); 14807 $('#indexpreload').css('width', 0).css('height', 0); 14808 $('#headerForDesktop').css('opacity', 0); 14809 14810 const tepimgp = new Image(); 14811 tepimgp.onload = function () { 14812 $('#indexpreload').stop().animate({ 14813 width: 124, height: 124, 'margin-top': -62, 'margin-left': -62, opacity: 1 14814 }, 500); 14815 let ximglist; 14816 let it; 14817 let il; 14818 let iw; 14819 let ih; 14820 let neww; 14821 let newh; 14822 14823 if (isMobileDevice === 1) { 14824 // ç§»å¨ææè£ ç½® 14825 ximglist = ['/img/cut1bg.jpg', 'img/indexcut11.png', 'img/indexcut21.jpg', 'img/indexcut22.jpg', 'img/indexcut23.jpg', 'img/indexcut24.jpg', 'img/indexcut21b.jpg', 'img/indexcut22b.jpg', 'img/indexcut23b.jpg', 'img/indexcut24b.jpg']; 14826 for (let i = 0; i < $('#firstScreenBGViaDesktop .image img').size(); i += 1) { 14827 ximglist.push($('#firstScreenBGViaDesktop .image img')[i].src); 14828 } 14829 for (let i = 0; i < $('#firstScreenBGViaMobile .image img').size(); i += 1) { 14830 ximglist.push($('#firstScreenBGViaMobile .image img')[i].src); 14831 } 14832 } else { 14833 // 'img/cut1bg.jpg', 'img/cut1bgm.jpg' 14834 ximglist = ['/img/cut1bg.jpg', '/img/cut1bgm.jpg', 'img/indexcut11.png', 'img/indexcut21.jpg', 'img/indexcut22.jpg', 'img/indexcut23.jpg', 'img/indexcut24.jpg', 'img/indexcut21b.jpg', 'img/indexcut22b.jpg', 'img/indexcut23b.jpg', 'img/indexcut24b.jpg']; 14835 for (let i = 0; i < $('#firstScreenBGViaDesktop .image img').size(); i += 1) { 14836 ximglist.push($('#firstScreenBGViaDesktop .image img')[i].src); 14837 } 14838 } 14839 let imgLoadedNum = ximglist.length; 14840 const imgArrayNum = ximglist.length; 14841 const tepimg = []; 14842 14843 for (let a = 0; a < imgArrayNum; a += 1) { 14844 tepimg[a] = new Image(); 14845 tepimg[a].onload = function () { 14846 imgLoadedNum -= 1; 14847 }; 14848 tepimg[a].src = ximglist[a]; 14849 } 14850 14851 // 侦å¬å¾çæ¯å¦è½½å® 14852 const chkload = setInterval(() => {
14853 if (imgLoadedNum <= 0) { 14854 // å¾çè½½å®è¿è¡åç»å·¥ä½ 14855 clearInterval(chkload); 14856 14857 $('#indexpreload').fadeOut(2000); 14858 14859 $('#headerForDesktop').stop().delay(2000).animate({ opacity: 1 }, 500); 14860 14861 // 第ä¸å±èæ¯å¾æ·¡å ¥ 14862 if (checkViewport(viewport()) === 'mobile') { 14863 // ææè£ ç½® 14864 $('#firstScreenBGViaDesktop').css('z-index', '-999'); 14865 $('#firstScreenBGViaMobile').css('z-index', '1'); 14866 14867 it = parseInt($('#firstScreenBGViaMobile').css('top'), 10); 14868 il = parseInt($('#firstScreenBGViaMobile').css('left'), 10); 14869 iw = $('#firstScreenBGViaMobile').width(); 14870 ih = $('#firstScreenBGViaMobile').height(); 14871 neww = iw * 1.1; 14872 newh = ih * 1.1; 14873 it -= (newh - ih) / 2; 14874 il -= (neww - iw) / 2; 14875 $('#firstScreenBGViaMobile').stop(true, true).delay(2000).animate({ opacity: 1 }, 500); 14876 } else { 14877 // æ¡æºè£ ç½® 14878 $('#firstScreenBGViaDesktop').css('z-index', '1'); 14879 $('#firstScreenBGViaMobile').css('z-index', '-999'); 14880 14881 it = parseInt($('#firstScreenBGViaDesktop').css('top'), 10); 14882 il = parseInt($('#firstScreenBGViaDesktop').css('left'), 10); 14883 iw = $('#firstScreenBGViaDesktop').width(); 14884 ih = $('#firstScreenBGViaDesktop').height(); 14885 neww = iw * 1.1; 14886 newh = ih * 1.1; 14887 it -= (newh - ih) / 2; 14888 il -= (neww - iw) / 2; 14889 $('#firstScreenBGViaDesktop').stop(true, true).delay(2000).animate({ opacity: 1 }, 500); 14890 } 14891 // 第ä¸å±æåæ·¡å ¥ 14892 $('#indexcut1content').stop().delay(3500).animate({ 'margin-top': 0, opacity: 1 }, 1500); 14893 // 第ä¸å±ç®å¤´æ·¡å ¥ 14894 $('#indexstartclick').stop().delay(4000).animate({ opacity: 1 }, 1500); 14895 $('#indexstartclick').addClass('arrow-animation'); 14896 $('#home-step').stop().delay(4000).animate({ opacity: 1 }, 1500); 14897 $('#home-menu').stop().delay(4000).animate({ opacity: 1 }, 1500); 14898 14899 isFirstScreenLoaded = 1; 14900 } 14901 }, 500); 14902 }; 14903 14904 tepimgp.src = 'img/loading.gif'; 14905 14906 if (isMobileDevice === 1) { 14907 // $('.fadeM').slick('unslick'); 14908 // $('.fadeM').unslick(); 14909 $('.fadeM').slick({ 14910 pauseOnFocus: true, 14911 autoplay: true, 14912 autoplaySpeed: 5000, 14913 dots: false, 14914 infinite: true, 14915 speed: 1000, 14916 arrows: false, 14917 fade: true, 14918 cssEase: 'linear' 14919 }); 14920 14921 $('.fadeM').on('afterChange', () => { 14922 const currentSlide = $('.fadeM').slick('slickCurrentSlide'); 14923 $('#bannerToURL').attr('href', $('.fadeM').find('img').eq(currentSlide).attr('data-url')); 14924 }); 14925 14926 // tap($("#indexstartclick"), function() { 14927 // scrollSlide("D"); 14928 // return false; 14929 // }) 14930 // ç¹å»å䏿é®å¾ä¸ç§»å¨å°ç¬¬2å± 14931 $('#indexstartclick').on('click', () => { 14932 scrollSlide('D'); 14933 return false; 14934 }); 14935 } else { 14936 $('.fadeD').slick({ 14937 pauseOnFocus: true, 14938 autoplay: true, 14939 adaptiveHeight: true, 14940 autoplaySpeed: 5000, 14941 dots: false, 14942 infinite: true, 14943 speed: 1000, 14944 arrows: false, 14945 fade: true, 14946 cssEase: 'linear' 14947 }); 14948 14949 $('.fadeD').on('afterChange', () => { 14950 const currentSlide = $('.fadeD').slick('slickCurrentSlide'); 14951 $('#bannerToURL').attr('href', $('.fadeD').find('img').eq(currentSlide).attr('data-url')); 14952 }); 14953 14954 $('.fadeD').on('destroy', () => {}); 14955 // ç¹å»å䏿é®å¾ä¸ç§»å¨å°ç¬¬2å± 14956 $('#indexstartclick').on('click', () => { 14957 scrollSlide('D'); 14958 return false; 14959 }); 14960 } 14961 } 14962 /* 14963 | Screen2 ç¹ç¹å¨ç» 14964 */ 14965 function showpopicon() { 14966 $('#index2icon span').removeClass('on'); 14967 $('#index2icon span').eq(popIndexOfScreen).addClass('on'); 14968 $('#index2icon').show(); 14969 isScreenInMove = 0; 14970 } 14971 14972 /* 14973 | Screen2 è slide å¨ç» 14974 */ 14975 function inSlide(x) { 14976 if (x === popIndexOfScreen) { 14977 // .. 14978 } else if (x > popIndexOfScreen) {
14979 // æ´»å¨åå®ä½ 14980 $('.indexcut2item').eq(x).children('.hidetext').css('left', '100%').css('z-index', '9999').show(); 14981 $('.indexcut2item').eq(popIndexOfScreen).children('.hidetext').css('z-index', '9998'); 14982 // å¼å§æ»å¨ 14983 $('.indexcut2item').eq(x).children('.hidetext').animate({ left: 0 }, 500, () => { 14984 $('.indexcut2item').eq(popIndexOfScreen).children('.hidetext').hide(); 14985 popIndexOfScreen = x; 14986 showpopicon(); 14987 }); 14988 } else { 14989 // å¨ç»å¾å³æ» 14990 // æ´»å¨åå®ä½ 14991 $('.indexcut2item').eq(x).children('.hidetext').css('left', '-100%').css('z-index', '9999').show(); 14992 $('.indexcut2item').eq(popIndexOfScreen).children('.hidetext').css('z-index', '9998'); 14993 // å¼å§æ»å¨ 14994 $('.indexcut2item').eq(x).children('.hidetext').animate({ left: 0 }, 500, () => { 14995 $('.indexcut2item').eq(popIndexOfScreen).children('.hidetext').hide(); 14996 popIndexOfScreen = x; 14997 showpopicon(); 14998 }); 14999 } 15000 } 15001 /* 15002 | Screen2 Startï¼ç¬¬äºå±è¿å ¥ 15003 */ 15004 function secondScreenStart() { 15005 if (isMobileDevice === 0) { 15006 // æ¡æºè£ ç½® 15007 // äºä»¶åå§å 15008 $('.indexcut2item').off('click'); 15009 $('.indexcut2item .hidetext .closeclick').off('click'); 15010 $('#index2icon span').off('click'); 15011 15012 $('.indexcut2item').on('mouseenter', function () { 15013 const index = $('.indexcut2item').index($(this)); 15014 for (let i = 0; i < 4; i += 1) { 15015 const moreon = 0; 15016 if (i === index) { 15017 $('.indexcut2item').eq(i).children('.itembg').stop().fadeIn(300); 15018 if (moreon === 1) { 15019 $('.indexcut2item').eq(i).children('.hidetext').stop().delay(500).fadeIn(500); 15020 } else { 15021 $('.indexcut2item').eq(i).children('.destext').stop().delay(500).fadeIn(500); 15022 } 15023 $('.indexcut2item').eq(i).children('.titletext').stop().hide(); // .fadeOut(200); 15024 $('.indexcut2item').eq(i).stop().animate({ width: '54.5%' }, 300); 15025 } else { 15026 $('.indexcut2item').eq(i).children('.titletext').stop().show(); 15027 $('.indexcut2item').eq(i).stop().animate({ width: '14.5%' }, 300); 15028 } 15029 } 15030 15031 $(this).find('.destext .more').click(function () { 15032 // moreon = 1; 15033 $(this).parents('.destext').stop().fadeOut(500); 15034 $(this).parents('.destext').siblings('.hidetext').stop().fadeIn(500); 15035 }); 15036 $('.indexcut2item .hidetext .more').click(function () { 15037 // moreon = 0; 15038 $(this).parents('.hidetext').stop().fadeOut(500); 15039 $(this).parents('.hidetext').siblings('.destext').stop().fadeIn(500); 15040 }); 15041 }); 15042 15043 $('.indexcut2item').on('mouseleave', () => { 15044 $('.indexcut2item .titletext').stop().show(); 15045 $('.indexcut2item').children('.itembg').stop().hide(); 15046 $('.indexcut2item .destext').stop().hide(); 15047 $('.indexcut2item .hidetext').stop().hide(); 15048 $('.indexcut2item').stop().animate({ width: '24.5%' }, 500); 15049 }); 15050 } else if (isMobileDevice === 1) { 15051 // ææè£ ç½® 15052 // tap($(".indexcut2item"), function(e) { 15053 15054 15055 // // ææè£ ç½®æä¼åºç° 15056 // if (isMobileDevice > 0 && isPopBlockShowed == 0) { 15057 15058 15059 // popIndexOfScreen = $(".indexcut2item").index(e); 15060 15061 // showpopicon(); 15062 // if (e.find(".hidetext").css("display") == "block") { 15063 15064 // } else { 15065 15066 // e.find(".hidetext").fadeIn(); 15067 15068 // } 15069 // isPopBlockShowed = 1; 15070 // } 15071 // return false; 15072 15073 15074 // }); 15075 15076 // tap($(".indexcut2item .hidetext .closeclick"), function(e) { 15077 15078 // if (isMobileDevice > 0) { 15079 15080 // e.parents(".hidetext").fadeOut(); 15081 // $("#index2icon").hide(); 15082 // $("#index2icon span").removeClass("on"); 15083 // isPopBlockShowed = 0; 15084 15085 // } 15086 // return false; 15087 // }); 15088 // tap($("#index2icon span"), function(e) { 15089 // if (isScreenInMove == 0) { 15090 // $("#index2icon").hide(); 15091 // let index = $("#index2icon span").index(e); 15092 // isScreenInMove = 1;
15093 // inSlide(index); 15094 15095 15096 // } 15097 // return false; 15098 // }); 15099 15100 $('.indexcut2item').on('click', function () { 15101 // ææè£ ç½®æä¼åºç° 15102 if (isMobileDevice > 0 && isPopBlockShowed === 0) { 15103 isPopBlockShowed = 1; 15104 popIndexOfScreen = $('.indexcut2item').index($(this)); 15105 showpopicon(); 15106 if ($(this).children('.hidetext').css('display') === 'block') { 15107 // .. 15108 } else { 15109 $(this).children('.hidetext').fadeIn(); 15110 } 15111 } 15112 return false; 15113 }); 15114 15115 $('.indexcut2item .hidetext .closeclick').on('click', function () { 15116 if (isMobileDevice > 0) { 15117 $(this).parents('.hidetext').fadeOut(); 15118 $('#index2icon').hide(); 15119 $('#index2icon span').removeClass('on'); 15120 isPopBlockShowed = 0; 15121 } 15122 return false; 15123 }); 15124 $('#index2icon span').on('click', function () { 15125 if (isScreenInMove === 0) { 15126 $('#index2icon').hide(); 15127 const index = $('#index2icon span').index($(this)); 15128 isScreenInMove = 1; 15129 inSlide(index); 15130 } 15131 return false; 15132 }); 15133 } else { 15134 // æ¡æ©è£ç½®ç¸®å°å°ææè£ç½®å¤§å° 15135 // äºä»¶åå§å 15136 $('.indexcut2item').off('mouseenter'); 15137 $('.indexcut2item').off('mouseleave'); 15138 15139 $('.indexcut2item').on('click', function () { 15140 // ææè£ ç½®æä¼åºç° 15141 if (isMobileDevice > 0 && isPopBlockShowed === 0) { 15142 isPopBlockShowed = 1; 15143 popIndexOfScreen = $('.indexcut2item').index($(this)); 15144 showpopicon(); 15145 if ($(this).children('.hidetext').css('display') === 'block') { 15146 // .. 15147 } else { 15148 $(this).children('.hidetext').fadeIn(); 15149 } 15150 } 15151 return false; 15152 }); 15153 15154 $('.indexcut2item .hidetext .closeclick').on('click', function () { 15155 if (isMobileDevice > 0) { 15156 $(this).parents('.hidetext').fadeOut(); 15157 $('#index2icon').hide(); 15158 $('#index2icon span').removeClass('on'); 15159 isPopBlockShowed = 0; 15160 } 15161 return false; 15162 }); 15163 $('#index2icon span').on('click', function () { 15164 if (isScreenInMove === 0) { 15165 $('#index2icon').hide(); 15166 const index = $('#index2icon span').index($(this)); 15167 isScreenInMove = 1; 15168 inSlide(index); 15169 } 15170 return false; 15171 }); 15172 } 15173 } 15174 15175 /* 15176 | Screen3 Start 15177 */ 15178 function thirdScreenViaPad() { 15179 let lastY; 15180 let lastX; 15181 $('#headerForMobile').hide(600); 15182 $('home-menu').hide(600); 15183 15184 $('.indexcut3click').mouseenter(function () { 15185 isvidover = 1; 15186 if (isvideorun === 1) { 15187 clearInterval(videofunc); 15188 isvideorun = 0; 15189 } 15190 curVideoIndex = $(this).data('val'); 15191 runvideos(); 15192 }); 15193 $('.indexcut3click').mouseleave(() => { 15194 isvidover = 0; 15195 }); 15196 15197 if (isMobileDevice === 0) {// æ¡æ© 15198 15199 } else if (isMobileDevice === 1) { 15200 // ææè£ç½® 15201 $('body').bind('touchstart', e => { 15202 // 夿é»è®¤è¡ä¸ºæ¯å¦å¯ä»¥è¢«ç¦ç¨ 15203 // if (e.cancelable) { 15204 // // 夿é»è®¤è¡ä¸ºæ¯å¦å·²ç»è¢«ç¦ç¨ 15205 // if (!e.defaultPrevented) { 15206 // e.preventDefault(); 15207 // } 15208 // } 15209 15210 if (isPopBlockShowed === 0) { 15211 const currentY = e.originalEvent.touches[0].clientY; 15212 const currentX = e.originalEvent.touches[0].clientX; 15213 lastY = currentY; 15214 lastX = currentX; 15215 } else { 15216 const currentX = e.originalEvent.touches[0].clientX; 15217 lastX = currentX; 15218 } 15219 }); 15220 15221 $('body').bind('touchend', e => { 15222 // 夿é»è®¤è¡ä¸ºæ¯å¦å¯ä»¥è¢«ç¦ç¨ 15223 // if (e.cancelable) { 15224 // // 夿é»è®¤è¡ä¸ºæ¯å¦å·²ç»è¢«ç¦ç¨ 15225 // if (!e.defaultPrevented) { 15226 // e.preventDefault(); 15227 // } 15228 // } 15229 15230 if (isPopBlockShowed === 0) { 15231 const currentY = e.originalEvent.changedTouches[0].clientY; 15232 const currentX = e.originalEvent.changedTouches[0].clientX; 15233 if (Math.abs(currentX - lastX) > Math.abs(currentY - lastY) && parseInt($('.fullcutwrap').eq(2).css('top'), 10) === 0) { 15234 // æ£å¨ç¬¬ä¸é 15235 if (currentX > lastX) { 15236 isvidover = 1; 15237 if (isvideorun === 1) { 15238 clearInterval(videofunc); 15239 isvideorun = 0; 15240 } 15241 curVideoIndex -= 1; 15242 if (curVideoIndex < 0) { 15243 curVideoIndex = $('.indexcut3mc').length - 1; 15244 } else if (curVideoIndex >= $('.indexcut3mc').length) { 15245 curVideoIndex = 0; 15246 } 15247 runvideos(); 15248 } else { 15249 isvidover = 1; 15250 if (isvideorun === 1) { 15251 clearInterval(videofunc); 15252 isvideorun = 0; 15253 } 15254 curVideoIndex += 1; 15255 if (curVideoIndex < 0) { 15256 curVideoIndex = $('.indexcut3mc').length - 1; 15257 } else if (curVideoIndex >= $('.indexcut3mc').length) { 15258 curVideoIndex = 0; 15259 } 15260 runvideos(); 15261 } 15262 } else if (currentY > lastY && currentY - lastY > 20 && isScreenMove === 0) { 15263 isScreenMove = 1; 15264 scrollSlide('U'); 15265 setTimeout(() => { 15266 isScreenMove = 0; 15267 }, 1500); 15268 } else if (currentY < lastY && lastY - currentY > 20 && isScreenMove === 0) { 15269 isScreenMove = 1; 15270 scrollSlide('D'); 15271 setTimeout(() => { 15272 isScreenMove = 0; 15273 }, 1500); 15274 } 15275 } else { 15276 // æ£æµç¬¬äºå±åå·¦æåå³ 15277 const currentX = e.originalEvent.changedTouches[0].clientX; 15278 if (currentX > lastX && currentX - lastX > 20 && isScreenInMove === 0) { 15279 // å峿» && è·ç¦»è¶ è¿20 && ææ§è£ ç½® 15280 isScreenInMove = 1; // äºå¨ä¸
15281 inSlide(popIndexOfScreen - 1); 15282 setTimeout(() => { 15283 isScreenInMove = 0; 15284 }, 800); // äºå¨ç»æ 15285 } else if (currentX < lastX && lastX - currentX > 20 && isScreenInMove === 0) { 15286 // åå·¦æ» && è·ç¦»è¶ è¿20 && ææ§è£ ç½® 15287 isScreenInMove = 1; // äºå¨ä¸ 15288 inSlide(popIndexOfScreen + 1); 15289 setTimeout(() => { 15290 isScreenInMove = 0; 15291 }, 800); // äºå¨ç»æ 15292 } 15293 } 15294 }); 15295 15296 // tap($(".indexcut3clickm"), function(e) { 15297 15298 // isvidover = 1; 15299 // if (isvideorun == 1) { 15300 // clearInterval(videofunc); 15301 // isvideorun = 0; 15302 // } 15303 // if (tempopen == 0) { 15304 // tempopen = 1; 15305 // curVideoIndex = curVideoIndex + parseInt(e.data("val")); 15306 // if (curVideoIndex < 0) { 15307 // curVideoIndex = $(".indexcut3mc").length - 1; 15308 // } else if (curVideoIndex >= $(".indexcut3mc").length) { 15309 // curVideoIndex = 0; 15310 // } 15311 // runvideos(); 15312 // setTimeout(function() { tempopen = 0; }, 300); 15313 // } 15314 // }); 15315 15316 // tap($(".indexcut3click"), function(e) { 15317 15318 15319 // isvidover = 1; 15320 // if (isvideorun == 1) { 15321 // clearInterval(videofunc); 15322 // isvideorun = 0; 15323 // } 15324 // curVideoIndex = e.data("val"); 15325 // runvideos(); 15326 // }); 15327 15328 $('.indexcut3clickm').on('click', function () { 15329 isvidover = 1; 15330 if (isvideorun === 1) { 15331 clearInterval(videofunc); 15332 isvideorun = 0; 15333 } 15334 if (tempopen === 0) { 15335 tempopen = 1; 15336 curVideoIndex += parseInt($(this).data('val'), 10); 15337 if (curVideoIndex < 0) { 15338 curVideoIndex = $('.indexcut3mc').length - 1; 15339 } else if (curVideoIndex >= $('.indexcut3mc').length) { 15340 curVideoIndex = 0; 15341 } 15342 runvideos(); 15343 setTimeout(() => { 15344 tempopen = 0; 15345 }, 300); 15346 } 15347 }); 15348 15349 $('.indexcut3click').on('click', function () { 15350 isvidover = 1; 15351 if (isvideorun === 1) { 15352 clearInterval(videofunc); 15353 isvideorun = 0; 15354 } 15355 curVideoIndex = $(this).data('val'); 15356 runvideos(); 15357 }); 15358 } else { 15359 // æ¡æ©ç¸®å°å°ææå°ºå¯¸ 15360 $('.indexcut3clickm').on('click', function () { 15361 isvidover = 1; 15362 if (isvideorun === 1) { 15363 clearInterval(videofunc); 15364 isvideorun = 0; 15365 } 15366 if (tempopen === 0) { 15367 tempopen = 1; 15368 curVideoIndex += parseInt($(this).data('val'), 10); 15369 if (curVideoIndex < 0) { 15370 curVideoIndex = $('.indexcut3mc').length - 1; 15371 } else if (curVideoIndex >= $('.indexcut3mc').length) { 15372 curVideoIndex = 0; 15373 } 15374 runvideos(); 15375 setTimeout(() => { 15376 tempopen = 0; 15377 }, 300); 15378 } 15379 }); 15380 15381 $('.indexcut3click').on('click', function () { 15382 isvidover = 1; 15383 if (isvideorun === 1) { 15384 clearInterval(videofunc); 15385 isvideorun = 0; 15386 } 15387 curVideoIndex = $(this).data('val'); 15388 runvideos(); 15389 }); 15390 } 15391 } 15392 15393 /* 15394 | ç»æ¡æ¶ 15395 */ 15396 function setSize() { 15397 windowHeight = $window.height(); 15398 windoWidth = $window.width(); 15399 15400 // æ¹ææ©æ¿ 15401 if (checkViewport(viewport()) === 'mobile' && isMobileDevice === 0) { 15402 isMobileDevice = 2; 15403 $('#footer').addClass('fullcutwrap'); 15404 } else if (checkViewport(viewport()) === 'desktop' && isMobileDevice === 2) { 15405 $('#footer').removeClass('fullcutwrap'); 15406 isMobileDevice = 0; 15407 } else if (isMobileDevice === 1) { 15408 $('#footer').addClass('fullcutwrap'); 15409 } else { 15410 $('#footer').removeClass('fullcutwrap'); 15411 } 15412 15413 $('html,body').css({ 15414 position: 'fixed', top: '0', left: '0', width: '100%', height: '100%', overflow: 'hidden' 15415 }); 15416 $('#bodywrap').css({ 15417 position: 'absolute', height: windowHeight * $('.fullcutwrap').length, width: '100%', top: 0, left: 0 15418 }); 15419 $('.fullcutwrap').css('height', windowHeight).css('width', '100%'); 15420 15421 $('#bannerToURL').css({ 15422 height: windowHeight, width: '100%', position: 'absolute' 15423 }); 15424 15425 // $(".fullcutwrap").css("position","fixed").css("height",windowHeight).css("left",0).css("width","100%").css("top",windowHeight); 15426 // $(".fullcutwrap").eq(0).css("top",0); 15427 currentScreen = 0; 15428 15429 if (isMobileDevice === 1) { 15430 // éè£¡ç§»é¤ææçå½±ç 15431 $('.cut3video').attr('src', ''); 15432 } 15433 15434 // è®¡ç®æ¡æ¶å¤§å°æ¯ä¾ 15435 let bgFullRate; 15436 if (checkViewport(viewport()) === 'mobile' && $('#firstScreenBGViaMobile').length >= 1) { 15437 bgFullRate = 750 / 1200; // åçé·å¯¬ 15438 } else { 15439 bgFullRate = 1440 / 760; // åçé·å¯¬ 15440 } 15441 15442 // é¦é åççæ»¿çåä½ç½® 15443 let percent; 15444 if (windoWidth / windowHeight > bgFullRate) { 15445 // window寬 15446 percent = -parseInt(100 * ((1 - bgFullRate / (windoWidth / windowHeight)) / 2), 10); 15447 $('.fullBg').css({ width: '100%', height: 'auto', left: '0' }); 15448 15449 // $('.fullbg').css('width', '100%').css('height', 'auto').css('left', '0') 15450 // .css('top', `${ percent }% `); 15451 } else { 15452 percent = -parseInt(100 * ((1 - windoWidth / windowHeight / bgFullRate) / 2), 10); 15453 $('.fullBg').css({ 15454 height: '100%', width: bgFullRate * windowHeight, top: '0', marginLeft: -(bgFullRate * windowHeight - windoWidth) / 2 15455 }); 15456 // $('.fullbg').css('height', '100%').css('width', bgFullRate * windowHeight).css('top', '0') 15457 // .css('left', `${ percent }% `); 15458 } 15459 15460 // 主é¸å®æ¯å¦è¦é¡¯ç¤º 15461 if (checkViewport(viewport()) === 'mobile') { 15462 $('#headerForDesktop').hide(); 15463 $('#headerForMobile').show(); 15464 $('#home-menu').show(); 15465 $('#home-step').show(); 15466 } else { 15467 $('#headerForDesktop').show(); 15468 $('#headerForMobile').hide(); 15469 $('#home-menu').hide(); 15470 $('#home-step').hide(); 15471 } 15472 15473 const scrolled = $(window).scrollTop(); 15474 if (scrolled < windowHeight && $('.fullcutwrap').length > 2) { 15475 // é¦é 15476 $('#headerForMobile').hide(); // éåä¸éå§é½ä¸é¡¯ç¤º 15477 } 15478 } 15479 15480 /* 15481 | æ¨èå级æç¤ºåºå 15482 */ 15483 function checkIE() { 15484 // IE 6 7 8 9 10 æ¨èå级 15485 if (navigator.userAgent.indexOf('MSIE') > 0) { 15486 if (navigator.userAgent.indexOf('MSIE 6.0') > 0 || navigator.userAgent.indexOf('MSIE 7.0') > 0 || navigator.userAgent.indexOf('MSIE 8.0') > 0 || navigator.userAgent.indexOf('MSIE 9.0') > 0 || navigator.userAgent.indexOf('MSIE 10.0') > 0) { 15487 const hasCookie = $.cookie('shinho_cookie'); 15488 if (hasCookie) { 15489 // .. 15490 } else { 15491 $('body').append('<section id="isNSupport">æ¨å¥½ï¼<br/><br/>æä»¬ä¾¦æµå°æ¨ç®å使ç¨çæµè§å¨çæ¬ï¼å¯è½ä¼ææ æ³æ§è¡ç½ç«çé¨ååè½ï¼ä¸æ æ³æ£å¸¸æµè§å å®¹çæ å½¢ï¼<br/>ä¸ºè®©æ¨ææ´å¥½çé è§ä¸ä½¿ç¨ä½éªï¼å»ºè®®æ¨å¯ä»¥ï¼<br/>1.æ´æ°<a href="https://www.microsoft.com/zh-hk/download/Internet-Explorer-11-for-Windows-7-details.aspx" target="_blank">IE</a>æµè§å¨çæ¬ <br/>2.ä½¿ç¨ <a href="https://www.google.com/chrome/browser/desktop/" target="_blank">Chrome</a> æ <a href="https://moztw.org/firefox/download/latest-osx.html" target="_blank">Firefox</a> æµè§å¨å¼å¯ç½ç«<i class="icon icon-close"></i></section>'); 15492 $('body').on('click', '#isNSupport', () => { 15493 $('#isNSupport').remove(); 15494 $.cookie('shinho_cookie', true, { path: '/', expires: 1 }); 15495 }); 15496 } 15497 } 15498 } 15499 } 15500 15501 /* 15502 | å¤æææºæ¹å 15503 */ 15504 function getOrt() { 15505 const elem = document.documentElement; 15506 return elem.clientWidth / Math.max(elem.clientHeight, 320) < 1.1 ? 'portrait' : 'landscape'; 15507 } 15508 15509 /* 15510 | åå§å 15511 */
15512 function init() { 15513 // å·è½´æ»å¨åæ¢å± 15514 $window.on('DOMMouseScroll mousewheel', event => { 15515 if (isScreenMove === 0 && isPopBlockShowed === 0) { 15516 isScreenMove = 1; 15517 if (event.originalEvent.wheelDelta / 120 > 0) { 15518 scrollSlide('U'); 15519 } else { 15520 scrollSlide('D'); 15521 } 15522 setTimeout(() => { 15523 isScreenMove = 0; 15524 }, 1500); // å·å¨ 1.5 ææ¢å± 15525 } 15526 }); 15527 $('#iscrollwrap1').on('mouseover', () => { 15528 isScreenMove = 1; 15529 }); 15530 $('#iscrollwrap2').on('mouseover', () => { 15531 isScreenMove = 1; 15532 }); 15533 $('#iscrollwrap3').on('mouseover', () => { 15534 isScreenMove = 1; 15535 }); 15536 $('#iscrollwrap4').on('mouseover', () => { 15537 isScreenMove = 1; 15538 }); 15539 $('#iscrollwrap1').on('mouseout', () => { 15540 isScreenMove = 0; 15541 }); 15542 $('#iscrollwrap2').on('mouseout', () => { 15543 isScreenMove = 0; 15544 }); 15545 $('#iscrollwrap3').on('mouseout', () => { 15546 isScreenMove = 0; 15547 }); 15548 $('#iscrollwrap4').on('mouseout', () => { 15549 isScreenMove = 0; 15550 }); 15551 15552 // èç页é¢å·å¨ 15553 // $window.scroll((event) => { 15554 // window.clearTimeout(scrollTimer); 15555 // scrollTimer = window.setTimeout(function() {}, 500) 15556 15557 // }); 15558 15559 // èç使ç¨è è®æå°ºå¯¸ , 触å orientationchange åä¸å®ä¼è§¦å resize 15560 $window.resize(event => { 15561 window.clearTimeout(resizeTimer); 15562 15563 resizeTimer = window.setTimeout(() => { 15564 if (isMobileDevice === 1) { 15565 $('.fadeM').slick('unslick'); 15566 } else { 15567 $('.fadeD').slick('unslick'); 15568 } 15569 if (orientationStatus === false) { 15570 $('#bodywrap').show(); 15571 15572 if (currentScreen === 0) { 15573 setSize(); 15574 } else if (currentScreen === 1) { 15575 setSize(); 15576 currentScreen = -1; 15577 scrollSlide('UP'); 15578 } else if (currentScreen === 2) { 15579 setSize(); 15580 currentScreen = -1; 15581 scrollSlide('UP'); 15582 } else { 15583 setSize(); 15584 currentScreen = -1; 15585 scrollSlide('UP'); 15586 } 15587 firstScreenStart(); 15588 secondScreenStart(); 15589 thirdScreenViaPad(); 15590 } else { 15591 orientationStatus = false; 15592 } 15593 }, 500); 15594 }); 15595 15596 // ææè£ 置转åä¾¦å¬ 15597 $(window).bind('orientationchange', event => { 15598 orientationStatus = true; // ç±è½¬å产ççä¸å¸æè§¦å resize 15599 15600 if (screen.orientation.angle === 0) { 15601 // 转为 portrait 15602 // è¥ä¸å¼å§æ¯ landscape å转为 portrait æ¶å¯¹é¡µé¢è¿è¡ resize å¨ä½ï¼åæ¶å°ç»é¢åå§è®¾ä¸º portrait ï¼å³ä¸å对转åè¿è¡ resize. 15603 if (orientation === 'landscape') { 15604 $('#bodywrap').hide(); 15605 orientationStatus = false; 15606 orientation = 'portrait'; 15607 } else { 15608 // è¥ä¸å¼å§æ¯ portrait ä¸è¿è¡ä»»ä½å¨ä½ 15609 } 15610 } else {// 转为 landscape 15611 // 转为 landscape ä¸è¿è¡ä»»ä½å¨ä½ 15612 } 15613 }); 15614 15615 if (isMobileDevice === 1) { 15616 // tap($("#headerForMobile .main-nav-toggle-btn"), function() { 15617 // itemNavList.slideToggle(); 15618 // $("#headerForMobile .panel-btn-icon").toggleClass("status-close"); 15619 // $("body").toggleClass("screen-mask"); 15620 // return false; 15621 // }); 15622 $('#headerForMobile .main-nav-toggle-btn').on('click', () => { 15623 itemNavList.slideToggle(); 15624 $('#headerForMobile .panel-btn-icon').toggleClass('status-close'); 15625 $('body').toggleClass('screen-mask'); 15626 15627 return false; 15628 }); 15629 } else { 15630 $('#headerForMobile .main-nav-toggle-btn').on('click', () => { 15631 itemNavList.slideToggle(); 15632 $('#headerForMobile .panel-btn-icon').toggleClass('status-close'); 15633 $('body').toggleClass('screen-mask'); 15634 15635 // è¥é¸å®é®ç½©åºç¾çæ æ³ä¸åæå±ï¼åæ¶åé¸å®é®ç½© 15636 if ($('body').hasClass('screen-mask')) { 15637 $('#indexcut3select').css('z-index', 0); 15638 $('indexcut3mobwrap'); 15639 } else { 15640 $('#indexcut3select').attr('style', ''); 15641 } 15642 15643 return false;
15644 }); 15645 } 15646 // ---- // 第ä¸å± 15647 firstScreenStart(); 15648 // ---- // 第äºå± 15649 secondScreenStart(); 15650 // ---- // 第ä¸å± 15651 thirdScreenViaPad(); 15652 15653 $('#footer').show(); 15654 } 15655 15656 function loading() { 15657 const preLoader = $('#pre-loader'); 15658 preLoader.addClass('fadeout'); // ä½¿ç¨æ¸éçæ¹æ³æ·¡åºloading page 15659 preLoader.delay(2000).fadeOut(); 15660 } 15661 /* 15662 | åå§ååè®¾å® 15663 */ 15664 function setting() { 15665 // æéåºåä½é¶æµè§å¨ä¸è½½æ°åæµè§å¨ 15666 checkIE(); 15667 // 夿ææè£ ç½®ææ¯æ¡æº 15668 if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { 15669 isMobileDevice = 1; 15670 } else { 15671 isMobileDevice = 0; 15672 } 15673 15674 // 夿ä¸è¿ç»é¢çè£ ç½®æ¹å 15675 if (checkViewport(viewport()) === 'mobile') { 15676 orientation = getOrt(); 15677 } else { 15678 orientation = ''; 15679 } 15680 // è®¾å®æ¡æ¶ 15681 setSize(); 15682 // åå§å 15683 init(); 15684 } 15685 /* 15686 | èçé¡µé¢ loaded å 15687 */ 15688 $window.load(event => { 15689 // loading(); 15690 setting(); 15691 }); 15692 15693 $('body').on('load', () => { 15694 const myScroll = new __WEBPACK_IMPORTED_MODULE_4_iscroll___default.a('.iscroll', { 15695 scrollbars: true, 15696 mouseWheel: true, 15697 interactiveScrollbars: true, 15698 shrinkScrollbars: 'scale', 15699 fadeScrollbars: true 15700 }); 15701 }); 15702 // å¾çç ´ææ¶æ´æ¢æå«æ¡£å¾ 15703 document.addEventListener('error', () => { 15704 $('#firstScreenBGViaDesktop .image img').error(function () { 15705 $(this).attr('src', '/img/backupimage_1440x760.png'); 15706 }); 15707 15708 $('#firstScreenBGViaMobile .image img').error(function () { 15709 $(this).attr('src', '/img/backupimage_750x1200.png'); 15710 }); 15711 }, true); 15712}); 15713/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(0))) 15714 15715/***/ }), 15716/* 36 */ 15717/***/ (function(module, exports, __webpack_require__) { 15718 15719var __WEBPACK_AMD_DEFINE_RESULT__;/*! iScroll v5.2.0 ~ (c) 2008-2016 Matteo Spinelli ~ http://cubiq.org/license */ 15720(function (window, document, Math) { 15721 var rAF = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { 15722 window.setTimeout(callback, 1000 / 60); 15723 }; 15724 15725 var utils = function () { 15726 var me = {}; 15727 15728 var _elementStyle = document.createElement('div').style; 15729 var _vendor = function () { 15730 var vendors = ['t', 'webkitT', 'MozT', 'msT', 'OT'], 15731 transform, 15732 i = 0, 15733 l = vendors.length; 15734 15735 for (; i < l; i++) { 15736 transform = vendors[i] + 'ransform'; 15737 if (transform in _elementStyle) return vendors[i].substr(0, vendors[i].length - 1); 15738 } 15739 15740 return false; 15741 }(); 15742 15743 function _prefixStyle(style) { 15744 if (_vendor === false) return false; 15745 if (_vendor === '') return style; 15746 return _vendor + style.charAt(0).toUpperCase() + style.substr(1); 15747 } 15748 15749 me.getTime = Date.now || function getTime() { 15750 return new Date().getTime(); 15751 }; 15752 15753 me.extend = function (target, obj) { 15754 for (var i in obj) { 15755 target[i] = obj[i]; 15756 } 15757 }; 15758 15759 me.addEvent = function (el, type, fn, capture) { 15760 el.addEventListener(type, fn, !!capture); 15761 }; 15762 15763 me.removeEvent = function (el, type, fn, capture) { 15764 el.removeEventListener(type, fn, !!capture); 15765 }; 15766 15767 me.prefixPointerEvent = function (pointerEvent) { 15768 return window.MSPointerEvent ? 'MSPointer' + pointerEvent.charAt(7).toUpperCase() + pointerEvent.substr(8) : pointerEvent; 15769 }; 15770 15771 me.momentum = function (current, start, time, lowerMargin, wrapperSize, deceleration) { 15772 var distance = current - start, 15773 speed = Math.abs(distance) / time, 15774 destination, 15775 duration; 15776 15777 deceleration = deceleration === undefined ? 0.0006 : deceleration; 15778 15779 destination = current + speed * speed / (2 * deceleration) * (distance < 0 ? -1 : 1); 15780 duration = speed / deceleration; 15781 15782 if (destination < lowerMargin) { 15783 destination = wrapperSize ? lowerMargin - wrapperSize / 2.5 * (speed / 8) : lowerMargin; 15784 distance = Math.abs(destination - current); 15785 duration = distance / speed; 15786 } else if (destination > 0) { 15787 destination = wrapperSize ? wrapperSize / 2.5 * (speed / 8) : 0; 15788 distance = Math.abs(current) + destination; 15789 duration = distance / speed; 15790 } 15791 15792 return { 15793 destination: Math.round(destination), 15794 duration: duration 15795 }; 15796 }; 15797 15798 var _transform = _prefixStyle('transform'); 15799 15800 me.extend(me, { 15801 hasTransform: _transform !== false, 15802 hasPerspective: _prefixStyle('perspective') in _elementStyle, 15803 hasTouch: 'ontouchstart' in window, 15804 hasPointer: !!(window.PointerEvent || window.MSPointerEvent), // IE10 is prefixed 15805 hasTransition: _prefixStyle('transition') in _elementStyle 15806 }); 15807 15808 /* 15809 This should find all Android browsers lower than build 535.19 (both stock browser and webview) 15810 - galaxy S2 is ok 15811 - 2.3.6 : `AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1` 15812 - 4.0.4 : `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30` 15813 - galaxy S3 is badAndroid (stock brower, webview) 15814 `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30` 15815 - galaxy S4 is badAndroid (stock brower, webview) 15816 `AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30` 15817 - galaxy S5 is OK 15818 `AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 (Chrome/)` 15819 - galaxy S6 is OK 15820 `AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36 (Chrome/)` 15821 */ 15822 me.isBadAndroid = function () { 15823 var appVersion = window.navigator.appVersion; 15824 // Android browser is not a chrome browser. 15825 if (/Android/.test(appVersion) && !/Chrome\/\d/.test(appVersion)) { 15826 var safariVersion = appVersion.match(/Safari\/(\d+.\d)/); 15827 if (safariVersion && typeof safariVersion === "object" && safariVersion.length >= 2) { 15828 return parseFloat(safariVersion[1]) < 535.19; 15829 } else { 15830 return true; 15831 } 15832 } else { 15833 return false;
15834 } 15835 }(); 15836 15837 me.extend(me.style = {}, { 15838 transform: _transform, 15839 transitionTimingFunction: _prefixStyle('transitionTimingFunction'), 15840 transitionDuration: _prefixStyle('transitionDuration'), 15841 transitionDelay: _prefixStyle('transitionDelay'), 15842 transformOrigin: _prefixStyle('transformOrigin') 15843 }); 15844 15845 me.hasClass = function (e, c) { 15846 var re = new RegExp("(^|\\s)" + c + "(\\s|$)"); 15847 return re.test(e.className); 15848 }; 15849 15850 me.addClass = function (e, c) { 15851 if (me.hasClass(e, c)) { 15852 return; 15853 } 15854 15855 var newclass = e.className.split(' '); 15856 newclass.push(c); 15857 e.className = newclass.join(' '); 15858 }; 15859 15860 me.removeClass = function (e, c) { 15861 if (!me.hasClass(e, c)) { 15862 return; 15863 } 15864 15865 var re = new RegExp("(^|\\s)" + c + "(\\s|$)", 'g'); 15866 e.className = e.className.replace(re, ' '); 15867 }; 15868 15869 me.offset = function (el) { 15870 var left = -el.offsetLeft, 15871 top = -el.offsetTop; 15872 15873 // jshint -W084 15874 while (el = el.offsetParent) { 15875 left -= el.offsetLeft; 15876 top -= el.offsetTop; 15877 } 15878 // jshint +W084 15879 15880 return { 15881 left: left, 15882 top: top 15883 }; 15884 }; 15885 15886 me.preventDefaultException = function (el, exceptions) { 15887 for (var i in exceptions) { 15888 if (exceptions[i].test(el[i])) { 15889 return true; 15890 } 15891 } 15892 15893 return false; 15894 }; 15895 15896 me.extend(me.eventType = {}, { 15897 touchstart: 1, 15898 touchmove: 1, 15899 touchend: 1, 15900 15901 mousedown: 2, 15902 mousemove: 2, 15903 mouseup: 2, 15904 15905 pointerdown: 3, 15906 pointermove: 3, 15907 pointerup: 3, 15908 15909 MSPointerDown: 3, 15910 MSPointerMove: 3, 15911 MSPointerUp: 3 15912 }); 15913 15914 me.extend(me.ease = {}, { 15915 quadratic: { 15916 style: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)', 15917 fn: function (k) { 15918 return k * (2 - k); 15919 } 15920 }, 15921 circular: { 15922 style: 'cubic-bezier(0.1, 0.57, 0.1, 1)', // Not properly "circular" but this looks better, it should be (0.075, 0.82, 0.165, 1) 15923 fn: function (k) { 15924 return Math.sqrt(1 - --k * k); 15925 } 15926 }, 15927 back: { 15928 style: 'cubic-bezier(0.175, 0.885, 0.32, 1.275)', 15929 fn: function (k) { 15930 var b = 4; 15931 return (k = k - 1) * k * ((b + 1) * k + b) + 1; 15932 } 15933 }, 15934 bounce: { 15935 style: '', 15936 fn: function (k) { 15937 if ((k /= 1) < 1 / 2.75) { 15938 return 7.5625 * k * k; 15939 } else if (k < 2 / 2.75) { 15940 return 7.5625 * (k -= 1.5 / 2.75) * k + 0.75; 15941 } else if (k < 2.5 / 2.75) { 15942 return 7.5625 * (k -= 2.25 / 2.75) * k + 0.9375; 15943 } else { 15944 return 7.5625 * (k -= 2.625 / 2.75) * k + 0.984375; 15945 } 15946 } 15947 }, 15948 elastic: { 15949 style: '', 15950 fn: function (k) { 15951 var f = 0.22, 15952 e = 0.4; 15953 15954 if (k === 0) { 15955 return 0; 15956 } 15957 if (k == 1) { 15958 return 1; 15959 } 15960 15961 return e * Math.pow(2, -10 * k) * Math.sin((k - f / 4) * (2 * Math.PI) / f) + 1; 15962 } 15963 } 15964 }); 15965 15966 me.tap = function (e, eventName) { 15967 var ev = document.createEvent('Event'); 15968 ev.initEvent(eventName, true, true); 15969 ev.pageX = e.pageX; 15970 ev.pageY = e.pageY; 15971 e.target.dispatchEvent(ev); 15972 }; 15973 15974 me.click = function (e) { 15975 var target = e.target, 15976 ev; 15977 15978 if (!/(SELECT|INPUT|TEXTAREA)/i.test(target.tagName)) { 15979 ev = document.createEvent('MouseEvents'); 15980 ev.initMouseEvent('click', true, true, e.view, 1, target.screenX, target.screenY, target.clientX, target.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, 0, null); 15981 15982 ev._constructed = true; 15983 target.dispatchEvent(ev); 15984 } 15985 }; 15986 15987 return me; 15988 }(); 15989 function IScroll(el, options) { 15990 this.wrapper = typeof el == 'string' ? document.querySelector(el) : el; 15991 this.scroller = this.wrapper.children[0]; 15992 this.scrollerStyle = this.scroller.style; // cache style for better performance 15993 15994 this.options = { 15995 15996 resizeScrollbars: true, 15997 15998 mouseWheelSpeed: 20, 15999 16000 snapThreshold: 0.334, 16001 16002 // INSERT POINT: OPTIONS 16003 disablePointer: !utils.hasPointer, 16004 disableTouch: utils.hasPointer || !utils.hasTouch, 16005 disableMouse: utils.hasPointer || utils.hasTouch, 16006 startX: 0, 16007 startY: 0, 16008 scrollY: true, 16009 directionLockThreshold: 5, 16010 momentum: true, 16011 16012 bounce: true, 16013 bounceTime: 600, 16014 bounceEasing: '', 16015 16016 preventDefault: true, 16017 preventDefaultException: { tagName: /^(INPUT|TEXTAREA|BUTTON|
vendor: 4,191 bytes, lines 16017-16168
16017SELECT)$/ }, 16018 16019 HWCompositing: true, 16020 useTransition: true, 16021 useTransform: true, 16022 bindToWrapper: typeof window.onmousedown === "undefined" 16023 }; 16024 16025 for (var i in options) { 16026 this.options[i] = options[i]; 16027 } 16028 16029 // Normalize options 16030 this.translateZ = this.options.HWCompositing && utils.hasPerspective ? ' translateZ(0)' : ''; 16031 16032 this.options.useTransition = utils.hasTransition && this.options.useTransition; 16033 this.options.useTransform = utils.hasTransform && this.options.useTransform; 16034 16035 this.options.eventPassthrough = this.options.eventPassthrough === true ? 'vertical' : this.options.eventPassthrough; 16036 this.options.preventDefault = !this.options.eventPassthrough && this.options.preventDefault; 16037 16038 // If you want eventPassthrough I have to lock one of the axes 16039 this.options.scrollY = this.options.eventPassthrough == 'vertical' ? false : this.options.scrollY; 16040 this.options.scrollX = this.options.eventPassthrough == 'horizontal' ? false : this.options.scrollX; 16041 16042 // With eventPassthrough we also need lockDirection mechanism 16043 this.options.freeScroll = this.options.freeScroll && !this.options.eventPassthrough; 16044 this.options.directionLockThreshold = this.options.eventPassthrough ? 0 : this.options.directionLockThreshold; 16045 16046 this.options.bounceEasing = typeof this.options.bounceEasing == 'string' ? utils.ease[this.options.bounceEasing] || utils.ease.circular : this.options.bounceEasing; 16047 16048 this.options.resizePolling = this.options.resizePolling === undefined ? 60 : this.options.resizePolling; 16049 16050 if (this.options.tap === true) { 16051 this.options.tap = 'tap'; 16052 } 16053 16054 if (this.options.shrinkScrollbars == 'scale') { 16055 this.options.useTransition = false; 16056 } 16057 16058 this.options.invertWheelDirection = this.options.invertWheelDirection ? -1 : 1; 16059 16060 // INSERT POINT: NORMALIZATION 16061 16062 // Some defaults 16063 this.x = 0; 16064 this.y = 0; 16065 this.directionX = 0; 16066 this.directionY = 0; 16067 this._events = {}; 16068 16069 // INSERT POINT: DEFAULTS 16070 16071 this._init(); 16072 this.refresh(); 16073 16074 this.scrollTo(this.options.startX, this.options.startY); 16075 this.enable(); 16076 } 16077 16078 IScroll.prototype = { 16079 version: '5.2.0', 16080 16081 _init: function () { 16082 this._initEvents(); 16083 16084 if (this.options.scrollbars || this.options.indicators) { 16085 this._initIndicators(); 16086 } 16087 16088 if (this.options.mouseWheel) { 16089 this._initWheel(); 16090 } 16091 16092 if (this.options.snap) { 16093 this._initSnap(); 16094 } 16095 16096 if (this.options.keyBindings) { 16097 this._initKeys(); 16098 } 16099 16100 // INSERT POINT: _init 16101 }, 16102 16103 destroy: function () { 16104 this._initEvents(true); 16105 clearTimeout(this.resizeTimeout); 16106 this.resizeTimeout = null; 16107 this._execEvent('destroy'); 16108 }, 16109 16110 _transitionEnd: function (e) { 16111 if (e.target != this.scroller || !this.isInTransition) { 16112 return; 16113 } 16114 16115 this._transitionTime(); 16116 if (!this.resetPosition(this.options.bounceTime)) { 16117 this.isInTransition = false; 16118 this._execEvent('scrollEnd'); 16119 } 16120 }, 16121 16122 _start: function (e) { 16123 // React to left mouse button only 16124 if (utils.eventType[e.type] != 1) { 16125 // for button property 16126 // http://unixpapa.com/js/mouse.html 16127 var button; 16128 if (!e.which) { 16129 /* IE case */ 16130 button = e.button < 2 ? 0 : e.button == 4 ? 1 : 2; 16131 } else { 16132 /* All others */ 16133 button = e.button; 16134 } 16135 if (button !== 0) { 16136 return; 16137 } 16138 } 16139 16140 if (!this.enabled || this.initiated && utils.eventType[e.type] !== this.initiated) { 16141 return; 16142 } 16143 16144 if (this.options.preventDefault && !utils.isBadAndroid && !utils.preventDefaultException(e.target, this.options.preventDefaultException)) { 16145 e.preventDefault(); 16146 } 16147 16148 var point = e.touches ? e.touches[0] : e, 16149 pos; 16150 16151 this.initiated = utils.eventType[e.type]; 16152 this.moved = false; 16153 this.distX = 0; 16154 this.distY = 0; 16155 this.directionX = 0; 16156 this.directionY = 0; 16157 this.directionLocked = 0; 16158 16159 this.startTime = utils.getTime(); 16160 16161 if (this.options.useTransition && this.isInTransition) { 16162 this._transitionTime(); 16163 this.isInTransition = false; 16164 pos = this.getComputedPosition(); 16165 this._translate(Math.round(pos.x), Math.round(pos.y)); 16166 this._execEvent('scrollEnd'); 16167 } else if (!this.options.useTransition && this.isAnimating) { 16168 this.isAnimating = false;
vendor: 4,429 bytes, lines 16169-16333
16169 this._execEvent('scrollEnd'); 16170 } 16171 16172 this.startX = this.x; 16173 this.startY = this.y; 16174 this.absStartX = this.x; 16175 this.absStartY = this.y; 16176 this.pointX = point.pageX; 16177 this.pointY = point.pageY; 16178 16179 this._execEvent('beforeScrollStart'); 16180 }, 16181 16182 _move: function (e) { 16183 if (!this.enabled || utils.eventType[e.type] !== this.initiated) { 16184 return; 16185 } 16186 16187 if (this.options.preventDefault) { 16188 // increases performance on Android? TODO: check! 16189 e.preventDefault(); 16190 } 16191 16192 var point = e.touches ? e.touches[0] : e, 16193 deltaX = point.pageX - this.pointX, 16194 deltaY = point.pageY - this.pointY, 16195 timestamp = utils.getTime(), 16196 newX, 16197 newY, 16198 absDistX, 16199 absDistY; 16200 16201 this.pointX = point.pageX; 16202 this.pointY = point.pageY; 16203 16204 this.distX += deltaX; 16205 this.distY += deltaY; 16206 absDistX = Math.abs(this.distX); 16207 absDistY = Math.abs(this.distY); 16208 16209 // We need to move at least 10 pixels for the scrolling to initiate 16210 if (timestamp - this.endTime > 300 && absDistX < 10 && absDistY < 10) { 16211 return; 16212 } 16213 16214 // If you are scrolling in one direction lock the other 16215 if (!this.directionLocked && !this.options.freeScroll) { 16216 if (absDistX > absDistY + this.options.directionLockThreshold) { 16217 this.directionLocked = 'h'; // lock horizontally 16218 } else if (absDistY >= absDistX + this.options.directionLockThreshold) { 16219 this.directionLocked = 'v'; // lock vertically 16220 } else { 16221 this.directionLocked = 'n'; // no lock 16222 } 16223 } 16224 16225 if (this.directionLocked == 'h') { 16226 if (this.options.eventPassthrough == 'vertical') { 16227 e.preventDefault(); 16228 } else if (this.options.eventPassthrough == 'horizontal') { 16229 this.initiated = false; 16230 return; 16231 } 16232 16233 deltaY = 0; 16234 } else if (this.directionLocked == 'v') { 16235 if (this.options.eventPassthrough == 'horizontal') { 16236 e.preventDefault(); 16237 } else if (this.options.eventPassthrough == 'vertical') { 16238 this.initiated = false; 16239 return; 16240 } 16241 16242 deltaX = 0; 16243 } 16244 16245 deltaX = this.hasHorizontalScroll ? deltaX : 0; 16246 deltaY = this.hasVerticalScroll ? deltaY : 0; 16247 16248 newX = this.x + deltaX; 16249 newY = this.y + deltaY; 16250 16251 // Slow down if outside of the boundaries 16252 if (newX > 0 || newX < this.maxScrollX) { 16253 newX = this.options.bounce ? this.x + deltaX / 3 : newX > 0 ? 0 : this.maxScrollX; 16254 } 16255 if (newY > 0 || newY < this.maxScrollY) { 16256 newY = this.options.bounce ? this.y + deltaY / 3 : newY > 0 ? 0 : this.maxScrollY; 16257 } 16258 16259 this.directionX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0; 16260 this.directionY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0; 16261 16262 if (!this.moved) { 16263 this._execEvent('scrollStart'); 16264 } 16265 16266 this.moved = true; 16267 16268 this._translate(newX, newY); 16269 16270 /* REPLACE START: _move */ 16271 16272 if (timestamp - this.startTime > 300) { 16273 this.startTime = timestamp; 16274 this.startX = this.x; 16275 this.startY = this.y; 16276 } 16277 16278 /* REPLACE END: _move */ 16279 }, 16280 16281 _end: function (e) { 16282 if (!this.enabled || utils.eventType[e.type] !== this.initiated) { 16283 return; 16284 } 16285 16286 if (this.options.preventDefault && !utils.preventDefaultException(e.target, this.options.preventDefaultException)) { 16287 e.preventDefault(); 16288 } 16289 16290 var point = e.changedTouches ? e.changedTouches[0] : e, 16291 momentumX, 16292 momentumY, 16293 duration = utils.getTime() - this.startTime, 16294 newX = Math.round(this.x), 16295 newY = Math.round(this.y), 16296 distanceX = Math.abs(newX - this.startX), 16297 distanceY = Math.abs(newY - this.startY), 16298 time = 0, 16299 easing = ''; 16300 16301 this.isInTransition = 0; 16302 this.initiated = 0; 16303 this.endTime = utils.getTime(); 16304 16305 // reset if we are outside of the boundaries 16306 if (this.resetPosition(this.options.bounceTime)) { 16307 return; 16308 } 16309 16310 this.scrollTo(newX, newY); // ensures that the last position is rounded 16311 16312 // we scrolled less than 10 pixels 16313 if (!this.moved) { 16314 if (this.options.tap) { 16315 utils.tap(e, this.options.tap); 16316 } 16317 16318 if (this.options.click) { 16319 utils.click(e); 16320 } 16321 16322 this._execEvent('scrollCancel'); 16323 return; 16324 } 16325 16326 if (this._events.flick && duration < 200 && distanceX < 100 && distanceY < 100) { 16327 this._execEvent('flick'); 16328 return; 16329 } 16330 16331 // start momentum animation if needed 16332 if (this.options.momentum && duration < 300) { 16333 momentumX = this.hasHorizontalScroll ? utils.momentum(this.x, this.startX, duration, this.maxScrollX, this.options.bounce ? this.wrapperW
vendor: 11,716 bytes, lines 16333-16792
16333idth : 0, this.options.deceleration) : { destination: newX, duration: 0 }; 16334 momentumY = this.hasVerticalScroll ? utils.momentum(this.y, this.startY, duration, this.maxScrollY, this.options.bounce ? this.wrapperHeight : 0, this.options.deceleration) : { destination: newY, duration: 0 }; 16335 newX = momentumX.destination; 16336 newY = momentumY.destination; 16337 time = Math.max(momentumX.duration, momentumY.duration); 16338 this.isInTransition = 1; 16339 } 16340 16341 if (this.options.snap) { 16342 var snap = this._nearestSnap(newX, newY); 16343 this.currentPage = snap; 16344 time = this.options.snapSpeed || Math.max(Math.max(Math.min(Math.abs(newX - snap.x), 1000), Math.min(Math.abs(newY - snap.y), 1000)), 300); 16345 newX = snap.x; 16346 newY = snap.y; 16347 16348 this.directionX = 0; 16349 this.directionY = 0; 16350 easing = this.options.bounceEasing; 16351 } 16352 16353 // INSERT POINT: _end 16354 16355 if (newX != this.x || newY != this.y) { 16356 // change easing function when scroller goes out of the boundaries 16357 if (newX > 0 || newX < this.maxScrollX || newY > 0 || newY < this.maxScrollY) { 16358 easing = utils.ease.quadratic; 16359 } 16360 16361 this.scrollTo(newX, newY, time, easing); 16362 return; 16363 } 16364 16365 this._execEvent('scrollEnd'); 16366 }, 16367 16368 _resize: function () { 16369 var that = this; 16370 16371 clearTimeout(this.resizeTimeout); 16372 16373 this.resizeTimeout = setTimeout(function () { 16374 that.refresh(); 16375 }, this.options.resizePolling); 16376 }, 16377 16378 resetPosition: function (time) { 16379 var x = this.x, 16380 y = this.y; 16381 16382 time = time || 0; 16383 16384 if (!this.hasHorizontalScroll || this.x > 0) { 16385 x = 0; 16386 } else if (this.x < this.maxScrollX) { 16387 x = this.maxScrollX; 16388 } 16389 16390 if (!this.hasVerticalScroll || this.y > 0) { 16391 y = 0; 16392 } else if (this.y < this.maxScrollY) { 16393 y = this.maxScrollY; 16394 } 16395 16396 if (x == this.x && y == this.y) { 16397 return false; 16398 } 16399 16400 this.scrollTo(x, y, time, this.options.bounceEasing); 16401 16402 return true; 16403 }, 16404 16405 disable: function () { 16406 this.enabled = false; 16407 }, 16408 16409 enable: function () { 16410 this.enabled = true; 16411 }, 16412 16413 refresh: function () { 16414 var rf = this.wrapper.offsetHeight; // Force reflow 16415 16416 this.wrapperWidth = this.wrapper.clientWidth; 16417 this.wrapperHeight = this.wrapper.clientHeight; 16418 16419 /* REPLACE START: refresh */ 16420 16421 this.scrollerWidth = this.scroller.offsetWidth; 16422 this.scrollerHeight = this.scroller.offsetHeight; 16423 16424 this.maxScrollX = this.wrapperWidth - this.scrollerWidth; 16425 this.maxScrollY = this.wrapperHeight - this.scrollerHeight; 16426 16427 /* REPLACE END: refresh */ 16428 16429 this.hasHorizontalScroll = this.options.scrollX && this.maxScrollX < 0; 16430 this.hasVerticalScroll = this.options.scrollY && this.maxScrollY < 0; 16431 16432 if (!this.hasHorizontalScroll) { 16433 this.maxScrollX = 0; 16434 this.scrollerWidth = this.wrapperWidth; 16435 } 16436 16437 if (!this.hasVerticalScroll) { 16438 this.maxScrollY = 0; 16439 this.scrollerHeight = this.wrapperHeight; 16440 } 16441 16442 this.endTime = 0; 16443 this.directionX = 0; 16444 this.directionY = 0; 16445 16446 this.wrapperOffset = utils.offset(this.wrapper); 16447 16448 this._execEvent('refresh'); 16449 16450 this.resetPosition(); 16451 16452 // INSERT POINT: _refresh 16453 }, 16454 16455 on: function (type, fn) { 16456 if (!this._events[type]) { 16457 this._events[type] = []; 16458 } 16459 16460 this._events[type].push(fn); 16461 }, 16462 16463 off: function (type, fn) { 16464 if (!this._events[type]) { 16465 return; 16466 } 16467 16468 var index = this._events[type].indexOf(fn); 16469 16470 if (index > -1) { 16471 this._events[type].splice(index, 1); 16472 } 16473 }, 16474 16475 _execEvent: function (type) { 16476 if (!this._events[type]) { 16477 return; 16478 } 16479 16480 var i = 0, 16481 l = this._events[type].length; 16482 16483 if (!l) { 16484 return; 16485 } 16486 16487 for (; i < l; i++) { 16488 this._events[type][i].apply(this, [].slice.call(arguments, 1)); 16489 } 16490 }, 16491 16492 scrollBy: function (x, y, time, easing) { 16493 x = this.x + x; 16494 y = this.y + y; 16495 time = time || 0; 16496 16497 this.scrollTo(x, y, time, easing); 16498 }, 16499 16500 scrollTo: function (x, y, time, easing) { 16501 easing = easing || utils.ease.circular; 16502 16503 this.isInTransition = this.options.useTransition && time > 0; 16504 var transitionType = this.options.useTransition && easing.style; 16505 if (!time || transitionType) { 16506 if (transitionType) { 16507 this._transitionTimingFunction(easing.style); 16508 this._transitionTime(time); 16509 } 16510 this._translate(x, y); 16511 } else { 16512 this._animate(x, y, time, easing.fn); 16513 } 16514 }, 16515 16516 scrollToElement: function (el, time, offsetX, offsetY, easing) { 16517 el = el.nodeType ? el : this.scroller.querySelector(el); 16518 16519 if (!el) { 16520 return; 16521 } 16522 16523 var pos = utils.offset(el); 16524 16525 pos.left -= this.wrapperOffset.left; 16526 pos.top -= this.wrapperOffset.top; 16527 16528 // if offsetX/Y are true we center the element to the screen 16529 if (offsetX === true) { 16530 offsetX = Math.round(el.offsetWidth / 2 - this.wrapper.offsetWidth / 2); 16531 } 16532 if (offsetY === true) { 16533 offsetY = Math.round(el.offsetHeight / 2 - this.wrapper.offsetHeight / 2); 16534 } 16535 16536 pos.left -= offsetX || 0; 16537 pos.top -= offsetY || 0; 16538 16539 pos.left = pos.left > 0 ? 0 : pos.left < this.maxScrollX ? this.maxScrollX : pos.left; 16540 pos.top = pos.top > 0 ? 0 : pos.top < this.maxScrollY ? this.maxScrollY : pos.top; 16541 16542 time = time === undefined || time === null || time === 'auto' ? Math.max(Math.abs(this.x - pos.left), Math.abs(this.y - pos.top)) : time; 16543 16544 this.scrollTo(pos.left, pos.top, time, easing); 16545 }, 16546 16547 _transitionTime: function (time) { 16548 time = time || 0; 16549 16550 var durationProp = utils.style.transitionDuration; 16551 this.scrollerStyle[durationProp] = time + 'ms'; 16552 16553 if (!time && utils.isBadAndroid) { 16554 this.scrollerStyle[durationProp] = '0.0001ms'; 16555 // remove 0.0001ms 16556 var self = this; 16557 rAF(function () { 16558 if (self.scrollerStyle[durationProp] === '0.0001ms') { 16559 self.scrollerStyle[durationProp] = '0s'; 16560 } 16561 }); 16562 } 16563 16564 if (this.indicators) { 16565 for (var i = this.indicators.length; i--;) { 16566 this.indicators[i].transitionTime(time); 16567 } 16568 } 16569 16570 // INSERT POINT: _transitionTime 16571 }, 16572 16573 _transitionTimingFunction: function (easing) { 16574 this.scrollerStyle[utils.style.transitionTimingFunction] = easing; 16575 16576 if (this.indicators) { 16577 for (var i = this.indicators.length; i--;) { 16578 this.indicators[i].transitionTimingFunction(easing); 16579 } 16580 } 16581 16582 // INSERT POINT: _transitionTimingFunction 16583 }, 16584 16585 _translate: function (x, y) { 16586 if (this.options.useTransform) { 16587 16588 /* REPLACE START: _translate */ 16589 16590 this.scrollerStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.translateZ; 16591 16592 /* REPLACE END: _translate */ 16593 } else { 16594 x = Math.round(x); 16595 y = Math.round(y); 16596 this.scrollerStyle.left = x + 'px'; 16597 this.scrollerStyle.top = y + 'px'; 16598 } 16599 16600 this.x = x; 16601 this.y = y; 16602 16603 if (this.indicators) { 16604 for (var i = this.indicators.length; i--;) { 16605 this.indicators[i].updatePosition(); 16606 } 16607 } 16608 16609 // INSERT POINT: _translate 16610 }, 16611 16612 _initEvents: function (remove) { 16613 var eventType = remove ? utils.removeEvent : utils.addEvent, 16614 target = this.options.bindToWrapper ? this.wrapper : window; 16615 16616 eventType(window, 'orientationchange', this); 16617 eventType(window, 'resize', this); 16618 16619 if (this.options.click) { 16620 eventType(this.wrapper, 'click', this, true); 16621 } 16622 16623 if (!this.options.disableMouse) { 16624 eventType(this.wrapper, 'mousedown', this); 16625 eventType(target, 'mousemove', this); 16626 eventType(target, 'mousecancel', this); 16627 eventType(target, 'mouseup', this); 16628 } 16629 16630 if (utils.hasPointer && !this.options.disablePointer) { 16631 eventType(this.wrapper, utils.prefixPointerEvent('pointerdown'), this); 16632 eventType(target, utils.prefixPointerEvent('pointermove'), this); 16633 eventType(target, utils.prefixPointerEvent('pointercancel'), this); 16634 eventType(target, utils.prefixPointerEvent('pointerup'), this); 16635 } 16636 16637 if (utils.hasTouch && !this.options.disableTouch) { 16638 eventType(this.wrapper, 'touchstart', this); 16639 eventType(target, 'touchmove', this); 16640 eventType(target, 'touchcancel', this); 16641 eventType(target, 'touchend', this); 16642 } 16643 16644 eventType(this.scroller, 'transitionend', this); 16645 eventType(this.scroller, 'webkitTransitionEnd', this); 16646 eventType(this.scroller, 'oTransitionEnd', this); 16647 eventType(this.scroller, 'MSTransitionEnd', this); 16648 }, 16649 16650 getComputedPosition: function () { 16651 var matrix = window.getComputedStyle(this.scroller, null), 16652 x, 16653 y; 16654 16655 if (this.options.useTransform) { 16656 matrix = matrix[utils.style.transform].split(')')[0].split(', '); 16657 x = +(matrix[12] || matrix[4]); 16658 y = +(matrix[13] || matrix[5]); 16659 } else { 16660 x = +matrix.left.replace(/[^-\d.]/g, ''); 16661 y = +matrix.top.replace(/[^-\d.]/g, ''); 16662 } 16663 16664 return { x: x, y: y }; 16665 }, 16666 _initIndicators: function () { 16667 var interactive = this.options.interactiveScrollbars, 16668 customStyle = typeof this.options.scrollbars != 'string', 16669 indicators = [], 16670 indicator; 16671 16672 var that = this; 16673 16674 this.indicators = []; 16675 16676 if (this.options.scrollbars) { 16677 // Vertical scrollbar 16678 if (this.options.scrollY) { 16679 indicator = { 16680 el: createDefaultScrollbar('v', interactive, this.options.scrollbars), 16681 interactive: interactive, 16682 defaultScrollbars: true, 16683 customStyle: customStyle, 16684 resize: this.options.resizeScrollbars, 16685 shrink: this.options.shrinkScrollbars, 16686 fade: this.options.fadeScrollbars, 16687 listenX: false 16688 }; 16689 16690 this.wrapper.appendChild(indicator.el); 16691 indicators.push(indicator); 16692 } 16693 16694 // Horizontal scrollbar 16695 if (this.options.scrollX) { 16696 indicator = { 16697 el: createDefaultScrollbar('h', interactive, this.options.scrollbars), 16698 interactive: interactive, 16699 defaultScrollbars: true, 16700 customStyle: customStyle, 16701 resize: this.options.resizeScrollbars, 16702 shrink: this.options.shrinkScrollbars, 16703 fade: this.options.fadeScrollbars, 16704 listenY: false 16705 }; 16706 16707 this.wrapper.appendChild(indicator.el); 16708 indicators.push(indicator); 16709 } 16710 } 16711 16712 if (this.options.indicators) { 16713 // TODO: check concat compatibility 16714 indicators = indicators.concat(this.options.indicators); 16715 } 16716 16717 for (var i = indicators.length; i--;) { 16718 this.indicators.push(new Indicator(this, indicators[i])); 16719 } 16720 16721 // TODO: check if we can use array.map (wide compatibility and performance issues) 16722 function _indicatorsMap(fn) { 16723 if (that.indicators) { 16724 for (var i = that.indicators.length; i--;) { 16725 fn.call(that.indicators[i]); 16726 } 16727 } 16728 } 16729 16730 if (this.options.fadeScrollbars) { 16731 this.on('scrollEnd', function () { 16732 _indicatorsMap(function () { 16733 this.fade(); 16734 }); 16735 }); 16736 16737 this.on('scrollCancel', function () { 16738 _indicatorsMap(function () { 16739 this.fade(); 16740 }); 16741 }); 16742 16743 this.on('scrollStart', function () { 16744 _indicatorsMap(function () { 16745 this.fade(1); 16746 }); 16747 }); 16748 16749 this.on('beforeScrollStart', function () { 16750 _indicatorsMap(function () { 16751 this.fade(1, true); 16752 }); 16753 }); 16754 } 16755 16756 this.on('refresh', function () { 16757 _indicatorsMap(function () { 16758 this.refresh(); 16759 }); 16760 }); 16761 16762 this.on('destroy', function () { 16763 _indicatorsMap(function () { 16764 this.destroy(); 16765 }); 16766 16767 delete this.indicators; 16768 }); 16769 }, 16770 16771 _initWheel: function () { 16772 utils.addEvent(this.wrapper, 'wheel', this); 16773 utils.addEvent(this.wrapper, 'mousewheel', this); 16774 utils.addEvent(this.wrapper, 'DOMMouseScroll', this); 16775 16776 this.on('destroy', function () { 16777 clearTimeout(this.wheelTimeout); 16778 this.wheelTimeout = null; 16779 utils.removeEvent(this.wrapper, 'wheel', this); 16780 utils.removeEvent(this.wrapper, 'mousewheel', this); 16781 utils.removeEvent(this.wrapper, 'DOMMouseScroll', this); 16782 }); 16783 }, 16784 16785 _wheel: function (e) { 16786 if (!this.enabled) { 16787 return; 16788 } 16789 16790 e.preventDefault(); 16791 16792 var wheelDeltaX,
vendor: 11,445 bytes, lines 16793-17285
16793 wheelDeltaY, 16794 newX, 16795 newY, 16796 that = this; 16797 16798 if (this.wheelTimeout === undefined) { 16799 that._execEvent('scrollStart'); 16800 } 16801 16802 // Execute the scrollEnd event after 400ms the wheel stopped scrolling 16803 clearTimeout(this.wheelTimeout); 16804 this.wheelTimeout = setTimeout(function () { 16805 if (!that.options.snap) { 16806 that._execEvent('scrollEnd'); 16807 } 16808 that.wheelTimeout = undefined; 16809 }, 400); 16810 16811 if ('deltaX' in e) { 16812 if (e.deltaMode === 1) { 16813 wheelDeltaX = -e.deltaX * this.options.mouseWheelSpeed; 16814 wheelDeltaY = -e.deltaY * this.options.mouseWheelSpeed; 16815 } else { 16816 wheelDeltaX = -e.deltaX; 16817 wheelDeltaY = -e.deltaY; 16818 } 16819 } else if ('wheelDeltaX' in e) { 16820 wheelDeltaX = e.wheelDeltaX / 120 * this.options.mouseWheelSpeed; 16821 wheelDeltaY = e.wheelDeltaY / 120 * this.options.mouseWheelSpeed; 16822 } else if ('wheelDelta' in e) { 16823 wheelDeltaX = wheelDeltaY = e.wheelDelta / 120 * this.options.mouseWheelSpeed; 16824 } else if ('detail' in e) { 16825 wheelDeltaX = wheelDeltaY = -e.detail / 3 * this.options.mouseWheelSpeed; 16826 } else { 16827 return; 16828 } 16829 16830 wheelDeltaX *= this.options.invertWheelDirection; 16831 wheelDeltaY *= this.options.invertWheelDirection; 16832 16833 if (!this.hasVerticalScroll) { 16834 wheelDeltaX = wheelDeltaY; 16835 wheelDeltaY = 0; 16836 } 16837 16838 if (this.options.snap) { 16839 newX = this.currentPage.pageX; 16840 newY = this.currentPage.pageY; 16841 16842 if (wheelDeltaX > 0) { 16843 newX--; 16844 } else if (wheelDeltaX < 0) { 16845 newX++; 16846 } 16847 16848 if (wheelDeltaY > 0) { 16849 newY--; 16850 } else if (wheelDeltaY < 0) { 16851 newY++; 16852 } 16853 16854 this.goToPage(newX, newY); 16855 16856 return; 16857 } 16858 16859 newX = this.x + Math.round(this.hasHorizontalScroll ? wheelDeltaX : 0); 16860 newY = this.y + Math.round(this.hasVerticalScroll ? wheelDeltaY : 0); 16861 16862 this.directionX = wheelDeltaX > 0 ? -1 : wheelDeltaX < 0 ? 1 : 0; 16863 this.directionY = wheelDeltaY > 0 ? -1 : wheelDeltaY < 0 ? 1 : 0; 16864 16865 if (newX > 0) { 16866 newX = 0; 16867 } else if (newX < this.maxScrollX) { 16868 newX = this.maxScrollX; 16869 } 16870 16871 if (newY > 0) { 16872 newY = 0; 16873 } else if (newY < this.maxScrollY) { 16874 newY = this.maxScrollY; 16875 } 16876 16877 this.scrollTo(newX, newY, 0); 16878 16879 // INSERT POINT: _wheel 16880 }, 16881 16882 _initSnap: function () { 16883 this.currentPage = {}; 16884 16885 if (typeof this.options.snap == 'string') { 16886 this.options.snap = this.scroller.querySelectorAll(this.options.snap); 16887 } 16888 16889 this.on('refresh', function () { 16890 var i = 0, 16891 l, 16892 m = 0, 16893 n, 16894 cx, 16895 cy, 16896 x = 0, 16897 y, 16898 stepX = this.options.snapStepX || this.wrapperWidth, 16899 stepY = this.options.snapStepY || this.wrapperHeight, 16900 el; 16901 16902 this.pages = []; 16903 16904 if (!this.wrapperWidth || !this.wrapperHeight || !this.scrollerWidth || !this.scrollerHeight) { 16905 return; 16906 } 16907 16908 if (this.options.snap === true) { 16909 cx = Math.round(stepX / 2); 16910 cy = Math.round(stepY / 2); 16911 16912 while (x > -this.scrollerWidth) { 16913 this.pages[i] = []; 16914 l = 0; 16915 y = 0; 16916 16917 while (y > -this.scrollerHeight) { 16918 this.pages[i][l] = { 16919 x: Math.max(x, this.maxScrollX), 16920 y: Math.max(y, this.maxScrollY), 16921 width: stepX, 16922 height: stepY, 16923 cx: x - cx, 16924 cy: y - cy 16925 }; 16926 16927 y -= stepY; 16928 l++; 16929 } 16930 16931 x -= stepX; 16932 i++; 16933 } 16934 } else { 16935 el = this.options.snap; 16936 l = el.length; 16937 n = -1; 16938 16939 for (; i < l; i++) { 16940 if (i === 0 || el[i].offsetLeft <= el[i - 1].offsetLeft) { 16941 m = 0; 16942 n++; 16943 } 16944 16945 if (!this.pages[m]) { 16946 this.pages[m] = []; 16947 } 16948 16949 x = Math.max(-el[i].offsetLeft, this.maxScrollX); 16950 y = Math.max(-el[i].offsetTop, this.maxScrollY); 16951 cx = x - Math.round(el[i].offsetWidth / 2); 16952 cy = y - Math.round(el[i].offsetHeight / 2); 16953 16954 this.pages[m][n] = { 16955 x: x, 16956 y: y, 16957 width: el[i].offsetWidth, 16958 height: el[i].offsetHeight, 16959 cx: cx, 16960 cy: cy 16961 }; 16962 16963 if (x > this.maxScrollX) { 16964 m++; 16965 } 16966 } 16967 } 16968 16969 this.goToPage(this.currentPage.pageX || 0, this.currentPage.pageY || 0, 0); 16970 16971 // Update snap threshold if needed 16972 if (this.options.snapThreshold % 1 === 0) { 16973 this.snapThresholdX = this.options.snapThreshold; 16974 this.snapThresholdY = this.options.snapThreshold; 16975 } else { 16976 this.snapThresholdX = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].width * this.options.snapThreshold); 16977 this.snapThresholdY = Math.round(this.pages[this.currentPage.pageX][this.currentPage.pageY].height * this.options.snapThreshold); 16978 } 16979 }); 16980 16981 this.on('flick', function () { 16982 var time = this.options.snapSpeed || Math.max(Math.max(Math.min(Math.abs(this.x - this.startX), 1000), Math.min(Math.abs(this.y - this.startY), 1000)), 300); 16983 16984 this.goToPage(this.currentPage.pageX + this.directionX, this.currentPage.pageY + this.directionY, time); 16985 }); 16986 }, 16987 16988 _nearestSnap: function (x, y) { 16989 if (!this.pages.length) { 16990 return { x: 0, y: 0, pageX: 0, pageY: 0 }; 16991 } 16992 16993 var i = 0, 16994 l = this.pages.length, 16995 m = 0; 16996 16997 // Check if we exceeded the snap threshold 16998 if (Math.abs(x - this.absStartX) < this.snapThresholdX && Math.abs(y - this.absStartY) < this.snapThresholdY) { 16999 return this.currentPage; 17000 } 17001 17002 if (x > 0) { 17003 x = 0; 17004 } else if (x < this.maxScrollX) { 17005 x = this.maxScrollX; 17006 } 17007 17008 if (y > 0) { 17009 y = 0; 17010 } else if (y < this.maxScrollY) { 17011 y = this.maxScrollY; 17012 } 17013 17014 for (; i < l; i++) { 17015 if (x >= this.pages[i][0].cx) { 17016 x = this.pages[i][0].x; 17017 break; 17018 } 17019 } 17020 17021 l = this.pages[i].length; 17022 17023 for (; m < l; m++) { 17024 if (y >= this.pages[0][m].cy) { 17025 y = this.pages[0][m].y; 17026 break; 17027 } 17028 } 17029 17030 if (i == this.currentPage.pageX) { 17031 i += this.directionX; 17032 17033 if (i < 0) { 17034 i = 0; 17035 } else if (i >= this.pages.length) { 17036 i = this.pages.length - 1; 17037 } 17038 17039 x = this.pages[i][0].x; 17040 } 17041 17042 if (m == this.currentPage.pageY) { 17043 m += this.directionY; 17044 17045 if (m < 0) { 17046 m = 0; 17047 } else if (m >= this.pages[0].length) { 17048 m = this.pages[0].length - 1; 17049 } 17050 17051 y = this.pages[0][m].y; 17052 } 17053 17054 return { 17055 x: x, 17056 y: y, 17057 pageX: i, 17058 pageY: m 17059 }; 17060 }, 17061 17062 goToPage: function (x, y, time, easing) { 17063 easing = easing || this.options.bounceEasing; 17064 17065 if (x >= this.pages.length) { 17066 x = this.pages.length - 1; 17067 } else if (x < 0) { 17068 x = 0; 17069 } 17070 17071 if (y >= this.pages[x].length) { 17072 y = this.pages[x].length - 1; 17073 } else if (y < 0) { 17074 y = 0; 17075 } 17076 17077 var posX = this.pages[x][y].x, 17078 posY = this.pages[x][y].y; 17079 17080 time = time === undefined ? this.options.snapSpeed || Math.max(Math.max(Math.min(Math.abs(posX - this.x), 1000), Math.min(Math.abs(posY - this.y), 1000)), 300) : time; 17081 17082 this.currentPage = { 17083 x: posX, 17084 y: posY, 17085 pageX: x, 17086 pageY: y 17087 }; 17088 17089 this.scrollTo(posX, posY, time, easing); 17090 }, 17091 17092 next: function (time, easing) { 17093 var x = this.currentPage.pageX, 17094 y = this.currentPage.pageY; 17095 17096 x++; 17097 17098 if (x >= this.pages.length && this.hasVerticalScroll) { 17099 x = 0; 17100 y++; 17101 } 17102 17103 this.goToPage(x, y, time, easing); 17104 }, 17105 17106 prev: function (time, easing) { 17107 var x = this.currentPage.pageX, 17108 y = this.currentPage.pageY; 17109 17110 x--; 17111 17112 if (x < 0 && this.hasVerticalScroll) { 17113 x = 0; 17114 y--; 17115 } 17116 17117 this.goToPage(x, y, time, easing); 17118 }, 17119 17120 _initKeys: function (e) { 17121 // default key bindings 17122 var keys = { 17123 pageUp: 33, 17124 pageDown: 34, 17125 end: 35, 17126 home: 36, 17127 left: 37, 17128 up: 38, 17129 right: 39, 17130 down: 40 17131 }; 17132 var i; 17133 17134 // if you give me characters I give you keycode 17135 if (typeof this.options.keyBindings == 'object') { 17136 for (i in this.options.keyBindings) { 17137 if (typeof this.options.keyBindings[i] == 'string') { 17138 this.options.keyBindings[i] = this.options.keyBindings[i].toUpperCase().charCodeAt(0); 17139 } 17140 } 17141 } else { 17142 this.options.keyBindings = {}; 17143 } 17144 17145 for (i in keys) { 17146 this.options.keyBindings[i] = this.options.keyBindings[i] || keys[i]; 17147 } 17148 17149 utils.addEvent(window, 'keydown', this); 17150 17151 this.on('destroy', function () { 17152 utils.removeEvent(window, 'keydown', this); 17153 }); 17154 }, 17155 17156 _key: function (e) { 17157 if (!this.enabled) { 17158 return; 17159 } 17160 17161 var snap = this.options.snap, 17162 // we are using this alot, better to cache it 17163 newX = snap ? this.currentPage.pageX : this.x, 17164 newY = snap ? this.currentPage.pageY : this.y, 17165 now = utils.getTime(), 17166 prevTime = this.keyTime || 0, 17167 acceleration = 0.250, 17168 pos; 17169 17170 if (this.options.useTransition && this.isInTransition) { 17171 pos = this.getComputedPosition(); 17172 17173 this._translate(Math.round(pos.x), Math.round(pos.y)); 17174 this.isInTransition = false; 17175 } 17176 17177 this.keyAcceleration = now - prevTime < 200 ? Math.min(this.keyAcceleration + acceleration, 50) : 0; 17178 17179 switch (e.keyCode) { 17180 case this.options.keyBindings.pageUp: 17181 if (this.hasHorizontalScroll && !this.hasVerticalScroll) { 17182 newX += snap ? 1 : this.wrapperWidth; 17183 } else { 17184 newY += snap ? 1 : this.wrapperHeight; 17185 } 17186 break; 17187 case this.options.keyBindings.pageDown: 17188 if (this.hasHorizontalScroll && !this.hasVerticalScroll) { 17189 newX -= snap ? 1 : this.wrapperWidth; 17190 } else { 17191 newY -= snap ? 1 : this.wrapperHeight; 17192 } 17193 break; 17194 case this.options.keyBindings.end: 17195 newX = snap ? this.pages.length - 1 : this.maxScrollX; 17196 newY = snap ? this.pages[0].length - 1 : this.maxScrollY; 17197 break; 17198 case this.options.keyBindings.home: 17199 newX = 0; 17200 newY = 0; 17201 break; 17202 case this.options.keyBindings.left: 17203 newX += snap ? -1 : 5 + this.keyAcceleration >> 0; 17204 break; 17205 case this.options.keyBindings.up: 17206 newY += snap ? 1 : 5 + this.keyAcceleration >> 0; 17207 break; 17208 case this.options.keyBindings.right: 17209 newX -= snap ? -1 : 5 + this.keyAcceleration >> 0; 17210 break; 17211 case this.options.keyBindings.down: 17212 newY -= snap ? 1 : 5 + this.keyAcceleration >> 0; 17213 break; 17214 default: 17215 return; 17216 } 17217 17218 if (snap) { 17219 this.goToPage(newX, newY); 17220 return; 17221 } 17222 17223 if (newX > 0) { 17224 newX = 0; 17225 this.keyAcceleration = 0; 17226 } else if (newX < this.maxScrollX) { 17227 newX = this.maxScrollX; 17228 this.keyAcceleration = 0; 17229 } 17230 17231 if (newY > 0) { 17232 newY = 0; 17233 this.keyAcceleration = 0; 17234 } else if (newY < this.maxScrollY) { 17235 newY = this.maxScrollY; 17236 this.keyAcceleration = 0; 17237 } 17238 17239 this.scrollTo(newX, newY, 0); 17240 17241 this.keyTime = now; 17242 }, 17243 17244 _animate: function (destX, destY, duration, easingFn) { 17245 var that = this, 17246 startX = this.x, 17247 startY = this.y, 17248 startTime = utils.getTime(), 17249 destTime = startTime + duration; 17250 17251 function step() { 17252 var now = utils.getTime(), 17253 newX, 17254 newY, 17255 easing; 17256 17257 if (now >= destTime) { 17258 that.isAnimating = false; 17259 that._translate(destX, destY); 17260 17261 if (!that.resetPosition(that.options.bounceTime)) { 17262 that._execEvent('scrollEnd'); 17263 } 17264 17265 return; 17266 } 17267 17268 now = (now - startTime) / duration; 17269 easing = easingFn(now); 17270 newX = (destX - startX) * easing + startX; 17271 newY = (destY - startY) * easing + startY; 17272 that._translate(newX, newY); 17273 17274 if (that.isAnimating) { 17275 rAF(step); 17276 } 17277 } 17278 17279 this.isAnimating = true; 17280 step(); 17281 }, 17282 handleEvent: function (e) { 17283 switch (e.type) { 17284 case 'touchstart': 17285 case 'pointerdown':
vendor: 9,265 bytes, lines 17286-17630
17286 case 'MSPointerDown': 17287 case 'mousedown': 17288 this._start(e); 17289 break; 17290 case 'touchmove': 17291 case 'pointermove': 17292 case 'MSPointerMove': 17293 case 'mousemove': 17294 this._move(e); 17295 break; 17296 case 'touchend': 17297 case 'pointerup': 17298 case 'MSPointerUp': 17299 case 'mouseup': 17300 case 'touchcancel': 17301 case 'pointercancel': 17302 case 'MSPointerCancel': 17303 case 'mousecancel': 17304 this._end(e); 17305 break; 17306 case 'orientationchange': 17307 case 'resize': 17308 this._resize(); 17309 break; 17310 case 'transitionend': 17311 case 'webkitTransitionEnd': 17312 case 'oTransitionEnd': 17313 case 'MSTransitionEnd': 17314 this._transitionEnd(e); 17315 break; 17316 case 'wheel': 17317 case 'DOMMouseScroll': 17318 case 'mousewheel': 17319 this._wheel(e); 17320 break; 17321 case 'keydown': 17322 this._key(e); 17323 break; 17324 case 'click': 17325 if (this.enabled && !e._constructed) { 17326 e.preventDefault(); 17327 e.stopPropagation(); 17328 } 17329 break; 17330 } 17331 } 17332 }; 17333 function createDefaultScrollbar(direction, interactive, type) { 17334 var scrollbar = document.createElement('div'), 17335 indicator = document.createElement('div'); 17336 17337 if (type === true) { 17338 scrollbar.style.cssText = 'position:absolute;z-index:9999'; 17339 indicator.style.cssText = '-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);border-radius:3px'; 17340 } 17341 17342 indicator.className = 'iScrollIndicator'; 17343 17344 if (direction == 'h') { 17345 if (type === true) { 17346 scrollbar.style.cssText += ';height:7px;left:2px;right:2px;bottom:0'; 17347 indicator.style.height = '100%'; 17348 } 17349 scrollbar.className = 'iScrollHorizontalScrollbar'; 17350 } else { 17351 if (type === true) { 17352 scrollbar.style.cssText += ';width:7px;bottom:2px;top:2px;right:1px'; 17353 indicator.style.width = '100%'; 17354 } 17355 scrollbar.className = 'iScrollVerticalScrollbar'; 17356 } 17357 17358 scrollbar.style.cssText += ';overflow:hidden'; 17359 17360 if (!interactive) { 17361 scrollbar.style.pointerEvents = 'none'; 17362 } 17363 17364 scrollbar.appendChild(indicator); 17365 17366 return scrollbar; 17367 } 17368 17369 function Indicator(scroller, options) { 17370 this.wrapper = typeof options.el == 'string' ? document.querySelector(options.el) : options.el; 17371 this.wrapperStyle = this.wrapper.style; 17372 this.indicator = this.wrapper.children[0]; 17373 this.indicatorStyle = this.indicator.style; 17374 this.scroller = scroller; 17375 17376 this.options = { 17377 listenX: true, 17378 listenY: true, 17379 interactive: false, 17380 resize: true, 17381 defaultScrollbars: false, 17382 shrink: false, 17383 fade: false, 17384 speedRatioX: 0, 17385 speedRatioY: 0 17386 }; 17387 17388 for (var i in options) { 17389 this.options[i] = options[i]; 17390 } 17391 17392 this.sizeRatioX = 1; 17393 this.sizeRatioY = 1; 17394 this.maxPosX = 0; 17395 this.maxPosY = 0; 17396 17397 if (this.options.interactive) { 17398 if (!this.options.disableTouch) { 17399 utils.addEvent(this.indicator, 'touchstart', this); 17400 utils.addEvent(window, 'touchend', this); 17401 } 17402 if (!this.options.disablePointer) { 17403 utils.addEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this); 17404 utils.addEvent(window, utils.prefixPointerEvent('pointerup'), this); 17405 } 17406 if (!this.options.disableMouse) { 17407 utils.addEvent(this.indicator, 'mousedown', this); 17408 utils.addEvent(window, 'mouseup', this); 17409 } 17410 } 17411 17412 if (this.options.fade) { 17413 this.wrapperStyle[utils.style.transform] = this.scroller.translateZ; 17414 var durationProp = utils.style.transitionDuration; 17415 this.wrapperStyle[durationProp] = utils.isBadAndroid ? '0.0001ms' : '0ms'; 17416 // remove 0.0001ms 17417 var self = this; 17418 if (utils.isBadAndroid) { 17419 rAF(function () { 17420 if (self.wrapperStyle[durationProp] === '0.0001ms') { 17421 self.wrapperStyle[durationProp] = '0s'; 17422 } 17423 }); 17424 } 17425 this.wrapperStyle.opacity = '0'; 17426 } 17427 } 17428 17429 Indicator.prototype = { 17430 handleEvent: function (e) { 17431 switch (e.type) { 17432 case 'touchstart': 17433 case 'pointerdown': 17434 case 'MSPointerDown': 17435 case 'mousedown': 17436 this._start(e); 17437 break; 17438 case 'touchmove': 17439 case 'pointermove': 17440 case 'MSPointerMove': 17441 case 'mousemove': 17442 this._move(e); 17443 break; 17444 case 'touchend': 17445 case 'pointerup': 17446 case 'MSPointerUp': 17447 case 'mouseup': 17448 case 'touchcancel': 17449 case 'pointercancel': 17450 case 'MSPointerCancel': 17451 case 'mousecancel': 17452 this._end(e); 17453 break; 17454 } 17455 }, 17456 17457 destroy: function () { 17458 if (this.options.fadeScrollbars) { 17459 clearTimeout(this.fadeTimeout); 17460 this.fadeTimeout = null; 17461 } 17462 if (this.options.interactive) { 17463 utils.removeEvent(this.indicator, 'touchstart', this); 17464 utils.removeEvent(this.indicator, utils.prefixPointerEvent('pointerdown'), this); 17465 utils.removeEvent(this.indicator, 'mousedown', this); 17466 17467 utils.removeEvent(window, 'touchmove', this); 17468 utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this); 17469 utils.removeEvent(window, 'mousemove', this); 17470 17471 utils.removeEvent(window, 'touchend', this); 17472 utils.removeEvent(window, utils.prefixPointerEvent('pointerup'), this); 17473 utils.removeEvent(window, 'mouseup', this); 17474 } 17475 17476 if (this.options.defaultScrollbars) { 17477 this.wrapper.parentNode.removeChild(this.wrapper); 17478 } 17479 }, 17480 17481 _start: function (e) { 17482 var point = e.touches ? e.touches[0] : e; 17483 17484 e.preventDefault(); 17485 e.stopPropagation(); 17486 17487 this.transitionTime(); 17488 17489 this.initiated = true; 17490 this.moved = false; 17491 this.lastPointX = point.pageX; 17492 this.lastPointY = point.pageY; 17493 17494 this.startTime = utils.getTime(); 17495 17496 if (!this.options.disableTouch) { 17497 utils.addEvent(window, 'touchmove', this); 17498 } 17499 if (!this.options.disablePointer) { 17500 utils.addEvent(window, utils.prefixPointerEvent('pointermove'), this); 17501 } 17502 if (!this.options.disableMouse) { 17503 utils.addEvent(window, 'mousemove', this); 17504 } 17505 17506 this.scroller._execEvent('beforeScrollStart'); 17507 }, 17508 17509 _move: function (e) { 17510 var point = e.touches ? e.touches[0] : e, 17511 deltaX, 17512 deltaY, 17513 newX, 17514 newY, 17515 timestamp = utils.getTime(); 17516 17517 if (!this.moved) { 17518 this.scroller._execEvent('scrollStart'); 17519 } 17520 17521 this.moved = true; 17522 17523 deltaX = point.pageX - this.lastPointX; 17524 this.lastPointX = point.pageX; 17525 17526 deltaY = point.pageY - this.lastPointY; 17527 this.lastPointY = point.pageY; 17528 17529 newX = this.x + deltaX; 17530 newY = this.y + deltaY; 17531 17532 this._pos(newX, newY); 17533 17534 // INSERT POINT: indicator._move 17535 17536 e.preventDefault(); 17537 e.stopPropagation(); 17538 }, 17539 17540 _end: function (e) { 17541 if (!this.initiated) { 17542 return; 17543 } 17544 17545 this.initiated = false; 17546 17547 e.preventDefault(); 17548 e.stopPropagation(); 17549 17550 utils.removeEvent(window, 'touchmove', this); 17551 utils.removeEvent(window, utils.prefixPointerEvent('pointermove'), this); 17552 utils.removeEvent(window, 'mousemove', this); 17553 17554 if (this.scroller.options.snap) { 17555 var snap = this.scroller._nearestSnap(this.scroller.x, this.scroller.y); 17556 17557 var time = this.options.snapSpeed || Math.max(Math.max(Math.min(Math.abs(this.scroller.x - snap.x), 1000), Math.min(Math.abs(this.scroller.y - snap.y), 1000)), 300); 17558 17559 if (this.scroller.x != snap.x || this.scroller.y != snap.y) { 17560 this.scroller.directionX = 0; 17561 this.scroller.directionY = 0; 17562 this.scroller.currentPage = snap; 17563 this.scroller.scrollTo(snap.x, snap.y, time, this.scroller.options.bounceEasing); 17564 } 17565 } 17566 17567 if (this.moved) { 17568 this.scroller._execEvent('scrollEnd'); 17569 } 17570 }, 17571 17572 transitionTime: function (time) { 17573 time = time || 0; 17574 var durationProp = utils.style.transitionDuration; 17575 this.indicatorStyle[durationProp] = time + 'ms'; 17576 17577 if (!time && utils.isBadAndroid) { 17578 this.indicatorStyle[durationProp] = '0.0001ms'; 17579 // remove 0.0001ms 17580 var self = this; 17581 rAF(function () { 17582 if (self.indicatorStyle[durationProp] === '0.0001ms') { 17583 self.indicatorStyle[durationProp] = '0s'; 17584 } 17585 }); 17586 } 17587 }, 17588 17589 transitionTimingFunction: function (easing) { 17590 this.indicatorStyle[utils.style.transitionTimingFunction] = easing; 17591 }, 17592 17593 refresh: function () { 17594 this.transitionTime(); 17595 17596 if (this.options.listenX && !this.options.listenY) { 17597 this.indicatorStyle.display = this.scroller.hasHorizontalScroll ? 'block' : 'none'; 17598 } else if (this.options.listenY && !this.options.listenX) { 17599 this.indicatorStyle.display = this.scroller.hasVerticalScroll ? 'block' : 'none'; 17600 } else { 17601 this.indicatorStyle.display = this.scroller.hasHorizontalScroll || this.scroller.hasVerticalScroll ? 'block' : 'none'; 17602 } 17603 17604 if (this.scroller.hasHorizontalScroll && this.scroller.hasVerticalScroll) { 17605 utils.addClass(this.wrapper, 'iScrollBothScrollbars'); 17606 utils.removeClass(this.wrapper, 'iScrollLoneScrollbar'); 17607 17608 if (this.options.defaultScrollbars && this.options.customStyle) { 17609 if (this.options.listenX) { 17610 this.wrapper.style.right = '8px'; 17611 } else { 17612 this.wrapper.style.bottom = '8px'; 17613 } 17614 } 17615 } else { 17616 utils.removeClass(this.wrapper, 'iScrollBothScrollbars'); 17617 utils.addClass(this.wrapper, 'iScrollLoneScrollbar'); 17618 17619 if (this.options.defaultScrollbars && this.options.customStyle) { 17620 if (this.options.listenX) { 17621 this.wrapper.style.right = '2px'; 17622 } else { 17623 this.wrapper.style.bottom = '2px'; 17624 } 17625 } 17626 } 17627 17628 var r = this.wrapper.offsetHeight; // force refresh 17629 17630 if (this.options.listenX) {
vendor: 4,299 bytes, lines 17631-17760
17631 this.wrapperWidth = this.wrapper.clientWidth; 17632 if (this.options.resize) { 17633 this.indicatorWidth = Math.max(Math.round(this.wrapperWidth * this.wrapperWidth / (this.scroller.scrollerWidth || this.wrapperWidth || 1)), 8); 17634 this.indicatorStyle.width = this.indicatorWidth + 'px'; 17635 } else { 17636 this.indicatorWidth = this.indicator.clientWidth; 17637 } 17638 17639 this.maxPosX = this.wrapperWidth - this.indicatorWidth; 17640 17641 if (this.options.shrink == 'clip') { 17642 this.minBoundaryX = -this.indicatorWidth + 8; 17643 this.maxBoundaryX = this.wrapperWidth - 8; 17644 } else { 17645 this.minBoundaryX = 0; 17646 this.maxBoundaryX = this.maxPosX; 17647 } 17648 17649 this.sizeRatioX = this.options.speedRatioX || this.scroller.maxScrollX && this.maxPosX / this.scroller.maxScrollX; 17650 } 17651 17652 if (this.options.listenY) { 17653 this.wrapperHeight = this.wrapper.clientHeight; 17654 if (this.options.resize) { 17655 this.indicatorHeight = Math.max(Math.round(this.wrapperHeight * this.wrapperHeight / (this.scroller.scrollerHeight || this.wrapperHeight || 1)), 8); 17656 this.indicatorStyle.height = this.indicatorHeight + 'px'; 17657 } else { 17658 this.indicatorHeight = this.indicator.clientHeight; 17659 } 17660 17661 this.maxPosY = this.wrapperHeight - this.indicatorHeight; 17662 17663 if (this.options.shrink == 'clip') { 17664 this.minBoundaryY = -this.indicatorHeight + 8; 17665 this.maxBoundaryY = this.wrapperHeight - 8; 17666 } else { 17667 this.minBoundaryY = 0; 17668 this.maxBoundaryY = this.maxPosY; 17669 } 17670 17671 this.maxPosY = this.wrapperHeight - this.indicatorHeight; 17672 this.sizeRatioY = this.options.speedRatioY || this.scroller.maxScrollY && this.maxPosY / this.scroller.maxScrollY; 17673 } 17674 17675 this.updatePosition(); 17676 }, 17677 17678 updatePosition: function () { 17679 var x = this.options.listenX && Math.round(this.sizeRatioX * this.scroller.x) || 0, 17680 y = this.options.listenY && Math.round(this.sizeRatioY * this.scroller.y) || 0; 17681 17682 if (!this.options.ignoreBoundaries) { 17683 if (x < this.minBoundaryX) { 17684 if (this.options.shrink == 'scale') { 17685 this.width = Math.max(this.indicatorWidth + x, 8); 17686 this.indicatorStyle.width = this.width + 'px'; 17687 } 17688 x = this.minBoundaryX; 17689 } else if (x > this.maxBoundaryX) { 17690 if (this.options.shrink == 'scale') { 17691 this.width = Math.max(this.indicatorWidth - (x - this.maxPosX), 8); 17692 this.indicatorStyle.width = this.width + 'px'; 17693 x = this.maxPosX + this.indicatorWidth - this.width; 17694 } else { 17695 x = this.maxBoundaryX; 17696 } 17697 } else if (this.options.shrink == 'scale' && this.width != this.indicatorWidth) { 17698 this.width = this.indicatorWidth; 17699 this.indicatorStyle.width = this.width + 'px'; 17700 } 17701 17702 if (y < this.minBoundaryY) { 17703 if (this.options.shrink == 'scale') { 17704 this.height = Math.max(this.indicatorHeight + y * 3, 8); 17705 this.indicatorStyle.height = this.height + 'px'; 17706 } 17707 y = this.minBoundaryY; 17708 } else if (y > this.maxBoundaryY) { 17709 if (this.options.shrink == 'scale') { 17710 this.height = Math.max(this.indicatorHeight - (y - this.maxPosY) * 3, 8); 17711 this.indicatorStyle.height = this.height + 'px'; 17712 y = this.maxPosY + this.indicatorHeight - this.height; 17713 } else { 17714 y = this.maxBoundaryY; 17715 } 17716 } else if (this.options.shrink == 'scale' && this.height != this.indicatorHeight) { 17717 this.height = this.indicatorHeight; 17718 this.indicatorStyle.height = this.height + 'px'; 17719 } 17720 } 17721 17722 this.x = x; 17723 this.y = y; 17724 17725 if (this.scroller.options.useTransform) { 17726 this.indicatorStyle[utils.style.transform] = 'translate(' + x + 'px,' + y + 'px)' + this.scroller.translateZ; 17727 } else { 17728 this.indicatorStyle.left = x + 'px'; 17729 this.indicatorStyle.top = y + 'px'; 17730 } 17731 }, 17732 17733 _pos: function (x, y) { 17734 if (x < 0) { 17735 x = 0; 17736 } else if (x > this.maxPosX) { 17737 x = this.maxPosX; 17738 } 17739 17740 if (y < 0) { 17741 y = 0; 17742 } else if (y > this.maxPosY) { 17743 y = this.maxPosY; 17744 } 17745 17746 x = this.options.listenX ? Math.round(x / this.sizeRatioX) : this.scroller.x; 17747 y = this.options.listenY ? Math.round(y / this.sizeRatioY) : this.scroller.y; 17748 17749 this.scroller.scrollTo(x, y); 17750 }, 17751 17752 fade: function (val, hold) { 17753 if (hold && !this.visible) { 17754 return; 17755 } 17756 17757 clearTimeout(this.fadeTimeout); 17758 this.fadeTimeout = null; 17759 17760 var time = val ? 250 : 500,
17761 delay = val ? 0 : 300; 17762 17763 val = val ? '1' : '0'; 17764 17765 this.wrapperStyle[utils.style.transitionDuration] = time + 'ms'; 17766 17767 this.fadeTimeout = setTimeout(function (val) { 17768 this.wrapperStyle.opacity = val; 17769 this.visible = +val; 17770 }.bind(this, val), delay); 17771 } 17772 }; 17773 17774 IScroll.utils = utils; 17775 17776 if (typeof module != 'undefined' && module.exports) { 17777 module.exports = IScroll; 17778 } else if (true) { 17779 !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { 17780 return IScroll; 17781 }).call(exports, __webpack_require__, exports, module), 17782 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 17783 } else { 17784 window.IScroll = IScroll; 17785 } 17786})(window, document, Math); 17787 17788/***/ }) 17789/******/ ]); 17790//# sourceMappingURL=../../src/map/lyt-cn-face.js.map
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.