vendor: 4,203 bytes, lines 1-137
1/*! 2 * jQuery JavaScript Library v3.5.1 3 * https://jquery.com/ 4 * 5 * Includes Sizzle.js 6 * https://sizzlejs.com/ 7 * 8 * Copyright JS Foundation and other contributors 9 * Released under the MIT license 10 * https://jquery.org/license 11 * 12 * Date: 2020-05-04T22:49Z 13 */ 14( function( global, factory ) { 15 16 "use strict"; 17 18 if ( typeof module === "object" && typeof module.exports === "object" ) { 19 20 // For CommonJS and CommonJS-like environments where a proper `window` 21 // is present, execute the factory and get jQuery. 22 // For environments that do not have a `window` with a `document` 23 // (such as Node.js), expose a factory as module.exports. 24 // This accentuates the need for the creation of a real `window`. 25 // e.g. var jQuery = require("jquery")(window); 26 // See ticket #14549 for more info. 27 module.exports = global.document ? 28 factory( global, true ) : 29 function( w ) { 30 if ( !w.document ) { 31 throw new Error( "jQuery requires a window with a document" ); 32 } 33 return factory( w ); 34 }; 35 } else { 36 factory( global ); 37 } 38 39// Pass this if window is not defined yet 40} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 41 42// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 43// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 44// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 45// enough that all such attempts are guarded in a try block. 46 "use strict"; 47 48 var arr = []; 49 50 var getProto = Object.getPrototypeOf; 51 52 var slice = arr.slice; 53 54 var flat = arr.flat ? function( array ) { 55 return arr.flat.call( array ); 56 } : function( array ) { 57 return arr.concat.apply( [], array ); 58 }; 59 60 61 var push = arr.push; 62 63 var indexOf = arr.indexOf; 64 65 var class2type = {}; 66 67 var toString = class2type.toString; 68 69 var hasOwn = class2type.hasOwnProperty; 70 71 var fnToString = hasOwn.toString; 72 73 var ObjectFunctionString = fnToString.call( Object ); 74 75 var support = {}; 76 77 var isFunction = function isFunction( obj ) { 78 79 // Support: Chrome <=57, Firefox <=52 80 // In some browsers, typeof returns "function" for HTML <object> elements 81 // (i.e., `typeof document.createElement( "object" ) === "function"`). 82 // We don't want to classify *any* DOM node as a function. 83 return typeof obj === "function" && typeof obj.nodeType !== "number"; 84 }; 85 86 87 var isWindow = function isWindow( obj ) { 88 return obj != null && obj === obj.window; 89 }; 90 91 92 var document = window.document; 93 94 95 96 var preservedScriptAttributes = { 97 type: true, 98 src: true, 99 nonce: true, 100 noModule: true 101 }; 102 103 function DOMEval( code, node, doc ) { 104 doc = doc || document; 105 106 var i, val, 107 script = doc.createElement( "script" ); 108 109 script.text = code; 110 if ( node ) { 111 for ( i in preservedScriptAttributes ) { 112 113 // Support: Firefox 64+, Edge 18+ 114 // Some browsers don't support the "nonce" property on scripts. 115 // On the other hand, just using `getAttribute` is not enough as 116 // the `nonce` attribute is reset to an empty string whenever it 117 // becomes browsing-context connected. 118 // See https://github.com/whatwg/html/issues/2369 119 // See https://html.spec.whatwg.org/#nonce-attributes 120 // The `node.getAttribute` check was added for the sake of 121 // `jQuery.globalEval` so that it can fake a nonce-containing node 122 // via an object. 123 val = node[ i ] || node.getAttribute && node.getAttribute( i ); 124 if ( val ) { 125 script.setAttribute( i, val ); 126 } 127 } 128 } 129 doc.head.appendChild( script ).parentNode.removeChild( script ); 130 } 131 132 133 function toType( obj ) { 134 if ( obj == null ) { 135 return obj + ""; 136 } 137
vendor: 4,621 bytes, lines 138-290
138 // Support: Android <=2.3 only (functionish RegExp) 139 return typeof obj === "object" || typeof obj === "function" ? 140 class2type[ toString.call( obj ) ] || "object" : 141 typeof obj; 142 } 143 /* global Symbol */ 144// Defining this global in .eslintrc.json would create a danger of using the global 145// unguarded in another place, it seems safer to define global only for this module 146 147 148 149 var 150 version = "3.5.1", 151 152 // Define a local copy of jQuery 153 jQuery = function( selector, context ) { 154 155 // The jQuery object is actually just the init constructor 'enhanced' 156 // Need init if jQuery is called (just allow error to be thrown if not included) 157 return new jQuery.fn.init( selector, context ); 158 }; 159 160 jQuery.fn = jQuery.prototype = { 161 162 // The current version of jQuery being used 163 jquery: version, 164 165 constructor: jQuery, 166 167 // The default length of a jQuery object is 0 168 length: 0, 169 170 toArray: function() { 171 return slice.call( this ); 172 }, 173 174 // Get the Nth element in the matched element set OR 175 // Get the whole matched element set as a clean array 176 get: function( num ) { 177 178 // Return all the elements in a clean array 179 if ( num == null ) { 180 return slice.call( this ); 181 } 182 183 // Return just the one element from the set 184 return num < 0 ? this[ num + this.length ] : this[ num ]; 185 }, 186 187 // Take an array of elements and push it onto the stack 188 // (returning the new matched element set) 189 pushStack: function( elems ) { 190 191 // Build a new jQuery matched element set 192 var ret = jQuery.merge( this.constructor(), elems ); 193 194 // Add the old object onto the stack (as a reference) 195 ret.prevObject = this; 196 197 // Return the newly-formed element set 198 return ret; 199 }, 200 201 // Execute a callback for every element in the matched set. 202 each: function( callback ) { 203 return jQuery.each( this, callback ); 204 }, 205 206 map: function( callback ) { 207 return this.pushStack( jQuery.map( this, function( elem, i ) { 208 return callback.call( elem, i, elem ); 209 } ) ); 210 }, 211 212 slice: function() { 213 return this.pushStack( slice.apply( this, arguments ) ); 214 }, 215 216 first: function() { 217 return this.eq( 0 ); 218 }, 219 220 last: function() { 221 return this.eq( -1 ); 222 }, 223 224 even: function() { 225 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 226 return ( i + 1 ) % 2; 227 } ) ); 228 }, 229 230 odd: function() { 231 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 232 return i % 2; 233 } ) ); 234 }, 235 236 eq: function( i ) { 237 var len = this.length, 238 j = +i + ( i < 0 ? len : 0 ); 239 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 240 }, 241 242 end: function() { 243 return this.prevObject || this.constructor(); 244 }, 245 246 // For internal use only. 247 // Behaves like an Array's method, not like a jQuery method. 248 push: push, 249 sort: arr.sort, 250 splice: arr.splice 251 }; 252 253 jQuery.extend = jQuery.fn.extend = function() { 254 var options, name, src, copy, copyIsArray, clone, 255 target = arguments[ 0 ] || {}, 256 i = 1, 257 length = arguments.length, 258 deep = false; 259 260 // Handle a deep copy situation 261 if ( typeof target === "boolean" ) { 262 deep = target; 263 264 // Skip the boolean and the target 265 target = arguments[ i ] || {}; 266 i++; 267 } 268 269 // Handle case when target is a string or something (possible in deep copy) 270 if ( typeof target !== "object" && !isFunction( target ) ) { 271 target = {}; 272 } 273 274 // Extend jQuery itself if only one argument is passed 275 if ( i === length ) { 276 target = this; 277 i--; 278 } 279 280 for ( ; i < length; i++ ) { 281 282 // Only deal with non-null/undefined values 283 if ( ( options = arguments[ i ] ) != null ) { 284 285 // Extend the base object 286 for ( name in options ) { 287 copy = options[ name ]; 288 289 // Prevent Object.prototype pollution 290 // Prevent never-ending loop
vendor: 5,588 bytes, lines 291-465
291 if ( name === "__proto__" || target === copy ) { 292 continue; 293 } 294 295 // Recurse if we're merging plain objects or arrays 296 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 297 ( copyIsArray = Array.isArray( copy ) ) ) ) { 298 src = target[ name ]; 299 300 // Ensure proper type for the source value 301 if ( copyIsArray && !Array.isArray( src ) ) { 302 clone = []; 303 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 304 clone = {}; 305 } else { 306 clone = src; 307 } 308 copyIsArray = false; 309 310 // Never move original objects, clone them 311 target[ name ] = jQuery.extend( deep, clone, copy ); 312 313 // Don't bring in undefined values 314 } else if ( copy !== undefined ) { 315 target[ name ] = copy; 316 } 317 } 318 } 319 } 320 321 // Return the modified object 322 return target; 323 }; 324 325 jQuery.extend( { 326 327 // Unique for each copy of jQuery on the page 328 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 329 330 // Assume jQuery is ready without the ready module 331 isReady: true, 332 333 error: function( msg ) { 334 throw new Error( msg ); 335 }, 336 337 noop: function() {}, 338 339 isPlainObject: function( obj ) { 340 var proto, Ctor; 341 342 // Detect obvious negatives 343 // Use toString instead of jQuery.type to catch host objects 344 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 345 return false; 346 } 347 348 proto = getProto( obj ); 349 350 // Objects with no prototype (e.g., `Object.create( null )`) are plain 351 if ( !proto ) { 352 return true; 353 } 354 355 // Objects with prototype are plain iff they were constructed by a global Object function 356 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 357 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 358 }, 359 360 isEmptyObject: function( obj ) { 361 var name; 362 363 for ( name in obj ) { 364 return false; 365 } 366 return true; 367 }, 368 369 // Evaluates a script in a provided context; falls back to the global one 370 // if not specified. 371 globalEval: function( code, options, doc ) { 372 DOMEval( code, { nonce: options && options.nonce }, doc ); 373 }, 374 375 each: function( obj, callback ) { 376 var length, i = 0; 377 378 if ( isArrayLike( obj ) ) { 379 length = obj.length; 380 for ( ; i < length; i++ ) { 381 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 382 break; 383 } 384 } 385 } else { 386 for ( i in obj ) { 387 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 388 break; 389 } 390 } 391 } 392 393 return obj; 394 }, 395 396 // results is for internal usage only 397 makeArray: function( arr, results ) { 398 var ret = results || []; 399 400 if ( arr != null ) { 401 if ( isArrayLike( Object( arr ) ) ) { 402 jQuery.merge( ret, 403 typeof arr === "string" ? 404 [ arr ] : arr 405 ); 406 } else { 407 push.call( ret, arr ); 408 } 409 } 410 411 return ret; 412 }, 413 414 inArray: function( elem, arr, i ) { 415 return arr == null ? -1 : indexOf.call( arr, elem, i ); 416 }, 417 418 // Support: Android <=4.0 only, PhantomJS 1 only 419 // push.apply(_, arraylike) throws on ancient WebKit 420 merge: function( first, second ) { 421 var len = +second.length, 422 j = 0, 423 i = first.length; 424 425 for ( ; j < len; j++ ) { 426 first[ i++ ] = second[ j ]; 427 } 428 429 first.length = i; 430 431 return first; 432 }, 433 434 grep: function( elems, callback, invert ) { 435 var callbackInverse, 436 matches = [], 437 i = 0, 438 length = elems.length, 439 callbackExpect = !invert; 440 441 // Go through the array, only saving the items 442 // that pass the validator function 443 for ( ; i < length; i++ ) { 444 callbackInverse = !callback( elems[ i ], i ); 445 if ( callbackInverse !== callbackExpect ) { 446 matches.push( elems[ i ] ); 447 } 448 } 449 450 return matches; 451 }, 452 453 // arg is for internal usage only 454 map: function( elems, callback, arg ) { 455 var length, value, 456 i = 0, 457 ret = []; 458 459 // Go through the array, translating each of the items to their new values 460 if ( isArrayLike( elems ) ) { 461 length = elems.length; 462 for ( ; i < length; i++ ) { 463 value = callback( elems[ i ], i, arg ); 464 465 if ( value != null ) {
vendor: 20,078 bytes, lines 466-938
466 ret.push( value ); 467 } 468 } 469 470 // Go through every key on the object, 471 } else { 472 for ( i in elems ) { 473 value = callback( elems[ i ], i, arg ); 474 475 if ( value != null ) { 476 ret.push( value ); 477 } 478 } 479 } 480 481 // Flatten any nested arrays 482 return flat( ret ); 483 }, 484 485 // A global GUID counter for objects 486 guid: 1, 487 488 // jQuery.support is not used in Core but other projects attach their 489 // properties to it so it needs to exist. 490 support: support 491 } ); 492 493 if ( typeof Symbol === "function" ) { 494 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 495 } 496 497// Populate the class2type map 498 jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 499 function( _i, name ) { 500 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 501 } ); 502 503 function isArrayLike( obj ) { 504 505 // Support: real iOS 8.2 only (not reproducible in simulator) 506 // `in` check used to prevent JIT error (gh-2145) 507 // hasOwn isn't used here due to false negatives 508 // regarding Nodelist length in IE 509 var length = !!obj && "length" in obj && obj.length, 510 type = toType( obj ); 511 512 if ( isFunction( obj ) || isWindow( obj ) ) { 513 return false; 514 } 515 516 return type === "array" || length === 0 || 517 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 518 } 519 var Sizzle = 520 /*! 521 * Sizzle CSS Selector Engine v2.3.5 522 * https://sizzlejs.com/ 523 * 524 * Copyright JS Foundation and other contributors 525 * Released under the MIT license 526 * https://js.foundation/ 527 * 528 * Date: 2020-03-14 529 */ 530 ( function( window ) { 531 var i, 532 support, 533 Expr, 534 getText, 535 isXML, 536 tokenize, 537 compile, 538 select, 539 outermostContext, 540 sortInput, 541 hasDuplicate, 542 543 // Local document vars 544 setDocument, 545 document, 546 docElem, 547 documentIsHTML, 548 rbuggyQSA, 549 rbuggyMatches, 550 matches, 551 contains, 552 553 // Instance-specific data 554 expando = "sizzle" + 1 * new Date(), 555 preferredDoc = window.document, 556 dirruns = 0, 557 done = 0, 558 classCache = createCache(), 559 tokenCache = createCache(), 560 compilerCache = createCache(), 561 nonnativeSelectorCache = createCache(), 562 sortOrder = function( a, b ) { 563 if ( a === b ) { 564 hasDuplicate = true; 565 } 566 return 0; 567 }, 568 569 // Instance methods 570 hasOwn = ( {} ).hasOwnProperty, 571 arr = [], 572 pop = arr.pop, 573 pushNative = arr.push, 574 push = arr.push, 575 slice = arr.slice, 576 577 // Use a stripped-down indexOf as it's faster than native 578 // https://jsperf.com/thor-indexof-vs-for/5 579 indexOf = function( list, elem ) { 580 var i = 0, 581 len = list.length; 582 for ( ; i < len; i++ ) { 583 if ( list[ i ] === elem ) { 584 return i; 585 } 586 } 587 return -1; 588 }, 589 590 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + 591 "ismap|loop|multiple|open|readonly|required|scoped", 592 593 // Regular expressions 594 595 // http://www.w3.org/TR/css3-selectors/#whitespace 596 whitespace = "[\\x20\\t\\r\\n\\f]", 597 598 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 599 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + 600 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 601 602 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 603 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 604 605 // Operator (capture 2) 606 "*([*^$|!~]?=)" + whitespace + 607 608 // "Attribute values must be CSS identifiers [capture 5] 609 // or strings [capture 3 or capture 4]" 610 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + 611 whitespace + "*\\]", 612 613 pseudos = ":(" + identifier + ")(?:\\((" + 614 615 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 616 // 1. quoted (capture 3; capture 4 or capture 5) 617 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 618 619 // 2. simple (capture 6) 620 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 621 622 // 3. anything else (capture 2) 623 ".*" + 624 ")\\)|)", 625 626 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 627 rwhitespace = new RegExp( whitespace + "+", "g" ), 628 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + 629 whitespace + "+$", "g" ), 630 631 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 632 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + 633 "*" ), 634 rdescend = new RegExp( whitespace + "|>" ), 635 636 rpseudo = new RegExp( pseudos ), 637 ridentifier = new RegExp( "^" + identifier + "$" ), 638 639 matchExpr = { 640 "ID": new RegExp( "^#(" + identifier + ")" ), 641 "CLASS": new RegExp( "^\\.(" + identifier + ")" ), 642 "TAG": new RegExp( "^(" + identifier + "|[*])" ), 643 "ATTR": new RegExp( "^" + attributes ), 644 "PSEUDO": new RegExp( "^" + pseudos ), 645 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + 646 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + 647 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 648 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), 649 650 // For use in libraries implementing .is() 651 // We use this for POS matching in `select` 652 "needsContext": new RegExp( "^" + whitespace + 653 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + 654 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 655 }, 656 657 rhtml = /HTML$/i, 658 rinputs = /^(?:input|select|textarea|button)$/i, 659 rheader = /^h\d$/i, 660 661 rnative = /^[^{]+\{\s*\[native \w/, 662 663 // Easily-parseable/retrievable ID or TAG or CLASS selectors 664 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 665 666 rsibling = /[+~]/, 667 668 // CSS escapes 669 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 670 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), 671 funescape = function( escape, nonHex ) { 672 var high = "0x" + escape.slice( 1 ) - 0x10000; 673 674 return nonHex ? 675 676 // Strip the backslash prefix from a non-hex escape sequence 677 nonHex : 678 679 // Replace a hexadecimal escape sequence with the encoded Unicode code point 680 // Support: IE <=11+ 681 // For values outside the Basic Multilingual Plane (BMP), manually construct a 682 // surrogate pair 683 high < 0 ? 684 String.fromCharCode( high + 0x10000 ) : 685 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 686 }, 687 688 // CSS string/identifier serialization 689 // https://drafts.csswg.org/cssom/#common-serializing-idioms 690 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, 691 fcssescape = function( ch, asCodePoint ) { 692 if ( asCodePoint ) { 693 694 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 695 if ( ch === "\0" ) { 696 return "\uFFFD"; 697 } 698 699 // Control characters and (dependent upon position) numbers get escaped as code points 700 return ch.slice( 0, -1 ) + "\\" + 701 ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 702 } 703 704 // Other potentially-special ASCII characters get backslash-escaped 705 return "\\" + ch; 706 }, 707 708 // Used for iframes 709 // See setDocument() 710 // Removing the function wrapper causes a "Permission Denied" 711 // error in IE 712 unloadHandler = function() { 713 setDocument(); 714 }, 715 716 inDisabledFieldset = addCombinator( 717 function( elem ) { 718 return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; 719 }, 720 { dir: "parentNode", next: "legend" } 721 ); 722 723// Optimize for push.apply( _, NodeList ) 724 try { 725 push.apply( 726 ( arr = slice.call( preferredDoc.childNodes ) ), 727 preferredDoc.childNodes 728 ); 729 730 // Support: Android<4.0 731 // Detect silently failing push.apply 732 // eslint-disable-next-line no-unused-expressions 733 arr[ preferredDoc.childNodes.length ].nodeType; 734 } catch ( e ) { 735 push = { apply: arr.length ? 736 737 // Leverage slice if possible 738 function( target, els ) { 739 pushNative.apply( target, slice.call( els ) ); 740 } : 741 742 // Support: IE<9 743 // Otherwise append directly 744 function( target, els ) { 745 var j = target.length, 746 i = 0; 747 748 // Can't trust NodeList.length 749 while ( ( target[ j++ ] = els[ i++ ] ) ) {} 750 target.length = j - 1; 751 } 752 }; 753 } 754 755 function Sizzle( selector, context, results, seed ) { 756 var m, i, elem, nid, match, groups, newSelector, 757 newContext = context && context.ownerDocument, 758 759 // nodeType defaults to 9, since context defaults to document 760 nodeType = context ? context.nodeType : 9; 761 762 results = results || []; 763 764 // Return early from calls with invalid selector or context 765 if ( typeof selector !== "string" || !selector || 766 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 767 768 return results; 769 } 770 771 // Try to shortcut find operations (as opposed to filters) in HTML documents 772 if ( !seed ) { 773 setDocument( context ); 774 context = context || document; 775 776 if ( documentIsHTML ) { 777 778 // If the selector is sufficiently simple, try using a "get*By*" DOM method 779 // (excepting DocumentFragment context, where the methods don't exist) 780 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { 781 782 // ID selector 783 if ( ( m = match[ 1 ] ) ) { 784 785 // Document context 786 if ( nodeType === 9 ) { 787 if ( ( elem = context.getElementById( m ) ) ) { 788 789 // Support: IE, Opera, Webkit 790 // TODO: identify versions 791 // getElementById can match elements by name instead of ID 792 if ( elem.id === m ) { 793 results.push( elem ); 794 return results; 795 } 796 } else { 797 return results; 798 } 799 800 // Element context 801 } else { 802 803 // Support: IE, Opera, Webkit 804 // TODO: identify versions 805 // getElementById can match elements by name instead of ID 806 if ( newContext && ( elem = newContext.getElementById( m ) ) && 807 contains( context, elem ) && 808 elem.id === m ) { 809 810 results.push( elem ); 811 return results; 812 } 813 } 814 815 // Type selector 816 } else if ( match[ 2 ] ) { 817 push.apply( results, context.getElementsByTagName( selector ) ); 818 return results; 819 820 // Class selector 821 } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && 822 context.getElementsByClassName ) { 823 824 push.apply( results, context.getElementsByClassName( m ) ); 825 return results; 826 } 827 } 828 829 // Take advantage of querySelectorAll 830 if ( support.qsa && 831 !nonnativeSelectorCache[ selector + " " ] && 832 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && 833 834 // Support: IE 8 only 835 // Exclude object elements 836 ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { 837 838 newSelector = selector; 839 newContext = context; 840 841 // qSA considers elements outside a scoping root when evaluating child or 842 // descendant combinators, which is not what we want. 843 // In such cases, we work around the behavior by prefixing every selector in the 844 // list with an ID selector referencing the scope context. 845 // The technique has to be used as well when a leading combinator is used 846 // as such selectors are not recognized by querySelectorAll. 847 // Thanks to Andrew Dupont for this technique. 848 if ( nodeType === 1 && 849 ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { 850 851 // Expand context for sibling selectors 852 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 853 context; 854 855 // We can use :scope instead of the ID hack if the browser 856 // supports it & if we're not changing the context. 857 if ( newContext !== context || !support.scope ) { 858 859 // Capture the context ID, setting it first if necessary 860 if ( ( nid = context.getAttribute( "id" ) ) ) { 861 nid = nid.replace( rcssescape, fcssescape ); 862 } else { 863 context.setAttribute( "id", ( nid = expando ) ); 864 } 865 } 866 867 // Prefix every selector in the list 868 groups = tokenize( selector ); 869 i = groups.length; 870 while ( i-- ) { 871 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + 872 toSelector( groups[ i ] ); 873 } 874 newSelector = groups.join( "," ); 875 } 876 877 try { 878 push.apply( results, 879 newContext.querySelectorAll( newSelector ) 880 ); 881 return results; 882 } catch ( qsaError ) { 883 nonnativeSelectorCache( selector, true ); 884 } finally { 885 if ( nid === expando ) { 886 context.removeAttribute( "id" ); 887 } 888 } 889 } 890 } 891 } 892 893 // All others 894 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 895 } 896 897 /** 898 * Create key-value caches of limited size 899 * @returns {function(string, object)} Returns the Object data after storing it on itself with 900 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 901 * deleting the oldest entry 902 */ 903 function createCache() { 904 var keys = []; 905 906 function cache( key, value ) { 907 908 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 909 if ( keys.push( key + " " ) > Expr.cacheLength ) { 910 911 // Only keep the most recent entries 912 delete cache[ keys.shift() ]; 913 } 914 return ( cache[ key + " " ] = value ); 915 } 916 return cache; 917 } 918 919 /** 920 * Mark a function for special use by Sizzle 921 * @param {Function} fn The function to mark 922 */ 923 function markFunction( fn ) { 924 fn[ expando ] = true; 925 return fn; 926 } 927 928 /** 929 * Support testing using an element 930 * @param {Function} fn Passed the created element and returns a boolean result 931 */ 932 function assert( fn ) { 933 var el = document.createElement( "fieldset" ); 934 935 try { 936 return !!fn( el ); 937 } catch ( e ) { 938 return false;
vendor: 4,414 bytes, lines 939-1046
939 } finally { 940 941 // Remove from its parent by default 942 if ( el.parentNode ) { 943 el.parentNode.removeChild( el ); 944 } 945 946 // release memory in IE 947 el = null; 948 } 949 } 950 951 /** 952 * Adds the same handler for all of the specified attrs 953 * @param {String} attrs Pipe-separated list of attributes 954 * @param {Function} handler The method that will be applied 955 */ 956 function addHandle( attrs, handler ) { 957 var arr = attrs.split( "|" ), 958 i = arr.length; 959 960 while ( i-- ) { 961 Expr.attrHandle[ arr[ i ] ] = handler; 962 } 963 } 964 965 /** 966 * Checks document order of two siblings 967 * @param {Element} a 968 * @param {Element} b 969 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 970 */ 971 function siblingCheck( a, b ) { 972 var cur = b && a, 973 diff = cur && a.nodeType === 1 && b.nodeType === 1 && 974 a.sourceIndex - b.sourceIndex; 975 976 // Use IE sourceIndex if available on both nodes 977 if ( diff ) { 978 return diff; 979 } 980 981 // Check if b follows a 982 if ( cur ) { 983 while ( ( cur = cur.nextSibling ) ) { 984 if ( cur === b ) { 985 return -1; 986 } 987 } 988 } 989 990 return a ? 1 : -1; 991 } 992 993 /** 994 * Returns a function to use in pseudos for input types 995 * @param {String} type 996 */ 997 function createInputPseudo( type ) { 998 return function( elem ) { 999 var name = elem.nodeName.toLowerCase(); 1000 return name === "input" && elem.type === type; 1001 }; 1002 } 1003 1004 /** 1005 * Returns a function to use in pseudos for buttons 1006 * @param {String} type 1007 */ 1008 function createButtonPseudo( type ) { 1009 return function( elem ) { 1010 var name = elem.nodeName.toLowerCase(); 1011 return ( name === "input" || name === "button" ) && elem.type === type; 1012 }; 1013 } 1014 1015 /** 1016 * Returns a function to use in pseudos for :enabled/:disabled 1017 * @param {Boolean} disabled true for :disabled; false for :enabled 1018 */ 1019 function createDisabledPseudo( disabled ) { 1020 1021 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 1022 return function( elem ) { 1023 1024 // Only certain elements can match :enabled or :disabled 1025 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 1026 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 1027 if ( "form" in elem ) { 1028 1029 // Check for inherited disabledness on relevant non-disabled elements: 1030 // * listed form-associated elements in a disabled fieldset 1031 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 1032 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 1033 // * option elements in a disabled optgroup 1034 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 1035 // All such elements have a "form" property. 1036 if ( elem.parentNode && elem.disabled === false ) { 1037 1038 // Option elements defer to a parent optgroup if present 1039 if ( "label" in elem ) { 1040 if ( "label" in elem.parentNode ) { 1041 return elem.parentNode.disabled === disabled; 1042 } else { 1043 return elem.disabled === disabled; 1044 } 1045 } 1046
vendor: 32,601 bytes, lines 1047-1747
1047 // Support: IE 6 - 11 1048 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 1049 return elem.isDisabled === disabled || 1050 1051 // Where there is no isDisabled, check manually 1052 /* jshint -W018 */ 1053 elem.isDisabled !== !disabled && 1054 inDisabledFieldset( elem ) === disabled; 1055 } 1056 1057 return elem.disabled === disabled; 1058 1059 // Try to winnow out elements that can't be disabled before trusting the disabled property. 1060 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 1061 // even exist on them, let alone have a boolean value. 1062 } else if ( "label" in elem ) { 1063 return elem.disabled === disabled; 1064 } 1065 1066 // Remaining elements are neither :enabled nor :disabled 1067 return false; 1068 }; 1069 } 1070 1071 /** 1072 * Returns a function to use in pseudos for positionals 1073 * @param {Function} fn 1074 */ 1075 function createPositionalPseudo( fn ) { 1076 return markFunction( function( argument ) { 1077 argument = +argument; 1078 return markFunction( function( seed, matches ) { 1079 var j, 1080 matchIndexes = fn( [], seed.length, argument ), 1081 i = matchIndexes.length; 1082 1083 // Match elements found at the specified indexes 1084 while ( i-- ) { 1085 if ( seed[ ( j = matchIndexes[ i ] ) ] ) { 1086 seed[ j ] = !( matches[ j ] = seed[ j ] ); 1087 } 1088 } 1089 } ); 1090 } ); 1091 } 1092 1093 /** 1094 * Checks a node for validity as a Sizzle context 1095 * @param {Element|Object=} context 1096 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 1097 */ 1098 function testContext( context ) { 1099 return context && typeof context.getElementsByTagName !== "undefined" && context; 1100 } 1101 1102// Expose support vars for convenience 1103 support = Sizzle.support = {}; 1104 1105 /** 1106 * Detects XML nodes 1107 * @param {Element|Object} elem An element or a document 1108 * @returns {Boolean} True iff elem is a non-HTML XML node 1109 */ 1110 isXML = Sizzle.isXML = function( elem ) { 1111 var namespace = elem.namespaceURI, 1112 docElem = ( elem.ownerDocument || elem ).documentElement; 1113 1114 // Support: IE <=8 1115 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes 1116 // https://bugs.jquery.com/ticket/4833 1117 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); 1118 }; 1119 1120 /** 1121 * Sets document-related variables once based on the current document 1122 * @param {Element|Object} [doc] An element or document object to use to set the document 1123 * @returns {Object} Returns the current document 1124 */ 1125 setDocument = Sizzle.setDocument = function( node ) { 1126 var hasCompare, subWindow, 1127 doc = node ? node.ownerDocument || node : preferredDoc; 1128 1129 // Return early if doc is invalid or already selected 1130 // Support: IE 11+, Edge 17 - 18+ 1131 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1132 // two documents; shallow comparisons work. 1133 // eslint-disable-next-line eqeqeq 1134 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { 1135 return document; 1136 } 1137 1138 // Update global variables 1139 document = doc; 1140 docElem = document.documentElement; 1141 documentIsHTML = !isXML( document ); 1142 1143 // Support: IE 9 - 11+, Edge 12 - 18+ 1144 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 1145 // Support: IE 11+, Edge 17 - 18+ 1146 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1147 // two documents; shallow comparisons work. 1148 // eslint-disable-next-line eqeqeq 1149 if ( preferredDoc != document && 1150 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { 1151 1152 // Support: IE 11, Edge 1153 if ( subWindow.addEventListener ) { 1154 subWindow.addEventListener( "unload", unloadHandler, false ); 1155 1156 // Support: IE 9 - 10 only 1157 } else if ( subWindow.attachEvent ) { 1158 subWindow.attachEvent( "onunload", unloadHandler ); 1159 } 1160 } 1161 1162 // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, 1163 // Safari 4 - 5 only, Opera <=11.6 - 12.x only 1164 // IE/Edge & older browsers don't support the :scope pseudo-class. 1165 // Support: Safari 6.0 only 1166 // Safari 6.0 supports :scope but it's an alias of :root there. 1167 support.scope = assert( function( el ) { 1168 docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); 1169 return typeof el.querySelectorAll !== "undefined" && 1170 !el.querySelectorAll( ":scope fieldset div" ).length; 1171 } ); 1172 1173 /* Attributes 1174 ---------------------------------------------------------------------- */ 1175 1176 // Support: IE<8 1177 // Verify that getAttribute really returns attributes and not properties 1178 // (excepting IE8 booleans) 1179 support.attributes = assert( function( el ) { 1180 el.className = "i"; 1181 return !el.getAttribute( "className" ); 1182 } ); 1183 1184 /* getElement(s)By* 1185 ---------------------------------------------------------------------- */ 1186 1187 // Check if getElementsByTagName("*") returns only elements 1188 support.getElementsByTagName = assert( function( el ) { 1189 el.appendChild( document.createComment( "" ) ); 1190 return !el.getElementsByTagName( "*" ).length; 1191 } ); 1192 1193 // Support: IE<9 1194 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); 1195 1196 // Support: IE<10 1197 // Check if getElementById returns elements by name 1198 // The broken getElementById methods don't pick up programmatically-set names, 1199 // so use a roundabout getElementsByName test 1200 support.getById = assert( function( el ) { 1201 docElem.appendChild( el ).id = expando; 1202 return !document.getElementsByName || !document.getElementsByName( expando ).length; 1203 } ); 1204 1205 // ID filter and find 1206 if ( support.getById ) { 1207 Expr.filter[ "ID" ] = function( id ) { 1208 var attrId = id.replace( runescape, funescape ); 1209 return function( elem ) { 1210 return elem.getAttribute( "id" ) === attrId; 1211 }; 1212 }; 1213 Expr.find[ "ID" ] = function( id, context ) { 1214 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1215 var elem = context.getElementById( id ); 1216 return elem ? [ elem ] : []; 1217 } 1218 }; 1219 } else { 1220 Expr.filter[ "ID" ] = function( id ) { 1221 var attrId = id.replace( runescape, funescape ); 1222 return function( elem ) { 1223 var node = typeof elem.getAttributeNode !== "undefined" && 1224 elem.getAttributeNode( "id" ); 1225 return node && node.value === attrId; 1226 }; 1227 }; 1228 1229 // Support: IE 6 - 7 only 1230 // getElementById is not reliable as a find shortcut 1231 Expr.find[ "ID" ] = function( id, context ) { 1232 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1233 var node, i, elems, 1234 elem = context.getElementById( id ); 1235 1236 if ( elem ) { 1237 1238 // Verify the id attribute 1239 node = elem.getAttributeNode( "id" ); 1240 if ( node && node.value === id ) { 1241 return [ elem ]; 1242 } 1243 1244 // Fall back on getElementsByName 1245 elems = context.getElementsByName( id ); 1246 i = 0; 1247 while ( ( elem = elems[ i++ ] ) ) { 1248 node = elem.getAttributeNode( "id" ); 1249 if ( node && node.value === id ) { 1250 return [ elem ]; 1251 } 1252 } 1253 } 1254 1255 return []; 1256 } 1257 }; 1258 } 1259 1260 // Tag 1261 Expr.find[ "TAG" ] = support.getElementsByTagName ? 1262 function( tag, context ) { 1263 if ( typeof context.getElementsByTagName !== "undefined" ) { 1264 return context.getElementsByTagName( tag ); 1265 1266 // DocumentFragment nodes don't have gEBTN 1267 } else if ( support.qsa ) { 1268 return context.querySelectorAll( tag ); 1269 } 1270 } : 1271 1272 function( tag, context ) { 1273 var elem, 1274 tmp = [], 1275 i = 0, 1276 1277 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 1278 results = context.getElementsByTagName( tag ); 1279 1280 // Filter out possible comments 1281 if ( tag === "*" ) { 1282 while ( ( elem = results[ i++ ] ) ) { 1283 if ( elem.nodeType === 1 ) { 1284 tmp.push( elem ); 1285 } 1286 } 1287 1288 return tmp; 1289 } 1290 return results; 1291 }; 1292 1293 // Class 1294 Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { 1295 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 1296 return context.getElementsByClassName( className ); 1297 } 1298 }; 1299 1300 /* QSA/matchesSelector 1301 ---------------------------------------------------------------------- */ 1302 1303 // QSA and matchesSelector support 1304 1305 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 1306 rbuggyMatches = []; 1307 1308 // qSa(:focus) reports false when true (Chrome 21) 1309 // We allow this because of a bug in IE8/9 that throws an error 1310 // whenever `document.activeElement` is accessed on an iframe 1311 // So, we allow :focus to pass through QSA all the time to avoid the IE error 1312 // See https://bugs.jquery.com/ticket/13378 1313 rbuggyQSA = []; 1314 1315 if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { 1316 1317 // Build QSA regex 1318 // Regex strategy adopted from Diego Perini 1319 assert( function( el ) { 1320 1321 var input; 1322 1323 // Select is set to empty string on purpose 1324 // This is to test IE's treatment of not explicitly 1325 // setting a boolean content attribute, 1326 // since its presence should be enough 1327 // https://bugs.jquery.com/ticket/12359 1328 docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + 1329 "<select id='" + expando + "-\r\\' msallowcapture=''>" + 1330 "<option selected=''></option></select>"; 1331 1332 // Support: IE8, Opera 11-12.16 1333 // Nothing should be selected when empty strings follow ^= or $= or *= 1334 // The test attribute must be unknown in Opera but "safe" for WinRT 1335 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 1336 if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { 1337 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); 1338 } 1339 1340 // Support: IE8 1341 // Boolean attributes and "value" are not treated correctly 1342 if ( !el.querySelectorAll( "[selected]" ).length ) { 1343 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 1344 } 1345 1346 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 1347 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 1348 rbuggyQSA.push( "~=" ); 1349 } 1350 1351 // Support: IE 11+, Edge 15 - 18+ 1352 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 1353 // Adding a temporary attribute to the document before the selection works 1354 // around the issue. 1355 // Interestingly, IE 10 & older don't seem to have the issue. 1356 input = document.createElement( "input" ); 1357 input.setAttribute( "name", "" ); 1358 el.appendChild( input ); 1359 if ( !el.querySelectorAll( "[name='']" ).length ) { 1360 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + 1361 whitespace + "*(?:''|\"\")" ); 1362 } 1363 1364 // Webkit/Opera - :checked should return selected option elements 1365 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1366 // IE8 throws error here and will not see later tests 1367 if ( !el.querySelectorAll( ":checked" ).length ) { 1368 rbuggyQSA.push( ":checked" ); 1369 } 1370 1371 // Support: Safari 8+, iOS 8+ 1372 // https://bugs.webkit.org/show_bug.cgi?id=136851 1373 // In-page `selector#id sibling-combinator selector` fails 1374 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 1375 rbuggyQSA.push( ".#.+[+~]" ); 1376 } 1377 1378 // Support: Firefox <=3.6 - 5 only 1379 // Old Firefox doesn't throw on a badly-escaped identifier. 1380 el.querySelectorAll( "\\\f" ); 1381 rbuggyQSA.push( "[\\r\\n\\f]" ); 1382 } ); 1383 1384 assert( function( el ) { 1385 el.innerHTML = "<a href='' disabled='disabled'></a>" + 1386 "<select disabled='disabled'><option/></select>"; 1387 1388 // Support: Windows 8 Native Apps 1389 // The type and name attributes are restricted during .innerHTML assignment 1390 var input = document.createElement( "input" ); 1391 input.setAttribute( "type", "hidden" ); 1392 el.appendChild( input ).setAttribute( "name", "D" ); 1393 1394 // Support: IE8 1395 // Enforce case-sensitivity of name attribute 1396 if ( el.querySelectorAll( "[name=d]" ).length ) { 1397 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); 1398 } 1399 1400 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 1401 // IE8 throws error here and will not see later tests 1402 if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { 1403 rbuggyQSA.push( ":enabled", ":disabled" ); 1404 } 1405 1406 // Support: IE9-11+ 1407 // IE's :disabled selector does not pick up the children of disabled fieldsets 1408 docElem.appendChild( el ).disabled = true; 1409 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { 1410 rbuggyQSA.push( ":enabled", ":disabled" ); 1411 } 1412 1413 // Support: Opera 10 - 11 only 1414 // Opera 10-11 does not throw on post-comma invalid pseudos 1415 el.querySelectorAll( "*,:x" ); 1416 rbuggyQSA.push( ",.*:" ); 1417 } ); 1418 } 1419 1420 if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || 1421 docElem.webkitMatchesSelector || 1422 docElem.mozMatchesSelector || 1423 docElem.oMatchesSelector || 1424 docElem.msMatchesSelector ) ) ) ) { 1425 1426 assert( function( el ) { 1427 1428 // Check to see if it's possible to do matchesSelector 1429 // on a disconnected node (IE 9) 1430 support.disconnectedMatch = matches.call( el, "*" ); 1431 1432 // This should fail with an exception 1433 // Gecko does not error, returns false instead 1434 matches.call( el, "[s!='']:x" ); 1435 rbuggyMatches.push( "!=", pseudos ); 1436 } ); 1437 } 1438 1439 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); 1440 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); 1441 1442 /* Contains 1443 ---------------------------------------------------------------------- */ 1444 hasCompare = rnative.test( docElem.compareDocumentPosition ); 1445 1446 // Element contains another 1447 // Purposefully self-exclusive 1448 // As in, an element does not contain itself 1449 contains = hasCompare || rnative.test( docElem.contains ) ? 1450 function( a, b ) { 1451 var adown = a.nodeType === 9 ? a.documentElement : a, 1452 bup = b && b.parentNode; 1453 return a === bup || !!( bup && bup.nodeType === 1 && ( 1454 adown.contains ? 1455 adown.contains( bup ) : 1456 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 1457 ) ); 1458 } : 1459 function( a, b ) { 1460 if ( b ) { 1461 while ( ( b = b.parentNode ) ) { 1462 if ( b === a ) { 1463 return true; 1464 } 1465 } 1466 } 1467 return false; 1468 }; 1469 1470 /* Sorting 1471 ---------------------------------------------------------------------- */ 1472 1473 // Document order sorting 1474 sortOrder = hasCompare ? 1475 function( a, b ) { 1476 1477 // Flag for duplicate removal 1478 if ( a === b ) { 1479 hasDuplicate = true; 1480 return 0; 1481 } 1482 1483 // Sort on method existence if only one input has compareDocumentPosition 1484 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 1485 if ( compare ) { 1486 return compare; 1487 } 1488 1489 // Calculate position if both inputs belong to the same document 1490 // Support: IE 11+, Edge 17 - 18+ 1491 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1492 // two documents; shallow comparisons work. 1493 // eslint-disable-next-line eqeqeq 1494 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? 1495 a.compareDocumentPosition( b ) : 1496 1497 // Otherwise we know they are disconnected 1498 1; 1499 1500 // Disconnected nodes 1501 if ( compare & 1 || 1502 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { 1503 1504 // Choose the first element that is related to our preferred document 1505 // Support: IE 11+, Edge 17 - 18+ 1506 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1507 // two documents; shallow comparisons work. 1508 // eslint-disable-next-line eqeqeq 1509 if ( a == document || a.ownerDocument == preferredDoc && 1510 contains( preferredDoc, a ) ) { 1511 return -1; 1512 } 1513 1514 // Support: IE 11+, Edge 17 - 18+ 1515 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1516 // two documents; shallow comparisons work. 1517 // eslint-disable-next-line eqeqeq 1518 if ( b == document || b.ownerDocument == preferredDoc && 1519 contains( preferredDoc, b ) ) { 1520 return 1; 1521 } 1522 1523 // Maintain original order 1524 return sortInput ? 1525 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1526 0; 1527 } 1528 1529 return compare & 4 ? -1 : 1; 1530 } : 1531 function( a, b ) { 1532 1533 // Exit early if the nodes are identical 1534 if ( a === b ) { 1535 hasDuplicate = true; 1536 return 0; 1537 } 1538 1539 var cur, 1540 i = 0, 1541 aup = a.parentNode, 1542 bup = b.parentNode, 1543 ap = [ a ], 1544 bp = [ b ]; 1545 1546 // Parentless nodes are either documents or disconnected 1547 if ( !aup || !bup ) { 1548 1549 // Support: IE 11+, Edge 17 - 18+ 1550 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1551 // two documents; shallow comparisons work. 1552 /* eslint-disable eqeqeq */ 1553 return a == document ? -1 : 1554 b == document ? 1 : 1555 /* eslint-enable eqeqeq */ 1556 aup ? -1 : 1557 bup ? 1 : 1558 sortInput ? 1559 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1560 0; 1561 1562 // If the nodes are siblings, we can do a quick check 1563 } else if ( aup === bup ) { 1564 return siblingCheck( a, b ); 1565 } 1566 1567 // Otherwise we need full lists of their ancestors for comparison 1568 cur = a; 1569 while ( ( cur = cur.parentNode ) ) { 1570 ap.unshift( cur ); 1571 } 1572 cur = b; 1573 while ( ( cur = cur.parentNode ) ) { 1574 bp.unshift( cur ); 1575 } 1576 1577 // Walk down the tree looking for a discrepancy 1578 while ( ap[ i ] === bp[ i ] ) { 1579 i++; 1580 } 1581 1582 return i ? 1583 1584 // Do a sibling check if the nodes have a common ancestor 1585 siblingCheck( ap[ i ], bp[ i ] ) : 1586 1587 // Otherwise nodes in our document sort first 1588 // Support: IE 11+, Edge 17 - 18+ 1589 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1590 // two documents; shallow comparisons work. 1591 /* eslint-disable eqeqeq */ 1592 ap[ i ] == preferredDoc ? -1 : 1593 bp[ i ] == preferredDoc ? 1 : 1594 /* eslint-enable eqeqeq */ 1595 0; 1596 }; 1597 1598 return document; 1599 }; 1600 1601 Sizzle.matches = function( expr, elements ) { 1602 return Sizzle( expr, null, null, elements ); 1603 }; 1604 1605 Sizzle.matchesSelector = function( elem, expr ) { 1606 setDocument( elem ); 1607 1608 if ( support.matchesSelector && documentIsHTML && 1609 !nonnativeSelectorCache[ expr + " " ] && 1610 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 1611 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 1612 1613 try { 1614 var ret = matches.call( elem, expr ); 1615 1616 // IE 9's matchesSelector returns false on disconnected nodes 1617 if ( ret || support.disconnectedMatch || 1618 1619 // As well, disconnected nodes are said to be in a document 1620 // fragment in IE 9 1621 elem.document && elem.document.nodeType !== 11 ) { 1622 return ret; 1623 } 1624 } catch ( e ) { 1625 nonnativeSelectorCache( expr, true ); 1626 } 1627 } 1628 1629 return Sizzle( expr, document, null, [ elem ] ).length > 0; 1630 }; 1631 1632 Sizzle.contains = function( context, elem ) { 1633 1634 // Set document vars if needed 1635 // Support: IE 11+, Edge 17 - 18+ 1636 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1637 // two documents; shallow comparisons work. 1638 // eslint-disable-next-line eqeqeq 1639 if ( ( context.ownerDocument || context ) != document ) { 1640 setDocument( context ); 1641 } 1642 return contains( context, elem ); 1643 }; 1644 1645 Sizzle.attr = function( elem, name ) { 1646 1647 // Set document vars if needed 1648 // Support: IE 11+, Edge 17 - 18+ 1649 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1650 // two documents; shallow comparisons work. 1651 // eslint-disable-next-line eqeqeq 1652 if ( ( elem.ownerDocument || elem ) != document ) { 1653 setDocument( elem ); 1654 } 1655 1656 var fn = Expr.attrHandle[ name.toLowerCase() ], 1657 1658 // Don't get fooled by Object.prototype properties (jQuery #13807) 1659 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 1660 fn( elem, name, !documentIsHTML ) : 1661 undefined; 1662 1663 return val !== undefined ? 1664 val : 1665 support.attributes || !documentIsHTML ? 1666 elem.getAttribute( name ) : 1667 ( val = elem.getAttributeNode( name ) ) && val.specified ? 1668 val.value : 1669 null; 1670 }; 1671 1672 Sizzle.escape = function( sel ) { 1673 return ( sel + "" ).replace( rcssescape, fcssescape ); 1674 }; 1675 1676 Sizzle.error = function( msg ) { 1677 throw new Error( "Syntax error, unrecognized expression: " + msg ); 1678 }; 1679 1680 /** 1681 * Document sorting and removing duplicates 1682 * @param {ArrayLike} results 1683 */ 1684 Sizzle.uniqueSort = function( results ) { 1685 var elem, 1686 duplicates = [], 1687 j = 0, 1688 i = 0; 1689 1690 // Unless we *know* we can detect duplicates, assume their presence 1691 hasDuplicate = !support.detectDuplicates; 1692 sortInput = !support.sortStable && results.slice( 0 ); 1693 results.sort( sortOrder ); 1694 1695 if ( hasDuplicate ) { 1696 while ( ( elem = results[ i++ ] ) ) { 1697 if ( elem === results[ i ] ) { 1698 j = duplicates.push( i ); 1699 } 1700 } 1701 while ( j-- ) { 1702 results.splice( duplicates[ j ], 1 ); 1703 } 1704 } 1705 1706 // Clear input after sorting to release objects 1707 // See https://github.com/jquery/sizzle/pull/225 1708 sortInput = null; 1709 1710 return results; 1711 }; 1712 1713 /** 1714 * Utility function for retrieving the text value of an array of DOM nodes 1715 * @param {Array|Element} elem 1716 */ 1717 getText = Sizzle.getText = function( elem ) { 1718 var node, 1719 ret = "", 1720 i = 0, 1721 nodeType = elem.nodeType; 1722 1723 if ( !nodeType ) { 1724 1725 // If no nodeType, this is expected to be an array 1726 while ( ( node = elem[ i++ ] ) ) { 1727 1728 // Do not traverse comment nodes 1729 ret += getText( node ); 1730 } 1731 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 1732 1733 // Use textContent for elements 1734 // innerText usage removed for consistency of new lines (jQuery #11153) 1735 if ( typeof elem.textContent === "string" ) { 1736 return elem.textContent; 1737 } else { 1738 1739 // Traverse its children 1740 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 1741 ret += getText( elem ); 1742 } 1743 } 1744 } else if ( nodeType === 3 || nodeType === 4 ) { 1745 return elem.nodeValue; 1746 } 1747
vendor: 13,229 bytes, lines 1748-2022
1748 // Do not include comment or processing instruction nodes 1749 1750 return ret; 1751 }; 1752 1753 Expr = Sizzle.selectors = { 1754 1755 // Can be adjusted by the user 1756 cacheLength: 50, 1757 1758 createPseudo: markFunction, 1759 1760 match: matchExpr, 1761 1762 attrHandle: {}, 1763 1764 find: {}, 1765 1766 relative: { 1767 ">": { dir: "parentNode", first: true }, 1768 " ": { dir: "parentNode" }, 1769 "+": { dir: "previousSibling", first: true }, 1770 "~": { dir: "previousSibling" } 1771 }, 1772 1773 preFilter: { 1774 "ATTR": function( match ) { 1775 match[ 1 ] = match[ 1 ].replace( runescape, funescape ); 1776 1777 // Move the given value to match[3] whether quoted or unquoted 1778 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || 1779 match[ 5 ] || "" ).replace( runescape, funescape ); 1780 1781 if ( match[ 2 ] === "~=" ) { 1782 match[ 3 ] = " " + match[ 3 ] + " "; 1783 } 1784 1785 return match.slice( 0, 4 ); 1786 }, 1787 1788 "CHILD": function( match ) { 1789 1790 /* matches from matchExpr["CHILD"] 1791 1 type (only|nth|...) 1792 2 what (child|of-type) 1793 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 1794 4 xn-component of xn+y argument ([+-]?\d*n|) 1795 5 sign of xn-component 1796 6 x of xn-component 1797 7 sign of y-component 1798 8 y of y-component 1799 */ 1800 match[ 1 ] = match[ 1 ].toLowerCase(); 1801 1802 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { 1803 1804 // nth-* requires argument 1805 if ( !match[ 3 ] ) { 1806 Sizzle.error( match[ 0 ] ); 1807 } 1808 1809 // numeric x and y parameters for Expr.filter.CHILD 1810 // remember that false/true cast respectively to 0/1 1811 match[ 4 ] = +( match[ 4 ] ? 1812 match[ 5 ] + ( match[ 6 ] || 1 ) : 1813 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); 1814 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); 1815 1816 // other types prohibit arguments 1817 } else if ( match[ 3 ] ) { 1818 Sizzle.error( match[ 0 ] ); 1819 } 1820 1821 return match; 1822 }, 1823 1824 "PSEUDO": function( match ) { 1825 var excess, 1826 unquoted = !match[ 6 ] && match[ 2 ]; 1827 1828 if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { 1829 return null; 1830 } 1831 1832 // Accept quoted arguments as-is 1833 if ( match[ 3 ] ) { 1834 match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; 1835 1836 // Strip excess characters from unquoted arguments 1837 } else if ( unquoted && rpseudo.test( unquoted ) && 1838 1839 // Get excess from tokenize (recursively) 1840 ( excess = tokenize( unquoted, true ) ) && 1841 1842 // advance to the next closing parenthesis 1843 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { 1844 1845 // excess is a negative index 1846 match[ 0 ] = match[ 0 ].slice( 0, excess ); 1847 match[ 2 ] = unquoted.slice( 0, excess ); 1848 } 1849 1850 // Return only captures needed by the pseudo filter method (type and argument) 1851 return match.slice( 0, 3 ); 1852 } 1853 }, 1854 1855 filter: { 1856 1857 "TAG": function( nodeNameSelector ) { 1858 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 1859 return nodeNameSelector === "*" ? 1860 function() { 1861 return true; 1862 } : 1863 function( elem ) { 1864 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 1865 }; 1866 }, 1867 1868 "CLASS": function( className ) { 1869 var pattern = classCache[ className + " " ]; 1870 1871 return pattern || 1872 ( pattern = new RegExp( "(^|" + whitespace + 1873 ")" + className + "(" + whitespace + "|$)" ) ) && classCache( 1874 className, function( elem ) { 1875 return pattern.test( 1876 typeof elem.className === "string" && elem.className || 1877 typeof elem.getAttribute !== "undefined" && 1878 elem.getAttribute( "class" ) || 1879 "" 1880 ); 1881 } ); 1882 }, 1883 1884 "ATTR": function( name, operator, check ) { 1885 return function( elem ) { 1886 var result = Sizzle.attr( elem, name ); 1887 1888 if ( result == null ) { 1889 return operator === "!="; 1890 } 1891 if ( !operator ) { 1892 return true; 1893 } 1894 1895 result += ""; 1896 1897 /* eslint-disable max-len */ 1898 1899 return operator === "=" ? result === check : 1900 operator === "!=" ? result !== check : 1901 operator === "^=" ? check && result.indexOf( check ) === 0 : 1902 operator === "*=" ? check && result.indexOf( check ) > -1 : 1903 operator === "$=" ? check && result.slice( -check.length ) === check : 1904 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : 1905 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 1906 false; 1907 /* eslint-enable max-len */ 1908 1909 }; 1910 }, 1911 1912 "CHILD": function( type, what, _argument, first, last ) { 1913 var simple = type.slice( 0, 3 ) !== "nth", 1914 forward = type.slice( -4 ) !== "last", 1915 ofType = what === "of-type"; 1916 1917 return first === 1 && last === 0 ? 1918 1919 // Shortcut for :nth-*(n) 1920 function( elem ) { 1921 return !!elem.parentNode; 1922 } : 1923 1924 function( elem, _context, xml ) { 1925 var cache, uniqueCache, outerCache, node, nodeIndex, start, 1926 dir = simple !== forward ? "nextSibling" : "previousSibling", 1927 parent = elem.parentNode, 1928 name = ofType && elem.nodeName.toLowerCase(), 1929 useCache = !xml && !ofType, 1930 diff = false; 1931 1932 if ( parent ) { 1933 1934 // :(first|last|only)-(child|of-type) 1935 if ( simple ) { 1936 while ( dir ) { 1937 node = elem; 1938 while ( ( node = node[ dir ] ) ) { 1939 if ( ofType ? 1940 node.nodeName.toLowerCase() === name : 1941 node.nodeType === 1 ) { 1942 1943 return false; 1944 } 1945 } 1946 1947 // Reverse direction for :only-* (if we haven't yet done so) 1948 start = dir = type === "only" && !start && "nextSibling"; 1949 } 1950 return true; 1951 } 1952 1953 start = [ forward ? parent.firstChild : parent.lastChild ]; 1954 1955 // non-xml :nth-child(...) stores cache data on `parent` 1956 if ( forward && useCache ) { 1957 1958 // Seek `elem` from a previously-cached index 1959 1960 // ...in a gzip-friendly way 1961 node = parent; 1962 outerCache = node[ expando ] || ( node[ expando ] = {} ); 1963 1964 // Support: IE <9 only 1965 // Defend against cloned attroperties (jQuery gh-1709) 1966 uniqueCache = outerCache[ node.uniqueID ] || 1967 ( outerCache[ node.uniqueID ] = {} ); 1968 1969 cache = uniqueCache[ type ] || []; 1970 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 1971 diff = nodeIndex && cache[ 2 ]; 1972 node = nodeIndex && parent.childNodes[ nodeIndex ]; 1973 1974 while ( ( node = ++nodeIndex && node && node[ dir ] || 1975 1976 // Fallback to seeking `elem` from the start 1977 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 1978 1979 // When found, cache indexes on `parent` and break 1980 if ( node.nodeType === 1 && ++diff && node === elem ) { 1981 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; 1982 break; 1983 } 1984 } 1985 1986 } else { 1987 1988 // Use previously-cached element index if available 1989 if ( useCache ) { 1990 1991 // ...in a gzip-friendly way 1992 node = elem; 1993 outerCache = node[ expando ] || ( node[ expando ] = {} ); 1994 1995 // Support: IE <9 only 1996 // Defend against cloned attroperties (jQuery gh-1709) 1997 uniqueCache = outerCache[ node.uniqueID ] || 1998 ( outerCache[ node.uniqueID ] = {} ); 1999 2000 cache = uniqueCache[ type ] || []; 2001 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 2002 diff = nodeIndex; 2003 } 2004 2005 // xml :nth-child(...) 2006 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 2007 if ( diff === false ) { 2008 2009 // Use the same loop as above to seek `elem` from the start 2010 while ( ( node = ++nodeIndex && node && node[ dir ] || 2011 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 2012 2013 if ( ( ofType ? 2014 node.nodeName.toLowerCase() === name : 2015 node.nodeType === 1 ) && 2016 ++diff ) { 2017 2018 // Cache the index of each encountered element 2019 if ( useCache ) { 2020 outerCache = node[ expando ] || 2021 ( node[ expando ] = {} ); 2022
vendor: 14,491 bytes, lines 2023-2338
2023 // Support: IE <9 only 2024 // Defend against cloned attroperties (jQuery gh-1709) 2025 uniqueCache = outerCache[ node.uniqueID ] || 2026 ( outerCache[ node.uniqueID ] = {} ); 2027 2028 uniqueCache[ type ] = [ dirruns, diff ]; 2029 } 2030 2031 if ( node === elem ) { 2032 break; 2033 } 2034 } 2035 } 2036 } 2037 } 2038 2039 // Incorporate the offset, then check against cycle size 2040 diff -= last; 2041 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 2042 } 2043 }; 2044 }, 2045 2046 "PSEUDO": function( pseudo, argument ) { 2047 2048 // pseudo-class names are case-insensitive 2049 // http://www.w3.org/TR/selectors/#pseudo-classes 2050 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 2051 // Remember that setFilters inherits from pseudos 2052 var args, 2053 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 2054 Sizzle.error( "unsupported pseudo: " + pseudo ); 2055 2056 // The user may use createPseudo to indicate that 2057 // arguments are needed to create the filter function 2058 // just as Sizzle does 2059 if ( fn[ expando ] ) { 2060 return fn( argument ); 2061 } 2062 2063 // But maintain support for old signatures 2064 if ( fn.length > 1 ) { 2065 args = [ pseudo, pseudo, "", argument ]; 2066 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 2067 markFunction( function( seed, matches ) { 2068 var idx, 2069 matched = fn( seed, argument ), 2070 i = matched.length; 2071 while ( i-- ) { 2072 idx = indexOf( seed, matched[ i ] ); 2073 seed[ idx ] = !( matches[ idx ] = matched[ i ] ); 2074 } 2075 } ) : 2076 function( elem ) { 2077 return fn( elem, 0, args ); 2078 }; 2079 } 2080 2081 return fn; 2082 } 2083 }, 2084 2085 pseudos: { 2086 2087 // Potentially complex pseudos 2088 "not": markFunction( function( selector ) { 2089 2090 // Trim the selector passed to compile 2091 // to avoid treating leading and trailing 2092 // spaces as combinators 2093 var input = [], 2094 results = [], 2095 matcher = compile( selector.replace( rtrim, "$1" ) ); 2096 2097 return matcher[ expando ] ? 2098 markFunction( function( seed, matches, _context, xml ) { 2099 var elem, 2100 unmatched = matcher( seed, null, xml, [] ), 2101 i = seed.length; 2102 2103 // Match elements unmatched by `matcher` 2104 while ( i-- ) { 2105 if ( ( elem = unmatched[ i ] ) ) { 2106 seed[ i ] = !( matches[ i ] = elem ); 2107 } 2108 } 2109 } ) : 2110 function( elem, _context, xml ) { 2111 input[ 0 ] = elem; 2112 matcher( input, null, xml, results ); 2113 2114 // Don't keep the element (issue #299) 2115 input[ 0 ] = null; 2116 return !results.pop(); 2117 }; 2118 } ), 2119 2120 "has": markFunction( function( selector ) { 2121 return function( elem ) { 2122 return Sizzle( selector, elem ).length > 0; 2123 }; 2124 } ), 2125 2126 "contains": markFunction( function( text ) { 2127 text = text.replace( runescape, funescape ); 2128 return function( elem ) { 2129 return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; 2130 }; 2131 } ), 2132 2133 // "Whether an element is represented by a :lang() selector 2134 // is based solely on the element's language value 2135 // being equal to the identifier C, 2136 // or beginning with the identifier C immediately followed by "-". 2137 // The matching of C against the element's language value is performed case-insensitively. 2138 // The identifier C does not have to be a valid language name." 2139 // http://www.w3.org/TR/selectors/#lang-pseudo 2140 "lang": markFunction( function( lang ) { 2141 2142 // lang value must be a valid identifier 2143 if ( !ridentifier.test( lang || "" ) ) { 2144 Sizzle.error( "unsupported lang: " + lang ); 2145 } 2146 lang = lang.replace( runescape, funescape ).toLowerCase(); 2147 return function( elem ) { 2148 var elemLang; 2149 do { 2150 if ( ( elemLang = documentIsHTML ? 2151 elem.lang : 2152 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { 2153 2154 elemLang = elemLang.toLowerCase(); 2155 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 2156 } 2157 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); 2158 return false; 2159 }; 2160 } ), 2161 2162 // Miscellaneous 2163 "target": function( elem ) { 2164 var hash = window.location && window.location.hash; 2165 return hash && hash.slice( 1 ) === elem.id; 2166 }, 2167 2168 "root": function( elem ) { 2169 return elem === docElem; 2170 }, 2171 2172 "focus": function( elem ) { 2173 return elem === document.activeElement && 2174 ( !document.hasFocus || document.hasFocus() ) && 2175 !!( elem.type || elem.href || ~elem.tabIndex ); 2176 }, 2177 2178 // Boolean properties 2179 "enabled": createDisabledPseudo( false ), 2180 "disabled": createDisabledPseudo( true ), 2181 2182 "checked": function( elem ) { 2183 2184 // In CSS3, :checked should return both checked and selected elements 2185 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 2186 var nodeName = elem.nodeName.toLowerCase(); 2187 return ( nodeName === "input" && !!elem.checked ) || 2188 ( nodeName === "option" && !!elem.selected ); 2189 }, 2190 2191 "selected": function( elem ) { 2192 2193 // Accessing this property makes selected-by-default 2194 // options in Safari work properly 2195 if ( elem.parentNode ) { 2196 // eslint-disable-next-line no-unused-expressions 2197 elem.parentNode.selectedIndex; 2198 } 2199 2200 return elem.selected === true; 2201 }, 2202 2203 // Contents 2204 "empty": function( elem ) { 2205 2206 // http://www.w3.org/TR/selectors/#empty-pseudo 2207 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 2208 // but not by others (comment: 8; processing instruction: 7; etc.) 2209 // nodeType < 6 works because attributes (2) do not appear as children 2210 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 2211 if ( elem.nodeType < 6 ) { 2212 return false; 2213 } 2214 } 2215 return true; 2216 }, 2217 2218 "parent": function( elem ) { 2219 return !Expr.pseudos[ "empty" ]( elem ); 2220 }, 2221 2222 // Element/input types 2223 "header": function( elem ) { 2224 return rheader.test( elem.nodeName ); 2225 }, 2226 2227 "input": function( elem ) { 2228 return rinputs.test( elem.nodeName ); 2229 }, 2230 2231 "button": function( elem ) { 2232 var name = elem.nodeName.toLowerCase(); 2233 return name === "input" && elem.type === "button" || name === "button"; 2234 }, 2235 2236 "text": function( elem ) { 2237 var attr; 2238 return elem.nodeName.toLowerCase() === "input" && 2239 elem.type === "text" && 2240 2241 // Support: IE<8 2242 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 2243 ( ( attr = elem.getAttribute( "type" ) ) == null || 2244 attr.toLowerCase() === "text" ); 2245 }, 2246 2247 // Position-in-collection 2248 "first": createPositionalPseudo( function() { 2249 return [ 0 ]; 2250 } ), 2251 2252 "last": createPositionalPseudo( function( _matchIndexes, length ) { 2253 return [ length - 1 ]; 2254 } ), 2255 2256 "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { 2257 return [ argument < 0 ? argument + length : argument ]; 2258 } ), 2259 2260 "even": createPositionalPseudo( function( matchIndexes, length ) { 2261 var i = 0; 2262 for ( ; i < length; i += 2 ) { 2263 matchIndexes.push( i ); 2264 } 2265 return matchIndexes; 2266 } ), 2267 2268 "odd": createPositionalPseudo( function( matchIndexes, length ) { 2269 var i = 1; 2270 for ( ; i < length; i += 2 ) { 2271 matchIndexes.push( i ); 2272 } 2273 return matchIndexes; 2274 } ), 2275 2276 "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { 2277 var i = argument < 0 ? 2278 argument + length : 2279 argument > length ? 2280 length : 2281 argument; 2282 for ( ; --i >= 0; ) { 2283 matchIndexes.push( i ); 2284 } 2285 return matchIndexes; 2286 } ), 2287 2288 "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { 2289 var i = argument < 0 ? argument + length : argument; 2290 for ( ; ++i < length; ) { 2291 matchIndexes.push( i ); 2292 } 2293 return matchIndexes; 2294 } ) 2295 } 2296 }; 2297 2298 Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; 2299 2300// Add button/input type pseudos 2301 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 2302 Expr.pseudos[ i ] = createInputPseudo( i ); 2303 } 2304 for ( i in { submit: true, reset: true } ) { 2305 Expr.pseudos[ i ] = createButtonPseudo( i ); 2306 } 2307 2308// Easy API for creating new setFilters 2309 function setFilters() {} 2310 setFilters.prototype = Expr.filters = Expr.pseudos; 2311 Expr.setFilters = new setFilters(); 2312 2313 tokenize = Sizzle.tokenize = function( selector, parseOnly ) { 2314 var matched, match, tokens, type, 2315 soFar, groups, preFilters, 2316 cached = tokenCache[ selector + " " ]; 2317 2318 if ( cached ) { 2319 return parseOnly ? 0 : cached.slice( 0 ); 2320 } 2321 2322 soFar = selector; 2323 groups = []; 2324 preFilters = Expr.preFilter; 2325 2326 while ( soFar ) { 2327 2328 // Comma and first run 2329 if ( !matched || ( match = rcomma.exec( soFar ) ) ) { 2330 if ( match ) { 2331 2332 // Don't consume trailing commas as valid 2333 soFar = soFar.slice( match[ 0 ].length ) || soFar; 2334 } 2335 groups.push( ( tokens = [] ) ); 2336 } 2337 2338 matched = false;
vendor: 5,359 bytes, lines 2339-2456
2339 2340 // Combinators 2341 if ( ( match = rcombinators.exec( soFar ) ) ) { 2342 matched = match.shift(); 2343 tokens.push( { 2344 value: matched, 2345 2346 // Cast descendant combinators to space 2347 type: match[ 0 ].replace( rtrim, " " ) 2348 } ); 2349 soFar = soFar.slice( matched.length ); 2350 } 2351 2352 // Filters 2353 for ( type in Expr.filter ) { 2354 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || 2355 ( match = preFilters[ type ]( match ) ) ) ) { 2356 matched = match.shift(); 2357 tokens.push( { 2358 value: matched, 2359 type: type, 2360 matches: match 2361 } ); 2362 soFar = soFar.slice( matched.length ); 2363 } 2364 } 2365 2366 if ( !matched ) { 2367 break; 2368 } 2369 } 2370 2371 // Return the length of the invalid excess 2372 // if we're just parsing 2373 // Otherwise, throw an error or return tokens 2374 return parseOnly ? 2375 soFar.length : 2376 soFar ? 2377 Sizzle.error( selector ) : 2378 2379 // Cache the tokens 2380 tokenCache( selector, groups ).slice( 0 ); 2381 }; 2382 2383 function toSelector( tokens ) { 2384 var i = 0, 2385 len = tokens.length, 2386 selector = ""; 2387 for ( ; i < len; i++ ) { 2388 selector += tokens[ i ].value; 2389 } 2390 return selector; 2391 } 2392 2393 function addCombinator( matcher, combinator, base ) { 2394 var dir = combinator.dir, 2395 skip = combinator.next, 2396 key = skip || dir, 2397 checkNonElements = base && key === "parentNode", 2398 doneName = done++; 2399 2400 return combinator.first ? 2401 2402 // Check against closest ancestor/preceding element 2403 function( elem, context, xml ) { 2404 while ( ( elem = elem[ dir ] ) ) { 2405 if ( elem.nodeType === 1 || checkNonElements ) { 2406 return matcher( elem, context, xml ); 2407 } 2408 } 2409 return false; 2410 } : 2411 2412 // Check against all ancestor/preceding elements 2413 function( elem, context, xml ) { 2414 var oldCache, uniqueCache, outerCache, 2415 newCache = [ dirruns, doneName ]; 2416 2417 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 2418 if ( xml ) { 2419 while ( ( elem = elem[ dir ] ) ) { 2420 if ( elem.nodeType === 1 || checkNonElements ) { 2421 if ( matcher( elem, context, xml ) ) { 2422 return true; 2423 } 2424 } 2425 } 2426 } else { 2427 while ( ( elem = elem[ dir ] ) ) { 2428 if ( elem.nodeType === 1 || checkNonElements ) { 2429 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 2430 2431 // Support: IE <9 only 2432 // Defend against cloned attroperties (jQuery gh-1709) 2433 uniqueCache = outerCache[ elem.uniqueID ] || 2434 ( outerCache[ elem.uniqueID ] = {} ); 2435 2436 if ( skip && skip === elem.nodeName.toLowerCase() ) { 2437 elem = elem[ dir ] || elem; 2438 } else if ( ( oldCache = uniqueCache[ key ] ) && 2439 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 2440 2441 // Assign to newCache so results back-propagate to previous elements 2442 return ( newCache[ 2 ] = oldCache[ 2 ] ); 2443 } else { 2444 2445 // Reuse newcache so results back-propagate to previous elements 2446 uniqueCache[ key ] = newCache; 2447 2448 // A match means we're done; a fail means we have to keep checking 2449 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { 2450 return true; 2451 } 2452 } 2453 } 2454 } 2455 } 2456 return false;
vendor: 8,930 bytes, lines 2457-2653
2457 }; 2458 } 2459 2460 function elementMatcher( matchers ) { 2461 return matchers.length > 1 ? 2462 function( elem, context, xml ) { 2463 var i = matchers.length; 2464 while ( i-- ) { 2465 if ( !matchers[ i ]( elem, context, xml ) ) { 2466 return false; 2467 } 2468 } 2469 return true; 2470 } : 2471 matchers[ 0 ]; 2472 } 2473 2474 function multipleContexts( selector, contexts, results ) { 2475 var i = 0, 2476 len = contexts.length; 2477 for ( ; i < len; i++ ) { 2478 Sizzle( selector, contexts[ i ], results ); 2479 } 2480 return results; 2481 } 2482 2483 function condense( unmatched, map, filter, context, xml ) { 2484 var elem, 2485 newUnmatched = [], 2486 i = 0, 2487 len = unmatched.length, 2488 mapped = map != null; 2489 2490 for ( ; i < len; i++ ) { 2491 if ( ( elem = unmatched[ i ] ) ) { 2492 if ( !filter || filter( elem, context, xml ) ) { 2493 newUnmatched.push( elem ); 2494 if ( mapped ) { 2495 map.push( i ); 2496 } 2497 } 2498 } 2499 } 2500 2501 return newUnmatched; 2502 } 2503 2504 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 2505 if ( postFilter && !postFilter[ expando ] ) { 2506 postFilter = setMatcher( postFilter ); 2507 } 2508 if ( postFinder && !postFinder[ expando ] ) { 2509 postFinder = setMatcher( postFinder, postSelector ); 2510 } 2511 return markFunction( function( seed, results, context, xml ) { 2512 var temp, i, elem, 2513 preMap = [], 2514 postMap = [], 2515 preexisting = results.length, 2516 2517 // Get initial elements from seed or context 2518 elems = seed || multipleContexts( 2519 selector || "*", 2520 context.nodeType ? [ context ] : context, 2521 [] 2522 ), 2523 2524 // Prefilter to get matcher input, preserving a map for seed-results synchronization 2525 matcherIn = preFilter && ( seed || !selector ) ? 2526 condense( elems, preMap, preFilter, context, xml ) : 2527 elems, 2528 2529 matcherOut = matcher ? 2530 2531 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 2532 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 2533 2534 // ...intermediate processing is necessary 2535 [] : 2536 2537 // ...otherwise use results directly 2538 results : 2539 matcherIn; 2540 2541 // Find primary matches 2542 if ( matcher ) { 2543 matcher( matcherIn, matcherOut, context, xml ); 2544 } 2545 2546 // Apply postFilter 2547 if ( postFilter ) { 2548 temp = condense( matcherOut, postMap ); 2549 postFilter( temp, [], context, xml ); 2550 2551 // Un-match failing elements by moving them back to matcherIn 2552 i = temp.length; 2553 while ( i-- ) { 2554 if ( ( elem = temp[ i ] ) ) { 2555 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); 2556 } 2557 } 2558 } 2559 2560 if ( seed ) { 2561 if ( postFinder || preFilter ) { 2562 if ( postFinder ) { 2563 2564 // Get the final matcherOut by condensing this intermediate into postFinder contexts 2565 temp = []; 2566 i = matcherOut.length; 2567 while ( i-- ) { 2568 if ( ( elem = matcherOut[ i ] ) ) { 2569 2570 // Restore matcherIn since elem is not yet a final match 2571 temp.push( ( matcherIn[ i ] = elem ) ); 2572 } 2573 } 2574 postFinder( null, ( matcherOut = [] ), temp, xml ); 2575 } 2576 2577 // Move matched elements from seed to results to keep them synchronized 2578 i = matcherOut.length; 2579 while ( i-- ) { 2580 if ( ( elem = matcherOut[ i ] ) && 2581 ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { 2582 2583 seed[ temp ] = !( results[ temp ] = elem ); 2584 } 2585 } 2586 } 2587 2588 // Add elements to results, through postFinder if defined 2589 } else { 2590 matcherOut = condense( 2591 matcherOut === results ? 2592 matcherOut.splice( preexisting, matcherOut.length ) : 2593 matcherOut 2594 ); 2595 if ( postFinder ) { 2596 postFinder( null, results, matcherOut, xml ); 2597 } else { 2598 push.apply( results, matcherOut ); 2599 } 2600 } 2601 } ); 2602 } 2603 2604 function matcherFromTokens( tokens ) { 2605 var checkContext, matcher, j, 2606 len = tokens.length, 2607 leadingRelative = Expr.relative[ tokens[ 0 ].type ], 2608 implicitRelative = leadingRelative || Expr.relative[ " " ], 2609 i = leadingRelative ? 1 : 0, 2610 2611 // The foundational matcher ensures that elements are reachable from top-level context(s) 2612 matchContext = addCombinator( function( elem ) { 2613 return elem === checkContext; 2614 }, implicitRelative, true ), 2615 matchAnyContext = addCombinator( function( elem ) { 2616 return indexOf( checkContext, elem ) > -1; 2617 }, implicitRelative, true ), 2618 matchers = [ function( elem, context, xml ) { 2619 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 2620 ( checkContext = context ).nodeType ? 2621 matchContext( elem, context, xml ) : 2622 matchAnyContext( elem, context, xml ) ); 2623 2624 // Avoid hanging onto element (issue #299) 2625 checkContext = null; 2626 return ret; 2627 } ]; 2628 2629 for ( ; i < len; i++ ) { 2630 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { 2631 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; 2632 } else { 2633 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); 2634 2635 // Return special upon seeing a positional matcher 2636 if ( matcher[ expando ] ) { 2637 2638 // Find the next relative operator (if any) for proper handling 2639 j = ++i; 2640 for ( ; j < len; j++ ) { 2641 if ( Expr.relative[ tokens[ j ].type ] ) { 2642 break; 2643 } 2644 } 2645 return setMatcher( 2646 i > 1 && elementMatcher( matchers ), 2647 i > 1 && toSelector( 2648 2649 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 2650 tokens 2651 .slice( 0, i - 1 ) 2652 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) 2653 ).replace( rtrim, "$1" ),
vendor: 10,913 bytes, lines 2654-2878
2654 matcher, 2655 i < j && matcherFromTokens( tokens.slice( i, j ) ), 2656 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), 2657 j < len && toSelector( tokens ) 2658 ); 2659 } 2660 matchers.push( matcher ); 2661 } 2662 } 2663 2664 return elementMatcher( matchers ); 2665 } 2666 2667 function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 2668 var bySet = setMatchers.length > 0, 2669 byElement = elementMatchers.length > 0, 2670 superMatcher = function( seed, context, xml, results, outermost ) { 2671 var elem, j, matcher, 2672 matchedCount = 0, 2673 i = "0", 2674 unmatched = seed && [], 2675 setMatched = [], 2676 contextBackup = outermostContext, 2677 2678 // We must always have either seed elements or outermost context 2679 elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), 2680 2681 // Use integer dirruns iff this is the outermost matcher 2682 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), 2683 len = elems.length; 2684 2685 if ( outermost ) { 2686 2687 // Support: IE 11+, Edge 17 - 18+ 2688 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2689 // two documents; shallow comparisons work. 2690 // eslint-disable-next-line eqeqeq 2691 outermostContext = context == document || context || outermost; 2692 } 2693 2694 // Add elements passing elementMatchers directly to results 2695 // Support: IE<9, Safari 2696 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 2697 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { 2698 if ( byElement && elem ) { 2699 j = 0; 2700 2701 // Support: IE 11+, Edge 17 - 18+ 2702 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2703 // two documents; shallow comparisons work. 2704 // eslint-disable-next-line eqeqeq 2705 if ( !context && elem.ownerDocument != document ) { 2706 setDocument( elem ); 2707 xml = !documentIsHTML; 2708 } 2709 while ( ( matcher = elementMatchers[ j++ ] ) ) { 2710 if ( matcher( elem, context || document, xml ) ) { 2711 results.push( elem ); 2712 break; 2713 } 2714 } 2715 if ( outermost ) { 2716 dirruns = dirrunsUnique; 2717 } 2718 } 2719 2720 // Track unmatched elements for set filters 2721 if ( bySet ) { 2722 2723 // They will have gone through all possible matchers 2724 if ( ( elem = !matcher && elem ) ) { 2725 matchedCount--; 2726 } 2727 2728 // Lengthen the array for every element, matched or not 2729 if ( seed ) { 2730 unmatched.push( elem ); 2731 } 2732 } 2733 } 2734 2735 // `i` is now the count of elements visited above, and adding it to `matchedCount` 2736 // makes the latter nonnegative. 2737 matchedCount += i; 2738 2739 // Apply set filters to unmatched elements 2740 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 2741 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 2742 // no element matchers and no seed. 2743 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 2744 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 2745 // numerically zero. 2746 if ( bySet && i !== matchedCount ) { 2747 j = 0; 2748 while ( ( matcher = setMatchers[ j++ ] ) ) { 2749 matcher( unmatched, setMatched, context, xml ); 2750 } 2751 2752 if ( seed ) { 2753 2754 // Reintegrate element matches to eliminate the need for sorting 2755 if ( matchedCount > 0 ) { 2756 while ( i-- ) { 2757 if ( !( unmatched[ i ] || setMatched[ i ] ) ) { 2758 setMatched[ i ] = pop.call( results ); 2759 } 2760 } 2761 } 2762 2763 // Discard index placeholder values to get only actual matches 2764 setMatched = condense( setMatched ); 2765 } 2766 2767 // Add matches to results 2768 push.apply( results, setMatched ); 2769 2770 // Seedless set matches succeeding multiple successful matchers stipulate sorting 2771 if ( outermost && !seed && setMatched.length > 0 && 2772 ( matchedCount + setMatchers.length ) > 1 ) { 2773 2774 Sizzle.uniqueSort( results ); 2775 } 2776 } 2777 2778 // Override manipulation of globals by nested matchers 2779 if ( outermost ) { 2780 dirruns = dirrunsUnique; 2781 outermostContext = contextBackup; 2782 } 2783 2784 return unmatched; 2785 }; 2786 2787 return bySet ? 2788 markFunction( superMatcher ) : 2789 superMatcher; 2790 } 2791 2792 compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { 2793 var i, 2794 setMatchers = [], 2795 elementMatchers = [], 2796 cached = compilerCache[ selector + " " ]; 2797 2798 if ( !cached ) { 2799 2800 // Generate a function of recursive functions that can be used to check each element 2801 if ( !match ) { 2802 match = tokenize( selector ); 2803 } 2804 i = match.length; 2805 while ( i-- ) { 2806 cached = matcherFromTokens( match[ i ] ); 2807 if ( cached[ expando ] ) { 2808 setMatchers.push( cached ); 2809 } else { 2810 elementMatchers.push( cached ); 2811 } 2812 } 2813 2814 // Cache the compiled function 2815 cached = compilerCache( 2816 selector, 2817 matcherFromGroupMatchers( elementMatchers, setMatchers ) 2818 ); 2819 2820 // Save selector and tokenization 2821 cached.selector = selector; 2822 } 2823 return cached; 2824 }; 2825 2826 /** 2827 * A low-level selection function that works with Sizzle's compiled 2828 * selector functions 2829 * @param {String|Function} selector A selector or a pre-compiled 2830 * selector function built with Sizzle.compile 2831 * @param {Element} context 2832 * @param {Array} [results] 2833 * @param {Array} [seed] A set of elements to match against 2834 */ 2835 select = Sizzle.select = function( selector, context, results, seed ) { 2836 var i, tokens, token, type, find, 2837 compiled = typeof selector === "function" && selector, 2838 match = !seed && tokenize( ( selector = compiled.selector || selector ) ); 2839 2840 results = results || []; 2841 2842 // Try to minimize operations if there is only one selector in the list and no seed 2843 // (the latter of which guarantees us context) 2844 if ( match.length === 1 ) { 2845 2846 // Reduce context if the leading compound selector is an ID 2847 tokens = match[ 0 ] = match[ 0 ].slice( 0 ); 2848 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && 2849 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { 2850 2851 context = ( Expr.find[ "ID" ]( token.matches[ 0 ] 2852 .replace( runescape, funescape ), context ) || [] )[ 0 ]; 2853 if ( !context ) { 2854 return results; 2855 2856 // Precompiled matchers will still verify ancestry, so step up a level 2857 } else if ( compiled ) { 2858 context = context.parentNode; 2859 } 2860 2861 selector = selector.slice( tokens.shift().value.length ); 2862 } 2863 2864 // Fetch a seed set for right-to-left matching 2865 i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; 2866 while ( i-- ) { 2867 token = tokens[ i ]; 2868 2869 // Abort if we hit a combinator 2870 if ( Expr.relative[ ( type = token.type ) ] ) { 2871 break; 2872 } 2873 if ( ( find = Expr.find[ type ] ) ) { 2874 2875 // Search, expanding context for leading sibling combinators 2876 if ( ( seed = find( 2877 token.matches[ 0 ].replace( runescape, funescape ), 2878 rsibling.test( tokens[ 0 ].type ) && testC
vendor: 6,676 bytes, lines 2878-3082
2878ontext( context.parentNode ) || 2879 context 2880 ) ) ) { 2881 2882 // If seed is empty or no tokens remain, we can return early 2883 tokens.splice( i, 1 ); 2884 selector = seed.length && toSelector( tokens ); 2885 if ( !selector ) { 2886 push.apply( results, seed ); 2887 return results; 2888 } 2889 2890 break; 2891 } 2892 } 2893 } 2894 } 2895 2896 // Compile and execute a filtering function if one is not provided 2897 // Provide `match` to avoid retokenization if we modified the selector above 2898 ( compiled || compile( selector, match ) )( 2899 seed, 2900 context, 2901 !documentIsHTML, 2902 results, 2903 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 2904 ); 2905 return results; 2906 }; 2907 2908// One-time assignments 2909 2910// Sort stability 2911 support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; 2912 2913// Support: Chrome 14-35+ 2914// Always assume duplicates if they aren't passed to the comparison function 2915 support.detectDuplicates = !!hasDuplicate; 2916 2917// Initialize against the default document 2918 setDocument(); 2919 2920// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 2921// Detached nodes confoundingly follow *each other* 2922 support.sortDetached = assert( function( el ) { 2923 2924 // Should return 1, but returns 4 (following) 2925 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; 2926 } ); 2927 2928// Support: IE<8 2929// Prevent attribute/property "interpolation" 2930// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 2931 if ( !assert( function( el ) { 2932 el.innerHTML = "<a href='#'></a>"; 2933 return el.firstChild.getAttribute( "href" ) === "#"; 2934 } ) ) { 2935 addHandle( "type|href|height|width", function( elem, name, isXML ) { 2936 if ( !isXML ) { 2937 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); 2938 } 2939 } ); 2940 } 2941 2942// Support: IE<9 2943// Use defaultValue in place of getAttribute("value") 2944 if ( !support.attributes || !assert( function( el ) { 2945 el.innerHTML = "<input/>"; 2946 el.firstChild.setAttribute( "value", "" ); 2947 return el.firstChild.getAttribute( "value" ) === ""; 2948 } ) ) { 2949 addHandle( "value", function( elem, _name, isXML ) { 2950 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { 2951 return elem.defaultValue; 2952 } 2953 } ); 2954 } 2955 2956// Support: IE<9 2957// Use getAttributeNode to fetch booleans when getAttribute lies 2958 if ( !assert( function( el ) { 2959 return el.getAttribute( "disabled" ) == null; 2960 } ) ) { 2961 addHandle( booleans, function( elem, name, isXML ) { 2962 var val; 2963 if ( !isXML ) { 2964 return elem[ name ] === true ? name.toLowerCase() : 2965 ( val = elem.getAttributeNode( name ) ) && val.specified ? 2966 val.value : 2967 null; 2968 } 2969 } ); 2970 } 2971 2972 return Sizzle; 2973 2974 } )( window ); 2975 2976 2977 2978 jQuery.find = Sizzle; 2979 jQuery.expr = Sizzle.selectors; 2980 2981// Deprecated 2982 jQuery.expr[ ":" ] = jQuery.expr.pseudos; 2983 jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 2984 jQuery.text = Sizzle.getText; 2985 jQuery.isXMLDoc = Sizzle.isXML; 2986 jQuery.contains = Sizzle.contains; 2987 jQuery.escapeSelector = Sizzle.escape; 2988 2989 2990 2991 2992 var dir = function( elem, dir, until ) { 2993 var matched = [], 2994 truncate = until !== undefined; 2995 2996 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 2997 if ( elem.nodeType === 1 ) { 2998 if ( truncate && jQuery( elem ).is( until ) ) { 2999 break; 3000 } 3001 matched.push( elem ); 3002 } 3003 } 3004 return matched; 3005 }; 3006 3007 3008 var siblings = function( n, elem ) { 3009 var matched = []; 3010 3011 for ( ; n; n = n.nextSibling ) { 3012 if ( n.nodeType === 1 && n !== elem ) { 3013 matched.push( n ); 3014 } 3015 } 3016 3017 return matched; 3018 }; 3019 3020 3021 var rneedsContext = jQuery.expr.match.needsContext; 3022 3023 3024 3025 function nodeName( elem, name ) { 3026 3027 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 3028 3029 }; 3030 var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 3031 3032 3033 3034// Implement the identical functionality for filter and not 3035 function winnow( elements, qualifier, not ) { 3036 if ( isFunction( qualifier ) ) { 3037 return jQuery.grep( elements, function( elem, i ) { 3038 return !!qualifier.call( elem, i, elem ) !== not; 3039 } ); 3040 } 3041 3042 // Single element 3043 if ( qualifier.nodeType ) { 3044 return jQuery.grep( elements, function( elem ) { 3045 return ( elem === qualifier ) !== not; 3046 } ); 3047 } 3048 3049 // Arraylike of elements (jQuery, arguments, Array) 3050 if ( typeof qualifier !== "string" ) { 3051 return jQuery.grep( elements, function( elem ) { 3052 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 3053 } ); 3054 } 3055 3056 // Filtered directly for both simple and complex selectors 3057 return jQuery.filter( qualifier, elements, not ); 3058 } 3059 3060 jQuery.filter = function( expr, elems, not ) { 3061 var elem = elems[ 0 ]; 3062 3063 if ( not ) { 3064 expr = ":not(" + expr + ")"; 3065 } 3066 3067 if ( elems.length === 1 && elem.nodeType === 1 ) { 3068 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 3069 } 3070 3071 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 3072 return elem.nodeType === 1; 3073 } ) ); 3074 }; 3075 3076 jQuery.fn.extend( { 3077 find: function( selector ) { 3078 var i, ret, 3079 len = this.length, 3080 self = this; 3081 3082 if ( typeof selector !== "string" ) {
vendor: 6,677 bytes, lines 3083-3269
3083 return this.pushStack( jQuery( selector ).filter( function() { 3084 for ( i = 0; i < len; i++ ) { 3085 if ( jQuery.contains( self[ i ], this ) ) { 3086 return true; 3087 } 3088 } 3089 } ) ); 3090 } 3091 3092 ret = this.pushStack( [] ); 3093 3094 for ( i = 0; i < len; i++ ) { 3095 jQuery.find( selector, self[ i ], ret ); 3096 } 3097 3098 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 3099 }, 3100 filter: function( selector ) { 3101 return this.pushStack( winnow( this, selector || [], false ) ); 3102 }, 3103 not: function( selector ) { 3104 return this.pushStack( winnow( this, selector || [], true ) ); 3105 }, 3106 is: function( selector ) { 3107 return !!winnow( 3108 this, 3109 3110 // If this is a positional/relative selector, check membership in the returned set 3111 // so $("p:first").is("p:last") won't return true for a doc with two "p". 3112 typeof selector === "string" && rneedsContext.test( selector ) ? 3113 jQuery( selector ) : 3114 selector || [], 3115 false 3116 ).length; 3117 } 3118 } ); 3119 3120 3121// Initialize a jQuery object 3122 3123 3124// A central reference to the root jQuery(document) 3125 var rootjQuery, 3126 3127 // A simple way to check for HTML strings 3128 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 3129 // Strict HTML recognition (#11290: must start with <) 3130 // Shortcut simple #id case for speed 3131 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 3132 3133 init = jQuery.fn.init = function( selector, context, root ) { 3134 var match, elem; 3135 3136 // HANDLE: $(""), $(null), $(undefined), $(false) 3137 if ( !selector ) { 3138 return this; 3139 } 3140 3141 // Method init() accepts an alternate rootjQuery 3142 // so migrate can support jQuery.sub (gh-2101) 3143 root = root || rootjQuery; 3144 3145 // Handle HTML strings 3146 if ( typeof selector === "string" ) { 3147 if ( selector[ 0 ] === "<" && 3148 selector[ selector.length - 1 ] === ">" && 3149 selector.length >= 3 ) { 3150 3151 // Assume that strings that start and end with <> are HTML and skip the regex check 3152 match = [ null, selector, null ]; 3153 3154 } else { 3155 match = rquickExpr.exec( selector ); 3156 } 3157 3158 // Match html or make sure no context is specified for #id 3159 if ( match && ( match[ 1 ] || !context ) ) { 3160 3161 // HANDLE: $(html) -> $(array) 3162 if ( match[ 1 ] ) { 3163 context = context instanceof jQuery ? context[ 0 ] : context; 3164 3165 // Option to run scripts is true for back-compat 3166 // Intentionally let the error be thrown if parseHTML is not present 3167 jQuery.merge( this, jQuery.parseHTML( 3168 match[ 1 ], 3169 context && context.nodeType ? context.ownerDocument || context : document, 3170 true 3171 ) ); 3172 3173 // HANDLE: $(html, props) 3174 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 3175 for ( match in context ) { 3176 3177 // Properties of context are called as methods if possible 3178 if ( isFunction( this[ match ] ) ) { 3179 this[ match ]( context[ match ] ); 3180 3181 // ...and otherwise set as attributes 3182 } else { 3183 this.attr( match, context[ match ] ); 3184 } 3185 } 3186 } 3187 3188 return this; 3189 3190 // HANDLE: $(#id) 3191 } else { 3192 elem = document.getElementById( match[ 2 ] ); 3193 3194 if ( elem ) { 3195 3196 // Inject the element directly into the jQuery object 3197 this[ 0 ] = elem; 3198 this.length = 1; 3199 } 3200 return this; 3201 } 3202 3203 // HANDLE: $(expr, $(...)) 3204 } else if ( !context || context.jquery ) { 3205 return ( context || root ).find( selector ); 3206 3207 // HANDLE: $(expr, context) 3208 // (which is just equivalent to: $(context).find(expr) 3209 } else { 3210 return this.constructor( context ).find( selector ); 3211 } 3212 3213 // HANDLE: $(DOMElement) 3214 } else if ( selector.nodeType ) { 3215 this[ 0 ] = selector; 3216 this.length = 1; 3217 return this; 3218 3219 // HANDLE: $(function) 3220 // Shortcut for document ready 3221 } else if ( isFunction( selector ) ) { 3222 return root.ready !== undefined ? 3223 root.ready( selector ) : 3224 3225 // Execute immediately if ready is not present 3226 selector( jQuery ); 3227 } 3228 3229 return jQuery.makeArray( selector, this ); 3230 }; 3231 3232// Give the init function the jQuery prototype for later instantiation 3233 init.prototype = jQuery.fn; 3234 3235// Initialize central reference 3236 rootjQuery = jQuery( document ); 3237 3238 3239 var rparentsprev = /^(?:parents|prev(?:Until|All))/, 3240 3241 // Methods guaranteed to produce a unique set when starting from a unique set 3242 guaranteedUnique = { 3243 children: true, 3244 contents: true, 3245 next: true, 3246 prev: true 3247 }; 3248 3249 jQuery.fn.extend( { 3250 has: function( target ) { 3251 var targets = jQuery( target, this ), 3252 l = targets.length; 3253 3254 return this.filter( function() { 3255 var i = 0; 3256 for ( ; i < l; i++ ) { 3257 if ( jQuery.contains( this, targets[ i ] ) ) { 3258 return true; 3259 } 3260 } 3261 } ); 3262 }, 3263 3264 closest: function( selectors, context ) { 3265 var cur, 3266 i = 0, 3267 l = this.length, 3268 matched = [], 3269 targets = typeof selectors !== "string" && jQuery(
vendor: 4,293 bytes, lines 3269-3393
3269selectors ); 3270 3271 // Positional selectors never match, since there's no _selection_ context 3272 if ( !rneedsContext.test( selectors ) ) { 3273 for ( ; i < l; i++ ) { 3274 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 3275 3276 // Always skip document fragments 3277 if ( cur.nodeType < 11 && ( targets ? 3278 targets.index( cur ) > -1 : 3279 3280 // Don't pass non-elements to Sizzle 3281 cur.nodeType === 1 && 3282 jQuery.find.matchesSelector( cur, selectors ) ) ) { 3283 3284 matched.push( cur ); 3285 break; 3286 } 3287 } 3288 } 3289 } 3290 3291 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 3292 }, 3293 3294 // Determine the position of an element within the set 3295 index: function( elem ) { 3296 3297 // No argument, return index in parent 3298 if ( !elem ) { 3299 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 3300 } 3301 3302 // Index in selector 3303 if ( typeof elem === "string" ) { 3304 return indexOf.call( jQuery( elem ), this[ 0 ] ); 3305 } 3306 3307 // Locate the position of the desired element 3308 return indexOf.call( this, 3309 3310 // If it receives a jQuery object, the first element is used 3311 elem.jquery ? elem[ 0 ] : elem 3312 ); 3313 }, 3314 3315 add: function( selector, context ) { 3316 return this.pushStack( 3317 jQuery.uniqueSort( 3318 jQuery.merge( this.get(), jQuery( selector, context ) ) 3319 ) 3320 ); 3321 }, 3322 3323 addBack: function( selector ) { 3324 return this.add( selector == null ? 3325 this.prevObject : this.prevObject.filter( selector ) 3326 ); 3327 } 3328 } ); 3329 3330 function sibling( cur, dir ) { 3331 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 3332 return cur; 3333 } 3334 3335 jQuery.each( { 3336 parent: function( elem ) { 3337 var parent = elem.parentNode; 3338 return parent && parent.nodeType !== 11 ? parent : null; 3339 }, 3340 parents: function( elem ) { 3341 return dir( elem, "parentNode" ); 3342 }, 3343 parentsUntil: function( elem, _i, until ) { 3344 return dir( elem, "parentNode", until ); 3345 }, 3346 next: function( elem ) { 3347 return sibling( elem, "nextSibling" ); 3348 }, 3349 prev: function( elem ) { 3350 return sibling( elem, "previousSibling" ); 3351 }, 3352 nextAll: function( elem ) { 3353 return dir( elem, "nextSibling" ); 3354 }, 3355 prevAll: function( elem ) { 3356 return dir( elem, "previousSibling" ); 3357 }, 3358 nextUntil: function( elem, _i, until ) { 3359 return dir( elem, "nextSibling", until ); 3360 }, 3361 prevUntil: function( elem, _i, until ) { 3362 return dir( elem, "previousSibling", until ); 3363 }, 3364 siblings: function( elem ) { 3365 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 3366 }, 3367 children: function( elem ) { 3368 return siblings( elem.firstChild ); 3369 }, 3370 contents: function( elem ) { 3371 if ( elem.contentDocument != null && 3372 3373 // Support: IE 11+ 3374 // <object> elements with no `data` attribute has an object 3375 // `contentDocument` with a `null` prototype. 3376 getProto( elem.contentDocument ) ) { 3377 3378 return elem.contentDocument; 3379 } 3380 3381 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 3382 // Treat the template element as a regular one in browsers that 3383 // don't support it. 3384 if ( nodeName( elem, "template" ) ) { 3385 elem = elem.content || elem; 3386 } 3387 3388 return jQuery.merge( [], elem.childNodes ); 3389 } 3390 }, function( name, fn ) { 3391 jQuery.fn[ name ] = function( until, selector ) { 3392 var matched = jQuery.map( this, fn, until ); 3393
vendor: 35,395 bytes, lines 3394-4325
3394 if ( name.slice( -5 ) !== "Until" ) { 3395 selector = until; 3396 } 3397 3398 if ( selector && typeof selector === "string" ) { 3399 matched = jQuery.filter( selector, matched ); 3400 } 3401 3402 if ( this.length > 1 ) { 3403 3404 // Remove duplicates 3405 if ( !guaranteedUnique[ name ] ) { 3406 jQuery.uniqueSort( matched ); 3407 } 3408 3409 // Reverse order for parents* and prev-derivatives 3410 if ( rparentsprev.test( name ) ) { 3411 matched.reverse(); 3412 } 3413 } 3414 3415 return this.pushStack( matched ); 3416 }; 3417 } ); 3418 var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 3419 3420 3421 3422// Convert String-formatted options into Object-formatted ones 3423 function createOptions( options ) { 3424 var object = {}; 3425 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 3426 object[ flag ] = true; 3427 } ); 3428 return object; 3429 } 3430 3431 /* 3432 * Create a callback list using the following parameters: 3433 * 3434 * options: an optional list of space-separated options that will change how 3435 * the callback list behaves or a more traditional option object 3436 * 3437 * By default a callback list will act like an event callback list and can be 3438 * "fired" multiple times. 3439 * 3440 * Possible options: 3441 * 3442 * once: will ensure the callback list can only be fired once (like a Deferred) 3443 * 3444 * memory: will keep track of previous values and will call any callback added 3445 * after the list has been fired right away with the latest "memorized" 3446 * values (like a Deferred) 3447 * 3448 * unique: will ensure a callback can only be added once (no duplicate in the list) 3449 * 3450 * stopOnFalse: interrupt callings when a callback returns false 3451 * 3452 */ 3453 jQuery.Callbacks = function( options ) { 3454 3455 // Convert options from String-formatted to Object-formatted if needed 3456 // (we check in cache first) 3457 options = typeof options === "string" ? 3458 createOptions( options ) : 3459 jQuery.extend( {}, options ); 3460 3461 var // Flag to know if list is currently firing 3462 firing, 3463 3464 // Last fire value for non-forgettable lists 3465 memory, 3466 3467 // Flag to know if list was already fired 3468 fired, 3469 3470 // Flag to prevent firing 3471 locked, 3472 3473 // Actual callback list 3474 list = [], 3475 3476 // Queue of execution data for repeatable lists 3477 queue = [], 3478 3479 // Index of currently firing callback (modified by add/remove as needed) 3480 firingIndex = -1, 3481 3482 // Fire callbacks 3483 fire = function() { 3484 3485 // Enforce single-firing 3486 locked = locked || options.once; 3487 3488 // Execute callbacks for all pending executions, 3489 // respecting firingIndex overrides and runtime changes 3490 fired = firing = true; 3491 for ( ; queue.length; firingIndex = -1 ) { 3492 memory = queue.shift(); 3493 while ( ++firingIndex < list.length ) { 3494 3495 // Run callback and check for early termination 3496 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 3497 options.stopOnFalse ) { 3498 3499 // Jump to end and forget the data so .add doesn't re-fire 3500 firingIndex = list.length; 3501 memory = false; 3502 } 3503 } 3504 } 3505 3506 // Forget the data if we're done with it 3507 if ( !options.memory ) { 3508 memory = false; 3509 } 3510 3511 firing = false; 3512 3513 // Clean up if we're done firing for good 3514 if ( locked ) { 3515 3516 // Keep an empty list if we have data for future add calls 3517 if ( memory ) { 3518 list = []; 3519 3520 // Otherwise, this object is spent 3521 } else { 3522 list = ""; 3523 } 3524 } 3525 }, 3526 3527 // Actual Callbacks object 3528 self = { 3529 3530 // Add a callback or a collection of callbacks to the list 3531 add: function() { 3532 if ( list ) { 3533 3534 // If we have memory from a past run, we should fire after adding 3535 if ( memory && !firing ) { 3536 firingIndex = list.length - 1; 3537 queue.push( memory ); 3538 } 3539 3540 ( function add( args ) { 3541 jQuery.each( args, function( _, arg ) { 3542 if ( isFunction( arg ) ) { 3543 if ( !options.unique || !self.has( arg ) ) { 3544 list.push( arg ); 3545 } 3546 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 3547 3548 // Inspect recursively 3549 add( arg ); 3550 } 3551 } ); 3552 } )( arguments ); 3553 3554 if ( memory && !firing ) { 3555 fire(); 3556 } 3557 } 3558 return this; 3559 }, 3560 3561 // Remove a callback from the list 3562 remove: function() { 3563 jQuery.each( arguments, function( _, arg ) { 3564 var index; 3565 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 3566 list.splice( index, 1 ); 3567 3568 // Handle firing indexes 3569 if ( index <= firingIndex ) { 3570 firingIndex--; 3571 } 3572 } 3573 } ); 3574 return this; 3575 }, 3576 3577 // Check if a given callback is in the list. 3578 // If no argument is given, return whether or not list has callbacks attached. 3579 has: function( fn ) { 3580 return fn ? 3581 jQuery.inArray( fn, list ) > -1 : 3582 list.length > 0; 3583 }, 3584 3585 // Remove all callbacks from the list 3586 empty: function() { 3587 if ( list ) { 3588 list = []; 3589 } 3590 return this; 3591 }, 3592 3593 // Disable .fire and .add 3594 // Abort any current/pending executions 3595 // Clear all callbacks and values 3596 disable: function() { 3597 locked = queue = []; 3598 list = memory = ""; 3599 return this; 3600 }, 3601 disabled: function() { 3602 return !list; 3603 }, 3604 3605 // Disable .fire 3606 // Also disable .add unless we have memory (since it would have no effect) 3607 // Abort any pending executions 3608 lock: function() { 3609 locked = queue = []; 3610 if ( !memory && !firing ) { 3611 list = memory = ""; 3612 } 3613 return this; 3614 }, 3615 locked: function() { 3616 return !!locked; 3617 }, 3618 3619 // Call all callbacks with the given context and arguments 3620 fireWith: function( context, args ) { 3621 if ( !locked ) { 3622 args = args || []; 3623 args = [ context, args.slice ? args.slice() : args ]; 3624 queue.push( args ); 3625 if ( !firing ) { 3626 fire(); 3627 } 3628 } 3629 return this; 3630 }, 3631 3632 // Call all the callbacks with the given arguments 3633 fire: function() { 3634 self.fireWith( this, arguments ); 3635 return this; 3636 }, 3637 3638 // To know if the callbacks have already been called at least once 3639 fired: function() { 3640 return !!fired; 3641 } 3642 }; 3643 3644 return self; 3645 }; 3646 3647 3648 function Identity( v ) { 3649 return v; 3650 } 3651 function Thrower( ex ) { 3652 throw ex; 3653 } 3654 3655 function adoptValue( value, resolve, reject, noValue ) { 3656 var method; 3657 3658 try { 3659 3660 // Check for promise aspect first to privilege synchronous behavior 3661 if ( value && isFunction( ( method = value.promise ) ) ) { 3662 method.call( value ).done( resolve ).fail( reject ); 3663 3664 // Other thenables 3665 } else if ( value && isFunction( ( method = value.then ) ) ) { 3666 method.call( value, resolve, reject ); 3667 3668 // Other non-thenables 3669 } else { 3670 3671 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 3672 // * false: [ value ].slice( 0 ) => resolve( value ) 3673 // * true: [ value ].slice( 1 ) => resolve() 3674 resolve.apply( undefined, [ value ].slice( noValue ) ); 3675 } 3676 3677 // For Promises/A+, convert exceptions into rejections 3678 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 3679 // Deferred#then to conditionally suppress rejection. 3680 } catch ( value ) { 3681 3682 // Support: Android 4.0 only 3683 // Strict mode functions invoked without .call/.apply get global-object context 3684 reject.apply( undefined, [ value ] ); 3685 } 3686 } 3687 3688 jQuery.extend( { 3689 3690 Deferred: function( func ) { 3691 var tuples = [ 3692 3693 // action, add listener, callbacks, 3694 // ... .then handlers, argument index, [final state] 3695 [ "notify", "progress", jQuery.Callbacks( "memory" ), 3696 jQuery.Callbacks( "memory" ), 2 ], 3697 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 3698 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 3699 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 3700 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 3701 ], 3702 state = "pending", 3703 promise = { 3704 state: function() { 3705 return state; 3706 }, 3707 always: function() { 3708 deferred.done( arguments ).fail( arguments ); 3709 return this; 3710 }, 3711 "catch": function( fn ) { 3712 return promise.then( null, fn ); 3713 }, 3714 3715 // Keep pipe for back-compat 3716 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 3717 var fns = arguments; 3718 3719 return jQuery.Deferred( function( newDefer ) { 3720 jQuery.each( tuples, function( _i, tuple ) { 3721 3722 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 3723 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 3724 3725 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 3726 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 3727 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 3728 deferred[ tuple[ 1 ] ]( function() { 3729 var returned = fn && fn.apply( this, arguments ); 3730 if ( returned && isFunction( returned.promise ) ) { 3731 returned.promise() 3732 .progress( newDefer.notify ) 3733 .done( newDefer.resolve ) 3734 .fail( newDefer.reject ); 3735 } else { 3736 newDefer[ tuple[ 0 ] + "With" ]( 3737 this, 3738 fn ? [ returned ] : arguments 3739 ); 3740 } 3741 } ); 3742 } ); 3743 fns = null; 3744 } ).promise(); 3745 }, 3746 then: function( onFulfilled, onRejected, onProgress ) { 3747 var maxDepth = 0; 3748 function resolve( depth, deferred, handler, special ) { 3749 return function() { 3750 var that = this, 3751 args = arguments, 3752 mightThrow = function() { 3753 var returned, then; 3754 3755 // Support: Promises/A+ section 2.3.3.3.3 3756 // https://promisesaplus.com/#point-59 3757 // Ignore double-resolution attempts 3758 if ( depth < maxDepth ) { 3759 return; 3760 } 3761 3762 returned = handler.apply( that, args ); 3763 3764 // Support: Promises/A+ section 2.3.1 3765 // https://promisesaplus.com/#point-48 3766 if ( returned === deferred.promise() ) { 3767 throw new TypeError( "Thenable self-resolution" ); 3768 } 3769 3770 // Support: Promises/A+ sections 2.3.3.1, 3.5 3771 // https://promisesaplus.com/#point-54 3772 // https://promisesaplus.com/#point-75 3773 // Retrieve `then` only once 3774 then = returned && 3775 3776 // Support: Promises/A+ section 2.3.4 3777 // https://promisesaplus.com/#point-64 3778 // Only check objects and functions for thenability 3779 ( typeof returned === "object" || 3780 typeof returned === "function" ) && 3781 returned.then; 3782 3783 // Handle a returned thenable 3784 if ( isFunction( then ) ) { 3785 3786 // Special processors (notify) just wait for resolution 3787 if ( special ) { 3788 then.call( 3789 returned, 3790 resolve( maxDepth, deferred, Identity, special ), 3791 resolve( maxDepth, deferred, Thrower, special ) 3792 ); 3793 3794 // Normal processors (resolve) also hook into progress 3795 } else { 3796 3797 // ...and disregard older resolution values 3798 maxDepth++; 3799 3800 then.call( 3801 returned, 3802 resolve( maxDepth, deferred, Identity, special ), 3803 resolve( maxDepth, deferred, Thrower, special ), 3804 resolve( maxDepth, deferred, Identity, 3805 deferred.notifyWith ) 3806 ); 3807 } 3808 3809 // Handle all other returned values 3810 } else { 3811 3812 // Only substitute handlers pass on context 3813 // and multiple values (non-spec behavior) 3814 if ( handler !== Identity ) { 3815 that = undefined; 3816 args = [ returned ]; 3817 } 3818 3819 // Process the value(s) 3820 // Default process is resolve 3821 ( special || deferred.resolveWith )( that, args ); 3822 } 3823 }, 3824 3825 // Only normal processors (resolve) catch and reject exceptions 3826 process = special ? 3827 mightThrow : 3828 function() { 3829 try { 3830 mightThrow(); 3831 } catch ( e ) { 3832 3833 if ( jQuery.Deferred.exceptionHook ) { 3834 jQuery.Deferred.exceptionHook( e, 3835 process.stackTrace ); 3836 } 3837 3838 // Support: Promises/A+ section 2.3.3.3.4.1 3839 // https://promisesaplus.com/#point-61 3840 // Ignore post-resolution exceptions 3841 if ( depth + 1 >= maxDepth ) { 3842 3843 // Only substitute handlers pass on context 3844 // and multiple values (non-spec behavior) 3845 if ( handler !== Thrower ) { 3846 that = undefined; 3847 args = [ e ]; 3848 } 3849 3850 deferred.rejectWith( that, args ); 3851 } 3852 } 3853 }; 3854 3855 // Support: Promises/A+ section 2.3.3.3.1 3856 // https://promisesaplus.com/#point-57 3857 // Re-resolve promises immediately to dodge false rejection from 3858 // subsequent errors 3859 if ( depth ) { 3860 process(); 3861 } else { 3862 3863 // Call an optional hook to record the stack, in case of exception 3864 // since it's otherwise lost when execution goes async 3865 if ( jQuery.Deferred.getStackHook ) { 3866 process.stackTrace = jQuery.Deferred.getStackHook(); 3867 } 3868 window.setTimeout( process ); 3869 } 3870 }; 3871 } 3872 3873 return jQuery.Deferred( function( newDefer ) { 3874 3875 // progress_handlers.add( ... ) 3876 tuples[ 0 ][ 3 ].add( 3877 resolve( 3878 0, 3879 newDefer, 3880 isFunction( onProgress ) ? 3881 onProgress : 3882 Identity, 3883 newDefer.notifyWith 3884 ) 3885 ); 3886 3887 // fulfilled_handlers.add( ... ) 3888 tuples[ 1 ][ 3 ].add( 3889 resolve( 3890 0, 3891 newDefer, 3892 isFunction( onFulfilled ) ? 3893 onFulfilled : 3894 Identity 3895 ) 3896 ); 3897 3898 // rejected_handlers.add( ... ) 3899 tuples[ 2 ][ 3 ].add( 3900 resolve( 3901 0, 3902 newDefer, 3903 isFunction( onRejected ) ? 3904 onRejected : 3905 Thrower 3906 ) 3907 ); 3908 } ).promise(); 3909 }, 3910 3911 // Get a promise for this deferred 3912 // If obj is provided, the promise aspect is added to the object 3913 promise: function( obj ) { 3914 return obj != null ? jQuery.extend( obj, promise ) : promise; 3915 } 3916 }, 3917 deferred = {}; 3918 3919 // Add list-specific methods 3920 jQuery.each( tuples, function( i, tuple ) { 3921 var list = tuple[ 2 ], 3922 stateString = tuple[ 5 ]; 3923 3924 // promise.progress = list.add 3925 // promise.done = list.add 3926 // promise.fail = list.add 3927 promise[ tuple[ 1 ] ] = list.add; 3928 3929 // Handle state 3930 if ( stateString ) { 3931 list.add( 3932 function() { 3933 3934 // state = "resolved" (i.e., fulfilled) 3935 // state = "rejected" 3936 state = stateString; 3937 }, 3938 3939 // rejected_callbacks.disable 3940 // fulfilled_callbacks.disable 3941 tuples[ 3 - i ][ 2 ].disable, 3942 3943 // rejected_handlers.disable 3944 // fulfilled_handlers.disable 3945 tuples[ 3 - i ][ 3 ].disable, 3946 3947 // progress_callbacks.lock 3948 tuples[ 0 ][ 2 ].lock, 3949 3950 // progress_handlers.lock 3951 tuples[ 0 ][ 3 ].lock 3952 ); 3953 } 3954 3955 // progress_handlers.fire 3956 // fulfilled_handlers.fire 3957 // rejected_handlers.fire 3958 list.add( tuple[ 3 ].fire ); 3959 3960 // deferred.notify = function() { deferred.notifyWith(...) } 3961 // deferred.resolve = function() { deferred.resolveWith(...) } 3962 // deferred.reject = function() { deferred.rejectWith(...) } 3963 deferred[ tuple[ 0 ] ] = function() { 3964 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 3965 return this; 3966 }; 3967 3968 // deferred.notifyWith = list.fireWith 3969 // deferred.resolveWith = list.fireWith 3970 // deferred.rejectWith = list.fireWith 3971 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 3972 } ); 3973 3974 // Make the deferred a promise 3975 promise.promise( deferred ); 3976 3977 // Call given func if any 3978 if ( func ) { 3979 func.call( deferred, deferred ); 3980 } 3981 3982 // All done! 3983 return deferred; 3984 }, 3985 3986 // Deferred helper 3987 when: function( singleValue ) { 3988 var 3989 3990 // count of uncompleted subordinates 3991 remaining = arguments.length, 3992 3993 // count of unprocessed arguments 3994 i = remaining, 3995 3996 // subordinate fulfillment data 3997 resolveContexts = Array( i ), 3998 resolveValues = slice.call( arguments ), 3999 4000 // the master Deferred 4001 master = jQuery.Deferred(), 4002 4003 // subordinate callback factory 4004 updateFunc = function( i ) { 4005 return function( value ) { 4006 resolveContexts[ i ] = this; 4007 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 4008 if ( !( --remaining ) ) { 4009 master.resolveWith( resolveContexts, resolveValues ); 4010 } 4011 }; 4012 }; 4013 4014 // Single- and empty arguments are adopted like Promise.resolve 4015 if ( remaining <= 1 ) { 4016 adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, 4017 !remaining ); 4018 4019 // Use .then() to unwrap secondary thenables (cf. gh-3000) 4020 if ( master.state() === "pending" || 4021 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 4022 4023 return master.then(); 4024 } 4025 } 4026 4027 // Multiple arguments are aggregated like Promise.all array elements 4028 while ( i-- ) { 4029 adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); 4030 } 4031 4032 return master.promise(); 4033 } 4034 } ); 4035 4036 4037// These usually indicate a programmer mistake during development, 4038// warn about them ASAP rather than swallowing them by default. 4039 var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 4040 4041 jQuery.Deferred.exceptionHook = function( error, stack ) { 4042 4043 // Support: IE 8 - 9 only 4044 // Console exists when dev tools are open, which can happen at any time 4045 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 4046 window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); 4047 } 4048 }; 4049 4050 4051 4052 4053 jQuery.readyException = function( error ) { 4054 window.setTimeout( function() { 4055 throw error; 4056 } ); 4057 }; 4058 4059 4060 4061 4062// The deferred used on DOM ready 4063 var readyList = jQuery.Deferred(); 4064 4065 jQuery.fn.ready = function( fn ) { 4066 4067 readyList 4068 .then( fn ) 4069 4070 // Wrap jQuery.readyException in a function so that the lookup 4071 // happens at the time of error handling instead of callback 4072 // registration. 4073 .catch( function( error ) { 4074 jQuery.readyException( error ); 4075 } ); 4076 4077 return this; 4078 }; 4079 4080 jQuery.extend( { 4081 4082 // Is the DOM ready to be used? Set to true once it occurs. 4083 isReady: false, 4084 4085 // A counter to track how many items to wait for before 4086 // the ready event fires. See #6781 4087 readyWait: 1, 4088 4089 // Handle when the DOM is ready 4090 ready: function( wait ) { 4091 4092 // Abort if there are pending holds or we're already ready 4093 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 4094 return; 4095 } 4096 4097 // Remember that the DOM is ready 4098 jQuery.isReady = true; 4099 4100 // If a normal DOM Ready event fired, decrement, and wait if need be 4101 if ( wait !== true && --jQuery.readyWait > 0 ) { 4102 return; 4103 } 4104 4105 // If there are functions bound, to execute 4106 readyList.resolveWith( document, [ jQuery ] ); 4107 } 4108 } ); 4109 4110 jQuery.ready.then = readyList.then; 4111 4112// The ready event handler and self cleanup method 4113 function completed() { 4114 document.removeEventListener( "DOMContentLoaded", completed ); 4115 window.removeEventListener( "load", completed ); 4116 jQuery.ready(); 4117 } 4118 4119// Catch cases where $(document).ready() is called 4120// after the browser event has already occurred. 4121// Support: IE <=9 - 10 only 4122// Older IE sometimes signals "interactive" too soon 4123 if ( document.readyState === "complete" || 4124 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 4125 4126 // Handle it asynchronously to allow scripts the opportunity to delay ready 4127 window.setTimeout( jQuery.ready ); 4128 4129 } else { 4130 4131 // Use the handy event callback 4132 document.addEventListener( "DOMContentLoaded", completed ); 4133 4134 // A fallback to window.onload, that will always work 4135 window.addEventListener( "load", completed ); 4136 } 4137 4138 4139 4140 4141// Multifunctional method to get and set values of a collection 4142// The value/s can optionally be executed if it's a function 4143 var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 4144 var i = 0, 4145 len = elems.length, 4146 bulk = key == null; 4147 4148 // Sets many values 4149 if ( toType( key ) === "object" ) { 4150 chainable = true; 4151 for ( i in key ) { 4152 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 4153 } 4154 4155 // Sets one value 4156 } else if ( value !== undefined ) { 4157 chainable = true; 4158 4159 if ( !isFunction( value ) ) { 4160 raw = true; 4161 } 4162 4163 if ( bulk ) { 4164 4165 // Bulk operations run against the entire set 4166 if ( raw ) { 4167 fn.call( elems, value ); 4168 fn = null; 4169 4170 // ...except when executing function values 4171 } else { 4172 bulk = fn; 4173 fn = function( elem, _key, value ) { 4174 return bulk.call( jQuery( elem ), value ); 4175 }; 4176 } 4177 } 4178 4179 if ( fn ) { 4180 for ( ; i < len; i++ ) { 4181 fn( 4182 elems[ i ], key, raw ? 4183 value : 4184 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 4185 ); 4186 } 4187 } 4188 } 4189 4190 if ( chainable ) { 4191 return elems; 4192 } 4193 4194 // Gets 4195 if ( bulk ) { 4196 return fn.call( elems ); 4197 } 4198 4199 return len ? fn( elems[ 0 ], key ) : emptyGet; 4200 }; 4201 4202 4203// Matches dashed string for camelizing 4204 var rmsPrefix = /^-ms-/, 4205 rdashAlpha = /-([a-z])/g; 4206 4207// Used by camelCase as callback to replace() 4208 function fcamelCase( _all, letter ) { 4209 return letter.toUpperCase(); 4210 } 4211 4212// Convert dashed to camelCase; used by the css and data modules 4213// Support: IE <=9 - 11, Edge 12 - 15 4214// Microsoft forgot to hump their vendor prefix (#9572) 4215 function camelCase( string ) { 4216 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 4217 } 4218 var acceptData = function( owner ) { 4219 4220 // Accepts only: 4221 // - Node 4222 // - Node.ELEMENT_NODE 4223 // - Node.DOCUMENT_NODE 4224 // - Object 4225 // - Any 4226 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 4227 }; 4228 4229 4230 4231 4232 function Data() { 4233 this.expando = jQuery.expando + Data.uid++; 4234 } 4235 4236 Data.uid = 1; 4237 4238 Data.prototype = { 4239 4240 cache: function( owner ) { 4241 4242 // Check if the owner object already has a cache 4243 var value = owner[ this.expando ]; 4244 4245 // If not, create one 4246 if ( !value ) { 4247 value = {}; 4248 4249 // We can accept data for non-element nodes in modern browsers, 4250 // but we should not, see #8335. 4251 // Always return an empty object. 4252 if ( acceptData( owner ) ) { 4253 4254 // If it is a node unlikely to be stringify-ed or looped over 4255 // use plain assignment 4256 if ( owner.nodeType ) { 4257 owner[ this.expando ] = value; 4258 4259 // Otherwise secure it in a non-enumerable property 4260 // configurable must be true to allow the property to be 4261 // deleted when data is removed 4262 } else { 4263 Object.defineProperty( owner, this.expando, { 4264 value: value, 4265 configurable: true 4266 } ); 4267 } 4268 } 4269 } 4270 4271 return value; 4272 }, 4273 set: function( owner, data, value ) { 4274 var prop, 4275 cache = this.cache( owner ); 4276 4277 // Handle: [ owner, key, value ] args 4278 // Always use camelCase key (gh-2257) 4279 if ( typeof data === "string" ) { 4280 cache[ camelCase( data ) ] = value; 4281 4282 // Handle: [ owner, { properties } ] args 4283 } else { 4284 4285 // Copy the properties one-by-one to the cache object 4286 for ( prop in data ) { 4287 cache[ camelCase( prop ) ] = data[ prop ]; 4288 } 4289 } 4290 return cache; 4291 }, 4292 get: function( owner, key ) { 4293 return key === undefined ? 4294 this.cache( owner ) : 4295 4296 // Always use camelCase key (gh-2257) 4297 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 4298 }, 4299 access: function( owner, key, value ) { 4300 4301 // In cases where either: 4302 // 4303 // 1. No key was specified 4304 // 2. A string key was specified, but no value provided 4305 // 4306 // Take the "read" path and allow the get method to determine 4307 // which value to return, respectively either: 4308 // 4309 // 1. The entire cache object 4310 // 2. The data stored at the key 4311 // 4312 if ( key === undefined || 4313 ( ( key && typeof key === "string" ) && value === undefined ) ) { 4314 4315 return this.get( owner, key ); 4316 } 4317 4318 // When the key is not a string, or both a key and value 4319 // are specified, set or extend (existing objects) with either: 4320 // 4321 // 1. An object of properties 4322 // 2. A key and value 4323 // 4324 this.set( owner, key, value ); 4325
vendor: 9,776 bytes, lines 4326-4616
4326 // Since the "set" path can have two possible entry points 4327 // return the expected data based on which path was taken[*] 4328 return value !== undefined ? value : key; 4329 }, 4330 remove: function( owner, key ) { 4331 var i, 4332 cache = owner[ this.expando ]; 4333 4334 if ( cache === undefined ) { 4335 return; 4336 } 4337 4338 if ( key !== undefined ) { 4339 4340 // Support array or space separated string of keys 4341 if ( Array.isArray( key ) ) { 4342 4343 // If key is an array of keys... 4344 // We always set camelCase keys, so remove that. 4345 key = key.map( camelCase ); 4346 } else { 4347 key = camelCase( key ); 4348 4349 // If a key with the spaces exists, use it. 4350 // Otherwise, create an array by matching non-whitespace 4351 key = key in cache ? 4352 [ key ] : 4353 ( key.match( rnothtmlwhite ) || [] ); 4354 } 4355 4356 i = key.length; 4357 4358 while ( i-- ) { 4359 delete cache[ key[ i ] ]; 4360 } 4361 } 4362 4363 // Remove the expando if there's no more data 4364 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 4365 4366 // Support: Chrome <=35 - 45 4367 // Webkit & Blink performance suffers when deleting properties 4368 // from DOM nodes, so set to undefined instead 4369 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 4370 if ( owner.nodeType ) { 4371 owner[ this.expando ] = undefined; 4372 } else { 4373 delete owner[ this.expando ]; 4374 } 4375 } 4376 }, 4377 hasData: function( owner ) { 4378 var cache = owner[ this.expando ]; 4379 return cache !== undefined && !jQuery.isEmptyObject( cache ); 4380 } 4381 }; 4382 var dataPriv = new Data(); 4383 4384 var dataUser = new Data(); 4385 4386 4387 4388// Implementation Summary 4389// 4390// 1. Enforce API surface and semantic compatibility with 1.9.x branch 4391// 2. Improve the module's maintainability by reducing the storage 4392// paths to a single mechanism. 4393// 3. Use the same single mechanism to support "private" and "user" data. 4394// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 4395// 5. Avoid exposing implementation details on user objects (eg. expando properties) 4396// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 4397 4398 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 4399 rmultiDash = /[A-Z]/g; 4400 4401 function getData( data ) { 4402 if ( data === "true" ) { 4403 return true; 4404 } 4405 4406 if ( data === "false" ) { 4407 return false; 4408 } 4409 4410 if ( data === "null" ) { 4411 return null; 4412 } 4413 4414 // Only convert to a number if it doesn't change the string 4415 if ( data === +data + "" ) { 4416 return +data; 4417 } 4418 4419 if ( rbrace.test( data ) ) { 4420 return JSON.parse( data ); 4421 } 4422 4423 return data; 4424 } 4425 4426 function dataAttr( elem, key, data ) { 4427 var name; 4428 4429 // If nothing was found internally, try to fetch any 4430 // data from the HTML5 data-* attribute 4431 if ( data === undefined && elem.nodeType === 1 ) { 4432 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 4433 data = elem.getAttribute( name ); 4434 4435 if ( typeof data === "string" ) { 4436 try { 4437 data = getData( data ); 4438 } catch ( e ) {} 4439 4440 // Make sure we set the data so it isn't changed later 4441 dataUser.set( elem, key, data ); 4442 } else { 4443 data = undefined; 4444 } 4445 } 4446 return data; 4447 } 4448 4449 jQuery.extend( { 4450 hasData: function( elem ) { 4451 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 4452 }, 4453 4454 data: function( elem, name, data ) { 4455 return dataUser.access( elem, name, data ); 4456 }, 4457 4458 removeData: function( elem, name ) { 4459 dataUser.remove( elem, name ); 4460 }, 4461 4462 // TODO: Now that all calls to _data and _removeData have been replaced 4463 // with direct calls to dataPriv methods, these can be deprecated. 4464 _data: function( elem, name, data ) { 4465 return dataPriv.access( elem, name, data ); 4466 }, 4467 4468 _removeData: function( elem, name ) { 4469 dataPriv.remove( elem, name ); 4470 } 4471 } ); 4472 4473 jQuery.fn.extend( { 4474 data: function( key, value ) { 4475 var i, name, data, 4476 elem = this[ 0 ], 4477 attrs = elem && elem.attributes; 4478 4479 // Gets all values 4480 if ( key === undefined ) { 4481 if ( this.length ) { 4482 data = dataUser.get( elem ); 4483 4484 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 4485 i = attrs.length; 4486 while ( i-- ) { 4487 4488 // Support: IE 11 only 4489 // The attrs elements can be null (#14894) 4490 if ( attrs[ i ] ) { 4491 name = attrs[ i ].name; 4492 if ( name.indexOf( "data-" ) === 0 ) { 4493 name = camelCase( name.slice( 5 ) ); 4494 dataAttr( elem, name, data[ name ] ); 4495 } 4496 } 4497 } 4498 dataPriv.set( elem, "hasDataAttrs", true ); 4499 } 4500 } 4501 4502 return data; 4503 } 4504 4505 // Sets multiple values 4506 if ( typeof key === "object" ) { 4507 return this.each( function() { 4508 dataUser.set( this, key ); 4509 } ); 4510 } 4511 4512 return access( this, function( value ) { 4513 var data; 4514 4515 // The calling jQuery object (element matches) is not empty 4516 // (and therefore has an element appears at this[ 0 ]) and the 4517 // `value` parameter was not undefined. An empty jQuery object 4518 // will result in `undefined` for elem = this[ 0 ] which will 4519 // throw an exception if an attempt to read a data cache is made. 4520 if ( elem && value === undefined ) { 4521 4522 // Attempt to get data from the cache 4523 // The key will always be camelCased in Data 4524 data = dataUser.get( elem, key ); 4525 if ( data !== undefined ) { 4526 return data; 4527 } 4528 4529 // Attempt to "discover" the data in 4530 // HTML5 custom data-* attrs 4531 data = dataAttr( elem, key ); 4532 if ( data !== undefined ) { 4533 return data; 4534 } 4535 4536 // We tried really hard, but the data doesn't exist. 4537 return; 4538 } 4539 4540 // Set the data... 4541 this.each( function() { 4542 4543 // We always store the camelCased key 4544 dataUser.set( this, key, value ); 4545 } ); 4546 }, null, value, arguments.length > 1, null, true ); 4547 }, 4548 4549 removeData: function( key ) { 4550 return this.each( function() { 4551 dataUser.remove( this, key ); 4552 } ); 4553 } 4554 } ); 4555 4556 4557 jQuery.extend( { 4558 queue: function( elem, type, data ) { 4559 var queue; 4560 4561 if ( elem ) { 4562 type = ( type || "fx" ) + "queue"; 4563 queue = dataPriv.get( elem, type ); 4564 4565 // Speed up dequeue by getting out quickly if this is just a lookup 4566 if ( data ) { 4567 if ( !queue || Array.isArray( data ) ) { 4568 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 4569 } else { 4570 queue.push( data ); 4571 } 4572 } 4573 return queue || []; 4574 } 4575 }, 4576 4577 dequeue: function( elem, type ) { 4578 type = type || "fx"; 4579 4580 var queue = jQuery.queue( elem, type ), 4581 startLength = queue.length, 4582 fn = queue.shift(), 4583 hooks = jQuery._queueHooks( elem, type ), 4584 next = function() { 4585 jQuery.dequeue( elem, type ); 4586 }; 4587 4588 // If the fx queue is dequeued, always remove the progress sentinel 4589 if ( fn === "inprogress" ) { 4590 fn = queue.shift(); 4591 startLength--; 4592 } 4593 4594 if ( fn ) { 4595 4596 // Add a progress sentinel to prevent the fx queue from being 4597 // automatically dequeued 4598 if ( type === "fx" ) { 4599 queue.unshift( "inprogress" ); 4600 } 4601 4602 // Clear up the last queue stop function 4603 delete hooks.stop; 4604 fn.call( elem, next, hooks ); 4605 } 4606 4607 if ( !startLength && hooks ) { 4608 hooks.empty.fire(); 4609 } 4610 }, 4611 4612 // Not public - generate a queueHooks object, or return the current one 4613 _queueHooks: function( elem, type ) { 4614 var key = type + "queueHooks"; 4615 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 4616 empty: jQuery.Callbacks( "once memory" ).add( function() {
vendor: 14,054 bytes, lines 4617-5039
4617 dataPriv.remove( elem, [ type + "queue", key ] ); 4618 } ) 4619 } ); 4620 } 4621 } ); 4622 4623 jQuery.fn.extend( { 4624 queue: function( type, data ) { 4625 var setter = 2; 4626 4627 if ( typeof type !== "string" ) { 4628 data = type; 4629 type = "fx"; 4630 setter--; 4631 } 4632 4633 if ( arguments.length < setter ) { 4634 return jQuery.queue( this[ 0 ], type ); 4635 } 4636 4637 return data === undefined ? 4638 this : 4639 this.each( function() { 4640 var queue = jQuery.queue( this, type, data ); 4641 4642 // Ensure a hooks for this queue 4643 jQuery._queueHooks( this, type ); 4644 4645 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 4646 jQuery.dequeue( this, type ); 4647 } 4648 } ); 4649 }, 4650 dequeue: function( type ) { 4651 return this.each( function() { 4652 jQuery.dequeue( this, type ); 4653 } ); 4654 }, 4655 clearQueue: function( type ) { 4656 return this.queue( type || "fx", [] ); 4657 }, 4658 4659 // Get a promise resolved when queues of a certain type 4660 // are emptied (fx is the type by default) 4661 promise: function( type, obj ) { 4662 var tmp, 4663 count = 1, 4664 defer = jQuery.Deferred(), 4665 elements = this, 4666 i = this.length, 4667 resolve = function() { 4668 if ( !( --count ) ) { 4669 defer.resolveWith( elements, [ elements ] ); 4670 } 4671 }; 4672 4673 if ( typeof type !== "string" ) { 4674 obj = type; 4675 type = undefined; 4676 } 4677 type = type || "fx"; 4678 4679 while ( i-- ) { 4680 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 4681 if ( tmp && tmp.empty ) { 4682 count++; 4683 tmp.empty.add( resolve ); 4684 } 4685 } 4686 resolve(); 4687 return defer.promise( obj ); 4688 } 4689 } ); 4690 var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 4691 4692 var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 4693 4694 4695 var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 4696 4697 var documentElement = document.documentElement; 4698 4699 4700 4701 var isAttached = function( elem ) { 4702 return jQuery.contains( elem.ownerDocument, elem ); 4703 }, 4704 composed = { composed: true }; 4705 4706 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 4707 // Check attachment across shadow DOM boundaries when possible (gh-3504) 4708 // Support: iOS 10.0-10.2 only 4709 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 4710 // leading to errors. We need to check for `getRootNode`. 4711 if ( documentElement.getRootNode ) { 4712 isAttached = function( elem ) { 4713 return jQuery.contains( elem.ownerDocument, elem ) || 4714 elem.getRootNode( composed ) === elem.ownerDocument; 4715 }; 4716 } 4717 var isHiddenWithinTree = function( elem, el ) { 4718 4719 // isHiddenWithinTree might be called from jQuery#filter function; 4720 // in that case, element will be second argument 4721 elem = el || elem; 4722 4723 // Inline style trumps all 4724 return elem.style.display === "none" || 4725 elem.style.display === "" && 4726 4727 // Otherwise, check computed style 4728 // Support: Firefox <=43 - 45 4729 // Disconnected elements can have computed display: none, so first confirm that elem is 4730 // in the document. 4731 isAttached( elem ) && 4732 4733 jQuery.css( elem, "display" ) === "none"; 4734 }; 4735 4736 4737 4738 function adjustCSS( elem, prop, valueParts, tween ) { 4739 var adjusted, scale, 4740 maxIterations = 20, 4741 currentValue = tween ? 4742 function() { 4743 return tween.cur(); 4744 } : 4745 function() { 4746 return jQuery.css( elem, prop, "" ); 4747 }, 4748 initial = currentValue(), 4749 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 4750 4751 // Starting value computation is required for potential unit mismatches 4752 initialInUnit = elem.nodeType && 4753 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 4754 rcssNum.exec( jQuery.css( elem, prop ) ); 4755 4756 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 4757 4758 // Support: Firefox <=54 4759 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 4760 initial = initial / 2; 4761 4762 // Trust units reported by jQuery.css 4763 unit = unit || initialInUnit[ 3 ]; 4764 4765 // Iteratively approximate from a nonzero starting point 4766 initialInUnit = +initial || 1; 4767 4768 while ( maxIterations-- ) { 4769 4770 // Evaluate and update our best guess (doubling guesses that zero out). 4771 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 4772 jQuery.style( elem, prop, initialInUnit + unit ); 4773 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 4774 maxIterations = 0; 4775 } 4776 initialInUnit = initialInUnit / scale; 4777 4778 } 4779 4780 initialInUnit = initialInUnit * 2; 4781 jQuery.style( elem, prop, initialInUnit + unit ); 4782 4783 // Make sure we update the tween properties later on 4784 valueParts = valueParts || []; 4785 } 4786 4787 if ( valueParts ) { 4788 initialInUnit = +initialInUnit || +initial || 0; 4789 4790 // Apply relative offset (+=/-=) if specified 4791 adjusted = valueParts[ 1 ] ? 4792 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 4793 +valueParts[ 2 ]; 4794 if ( tween ) { 4795 tween.unit = unit; 4796 tween.start = initialInUnit; 4797 tween.end = adjusted; 4798 } 4799 } 4800 return adjusted; 4801 } 4802 4803 4804 var defaultDisplayMap = {}; 4805 4806 function getDefaultDisplay( elem ) { 4807 var temp, 4808 doc = elem.ownerDocument, 4809 nodeName = elem.nodeName, 4810 display = defaultDisplayMap[ nodeName ]; 4811 4812 if ( display ) { 4813 return display; 4814 } 4815 4816 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 4817 display = jQuery.css( temp, "display" ); 4818 4819 temp.parentNode.removeChild( temp ); 4820 4821 if ( display === "none" ) { 4822 display = "block"; 4823 } 4824 defaultDisplayMap[ nodeName ] = display; 4825 4826 return display; 4827 } 4828 4829 function showHide( elements, show ) { 4830 var display, elem, 4831 values = [], 4832 index = 0, 4833 length = elements.length; 4834 4835 // Determine new display value for elements that need to change 4836 for ( ; index < length; index++ ) { 4837 elem = elements[ index ]; 4838 if ( !elem.style ) { 4839 continue; 4840 } 4841 4842 display = elem.style.display; 4843 if ( show ) { 4844 4845 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 4846 // check is required in this first loop unless we have a nonempty display value (either 4847 // inline or about-to-be-restored) 4848 if ( display === "none" ) { 4849 values[ index ] = dataPriv.get( elem, "display" ) || null; 4850 if ( !values[ index ] ) { 4851 elem.style.display = ""; 4852 } 4853 } 4854 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 4855 values[ index ] = getDefaultDisplay( elem ); 4856 } 4857 } else { 4858 if ( display !== "none" ) { 4859 values[ index ] = "none"; 4860 4861 // Remember what we're overwriting 4862 dataPriv.set( elem, "display", display ); 4863 } 4864 } 4865 } 4866 4867 // Set the display of the elements in a second loop to avoid constant reflow 4868 for ( index = 0; index < length; index++ ) { 4869 if ( values[ index ] != null ) { 4870 elements[ index ].style.display = values[ index ]; 4871 } 4872 } 4873 4874 return elements; 4875 } 4876 4877 jQuery.fn.extend( { 4878 show: function() { 4879 return showHide( this, true ); 4880 }, 4881 hide: function() { 4882 return showHide( this ); 4883 }, 4884 toggle: function( state ) { 4885 if ( typeof state === "boolean" ) { 4886 return state ? this.show() : this.hide(); 4887 } 4888 4889 return this.each( function() { 4890 if ( isHiddenWithinTree( this ) ) { 4891 jQuery( this ).show(); 4892 } else { 4893 jQuery( this ).hide(); 4894 } 4895 } ); 4896 } 4897 } ); 4898 var rcheckableType = ( /^(?:checkbox|radio)$/i ); 4899 4900 var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 4901 4902 var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 4903 4904 4905 4906 ( function() { 4907 var fragment = document.createDocumentFragment(), 4908 div = fragment.appendChild( document.createElement( "div" ) ), 4909 input = document.createElement( "input" ); 4910 4911 // Support: Android 4.0 - 4.3 only 4912 // Check state lost if the name is set (#11217) 4913 // Support: Windows Web Apps (WWA) 4914 // `name` and `type` must use .setAttribute for WWA (#14901) 4915 input.setAttribute( "type", "radio" ); 4916 input.setAttribute( "checked", "checked" ); 4917 input.setAttribute( "name", "t" ); 4918 4919 div.appendChild( input ); 4920 4921 // Support: Android <=4.1 only 4922 // Older WebKit doesn't clone checked state correctly in fragments 4923 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 4924 4925 // Support: IE <=11 only 4926 // Make sure textarea (and checkbox) defaultValue is properly cloned 4927 div.innerHTML = "<textarea>x</textarea>"; 4928 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 4929 4930 // Support: IE <=9 only 4931 // IE <=9 replaces <option> tags with their contents when inserted outside of 4932 // the select element. 4933 div.innerHTML = "<option></option>"; 4934 support.option = !!div.lastChild; 4935 } )(); 4936 4937 4938// We have to close these tags to support XHTML (#13200) 4939 var wrapMap = { 4940 4941 // XHTML parsers do not magically insert elements in the 4942 // same way that tag soup parsers do. So we cannot shorten 4943 // this by omitting <tbody> or other required elements. 4944 thead: [ 1, "<table>", "</table>" ], 4945 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 4946 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 4947 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 4948 4949 _default: [ 0, "", "" ] 4950 }; 4951 4952 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 4953 wrapMap.th = wrapMap.td; 4954 4955// Support: IE <=9 only 4956 if ( !support.option ) { 4957 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 4958 } 4959 4960 4961 function getAll( context, tag ) { 4962 4963 // Support: IE <=9 - 11 only 4964 // Use typeof to avoid zero-argument method invocation on host objects (#15151) 4965 var ret; 4966 4967 if ( typeof context.getElementsByTagName !== "undefined" ) { 4968 ret = context.getElementsByTagName( tag || "*" ); 4969 4970 } else if ( typeof context.querySelectorAll !== "undefined" ) { 4971 ret = context.querySelectorAll( tag || "*" ); 4972 4973 } else { 4974 ret = []; 4975 } 4976 4977 if ( tag === undefined || tag && nodeName( context, tag ) ) { 4978 return jQuery.merge( [ context ], ret ); 4979 } 4980 4981 return ret; 4982 } 4983 4984 4985// Mark scripts as having already been evaluated 4986 function setGlobalEval( elems, refElements ) { 4987 var i = 0, 4988 l = elems.length; 4989 4990 for ( ; i < l; i++ ) { 4991 dataPriv.set( 4992 elems[ i ], 4993 "globalEval", 4994 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 4995 ); 4996 } 4997 } 4998 4999 5000 var rhtml = /<|&#?\w+;/; 5001 5002 function buildFragment( elems, context, scripts, selection, ignored ) { 5003 var elem, tmp, tag, wrap, attached, j, 5004 fragment = context.createDocumentFragment(), 5005 nodes = [], 5006 i = 0, 5007 l = elems.length; 5008 5009 for ( ; i < l; i++ ) { 5010 elem = elems[ i ]; 5011 5012 if ( elem || elem === 0 ) { 5013 5014 // Add nodes directly 5015 if ( toType( elem ) === "object" ) { 5016 5017 // Support: Android <=4.0 only, PhantomJS 1 only 5018 // push.apply(_, arraylike) throws on ancient WebKit 5019 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 5020 5021 // Convert non-html into a text node 5022 } else if ( !rhtml.test( elem ) ) { 5023 nodes.push( context.createTextNode( elem ) ); 5024 5025 // Convert html into DOM nodes 5026 } else { 5027 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 5028 5029 // Deserialize a standard representation 5030 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 5031 wrap = wrapMap[ tag ] || wrapMap._default; 5032 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 5033 5034 // Descend through wrappers to the right content 5035 j = wrap[ 0 ]; 5036 while ( j-- ) { 5037 tmp = tmp.lastChild; 5038 } 5039
vendor: 9,610 bytes, lines 5040-5318
5040 // Support: Android <=4.0 only, PhantomJS 1 only 5041 // push.apply(_, arraylike) throws on ancient WebKit 5042 jQuery.merge( nodes, tmp.childNodes ); 5043 5044 // Remember the top-level container 5045 tmp = fragment.firstChild; 5046 5047 // Ensure the created nodes are orphaned (#12392) 5048 tmp.textContent = ""; 5049 } 5050 } 5051 } 5052 5053 // Remove wrapper from fragment 5054 fragment.textContent = ""; 5055 5056 i = 0; 5057 while ( ( elem = nodes[ i++ ] ) ) { 5058 5059 // Skip elements already in the context collection (trac-4087) 5060 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 5061 if ( ignored ) { 5062 ignored.push( elem ); 5063 } 5064 continue; 5065 } 5066 5067 attached = isAttached( elem ); 5068 5069 // Append to fragment 5070 tmp = getAll( fragment.appendChild( elem ), "script" ); 5071 5072 // Preserve script evaluation history 5073 if ( attached ) { 5074 setGlobalEval( tmp ); 5075 } 5076 5077 // Capture executables 5078 if ( scripts ) { 5079 j = 0; 5080 while ( ( elem = tmp[ j++ ] ) ) { 5081 if ( rscriptType.test( elem.type || "" ) ) { 5082 scripts.push( elem ); 5083 } 5084 } 5085 } 5086 } 5087 5088 return fragment; 5089 } 5090 5091 5092 var 5093 rkeyEvent = /^key/, 5094 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, 5095 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 5096 5097 function returnTrue() { 5098 return true; 5099 } 5100 5101 function returnFalse() { 5102 return false; 5103 } 5104 5105// Support: IE <=9 - 11+ 5106// focus() and blur() are asynchronous, except when they are no-op. 5107// So expect focus to be synchronous when the element is already active, 5108// and blur to be synchronous when the element is not already active. 5109// (focus and blur are always synchronous in other supported browsers, 5110// this just defines when we can count on it). 5111 function expectSync( elem, type ) { 5112 return ( elem === safeActiveElement() ) === ( type === "focus" ); 5113 } 5114 5115// Support: IE <=9 only 5116// Accessing document.activeElement can throw unexpectedly 5117// https://bugs.jquery.com/ticket/13393 5118 function safeActiveElement() { 5119 try { 5120 return document.activeElement; 5121 } catch ( err ) { } 5122 } 5123 5124 function on( elem, types, selector, data, fn, one ) { 5125 var origFn, type; 5126 5127 // Types can be a map of types/handlers 5128 if ( typeof types === "object" ) { 5129 5130 // ( types-Object, selector, data ) 5131 if ( typeof selector !== "string" ) { 5132 5133 // ( types-Object, data ) 5134 data = data || selector; 5135 selector = undefined; 5136 } 5137 for ( type in types ) { 5138 on( elem, type, selector, data, types[ type ], one ); 5139 } 5140 return elem; 5141 } 5142 5143 if ( data == null && fn == null ) { 5144 5145 // ( types, fn ) 5146 fn = selector; 5147 data = selector = undefined; 5148 } else if ( fn == null ) { 5149 if ( typeof selector === "string" ) { 5150 5151 // ( types, selector, fn ) 5152 fn = data; 5153 data = undefined; 5154 } else { 5155 5156 // ( types, data, fn ) 5157 fn = data; 5158 data = selector; 5159 selector = undefined; 5160 } 5161 } 5162 if ( fn === false ) { 5163 fn = returnFalse; 5164 } else if ( !fn ) { 5165 return elem; 5166 } 5167 5168 if ( one === 1 ) { 5169 origFn = fn; 5170 fn = function( event ) { 5171 5172 // Can use an empty set, since event contains the info 5173 jQuery().off( event ); 5174 return origFn.apply( this, arguments ); 5175 }; 5176 5177 // Use same guid so caller can remove using origFn 5178 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 5179 } 5180 return elem.each( function() { 5181 jQuery.event.add( this, types, fn, data, selector ); 5182 } ); 5183 } 5184 5185 /* 5186 * Helper functions for managing events -- not part of the public interface. 5187 * Props to Dean Edwards' addEvent library for many of the ideas. 5188 */ 5189 jQuery.event = { 5190 5191 global: {}, 5192 5193 add: function( elem, types, handler, data, selector ) { 5194 5195 var handleObjIn, eventHandle, tmp, 5196 events, t, handleObj, 5197 special, handlers, type, namespaces, origType, 5198 elemData = dataPriv.get( elem ); 5199 5200 // Only attach events to objects that accept data 5201 if ( !acceptData( elem ) ) { 5202 return; 5203 } 5204 5205 // Caller can pass in an object of custom data in lieu of the handler 5206 if ( handler.handler ) { 5207 handleObjIn = handler; 5208 handler = handleObjIn.handler; 5209 selector = handleObjIn.selector; 5210 } 5211 5212 // Ensure that invalid selectors throw exceptions at attach time 5213 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 5214 if ( selector ) { 5215 jQuery.find.matchesSelector( documentElement, selector ); 5216 } 5217 5218 // Make sure that the handler has a unique ID, used to find/remove it later 5219 if ( !handler.guid ) { 5220 handler.guid = jQuery.guid++; 5221 } 5222 5223 // Init the element's event structure and main handler, if this is the first 5224 if ( !( events = elemData.events ) ) { 5225 events = elemData.events = Object.create( null ); 5226 } 5227 if ( !( eventHandle = elemData.handle ) ) { 5228 eventHandle = elemData.handle = function( e ) { 5229 5230 // Discard the second event of a jQuery.event.trigger() and 5231 // when an event is called after a page has unloaded 5232 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 5233 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 5234 }; 5235 } 5236 5237 // Handle multiple events separated by a space 5238 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5239 t = types.length; 5240 while ( t-- ) { 5241 tmp = rtypenamespace.exec( types[ t ] ) || []; 5242 type = origType = tmp[ 1 ]; 5243 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5244 5245 // There *must* be a type, no attaching namespace-only handlers 5246 if ( !type ) { 5247 continue; 5248 } 5249 5250 // If event changes its type, use the special event handlers for the changed type 5251 special = jQuery.event.special[ type ] || {}; 5252 5253 // If selector defined, determine special event api type, otherwise given type 5254 type = ( selector ? special.delegateType : special.bindType ) || type; 5255 5256 // Update special based on newly reset type 5257 special = jQuery.event.special[ type ] || {}; 5258 5259 // handleObj is passed to all event handlers 5260 handleObj = jQuery.extend( { 5261 type: type, 5262 origType: origType, 5263 data: data, 5264 handler: handler, 5265 guid: handler.guid, 5266 selector: selector, 5267 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 5268 namespace: namespaces.join( "." ) 5269 }, handleObjIn ); 5270 5271 // Init the event handler queue if we're the first 5272 if ( !( handlers = events[ type ] ) ) { 5273 handlers = events[ type ] = []; 5274 handlers.delegateCount = 0; 5275 5276 // Only use addEventListener if the special events handler returns false 5277 if ( !special.setup || 5278 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 5279 5280 if ( elem.addEventListener ) { 5281 elem.addEventListener( type, eventHandle ); 5282 } 5283 } 5284 } 5285 5286 if ( special.add ) { 5287 special.add.call( elem, handleObj ); 5288 5289 if ( !handleObj.handler.guid ) { 5290 handleObj.handler.guid = handler.guid; 5291 } 5292 } 5293 5294 // Add to the element's handler list, delegates in front 5295 if ( selector ) { 5296 handlers.splice( handlers.delegateCount++, 0, handleObj ); 5297 } else { 5298 handlers.push( handleObj ); 5299 } 5300 5301 // Keep track of which events have ever been used, for event optimization 5302 jQuery.event.global[ type ] = true; 5303 } 5304 5305 }, 5306 5307 // Detach an event or set of events from an element 5308 remove: function( elem, types, handler, selector, mappedTypes ) { 5309 5310 var j, origCount, tmp, 5311 events, t, handleObj, 5312 special, handlers, type, namespaces, origType, 5313 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 5314 5315 if ( !elemData || !( events = elemData.events ) ) { 5316 return; 5317 } 5318
vendor: 4,497 bytes, lines 5319-5422
5319 // Once for each type.namespace in types; type may be omitted 5320 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5321 t = types.length; 5322 while ( t-- ) { 5323 tmp = rtypenamespace.exec( types[ t ] ) || []; 5324 type = origType = tmp[ 1 ]; 5325 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5326 5327 // Unbind all events (on this namespace, if provided) for the element 5328 if ( !type ) { 5329 for ( type in events ) { 5330 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 5331 } 5332 continue; 5333 } 5334 5335 special = jQuery.event.special[ type ] || {}; 5336 type = ( selector ? special.delegateType : special.bindType ) || type; 5337 handlers = events[ type ] || []; 5338 tmp = tmp[ 2 ] && 5339 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 5340 5341 // Remove matching events 5342 origCount = j = handlers.length; 5343 while ( j-- ) { 5344 handleObj = handlers[ j ]; 5345 5346 if ( ( mappedTypes || origType === handleObj.origType ) && 5347 ( !handler || handler.guid === handleObj.guid ) && 5348 ( !tmp || tmp.test( handleObj.namespace ) ) && 5349 ( !selector || selector === handleObj.selector || 5350 selector === "**" && handleObj.selector ) ) { 5351 handlers.splice( j, 1 ); 5352 5353 if ( handleObj.selector ) { 5354 handlers.delegateCount--; 5355 } 5356 if ( special.remove ) { 5357 special.remove.call( elem, handleObj ); 5358 } 5359 } 5360 } 5361 5362 // Remove generic event handler if we removed something and no more handlers exist 5363 // (avoids potential for endless recursion during removal of special event handlers) 5364 if ( origCount && !handlers.length ) { 5365 if ( !special.teardown || 5366 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 5367 5368 jQuery.removeEvent( elem, type, elemData.handle ); 5369 } 5370 5371 delete events[ type ]; 5372 } 5373 } 5374 5375 // Remove data and the expando if it's no longer used 5376 if ( jQuery.isEmptyObject( events ) ) { 5377 dataPriv.remove( elem, "handle events" ); 5378 } 5379 }, 5380 5381 dispatch: function( nativeEvent ) { 5382 5383 var i, j, ret, matched, handleObj, handlerQueue, 5384 args = new Array( arguments.length ), 5385 5386 // Make a writable jQuery.Event from the native event object 5387 event = jQuery.event.fix( nativeEvent ), 5388 5389 handlers = ( 5390 dataPriv.get( this, "events" ) || Object.create( null ) 5391 )[ event.type ] || [], 5392 special = jQuery.event.special[ event.type ] || {}; 5393 5394 // Use the fix-ed jQuery.Event rather than the (read-only) native event 5395 args[ 0 ] = event; 5396 5397 for ( i = 1; i < arguments.length; i++ ) { 5398 args[ i ] = arguments[ i ]; 5399 } 5400 5401 event.delegateTarget = this; 5402 5403 // Call the preDispatch hook for the mapped type, and let it bail if desired 5404 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 5405 return; 5406 } 5407 5408 // Determine handlers 5409 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 5410 5411 // Run delegates first; they may want to stop propagation beneath us 5412 i = 0; 5413 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 5414 event.currentTarget = matched.elem; 5415 5416 j = 0; 5417 while ( ( handleObj = matched.handlers[ j++ ] ) && 5418 !event.isImmediatePropagationStopped() ) { 5419 5420 // If the event is namespaced, then each handler is only invoked if it is 5421 // specially universal or its namespaces are a superset of the event's. 5422 if ( !event.rnamespace || handleObj.namespace === false ||
vendor: 11,072 bytes, lines 5423-5679
5423 event.rnamespace.test( handleObj.namespace ) ) { 5424 5425 event.handleObj = handleObj; 5426 event.data = handleObj.data; 5427 5428 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 5429 handleObj.handler ).apply( matched.elem, args ); 5430 5431 if ( ret !== undefined ) { 5432 if ( ( event.result = ret ) === false ) { 5433 event.preventDefault(); 5434 event.stopPropagation(); 5435 } 5436 } 5437 } 5438 } 5439 } 5440 5441 // Call the postDispatch hook for the mapped type 5442 if ( special.postDispatch ) { 5443 special.postDispatch.call( this, event ); 5444 } 5445 5446 return event.result; 5447 }, 5448 5449 handlers: function( event, handlers ) { 5450 var i, handleObj, sel, matchedHandlers, matchedSelectors, 5451 handlerQueue = [], 5452 delegateCount = handlers.delegateCount, 5453 cur = event.target; 5454 5455 // Find delegate handlers 5456 if ( delegateCount && 5457 5458 // Support: IE <=9 5459 // Black-hole SVG <use> instance trees (trac-13180) 5460 cur.nodeType && 5461 5462 // Support: Firefox <=42 5463 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 5464 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 5465 // Support: IE 11 only 5466 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 5467 !( event.type === "click" && event.button >= 1 ) ) { 5468 5469 for ( ; cur !== this; cur = cur.parentNode || this ) { 5470 5471 // Don't check non-elements (#13208) 5472 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 5473 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 5474 matchedHandlers = []; 5475 matchedSelectors = {}; 5476 for ( i = 0; i < delegateCount; i++ ) { 5477 handleObj = handlers[ i ]; 5478 5479 // Don't conflict with Object.prototype properties (#13203) 5480 sel = handleObj.selector + " "; 5481 5482 if ( matchedSelectors[ sel ] === undefined ) { 5483 matchedSelectors[ sel ] = handleObj.needsContext ? 5484 jQuery( sel, this ).index( cur ) > -1 : 5485 jQuery.find( sel, this, null, [ cur ] ).length; 5486 } 5487 if ( matchedSelectors[ sel ] ) { 5488 matchedHandlers.push( handleObj ); 5489 } 5490 } 5491 if ( matchedHandlers.length ) { 5492 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 5493 } 5494 } 5495 } 5496 } 5497 5498 // Add the remaining (directly-bound) handlers 5499 cur = this; 5500 if ( delegateCount < handlers.length ) { 5501 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 5502 } 5503 5504 return handlerQueue; 5505 }, 5506 5507 addProp: function( name, hook ) { 5508 Object.defineProperty( jQuery.Event.prototype, name, { 5509 enumerable: true, 5510 configurable: true, 5511 5512 get: isFunction( hook ) ? 5513 function() { 5514 if ( this.originalEvent ) { 5515 return hook( this.originalEvent ); 5516 } 5517 } : 5518 function() { 5519 if ( this.originalEvent ) { 5520 return this.originalEvent[ name ]; 5521 } 5522 }, 5523 5524 set: function( value ) { 5525 Object.defineProperty( this, name, { 5526 enumerable: true, 5527 configurable: true, 5528 writable: true, 5529 value: value 5530 } ); 5531 } 5532 } ); 5533 }, 5534 5535 fix: function( originalEvent ) { 5536 return originalEvent[ jQuery.expando ] ? 5537 originalEvent : 5538 new jQuery.Event( originalEvent ); 5539 }, 5540 5541 special: { 5542 load: { 5543 5544 // Prevent triggered image.load events from bubbling to window.load 5545 noBubble: true 5546 }, 5547 click: { 5548 5549 // Utilize native event to ensure correct state for checkable inputs 5550 setup: function( data ) { 5551 5552 // For mutual compressibility with _default, replace `this` access with a local var. 5553 // `|| data` is dead code meant only to preserve the variable through minification. 5554 var el = this || data; 5555 5556 // Claim the first handler 5557 if ( rcheckableType.test( el.type ) && 5558 el.click && nodeName( el, "input" ) ) { 5559 5560 // dataPriv.set( el, "click", ... ) 5561 leverageNative( el, "click", returnTrue ); 5562 } 5563 5564 // Return false to allow normal processing in the caller 5565 return false; 5566 }, 5567 trigger: function( data ) { 5568 5569 // For mutual compressibility with _default, replace `this` access with a local var. 5570 // `|| data` is dead code meant only to preserve the variable through minification. 5571 var el = this || data; 5572 5573 // Force setup before triggering a click 5574 if ( rcheckableType.test( el.type ) && 5575 el.click && nodeName( el, "input" ) ) { 5576 5577 leverageNative( el, "click" ); 5578 } 5579 5580 // Return non-false to allow normal event-path propagation 5581 return true; 5582 }, 5583 5584 // For cross-browser consistency, suppress native .click() on links 5585 // Also prevent it if we're currently inside a leveraged native-event stack 5586 _default: function( event ) { 5587 var target = event.target; 5588 return rcheckableType.test( target.type ) && 5589 target.click && nodeName( target, "input" ) && 5590 dataPriv.get( target, "click" ) || 5591 nodeName( target, "a" ); 5592 } 5593 }, 5594 5595 beforeunload: { 5596 postDispatch: function( event ) { 5597 5598 // Support: Firefox 20+ 5599 // Firefox doesn't alert if the returnValue field is not set. 5600 if ( event.result !== undefined && event.originalEvent ) { 5601 event.originalEvent.returnValue = event.result; 5602 } 5603 } 5604 } 5605 } 5606 }; 5607 5608// Ensure the presence of an event listener that handles manually-triggered 5609// synthetic events by interrupting progress until reinvoked in response to 5610// *native* events that it fires directly, ensuring that state changes have 5611// already occurred before other listeners are invoked. 5612 function leverageNative( el, type, expectSync ) { 5613 5614 // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add 5615 if ( !expectSync ) { 5616 if ( dataPriv.get( el, type ) === undefined ) { 5617 jQuery.event.add( el, type, returnTrue ); 5618 } 5619 return; 5620 } 5621 5622 // Register the controller as a special universal handler for all event namespaces 5623 dataPriv.set( el, type, false ); 5624 jQuery.event.add( el, type, { 5625 namespace: false, 5626 handler: function( event ) { 5627 var notAsync, result, 5628 saved = dataPriv.get( this, type ); 5629 5630 if ( ( event.isTrigger & 1 ) && this[ type ] ) { 5631 5632 // Interrupt processing of the outer synthetic .trigger()ed event 5633 // Saved data should be false in such cases, but might be a leftover capture object 5634 // from an async native handler (gh-4350) 5635 if ( !saved.length ) { 5636 5637 // Store arguments for use when handling the inner native event 5638 // There will always be at least one argument (an event object), so this array 5639 // will not be confused with a leftover capture object. 5640 saved = slice.call( arguments ); 5641 dataPriv.set( this, type, saved ); 5642 5643 // Trigger the native event and capture its result 5644 // Support: IE <=9 - 11+ 5645 // focus() and blur() are asynchronous 5646 notAsync = expectSync( this, type ); 5647 this[ type ](); 5648 result = dataPriv.get( this, type ); 5649 if ( saved !== result || notAsync ) { 5650 dataPriv.set( this, type, false ); 5651 } else { 5652 result = {}; 5653 } 5654 if ( saved !== result ) { 5655 5656 // Cancel the outer synthetic event 5657 event.stopImmediatePropagation(); 5658 event.preventDefault(); 5659 return result.value; 5660 } 5661 5662 // If this is an inner synthetic event for an event with a bubbling surrogate 5663 // (focus or blur), assume that the surrogate already propagated from triggering the 5664 // native event and prevent that from happening again here. 5665 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 5666 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 5667 // less bad than duplication. 5668 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { 5669 event.stopPropagation(); 5670 } 5671 5672 // If this is a native event triggered above, everything is now in order 5673 // Fire an inner synthetic event with the original arguments 5674 } else if ( saved.length ) { 5675 5676 // ...and capture the result 5677 dataPriv.set( this, type, { 5678 value: jQuery.event.trigger( 5679
vendor: 5,702 bytes, lines 5680-5866
5680 // Support: IE <=9 - 11+ 5681 // Extend with the prototype to reset the above stopImmediatePropagation() 5682 jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), 5683 saved.slice( 1 ), 5684 this 5685 ) 5686 } ); 5687 5688 // Abort handling of the native event 5689 event.stopImmediatePropagation(); 5690 } 5691 } 5692 } ); 5693 } 5694 5695 jQuery.removeEvent = function( elem, type, handle ) { 5696 5697 // This "if" is needed for plain objects 5698 if ( elem.removeEventListener ) { 5699 elem.removeEventListener( type, handle ); 5700 } 5701 }; 5702 5703 jQuery.Event = function( src, props ) { 5704 5705 // Allow instantiation without the 'new' keyword 5706 if ( !( this instanceof jQuery.Event ) ) { 5707 return new jQuery.Event( src, props ); 5708 } 5709 5710 // Event object 5711 if ( src && src.type ) { 5712 this.originalEvent = src; 5713 this.type = src.type; 5714 5715 // Events bubbling up the document may have been marked as prevented 5716 // by a handler lower down the tree; reflect the correct value. 5717 this.isDefaultPrevented = src.defaultPrevented || 5718 src.defaultPrevented === undefined && 5719 5720 // Support: Android <=2.3 only 5721 src.returnValue === false ? 5722 returnTrue : 5723 returnFalse; 5724 5725 // Create target properties 5726 // Support: Safari <=6 - 7 only 5727 // Target should not be a text node (#504, #13143) 5728 this.target = ( src.target && src.target.nodeType === 3 ) ? 5729 src.target.parentNode : 5730 src.target; 5731 5732 this.currentTarget = src.currentTarget; 5733 this.relatedTarget = src.relatedTarget; 5734 5735 // Event type 5736 } else { 5737 this.type = src; 5738 } 5739 5740 // Put explicitly provided properties onto the event object 5741 if ( props ) { 5742 jQuery.extend( this, props ); 5743 } 5744 5745 // Create a timestamp if incoming event doesn't have one 5746 this.timeStamp = src && src.timeStamp || Date.now(); 5747 5748 // Mark it as fixed 5749 this[ jQuery.expando ] = true; 5750 }; 5751 5752// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 5753// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 5754 jQuery.Event.prototype = { 5755 constructor: jQuery.Event, 5756 isDefaultPrevented: returnFalse, 5757 isPropagationStopped: returnFalse, 5758 isImmediatePropagationStopped: returnFalse, 5759 isSimulated: false, 5760 5761 preventDefault: function() { 5762 var e = this.originalEvent; 5763 5764 this.isDefaultPrevented = returnTrue; 5765 5766 if ( e && !this.isSimulated ) { 5767 e.preventDefault(); 5768 } 5769 }, 5770 stopPropagation: function() { 5771 var e = this.originalEvent; 5772 5773 this.isPropagationStopped = returnTrue; 5774 5775 if ( e && !this.isSimulated ) { 5776 e.stopPropagation(); 5777 } 5778 }, 5779 stopImmediatePropagation: function() { 5780 var e = this.originalEvent; 5781 5782 this.isImmediatePropagationStopped = returnTrue; 5783 5784 if ( e && !this.isSimulated ) { 5785 e.stopImmediatePropagation(); 5786 } 5787 5788 this.stopPropagation(); 5789 } 5790 }; 5791 5792// Includes all common event props including KeyEvent and MouseEvent specific props 5793 jQuery.each( { 5794 altKey: true, 5795 bubbles: true, 5796 cancelable: true, 5797 changedTouches: true, 5798 ctrlKey: true, 5799 detail: true, 5800 eventPhase: true, 5801 metaKey: true, 5802 pageX: true, 5803 pageY: true, 5804 shiftKey: true, 5805 view: true, 5806 "char": true, 5807 code: true, 5808 charCode: true, 5809 key: true, 5810 keyCode: true, 5811 button: true, 5812 buttons: true, 5813 clientX: true, 5814 clientY: true, 5815 offsetX: true, 5816 offsetY: true, 5817 pointerId: true, 5818 pointerType: true, 5819 screenX: true, 5820 screenY: true, 5821 targetTouches: true, 5822 toElement: true, 5823 touches: true, 5824 5825 which: function( event ) { 5826 var button = event.button; 5827 5828 // Add which for key events 5829 if ( event.which == null && rkeyEvent.test( event.type ) ) { 5830 return event.charCode != null ? event.charCode : event.keyCode; 5831 } 5832 5833 // Add which for click: 1 === left; 2 === middle; 3 === right 5834 if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { 5835 if ( button & 1 ) { 5836 return 1; 5837 } 5838 5839 if ( button & 2 ) { 5840 return 3; 5841 } 5842 5843 if ( button & 4 ) { 5844 return 2; 5845 } 5846 5847 return 0; 5848 } 5849 5850 return event.which; 5851 } 5852 }, jQuery.event.addProp ); 5853 5854 jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { 5855 jQuery.event.special[ type ] = { 5856 5857 // Utilize native event if possible so blur/focus sequence is correct 5858 setup: function() { 5859 5860 // Claim the first handler 5861 // dataPriv.set( this, "focus", ... ) 5862 // dataPriv.set( this, "blur", ... ) 5863 leverageNative( this, type, expectSync ); 5864 5865 // Return false to allow normal processing in the caller 5866 return false;
vendor: 4,646 bytes, lines 5867-6003
5867 }, 5868 trigger: function() { 5869 5870 // Force setup before trigger 5871 leverageNative( this, type ); 5872 5873 // Return non-false to allow normal event-path propagation 5874 return true; 5875 }, 5876 5877 delegateType: delegateType 5878 }; 5879 } ); 5880 5881// Create mouseenter/leave events using mouseover/out and event-time checks 5882// so that event delegation works in jQuery. 5883// Do the same for pointerenter/pointerleave and pointerover/pointerout 5884// 5885// Support: Safari 7 only 5886// Safari sends mouseenter too often; see: 5887// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 5888// for the description of the bug (it existed in older Chrome versions as well). 5889 jQuery.each( { 5890 mouseenter: "mouseover", 5891 mouseleave: "mouseout", 5892 pointerenter: "pointerover", 5893 pointerleave: "pointerout" 5894 }, function( orig, fix ) { 5895 jQuery.event.special[ orig ] = { 5896 delegateType: fix, 5897 bindType: fix, 5898 5899 handle: function( event ) { 5900 var ret, 5901 target = this, 5902 related = event.relatedTarget, 5903 handleObj = event.handleObj; 5904 5905 // For mouseenter/leave call the handler if related is outside the target. 5906 // NB: No relatedTarget if the mouse left/entered the browser window 5907 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 5908 event.type = handleObj.origType; 5909 ret = handleObj.handler.apply( this, arguments ); 5910 event.type = fix; 5911 } 5912 return ret; 5913 } 5914 }; 5915 } ); 5916 5917 jQuery.fn.extend( { 5918 5919 on: function( types, selector, data, fn ) { 5920 return on( this, types, selector, data, fn ); 5921 }, 5922 one: function( types, selector, data, fn ) { 5923 return on( this, types, selector, data, fn, 1 ); 5924 }, 5925 off: function( types, selector, fn ) { 5926 var handleObj, type; 5927 if ( types && types.preventDefault && types.handleObj ) { 5928 5929 // ( event ) dispatched jQuery.Event 5930 handleObj = types.handleObj; 5931 jQuery( types.delegateTarget ).off( 5932 handleObj.namespace ? 5933 handleObj.origType + "." + handleObj.namespace : 5934 handleObj.origType, 5935 handleObj.selector, 5936 handleObj.handler 5937 ); 5938 return this; 5939 } 5940 if ( typeof types === "object" ) { 5941 5942 // ( types-object [, selector] ) 5943 for ( type in types ) { 5944 this.off( type, selector, types[ type ] ); 5945 } 5946 return this; 5947 } 5948 if ( selector === false || typeof selector === "function" ) { 5949 5950 // ( types [, fn] ) 5951 fn = selector; 5952 selector = undefined; 5953 } 5954 if ( fn === false ) { 5955 fn = returnFalse; 5956 } 5957 return this.each( function() { 5958 jQuery.event.remove( this, types, fn, selector ); 5959 } ); 5960 } 5961 } ); 5962 5963 5964 var 5965 5966 // Support: IE <=10 - 11, Edge 12 - 13 only 5967 // In IE/Edge using regex groups here causes severe slowdowns. 5968 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 5969 rnoInnerhtml = /<script|<style|<link/i, 5970 5971 // checked="checked" or checked 5972 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5973 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; 5974 5975// Prefer a tbody over its parent table for containing new rows 5976 function manipulationTarget( elem, content ) { 5977 if ( nodeName( elem, "table" ) && 5978 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 5979 5980 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 5981 } 5982 5983 return elem; 5984 } 5985 5986// Replace/restore the type attribute of script elements for safe DOM manipulation 5987 function disableScript( elem ) { 5988 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 5989 return elem; 5990 } 5991 function restoreScript( elem ) { 5992 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 5993 elem.type = elem.type.slice( 5 ); 5994 } else { 5995 elem.removeAttribute( "type" ); 5996 } 5997 5998 return elem; 5999 } 6000 6001 function cloneCopyEvent( src, dest ) { 6002 var i, l, type, pdataOld, udataOld, udataCur, events; 6003
vendor: 8,599 bytes, lines 6004-6232
6004 if ( dest.nodeType !== 1 ) { 6005 return; 6006 } 6007 6008 // 1. Copy private data: events, handlers, etc. 6009 if ( dataPriv.hasData( src ) ) { 6010 pdataOld = dataPriv.get( src ); 6011 events = pdataOld.events; 6012 6013 if ( events ) { 6014 dataPriv.remove( dest, "handle events" ); 6015 6016 for ( type in events ) { 6017 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 6018 jQuery.event.add( dest, type, events[ type ][ i ] ); 6019 } 6020 } 6021 } 6022 } 6023 6024 // 2. Copy user data 6025 if ( dataUser.hasData( src ) ) { 6026 udataOld = dataUser.access( src ); 6027 udataCur = jQuery.extend( {}, udataOld ); 6028 6029 dataUser.set( dest, udataCur ); 6030 } 6031 } 6032 6033// Fix IE bugs, see support tests 6034 function fixInput( src, dest ) { 6035 var nodeName = dest.nodeName.toLowerCase(); 6036 6037 // Fails to persist the checked state of a cloned checkbox or radio button. 6038 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 6039 dest.checked = src.checked; 6040 6041 // Fails to return the selected option to the default selected state when cloning options 6042 } else if ( nodeName === "input" || nodeName === "textarea" ) { 6043 dest.defaultValue = src.defaultValue; 6044 } 6045 } 6046 6047 function domManip( collection, args, callback, ignored ) { 6048 6049 // Flatten any nested arrays 6050 args = flat( args ); 6051 6052 var fragment, first, scripts, hasScripts, node, doc, 6053 i = 0, 6054 l = collection.length, 6055 iNoClone = l - 1, 6056 value = args[ 0 ], 6057 valueIsFunction = isFunction( value ); 6058 6059 // We can't cloneNode fragments that contain checked, in WebKit 6060 if ( valueIsFunction || 6061 ( l > 1 && typeof value === "string" && 6062 !support.checkClone && rchecked.test( value ) ) ) { 6063 return collection.each( function( index ) { 6064 var self = collection.eq( index ); 6065 if ( valueIsFunction ) { 6066 args[ 0 ] = value.call( this, index, self.html() ); 6067 } 6068 domManip( self, args, callback, ignored ); 6069 } ); 6070 } 6071 6072 if ( l ) { 6073 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 6074 first = fragment.firstChild; 6075 6076 if ( fragment.childNodes.length === 1 ) { 6077 fragment = first; 6078 } 6079 6080 // Require either new content or an interest in ignored elements to invoke the callback 6081 if ( first || ignored ) { 6082 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 6083 hasScripts = scripts.length; 6084 6085 // Use the original fragment for the last item 6086 // instead of the first because it can end up 6087 // being emptied incorrectly in certain situations (#8070). 6088 for ( ; i < l; i++ ) { 6089 node = fragment; 6090 6091 if ( i !== iNoClone ) { 6092 node = jQuery.clone( node, true, true ); 6093 6094 // Keep references to cloned scripts for later restoration 6095 if ( hasScripts ) { 6096 6097 // Support: Android <=4.0 only, PhantomJS 1 only 6098 // push.apply(_, arraylike) throws on ancient WebKit 6099 jQuery.merge( scripts, getAll( node, "script" ) ); 6100 } 6101 } 6102 6103 callback.call( collection[ i ], node, i ); 6104 } 6105 6106 if ( hasScripts ) { 6107 doc = scripts[ scripts.length - 1 ].ownerDocument; 6108 6109 // Reenable scripts 6110 jQuery.map( scripts, restoreScript ); 6111 6112 // Evaluate executable scripts on first document insertion 6113 for ( i = 0; i < hasScripts; i++ ) { 6114 node = scripts[ i ]; 6115 if ( rscriptType.test( node.type || "" ) && 6116 !dataPriv.access( node, "globalEval" ) && 6117 jQuery.contains( doc, node ) ) { 6118 6119 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 6120 6121 // Optional AJAX dependency, but won't run scripts if not present 6122 if ( jQuery._evalUrl && !node.noModule ) { 6123 jQuery._evalUrl( node.src, { 6124 nonce: node.nonce || node.getAttribute( "nonce" ) 6125 }, doc ); 6126 } 6127 } else { 6128 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); 6129 } 6130 } 6131 } 6132 } 6133 } 6134 } 6135 6136 return collection; 6137 } 6138 6139 function remove( elem, selector, keepData ) { 6140 var node, 6141 nodes = selector ? jQuery.filter( selector, elem ) : elem, 6142 i = 0; 6143 6144 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 6145 if ( !keepData && node.nodeType === 1 ) { 6146 jQuery.cleanData( getAll( node ) ); 6147 } 6148 6149 if ( node.parentNode ) { 6150 if ( keepData && isAttached( node ) ) { 6151 setGlobalEval( getAll( node, "script" ) ); 6152 } 6153 node.parentNode.removeChild( node ); 6154 } 6155 } 6156 6157 return elem; 6158 } 6159 6160 jQuery.extend( { 6161 htmlPrefilter: function( html ) { 6162 return html; 6163 }, 6164 6165 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 6166 var i, l, srcElements, destElements, 6167 clone = elem.cloneNode( true ), 6168 inPage = isAttached( elem ); 6169 6170 // Fix IE cloning issues 6171 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 6172 !jQuery.isXMLDoc( elem ) ) { 6173 6174 // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 6175 destElements = getAll( clone ); 6176 srcElements = getAll( elem ); 6177 6178 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6179 fixInput( srcElements[ i ], destElements[ i ] ); 6180 } 6181 } 6182 6183 // Copy the events from the original to the clone 6184 if ( dataAndEvents ) { 6185 if ( deepDataAndEvents ) { 6186 srcElements = srcElements || getAll( elem ); 6187 destElements = destElements || getAll( clone ); 6188 6189 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6190 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 6191 } 6192 } else { 6193 cloneCopyEvent( elem, clone ); 6194 } 6195 } 6196 6197 // Preserve script evaluation history 6198 destElements = getAll( clone, "script" ); 6199 if ( destElements.length > 0 ) { 6200 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 6201 } 6202 6203 // Return the cloned set 6204 return clone; 6205 }, 6206 6207 cleanData: function( elems ) { 6208 var data, elem, type, 6209 special = jQuery.event.special, 6210 i = 0; 6211 6212 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 6213 if ( acceptData( elem ) ) { 6214 if ( ( data = elem[ dataPriv.expando ] ) ) { 6215 if ( data.events ) { 6216 for ( type in data.events ) { 6217 if ( special[ type ] ) { 6218 jQuery.event.remove( elem, type ); 6219 6220 // This is a shortcut to avoid jQuery.event.remove's overhead 6221 } else { 6222 jQuery.removeEvent( elem, type, data.handle ); 6223 } 6224 } 6225 } 6226 6227 // Support: Chrome <=35 - 45+ 6228 // Assign undefined instead of using delete, see Data#remove 6229 elem[ dataPriv.expando ] = undefined; 6230 } 6231 if ( elem[ dataUser.expando ] ) { 6232
vendor: 5,129 bytes, lines 6233-6383
6233 // Support: Chrome <=35 - 45+ 6234 // Assign undefined instead of using delete, see Data#remove 6235 elem[ dataUser.expando ] = undefined; 6236 } 6237 } 6238 } 6239 } 6240 } ); 6241 6242 jQuery.fn.extend( { 6243 detach: function( selector ) { 6244 return remove( this, selector, true ); 6245 }, 6246 6247 remove: function( selector ) { 6248 return remove( this, selector ); 6249 }, 6250 6251 text: function( value ) { 6252 return access( this, function( value ) { 6253 return value === undefined ? 6254 jQuery.text( this ) : 6255 this.empty().each( function() { 6256 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6257 this.textContent = value; 6258 } 6259 } ); 6260 }, null, value, arguments.length ); 6261 }, 6262 6263 append: function() { 6264 return domManip( this, arguments, function( elem ) { 6265 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6266 var target = manipulationTarget( this, elem ); 6267 target.appendChild( elem ); 6268 } 6269 } ); 6270 }, 6271 6272 prepend: function() { 6273 return domManip( this, arguments, function( elem ) { 6274 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6275 var target = manipulationTarget( this, elem ); 6276 target.insertBefore( elem, target.firstChild ); 6277 } 6278 } ); 6279 }, 6280 6281 before: function() { 6282 return domManip( this, arguments, function( elem ) { 6283 if ( this.parentNode ) { 6284 this.parentNode.insertBefore( elem, this ); 6285 } 6286 } ); 6287 }, 6288 6289 after: function() { 6290 return domManip( this, arguments, function( elem ) { 6291 if ( this.parentNode ) { 6292 this.parentNode.insertBefore( elem, this.nextSibling ); 6293 } 6294 } ); 6295 }, 6296 6297 empty: function() { 6298 var elem, 6299 i = 0; 6300 6301 for ( ; ( elem = this[ i ] ) != null; i++ ) { 6302 if ( elem.nodeType === 1 ) { 6303 6304 // Prevent memory leaks 6305 jQuery.cleanData( getAll( elem, false ) ); 6306 6307 // Remove any remaining nodes 6308 elem.textContent = ""; 6309 } 6310 } 6311 6312 return this; 6313 }, 6314 6315 clone: function( dataAndEvents, deepDataAndEvents ) { 6316 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 6317 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 6318 6319 return this.map( function() { 6320 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 6321 } ); 6322 }, 6323 6324 html: function( value ) { 6325 return access( this, function( value ) { 6326 var elem = this[ 0 ] || {}, 6327 i = 0, 6328 l = this.length; 6329 6330 if ( value === undefined && elem.nodeType === 1 ) { 6331 return elem.innerHTML; 6332 } 6333 6334 // See if we can take a shortcut and just use innerHTML 6335 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 6336 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 6337 6338 value = jQuery.htmlPrefilter( value ); 6339 6340 try { 6341 for ( ; i < l; i++ ) { 6342 elem = this[ i ] || {}; 6343 6344 // Remove element nodes and prevent memory leaks 6345 if ( elem.nodeType === 1 ) { 6346 jQuery.cleanData( getAll( elem, false ) ); 6347 elem.innerHTML = value; 6348 } 6349 } 6350 6351 elem = 0; 6352 6353 // If using innerHTML throws an exception, use the fallback method 6354 } catch ( e ) {} 6355 } 6356 6357 if ( elem ) { 6358 this.empty().append( value ); 6359 } 6360 }, null, value, arguments.length ); 6361 }, 6362 6363 replaceWith: function() { 6364 var ignored = []; 6365 6366 // Make the changes, replacing each non-ignored context element with the new content 6367 return domManip( this, arguments, function( elem ) { 6368 var parent = this.parentNode; 6369 6370 if ( jQuery.inArray( this, ignored ) < 0 ) { 6371 jQuery.cleanData( getAll( this ) ); 6372 if ( parent ) { 6373 parent.replaceChild( elem, this ); 6374 } 6375 } 6376 6377 // Force callback invocation 6378 }, ignored ); 6379 } 6380 } ); 6381 6382 jQuery.each( { 6383 appendTo: "append",
vendor: 14,475 bytes, lines 6384-6784
6384 prependTo: "prepend", 6385 insertBefore: "before", 6386 insertAfter: "after", 6387 replaceAll: "replaceWith" 6388 }, function( name, original ) { 6389 jQuery.fn[ name ] = function( selector ) { 6390 var elems, 6391 ret = [], 6392 insert = jQuery( selector ), 6393 last = insert.length - 1, 6394 i = 0; 6395 6396 for ( ; i <= last; i++ ) { 6397 elems = i === last ? this : this.clone( true ); 6398 jQuery( insert[ i ] )[ original ]( elems ); 6399 6400 // Support: Android <=4.0 only, PhantomJS 1 only 6401 // .get() because push.apply(_, arraylike) throws on ancient WebKit 6402 push.apply( ret, elems.get() ); 6403 } 6404 6405 return this.pushStack( ret ); 6406 }; 6407 } ); 6408 var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 6409 6410 var getStyles = function( elem ) { 6411 6412 // Support: IE <=11 only, Firefox <=30 (#15098, #14150) 6413 // IE throws on elements created in popups 6414 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 6415 var view = elem.ownerDocument.defaultView; 6416 6417 if ( !view || !view.opener ) { 6418 view = window; 6419 } 6420 6421 return view.getComputedStyle( elem ); 6422 }; 6423 6424 var swap = function( elem, options, callback ) { 6425 var ret, name, 6426 old = {}; 6427 6428 // Remember the old values, and insert the new ones 6429 for ( name in options ) { 6430 old[ name ] = elem.style[ name ]; 6431 elem.style[ name ] = options[ name ]; 6432 } 6433 6434 ret = callback.call( elem ); 6435 6436 // Revert the old values 6437 for ( name in options ) { 6438 elem.style[ name ] = old[ name ]; 6439 } 6440 6441 return ret; 6442 }; 6443 6444 6445 var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 6446 6447 6448 6449 ( function() { 6450 6451 // Executing both pixelPosition & boxSizingReliable tests require only one layout 6452 // so they're executed at the same time to save the second computation. 6453 function computeStyleTests() { 6454 6455 // This is a singleton, we need to execute it only once 6456 if ( !div ) { 6457 return; 6458 } 6459 6460 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + 6461 "margin-top:1px;padding:0;border:0"; 6462 div.style.cssText = 6463 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 6464 "margin:auto;border:1px;padding:1px;" + 6465 "width:60%;top:1%"; 6466 documentElement.appendChild( container ).appendChild( div ); 6467 6468 var divStyle = window.getComputedStyle( div ); 6469 pixelPositionVal = divStyle.top !== "1%"; 6470 6471 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 6472 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 6473 6474 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 6475 // Some styles come back with percentage values, even though they shouldn't 6476 div.style.right = "60%"; 6477 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 6478 6479 // Support: IE 9 - 11 only 6480 // Detect misreporting of content dimensions for box-sizing:border-box elements 6481 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 6482 6483 // Support: IE 9 only 6484 // Detect overflow:scroll screwiness (gh-3699) 6485 // Support: Chrome <=64 6486 // Don't get tricked when zoom affects offsetWidth (gh-4029) 6487 div.style.position = "absolute"; 6488 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; 6489 6490 documentElement.removeChild( container ); 6491 6492 // Nullify the div so it wouldn't be stored in the memory and 6493 // it will also be a sign that checks already performed 6494 div = null; 6495 } 6496 6497 function roundPixelMeasures( measure ) { 6498 return Math.round( parseFloat( measure ) ); 6499 } 6500 6501 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 6502 reliableTrDimensionsVal, reliableMarginLeftVal, 6503 container = document.createElement( "div" ), 6504 div = document.createElement( "div" ); 6505 6506 // Finish early in limited (non-browser) environments 6507 if ( !div.style ) { 6508 return; 6509 } 6510 6511 // Support: IE <=9 - 11 only 6512 // Style of cloned element affects source element cloned (#8908) 6513 div.style.backgroundClip = "content-box"; 6514 div.cloneNode( true ).style.backgroundClip = ""; 6515 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 6516 6517 jQuery.extend( support, { 6518 boxSizingReliable: function() { 6519 computeStyleTests(); 6520 return boxSizingReliableVal; 6521 }, 6522 pixelBoxStyles: function() { 6523 computeStyleTests(); 6524 return pixelBoxStylesVal; 6525 }, 6526 pixelPosition: function() { 6527 computeStyleTests(); 6528 return pixelPositionVal; 6529 }, 6530 reliableMarginLeft: function() { 6531 computeStyleTests(); 6532 return reliableMarginLeftVal; 6533 }, 6534 scrollboxSize: function() { 6535 computeStyleTests(); 6536 return scrollboxSizeVal; 6537 }, 6538 6539 // Support: IE 9 - 11+, Edge 15 - 18+ 6540 // IE/Edge misreport `getComputedStyle` of table rows with width/height 6541 // set in CSS while `offset*` properties report correct values. 6542 // Behavior in IE 9 is more subtle than in newer versions & it passes 6543 // some versions of this test; make sure not to make it pass there! 6544 reliableTrDimensions: function() { 6545 var table, tr, trChild, trStyle; 6546 if ( reliableTrDimensionsVal == null ) { 6547 table = document.createElement( "table" ); 6548 tr = document.createElement( "tr" ); 6549 trChild = document.createElement( "div" ); 6550 6551 table.style.cssText = "position:absolute;left:-11111px"; 6552 tr.style.height = "1px"; 6553 trChild.style.height = "9px"; 6554 6555 documentElement 6556 .appendChild( table ) 6557 .appendChild( tr ) 6558 .appendChild( trChild ); 6559 6560 trStyle = window.getComputedStyle( tr ); 6561 reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; 6562 6563 documentElement.removeChild( table ); 6564 } 6565 return reliableTrDimensionsVal; 6566 } 6567 } ); 6568 } )(); 6569 6570 6571 function curCSS( elem, name, computed ) { 6572 var width, minWidth, maxWidth, ret, 6573 6574 // Support: Firefox 51+ 6575 // Retrieving style before computed somehow 6576 // fixes an issue with getting wrong values 6577 // on detached elements 6578 style = elem.style; 6579 6580 computed = computed || getStyles( elem ); 6581 6582 // getPropertyValue is needed for: 6583 // .css('filter') (IE 9 only, #12537) 6584 // .css('--customProperty) (#3144) 6585 if ( computed ) { 6586 ret = computed.getPropertyValue( name ) || computed[ name ]; 6587 6588 if ( ret === "" && !isAttached( elem ) ) { 6589 ret = jQuery.style( elem, name ); 6590 } 6591 6592 // A tribute to the "awesome hack by Dean Edwards" 6593 // Android Browser returns percentage for some values, 6594 // but width seems to be reliably pixels. 6595 // This is against the CSSOM draft spec: 6596 // https://drafts.csswg.org/cssom/#resolved-values 6597 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 6598 6599 // Remember the original values 6600 width = style.width; 6601 minWidth = style.minWidth; 6602 maxWidth = style.maxWidth; 6603 6604 // Put in the new values to get a computed value out 6605 style.minWidth = style.maxWidth = style.width = ret; 6606 ret = computed.width; 6607 6608 // Revert the changed values 6609 style.width = width; 6610 style.minWidth = minWidth; 6611 style.maxWidth = maxWidth; 6612 } 6613 } 6614 6615 return ret !== undefined ? 6616 6617 // Support: IE <=9 - 11 only 6618 // IE returns zIndex value as an integer. 6619 ret + "" : 6620 ret; 6621 } 6622 6623 6624 function addGetHookIf( conditionFn, hookFn ) { 6625 6626 // Define the hook, we'll check on the first run if it's really needed. 6627 return { 6628 get: function() { 6629 if ( conditionFn() ) { 6630 6631 // Hook not needed (or it's not possible to use it due 6632 // to missing dependency), remove it. 6633 delete this.get; 6634 return; 6635 } 6636 6637 // Hook needed; redefine it so that the support test is not executed again. 6638 return ( this.get = hookFn ).apply( this, arguments ); 6639 } 6640 }; 6641 } 6642 6643 6644 var cssPrefixes = [ "Webkit", "Moz", "ms" ], 6645 emptyStyle = document.createElement( "div" ).style, 6646 vendorProps = {}; 6647 6648// Return a vendor-prefixed property or undefined 6649 function vendorPropName( name ) { 6650 6651 // Check for vendor prefixed names 6652 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 6653 i = cssPrefixes.length; 6654 6655 while ( i-- ) { 6656 name = cssPrefixes[ i ] + capName; 6657 if ( name in emptyStyle ) { 6658 return name; 6659 } 6660 } 6661 } 6662 6663// Return a potentially-mapped jQuery.cssProps or vendor prefixed property 6664 function finalPropName( name ) { 6665 var final = jQuery.cssProps[ name ] || vendorProps[ name ]; 6666 6667 if ( final ) { 6668 return final; 6669 } 6670 if ( name in emptyStyle ) { 6671 return name; 6672 } 6673 return vendorProps[ name ] = vendorPropName( name ) || name; 6674 } 6675 6676 6677 var 6678 6679 // Swappable if display is none or starts with table 6680 // except "table", "table-cell", or "table-caption" 6681 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 6682 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 6683 rcustomProp = /^--/, 6684 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6685 cssNormalTransform = { 6686 letterSpacing: "0", 6687 fontWeight: "400" 6688 }; 6689 6690 function setPositiveNumber( _elem, value, subtract ) { 6691 6692 // Any relative (+/-) values have already been 6693 // normalized at this point 6694 var matches = rcssNum.exec( value ); 6695 return matches ? 6696 6697 // Guard against undefined "subtract", e.g., when used as in cssHooks 6698 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 6699 value; 6700 } 6701 6702 function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 6703 var i = dimension === "width" ? 1 : 0, 6704 extra = 0, 6705 delta = 0; 6706 6707 // Adjustment may not be necessary 6708 if ( box === ( isBorderBox ? "border" : "content" ) ) { 6709 return 0; 6710 } 6711 6712 for ( ; i < 4; i += 2 ) { 6713 6714 // Both box models exclude margin 6715 if ( box === "margin" ) { 6716 delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 6717 } 6718 6719 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 6720 if ( !isBorderBox ) { 6721 6722 // Add padding 6723 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6724 6725 // For "border" or "margin", add border 6726 if ( box !== "padding" ) { 6727 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6728 6729 // But still keep track of it otherwise 6730 } else { 6731 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6732 } 6733 6734 // If we get here with a border-box (content + padding + border), we're seeking "content" or 6735 // "padding" or "margin" 6736 } else { 6737 6738 // For "content", subtract padding 6739 if ( box === "content" ) { 6740 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6741 } 6742 6743 // For "content" or "padding", subtract border 6744 if ( box !== "margin" ) { 6745 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6746 } 6747 } 6748 } 6749 6750 // Account for positive content-box scroll gutter when requested by providing computedVal 6751 if ( !isBorderBox && computedVal >= 0 ) { 6752 6753 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 6754 // Assuming integer scroll gutter, subtract the rest and round down 6755 delta += Math.max( 0, Math.ceil( 6756 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 6757 computedVal - 6758 delta - 6759 extra - 6760 0.5 6761 6762 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 6763 // Use an explicit zero to avoid NaN (gh-3964) 6764 ) ) || 0; 6765 } 6766 6767 return delta; 6768 } 6769 6770 function getWidthOrHeight( elem, dimension, extra ) { 6771 6772 // Start with computed style 6773 var styles = getStyles( elem ), 6774 6775 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 6776 // Fake content-box until we know it's needed to know the true value. 6777 boxSizingNeeded = !support.boxSizingReliable() || extra, 6778 isBorderBox = boxSizingNeeded && 6779 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 6780 valueIsBorderBox = isBorderBox, 6781 6782 val = curCSS( elem, dimension, styles ), 6783 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); 6784
vendor: 6,163 bytes, lines 6785-6944
6785 // Support: Firefox <=54 6786 // Return a confounding non-pixel value or feign ignorance, as appropriate. 6787 if ( rnumnonpx.test( val ) ) { 6788 if ( !extra ) { 6789 return val; 6790 } 6791 val = "auto"; 6792 } 6793 6794 6795 // Support: IE 9 - 11 only 6796 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 6797 // In those cases, the computed value can be trusted to be border-box. 6798 if ( ( !support.boxSizingReliable() && isBorderBox || 6799 6800 // Support: IE 10 - 11+, Edge 15 - 18+ 6801 // IE/Edge misreport `getComputedStyle` of table rows with width/height 6802 // set in CSS while `offset*` properties report correct values. 6803 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 6804 !support.reliableTrDimensions() && nodeName( elem, "tr" ) || 6805 6806 // Fall back to offsetWidth/offsetHeight when value is "auto" 6807 // This happens for inline elements with no explicit setting (gh-3571) 6808 val === "auto" || 6809 6810 // Support: Android <=4.1 - 4.3 only 6811 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 6812 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && 6813 6814 // Make sure the element is visible & connected 6815 elem.getClientRects().length ) { 6816 6817 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 6818 6819 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 6820 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 6821 // retrieved value as a content box dimension. 6822 valueIsBorderBox = offsetProp in elem; 6823 if ( valueIsBorderBox ) { 6824 val = elem[ offsetProp ]; 6825 } 6826 } 6827 6828 // Normalize "" and auto 6829 val = parseFloat( val ) || 0; 6830 6831 // Adjust for the element's box model 6832 return ( val + 6833 boxModelAdjustment( 6834 elem, 6835 dimension, 6836 extra || ( isBorderBox ? "border" : "content" ), 6837 valueIsBorderBox, 6838 styles, 6839 6840 // Provide the current computed size to request scroll gutter calculation (gh-3589) 6841 val 6842 ) 6843 ) + "px"; 6844 } 6845 6846 jQuery.extend( { 6847 6848 // Add in style property hooks for overriding the default 6849 // behavior of getting and setting a style property 6850 cssHooks: { 6851 opacity: { 6852 get: function( elem, computed ) { 6853 if ( computed ) { 6854 6855 // We should always get a number back from opacity 6856 var ret = curCSS( elem, "opacity" ); 6857 return ret === "" ? "1" : ret; 6858 } 6859 } 6860 } 6861 }, 6862 6863 // Don't automatically add "px" to these possibly-unitless properties 6864 cssNumber: { 6865 "animationIterationCount": true, 6866 "columnCount": true, 6867 "fillOpacity": true, 6868 "flexGrow": true, 6869 "flexShrink": true, 6870 "fontWeight": true, 6871 "gridArea": true, 6872 "gridColumn": true, 6873 "gridColumnEnd": true, 6874 "gridColumnStart": true, 6875 "gridRow": true, 6876 "gridRowEnd": true, 6877 "gridRowStart": true, 6878 "lineHeight": true, 6879 "opacity": true, 6880 "order": true, 6881 "orphans": true, 6882 "widows": true, 6883 "zIndex": true, 6884 "zoom": true 6885 }, 6886 6887 // Add in properties whose names you wish to fix before 6888 // setting or getting the value 6889 cssProps: {}, 6890 6891 // Get and set the style property on a DOM Node 6892 style: function( elem, name, value, extra ) { 6893 6894 // Don't set styles on text and comment nodes 6895 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 6896 return; 6897 } 6898 6899 // Make sure that we're working with the right name 6900 var ret, type, hooks, 6901 origName = camelCase( name ), 6902 isCustomProp = rcustomProp.test( name ), 6903 style = elem.style; 6904 6905 // Make sure that we're working with the right name. We don't 6906 // want to query the value if it is a CSS custom property 6907 // since they are user-defined. 6908 if ( !isCustomProp ) { 6909 name = finalPropName( origName ); 6910 } 6911 6912 // Gets hook for the prefixed version, then unprefixed version 6913 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6914 6915 // Check if we're setting a value 6916 if ( value !== undefined ) { 6917 type = typeof value; 6918 6919 // Convert "+=" or "-=" to relative numbers (#7345) 6920 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 6921 value = adjustCSS( elem, name, ret ); 6922 6923 // Fixes bug #9237 6924 type = "number"; 6925 } 6926 6927 // Make sure that null and NaN values aren't set (#7116) 6928 if ( value == null || value !== value ) { 6929 return; 6930 } 6931 6932 // If a number was passed in, add the unit (except for certain CSS properties) 6933 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 6934 // "px" to a few hardcoded values. 6935 if ( type === "number" && !isCustomProp ) { 6936 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 6937 } 6938 6939 // background-* props affect original clone's values 6940 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 6941 style[ name ] = "inherit"; 6942 } 6943 6944 // If a hook was provided, use that value, otherwise just set the specified value
vendor: 15,960 bytes, lines 6945-7389
6945 if ( !hooks || !( "set" in hooks ) || 6946 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 6947 6948 if ( isCustomProp ) { 6949 style.setProperty( name, value ); 6950 } else { 6951 style[ name ] = value; 6952 } 6953 } 6954 6955 } else { 6956 6957 // If a hook was provided get the non-computed value from there 6958 if ( hooks && "get" in hooks && 6959 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 6960 6961 return ret; 6962 } 6963 6964 // Otherwise just get the value from the style object 6965 return style[ name ]; 6966 } 6967 }, 6968 6969 css: function( elem, name, extra, styles ) { 6970 var val, num, hooks, 6971 origName = camelCase( name ), 6972 isCustomProp = rcustomProp.test( name ); 6973 6974 // Make sure that we're working with the right name. We don't 6975 // want to modify the value if it is a CSS custom property 6976 // since they are user-defined. 6977 if ( !isCustomProp ) { 6978 name = finalPropName( origName ); 6979 } 6980 6981 // Try prefixed name followed by the unprefixed name 6982 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6983 6984 // If a hook was provided get the computed value from there 6985 if ( hooks && "get" in hooks ) { 6986 val = hooks.get( elem, true, extra ); 6987 } 6988 6989 // Otherwise, if a way to get the computed value exists, use that 6990 if ( val === undefined ) { 6991 val = curCSS( elem, name, styles ); 6992 } 6993 6994 // Convert "normal" to computed value 6995 if ( val === "normal" && name in cssNormalTransform ) { 6996 val = cssNormalTransform[ name ]; 6997 } 6998 6999 // Make numeric if forced or a qualifier was provided and val looks numeric 7000 if ( extra === "" || extra ) { 7001 num = parseFloat( val ); 7002 return extra === true || isFinite( num ) ? num || 0 : val; 7003 } 7004 7005 return val; 7006 } 7007 } ); 7008 7009 jQuery.each( [ "height", "width" ], function( _i, dimension ) { 7010 jQuery.cssHooks[ dimension ] = { 7011 get: function( elem, computed, extra ) { 7012 if ( computed ) { 7013 7014 // Certain elements can have dimension info if we invisibly show them 7015 // but it must have a current display style that would benefit 7016 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 7017 7018 // Support: Safari 8+ 7019 // Table columns in Safari have non-zero offsetWidth & zero 7020 // getBoundingClientRect().width unless display is changed. 7021 // Support: IE <=11 only 7022 // Running getBoundingClientRect on a disconnected node 7023 // in IE throws an error. 7024 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 7025 swap( elem, cssShow, function() { 7026 return getWidthOrHeight( elem, dimension, extra ); 7027 } ) : 7028 getWidthOrHeight( elem, dimension, extra ); 7029 } 7030 }, 7031 7032 set: function( elem, value, extra ) { 7033 var matches, 7034 styles = getStyles( elem ), 7035 7036 // Only read styles.position if the test has a chance to fail 7037 // to avoid forcing a reflow. 7038 scrollboxSizeBuggy = !support.scrollboxSize() && 7039 styles.position === "absolute", 7040 7041 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 7042 boxSizingNeeded = scrollboxSizeBuggy || extra, 7043 isBorderBox = boxSizingNeeded && 7044 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 7045 subtract = extra ? 7046 boxModelAdjustment( 7047 elem, 7048 dimension, 7049 extra, 7050 isBorderBox, 7051 styles 7052 ) : 7053 0; 7054 7055 // Account for unreliable border-box dimensions by comparing offset* to computed and 7056 // faking a content-box to get border and padding (gh-3699) 7057 if ( isBorderBox && scrollboxSizeBuggy ) { 7058 subtract -= Math.ceil( 7059 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 7060 parseFloat( styles[ dimension ] ) - 7061 boxModelAdjustment( elem, dimension, "border", false, styles ) - 7062 0.5 7063 ); 7064 } 7065 7066 // Convert to pixels if value adjustment is needed 7067 if ( subtract && ( matches = rcssNum.exec( value ) ) && 7068 ( matches[ 3 ] || "px" ) !== "px" ) { 7069 7070 elem.style[ dimension ] = value; 7071 value = jQuery.css( elem, dimension ); 7072 } 7073 7074 return setPositiveNumber( elem, value, subtract ); 7075 } 7076 }; 7077 } ); 7078 7079 jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 7080 function( elem, computed ) { 7081 if ( computed ) { 7082 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 7083 elem.getBoundingClientRect().left - 7084 swap( elem, { marginLeft: 0 }, function() { 7085 return elem.getBoundingClientRect().left; 7086 } ) 7087 ) + "px"; 7088 } 7089 } 7090 ); 7091 7092// These hooks are used by animate to expand properties 7093 jQuery.each( { 7094 margin: "", 7095 padding: "", 7096 border: "Width" 7097 }, function( prefix, suffix ) { 7098 jQuery.cssHooks[ prefix + suffix ] = { 7099 expand: function( value ) { 7100 var i = 0, 7101 expanded = {}, 7102 7103 // Assumes a single number if not a string 7104 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 7105 7106 for ( ; i < 4; i++ ) { 7107 expanded[ prefix + cssExpand[ i ] + suffix ] = 7108 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 7109 } 7110 7111 return expanded; 7112 } 7113 }; 7114 7115 if ( prefix !== "margin" ) { 7116 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 7117 } 7118 } ); 7119 7120 jQuery.fn.extend( { 7121 css: function( name, value ) { 7122 return access( this, function( elem, name, value ) { 7123 var styles, len, 7124 map = {}, 7125 i = 0; 7126 7127 if ( Array.isArray( name ) ) { 7128 styles = getStyles( elem ); 7129 len = name.length; 7130 7131 for ( ; i < len; i++ ) { 7132 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 7133 } 7134 7135 return map; 7136 } 7137 7138 return value !== undefined ? 7139 jQuery.style( elem, name, value ) : 7140 jQuery.css( elem, name ); 7141 }, name, value, arguments.length > 1 ); 7142 } 7143 } ); 7144 7145 7146 function Tween( elem, options, prop, end, easing ) { 7147 return new Tween.prototype.init( elem, options, prop, end, easing ); 7148 } 7149 jQuery.Tween = Tween; 7150 7151 Tween.prototype = { 7152 constructor: Tween, 7153 init: function( elem, options, prop, end, easing, unit ) { 7154 this.elem = elem; 7155 this.prop = prop; 7156 this.easing = easing || jQuery.easing._default; 7157 this.options = options; 7158 this.start = this.now = this.cur(); 7159 this.end = end; 7160 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 7161 }, 7162 cur: function() { 7163 var hooks = Tween.propHooks[ this.prop ]; 7164 7165 return hooks && hooks.get ? 7166 hooks.get( this ) : 7167 Tween.propHooks._default.get( this ); 7168 }, 7169 run: function( percent ) { 7170 var eased, 7171 hooks = Tween.propHooks[ this.prop ]; 7172 7173 if ( this.options.duration ) { 7174 this.pos = eased = jQuery.easing[ this.easing ]( 7175 percent, this.options.duration * percent, 0, 1, this.options.duration 7176 ); 7177 } else { 7178 this.pos = eased = percent; 7179 } 7180 this.now = ( this.end - this.start ) * eased + this.start; 7181 7182 if ( this.options.step ) { 7183 this.options.step.call( this.elem, this.now, this ); 7184 } 7185 7186 if ( hooks && hooks.set ) { 7187 hooks.set( this ); 7188 } else { 7189 Tween.propHooks._default.set( this ); 7190 } 7191 return this; 7192 } 7193 }; 7194 7195 Tween.prototype.init.prototype = Tween.prototype; 7196 7197 Tween.propHooks = { 7198 _default: { 7199 get: function( tween ) { 7200 var result; 7201 7202 // Use a property on the element directly when it is not a DOM element, 7203 // or when there is no matching style property that exists. 7204 if ( tween.elem.nodeType !== 1 || 7205 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 7206 return tween.elem[ tween.prop ]; 7207 } 7208 7209 // Passing an empty string as a 3rd parameter to .css will automatically 7210 // attempt a parseFloat and fallback to a string if the parse fails. 7211 // Simple values such as "10px" are parsed to Float; 7212 // complex values such as "rotate(1rad)" are returned as-is. 7213 result = jQuery.css( tween.elem, tween.prop, "" ); 7214 7215 // Empty strings, null, undefined and "auto" are converted to 0. 7216 return !result || result === "auto" ? 0 : result; 7217 }, 7218 set: function( tween ) { 7219 7220 // Use step hook for back compat. 7221 // Use cssHook if its there. 7222 // Use .style if available and use plain properties where available. 7223 if ( jQuery.fx.step[ tween.prop ] ) { 7224 jQuery.fx.step[ tween.prop ]( tween ); 7225 } else if ( tween.elem.nodeType === 1 && ( 7226 jQuery.cssHooks[ tween.prop ] || 7227 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { 7228 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 7229 } else { 7230 tween.elem[ tween.prop ] = tween.now; 7231 } 7232 } 7233 } 7234 }; 7235 7236// Support: IE <=9 only 7237// Panic based approach to setting things on disconnected nodes 7238 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 7239 set: function( tween ) { 7240 if ( tween.elem.nodeType && tween.elem.parentNode ) { 7241 tween.elem[ tween.prop ] = tween.now; 7242 } 7243 } 7244 }; 7245 7246 jQuery.easing = { 7247 linear: function( p ) { 7248 return p; 7249 }, 7250 swing: function( p ) { 7251 return 0.5 - Math.cos( p * Math.PI ) / 2; 7252 }, 7253 _default: "swing" 7254 }; 7255 7256 jQuery.fx = Tween.prototype.init; 7257 7258// Back compat <1.8 extension point 7259 jQuery.fx.step = {}; 7260 7261 7262 7263 7264 var 7265 fxNow, inProgress, 7266 rfxtypes = /^(?:toggle|show|hide)$/, 7267 rrun = /queueHooks$/; 7268 7269 function schedule() { 7270 if ( inProgress ) { 7271 if ( document.hidden === false && window.requestAnimationFrame ) { 7272 window.requestAnimationFrame( schedule ); 7273 } else { 7274 window.setTimeout( schedule, jQuery.fx.interval ); 7275 } 7276 7277 jQuery.fx.tick(); 7278 } 7279 } 7280 7281// Animations created synchronously will run synchronously 7282 function createFxNow() { 7283 window.setTimeout( function() { 7284 fxNow = undefined; 7285 } ); 7286 return ( fxNow = Date.now() ); 7287 } 7288 7289// Generate parameters to create a standard animation 7290 function genFx( type, includeWidth ) { 7291 var which, 7292 i = 0, 7293 attrs = { height: type }; 7294 7295 // If we include width, step value is 1 to do all cssExpand values, 7296 // otherwise step value is 2 to skip over Left and Right 7297 includeWidth = includeWidth ? 1 : 0; 7298 for ( ; i < 4; i += 2 - includeWidth ) { 7299 which = cssExpand[ i ]; 7300 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 7301 } 7302 7303 if ( includeWidth ) { 7304 attrs.opacity = attrs.width = type; 7305 } 7306 7307 return attrs; 7308 } 7309 7310 function createTween( value, prop, animation ) { 7311 var tween, 7312 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 7313 index = 0, 7314 length = collection.length; 7315 for ( ; index < length; index++ ) { 7316 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 7317 7318 // We're done with this property 7319 return tween; 7320 } 7321 } 7322 } 7323 7324 function defaultPrefilter( elem, props, opts ) { 7325 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 7326 isBox = "width" in props || "height" in props, 7327 anim = this, 7328 orig = {}, 7329 style = elem.style, 7330 hidden = elem.nodeType && isHiddenWithinTree( elem ), 7331 dataShow = dataPriv.get( elem, "fxshow" ); 7332 7333 // Queue-skipping animations hijack the fx hooks 7334 if ( !opts.queue ) { 7335 hooks = jQuery._queueHooks( elem, "fx" ); 7336 if ( hooks.unqueued == null ) { 7337 hooks.unqueued = 0; 7338 oldfire = hooks.empty.fire; 7339 hooks.empty.fire = function() { 7340 if ( !hooks.unqueued ) { 7341 oldfire(); 7342 } 7343 }; 7344 } 7345 hooks.unqueued++; 7346 7347 anim.always( function() { 7348 7349 // Ensure the complete handler is called before this completes 7350 anim.always( function() { 7351 hooks.unqueued--; 7352 if ( !jQuery.queue( elem, "fx" ).length ) { 7353 hooks.empty.fire(); 7354 } 7355 } ); 7356 } ); 7357 } 7358 7359 // Detect show/hide animations 7360 for ( prop in props ) { 7361 value = props[ prop ]; 7362 if ( rfxtypes.test( value ) ) { 7363 delete props[ prop ]; 7364 toggle = toggle || value === "toggle"; 7365 if ( value === ( hidden ? "hide" : "show" ) ) { 7366 7367 // Pretend to be hidden if this is a "show" and 7368 // there is still data from a stopped show/hide 7369 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 7370 hidden = true; 7371 7372 // Ignore all other no-op show/hide data 7373 } else { 7374 continue; 7375 } 7376 } 7377 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 7378 } 7379 } 7380 7381 // Bail out if this is a no-op like .hide().hide() 7382 propTween = !jQuery.isEmptyObject( props ); 7383 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 7384 return; 7385 } 7386 7387 // Restrict "overflow" and "display" styles during box animations 7388 if ( isBox && elem.nodeType === 1 ) { 7389
vendor: 5,766 bytes, lines 7390-7545
7390 // Support: IE <=9 - 11, Edge 12 - 15 7391 // Record all 3 overflow attributes because IE does not infer the shorthand 7392 // from identically-valued overflowX and overflowY and Edge just mirrors 7393 // the overflowX value there. 7394 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 7395 7396 // Identify a display type, preferring old show/hide data over the CSS cascade 7397 restoreDisplay = dataShow && dataShow.display; 7398 if ( restoreDisplay == null ) { 7399 restoreDisplay = dataPriv.get( elem, "display" ); 7400 } 7401 display = jQuery.css( elem, "display" ); 7402 if ( display === "none" ) { 7403 if ( restoreDisplay ) { 7404 display = restoreDisplay; 7405 } else { 7406 7407 // Get nonempty value(s) by temporarily forcing visibility 7408 showHide( [ elem ], true ); 7409 restoreDisplay = elem.style.display || restoreDisplay; 7410 display = jQuery.css( elem, "display" ); 7411 showHide( [ elem ] ); 7412 } 7413 } 7414 7415 // Animate inline elements as inline-block 7416 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 7417 if ( jQuery.css( elem, "float" ) === "none" ) { 7418 7419 // Restore the original display value at the end of pure show/hide animations 7420 if ( !propTween ) { 7421 anim.done( function() { 7422 style.display = restoreDisplay; 7423 } ); 7424 if ( restoreDisplay == null ) { 7425 display = style.display; 7426 restoreDisplay = display === "none" ? "" : display; 7427 } 7428 } 7429 style.display = "inline-block"; 7430 } 7431 } 7432 } 7433 7434 if ( opts.overflow ) { 7435 style.overflow = "hidden"; 7436 anim.always( function() { 7437 style.overflow = opts.overflow[ 0 ]; 7438 style.overflowX = opts.overflow[ 1 ]; 7439 style.overflowY = opts.overflow[ 2 ]; 7440 } ); 7441 } 7442 7443 // Implement show/hide animations 7444 propTween = false; 7445 for ( prop in orig ) { 7446 7447 // General show/hide setup for this element animation 7448 if ( !propTween ) { 7449 if ( dataShow ) { 7450 if ( "hidden" in dataShow ) { 7451 hidden = dataShow.hidden; 7452 } 7453 } else { 7454 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 7455 } 7456 7457 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 7458 if ( toggle ) { 7459 dataShow.hidden = !hidden; 7460 } 7461 7462 // Show elements before animating them 7463 if ( hidden ) { 7464 showHide( [ elem ], true ); 7465 } 7466 7467 /* eslint-disable no-loop-func */ 7468 7469 anim.done( function() { 7470 7471 /* eslint-enable no-loop-func */ 7472 7473 // The final step of a "hide" animation is actually hiding the element 7474 if ( !hidden ) { 7475 showHide( [ elem ] ); 7476 } 7477 dataPriv.remove( elem, "fxshow" ); 7478 for ( prop in orig ) { 7479 jQuery.style( elem, prop, orig[ prop ] ); 7480 } 7481 } ); 7482 } 7483 7484 // Per-property setup 7485 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 7486 if ( !( prop in dataShow ) ) { 7487 dataShow[ prop ] = propTween.start; 7488 if ( hidden ) { 7489 propTween.end = propTween.start; 7490 propTween.start = 0; 7491 } 7492 } 7493 } 7494 } 7495 7496 function propFilter( props, specialEasing ) { 7497 var index, name, easing, value, hooks; 7498 7499 // camelCase, specialEasing and expand cssHook pass 7500 for ( index in props ) { 7501 name = camelCase( index ); 7502 easing = specialEasing[ name ]; 7503 value = props[ index ]; 7504 if ( Array.isArray( value ) ) { 7505 easing = value[ 1 ]; 7506 value = props[ index ] = value[ 0 ]; 7507 } 7508 7509 if ( index !== name ) { 7510 props[ name ] = value; 7511 delete props[ index ]; 7512 } 7513 7514 hooks = jQuery.cssHooks[ name ]; 7515 if ( hooks && "expand" in hooks ) { 7516 value = hooks.expand( value ); 7517 delete props[ name ]; 7518 7519 // Not quite $.extend, this won't overwrite existing keys. 7520 // Reusing 'index' because we have the correct "name" 7521 for ( index in value ) { 7522 if ( !( index in props ) ) { 7523 props[ index ] = value[ index ]; 7524 specialEasing[ index ] = easing; 7525 } 7526 } 7527 } else { 7528 specialEasing[ name ] = easing; 7529 } 7530 } 7531 } 7532 7533 function Animation( elem, properties, options ) { 7534 var result, 7535 stopped, 7536 index = 0, 7537 length = Animation.prefilters.length, 7538 deferred = jQuery.Deferred().always( function() { 7539 7540 // Don't match elem in the :animated selector 7541 delete tick.elem; 7542 } ), 7543 tick = function() { 7544 if ( stopped ) { 7545 return false;
vendor: 20,459 bytes, lines 7546-8161
7546 } 7547 var currentTime = fxNow || createFxNow(), 7548 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 7549 7550 // Support: Android 2.3 only 7551 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) 7552 temp = remaining / animation.duration || 0, 7553 percent = 1 - temp, 7554 index = 0, 7555 length = animation.tweens.length; 7556 7557 for ( ; index < length; index++ ) { 7558 animation.tweens[ index ].run( percent ); 7559 } 7560 7561 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 7562 7563 // If there's more to do, yield 7564 if ( percent < 1 && length ) { 7565 return remaining; 7566 } 7567 7568 // If this was an empty animation, synthesize a final progress notification 7569 if ( !length ) { 7570 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7571 } 7572 7573 // Resolve the animation and report its conclusion 7574 deferred.resolveWith( elem, [ animation ] ); 7575 return false; 7576 }, 7577 animation = deferred.promise( { 7578 elem: elem, 7579 props: jQuery.extend( {}, properties ), 7580 opts: jQuery.extend( true, { 7581 specialEasing: {}, 7582 easing: jQuery.easing._default 7583 }, options ), 7584 originalProperties: properties, 7585 originalOptions: options, 7586 startTime: fxNow || createFxNow(), 7587 duration: options.duration, 7588 tweens: [], 7589 createTween: function( prop, end ) { 7590 var tween = jQuery.Tween( elem, animation.opts, prop, end, 7591 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 7592 animation.tweens.push( tween ); 7593 return tween; 7594 }, 7595 stop: function( gotoEnd ) { 7596 var index = 0, 7597 7598 // If we are going to the end, we want to run all the tweens 7599 // otherwise we skip this part 7600 length = gotoEnd ? animation.tweens.length : 0; 7601 if ( stopped ) { 7602 return this; 7603 } 7604 stopped = true; 7605 for ( ; index < length; index++ ) { 7606 animation.tweens[ index ].run( 1 ); 7607 } 7608 7609 // Resolve when we played the last frame; otherwise, reject 7610 if ( gotoEnd ) { 7611 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7612 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 7613 } else { 7614 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 7615 } 7616 return this; 7617 } 7618 } ), 7619 props = animation.props; 7620 7621 propFilter( props, animation.opts.specialEasing ); 7622 7623 for ( ; index < length; index++ ) { 7624 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 7625 if ( result ) { 7626 if ( isFunction( result.stop ) ) { 7627 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 7628 result.stop.bind( result ); 7629 } 7630 return result; 7631 } 7632 } 7633 7634 jQuery.map( props, createTween, animation ); 7635 7636 if ( isFunction( animation.opts.start ) ) { 7637 animation.opts.start.call( elem, animation ); 7638 } 7639 7640 // Attach callbacks from options 7641 animation 7642 .progress( animation.opts.progress ) 7643 .done( animation.opts.done, animation.opts.complete ) 7644 .fail( animation.opts.fail ) 7645 .always( animation.opts.always ); 7646 7647 jQuery.fx.timer( 7648 jQuery.extend( tick, { 7649 elem: elem, 7650 anim: animation, 7651 queue: animation.opts.queue 7652 } ) 7653 ); 7654 7655 return animation; 7656 } 7657 7658 jQuery.Animation = jQuery.extend( Animation, { 7659 7660 tweeners: { 7661 "*": [ function( prop, value ) { 7662 var tween = this.createTween( prop, value ); 7663 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 7664 return tween; 7665 } ] 7666 }, 7667 7668 tweener: function( props, callback ) { 7669 if ( isFunction( props ) ) { 7670 callback = props; 7671 props = [ "*" ]; 7672 } else { 7673 props = props.match( rnothtmlwhite ); 7674 } 7675 7676 var prop, 7677 index = 0, 7678 length = props.length; 7679 7680 for ( ; index < length; index++ ) { 7681 prop = props[ index ]; 7682 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 7683 Animation.tweeners[ prop ].unshift( callback ); 7684 } 7685 }, 7686 7687 prefilters: [ defaultPrefilter ], 7688 7689 prefilter: function( callback, prepend ) { 7690 if ( prepend ) { 7691 Animation.prefilters.unshift( callback ); 7692 } else { 7693 Animation.prefilters.push( callback ); 7694 } 7695 } 7696 } ); 7697 7698 jQuery.speed = function( speed, easing, fn ) { 7699 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 7700 complete: fn || !fn && easing || 7701 isFunction( speed ) && speed, 7702 duration: speed, 7703 easing: fn && easing || easing && !isFunction( easing ) && easing 7704 }; 7705 7706 // Go to the end state if fx are off 7707 if ( jQuery.fx.off ) { 7708 opt.duration = 0; 7709 7710 } else { 7711 if ( typeof opt.duration !== "number" ) { 7712 if ( opt.duration in jQuery.fx.speeds ) { 7713 opt.duration = jQuery.fx.speeds[ opt.duration ]; 7714 7715 } else { 7716 opt.duration = jQuery.fx.speeds._default; 7717 } 7718 } 7719 } 7720 7721 // Normalize opt.queue - true/undefined/null -> "fx" 7722 if ( opt.queue == null || opt.queue === true ) { 7723 opt.queue = "fx"; 7724 } 7725 7726 // Queueing 7727 opt.old = opt.complete; 7728 7729 opt.complete = function() { 7730 if ( isFunction( opt.old ) ) { 7731 opt.old.call( this ); 7732 } 7733 7734 if ( opt.queue ) { 7735 jQuery.dequeue( this, opt.queue ); 7736 } 7737 }; 7738 7739 return opt; 7740 }; 7741 7742 jQuery.fn.extend( { 7743 fadeTo: function( speed, to, easing, callback ) { 7744 7745 // Show any hidden elements after setting opacity to 0 7746 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 7747 7748 // Animate to the value specified 7749 .end().animate( { opacity: to }, speed, easing, callback ); 7750 }, 7751 animate: function( prop, speed, easing, callback ) { 7752 var empty = jQuery.isEmptyObject( prop ), 7753 optall = jQuery.speed( speed, easing, callback ), 7754 doAnimation = function() { 7755 7756 // Operate on a copy of prop so per-property easing won't be lost 7757 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 7758 7759 // Empty animations, or finishing resolves immediately 7760 if ( empty || dataPriv.get( this, "finish" ) ) { 7761 anim.stop( true ); 7762 } 7763 }; 7764 doAnimation.finish = doAnimation; 7765 7766 return empty || optall.queue === false ? 7767 this.each( doAnimation ) : 7768 this.queue( optall.queue, doAnimation ); 7769 }, 7770 stop: function( type, clearQueue, gotoEnd ) { 7771 var stopQueue = function( hooks ) { 7772 var stop = hooks.stop; 7773 delete hooks.stop; 7774 stop( gotoEnd ); 7775 }; 7776 7777 if ( typeof type !== "string" ) { 7778 gotoEnd = clearQueue; 7779 clearQueue = type; 7780 type = undefined; 7781 } 7782 if ( clearQueue ) { 7783 this.queue( type || "fx", [] ); 7784 } 7785 7786 return this.each( function() { 7787 var dequeue = true, 7788 index = type != null && type + "queueHooks", 7789 timers = jQuery.timers, 7790 data = dataPriv.get( this ); 7791 7792 if ( index ) { 7793 if ( data[ index ] && data[ index ].stop ) { 7794 stopQueue( data[ index ] ); 7795 } 7796 } else { 7797 for ( index in data ) { 7798 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 7799 stopQueue( data[ index ] ); 7800 } 7801 } 7802 } 7803 7804 for ( index = timers.length; index--; ) { 7805 if ( timers[ index ].elem === this && 7806 ( type == null || timers[ index ].queue === type ) ) { 7807 7808 timers[ index ].anim.stop( gotoEnd ); 7809 dequeue = false; 7810 timers.splice( index, 1 ); 7811 } 7812 } 7813 7814 // Start the next in the queue if the last step wasn't forced. 7815 // Timers currently will call their complete callbacks, which 7816 // will dequeue but only if they were gotoEnd. 7817 if ( dequeue || !gotoEnd ) { 7818 jQuery.dequeue( this, type ); 7819 } 7820 } ); 7821 }, 7822 finish: function( type ) { 7823 if ( type !== false ) { 7824 type = type || "fx"; 7825 } 7826 return this.each( function() { 7827 var index, 7828 data = dataPriv.get( this ), 7829 queue = data[ type + "queue" ], 7830 hooks = data[ type + "queueHooks" ], 7831 timers = jQuery.timers, 7832 length = queue ? queue.length : 0; 7833 7834 // Enable finishing flag on private data 7835 data.finish = true; 7836 7837 // Empty the queue first 7838 jQuery.queue( this, type, [] ); 7839 7840 if ( hooks && hooks.stop ) { 7841 hooks.stop.call( this, true ); 7842 } 7843 7844 // Look for any active animations, and finish them 7845 for ( index = timers.length; index--; ) { 7846 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 7847 timers[ index ].anim.stop( true ); 7848 timers.splice( index, 1 ); 7849 } 7850 } 7851 7852 // Look for any animations in the old queue and finish them 7853 for ( index = 0; index < length; index++ ) { 7854 if ( queue[ index ] && queue[ index ].finish ) { 7855 queue[ index ].finish.call( this ); 7856 } 7857 } 7858 7859 // Turn off finishing flag 7860 delete data.finish; 7861 } ); 7862 } 7863 } ); 7864 7865 jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { 7866 var cssFn = jQuery.fn[ name ]; 7867 jQuery.fn[ name ] = function( speed, easing, callback ) { 7868 return speed == null || typeof speed === "boolean" ? 7869 cssFn.apply( this, arguments ) : 7870 this.animate( genFx( name, true ), speed, easing, callback ); 7871 }; 7872 } ); 7873 7874// Generate shortcuts for custom animations 7875 jQuery.each( { 7876 slideDown: genFx( "show" ), 7877 slideUp: genFx( "hide" ), 7878 slideToggle: genFx( "toggle" ), 7879 fadeIn: { opacity: "show" }, 7880 fadeOut: { opacity: "hide" }, 7881 fadeToggle: { opacity: "toggle" } 7882 }, function( name, props ) { 7883 jQuery.fn[ name ] = function( speed, easing, callback ) { 7884 return this.animate( props, speed, easing, callback ); 7885 }; 7886 } ); 7887 7888 jQuery.timers = []; 7889 jQuery.fx.tick = function() { 7890 var timer, 7891 i = 0, 7892 timers = jQuery.timers; 7893 7894 fxNow = Date.now(); 7895 7896 for ( ; i < timers.length; i++ ) { 7897 timer = timers[ i ]; 7898 7899 // Run the timer and safely remove it when done (allowing for external removal) 7900 if ( !timer() && timers[ i ] === timer ) { 7901 timers.splice( i--, 1 ); 7902 } 7903 } 7904 7905 if ( !timers.length ) { 7906 jQuery.fx.stop(); 7907 } 7908 fxNow = undefined; 7909 }; 7910 7911 jQuery.fx.timer = function( timer ) { 7912 jQuery.timers.push( timer ); 7913 jQuery.fx.start(); 7914 }; 7915 7916 jQuery.fx.interval = 13; 7917 jQuery.fx.start = function() { 7918 if ( inProgress ) { 7919 return; 7920 } 7921 7922 inProgress = true; 7923 schedule(); 7924 }; 7925 7926 jQuery.fx.stop = function() { 7927 inProgress = null; 7928 }; 7929 7930 jQuery.fx.speeds = { 7931 slow: 600, 7932 fast: 200, 7933 7934 // Default speed 7935 _default: 400 7936 }; 7937 7938 7939// Based off of the plugin by Clint Helfers, with permission. 7940// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ 7941 jQuery.fn.delay = function( time, type ) { 7942 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 7943 type = type || "fx"; 7944 7945 return this.queue( type, function( next, hooks ) { 7946 var timeout = window.setTimeout( next, time ); 7947 hooks.stop = function() { 7948 window.clearTimeout( timeout ); 7949 }; 7950 } ); 7951 }; 7952 7953 7954 ( function() { 7955 var input = document.createElement( "input" ), 7956 select = document.createElement( "select" ), 7957 opt = select.appendChild( document.createElement( "option" ) ); 7958 7959 input.type = "checkbox"; 7960 7961 // Support: Android <=4.3 only 7962 // Default value for a checkbox should be "on" 7963 support.checkOn = input.value !== ""; 7964 7965 // Support: IE <=11 only 7966 // Must access selectedIndex to make default options select 7967 support.optSelected = opt.selected; 7968 7969 // Support: IE <=11 only 7970 // An input loses its value after becoming a radio 7971 input = document.createElement( "input" ); 7972 input.value = "t"; 7973 input.type = "radio"; 7974 support.radioValue = input.value === "t"; 7975 } )(); 7976 7977 7978 var boolHook, 7979 attrHandle = jQuery.expr.attrHandle; 7980 7981 jQuery.fn.extend( { 7982 attr: function( name, value ) { 7983 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 7984 }, 7985 7986 removeAttr: function( name ) { 7987 return this.each( function() { 7988 jQuery.removeAttr( this, name ); 7989 } ); 7990 } 7991 } ); 7992 7993 jQuery.extend( { 7994 attr: function( elem, name, value ) { 7995 var ret, hooks, 7996 nType = elem.nodeType; 7997 7998 // Don't get/set attributes on text, comment and attribute nodes 7999 if ( nType === 3 || nType === 8 || nType === 2 ) { 8000 return; 8001 } 8002 8003 // Fallback to prop when attributes are not supported 8004 if ( typeof elem.getAttribute === "undefined" ) { 8005 return jQuery.prop( elem, name, value ); 8006 } 8007 8008 // Attribute hooks are determined by the lowercase version 8009 // Grab necessary hook if one is defined 8010 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8011 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 8012 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 8013 } 8014 8015 if ( value !== undefined ) { 8016 if ( value === null ) { 8017 jQuery.removeAttr( elem, name ); 8018 return; 8019 } 8020 8021 if ( hooks && "set" in hooks && 8022 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8023 return ret; 8024 } 8025 8026 elem.setAttribute( name, value + "" ); 8027 return value; 8028 } 8029 8030 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8031 return ret; 8032 } 8033 8034 ret = jQuery.find.attr( elem, name ); 8035 8036 // Non-existent attributes return null, we normalize to undefined 8037 return ret == null ? undefined : ret; 8038 }, 8039 8040 attrHooks: { 8041 type: { 8042 set: function( elem, value ) { 8043 if ( !support.radioValue && value === "radio" && 8044 nodeName( elem, "input" ) ) { 8045 var val = elem.value; 8046 elem.setAttribute( "type", value ); 8047 if ( val ) { 8048 elem.value = val; 8049 } 8050 return value; 8051 } 8052 } 8053 } 8054 }, 8055 8056 removeAttr: function( elem, value ) { 8057 var name, 8058 i = 0, 8059 8060 // Attribute names can contain non-HTML whitespace characters 8061 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 8062 attrNames = value && value.match( rnothtmlwhite ); 8063 8064 if ( attrNames && elem.nodeType === 1 ) { 8065 while ( ( name = attrNames[ i++ ] ) ) { 8066 elem.removeAttribute( name ); 8067 } 8068 } 8069 } 8070 } ); 8071 8072// Hooks for boolean attributes 8073 boolHook = { 8074 set: function( elem, value, name ) { 8075 if ( value === false ) { 8076 8077 // Remove boolean attributes when set to false 8078 jQuery.removeAttr( elem, name ); 8079 } else { 8080 elem.setAttribute( name, name ); 8081 } 8082 return name; 8083 } 8084 }; 8085 8086 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { 8087 var getter = attrHandle[ name ] || jQuery.find.attr; 8088 8089 attrHandle[ name ] = function( elem, name, isXML ) { 8090 var ret, handle, 8091 lowercaseName = name.toLowerCase(); 8092 8093 if ( !isXML ) { 8094 8095 // Avoid an infinite loop by temporarily removing this function from the getter 8096 handle = attrHandle[ lowercaseName ]; 8097 attrHandle[ lowercaseName ] = ret; 8098 ret = getter( elem, name, isXML ) != null ? 8099 lowercaseName : 8100 null; 8101 attrHandle[ lowercaseName ] = handle; 8102 } 8103 return ret; 8104 }; 8105 } ); 8106 8107 8108 8109 8110 var rfocusable = /^(?:input|select|textarea|button)$/i, 8111 rclickable = /^(?:a|area)$/i; 8112 8113 jQuery.fn.extend( { 8114 prop: function( name, value ) { 8115 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 8116 }, 8117 8118 removeProp: function( name ) { 8119 return this.each( function() { 8120 delete this[ jQuery.propFix[ name ] || name ]; 8121 } ); 8122 } 8123 } ); 8124 8125 jQuery.extend( { 8126 prop: function( elem, name, value ) { 8127 var ret, hooks, 8128 nType = elem.nodeType; 8129 8130 // Don't get/set properties on text, comment and attribute nodes 8131 if ( nType === 3 || nType === 8 || nType === 2 ) { 8132 return; 8133 } 8134 8135 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8136 8137 // Fix name and attach hooks 8138 name = jQuery.propFix[ name ] || name; 8139 hooks = jQuery.propHooks[ name ]; 8140 } 8141 8142 if ( value !== undefined ) { 8143 if ( hooks && "set" in hooks && 8144 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8145 return ret; 8146 } 8147 8148 return ( elem[ name ] = value ); 8149 } 8150 8151 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8152 return ret; 8153 } 8154 8155 return elem[ name ]; 8156 }, 8157 8158 propHooks: { 8159 tabIndex: { 8160 get: function( elem ) { 8161
vendor: 16,418 bytes, lines 8162-8650
8162 // Support: IE <=9 - 11 only 8163 // elem.tabIndex doesn't always return the 8164 // correct value when it hasn't been explicitly set 8165 // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 8166 // Use proper attribute retrieval(#12072) 8167 var tabindex = jQuery.find.attr( elem, "tabindex" ); 8168 8169 if ( tabindex ) { 8170 return parseInt( tabindex, 10 ); 8171 } 8172 8173 if ( 8174 rfocusable.test( elem.nodeName ) || 8175 rclickable.test( elem.nodeName ) && 8176 elem.href 8177 ) { 8178 return 0; 8179 } 8180 8181 return -1; 8182 } 8183 } 8184 }, 8185 8186 propFix: { 8187 "for": "htmlFor", 8188 "class": "className" 8189 } 8190 } ); 8191 8192// Support: IE <=11 only 8193// Accessing the selectedIndex property 8194// forces the browser to respect setting selected 8195// on the option 8196// The getter ensures a default option is selected 8197// when in an optgroup 8198// eslint rule "no-unused-expressions" is disabled for this code 8199// since it considers such accessions noop 8200 if ( !support.optSelected ) { 8201 jQuery.propHooks.selected = { 8202 get: function( elem ) { 8203 8204 /* eslint no-unused-expressions: "off" */ 8205 8206 var parent = elem.parentNode; 8207 if ( parent && parent.parentNode ) { 8208 parent.parentNode.selectedIndex; 8209 } 8210 return null; 8211 }, 8212 set: function( elem ) { 8213 8214 /* eslint no-unused-expressions: "off" */ 8215 8216 var parent = elem.parentNode; 8217 if ( parent ) { 8218 parent.selectedIndex; 8219 8220 if ( parent.parentNode ) { 8221 parent.parentNode.selectedIndex; 8222 } 8223 } 8224 } 8225 }; 8226 } 8227 8228 jQuery.each( [ 8229 "tabIndex", 8230 "readOnly", 8231 "maxLength", 8232 "cellSpacing", 8233 "cellPadding", 8234 "rowSpan", 8235 "colSpan", 8236 "useMap", 8237 "frameBorder", 8238 "contentEditable" 8239 ], function() { 8240 jQuery.propFix[ this.toLowerCase() ] = this; 8241 } ); 8242 8243 8244 8245 8246 // Strip and collapse whitespace according to HTML spec 8247 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 8248 function stripAndCollapse( value ) { 8249 var tokens = value.match( rnothtmlwhite ) || []; 8250 return tokens.join( " " ); 8251 } 8252 8253 8254 function getClass( elem ) { 8255 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 8256 } 8257 8258 function classesToArray( value ) { 8259 if ( Array.isArray( value ) ) { 8260 return value; 8261 } 8262 if ( typeof value === "string" ) { 8263 return value.match( rnothtmlwhite ) || []; 8264 } 8265 return []; 8266 } 8267 8268 jQuery.fn.extend( { 8269 addClass: function( value ) { 8270 var classes, elem, cur, curValue, clazz, j, finalValue, 8271 i = 0; 8272 8273 if ( isFunction( value ) ) { 8274 return this.each( function( j ) { 8275 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 8276 } ); 8277 } 8278 8279 classes = classesToArray( value ); 8280 8281 if ( classes.length ) { 8282 while ( ( elem = this[ i++ ] ) ) { 8283 curValue = getClass( elem ); 8284 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8285 8286 if ( cur ) { 8287 j = 0; 8288 while ( ( clazz = classes[ j++ ] ) ) { 8289 if ( cur.indexOf( " " + clazz + " " ) < 0 ) { 8290 cur += clazz + " "; 8291 } 8292 } 8293 8294 // Only assign if different to avoid unneeded rendering. 8295 finalValue = stripAndCollapse( cur ); 8296 if ( curValue !== finalValue ) { 8297 elem.setAttribute( "class", finalValue ); 8298 } 8299 } 8300 } 8301 } 8302 8303 return this; 8304 }, 8305 8306 removeClass: function( value ) { 8307 var classes, elem, cur, curValue, clazz, j, finalValue, 8308 i = 0; 8309 8310 if ( isFunction( value ) ) { 8311 return this.each( function( j ) { 8312 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 8313 } ); 8314 } 8315 8316 if ( !arguments.length ) { 8317 return this.attr( "class", "" ); 8318 } 8319 8320 classes = classesToArray( value ); 8321 8322 if ( classes.length ) { 8323 while ( ( elem = this[ i++ ] ) ) { 8324 curValue = getClass( elem ); 8325 8326 // This expression is here for better compressibility (see addClass) 8327 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8328 8329 if ( cur ) { 8330 j = 0; 8331 while ( ( clazz = classes[ j++ ] ) ) { 8332 8333 // Remove *all* instances 8334 while ( cur.indexOf( " " + clazz + " " ) > -1 ) { 8335 cur = cur.replace( " " + clazz + " ", " " ); 8336 } 8337 } 8338 8339 // Only assign if different to avoid unneeded rendering. 8340 finalValue = stripAndCollapse( cur ); 8341 if ( curValue !== finalValue ) { 8342 elem.setAttribute( "class", finalValue ); 8343 } 8344 } 8345 } 8346 } 8347 8348 return this; 8349 }, 8350 8351 toggleClass: function( value, stateVal ) { 8352 var type = typeof value, 8353 isValidValue = type === "string" || Array.isArray( value ); 8354 8355 if ( typeof stateVal === "boolean" && isValidValue ) { 8356 return stateVal ? this.addClass( value ) : this.removeClass( value ); 8357 } 8358 8359 if ( isFunction( value ) ) { 8360 return this.each( function( i ) { 8361 jQuery( this ).toggleClass( 8362 value.call( this, i, getClass( this ), stateVal ), 8363 stateVal 8364 ); 8365 } ); 8366 } 8367 8368 return this.each( function() { 8369 var className, i, self, classNames; 8370 8371 if ( isValidValue ) { 8372 8373 // Toggle individual class names 8374 i = 0; 8375 self = jQuery( this ); 8376 classNames = classesToArray( value ); 8377 8378 while ( ( className = classNames[ i++ ] ) ) { 8379 8380 // Check each className given, space separated list 8381 if ( self.hasClass( className ) ) { 8382 self.removeClass( className ); 8383 } else { 8384 self.addClass( className ); 8385 } 8386 } 8387 8388 // Toggle whole class name 8389 } else if ( value === undefined || type === "boolean" ) { 8390 className = getClass( this ); 8391 if ( className ) { 8392 8393 // Store className if set 8394 dataPriv.set( this, "__className__", className ); 8395 } 8396 8397 // If the element has a class name or if we're passed `false`, 8398 // then remove the whole classname (if there was one, the above saved it). 8399 // Otherwise bring back whatever was previously saved (if anything), 8400 // falling back to the empty string if nothing was stored. 8401 if ( this.setAttribute ) { 8402 this.setAttribute( "class", 8403 className || value === false ? 8404 "" : 8405 dataPriv.get( this, "__className__" ) || "" 8406 ); 8407 } 8408 } 8409 } ); 8410 }, 8411 8412 hasClass: function( selector ) { 8413 var className, elem, 8414 i = 0; 8415 8416 className = " " + selector + " "; 8417 while ( ( elem = this[ i++ ] ) ) { 8418 if ( elem.nodeType === 1 && 8419 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 8420 return true; 8421 } 8422 } 8423 8424 return false; 8425 } 8426 } ); 8427 8428 8429 8430 8431 var rreturn = /\r/g; 8432 8433 jQuery.fn.extend( { 8434 val: function( value ) { 8435 var hooks, ret, valueIsFunction, 8436 elem = this[ 0 ]; 8437 8438 if ( !arguments.length ) { 8439 if ( elem ) { 8440 hooks = jQuery.valHooks[ elem.type ] || 8441 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 8442 8443 if ( hooks && 8444 "get" in hooks && 8445 ( ret = hooks.get( elem, "value" ) ) !== undefined 8446 ) { 8447 return ret; 8448 } 8449 8450 ret = elem.value; 8451 8452 // Handle most common string cases 8453 if ( typeof ret === "string" ) { 8454 return ret.replace( rreturn, "" ); 8455 } 8456 8457 // Handle cases where value is null/undef or number 8458 return ret == null ? "" : ret; 8459 } 8460 8461 return; 8462 } 8463 8464 valueIsFunction = isFunction( value ); 8465 8466 return this.each( function( i ) { 8467 var val; 8468 8469 if ( this.nodeType !== 1 ) { 8470 return; 8471 } 8472 8473 if ( valueIsFunction ) { 8474 val = value.call( this, i, jQuery( this ).val() ); 8475 } else { 8476 val = value; 8477 } 8478 8479 // Treat null/undefined as ""; convert numbers to string 8480 if ( val == null ) { 8481 val = ""; 8482 8483 } else if ( typeof val === "number" ) { 8484 val += ""; 8485 8486 } else if ( Array.isArray( val ) ) { 8487 val = jQuery.map( val, function( value ) { 8488 return value == null ? "" : value + ""; 8489 } ); 8490 } 8491 8492 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 8493 8494 // If set returns undefined, fall back to normal setting 8495 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 8496 this.value = val; 8497 } 8498 } ); 8499 } 8500 } ); 8501 8502 jQuery.extend( { 8503 valHooks: { 8504 option: { 8505 get: function( elem ) { 8506 8507 var val = jQuery.find.attr( elem, "value" ); 8508 return val != null ? 8509 val : 8510 8511 // Support: IE <=10 - 11 only 8512 // option.text throws exceptions (#14686, #14858) 8513 // Strip and collapse whitespace 8514 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 8515 stripAndCollapse( jQuery.text( elem ) ); 8516 } 8517 }, 8518 select: { 8519 get: function( elem ) { 8520 var value, option, i, 8521 options = elem.options, 8522 index = elem.selectedIndex, 8523 one = elem.type === "select-one", 8524 values = one ? null : [], 8525 max = one ? index + 1 : options.length; 8526 8527 if ( index < 0 ) { 8528 i = max; 8529 8530 } else { 8531 i = one ? index : 0; 8532 } 8533 8534 // Loop through all the selected options 8535 for ( ; i < max; i++ ) { 8536 option = options[ i ]; 8537 8538 // Support: IE <=9 only 8539 // IE8-9 doesn't update selected after form reset (#2551) 8540 if ( ( option.selected || i === index ) && 8541 8542 // Don't return options that are disabled or in a disabled optgroup 8543 !option.disabled && 8544 ( !option.parentNode.disabled || 8545 !nodeName( option.parentNode, "optgroup" ) ) ) { 8546 8547 // Get the specific value for the option 8548 value = jQuery( option ).val(); 8549 8550 // We don't need an array for one selects 8551 if ( one ) { 8552 return value; 8553 } 8554 8555 // Multi-Selects return an array 8556 values.push( value ); 8557 } 8558 } 8559 8560 return values; 8561 }, 8562 8563 set: function( elem, value ) { 8564 var optionSet, option, 8565 options = elem.options, 8566 values = jQuery.makeArray( value ), 8567 i = options.length; 8568 8569 while ( i-- ) { 8570 option = options[ i ]; 8571 8572 /* eslint-disable no-cond-assign */ 8573 8574 if ( option.selected = 8575 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 8576 ) { 8577 optionSet = true; 8578 } 8579 8580 /* eslint-enable no-cond-assign */ 8581 } 8582 8583 // Force browsers to behave consistently when non-matching value is set 8584 if ( !optionSet ) { 8585 elem.selectedIndex = -1; 8586 } 8587 return values; 8588 } 8589 } 8590 } 8591 } ); 8592 8593// Radios and checkboxes getter/setter 8594 jQuery.each( [ "radio", "checkbox" ], function() { 8595 jQuery.valHooks[ this ] = { 8596 set: function( elem, value ) { 8597 if ( Array.isArray( value ) ) { 8598 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 8599 } 8600 } 8601 }; 8602 if ( !support.checkOn ) { 8603 jQuery.valHooks[ this ].get = function( elem ) { 8604 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 8605 }; 8606 } 8607 } ); 8608 8609 8610 8611 8612// Return jQuery for attributes-only inclusion 8613 8614 8615 support.focusin = "onfocusin" in window; 8616 8617 8618 var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 8619 stopPropagationCallback = function( e ) { 8620 e.stopPropagation(); 8621 }; 8622 8623 jQuery.extend( jQuery.event, { 8624 8625 trigger: function( event, data, elem, onlyHandlers ) { 8626 8627 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 8628 eventPath = [ elem || document ], 8629 type = hasOwn.call( event, "type" ) ? event.type : event, 8630 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 8631 8632 cur = lastElement = tmp = elem = elem || document; 8633 8634 // Don't do events on text and comment nodes 8635 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 8636 return; 8637 } 8638 8639 // focus/blur morphs to focusin/out; ensure we're not firing them right now 8640 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 8641 return; 8642 } 8643 8644 if ( type.indexOf( "." ) > -1 ) { 8645 8646 // Namespaced trigger; create a regexp to match event type in handle() 8647 namespaces = type.split( "." ); 8648 type = namespaces.shift(); 8649 namespaces.sort(); 8650 }
vendor: 5,833 bytes, lines 8651-8806
8651 ontype = type.indexOf( ":" ) < 0 && "on" + type; 8652 8653 // Caller can pass in a jQuery.Event object, Object, or just an event type string 8654 event = event[ jQuery.expando ] ? 8655 event : 8656 new jQuery.Event( type, typeof event === "object" && event ); 8657 8658 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 8659 event.isTrigger = onlyHandlers ? 2 : 3; 8660 event.namespace = namespaces.join( "." ); 8661 event.rnamespace = event.namespace ? 8662 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 8663 null; 8664 8665 // Clean up the event in case it is being reused 8666 event.result = undefined; 8667 if ( !event.target ) { 8668 event.target = elem; 8669 } 8670 8671 // Clone any incoming data and prepend the event, creating the handler arg list 8672 data = data == null ? 8673 [ event ] : 8674 jQuery.makeArray( data, [ event ] ); 8675 8676 // Allow special events to draw outside the lines 8677 special = jQuery.event.special[ type ] || {}; 8678 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 8679 return; 8680 } 8681 8682 // Determine event propagation path in advance, per W3C events spec (#9951) 8683 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 8684 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 8685 8686 bubbleType = special.delegateType || type; 8687 if ( !rfocusMorph.test( bubbleType + type ) ) { 8688 cur = cur.parentNode; 8689 } 8690 for ( ; cur; cur = cur.parentNode ) { 8691 eventPath.push( cur ); 8692 tmp = cur; 8693 } 8694 8695 // Only add window if we got to document (e.g., not plain obj or detached DOM) 8696 if ( tmp === ( elem.ownerDocument || document ) ) { 8697 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 8698 } 8699 } 8700 8701 // Fire handlers on the event path 8702 i = 0; 8703 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 8704 lastElement = cur; 8705 event.type = i > 1 ? 8706 bubbleType : 8707 special.bindType || type; 8708 8709 // jQuery handler 8710 handle = ( 8711 dataPriv.get( cur, "events" ) || Object.create( null ) 8712 )[ event.type ] && 8713 dataPriv.get( cur, "handle" ); 8714 if ( handle ) { 8715 handle.apply( cur, data ); 8716 } 8717 8718 // Native handler 8719 handle = ontype && cur[ ontype ]; 8720 if ( handle && handle.apply && acceptData( cur ) ) { 8721 event.result = handle.apply( cur, data ); 8722 if ( event.result === false ) { 8723 event.preventDefault(); 8724 } 8725 } 8726 } 8727 event.type = type; 8728 8729 // If nobody prevented the default action, do it now 8730 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 8731 8732 if ( ( !special._default || 8733 special._default.apply( eventPath.pop(), data ) === false ) && 8734 acceptData( elem ) ) { 8735 8736 // Call a native DOM method on the target with the same name as the event. 8737 // Don't do default actions on window, that's where global variables be (#6170) 8738 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 8739 8740 // Don't re-trigger an onFOO event when we call its FOO() method 8741 tmp = elem[ ontype ]; 8742 8743 if ( tmp ) { 8744 elem[ ontype ] = null; 8745 } 8746 8747 // Prevent re-triggering of the same event, since we already bubbled it above 8748 jQuery.event.triggered = type; 8749 8750 if ( event.isPropagationStopped() ) { 8751 lastElement.addEventListener( type, stopPropagationCallback ); 8752 } 8753 8754 elem[ type ](); 8755 8756 if ( event.isPropagationStopped() ) { 8757 lastElement.removeEventListener( type, stopPropagationCallback ); 8758 } 8759 8760 jQuery.event.triggered = undefined; 8761 8762 if ( tmp ) { 8763 elem[ ontype ] = tmp; 8764 } 8765 } 8766 } 8767 } 8768 8769 return event.result; 8770 }, 8771 8772 // Piggyback on a donor event to simulate a different one 8773 // Used only for `focus(in | out)` events 8774 simulate: function( type, elem, event ) { 8775 var e = jQuery.extend( 8776 new jQuery.Event(), 8777 event, 8778 { 8779 type: type, 8780 isSimulated: true 8781 } 8782 ); 8783 8784 jQuery.event.trigger( e, null, elem ); 8785 } 8786 8787 } ); 8788 8789 jQuery.fn.extend( { 8790 8791 trigger: function( type, data ) { 8792 return this.each( function() { 8793 jQuery.event.trigger( type, data, this ); 8794 } ); 8795 }, 8796 triggerHandler: function( type, data ) { 8797 var elem = this[ 0 ]; 8798 if ( elem ) { 8799 return jQuery.event.trigger( type, data, elem, true ); 8800 } 8801 } 8802 } ); 8803 8804 8805// Support: Firefox <=44 8806// Firefox doesn't have focus(in | out) events
vendor: 5,764 bytes, lines 8807-8978
8807// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 8808// 8809// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 8810// focus(in | out) events fire after focus & blur events, 8811// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 8812// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 8813 if ( !support.focusin ) { 8814 jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { 8815 8816 // Attach a single capturing handler on the document while someone wants focusin/focusout 8817 var handler = function( event ) { 8818 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); 8819 }; 8820 8821 jQuery.event.special[ fix ] = { 8822 setup: function() { 8823 8824 // Handle: regular nodes (via `this.ownerDocument`), window 8825 // (via `this.document`) & document (via `this`). 8826 var doc = this.ownerDocument || this.document || this, 8827 attaches = dataPriv.access( doc, fix ); 8828 8829 if ( !attaches ) { 8830 doc.addEventListener( orig, handler, true ); 8831 } 8832 dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); 8833 }, 8834 teardown: function() { 8835 var doc = this.ownerDocument || this.document || this, 8836 attaches = dataPriv.access( doc, fix ) - 1; 8837 8838 if ( !attaches ) { 8839 doc.removeEventListener( orig, handler, true ); 8840 dataPriv.remove( doc, fix ); 8841 8842 } else { 8843 dataPriv.access( doc, fix, attaches ); 8844 } 8845 } 8846 }; 8847 } ); 8848 } 8849 var location = window.location; 8850 8851 var nonce = { guid: Date.now() }; 8852 8853 var rquery = ( /\?/ ); 8854 8855 8856 8857// Cross-browser xml parsing 8858 jQuery.parseXML = function( data ) { 8859 var xml; 8860 if ( !data || typeof data !== "string" ) { 8861 return null; 8862 } 8863 8864 // Support: IE 9 - 11 only 8865 // IE throws on parseFromString with invalid input. 8866 try { 8867 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 8868 } catch ( e ) { 8869 xml = undefined; 8870 } 8871 8872 if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { 8873 jQuery.error( "Invalid XML: " + data ); 8874 } 8875 return xml; 8876 }; 8877 8878 8879 var 8880 rbracket = /\[\]$/, 8881 rCRLF = /\r?\n/g, 8882 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 8883 rsubmittable = /^(?:input|select|textarea|keygen)/i; 8884 8885 function buildParams( prefix, obj, traditional, add ) { 8886 var name; 8887 8888 if ( Array.isArray( obj ) ) { 8889 8890 // Serialize array item. 8891 jQuery.each( obj, function( i, v ) { 8892 if ( traditional || rbracket.test( prefix ) ) { 8893 8894 // Treat each array item as a scalar. 8895 add( prefix, v ); 8896 8897 } else { 8898 8899 // Item is non-scalar (array or object), encode its numeric index. 8900 buildParams( 8901 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 8902 v, 8903 traditional, 8904 add 8905 ); 8906 } 8907 } ); 8908 8909 } else if ( !traditional && toType( obj ) === "object" ) { 8910 8911 // Serialize object item. 8912 for ( name in obj ) { 8913 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 8914 } 8915 8916 } else { 8917 8918 // Serialize scalar item. 8919 add( prefix, obj ); 8920 } 8921 } 8922 8923// Serialize an array of form elements or a set of 8924// key/values into a query string 8925 jQuery.param = function( a, traditional ) { 8926 var prefix, 8927 s = [], 8928 add = function( key, valueOrFunction ) { 8929 8930 // If value is a function, invoke it and use its return value 8931 var value = isFunction( valueOrFunction ) ? 8932 valueOrFunction() : 8933 valueOrFunction; 8934 8935 s[ s.length ] = encodeURIComponent( key ) + "=" + 8936 encodeURIComponent( value == null ? "" : value ); 8937 }; 8938 8939 if ( a == null ) { 8940 return ""; 8941 } 8942 8943 // If an array was passed in, assume that it is an array of form elements. 8944 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 8945 8946 // Serialize the form elements 8947 jQuery.each( a, function() { 8948 add( this.name, this.value ); 8949 } ); 8950 8951 } else { 8952 8953 // If traditional, encode the "old" way (the way 1.3.2 or older 8954 // did it), otherwise encode params recursively. 8955 for ( prefix in a ) { 8956 buildParams( prefix, a[ prefix ], traditional, add ); 8957 } 8958 } 8959 8960 // Return the resulting serialization 8961 return s.join( "&" ); 8962 }; 8963 8964 jQuery.fn.extend( { 8965 serialize: function() { 8966 return jQuery.param( this.serializeArray() ); 8967 }, 8968 serializeArray: function() { 8969 return this.map( function() { 8970 8971 // Can add propHook for "elements" to filter or add form elements 8972 var elements = jQuery.prop( this, "elements" ); 8973 return elements ? jQuery.makeArray( elements ) : this; 8974 } ) 8975 .filter( function() { 8976 var type = this.type; 8977 8978 // Use .is( ":disabled" ) so that fieldset[disabled] w
vendor: 4,204 bytes, lines 8978-9088
8978orks 8979 return this.name && !jQuery( this ).is( ":disabled" ) && 8980 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 8981 ( this.checked || !rcheckableType.test( type ) ); 8982 } ) 8983 .map( function( _i, elem ) { 8984 var val = jQuery( this ).val(); 8985 8986 if ( val == null ) { 8987 return null; 8988 } 8989 8990 if ( Array.isArray( val ) ) { 8991 return jQuery.map( val, function( val ) { 8992 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 8993 } ); 8994 } 8995 8996 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 8997 } ).get(); 8998 } 8999 } ); 9000 9001 9002 var 9003 r20 = /%20/g, 9004 rhash = /#.*$/, 9005 rantiCache = /([?&])_=[^&]*/, 9006 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 9007 9008 // #7653, #8125, #8152: local protocol detection 9009 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 9010 rnoContent = /^(?:GET|HEAD)$/, 9011 rprotocol = /^\/\//, 9012 9013 /* Prefilters 9014 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 9015 * 2) These are called: 9016 * - BEFORE asking for a transport 9017 * - AFTER param serialization (s.data is a string if s.processData is true) 9018 * 3) key is the dataType 9019 * 4) the catchall symbol "*" can be used 9020 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 9021 */ 9022 prefilters = {}, 9023 9024 /* Transports bindings 9025 * 1) key is the dataType 9026 * 2) the catchall symbol "*" can be used 9027 * 3) selection will start with transport dataType and THEN go to "*" if needed 9028 */ 9029 transports = {}, 9030 9031 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 9032 allTypes = "*/".concat( "*" ), 9033 9034 // Anchor tag for parsing the document origin 9035 originAnchor = document.createElement( "a" ); 9036 originAnchor.href = location.href; 9037 9038// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 9039 function addToPrefiltersOrTransports( structure ) { 9040 9041 // dataTypeExpression is optional and defaults to "*" 9042 return function( dataTypeExpression, func ) { 9043 9044 if ( typeof dataTypeExpression !== "string" ) { 9045 func = dataTypeExpression; 9046 dataTypeExpression = "*"; 9047 } 9048 9049 var dataType, 9050 i = 0, 9051 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 9052 9053 if ( isFunction( func ) ) { 9054 9055 // For each dataType in the dataTypeExpression 9056 while ( ( dataType = dataTypes[ i++ ] ) ) { 9057 9058 // Prepend if requested 9059 if ( dataType[ 0 ] === "+" ) { 9060 dataType = dataType.slice( 1 ) || "*"; 9061 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 9062 9063 // Otherwise append 9064 } else { 9065 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 9066 } 9067 } 9068 } 9069 }; 9070 } 9071 9072// Base inspection function for prefilters and transports 9073 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 9074 9075 var inspected = {}, 9076 seekingTransport = ( structure === transports ); 9077 9078 function inspect( dataType ) { 9079 var selected; 9080 inspected[ dataType ] = true; 9081 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 9082 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 9083 if ( typeof dataTypeOrTransport === "string" && 9084 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 9085 9086 options.dataTypes.unshift( dataTypeOrTransport ); 9087 inspect( dataTypeOrTransport ); 9088 return false;
vendor: 15,305 bytes, lines 9089-9526
9089 } else if ( seekingTransport ) { 9090 return !( selected = dataTypeOrTransport ); 9091 } 9092 } ); 9093 return selected; 9094 } 9095 9096 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 9097 } 9098 9099// A special extend for ajax options 9100// that takes "flat" options (not to be deep extended) 9101// Fixes #9887 9102 function ajaxExtend( target, src ) { 9103 var key, deep, 9104 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 9105 9106 for ( key in src ) { 9107 if ( src[ key ] !== undefined ) { 9108 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 9109 } 9110 } 9111 if ( deep ) { 9112 jQuery.extend( true, target, deep ); 9113 } 9114 9115 return target; 9116 } 9117 9118 /* Handles responses to an ajax request: 9119 * - finds the right dataType (mediates between content-type and expected dataType) 9120 * - returns the corresponding response 9121 */ 9122 function ajaxHandleResponses( s, jqXHR, responses ) { 9123 9124 var ct, type, finalDataType, firstDataType, 9125 contents = s.contents, 9126 dataTypes = s.dataTypes; 9127 9128 // Remove auto dataType and get content-type in the process 9129 while ( dataTypes[ 0 ] === "*" ) { 9130 dataTypes.shift(); 9131 if ( ct === undefined ) { 9132 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 9133 } 9134 } 9135 9136 // Check if we're dealing with a known content-type 9137 if ( ct ) { 9138 for ( type in contents ) { 9139 if ( contents[ type ] && contents[ type ].test( ct ) ) { 9140 dataTypes.unshift( type ); 9141 break; 9142 } 9143 } 9144 } 9145 9146 // Check to see if we have a response for the expected dataType 9147 if ( dataTypes[ 0 ] in responses ) { 9148 finalDataType = dataTypes[ 0 ]; 9149 } else { 9150 9151 // Try convertible dataTypes 9152 for ( type in responses ) { 9153 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 9154 finalDataType = type; 9155 break; 9156 } 9157 if ( !firstDataType ) { 9158 firstDataType = type; 9159 } 9160 } 9161 9162 // Or just use first one 9163 finalDataType = finalDataType || firstDataType; 9164 } 9165 9166 // If we found a dataType 9167 // We add the dataType to the list if needed 9168 // and return the corresponding response 9169 if ( finalDataType ) { 9170 if ( finalDataType !== dataTypes[ 0 ] ) { 9171 dataTypes.unshift( finalDataType ); 9172 } 9173 return responses[ finalDataType ]; 9174 } 9175 } 9176 9177 /* Chain conversions given the request and the original response 9178 * Also sets the responseXXX fields on the jqXHR instance 9179 */ 9180 function ajaxConvert( s, response, jqXHR, isSuccess ) { 9181 var conv2, current, conv, tmp, prev, 9182 converters = {}, 9183 9184 // Work with a copy of dataTypes in case we need to modify it for conversion 9185 dataTypes = s.dataTypes.slice(); 9186 9187 // Create converters map with lowercased keys 9188 if ( dataTypes[ 1 ] ) { 9189 for ( conv in s.converters ) { 9190 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 9191 } 9192 } 9193 9194 current = dataTypes.shift(); 9195 9196 // Convert to each sequential dataType 9197 while ( current ) { 9198 9199 if ( s.responseFields[ current ] ) { 9200 jqXHR[ s.responseFields[ current ] ] = response; 9201 } 9202 9203 // Apply the dataFilter if provided 9204 if ( !prev && isSuccess && s.dataFilter ) { 9205 response = s.dataFilter( response, s.dataType ); 9206 } 9207 9208 prev = current; 9209 current = dataTypes.shift(); 9210 9211 if ( current ) { 9212 9213 // There's only work to do if current dataType is non-auto 9214 if ( current === "*" ) { 9215 9216 current = prev; 9217 9218 // Convert response if prev dataType is non-auto and differs from current 9219 } else if ( prev !== "*" && prev !== current ) { 9220 9221 // Seek a direct converter 9222 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 9223 9224 // If none found, seek a pair 9225 if ( !conv ) { 9226 for ( conv2 in converters ) { 9227 9228 // If conv2 outputs current 9229 tmp = conv2.split( " " ); 9230 if ( tmp[ 1 ] === current ) { 9231 9232 // If prev can be converted to accepted input 9233 conv = converters[ prev + " " + tmp[ 0 ] ] || 9234 converters[ "* " + tmp[ 0 ] ]; 9235 if ( conv ) { 9236 9237 // Condense equivalence converters 9238 if ( conv === true ) { 9239 conv = converters[ conv2 ]; 9240 9241 // Otherwise, insert the intermediate dataType 9242 } else if ( converters[ conv2 ] !== true ) { 9243 current = tmp[ 0 ]; 9244 dataTypes.unshift( tmp[ 1 ] ); 9245 } 9246 break; 9247 } 9248 } 9249 } 9250 } 9251 9252 // Apply converter (if not an equivalence) 9253 if ( conv !== true ) { 9254 9255 // Unless errors are allowed to bubble, catch and return them 9256 if ( conv && s.throws ) { 9257 response = conv( response ); 9258 } else { 9259 try { 9260 response = conv( response ); 9261 } catch ( e ) { 9262 return { 9263 state: "parsererror", 9264 error: conv ? e : "No conversion from " + prev + " to " + current 9265 }; 9266 } 9267 } 9268 } 9269 } 9270 } 9271 } 9272 9273 return { state: "success", data: response }; 9274 } 9275 9276 jQuery.extend( { 9277 9278 // Counter for holding the number of active queries 9279 active: 0, 9280 9281 // Last-Modified header cache for next request 9282 lastModified: {}, 9283 etag: {}, 9284 9285 ajaxSettings: { 9286 url: location.href, 9287 type: "GET", 9288 isLocal: rlocalProtocol.test( location.protocol ), 9289 global: true, 9290 processData: true, 9291 async: true, 9292 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 9293 9294 /* 9295 timeout: 0, 9296 data: null, 9297 dataType: null, 9298 username: null, 9299 password: null, 9300 cache: null, 9301 throws: false, 9302 traditional: false, 9303 headers: {}, 9304 */ 9305 9306 accepts: { 9307 "*": allTypes, 9308 text: "text/plain", 9309 html: "text/html", 9310 xml: "application/xml, text/xml", 9311 json: "application/json, text/javascript" 9312 }, 9313 9314 contents: { 9315 xml: /\bxml\b/, 9316 html: /\bhtml/, 9317 json: /\bjson\b/ 9318 }, 9319 9320 responseFields: { 9321 xml: "responseXML", 9322 text: "responseText", 9323 json: "responseJSON" 9324 }, 9325 9326 // Data converters 9327 // Keys separate source (or catchall "*") and destination types with a single space 9328 converters: { 9329 9330 // Convert anything to text 9331 "* text": String, 9332 9333 // Text to html (true = no transformation) 9334 "text html": true, 9335 9336 // Evaluate text as a json expression 9337 "text json": JSON.parse, 9338 9339 // Parse text as xml 9340 "text xml": jQuery.parseXML 9341 }, 9342 9343 // For options that shouldn't be deep extended: 9344 // you can add your own custom options here if 9345 // and when you create one that shouldn't be 9346 // deep extended (see ajaxExtend) 9347 flatOptions: { 9348 url: true, 9349 context: true 9350 } 9351 }, 9352 9353 // Creates a full fledged settings object into target 9354 // with both ajaxSettings and settings fields. 9355 // If target is omitted, writes into ajaxSettings. 9356 ajaxSetup: function( target, settings ) { 9357 return settings ? 9358 9359 // Building a settings object 9360 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 9361 9362 // Extending ajaxSettings 9363 ajaxExtend( jQuery.ajaxSettings, target ); 9364 }, 9365 9366 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 9367 ajaxTransport: addToPrefiltersOrTransports( transports ), 9368 9369 // Main method 9370 ajax: function( url, options ) { 9371 9372 // If url is an object, simulate pre-1.5 signature 9373 if ( typeof url === "object" ) { 9374 options = url; 9375 url = undefined; 9376 } 9377 9378 // Force options to be an object 9379 options = options || {}; 9380 9381 var transport, 9382 9383 // URL without anti-cache param 9384 cacheURL, 9385 9386 // Response headers 9387 responseHeadersString, 9388 responseHeaders, 9389 9390 // timeout handle 9391 timeoutTimer, 9392 9393 // Url cleanup var 9394 urlAnchor, 9395 9396 // Request state (becomes false upon send and true upon completion) 9397 completed, 9398 9399 // To know if global events are to be dispatched 9400 fireGlobals, 9401 9402 // Loop variable 9403 i, 9404 9405 // uncached part of the url 9406 uncached, 9407 9408 // Create the final options object 9409 s = jQuery.ajaxSetup( {}, options ), 9410 9411 // Callbacks context 9412 callbackContext = s.context || s, 9413 9414 // Context for global events is callbackContext if it is a DOM node or jQuery collection 9415 globalEventContext = s.context && 9416 ( callbackContext.nodeType || callbackContext.jquery ) ? 9417 jQuery( callbackContext ) : 9418 jQuery.event, 9419 9420 // Deferreds 9421 deferred = jQuery.Deferred(), 9422 completeDeferred = jQuery.Callbacks( "once memory" ), 9423 9424 // Status-dependent callbacks 9425 statusCode = s.statusCode || {}, 9426 9427 // Headers (they are sent all at once) 9428 requestHeaders = {}, 9429 requestHeadersNames = {}, 9430 9431 // Default abort message 9432 strAbort = "canceled", 9433 9434 // Fake xhr 9435 jqXHR = { 9436 readyState: 0, 9437 9438 // Builds headers hashtable if needed 9439 getResponseHeader: function( key ) { 9440 var match; 9441 if ( completed ) { 9442 if ( !responseHeaders ) { 9443 responseHeaders = {}; 9444 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 9445 responseHeaders[ match[ 1 ].toLowerCase() + " " ] = 9446 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) 9447 .concat( match[ 2 ] ); 9448 } 9449 } 9450 match = responseHeaders[ key.toLowerCase() + " " ]; 9451 } 9452 return match == null ? null : match.join( ", " ); 9453 }, 9454 9455 // Raw string 9456 getAllResponseHeaders: function() { 9457 return completed ? responseHeadersString : null; 9458 }, 9459 9460 // Caches the header 9461 setRequestHeader: function( name, value ) { 9462 if ( completed == null ) { 9463 name = requestHeadersNames[ name.toLowerCase() ] = 9464 requestHeadersNames[ name.toLowerCase() ] || name; 9465 requestHeaders[ name ] = value; 9466 } 9467 return this; 9468 }, 9469 9470 // Overrides response content-type header 9471 overrideMimeType: function( type ) { 9472 if ( completed == null ) { 9473 s.mimeType = type; 9474 } 9475 return this; 9476 }, 9477 9478 // Status-dependent callbacks 9479 statusCode: function( map ) { 9480 var code; 9481 if ( map ) { 9482 if ( completed ) { 9483 9484 // Execute the appropriate callbacks 9485 jqXHR.always( map[ jqXHR.status ] ); 9486 } else { 9487 9488 // Lazy-add the new callbacks in a way that preserves old ones 9489 for ( code in map ) { 9490 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 9491 } 9492 } 9493 } 9494 return this; 9495 }, 9496 9497 // Cancel the request 9498 abort: function( statusText ) { 9499 var finalText = statusText || strAbort; 9500 if ( transport ) { 9501 transport.abort( finalText ); 9502 } 9503 done( 0, finalText ); 9504 return this; 9505 } 9506 }; 9507 9508 // Attach deferreds 9509 deferred.promise( jqXHR ); 9510 9511 // Add protocol if not provided (prefilters might expect it) 9512 // Handle falsy url in the settings object (#10093: consistency with old signature) 9513 // We also use the url parameter if available 9514 s.url = ( ( url || s.url || location.href ) + "" ) 9515 .replace( rprotocol, location.protocol + "//" ); 9516 9517 // Alias method option to type as per ticket #12004 9518 s.type = options.method || options.type || s.method || s.type; 9519 9520 // Extract dataTypes list 9521 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 9522 9523 // A cross-domain request is in order when the origin doesn't match the current origin. 9524 if ( s.crossDomain == null ) { 9525 urlAnchor = document.createElement( "a" ); 9526
vendor: 32,436 bytes, lines 9527-10424
9527 // Support: IE <=8 - 11, Edge 12 - 15 9528 // IE throws exception on accessing the href property if url is malformed, 9529 // e.g. http://example.com:80x/ 9530 try { 9531 urlAnchor.href = s.url; 9532 9533 // Support: IE <=8 - 11 only 9534 // Anchor's host property isn't correctly set when s.url is relative 9535 urlAnchor.href = urlAnchor.href; 9536 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 9537 urlAnchor.protocol + "//" + urlAnchor.host; 9538 } catch ( e ) { 9539 9540 // If there is an error parsing the URL, assume it is crossDomain, 9541 // it can be rejected by the transport if it is invalid 9542 s.crossDomain = true; 9543 } 9544 } 9545 9546 // Convert data if not already a string 9547 if ( s.data && s.processData && typeof s.data !== "string" ) { 9548 s.data = jQuery.param( s.data, s.traditional ); 9549 } 9550 9551 // Apply prefilters 9552 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 9553 9554 // If request was aborted inside a prefilter, stop there 9555 if ( completed ) { 9556 return jqXHR; 9557 } 9558 9559 // We can fire global events as of now if asked to 9560 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 9561 fireGlobals = jQuery.event && s.global; 9562 9563 // Watch for a new set of requests 9564 if ( fireGlobals && jQuery.active++ === 0 ) { 9565 jQuery.event.trigger( "ajaxStart" ); 9566 } 9567 9568 // Uppercase the type 9569 s.type = s.type.toUpperCase(); 9570 9571 // Determine if request has content 9572 s.hasContent = !rnoContent.test( s.type ); 9573 9574 // Save the URL in case we're toying with the If-Modified-Since 9575 // and/or If-None-Match header later on 9576 // Remove hash to simplify url manipulation 9577 cacheURL = s.url.replace( rhash, "" ); 9578 9579 // More options handling for requests with no content 9580 if ( !s.hasContent ) { 9581 9582 // Remember the hash so we can put it back 9583 uncached = s.url.slice( cacheURL.length ); 9584 9585 // If data is available and should be processed, append data to url 9586 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 9587 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 9588 9589 // #9682: remove data so that it's not used in an eventual retry 9590 delete s.data; 9591 } 9592 9593 // Add or update anti-cache param if needed 9594 if ( s.cache === false ) { 9595 cacheURL = cacheURL.replace( rantiCache, "$1" ); 9596 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + 9597 uncached; 9598 } 9599 9600 // Put hash and anti-cache on the URL that will be requested (gh-1732) 9601 s.url = cacheURL + uncached; 9602 9603 // Change '%20' to '+' if this is encoded form body content (gh-2658) 9604 } else if ( s.data && s.processData && 9605 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 9606 s.data = s.data.replace( r20, "+" ); 9607 } 9608 9609 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9610 if ( s.ifModified ) { 9611 if ( jQuery.lastModified[ cacheURL ] ) { 9612 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 9613 } 9614 if ( jQuery.etag[ cacheURL ] ) { 9615 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 9616 } 9617 } 9618 9619 // Set the correct header, if data is being sent 9620 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 9621 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 9622 } 9623 9624 // Set the Accepts header for the server, depending on the dataType 9625 jqXHR.setRequestHeader( 9626 "Accept", 9627 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 9628 s.accepts[ s.dataTypes[ 0 ] ] + 9629 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 9630 s.accepts[ "*" ] 9631 ); 9632 9633 // Check for headers option 9634 for ( i in s.headers ) { 9635 jqXHR.setRequestHeader( i, s.headers[ i ] ); 9636 } 9637 9638 // Allow custom headers/mimetypes and early abort 9639 if ( s.beforeSend && 9640 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 9641 9642 // Abort if not done already and return 9643 return jqXHR.abort(); 9644 } 9645 9646 // Aborting is no longer a cancellation 9647 strAbort = "abort"; 9648 9649 // Install callbacks on deferreds 9650 completeDeferred.add( s.complete ); 9651 jqXHR.done( s.success ); 9652 jqXHR.fail( s.error ); 9653 9654 // Get transport 9655 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 9656 9657 // If no transport, we auto-abort 9658 if ( !transport ) { 9659 done( -1, "No Transport" ); 9660 } else { 9661 jqXHR.readyState = 1; 9662 9663 // Send global event 9664 if ( fireGlobals ) { 9665 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 9666 } 9667 9668 // If request was aborted inside ajaxSend, stop there 9669 if ( completed ) { 9670 return jqXHR; 9671 } 9672 9673 // Timeout 9674 if ( s.async && s.timeout > 0 ) { 9675 timeoutTimer = window.setTimeout( function() { 9676 jqXHR.abort( "timeout" ); 9677 }, s.timeout ); 9678 } 9679 9680 try { 9681 completed = false; 9682 transport.send( requestHeaders, done ); 9683 } catch ( e ) { 9684 9685 // Rethrow post-completion exceptions 9686 if ( completed ) { 9687 throw e; 9688 } 9689 9690 // Propagate others as results 9691 done( -1, e ); 9692 } 9693 } 9694 9695 // Callback for when everything is done 9696 function done( status, nativeStatusText, responses, headers ) { 9697 var isSuccess, success, error, response, modified, 9698 statusText = nativeStatusText; 9699 9700 // Ignore repeat invocations 9701 if ( completed ) { 9702 return; 9703 } 9704 9705 completed = true; 9706 9707 // Clear timeout if it exists 9708 if ( timeoutTimer ) { 9709 window.clearTimeout( timeoutTimer ); 9710 } 9711 9712 // Dereference transport for early garbage collection 9713 // (no matter how long the jqXHR object will be used) 9714 transport = undefined; 9715 9716 // Cache response headers 9717 responseHeadersString = headers || ""; 9718 9719 // Set readyState 9720 jqXHR.readyState = status > 0 ? 4 : 0; 9721 9722 // Determine if successful 9723 isSuccess = status >= 200 && status < 300 || status === 304; 9724 9725 // Get response data 9726 if ( responses ) { 9727 response = ajaxHandleResponses( s, jqXHR, responses ); 9728 } 9729 9730 // Use a noop converter for missing script 9731 if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { 9732 s.converters[ "text script" ] = function() {}; 9733 } 9734 9735 // Convert no matter what (that way responseXXX fields are always set) 9736 response = ajaxConvert( s, response, jqXHR, isSuccess ); 9737 9738 // If successful, handle type chaining 9739 if ( isSuccess ) { 9740 9741 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9742 if ( s.ifModified ) { 9743 modified = jqXHR.getResponseHeader( "Last-Modified" ); 9744 if ( modified ) { 9745 jQuery.lastModified[ cacheURL ] = modified; 9746 } 9747 modified = jqXHR.getResponseHeader( "etag" ); 9748 if ( modified ) { 9749 jQuery.etag[ cacheURL ] = modified; 9750 } 9751 } 9752 9753 // if no content 9754 if ( status === 204 || s.type === "HEAD" ) { 9755 statusText = "nocontent"; 9756 9757 // if not modified 9758 } else if ( status === 304 ) { 9759 statusText = "notmodified"; 9760 9761 // If we have data, let's convert it 9762 } else { 9763 statusText = response.state; 9764 success = response.data; 9765 error = response.error; 9766 isSuccess = !error; 9767 } 9768 } else { 9769 9770 // Extract error from statusText and normalize for non-aborts 9771 error = statusText; 9772 if ( status || !statusText ) { 9773 statusText = "error"; 9774 if ( status < 0 ) { 9775 status = 0; 9776 } 9777 } 9778 } 9779 9780 // Set data for the fake xhr object 9781 jqXHR.status = status; 9782 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 9783 9784 // Success/Error 9785 if ( isSuccess ) { 9786 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 9787 } else { 9788 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 9789 } 9790 9791 // Status-dependent callbacks 9792 jqXHR.statusCode( statusCode ); 9793 statusCode = undefined; 9794 9795 if ( fireGlobals ) { 9796 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 9797 [ jqXHR, s, isSuccess ? success : error ] ); 9798 } 9799 9800 // Complete 9801 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 9802 9803 if ( fireGlobals ) { 9804 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 9805 9806 // Handle the global AJAX counter 9807 if ( !( --jQuery.active ) ) { 9808 jQuery.event.trigger( "ajaxStop" ); 9809 } 9810 } 9811 } 9812 9813 return jqXHR; 9814 }, 9815 9816 getJSON: function( url, data, callback ) { 9817 return jQuery.get( url, data, callback, "json" ); 9818 }, 9819 9820 getScript: function( url, callback ) { 9821 return jQuery.get( url, undefined, callback, "script" ); 9822 } 9823 } ); 9824 9825 jQuery.each( [ "get", "post" ], function( _i, method ) { 9826 jQuery[ method ] = function( url, data, callback, type ) { 9827 9828 // Shift arguments if data argument was omitted 9829 if ( isFunction( data ) ) { 9830 type = type || callback; 9831 callback = data; 9832 data = undefined; 9833 } 9834 9835 // The url can be an options object (which then must have .url) 9836 return jQuery.ajax( jQuery.extend( { 9837 url: url, 9838 type: method, 9839 dataType: type, 9840 data: data, 9841 success: callback 9842 }, jQuery.isPlainObject( url ) && url ) ); 9843 }; 9844 } ); 9845 9846 jQuery.ajaxPrefilter( function( s ) { 9847 var i; 9848 for ( i in s.headers ) { 9849 if ( i.toLowerCase() === "content-type" ) { 9850 s.contentType = s.headers[ i ] || ""; 9851 } 9852 } 9853 } ); 9854 9855 9856 jQuery._evalUrl = function( url, options, doc ) { 9857 return jQuery.ajax( { 9858 url: url, 9859 9860 // Make this explicit, since user can override this through ajaxSetup (#11264) 9861 type: "GET", 9862 dataType: "script", 9863 cache: true, 9864 async: false, 9865 global: false, 9866 9867 // Only evaluate the response if it is successful (gh-4126) 9868 // dataFilter is not invoked for failure responses, so using it instead 9869 // of the default converter is kludgy but it works. 9870 converters: { 9871 "text script": function() {} 9872 }, 9873 dataFilter: function( response ) { 9874 jQuery.globalEval( response, options, doc ); 9875 } 9876 } ); 9877 }; 9878 9879 9880 jQuery.fn.extend( { 9881 wrapAll: function( html ) { 9882 var wrap; 9883 9884 if ( this[ 0 ] ) { 9885 if ( isFunction( html ) ) { 9886 html = html.call( this[ 0 ] ); 9887 } 9888 9889 // The elements to wrap the target around 9890 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 9891 9892 if ( this[ 0 ].parentNode ) { 9893 wrap.insertBefore( this[ 0 ] ); 9894 } 9895 9896 wrap.map( function() { 9897 var elem = this; 9898 9899 while ( elem.firstElementChild ) { 9900 elem = elem.firstElementChild; 9901 } 9902 9903 return elem; 9904 } ).append( this ); 9905 } 9906 9907 return this; 9908 }, 9909 9910 wrapInner: function( html ) { 9911 if ( isFunction( html ) ) { 9912 return this.each( function( i ) { 9913 jQuery( this ).wrapInner( html.call( this, i ) ); 9914 } ); 9915 } 9916 9917 return this.each( function() { 9918 var self = jQuery( this ), 9919 contents = self.contents(); 9920 9921 if ( contents.length ) { 9922 contents.wrapAll( html ); 9923 9924 } else { 9925 self.append( html ); 9926 } 9927 } ); 9928 }, 9929 9930 wrap: function( html ) { 9931 var htmlIsFunction = isFunction( html ); 9932 9933 return this.each( function( i ) { 9934 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 9935 } ); 9936 }, 9937 9938 unwrap: function( selector ) { 9939 this.parent( selector ).not( "body" ).each( function() { 9940 jQuery( this ).replaceWith( this.childNodes ); 9941 } ); 9942 return this; 9943 } 9944 } ); 9945 9946 9947 jQuery.expr.pseudos.hidden = function( elem ) { 9948 return !jQuery.expr.pseudos.visible( elem ); 9949 }; 9950 jQuery.expr.pseudos.visible = function( elem ) { 9951 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 9952 }; 9953 9954 9955 9956 9957 jQuery.ajaxSettings.xhr = function() { 9958 try { 9959 return new window.XMLHttpRequest(); 9960 } catch ( e ) {} 9961 }; 9962 9963 var xhrSuccessStatus = { 9964 9965 // File protocol always yields status code 0, assume 200 9966 0: 200, 9967 9968 // Support: IE <=9 only 9969 // #1450: sometimes IE returns 1223 when it should be 204 9970 1223: 204 9971 }, 9972 xhrSupported = jQuery.ajaxSettings.xhr(); 9973 9974 support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 9975 support.ajax = xhrSupported = !!xhrSupported; 9976 9977 jQuery.ajaxTransport( function( options ) { 9978 var callback, errorCallback; 9979 9980 // Cross domain only allowed if supported through XMLHttpRequest 9981 if ( support.cors || xhrSupported && !options.crossDomain ) { 9982 return { 9983 send: function( headers, complete ) { 9984 var i, 9985 xhr = options.xhr(); 9986 9987 xhr.open( 9988 options.type, 9989 options.url, 9990 options.async, 9991 options.username, 9992 options.password 9993 ); 9994 9995 // Apply custom fields if provided 9996 if ( options.xhrFields ) { 9997 for ( i in options.xhrFields ) { 9998 xhr[ i ] = options.xhrFields[ i ]; 9999 } 10000 } 10001 10002 // Override mime type if needed 10003 if ( options.mimeType && xhr.overrideMimeType ) { 10004 xhr.overrideMimeType( options.mimeType ); 10005 } 10006 10007 // X-Requested-With header 10008 // For cross-domain requests, seeing as conditions for a preflight are 10009 // akin to a jigsaw puzzle, we simply never set it to be sure. 10010 // (it can always be set on a per-request basis or even using ajaxSetup) 10011 // For same-domain requests, won't change header if already provided. 10012 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 10013 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 10014 } 10015 10016 // Set headers 10017 for ( i in headers ) { 10018 xhr.setRequestHeader( i, headers[ i ] ); 10019 } 10020 10021 // Callback 10022 callback = function( type ) { 10023 return function() { 10024 if ( callback ) { 10025 callback = errorCallback = xhr.onload = 10026 xhr.onerror = xhr.onabort = xhr.ontimeout = 10027 xhr.onreadystatechange = null; 10028 10029 if ( type === "abort" ) { 10030 xhr.abort(); 10031 } else if ( type === "error" ) { 10032 10033 // Support: IE <=9 only 10034 // On a manual native abort, IE9 throws 10035 // errors on any property access that is not readyState 10036 if ( typeof xhr.status !== "number" ) { 10037 complete( 0, "error" ); 10038 } else { 10039 complete( 10040 10041 // File: protocol always yields status 0; see #8605, #14207 10042 xhr.status, 10043 xhr.statusText 10044 ); 10045 } 10046 } else { 10047 complete( 10048 xhrSuccessStatus[ xhr.status ] || xhr.status, 10049 xhr.statusText, 10050 10051 // Support: IE <=9 only 10052 // IE9 has no XHR2 but throws on binary (trac-11426) 10053 // For XHR2 non-text, let the caller handle it (gh-2498) 10054 ( xhr.responseType || "text" ) !== "text" || 10055 typeof xhr.responseText !== "string" ? 10056 { binary: xhr.response } : 10057 { text: xhr.responseText }, 10058 xhr.getAllResponseHeaders() 10059 ); 10060 } 10061 } 10062 }; 10063 }; 10064 10065 // Listen to events 10066 xhr.onload = callback(); 10067 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 10068 10069 // Support: IE 9 only 10070 // Use onreadystatechange to replace onabort 10071 // to handle uncaught aborts 10072 if ( xhr.onabort !== undefined ) { 10073 xhr.onabort = errorCallback; 10074 } else { 10075 xhr.onreadystatechange = function() { 10076 10077 // Check readyState before timeout as it changes 10078 if ( xhr.readyState === 4 ) { 10079 10080 // Allow onerror to be called first, 10081 // but that will not handle a native abort 10082 // Also, save errorCallback to a variable 10083 // as xhr.onerror cannot be accessed 10084 window.setTimeout( function() { 10085 if ( callback ) { 10086 errorCallback(); 10087 } 10088 } ); 10089 } 10090 }; 10091 } 10092 10093 // Create the abort callback 10094 callback = callback( "abort" ); 10095 10096 try { 10097 10098 // Do send the request (this may raise an exception) 10099 xhr.send( options.hasContent && options.data || null ); 10100 } catch ( e ) { 10101 10102 // #14683: Only rethrow if this hasn't been notified as an error yet 10103 if ( callback ) { 10104 throw e; 10105 } 10106 } 10107 }, 10108 10109 abort: function() { 10110 if ( callback ) { 10111 callback(); 10112 } 10113 } 10114 }; 10115 } 10116 } ); 10117 10118 10119 10120 10121// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 10122 jQuery.ajaxPrefilter( function( s ) { 10123 if ( s.crossDomain ) { 10124 s.contents.script = false; 10125 } 10126 } ); 10127 10128// Install script dataType 10129 jQuery.ajaxSetup( { 10130 accepts: { 10131 script: "text/javascript, application/javascript, " + 10132 "application/ecmascript, application/x-ecmascript" 10133 }, 10134 contents: { 10135 script: /\b(?:java|ecma)script\b/ 10136 }, 10137 converters: { 10138 "text script": function( text ) { 10139 jQuery.globalEval( text ); 10140 return text; 10141 } 10142 } 10143 } ); 10144 10145// Handle cache's special case and crossDomain 10146 jQuery.ajaxPrefilter( "script", function( s ) { 10147 if ( s.cache === undefined ) { 10148 s.cache = false; 10149 } 10150 if ( s.crossDomain ) { 10151 s.type = "GET"; 10152 } 10153 } ); 10154 10155// Bind script tag hack transport 10156 jQuery.ajaxTransport( "script", function( s ) { 10157 10158 // This transport only deals with cross domain or forced-by-attrs requests 10159 if ( s.crossDomain || s.scriptAttrs ) { 10160 var script, callback; 10161 return { 10162 send: function( _, complete ) { 10163 script = jQuery( "<script>" ) 10164 .attr( s.scriptAttrs || {} ) 10165 .prop( { charset: s.scriptCharset, src: s.url } ) 10166 .on( "load error", callback = function( evt ) { 10167 script.remove(); 10168 callback = null; 10169 if ( evt ) { 10170 complete( evt.type === "error" ? 404 : 200, evt.type ); 10171 } 10172 } ); 10173 10174 // Use native DOM manipulation to avoid our domManip AJAX trickery 10175 document.head.appendChild( script[ 0 ] ); 10176 }, 10177 abort: function() { 10178 if ( callback ) { 10179 callback(); 10180 } 10181 } 10182 }; 10183 } 10184 } ); 10185 10186 10187 10188 10189 var oldCallbacks = [], 10190 rjsonp = /(=)\?(?=&|$)|\?\?/; 10191 10192// Default jsonp settings 10193 jQuery.ajaxSetup( { 10194 jsonp: "callback", 10195 jsonpCallback: function() { 10196 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); 10197 this[ callback ] = true; 10198 return callback; 10199 } 10200 } ); 10201 10202// Detect, normalize options and install callbacks for jsonp requests 10203 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 10204 10205 var callbackName, overwritten, responseContainer, 10206 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 10207 "url" : 10208 typeof s.data === "string" && 10209 ( s.contentType || "" ) 10210 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 10211 rjsonp.test( s.data ) && "data" 10212 ); 10213 10214 // Handle iff the expected data type is "jsonp" or we have a parameter to set 10215 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 10216 10217 // Get callback name, remembering preexisting value associated with it 10218 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 10219 s.jsonpCallback() : 10220 s.jsonpCallback; 10221 10222 // Insert callback into url or form data 10223 if ( jsonProp ) { 10224 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 10225 } else if ( s.jsonp !== false ) { 10226 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 10227 } 10228 10229 // Use data converter to retrieve json after script execution 10230 s.converters[ "script json" ] = function() { 10231 if ( !responseContainer ) { 10232 jQuery.error( callbackName + " was not called" ); 10233 } 10234 return responseContainer[ 0 ]; 10235 }; 10236 10237 // Force json dataType 10238 s.dataTypes[ 0 ] = "json"; 10239 10240 // Install callback 10241 overwritten = window[ callbackName ]; 10242 window[ callbackName ] = function() { 10243 responseContainer = arguments; 10244 }; 10245 10246 // Clean-up function (fires after converters) 10247 jqXHR.always( function() { 10248 10249 // If previous value didn't exist - remove it 10250 if ( overwritten === undefined ) { 10251 jQuery( window ).removeProp( callbackName ); 10252 10253 // Otherwise restore preexisting value 10254 } else { 10255 window[ callbackName ] = overwritten; 10256 } 10257 10258 // Save back as free 10259 if ( s[ callbackName ] ) { 10260 10261 // Make sure that re-using the options doesn't screw things around 10262 s.jsonpCallback = originalSettings.jsonpCallback; 10263 10264 // Save the callback name for future use 10265 oldCallbacks.push( callbackName ); 10266 } 10267 10268 // Call if it was a function and we have a response 10269 if ( responseContainer && isFunction( overwritten ) ) { 10270 overwritten( responseContainer[ 0 ] ); 10271 } 10272 10273 responseContainer = overwritten = undefined; 10274 } ); 10275 10276 // Delegate to script 10277 return "script"; 10278 } 10279 } ); 10280 10281 10282 10283 10284// Support: Safari 8 only 10285// In Safari 8 documents created via document.implementation.createHTMLDocument 10286// collapse sibling forms: the second one becomes a child of the first one. 10287// Because of that, this security measure has to be disabled in Safari 8. 10288// https://bugs.webkit.org/show_bug.cgi?id=137337 10289 support.createHTMLDocument = ( function() { 10290 var body = document.implementation.createHTMLDocument( "" ).body; 10291 body.innerHTML = "<form></form><form></form>"; 10292 return body.childNodes.length === 2; 10293 } )(); 10294 10295 10296// Argument "data" should be string of html 10297// context (optional): If specified, the fragment will be created in this context, 10298// defaults to document 10299// keepScripts (optional): If true, will include scripts passed in the html string 10300 jQuery.parseHTML = function( data, context, keepScripts ) { 10301 if ( typeof data !== "string" ) { 10302 return []; 10303 } 10304 if ( typeof context === "boolean" ) { 10305 keepScripts = context; 10306 context = false; 10307 } 10308 10309 var base, parsed, scripts; 10310 10311 if ( !context ) { 10312 10313 // Stop scripts or inline event handlers from being executed immediately 10314 // by using document.implementation 10315 if ( support.createHTMLDocument ) { 10316 context = document.implementation.createHTMLDocument( "" ); 10317 10318 // Set the base href for the created document 10319 // so any parsed elements with URLs 10320 // are based on the document's URL (gh-2965) 10321 base = context.createElement( "base" ); 10322 base.href = document.location.href; 10323 context.head.appendChild( base ); 10324 } else { 10325 context = document; 10326 } 10327 } 10328 10329 parsed = rsingleTag.exec( data ); 10330 scripts = !keepScripts && []; 10331 10332 // Single tag 10333 if ( parsed ) { 10334 return [ context.createElement( parsed[ 1 ] ) ]; 10335 } 10336 10337 parsed = buildFragment( [ data ], context, scripts ); 10338 10339 if ( scripts && scripts.length ) { 10340 jQuery( scripts ).remove(); 10341 } 10342 10343 return jQuery.merge( [], parsed.childNodes ); 10344 }; 10345 10346 10347 /** 10348 * Load a url into a page 10349 */ 10350 jQuery.fn.load = function( url, params, callback ) { 10351 var selector, type, response, 10352 self = this, 10353 off = url.indexOf( " " ); 10354 10355 if ( off > -1 ) { 10356 selector = stripAndCollapse( url.slice( off ) ); 10357 url = url.slice( 0, off ); 10358 } 10359 10360 // If it's a function 10361 if ( isFunction( params ) ) { 10362 10363 // We assume that it's the callback 10364 callback = params; 10365 params = undefined; 10366 10367 // Otherwise, build a param string 10368 } else if ( params && typeof params === "object" ) { 10369 type = "POST"; 10370 } 10371 10372 // If we have elements to modify, make the request 10373 if ( self.length > 0 ) { 10374 jQuery.ajax( { 10375 url: url, 10376 10377 // If "type" variable is undefined, then "GET" method will be used. 10378 // Make value of this field explicit since 10379 // user can override it through ajaxSetup method 10380 type: type || "GET", 10381 dataType: "html", 10382 data: params 10383 } ).done( function( responseText ) { 10384 10385 // Save response for use in complete callback 10386 response = arguments; 10387 10388 self.html( selector ? 10389 10390 // If a selector was specified, locate the right elements in a dummy div 10391 // Exclude scripts to avoid IE 'Permission Denied' errors 10392 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 10393 10394 // Otherwise use the full result 10395 responseText ); 10396 10397 // If the request succeeds, this function gets "data", "status", "jqXHR" 10398 // but they are ignored because response was set above. 10399 // If it fails, this function gets "jqXHR", "status", "error" 10400 } ).always( callback && function( jqXHR, status ) { 10401 self.each( function() { 10402 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 10403 } ); 10404 } ); 10405 } 10406 10407 return this; 10408 }; 10409 10410 10411 10412 10413 jQuery.expr.pseudos.animated = function( elem ) { 10414 return jQuery.grep( jQuery.timers, function( fn ) { 10415 return elem === fn.elem; 10416 } ).length; 10417 }; 10418 10419 10420 10421 10422 jQuery.offset = { 10423 setOffset: function( elem, options, i ) { 10424 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft,
vendor: 4,683 bytes, lines 10424-10548
10424calculatePosition, 10425 position = jQuery.css( elem, "position" ), 10426 curElem = jQuery( elem ), 10427 props = {}; 10428 10429 // Set position first, in-case top/left are set even on static elem 10430 if ( position === "static" ) { 10431 elem.style.position = "relative"; 10432 } 10433 10434 curOffset = curElem.offset(); 10435 curCSSTop = jQuery.css( elem, "top" ); 10436 curCSSLeft = jQuery.css( elem, "left" ); 10437 calculatePosition = ( position === "absolute" || position === "fixed" ) && 10438 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 10439 10440 // Need to be able to calculate position if either 10441 // top or left is auto and position is either absolute or fixed 10442 if ( calculatePosition ) { 10443 curPosition = curElem.position(); 10444 curTop = curPosition.top; 10445 curLeft = curPosition.left; 10446 10447 } else { 10448 curTop = parseFloat( curCSSTop ) || 0; 10449 curLeft = parseFloat( curCSSLeft ) || 0; 10450 } 10451 10452 if ( isFunction( options ) ) { 10453 10454 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 10455 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 10456 } 10457 10458 if ( options.top != null ) { 10459 props.top = ( options.top - curOffset.top ) + curTop; 10460 } 10461 if ( options.left != null ) { 10462 props.left = ( options.left - curOffset.left ) + curLeft; 10463 } 10464 10465 if ( "using" in options ) { 10466 options.using.call( elem, props ); 10467 10468 } else { 10469 if ( typeof props.top === "number" ) { 10470 props.top += "px"; 10471 } 10472 if ( typeof props.left === "number" ) { 10473 props.left += "px"; 10474 } 10475 curElem.css( props ); 10476 } 10477 } 10478 }; 10479 10480 jQuery.fn.extend( { 10481 10482 // offset() relates an element's border box to the document origin 10483 offset: function( options ) { 10484 10485 // Preserve chaining for setter 10486 if ( arguments.length ) { 10487 return options === undefined ? 10488 this : 10489 this.each( function( i ) { 10490 jQuery.offset.setOffset( this, options, i ); 10491 } ); 10492 } 10493 10494 var rect, win, 10495 elem = this[ 0 ]; 10496 10497 if ( !elem ) { 10498 return; 10499 } 10500 10501 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 10502 // Support: IE <=11 only 10503 // Running getBoundingClientRect on a 10504 // disconnected node in IE throws an error 10505 if ( !elem.getClientRects().length ) { 10506 return { top: 0, left: 0 }; 10507 } 10508 10509 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 10510 rect = elem.getBoundingClientRect(); 10511 win = elem.ownerDocument.defaultView; 10512 return { 10513 top: rect.top + win.pageYOffset, 10514 left: rect.left + win.pageXOffset 10515 }; 10516 }, 10517 10518 // position() relates an element's margin box to its offset parent's padding box 10519 // This corresponds to the behavior of CSS absolute positioning 10520 position: function() { 10521 if ( !this[ 0 ] ) { 10522 return; 10523 } 10524 10525 var offsetParent, offset, doc, 10526 elem = this[ 0 ], 10527 parentOffset = { top: 0, left: 0 }; 10528 10529 // position:fixed elements are offset from the viewport, which itself always has zero offset 10530 if ( jQuery.css( elem, "position" ) === "fixed" ) { 10531 10532 // Assume position:fixed implies availability of getBoundingClientRect 10533 offset = elem.getBoundingClientRect(); 10534 10535 } else { 10536 offset = this.offset(); 10537 10538 // Account for the *real* offset parent, which can be the document or its root element 10539 // when a statically positioned element is identified 10540 doc = elem.ownerDocument; 10541 offsetParent = elem.offsetParent || doc.documentElement; 10542 while ( offsetParent && 10543 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 10544 jQuery.css( offsetParent, "position" ) === "static" ) { 10545 10546 offsetParent = offsetParent.parentNode; 10547 } 10548 if ( offsetParent && offsetParent !== elem && offsetParent.
vendor: 4,681 bytes, lines 10548-10657
10548nodeType === 1 ) { 10549 10550 // Incorporate borders into its offset, since they are outside its content origin 10551 parentOffset = jQuery( offsetParent ).offset(); 10552 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 10553 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 10554 } 10555 } 10556 10557 // Subtract parent offsets and element margins 10558 return { 10559 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 10560 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 10561 }; 10562 }, 10563 10564 // This method will return documentElement in the following cases: 10565 // 1) For the element inside the iframe without offsetParent, this method will return 10566 // documentElement of the parent window 10567 // 2) For the hidden or detached element 10568 // 3) For body or html element, i.e. in case of the html node - it will return itself 10569 // 10570 // but those exceptions were never presented as a real life use-cases 10571 // and might be considered as more preferable results. 10572 // 10573 // This logic, however, is not guaranteed and can change at any point in the future 10574 offsetParent: function() { 10575 return this.map( function() { 10576 var offsetParent = this.offsetParent; 10577 10578 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 10579 offsetParent = offsetParent.offsetParent; 10580 } 10581 10582 return offsetParent || documentElement; 10583 } ); 10584 } 10585 } ); 10586 10587// Create scrollLeft and scrollTop methods 10588 jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 10589 var top = "pageYOffset" === prop; 10590 10591 jQuery.fn[ method ] = function( val ) { 10592 return access( this, function( elem, method, val ) { 10593 10594 // Coalesce documents and windows 10595 var win; 10596 if ( isWindow( elem ) ) { 10597 win = elem; 10598 } else if ( elem.nodeType === 9 ) { 10599 win = elem.defaultView; 10600 } 10601 10602 if ( val === undefined ) { 10603 return win ? win[ prop ] : elem[ method ]; 10604 } 10605 10606 if ( win ) { 10607 win.scrollTo( 10608 !top ? val : win.pageXOffset, 10609 top ? val : win.pageYOffset 10610 ); 10611 10612 } else { 10613 elem[ method ] = val; 10614 } 10615 }, method, val, arguments.length ); 10616 }; 10617 } ); 10618 10619// Support: Safari <=7 - 9.1, Chrome <=37 - 49 10620// Add the top/left cssHooks using jQuery.fn.position 10621// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 10622// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 10623// getComputedStyle returns percent when specified for top/left/bottom/right; 10624// rather than make the css module depend on the offset module, just check for it here 10625 jQuery.each( [ "top", "left" ], function( _i, prop ) { 10626 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 10627 function( elem, computed ) { 10628 if ( computed ) { 10629 computed = curCSS( elem, prop ); 10630 10631 // If curCSS returns percentage, fallback to offset 10632 return rnumnonpx.test( computed ) ? 10633 jQuery( elem ).position()[ prop ] + "px" : 10634 computed; 10635 } 10636 } 10637 ); 10638 } ); 10639 10640 10641// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 10642 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 10643 jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, 10644 function( defaultExtra, funcName ) { 10645 10646 // Margin is only for outerHeight, outerWidth 10647 jQuery.fn[ funcName ] = function( margin, value ) { 10648 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 10649 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 10650 10651 return access( this, function( elem, type, value ) { 10652 var doc; 10653 10654 if ( isWindow( elem ) ) { 10655 10656 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 10657 return funcName.indexOf( "outer" ) === 0 ?
vendor: 5,135 bytes, lines 10658-10813
10658 elem[ "inner" + name ] : 10659 elem.document.documentElement[ "client" + name ]; 10660 } 10661 10662 // Get document width or height 10663 if ( elem.nodeType === 9 ) { 10664 doc = elem.documentElement; 10665 10666 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 10667 // whichever is greatest 10668 return Math.max( 10669 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 10670 elem.body[ "offset" + name ], doc[ "offset" + name ], 10671 doc[ "client" + name ] 10672 ); 10673 } 10674 10675 return value === undefined ? 10676 10677 // Get width or height on the element, requesting but not forcing parseFloat 10678 jQuery.css( elem, type, extra ) : 10679 10680 // Set width or height on the element 10681 jQuery.style( elem, type, value, extra ); 10682 }, type, chainable ? margin : undefined, chainable ); 10683 }; 10684 } ); 10685 } ); 10686 10687 10688 jQuery.each( [ 10689 "ajaxStart", 10690 "ajaxStop", 10691 "ajaxComplete", 10692 "ajaxError", 10693 "ajaxSuccess", 10694 "ajaxSend" 10695 ], function( _i, type ) { 10696 jQuery.fn[ type ] = function( fn ) { 10697 return this.on( type, fn ); 10698 }; 10699 } ); 10700 10701 10702 10703 10704 jQuery.fn.extend( { 10705 10706 bind: function( types, data, fn ) { 10707 return this.on( types, null, data, fn ); 10708 }, 10709 unbind: function( types, fn ) { 10710 return this.off( types, null, fn ); 10711 }, 10712 10713 delegate: function( selector, types, data, fn ) { 10714 return this.on( types, selector, data, fn ); 10715 }, 10716 undelegate: function( selector, types, fn ) { 10717 10718 // ( namespace ) or ( selector, types [, fn] ) 10719 return arguments.length === 1 ? 10720 this.off( selector, "**" ) : 10721 this.off( types, selector || "**", fn ); 10722 }, 10723 10724 hover: function( fnOver, fnOut ) { 10725 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 10726 } 10727 } ); 10728 10729 jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + 10730 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 10731 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 10732 function( _i, name ) { 10733 10734 // Handle event binding 10735 jQuery.fn[ name ] = function( data, fn ) { 10736 return arguments.length > 0 ? 10737 this.on( name, null, data, fn ) : 10738 this.trigger( name ); 10739 }; 10740 } ); 10741 10742 10743 10744 10745// Support: Android <=4.0 only 10746// Make sure we trim BOM and NBSP 10747 var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 10748 10749// Bind a function to a context, optionally partially applying any 10750// arguments. 10751// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 10752// However, it is not slated for removal any time soon 10753 jQuery.proxy = function( fn, context ) { 10754 var tmp, args, proxy; 10755 10756 if ( typeof context === "string" ) { 10757 tmp = fn[ context ]; 10758 context = fn; 10759 fn = tmp; 10760 } 10761 10762 // Quick check to determine if target is callable, in the spec 10763 // this throws a TypeError, but we will just return undefined. 10764 if ( !isFunction( fn ) ) { 10765 return undefined; 10766 } 10767 10768 // Simulated bind 10769 args = slice.call( arguments, 2 ); 10770 proxy = function() { 10771 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 10772 }; 10773 10774 // Set the guid of unique handler to the same of original handler, so it can be removed 10775 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 10776 10777 return proxy; 10778 }; 10779 10780 jQuery.holdReady = function( hold ) { 10781 if ( hold ) { 10782 jQuery.readyWait++; 10783 } else { 10784 jQuery.ready( true ); 10785 } 10786 }; 10787 jQuery.isArray = Array.isArray; 10788 jQuery.parseJSON = JSON.parse; 10789 jQuery.nodeName = nodeName; 10790 jQuery.isFunction = isFunction; 10791 jQuery.isWindow = isWindow; 10792 jQuery.camelCase = camelCase; 10793 jQuery.type = toType; 10794 10795 jQuery.now = Date.now; 10796 10797 jQuery.isNumeric = function( obj ) { 10798 10799 // As of jQuery 3.0, isNumeric is limited to 10800 // strings and numbers (primitives or objects) 10801 // that can be coerced to finite numbers (gh-2662) 10802 var type = jQuery.type( obj ); 10803 return ( type === "number" || type === "string" ) && 10804 10805 // parseFloat NaNs numeric-cast false positives ("") 10806 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 10807 // subtraction forces infinities to NaN 10808 !isNaN( obj - parseFloat( obj ) ); 10809 }; 10810 10811 jQuery.trim = function( text ) { 10812 return text == null ? 10813 "" :
10814 ( text + "" ).replace( rtrim, "" ); 10815 }; 10816 10817 10818 10819// Register as a named AMD module, since jQuery can be concatenated with other 10820// files that may use define, but not via a proper concatenation script that 10821// understands anonymous AMD modules. A named AMD is safest and most robust 10822// way to register. Lowercase jquery is used because AMD module names are 10823// derived from file names, and jQuery is normally delivered in a lowercase 10824// file name. Do this after creating the global so that if an AMD module wants 10825// to call noConflict to hide this version of jQuery, it will work. 10826 10827// Note that for maximum portability, libraries that are not jQuery should 10828// declare themselves as anonymous modules, and avoid setting a global if an 10829// AMD loader is present. jQuery is a special case. For more information, see 10830// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 10831 10832 if ( typeof define === "function" && define.amd ) { 10833 define( "jquery", [], function() { 10834 return jQuery; 10835 } ); 10836 } 10837 10838 10839 10840 10841 var 10842 10843 // Map over jQuery in case of overwrite 10844 _jQuery = window.jQuery, 10845 10846 // Map over the $ in case of overwrite 10847 _$ = window.$; 10848 10849 jQuery.noConflict = function( deep ) { 10850 if ( window.$ === jQuery ) { 10851 window.$ = _$; 10852 } 10853 10854 if ( deep && window.jQuery === jQuery ) { 10855 window.jQuery = _jQuery; 10856 } 10857 10858 return jQuery; 10859 }; 10860 10861// Expose jQuery and $ identifiers, even in AMD 10862// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 10863// and CommonJS for browser emulators (#13566) 10864 if ( typeof noGlobal === "undefined" ) { 10865 window.jQuery = window.$ = jQuery; 10866 } 10867 10868 10869 10870 10871 return jQuery; 10872} ); 10873 10874/******/ (function() { // webpackBootstrap 10875/******/ var __webpack_modules__ = ({ 10876 10877/***/ 7090: 10878/***/ (function(module) { 10879 10880(function(window, factory) { 10881 var lazySizes = factory(window, window.document, Date); 10882 window.lazySizes = lazySizes; 10883 if( true
vendor: 19,841 bytes, lines 10883-11693
10883 && module.exports){ 10884 module.exports = lazySizes; 10885 } 10886}(typeof window != 'undefined' ? 10887 window : {}, 10888/** 10889 * import("./types/global") 10890 * @typedef { import("./types/lazysizes-config").LazySizesConfigPartial } LazySizesConfigPartial 10891 */ 10892function l(window, document, Date) { // Pass in the window Date function also for SSR because the Date class can be lost 10893 'use strict'; 10894 /*jshint eqnull:true */ 10895 10896 var lazysizes, 10897 /** 10898 * @type { LazySizesConfigPartial } 10899 */ 10900 lazySizesCfg; 10901 10902 (function(){ 10903 var prop; 10904 10905 var lazySizesDefaults = { 10906 lazyClass: 'lazyload', 10907 loadedClass: 'lazyloaded', 10908 loadingClass: 'lazyloading', 10909 preloadClass: 'lazypreload', 10910 errorClass: 'lazyerror', 10911 //strictClass: 'lazystrict', 10912 autosizesClass: 'lazyautosizes', 10913 fastLoadedClass: 'ls-is-cached', 10914 iframeLoadMode: 0, 10915 srcAttr: 'data-src', 10916 srcsetAttr: 'data-srcset', 10917 sizesAttr: 'data-sizes', 10918 //preloadAfterLoad: false, 10919 minSize: 40, 10920 customMedia: {}, 10921 init: true, 10922 expFactor: 1.5, 10923 hFac: 0.8, 10924 loadMode: 2, 10925 loadHidden: true, 10926 ricTimeout: 0, 10927 throttleDelay: 125, 10928 }; 10929 10930 lazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {}; 10931 10932 for(prop in lazySizesDefaults){ 10933 if(!(prop in lazySizesCfg)){ 10934 lazySizesCfg[prop] = lazySizesDefaults[prop]; 10935 } 10936 } 10937 })(); 10938 10939 if (!document || !document.getElementsByClassName) { 10940 return { 10941 init: function () {}, 10942 /** 10943 * @type { LazySizesConfigPartial } 10944 */ 10945 cfg: lazySizesCfg, 10946 /** 10947 * @type { true } 10948 */ 10949 noSupport: true, 10950 }; 10951 } 10952 10953 var docElem = document.documentElement; 10954 10955 var supportPicture = window.HTMLPictureElement; 10956 10957 var _addEventListener = 'addEventListener'; 10958 10959 var _getAttribute = 'getAttribute'; 10960 10961 /** 10962 * Update to bind to window because 'this' becomes null during SSR 10963 * builds. 10964 */ 10965 var addEventListener = window[_addEventListener].bind(window); 10966 10967 var setTimeout = window.setTimeout; 10968 10969 var requestAnimationFrame = window.requestAnimationFrame || setTimeout; 10970 10971 var requestIdleCallback = window.requestIdleCallback; 10972 10973 var regPicture = /^picture$/i; 10974 10975 var loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded']; 10976 10977 var regClassCache = {}; 10978 10979 var forEach = Array.prototype.forEach; 10980 10981 /** 10982 * @param ele {Element} 10983 * @param cls {string} 10984 */ 10985 var hasClass = function(ele, cls) { 10986 if(!regClassCache[cls]){ 10987 regClassCache[cls] = new RegExp('(\\s|^)'+cls+'(\\s|$)'); 10988 } 10989 return regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls]; 10990 }; 10991 10992 /** 10993 * @param ele {Element} 10994 * @param cls {string} 10995 */ 10996 var addClass = function(ele, cls) { 10997 if (!hasClass(ele, cls)){ 10998 ele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls); 10999 } 11000 }; 11001 11002 /** 11003 * @param ele {Element} 11004 * @param cls {string} 11005 */ 11006 var removeClass = function(ele, cls) { 11007 var reg; 11008 if ((reg = hasClass(ele,cls))) { 11009 ele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' ')); 11010 } 11011 }; 11012 11013 var addRemoveLoadEvents = function(dom, fn, add){ 11014 var action = add ? _addEventListener : 'removeEventListener'; 11015 if(add){ 11016 addRemoveLoadEvents(dom, fn); 11017 } 11018 loadEvents.forEach(function(evt){ 11019 dom[action](evt, fn); 11020 }); 11021 }; 11022 11023 /** 11024 * @param elem { Element } 11025 * @param name { string } 11026 * @param detail { any } 11027 * @param noBubbles { boolean } 11028 * @param noCancelable { boolean } 11029 * @returns { CustomEvent } 11030 */ 11031 var triggerEvent = function(elem, name, detail, noBubbles, noCancelable){ 11032 var event = document.createEvent('Event'); 11033 11034 if(!detail){ 11035 detail = {}; 11036 } 11037 11038 detail.instance = lazysizes; 11039 11040 event.initEvent(name, !noBubbles, !noCancelable); 11041 11042 event.detail = detail; 11043 11044 elem.dispatchEvent(event); 11045 return event; 11046 }; 11047 11048 var updatePolyfill = function (el, full){ 11049 var polyfill; 11050 if( !supportPicture && ( polyfill = (window.picturefill || lazySizesCfg.pf) ) ){ 11051 if(full && full.src && !el[_getAttribute]('srcset')){ 11052 el.setAttribute('srcset', full.src); 11053 } 11054 polyfill({reevaluate: true, elements: [el]}); 11055 } else if(full && full.src){ 11056 el.src = full.src; 11057 } 11058 }; 11059 11060 var getCSS = function (elem, style){ 11061 return (getComputedStyle(elem, null) || {})[style]; 11062 }; 11063 11064 /** 11065 * 11066 * @param elem { Element } 11067 * @param parent { Element } 11068 * @param [width] {number} 11069 * @returns {number} 11070 */ 11071 var getWidth = function(elem, parent, width){ 11072 width = width || elem.offsetWidth; 11073 11074 while(width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth){ 11075 width = parent.offsetWidth; 11076 parent = parent.parentNode; 11077 } 11078 11079 return width; 11080 }; 11081 11082 var rAF = (function(){ 11083 var running, waiting; 11084 var firstFns = []; 11085 var secondFns = []; 11086 var fns = firstFns; 11087 11088 var run = function(){ 11089 var runFns = fns; 11090 11091 fns = firstFns.length ? secondFns : firstFns; 11092 11093 running = true; 11094 waiting = false; 11095 11096 while(runFns.length){ 11097 runFns.shift()(); 11098 } 11099 11100 running = false; 11101 }; 11102 11103 var rafBatch = function(fn, queue){ 11104 if(running && !queue){ 11105 fn.apply(this, arguments); 11106 } else { 11107 fns.push(fn); 11108 11109 if(!waiting){ 11110 waiting = true; 11111 (document.hidden ? setTimeout : requestAnimationFrame)(run); 11112 } 11113 } 11114 }; 11115 11116 rafBatch._lsFlush = run; 11117 11118 return rafBatch; 11119 })(); 11120 11121 var rAFIt = function(fn, simple){ 11122 return simple ? 11123 function() { 11124 rAF(fn); 11125 } : 11126 function(){ 11127 var that = this; 11128 var args = arguments; 11129 rAF(function(){ 11130 fn.apply(that, args); 11131 }); 11132 } 11133 ; 11134 }; 11135 11136 var throttle = function(fn){ 11137 var running; 11138 var lastTime = 0; 11139 var gDelay = lazySizesCfg.throttleDelay; 11140 var rICTimeout = lazySizesCfg.ricTimeout; 11141 var run = function(){ 11142 running = false; 11143 lastTime = Date.now(); 11144 fn(); 11145 }; 11146 var idleCallback = requestIdleCallback && rICTimeout > 49 ? 11147 function(){ 11148 requestIdleCallback(run, {timeout: rICTimeout}); 11149 11150 if(rICTimeout !== lazySizesCfg.ricTimeout){ 11151 rICTimeout = lazySizesCfg.ricTimeout; 11152 } 11153 } : 11154 rAFIt(function(){ 11155 setTimeout(run); 11156 }, true) 11157 ; 11158 11159 return function(isPriority){ 11160 var delay; 11161 11162 if((isPriority = isPriority === true)){ 11163 rICTimeout = 33; 11164 } 11165 11166 if(running){ 11167 return; 11168 } 11169 11170 running = true; 11171 11172 delay = gDelay - (Date.now() - lastTime); 11173 11174 if(delay < 0){ 11175 delay = 0; 11176 } 11177 11178 if(isPriority || delay < 9){ 11179 idleCallback(); 11180 } else { 11181 setTimeout(idleCallback, delay); 11182 } 11183 }; 11184 }; 11185 11186 //based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html 11187 var debounce = function(func) { 11188 var timeout, timestamp; 11189 var wait = 99; 11190 var run = function(){ 11191 timeout = null; 11192 func(); 11193 }; 11194 var later = function() { 11195 var last = Date.now() - timestamp; 11196 11197 if (last < wait) { 11198 setTimeout(later, wait - last); 11199 } else { 11200 (requestIdleCallback || run)(run); 11201 } 11202 }; 11203 11204 return function() { 11205 timestamp = Date.now(); 11206 11207 if (!timeout) { 11208 timeout = setTimeout(later, wait); 11209 } 11210 }; 11211 }; 11212 11213 var loader = (function(){ 11214 var preloadElems, isCompleted, resetPreloadingTimer, loadMode, started; 11215 11216 var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden; 11217 11218 var regImg = /^img$/i; 11219 var regIframe = /^iframe$/i; 11220 11221 var supportScroll = ('onscroll' in window) && !(/(gle|ing)bot/.test(navigator.userAgent)); 11222 11223 var shrinkExpand = 0; 11224 var currentExpand = 0; 11225 11226 var isLoading = 0; 11227 var lowRuns = -1; 11228 11229 var resetPreloading = function(e){ 11230 isLoading--; 11231 if(!e || isLoading < 0 || !e.target){ 11232 isLoading = 0; 11233 } 11234 }; 11235 11236 var isVisible = function (elem) { 11237 if (isBodyHidden == null) { 11238 isBodyHidden = getCSS(document.body, 'visibility') == 'hidden'; 11239 } 11240 11241 return isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden'); 11242 }; 11243 11244 var isNestedVisible = function(elem, elemExpand){ 11245 var outerRect; 11246 var parent = elem; 11247 var visible = isVisible(elem); 11248 11249 eLtop -= elemExpand; 11250 eLbottom += elemExpand; 11251 eLleft -= elemExpand; 11252 eLright += elemExpand; 11253 11254 while(visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem){ 11255 visible = ((getCSS(parent, 'opacity') || 1) > 0); 11256 11257 if(visible && getCSS(parent, 'overflow') != 'visible'){ 11258 outerRect = parent.getBoundingClientRect(); 11259 visible = eLright > outerRect.left && 11260 eLleft < outerRect.right && 11261 eLbottom > outerRect.top - 1 && 11262 eLtop < outerRect.bottom + 1 11263 ; 11264 } 11265 } 11266 11267 return visible; 11268 }; 11269 11270 var checkElements = function() { 11271 var eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, 11272 beforeExpandVal, defaultExpand, preloadExpand, hFac; 11273 var lazyloadElems = lazysizes.elements; 11274 11275 if((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)){ 11276 11277 i = 0; 11278 11279 lowRuns++; 11280 11281 for(; i < eLlen; i++){ 11282 11283 if(!lazyloadElems[i] || lazyloadElems[i]._lazyRace){continue;} 11284 11285 if(!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))){unveilElement(lazyloadElems[i]);continue;} 11286 11287 if(!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)){ 11288 elemExpand = currentExpand; 11289 } 11290 11291 if (!defaultExpand) { 11292 defaultExpand = (!lazySizesCfg.expand || lazySizesCfg.expand < 1) ? 11293 docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370 : 11294 lazySizesCfg.expand; 11295 11296 lazysizes._defEx = defaultExpand; 11297 11298 preloadExpand = defaultExpand * lazySizesCfg.expFactor; 11299 hFac = lazySizesCfg.hFac; 11300 isBodyHidden = null; 11301 11302 if(currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden){ 11303 currentExpand = preloadExpand; 11304 lowRuns = 0; 11305 } else if(loadMode > 1 && lowRuns > 1 && isLoading < 6){ 11306 currentExpand = defaultExpand; 11307 } else { 11308 currentExpand = shrinkExpand; 11309 } 11310 } 11311 11312 if(beforeExpandVal !== elemExpand){ 11313 eLvW = innerWidth + (elemExpand * hFac); 11314 elvH = innerHeight + elemExpand; 11315 elemNegativeExpand = elemExpand * -1; 11316 beforeExpandVal = elemExpand; 11317 } 11318 11319 rect = lazyloadElems[i].getBoundingClientRect(); 11320 11321 if ((eLbottom = rect.bottom) >= elemNegativeExpand && 11322 (eLtop = rect.top) <= elvH && 11323 (eLright = rect.right) >= elemNegativeExpand * hFac && 11324 (eLleft = rect.left) <= eLvW && 11325 (eLbottom || eLright || eLleft || eLtop) && 11326 (lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) && 11327 ((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))){ 11328 unveilElement(lazyloadElems[i]); 11329 loadedSomething = true; 11330 if(isLoading > 9){break;} 11331 } else if(!loadedSomething && isCompleted && !autoLoadElem && 11332 isLoading < 4 && lowRuns < 4 && loadMode > 2 && 11333 (preloadElems[0] || lazySizesCfg.preloadAfterLoad) && 11334 (preloadElems[0] || (!elemExpandVal && ((eLbottom || eLright || eLleft || eLtop) || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))){ 11335 autoLoadElem = preloadElems[0] || lazyloadElems[i]; 11336 } 11337 } 11338 11339 if(autoLoadElem && !loadedSomething){ 11340 unveilElement(autoLoadElem); 11341 } 11342 } 11343 }; 11344 11345 var throttledCheckElements = throttle(checkElements); 11346 11347 var switchLoadingClass = function(e){ 11348 var elem = e.target; 11349 11350 if (elem._lazyCache) { 11351 delete elem._lazyCache; 11352 return; 11353 } 11354 11355 resetPreloading(e); 11356 addClass(elem, lazySizesCfg.loadedClass); 11357 removeClass(elem, lazySizesCfg.loadingClass); 11358 addRemoveLoadEvents(elem, rafSwitchLoadingClass); 11359 triggerEvent(elem, 'lazyloaded'); 11360 }; 11361 var rafedSwitchLoadingClass = rAFIt(switchLoadingClass); 11362 var rafSwitchLoadingClass = function(e){ 11363 rafedSwitchLoadingClass({target: e.target}); 11364 }; 11365 11366 var changeIframeSrc = function(elem, src){ 11367 var loadMode = elem.getAttribute('data-load-mode') || lazySizesCfg.iframeLoadMode; 11368 11369 // loadMode can be also a string! 11370 if (loadMode == 0) { 11371 elem.contentWindow.location.replace(src); 11372 } else if (loadMode == 1) { 11373 elem.src = src; 11374 } 11375 }; 11376 11377 var handleSources = function(source){ 11378 var customMedia; 11379 11380 var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr); 11381 11382 if( (customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')]) ){ 11383 source.setAttribute('media', customMedia); 11384 } 11385 11386 if(sourceSrcset){ 11387 source.setAttribute('srcset', sourceSrcset); 11388 } 11389 }; 11390 11391 var lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg){ 11392 var src, srcset, parent, isPicture, event, firesLoad; 11393 11394 if(!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented){ 11395 11396 if(sizes){ 11397 if(isAuto){ 11398 addClass(elem, lazySizesCfg.autosizesClass); 11399 } else { 11400 elem.setAttribute('sizes', sizes); 11401 } 11402 } 11403 11404 srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr); 11405 src = elem[_getAttribute](lazySizesCfg.srcAttr); 11406 11407 if(isImg) { 11408 parent = elem.parentNode; 11409 isPicture = parent && regPicture.test(parent.nodeName || ''); 11410 } 11411 11412 firesLoad = detail.firesLoad || (('src' in elem) && (srcset || src || isPicture)); 11413 11414 event = {target: elem}; 11415 11416 addClass(elem, lazySizesCfg.loadingClass); 11417 11418 if(firesLoad){ 11419 clearTimeout(resetPreloadingTimer); 11420 resetPreloadingTimer = setTimeout(resetPreloading, 2500); 11421 addRemoveLoadEvents(elem, rafSwitchLoadingClass, true); 11422 } 11423 11424 if(isPicture){ 11425 forEach.call(parent.getElementsByTagName('source'), handleSources); 11426 } 11427 11428 if(srcset){ 11429 elem.setAttribute('srcset', srcset); 11430 } else if(src && !isPicture){ 11431 if(regIframe.test(elem.nodeName)){ 11432 changeIframeSrc(elem, src); 11433 } else { 11434 elem.src = src; 11435 } 11436 } 11437 11438 if(isImg && (srcset || isPicture)){ 11439 updatePolyfill(elem, {src: src}); 11440 } 11441 } 11442 11443 if(elem._lazyRace){ 11444 delete elem._lazyRace; 11445 } 11446 removeClass(elem, lazySizesCfg.lazyClass); 11447 11448 rAF(function(){ 11449 // Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015) 11450 var isLoaded = elem.complete && elem.naturalWidth > 1; 11451 11452 if( !firesLoad || isLoaded){ 11453 if (isLoaded) { 11454 addClass(elem, lazySizesCfg.fastLoadedClass); 11455 } 11456 switchLoadingClass(event); 11457 elem._lazyCache = true; 11458 setTimeout(function(){ 11459 if ('_lazyCache' in elem) { 11460 delete elem._lazyCache; 11461 } 11462 }, 9); 11463 } 11464 if (elem.loading == 'lazy') { 11465 isLoading--; 11466 } 11467 }, true); 11468 }); 11469 11470 /** 11471 * 11472 * @param elem { Element } 11473 */ 11474 var unveilElement = function (elem){ 11475 if (elem._lazyRace) {return;} 11476 var detail; 11477 11478 var isImg = regImg.test(elem.nodeName); 11479 11480 //allow using sizes="auto", but don't use. it's invalid. Use data-sizes="auto" or a valid value for sizes instead (i.e.: sizes="80vw") 11481 var sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes')); 11482 var isAuto = sizes == 'auto'; 11483 11484 if( (isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)){return;} 11485 11486 detail = triggerEvent(elem, 'lazyunveilread').detail; 11487 11488 if(isAuto){ 11489 autoSizer.updateElem(elem, true, elem.offsetWidth); 11490 } 11491 11492 elem._lazyRace = true; 11493 isLoading++; 11494 11495 lazyUnveil(elem, detail, isAuto, sizes, isImg); 11496 }; 11497 11498 var afterScroll = debounce(function(){ 11499 lazySizesCfg.loadMode = 3; 11500 throttledCheckElements(); 11501 }); 11502 11503 var altLoadmodeScrollListner = function(){ 11504 if(lazySizesCfg.loadMode == 3){ 11505 lazySizesCfg.loadMode = 2; 11506 } 11507 afterScroll(); 11508 }; 11509 11510 var onload = function(){ 11511 if(isCompleted){return;} 11512 if(Date.now() - started < 999){ 11513 setTimeout(onload, 999); 11514 return; 11515 } 11516 11517 11518 isCompleted = true; 11519 11520 lazySizesCfg.loadMode = 3; 11521 11522 throttledCheckElements(); 11523 11524 addEventListener('scroll', altLoadmodeScrollListner, true); 11525 }; 11526 11527 return { 11528 _: function(){ 11529 started = Date.now(); 11530 11531 lazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass); 11532 preloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass); 11533 11534 addEventListener('scroll', throttledCheckElements, true); 11535 11536 addEventListener('resize', throttledCheckElements, true); 11537 11538 addEventListener('pageshow', function (e) { 11539 if (e.persisted) { 11540 var loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass); 11541 11542 if (loadingElements.length && loadingElements.forEach) { 11543 requestAnimationFrame(function () { 11544 loadingElements.forEach( function (img) { 11545 if (img.complete) { 11546 unveilElement(img); 11547 } 11548 }); 11549 }); 11550 } 11551 } 11552 }); 11553 11554 if(window.MutationObserver){ 11555 new MutationObserver( throttledCheckElements ).observe( docElem, {childList: true, subtree: true, attributes: true} ); 11556 } else { 11557 docElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true); 11558 docElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true); 11559 setInterval(throttledCheckElements, 999); 11560 } 11561 11562 addEventListener('hashchange', throttledCheckElements, true); 11563 11564 //, 'fullscreenchange' 11565 ['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function(name){ 11566 document[_addEventListener](name, throttledCheckElements, true); 11567 }); 11568 11569 if((/d$|^c/.test(document.readyState))){ 11570 onload(); 11571 } else { 11572 addEventListener('load', onload); 11573 document[_addEventListener]('DOMContentLoaded', throttledCheckElements); 11574 setTimeout(onload, 20000); 11575 } 11576 11577 if(lazysizes.elements.length){ 11578 checkElements(); 11579 rAF._lsFlush(); 11580 } else { 11581 throttledCheckElements(); 11582 } 11583 }, 11584 checkElems: throttledCheckElements, 11585 unveil: unveilElement, 11586 _aLSL: altLoadmodeScrollListner, 11587 }; 11588 })(); 11589 11590 11591 var autoSizer = (function(){ 11592 var autosizesElems; 11593 11594 var sizeElement = rAFIt(function(elem, parent, event, width){ 11595 var sources, i, len; 11596 elem._lazysizesWidth = width; 11597 width += 'px'; 11598 11599 elem.setAttribute('sizes', width); 11600 11601 if(regPicture.test(parent.nodeName || '')){ 11602 sources = parent.getElementsByTagName('source'); 11603 for(i = 0, len = sources.length; i < len; i++){ 11604 sources[i].setAttribute('sizes', width); 11605 } 11606 } 11607 11608 if(!event.detail.dataAttr){ 11609 updatePolyfill(elem, event.detail); 11610 } 11611 }); 11612 /** 11613 * 11614 * @param elem {Element} 11615 * @param dataAttr 11616 * @param [width] { number } 11617 */ 11618 var getSizeElement = function (elem, dataAttr, width){ 11619 var event; 11620 var parent = elem.parentNode; 11621 11622 if(parent){ 11623 width = getWidth(elem, parent, width); 11624 event = triggerEvent(elem, 'lazybeforesizes', {width: width, dataAttr: !!dataAttr}); 11625 11626 if(!event.defaultPrevented){ 11627 width = event.detail.width; 11628 11629 if(width && width !== elem._lazysizesWidth){ 11630 sizeElement(elem, parent, event, width); 11631 } 11632 } 11633 } 11634 }; 11635 11636 var updateElementsSizes = function(){ 11637 var i; 11638 var len = autosizesElems.length; 11639 if(len){ 11640 i = 0; 11641 11642 for(; i < len; i++){ 11643 getSizeElement(autosizesElems[i]); 11644 } 11645 } 11646 }; 11647 11648 var debouncedUpdateElementsSizes = debounce(updateElementsSizes); 11649 11650 return { 11651 _: function(){ 11652 autosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass); 11653 addEventListener('resize', debouncedUpdateElementsSizes); 11654 }, 11655 checkElems: debouncedUpdateElementsSizes, 11656 updateElem: getSizeElement 11657 }; 11658 })(); 11659 11660 var init = function(){ 11661 if(!init.i && document.getElementsByClassName){ 11662 init.i = true; 11663 autoSizer._(); 11664 loader._(); 11665 } 11666 }; 11667 11668 setTimeout(function(){ 11669 if(lazySizesCfg.init){ 11670 init(); 11671 } 11672 }); 11673 11674 lazysizes = { 11675 /** 11676 * @type { LazySizesConfigPartial } 11677 */ 11678 cfg: lazySizesCfg, 11679 autoSizer: autoSizer, 11680 loader: loader, 11681 init: init, 11682 uP: updatePolyfill, 11683 aC: addClass, 11684 rC: removeClass, 11685 hC: hasClass, 11686 fire: triggerEvent, 11687 gW: getWidth, 11688 rAF: rAF, 11689 }; 11690 11691 return lazysizes; 11692} 11693));
11694 11695 11696/***/ }), 11697 11698/***/ 5222: 11699/***/ (function(module, exports, __webpack_require__) { 11700 11701var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/* 11702This lazySizes extension adds better support for print. 11703In case the user starts to print lazysizes will load all images. 11704*/ 11705(function(window, factory) { 11706 var globalInstall = function(){ 11707 factory(window.lazySizes); 11708 window.removeEventListener('lazyunveilread', globalInstall, true); 11709 }; 11710 11711 factory = factory.bind(null, window, window.document); 11712 11713 if( true && module.exports){ 11714 factory(__webpack_require__(7090)); 11715 } else if (true) { 11716 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(7090)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 11717 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 11718 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 11719 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 11720 } else {} 11721}(window, function(window, document, lazySizes) { 11722 /*jshint eqnull:true */ 11723 'use strict'; 11724 var config, elements, onprint, printMedia; 11725 // see also: http://tjvantoll.com/2012/06/15/detecting-print-requests-with-javascript/ 11726 if(window.addEventListener){ 11727 config = lazySizes && lazySizes.cfg; 11728 elements = config.lazyClass || 'lazyload'; 11729 onprint = function(){ 11730 var i, len; 11731 if(typeof elements == 'string'){ 11732 elements = document.getElementsByClassName(elements); 11733 } 11734 11735 if(lazySizes){ 11736 for(i = 0, len = elements.length; i < len; i++){ 11737 lazySizes.loader.unveil(elements[i]); 11738 } 11739 } 11740 }; 11741 11742 addEventListener('beforeprint', onprint, false); 11743 11744 if(!('onbeforeprint' in window) && window.matchMedia && (printMedia = matchMedia('print')) && printMedia.addListener){ 11745 printMedia.addListener(function(){ 11746 if(printMedia.matches){ 11747 onprint(); 11748 } 11749 }); 11750 } 11751 } 11752})); 11753 11754 11755/***/ }) 11756 11757/******/ }); 11758/************************************************************************/ 11759/******/ // The module cache 11760/******/ var __webpack_module_cache__ = {}; 11761/******/ 11762/******/ // The require function 11763/******/ function __webpack_require__(moduleId) { 11764/******/ // Check if module is in cache 11765/******/ var cachedModule = __webpack_module_cache__[moduleId]; 11766/******/ if (cachedModule !== undefined) { 11767/******/ return cachedModule.exports; 11768/******/ } 11769/******/ // Create a new module (and put it into the cache) 11770/******/ var module = __webpack_module_cache__[moduleId] = { 11771/******/ // no module.id needed 11772/******/ // no module.loaded needed 11773/******/ exports: {} 11774/******/ }; 11775/******/ 11776/******/ // Execute the module function 11777/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 11778/******/ 11779/******/ // Return the exports of the module 11780/******/ return module.exports; 11781/******/ } 11782/******/ 11783/************************************************************************/ 11784/******/ /* webpack/runtime/compat get default export */ 11785/******/ !function() { 11786/******/ // getDefaultExport function for compatibility with non-harmony modules 11787/******/ __webpack_require__.n = function(module) {
11788/******/ var getter = module && module.__esModule ? 11789/******/ function() { return module['default']; } : 11790/******/ function() { return module; }; 11791/******/ __webpack_require__.d(getter, { a: getter }); 11792/******/ return getter; 11793/******/ }; 11794/******/ }(); 11795/******/ 11796/******/ /* webpack/runtime/define property getters */ 11797/******/ !function() { 11798/******/ // define getter functions for harmony exports 11799/******/ __webpack_require__.d = function(exports, definition) { 11800/******/ for(var key in definition) { 11801/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 11802/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 11803/******/ } 11804/******/ } 11805/******/ }; 11806/******/ }(); 11807/******/ 11808/******/ /* webpack/runtime/hasOwnProperty shorthand */ 11809/******/ !function() { 11810/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } 11811/******/ }(); 11812/******/ 11813/************************************************************************/ 11814var __webpack_exports__ = {}; 11815// This entry need to be wrapped in an IIFE because it need to be in strict mode. 11816!function() { 11817"use strict"; 11818 11819// EXTERNAL MODULE: ./node_modules/lazysizes/lazysizes.js 11820var lazysizes = __webpack_require__(7090); 11821var lazysizes_default = /*#__PURE__*/__webpack_require__.n(lazysizes); 11822// EXTERNAL MODULE: ./node_modules/lazysizes/plugins/print/ls.print.js 11823var ls_print = __webpack_require__(5222); 11824;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/earlyLoaded/lazyload/lazyload.early.js 11825 11826 11827lazysizes_default().init(); 11828console.log('lazyloading initialised immediate'); 11829;// CONCATENATED MODULE: external "$" 11830var external_$_namespaceObject = $; 11831var external_$_default = /*#__PURE__*/__webpack_require__.n(external_$_namespaceObject); 11832;// CONCATENATED MODULE: ./src/js/earlyLoaded/scriptUnblocker/scriptUnblocker.early.js 11833function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } 11834 11835function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } 11836 11837function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } 11838 11839function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } 11840 11841function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } 11842 11843function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 11844 11845 11846 11847function unblockScript(names) { 11848 names.forEach(function (name) { 11849 // die Variable "sitepackage_base_js_path" wird vom Backend mit einem <script> via TypoScript bereitgestellt 11850 var path = sitepackage_base_js_path; // jshint ignore:line 11851 // only load the scripts once!!! 11852 11853 if (external_$_default()('script[src="' + path + name + '.js"]').length > 0) { 11854 return; 11855 } 11856 11857 var script = document.createElement('script'); 11858 script.src = path + name + '.js'; 11859 document.head.appendChild(script); 11860 }); 11861} 11862/** 11863 * Init on DOM ready 11864 */ 11865 11866 11867external_$_default().when((external_$_default()).ready).then(function () {
11868 // todo: if dependency on jquery causes problems remove jquery 11869 var contentObjects = { 11870 '.f-form': ['form'], 11871 '[data-parsley-validate]': ['formOptions'], 11872 '.f-form--ajax-submit': ['formOptions'], 11873 '.f-field[data-condition]': ['formOptions'], 11874 '.f-form--floating-labels': ['formOptions'], 11875 '.f-form--save-data': ['formOptions'], 11876 '.js-datepicker': ['datepicker'], 11877 '.tx_solr': ['solr'], 11878 '.headerSearchSolr': ['solr'], 11879 '.m-tab': ['tabs'], 11880 '.imageComparisonSlider': ['imageComparisonSlider'], 11881 '.counterTeaser': ['counterTeaser'], 11882 '.figure[data-lightbox]': ['lightBox'], 11883 '.coPopup': ['lightBox'], 11884 '.js-open-popupFilter': ['lightBox'], 11885 '.shopBasketTeaser': ['lightBox'], 11886 // '.locationMap': ['vendors~locationMap~simpleMap', 'locationMap'], 11887 '.mapOsmSimple': ['simpleMap'], 11888 '.thumbnailSlider': ['sliderComponents'], 11889 '.m-stage': ['sliderComponents'], 11890 '.gallery--slider': ['sliderComponents'], 11891 '.m-slider': ['sliderComponents'], 11892 '.video': ['video'], 11893 '.iframe': ['iframe'], 11894 '.coWwt3_shop_step_nav, [data-cart-counter]': ['shopComponents'], 11895 '.shopBasket': ['shopComponents'], 11896 '.orderPanel': ['shopComponents'], 11897 '.miniOrderPanel': ['shopComponents'] 11898 }; 11899 11900 for (var _i = 0, _Object$entries = Object.entries(contentObjects); _i < _Object$entries.length; _i++) { 11901 var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), 11902 key = _Object$entries$_i[0], 11903 value = _Object$entries$_i[1]; 11904 11905 if (external_$_default()(key).length > 0) { 11906 unblockScript(value); 11907 } 11908 } 11909}); 11910;// CONCATENATED MODULE: ./src/js/_imports/earlyLoaded.js 11911 11912 11913}(); 11914/******/ })() 11915; 11916/******/ (function() { // webpackBootstrap 11917/******/ "use strict"; 11918var __webpack_exports__ = {}; 11919 11920;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/core/config.core.js 11921// Keep in sync with breakpoints in sass/_variables.scss 11922var breakpoints = { 11923 base: 0, 11924 mobile: 320, 11925 phablet: 540, 11926 tablet: 740, 11927 desktop: 980, 11928 mainNavigation: 980, 11929 wide: 1200, 11930 slider: 1280, 11931 extraordinary: 1400 11932}; // Keep in sync with transitions in sass/_variables.scss 11933 11934var speed = { 11935 instant: 5, 11936 fast: 100, 11937 normal: 300, 11938 slow: 700, 11939 sluggish: 1200 11940}; // todo @skm: ist this the right place for this? copied from gf-023... 11941 11942if ("ontouchstart" in document.documentElement) { 11943 var root = document.getElementsByTagName('html')[0]; // '0' to assign the first (and only `HTML` tag) 11944 11945 root.className += ' touch-device'; 11946} 11947 11948window.addEventListener('beforeprint', function () { 11949 window.scrollTo(0, 0); 11950}); 11951;// CONCATENATED MODULE: ./src/js/_imports/core.js 11952 11953 11954 11955 11956/******/ })() 11957; 11958/******/ (function() { // webpackBootstrap 11959/******/ var __webpack_modules__ = ({ 11960 11961/***/ 7669: 11962/***/ (function(module) { 11963 11964;(function(window){ 11965 var hadGlobal = 'Modernizr' in window; 11966 var oldGlobal = window.Modernizr; 11967 /*! modernizr 3.12.0 (Custom Build) | MIT * 11968 * https://modernizr.com/download/?-objectfit-setclasses !*/ 11969!function(e,n,t,r){function o(e,n){return typeof e===n}function i(e,n){return!!~(""+e).indexOf(n)}function s(){return"function"!=typeof t.createElement?t.createElement(arguments[0]):S?t.createElementNS.call(t,"http://www.w3.org/2000/svg",arguments[0]):t.createElement.apply(t,arguments)}function l(){var e=t.body;return e||(e=s(S?"svg":"body"),e.fake=!0),e}function a(e,n,r,o){var i,a,f,u,p="modernizr",c=s("div"),d=l();if(parseInt(r,10))for(;r--;)f=s("div"),f.id=o?o[r]:p+(r+1),c.appendChild(f);return i=s("style"),i.type="text/css",i.id="s"+p,(d.fake?d:c).appendChild(i),d.appendChild(c),i.styleSheet?i.styleSheet.cssText=e:i.appendChild(t.createTextNode(e)),c.id=p,d.fake&&(d.style.background="",d.style.overflow="hidden",u=w.style.overflow,w.style.overflow="hidden",w.appendChild(d)),a=n(c,e),d.fake&&d.parentNode?(d.parentNode.removeChild(d),w.style.overflow=u,w.offsetHeight):c.parentNode.removeChild(c),!!a}function f(e){return e.replace(/([A-Z])/g,function(e,n){return"-"+n.toLowerCase()}).replace(/^ms-/,"-ms-")}function u(e,t,r){var o;if("getComputedStyle"in n){o=getComputedStyle.call(n,e,t);var i=n.console;if(null!==o)r&&(o=o.getPropertyValue(r));else if(i){var s=i.error?"error":"log";i[s].call(i,"getComputedStyle returning null, its possible modernizr test results are inaccurate")}}else o=!t&&e.currentStyle&&e.currentStyle[r];return o}function p(e,t){var o=e.length;if("CSS"in n&&"supports"in n.CSS){for(;o--;)if(n.CSS.supports(f(e[o]),t))return!0;return!1}if("CSSSupportsRule"in n){for(var i=[];o--;)i.push("("+f(e[o])+":"+t+")");return i=i.join(" or "),a("@supports ("+i+") { #modernizr { position: absolute; } }",function(e){return"absolute"===u(e,null,"position")})}return r}function c(e){return e.replace(/([a-z])-([a-z])/g,function(e,n,t){return n+t.toUpperCase()}).replace(/^-/,"")}function d(e,n,t,l){function a(){u&&(delete E.style,delete E.modElem)}if(l=!o(l,"undefined")&&l,!o(t,"undefined")){var f=p(e,t);if(!o(f,"undefined"))return f}for(var u,d,m,v,y,h=["modernizr","tspan","samp"];!E.style&&h.length;)u=!0,E.modElem=s(h.shift()),E.style=E.modElem.style;for(m=e.length,d=0;d<m;d++)if(v=e[d],y=E.style[v],i(v,"-")&&(v=c(v)),E.style[v]!==r){if(l||o(t,"undefined"))return a(),"pfx"!==n||v;try{E.style[v]=t}catch(e){}if(E.style[v]!==y)return a(),"pfx"!==n||v}return a(),!1}function m(e,n){return function(){return e.apply(n,arguments)}}function v(e,n,t){var r;for(var i in e)if(e[i]in n)return!1===t?e[i]:(r=n[e[i]],o(r,"function")?m(r,t||n):r);return!1}function y(e,n,t,r,i){var s=e.charAt(0).toUpperCase()+e.slice(1),l=(e+" "+x.join(s+" ")+s).split(" ");return o(n,"string")||o(n,"undefined")?d(l,n,r,i):(l=(e+" "+j.join(s+" ")+s).split(" "),v(l,n,t))}var h=[],g={_version:"3.12.0",_config:{classPrefix:"",enableClasses:!0,enableJSClass:!0,usePrefixes:!0},_q:[],on:function(e,n){var t=this;setTimeout(function(){n(t[e])},0)},addTest:function(e,n,t){h.push({name:e,fn:n,options:t})},addAsyncTest:function(e){h.push({name:null,fn:e})}},Modernizr=function(){};Modernizr.prototype=g,Modernizr=new Modernizr;var C=[],w=t.documentElement,S="svg"===w.nodeName.toLowerCase(),_="Moz O ms Webkit",x=g._config.usePrefixes?_.split(" "):[];g._cssomPrefixes=x;var b={elem:s("modernizr")};Modernizr._q.push(function(){delete b.elem});var E={style:b.elem.style};Modernizr._q.unshift(function(){delete E.style});var j=g._config.usePrefixes?_.toLowerCase().split(" "):[];g._domPrefixes=j,g.testAllProps=y;var z=function(e){var t,o=prefixes.length,i=n.CSSRule;if(void 0===i)return r;if(!e)return!1;if(e=e.replace(/^@/,""),(t=e.replace(/-/g,"_").toUpperCase()+"_RULE")in i)return"@"+e;for(var s=0;s<o;s++){var l=prefixes[s];if(l.toUpperCase()+"_"+t in i)return"@-"+l.toLowerCase()+"-"+e}return!1};g.atRule=z;var N=g.prefixed=function(e,n,t){return 0===e.indexOf("@")?z(e):(-1!==e.indexOf("-")&&(e=c(e)),n?y(e,n,t):y(e,"pfx"))};Modernizr.addTest("objectfit",!!N("objectFit"),{aliases:["object-fit"]}),function(){var e,n,t,r,i,s,l;for(var a in h)if(h.hasOwnProperty(a)){if(e=[],n=h[a],n.name&&(e.push(n.name.toLowerCase()),n.options&&n.options.aliases&&n.options.aliases.length))for(t=0;t<n.options.aliases.length;t++)e.push(n.options.aliases[t].toLowerCase());for(r=o(n.fn,"function")?n.fn():n.fn,i=0;i<e.length;i++)s=e[i],l=s.split("."),1===l.length?Modernizr[l[0]]=r:(Modernizr[l[0]]&&(!Modernizr[l[0]]||Modernizr[l[0]]instanceof Boolean)||(Modernizr[l[0]]=new Boolean(Modernizr[l[0]])),Modernizr[l[0]][l[1]]=r),C.push((r?"":"no-")+l.join("-"))}}(),function(e){var n=w.className,t=Modernizr._config.classPrefix||"";if(S&&(n=n.baseVal),Modernizr._config.enableJSClass){var r=new RegExp("(^|\\s)"+t+"no-js(\\s|$)");n=n.replace(r,"$1"+t+"js$2")}Modernizr._config.enableClasses&&(e.length>0&&(n+=" "+t+e.join(" "+t)),S?w.className.baseVal=n:w.className=n)}(C),delete g.addTest,delete g.addAsyncTest;for(var P=0;P<Modernizr._q.length;P++)Modernizr._q[P]();e.Modernizr=Modernizr}(window,window,document); 11970 module.exports = window.Modernizr; 11971 if (hadGlobal) { 11972 window.Modernizr = oldGlobal; 11973 } else { 11974 delete window.Modernizr; 11975 } 11976 })(window); 11977 11978/***/ }), 11979 11980/***/ 2873: 11981/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { 11982 11983/* provided dependency */ var jQuery = __webpack_require__(3336); 11984/* 11985Copyright © 2013 Adobe Systems Incorporated. 11986 11987Licensed under the Apache License, Version 2.0 (the âLicenseâ); 11988you may not use this file except in compliance with the License. 11989You may obtain a copy of the License at 11990 11991http://www.apache.org/licenses/LICENSE-2.0 11992 11993Unless required by applicable law or agreed to in writing, softw
11993are 11994distributed under the License is distributed on an âAS ISâ BASIS, 11995WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11996See the License for the specific language governing permissions and 11997limitations under the License. 11998*/ 11999 12000/** 12001 * See <a href="http://jquery.com">http://jquery.com</a>. 12002 * @name jquery 12003 * @class 12004 * See the jQuery Library (<a href="http://jquery.com">http://jquery.com</a>) for full details. This just 12005 * documents the function and classes that are added to jQuery by this plug-in. 12006 */ 12007 12008/** 12009 * See <a href="http://jquery.com">http://jquery.com</a> 12010 * @name fn 12011 * @class 12012 * See the jQuery Library (<a href="http://jquery.com">http://jquery.com</a>) for full details. This just 12013 * documents the function and classes that are added to jQuery by this plug-in. 12014 * @memberOf jquery 12015 */ 12016 12017/** 12018 * @fileOverview accessibleMegaMenu plugin 12019 * 12020 *<p>Licensed under the Apache License, Version 2.0 (the âLicenseâ) 12021 *<br />Copyright © 2013 Adobe Systems Incorporated. 12022 *<br />Project page <a href="https://github.com/adobe-accessibility/Accessible-Mega-Menu">https://github.com/adobe-accessibility/Accessible-Mega-Menu</a> 12023 * @version 0.1 12024 * @author Michael Jordan 12025 * @requires jquery 12026 */ 12027 12028/*jslint browser: true, devel: true, plusplus: true, nomen: true */ 12029 12030/*global jQuery, window, document */ 12031(function ($, window, document) { 12032 "use strict"; 12033 12034 var pluginName = "accessibleMegaMenu", 12035 defaults = { 12036 uuidPrefix: "accessible-megamenu", 12037 // unique ID's are required to indicate aria-owns, aria-controls and aria-labelledby 12038 menuClass: "accessible-megamenu", 12039 // default css class used to define the megamenu styling 12040 topNavItemClass: "accessible-megamenu-top-nav-item", 12041 // default css class for a top-level navigation item in the megamenu 12042 panelClass: "accessible-megamenu-panel", 12043 // default css class for a megamenu panel 12044 panelGroupClass: "accessible-megamenu-panel-group", 12045 // default css class for a group of items within a megamenu panel 12046 hoverClass: "hover", 12047 // default css class for the hover state 12048 focusClass: "focus", 12049 // default css class for the focus state 12050 openClass: "open", 12051 // default css class for the open state, 12052 toggleButtonClass: "accessible-megamenu-toggle", 12053 // default css class responsive toggle button 12054 openDelay: 0, 12055 // default open delay when opening menu via mouseover 12056 closeDelay: 250, 12057 // default open delay when opening menu via mouseover 12058 openOnMouseover: true // default setting for whether menu should open on mouseover 12059 12060 }, 12061 Keyboard = { 12062 BACKSPACE: 8, 12063 COMMA: 188, 12064 DELETE: 46, 12065 DOWN: 40, 12066 END: 35, 12067 ENTER: 13, 12068 ESCAPE: 27, 12069 HOME: 36, 12070 LEFT: 37, 12071 PAGE_DOWN: 34, 12072 PAGE_UP: 33, 12073 PERIOD: 190, 12074 RIGHT: 39, 12075 SPACE: 32, 12076 TAB: 9, 12077 UP: 38, 12078 keyMap: { 12079 48: "0", 12080 49: "1", 12081 50: "2", 12082 51: "3", 12083 52: "4", 12084 53: "5", 12085 54: "6", 12086 55: "7", 12087 56: "8", 12088 57: "9", 12089 59: ";", 12090 65: "a", 12091 66: "b", 12092 67: "c", 12093 68: "d", 12094 69: "e", 12095 70: "f", 12096 71: "g", 12097 72: "h", 12098 73: "i", 12099 74: "j", 12100 75: "k", 12101 76: "l", 12102 77: "m", 12103 78: "n", 12104 79: "o", 12105 80: "p", 12106 81: "q", 12107 82: "r", 12108 83: "s", 12109 84: "t", 12110 85: "u", 12111 86: "v", 12112 87: "w", 12113 88: "x", 12114 89: "y", 12115 90: "z", 12116 96: "0", 12117 97: "1", 12118 98: "2", 12119 99: "3", 12120 100: "4", 12121 101: "5", 12122 102: "6", 12123 103: "7", 12124 104: "8", 12125 105: "9", 12126 190: "." 12127 } 12128 }, 12129 clearTimeout = window.clearTimeout, 12130 setTimeout = window.setTimeout, 12131 isOpera = window.opera && window.opera.toString() === '[object Opera]'; 12132 /** 12133 * @desc Creates a new accessible mega menu instance. 12134 * @param {jquery} element 12135 * @param {object} [options] Mega Menu options 12136 * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby 12137 * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling 12138 * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu 12139 * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel 12140 * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel 12141 * @param {string} [options.hoverClass=hover] - CSS class for the hover state 12142 * @param {string} [options.focusClass=focus] - CSS class for the focus state 12143 * @param {string} [options.openClass=open] - CSS class for the open state 12144 * @constructor 12145 */ 12146 12147 function AccessibleMegaMenu(element, options) { 12148 this.element = element; // merge optional settings and defaults into settings 12149 12150 this.settings = $.extend({}, defaults, options); 12151 this._defaults = defaults; 12152 this._name = pluginName; 12153 this.mouseTimeoutID = null; 12154 this.focusTimeoutID = null; 12155 this.mouseFocused = false;
12156 this.justFocused = false; 12157 this.init(); 12158 } 12159 12160 AccessibleMegaMenu.prototype = function () { 12161 /* private attributes and methods ------------------------ */ 12162 var uuid = 0, 12163 keydownTimeoutDuration = 1000, 12164 keydownSearchString = "", 12165 isTouch = 'ontouchstart' in window || window.navigator.msMaxTouchPoints, 12166 _getPlugin, 12167 _addUniqueId, 12168 _togglePanel, 12169 _clickHandler, 12170 _touchmoveHandler, 12171 _clickOutsideHandler, 12172 _DOMAttrModifiedHandler, 12173 _focusInHandler, 12174 _focusOutHandler, 12175 _keyDownHandler, 12176 _mouseDownHandler, 12177 _mouseOverHandler, 12178 _mouseOutHandler, 12179 _clickToggleHandler, 12180 _toggleExpandedEventHandlers, 12181 _addEventHandlers, 12182 _removeEventHandlers; 12183 /** 12184 * @name jQuery.fn.accessibleMegaMenu~_getPlugin 12185 * @desc Returns the parent accessibleMegaMenu instance for a given element 12186 * @param {jQuery} element 12187 * @memberof jQuery.fn.accessibleMegaMenu 12188 * @inner 12189 * @private 12190 */ 12191 12192 12193 _getPlugin = function _getPlugin(element) { 12194 return $(element).closest(':data(plugin_' + pluginName + ')').data("plugin_" + pluginName); 12195 }; 12196 /** 12197 * @name jQuery.fn.accessibleMegaMenu~_addUniqueId 12198 * @desc Adds a unique id and element. 12199 * The id string starts with the 12200 * string defined in settings.uuidPrefix. 12201 * @param {jQuery} element 12202 * @memberof jQuery.fn.accessibleMegaMenu 12203 * @inner 12204 * @private 12205 */ 12206 12207 12208 _addUniqueId = function _addUniqueId(element) { 12209 element = $(element); 12210 var settings = this.settings; 12211 12212 if (!element.attr("id")) { 12213 element.attr("id", settings.uuidPrefix + "-" + new Date().getTime() + "-" + ++uuid); 12214 } 12215 }; 12216 /** 12217 * @name jQuery.fn.accessibleMegaMenu~_togglePanel 12218 * @desc Toggle the display of mega menu panels in response to an event. 12219 * The optional boolean value 'hide' forces all panels to hide. 12220 * @param {event} event 12221 * @param {Boolean} [hide] Hide all mega menu panels when true 12222 * @memberof jQuery.fn.accessibleMegaMenu 12223 * @inner 12224 * @private 12225 */ 12226 12227 12228 _togglePanel = function _togglePanel(event, hide) { 12229 var target = $(event.target), 12230 that = this, 12231 settings = this.settings, 12232 menu = this.menu, 12233 topli = target.closest('.' + settings.topNavItemClass), 12234 panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass), 12235 newfocus; 12236 12237 _toggleExpandedEventHandlers.call(this, true); 12238 12239 if (hide) { 12240 topli = menu.find('.' + settings.topNavItemClass + ' .' + settings.openClass + ':first').closest('.' + settings.topNavItemClass); 12241 12242 if (!(topli.is(event.relatedTarget) || topli.has(event.relatedTarget).length > 0)) { 12243 if ((event.type === 'mouseout' || event.type === 'focusout') && topli.has(document.activeElement).length > 0) { 12244 return; 12245 } 12246 12247 topli.find('[aria-expanded]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true'); 12248 12249 if (event.type === 'keydown' && event.keyCode === Keyboard.ESCAPE || event.type === 'DOMAttrModified') { 12250 newfocus = topli.find(':tabbable:first'); 12251 setTimeout(function () { 12252 menu.find('[aria-expanded].' + that.settings.panelClass).off('DOMAttrModified.accessible-megamenu'); 12253 newfocus.focus(); 12254 that.justFocused = false; 12255 }, 99); 12256 } 12257 } else if (topli.length === 0) { 12258 menu.find('[aria-expanded=true]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true'); 12259 } 12260 } else { 12261 clearTimeout(that.focusTimeoutID); 12262 topli.siblings().find('[aria-expanded]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true'); 12263 topli.find('[aria-expanded]').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false'); 12264 var pageScrollPosition = $('html')[0].scrollTop; 12265 var $openPanel = $('.' + settings.panelClass + '.' + settings.openClass).parent(); 12266 12267 if ($openPanel.length > 0) { 12268 var openPanelTopPosition = $openPanel.offset().top; 12269 12270 if (pageScrollPosition > openPanelTopPosition) { 12271 $('html')[0].scrollTop = openPanelTopPosition; 12272 } 12273 } 12274 12275 if (event.type === 'mouseover' && target.is(':tabbable') && topli.length === 1 && panel.length === 0 && menu.has(document.activeElement).length > 0) {
12276 target.focus(); 12277 that.justFocused = false; 12278 } 12279 12280 _toggleExpandedEventHandlers.call(that); 12281 } 12282 }; 12283 /** 12284 * @name jQuery.fn.accessibleMegaMenu~_clickHandler 12285 * @desc Handle click event on mega menu item 12286 * @param {event} Event object 12287 * @memberof jQuery.fn.accessibleMegaMenu 12288 * @inner 12289 * @private 12290 */ 12291 12292 12293 _clickHandler = function _clickHandler(event) { 12294 var target = $(event.target).closest(':tabbable'), 12295 topli = target.closest('.' + this.settings.topNavItemClass), 12296 panel = target.closest('.' + this.settings.panelClass); 12297 12298 if (topli.length === 1 && panel.length === 0 && topli.find('.' + this.settings.panelClass).length === 1) { 12299 if (!target.hasClass(this.settings.openClass)) { 12300 event.preventDefault(); 12301 event.stopPropagation(); 12302 12303 _togglePanel.call(this, event); 12304 12305 this.justFocused = false; 12306 } else { 12307 if (this.justFocused) { 12308 event.preventDefault(); 12309 event.stopPropagation(); 12310 this.justFocused = false; 12311 } else if (isTouch || !isTouch && !this.settings.openOnMouseover) { 12312 event.preventDefault(); 12313 event.stopPropagation(); 12314 12315 _togglePanel.call(this, event, target.hasClass(this.settings.openClass)); 12316 } 12317 } 12318 } 12319 }; 12320 /** 12321 * @name jQuery.fn.accessibleMegaMenu~_touchmoveHandler 12322 * @desc Handle touch move event on menu 12323 * @memberof jQuery.fn.accessibleMegaMenu 12324 * @inner 12325 * @private 12326 */ 12327 12328 12329 _touchmoveHandler = function _touchmoveHandler() { 12330 this.justMoved = true; 12331 }; 12332 /** 12333 * @name jQuery.fn.accessibleMegaMenu~_clickOutsideHandler 12334 * @desc Handle click event outside of a the megamenu 12335 * @param {event} Event object 12336 * @memberof jQuery.fn.accessibleMegaMenu 12337 * @inner 12338 * @private 12339 */ 12340 12341 12342 _clickOutsideHandler = function _clickOutsideHandler(event) { 12343 if ($(event.target).closest(this.menu).length === 0) { 12344 event.preventDefault(); 12345 event.stopPropagation(); 12346 12347 _togglePanel.call(this, event, true); 12348 } 12349 }; 12350 /** 12351 * @name jQuery.fn.accessibleMegaMenu~_DOMAttrModifiedHandler 12352 * @desc Handle DOMAttrModified event on panel to respond to Windows 8 Narrator ExpandCollapse pattern 12353 * @param {event} Event object 12354 * @memberof jQuery.fn.accessibleMegaMenu 12355 * @inner 12356 * @private 12357 */ 12358 12359 12360 _DOMAttrModifiedHandler = function _DOMAttrModifiedHandler(event) { 12361 if (event.originalEvent.attrName === 'aria-expanded' && event.originalEvent.newValue === 'false' && $(event.target).hasClass(this.settings.openClass)) { 12362 event.preventDefault(); 12363 event.stopPropagation(); 12364 12365 _togglePanel.call(this, event, true); 12366 } 12367 }; 12368 /** 12369 * @name jQuery.fn.accessibleMegaMenu~_focusInHandler 12370 * @desc Handle focusin event on mega menu item. 12371 * @param {event} Event object 12372 * @memberof jQuery.fn.accessibleMegaMenu 12373 * @inner 12374 * @private 12375 */ 12376 12377 12378 _focusInHandler = function _focusInHandler(event) { 12379 clearTimeout(this.focusTimeoutID); 12380 var target = $(event.target), 12381 panel = target.closest('.' + this.settings.panelClass); 12382 target.addClass(this.settings.focusClass); 12383 this.justFocused = !this.mouseFocused || !this.settings.openOnMouseover && this.mouseFocused; 12384 this.mouseFocused = false; 12385 12386 if (this.justFocused && this.panels.not(panel).filter('.' + this.settings.openClass).length) { 12387 _togglePanel.call(this, event); 12388 } 12389 }; 12390 /** 12391 * @name jQuery.fn.accessibleMegaMenu~_focusOutHandler 12392 * @desc Handle focusout event on mega menu item. 12393 * @param {event} Event object 12394 * @memberof jQuery.fn.accessibleMegaMenu 12395 * @inner 12396 * @private 12397 */ 12398 12399 12400 _focusOutHandler = function _focusOutHandler(event) { 12401 this.justFocused = false; 12402 var that = this, 12403 target = $(event.target), 12404 topli = target.closest('.' + this.settings.topNavItemClass); 12405 target.removeClass(this.settings.focusClass); 12406 12407 if (window.cvox) { 12408 // If ChromeVox is running... 12409 that.focusTimeoutID = setTimeout(function () { 12410 window.cvox.Api.getCurrentNode(function (node) { 12411 if (topli.has(node).length) { 12412 // and the current node being voiced is in 12413 // the mega menu, clearTimeout, 12414 // so the panel stays open. 12415 clearTimeout(that.focusTimeoutID); 12416 } else { 12417 that.focusTimeoutID = setTimeout(function (scope, event, hide) { 12418 _togglePanel.call(scope, event, hide); 12419 }, 275, that, event, true); 12420 } 12421 }); 12422 }, 25); 12423 } else { 12424 that.focusTimeoutID = setTimeout(function () { 12425 if (that.mouseFocused && event.relatedTarget === null) { 12426 return; 12427 } 12428 12429 _togglePanel.call(that, event, true); 12430 }, 300); 12431 } 12432 }; 12433 /** 12434 * @name jQuery.fn.accessibleMegaMenu~_keyDownHandler
12435 * @desc Handle keydown event on mega menu. 12436 * @param {event} Event object 12437 * @memberof jQuery.fn.accessibleMegaMenu 12438 * @inner 12439 * @private 12440 */ 12441 12442 12443 _keyDownHandler = function _keyDownHandler(event) { 12444 var that = this.constructor === AccessibleMegaMenu ? this : _getPlugin(this), 12445 // determine the AccessibleMegaMenu plugin instance 12446 settings = that.settings, 12447 target = $($(this).is('.' + settings.hoverClass + ':tabbable') ? this : event.target), 12448 // if the element is hovered the target is this, otherwise, its the focused element 12449 menu = that.menu, 12450 topnavitems = that.topnavitems, 12451 topli = target.closest('.' + settings.topNavItemClass), 12452 tabbables = menu.find(':tabbable'), 12453 panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass), 12454 panelGroups = panel.find('.' + settings.panelGroupClass), 12455 currentPanelGroup = target.closest('.' + settings.panelGroupClass), 12456 next, 12457 keycode = event.keyCode || event.which, 12458 start, 12459 i, 12460 o, 12461 label, 12462 found = false, 12463 newString = Keyboard.keyMap[event.keyCode] || '', 12464 regex, 12465 isTopNavItem = topli.length === 1 && panel.length === 0; 12466
12467 if (target.is("input:focus, select:focus, textarea:focus, button:focus")) { 12468 // if the event target is a form element we should handle keydown normally 12469 return; 12470 } 12471 12472 if (target.is('.' + settings.hoverClass + ':tabbable')) { 12473 $('html').off('keydown.accessible-megamenu'); 12474 } 12475 12476 switch (keycode) { 12477 case Keyboard.ESCAPE: 12478 this.mouseFocused = false; 12479 12480 _togglePanel.call(that, event, true); 12481 12482 break; 12483 12484 case Keyboard.DOWN: 12485 event.preventDefault(); 12486 this.mouseFocused = false; 12487 12488 if (isTopNavItem) { 12489 _togglePanel.call(that, event); 12490 12491 found = topli.find('.' + settings.panelClass + ' :tabbable:first').focus().length === 1; 12492 } else { 12493 found = tabbables.filter(':gt(' + tabbables.index(target) + '):first').focus().length === 1; 12494 } 12495 12496 if (!found && isOpera && (event.ctrlKey || event.metaKey)) { 12497 tabbables = $(':tabbable'); 12498 i = tabbables.index(target); 12499 found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1; 12500 } 12501 12502 break; 12503 12504 case Keyboard.UP: 12505 event.preventDefault(); 12506 this.mouseFocused = false; 12507 12508 if (isTopNavItem && target.hasClass(settings.openClass)) { 12509 _togglePanel.call(that, event, true); 12510 12511 next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last'); 12512 12513 if (next.children('.' + settings.panelClass).length) { 12514 found = next.find('[aria-expanded]').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus() === 1; 12515 } 12516 } else if (!isTopNavItem) { 12517 found = tabbables.filter(':lt(' + tabbables.index(target) + '):last').focus().length === 1; 12518 } 12519 12520 if (!found && isOpera && (event.ctrlKey || event.metaKey)) { 12521 tabbables = $(':tabbable'); 12522 i = tabbables.index(target); 12523 found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):first').focus().length === 1; 12524 } 12525 12526 break; 12527 12528 case Keyboard.RIGHT: 12529 event.preventDefault(); 12530 this.mouseFocused = false; 12531 12532 if (isTopNavItem) { 12533 found = topnavitems.filter(':gt(' + topnavitems.index(topli) + '):first').find(':tabbable:first').focus().length === 1; 12534 } else { 12535 if (panelGroups.length && currentPanelGroup.length) { 12536 // if the current panel contains panel groups, and we are able to focus the first tabbable element of the next panel group 12537 found = panelGroups.filter(':gt(' + panelGroups.index(currentPanelGroup) + '):first').find(':tabbable:first').focus().length === 1; 12538 } 12539 12540 if (!found) { 12541 found = topli.find(':tabbable:first').focus().length === 1; 12542 } 12543 } 12544 12545 break; 12546 12547 case Keyboard.LEFT: 12548 event.preventDefault(); 12549 this.mouseFocused = false; 12550 12551 if (isTopNavItem) { 12552 found = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last').find(':tabbable:first').focus().length === 1; 12553 } else { 12554 if (panelGroups.length && currentPanelGroup.length) { 12555 // if the current panel contains panel groups, and we are able to focus the first tabbable element of the previous panel group 12556 found = panelGroups.filter(':lt(' + panelGroups.index(currentPanelGroup) + '):last').find(':tabbable:first').focus().length === 1; 12557 } 12558 12559 if (!found) { 12560 found = topli.find(':tabbable:first').focus().length === 1; 12561 } 12562 } 12563 12564 break; 12565 12566 case Keyboard.TAB: 12567 this.mouseFocused = false; 12568 i = tabbables.index(target); 12569 12570 if (event.shiftKey && isTopNavItem && target.hasClass(settings.openClass)) { 12571 _togglePanel.call(that, event, true); 12572 12573 next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last'); 12574 12575 if (next.children('.' + settings.panelClass).length) { 12576 found = next.children().attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus(); 12577 } 12578 } else if (event.shiftKey && i > 0) { 12579 found = tabbables.filter(':lt(' + i + '):last').focus().length === 1; 12580 } else if (!event.shiftKey && i < tabbables.length - 1) { 12581 found = tabbables.filter(':gt(' + i + '):first').focus().length === 1; 12582 } else if (isOpera) { 12583 tabbables = $(':tabbable'); 12584 i = tabbables.index(target); 12585 12586 if (event.shiftKey) { 12587 found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):last').focus().length === 1; 12588 } else { 12589 found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1; 12590 } 12591 } 12592 12593 if (found) { 12594 event.preventDefault(); 12595 } 12596 12597 break; 12598 12599 case Keyboard.SPACE: 12600 case Keyboard.ENTER: 12601 if (isTopNavItem) { 12602 event.preventDefault(); 12603 12604 _clickHandler.call(that, event); 12605 } else { 12606 return true; 12607 } 12608 12609 break; 12610 12611 default: 12612 // alphanumeric filter 12613 clearTimeout(this.keydownTimeoutID); 12614 keydownSearchString += newString !== keydownSearchString ? newString : ''; 12615 12616 if (keydownSearchString.length === 0) { 12617 return; 12618 } 12619 12620 this.keydownTimeoutID = setTimeout(function () { 12621 keydownSearchString = ''; 12622 }, keydownTimeoutDuration); 12623 12624 if (isTopNavItem && !target.hasClass(settings.openClass)) { 12625 tabbables = tabbables.filter(':not(.' + settings.panelClass + ' :tabbable)'); 12626 } else { 12627 tabbables = topli.find(':tabbable'); 12628 } 12629 12630 if (event.shiftKey) { 12631 tabbables = $(tabbables.get().reverse()); 12632 } 12633 12634 for (i = 0; i < tabbables.length; i++) { 12635 o = tabbables.eq(i); 12636 12637 if (o.is(target)) { 12638 start = keydownSearchString.length === 1 ? i + 1 : i; 12639 break; 12640 } 12641 } 12642 12643 regex = new RegExp('^' + keydownSearchString.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'), 'i'); 12644 12645 for (i = start; i < tabbables.length; i++) { 12646 o = tabbables.eq(i); 12647 label = $.trim(o.text()); 12648 12649 if (regex.test(label)) { 12650 found = true; 12651 o.focus(); 12652 break; 12653 } 12654 } 12655 12656 if (!found) { 12657 for (i = 0; i < start; i++) { 12658 o = tabbables.eq(i); 12659 label = $.trim(o.text()); 12660 12661 if (regex.test(label)) { 12662 o.focus(); 12663 break; 12664 } 12665 } 12666 } 12667 12668 break; 12669 } 12670 12671 that.justFocused = false;
12672 }; 12673 /** 12674 * @name jQuery.fn.accessibleMegaMenu~_mouseDownHandler 12675 * @desc Handle mousedown event on mega menu. 12676 * @param {event} Event object 12677 * @memberof accessibleMegaMenu 12678 * @inner 12679 * @private 12680 */ 12681 12682 12683 _mouseDownHandler = function _mouseDownHandler(event) { 12684 if ($(event.target).closest(this.settings.panelClass) || $(event.target).closest(":focusable").length) { 12685 this.mouseFocused = true; 12686 12687 if ($(event.target).closest(this.settings.menuClass)) { 12688 $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target)); 12689 } 12690 } 12691 12692 clearTimeout(this.mouseTimeoutID); 12693 this.mouseTimeoutID = setTimeout(function () { 12694 clearTimeout(this.focusTimeoutID); 12695 }, 1); 12696 }; 12697 /** 12698 * @name jQuery.fn.accessibleMegaMenu~_mouseOverHandler 12699 * @desc Handle mouseover event on mega menu. 12700 * @param {event} Event object 12701 * @memberof jQuery.fn.accessibleMegaMenu 12702 * @inner 12703 * @private 12704 */ 12705 12706 12707 _mouseOverHandler = function _mouseOverHandler(event) { 12708 clearTimeout(this.mouseTimeoutID); 12709 var that = this; 12710 12711 if (!that.settings.openOnMouseover) { 12712 return; 12713 } 12714 12715 this.mouseTimeoutID = setTimeout(function () { 12716 $(event.target).addClass(that.settings.hoverClass); 12717 12718 _togglePanel.call(that, event); 12719 12720 if ($(event.target).closest(that.settings.menuClass)) { 12721 $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target)); 12722 } 12723 }, this.settings.openDelay); 12724 }; 12725 /** 12726 * @name jQuery.fn.accessibleMegaMenu~_mouseOutHandler 12727 * @desc Handle mouseout event on mega menu. 12728 * @param {event} Event object 12729 * @memberof jQuery.fn.accessibleMegaMenu 12730 * @inner 12731 * @private 12732 */ 12733 12734 12735 _mouseOutHandler = function _mouseOutHandler(event) { 12736 clearTimeout(this.mouseTimeoutID); 12737 var that = this; 12738 12739 if (!that.settings.openOnMouseover) { 12740 return; 12741 } 12742 12743 $(event.target).removeClass(that.settings.hoverClass); 12744 that.mouseTimeoutID = setTimeout(function () { 12745 _togglePanel.call(that, event, true); 12746 }, this.settings.closeDelay); 12747 12748 if ($(event.target).is(':tabbable')) { 12749 $('html').off('keydown.accessible-megamenu'); 12750 } 12751 }; 12752 /** 12753 * @name jQuery.fn.accessibleMegaMenu~_clickToggleHandler 12754 * @desc Handle click event on menu toggle button. 12755 * @memberof jQuery.fn.accessibleMegaMenu 12756 * @inner 12757 * @private 12758 */ 12759 12760 12761 _clickToggleHandler = function _clickToggleHandler() { 12762 var isExpanded = this.toggleButton.attr('aria-expanded') === 'true'; 12763 this.toggleButton.attr({ 12764 'aria-expanded': !isExpanded, 12765 'aria-pressed': !isExpanded 12766 }); 12767 }; 12768 12769 _toggleExpandedEventHandlers = function _toggleExpandedEventHandlers(hide) { 12770 var menu = this.menu; 12771 12772 if (hide) { 12773 $('html').off('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu, pointerup.outside-accessible-megamenu'); 12774 menu.find('[aria-expanded].' + this.settings.panelClass).off('DOMAttrModified.accessible-megamenu'); 12775 } else { 12776 $('html').on('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu, pointerup.outside-accessible-megamenu', $.proxy(_clickOutsideHandler, this)); 12777 /* Narrator in Windows 8 automatically toggles the aria-expanded property on double tap or click. 12778 To respond to the change to collapse the panel, we must add a listener for a DOMAttrModified event. */ 12779 12780 menu.find('[aria-expanded=true].' + this.settings.panelClass).on('DOMAttrModified.accessible-megamenu', $.proxy(_DOMAttrModifiedHandler, this)); 12781 } 12782 }; 12783 12784 _addEventHandlers = function _addEventHandlers() { 12785 var menu = this.menu, 12786 toggleButton = this.toggleButton; 12787 menu.on("focusin.accessible-megamenu", ":focusable, ." + this.settings.panelClass, $.proxy(_focusInHandler, this)).on("focusout.accessible-megamenu", ":focusable, ." + this.settings.panelClass, $.proxy(_focusOutHandler, this)).on("keydown.accessible-megamenu", $.proxy(_keyDownHandler, this)).on("mouseover.accessible-megamenu", $.proxy(_mouseOverHandler, this)).on("mouseout.accessible-megamenu", $.proxy(_mouseOutHandler, this)).on("mousedown.accessible-megamenu", $.proxy(_mouseDownHandler, this)).on("click.accessible-megamenu", $.proxy(_clickHandler, this)); 12788 toggleButton.on('click.accessible-megamenu', $.proxy(_clickToggleHandler, this)); 12789 12790 if (isTouch) { 12791 menu.on("touchmove.accessible-megamenu", $.proxy(_touchmoveHandler, this)); 12792 } 12793 12794 if ($(document.activeElement).closest(menu).length) { 12795 $(document.activeElement).trigger("focusin.accessible-megamenu"); 12796 } 12797 }; 12798 12799 _removeEventHandlers = function _removeEventHandlers() { 12800 var menu = this.menu, 12801 toggleButton = this.toggleButton; 12802 menu.off('.accessible-megamenu'); 12803 12804 if (menu.find('[aria-expanded=true].' + this.settings.panelClass).length) { 12805 _toggleExpandedEventHandlers.call(this, true); 12806 } 12807 12808 toggleButton.off('.accessible-megamenu'); 12809 }; 12810 /* public attributes and methods ------------------------- */ 12811 12812 12813 return { 12814 constructor: AccessibleMegaMenu, 12815 12816 /** 12817 * @lends jQuery.fn.accessibleMegaMenu
12818 * @desc Initializes an instance of the accessibleMegaMenu plugins 12819 * @memberof jQuery.fn.accessibleMegaMenu 12820 * @instance 12821 */ 12822 init: function init() { 12823 var settings = this.settings, 12824 nav = $(this.element), 12825 menu = nav.children('ol,ul').first(), 12826 topnavitems = menu.children(), 12827 toggleButton = nav.children('button').first(); 12828 this.start(settings, nav, menu, topnavitems, toggleButton); 12829 }, 12830 start: function start(settings, nav, menu, topnavitems, toggleButton) { 12831 var that = this; 12832 this.settings = settings; 12833 this.menu = menu; 12834 this.topnavitems = topnavitems; 12835 this.toggleButton = toggleButton; 12836 nav.attr("role", "navigation"); 12837 12838 _addUniqueId.call(that, menu); 12839 12840 menu.addClass(settings.menuClass); 12841 menu.addClass(['js', settings.menuClass].join('-')); 12842 topnavitems.each(function (i, topnavitem) { 12843 var topnavitemlink, topnavitempanel; 12844 topnavitem = $(topnavitem); 12845 topnavitem.addClass(settings.topNavItemClass); 12846 topnavitemlink = topnavitem.find(":tabbable:first"); 12847 topnavitempanel = topnavitem.children(":not(:tabbable):last"); 12848 12849 _addUniqueId.call(that, topnavitemlink); 12850 12851 if (topnavitempanel.length) { 12852 _addUniqueId.call(that, topnavitempanel); 12853 12854 topnavitemlink.attr({ 12855 "role": "button", 12856 "aria-controls": topnavitempanel.attr("id"), 12857 "aria-expanded": false, 12858 "tabindex": 0 12859 }); 12860 topnavitempanel.attr({ 12861 "role": "region", 12862 "aria-expanded": false, 12863 "aria-hidden": true 12864 }).addClass(settings.panelClass).not("[aria-labelledby]").attr("aria-labelledby", topnavitemlink.attr("id")); 12865 } 12866 }); 12867 this.panels = menu.find("." + settings.panelClass); 12868 menu.find("hr").attr("role", "separator"); 12869 toggleButton.addClass(settings.toggleButtonClass); 12870 toggleButton.attr({ 12871 'aria-expanded': false, 12872 'aria-pressed': false, 12873 'aria-controls': menu.attr('id') 12874 }); 12875 12876 _addEventHandlers.call(this); 12877 }, 12878 12879 /** 12880 * @desc Removes maga menu javascript behavior 12881 * @example $(selector).accessibleMegaMenu("destroy"); 12882 * @return {object} 12883 * @memberof jQuery.fn.accessibleMegaMenu 12884 * @instance 12885 */ 12886 destroy: function destroy() { 12887 this.menu.removeClass(['js', this.settings.menuClass].join('-')); 12888 12889 _removeEventHandlers.call(this, true); 12890 }, 12891 12892 /** 12893 * @desc Get default values 12894 * @example $(selector).accessibleMegaMenu("getDefaults"); 12895 * @return {object} 12896 * @memberof jQuery.fn.accessibleMegaMenu 12897 * @instance 12898 */ 12899 getDefaults: function getDefaults() { 12900 return this._defaults; 12901 }, 12902 12903 /** 12904 * @desc Get any option set to plugin using its name (as string) 12905 * @example $(selector).accessibleMegaMenu("getOption", some_option); 12906 * @param {string} opt 12907 * @return {string} 12908 * @memberof jQuery.fn.accessibleMegaMenu 12909 * @instance 12910 */ 12911 getOption: function getOption(opt) { 12912 return this.settings[opt]; 12913 }, 12914 12915 /** 12916 * @desc Get all options 12917 * @example $(selector).accessibleMegaMenu("getAllOptions"); 12918 * @return {object} 12919 * @memberof jQuery.fn.accessibleMegaMenu 12920 * @instance 12921 */ 12922 getAllOptions: function getAllOptions() { 12923 return this.settings; 12924 }, 12925 12926 /** 12927 * @desc Set option 12928 * @example $(selector).accessibleMegaMenu("setOption", "option_name", "option_value", reinitialize); 12929 * @param {string} opt - Option name 12930 * @param {string} val - Option value 12931 * @param {boolean} [reinitialize] - boolean to re-initialize the menu. 12932 * @memberof jQuery.fn.accessibleMegaMenu 12933 * @instance 12934 */ 12935 setOption: function setOption(opt, value, reinitialize) { 12936 this.settings[opt] = value; 12937 12938 if (reinitialize) { 12939 this.init(); 12940 } 12941 } 12942 }; 12943 }(); 12944 /* lightweight plugin wrapper around the constructor, 12945 to prevent against multiple instantiations */ 12946 12947 /** 12948 * @class accessibleMegaMenu 12949 * @memberOf jQuery.fn 12950 * @classdesc Implements an accessible mega menu as a jQuery plugin. 12951 * <p>The mega-menu It is modeled after the mega menu on {@link http://adobe.com|adobe.com} but has been simplified for use by others. A brief description of the interaction design choices can be found in a blog post at {@link http://blogs.adobe.com/accessibility/2013/05/adobe-com.html|Mega menu accessibility on adobe.com}.</p> 12952 * <h3>Keyboard Accessibility</h3> 12953 * <p>The accessible mega menu supports keyboard interaction modeled after the behavior described
12953in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern}, however we also try to respect users' general expectations for the behavior of links in a global navigation. To this end, the accessible mega menu implementation permits tab focus on each of the six top-level menu items. When one of the menu items has focus, pressing the Enter key, Spacebar or Down arrow will open the submenu panel, and pressing the Left or Right arrow key will shift focus to the adjacent menu item. Links within the submenu panels are included in the tab order when the panel is open. They can also be navigated with the arrow keys or by typing the first character in the link name, which speeds up keyboard navigation considerably. Pressing the Escape key closes the submenu and restores focus to the parent menu item.</p> 12954 * <h3>Screen Reader Accessibility</h3> 12955 * <p>The accessible mega menu models its use of WAI-ARIA Roles, States, and Properties after those described in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern} with some notable exceptions, so that it behaves better with screen reader user expectations for global navigation. We don't use <code class="prettyprint prettyprinted" style=""><span class="pln">role</span><span class="pun">=</span><span class="str">"menu"</span></code> for the menu container and <code class="prettyprint prettyprinted" style=""><span class="pln">role</span><span class="pun">=</span><span class="str">"menuitem"</span></code> for each of the links therein, because if we do, assistive technology will no longer interpret the links as links, but instead, as menu items, and the links in our global navigation will no longer show up when a screen reader user executes a shortcut command to bring up a list of links in the page.</p> 12956 * @example <h4>HTML</h4><hr/> 12957 <nav> 12958 <ul class="nav-menu"> 12959 <li class="nav-item"> 12960 <a href="?movie">Movies</a> 12961 <div class="sub-nav"> 12962 <ul class="sub-nav-group"> 12963 <li><a href="?movie&genre=0">Action &amp; Adventure</a></li> 12964 <li><a href="?movie&genre=2">Children &amp; Family</a></li> 12965 <li>&#8230;</li> 12966 </ul> 12967 <ul class="sub-nav-group"> 12968 <li><a href="?movie&genre=7">Dramas</a></li> 12969 <li><a href="?movie&genre=9">Foreign</a></li> 12970 <li>&#8230;</li> 12971 </ul> 12972 <ul class="sub-nav-group"> 12973 <li><a href="?movie&genre=14">Musicals</a></li> 12974 <li><a href="?movie&genre=15">Romance</a></li> 12975 <li>&#8230;</li> 12976 </ul> 12977 </div> 12978 </li> 12979 <li class="nav-item"> 12980 <a href="?tv">TV Shows</a> 12981 <div class="sub-nav"> 12982 <ul class="sub-nav-group"> 12983 <li><a href="?tv&genre=20">Classic TV</a></li> 12984 <li><a href="?tv&genre=21">Crime TV</a></li> 12985 <li>&#8230;</li> 12986 </ul> 12987 <ul class="sub-nav-group"> 12988 <li><a href="?tv&genre=27">Reality TV</a></li> 12989 <li><a href="?tv&genre=30">TV Action</a></li> 12990 <li>&#8230;</li> 12991 </ul> 12992 <ul class="sub-nav-group"> 12993 <li><a href="?tv&genre=33">TV Dramas</a></li> 12994 <li><a href="?tv&genre=34">TV Horror</a></li> 12995 <li>&#8230;</li> 12996 </ul> 12997 </div> 12998 </li> 12999 </ul> 13000 </nav> 13001 * @example <h4>CSS</h4><hr/> 13002 /* Rudimentary mega menu CSS for demonstration */ 13003 /* mega menu list */ 13004 .nav-menu { 13005 display: block; 13006 position: relative; 13007 list-style: none; 13008 margin: 0; 13009 padding: 0; 13010 z-index: 15; 13011 } 13012 /* a top level navigation item in the mega menu */ 13013 .nav-item { 13014 list-style: none; 13015 display: inline-block; 13016 padding: 0; 13017 margin: 0; 13018 } 13019 /* first descendant link within a top level navigation item */ 13020 .nav-item > a { 13021 position: relative; 13022 display: inline-block; 13023 padding: 0.5em 1em; 13024 margin: 0 0 -1px 0; 13025 border: 1px solid transparent; 13026 } 13027 /* focus/open states of first descendant link within a top level 13028 navigation item */ 13029 .nav-item > a:focus, 13030 .nav-item > a.open { 13031 border: 1px solid #dedede; 13032 } 13033 /* open state of first descendant link within a top level 13034 navigation item */ 13035 .nav-item > a.open { 13036 background-color: #fff; 13037 border-bottom: none; 13038 z-index: 1; 13039 } 13040 /* sub-navigation panel */ 13041 .sub-nav { 13042 position: absolute; 13043 display: none; 13044 top: 2.2em;
13045 margin-top: -1px; 13046 padding: 0.5em 1em; 13047 border: 1px solid #dedede; 13048 background-color: #fff; 13049 } 13050 /* sub-navigation panel open state */ 13051 .sub-nav.open { 13052 display: block; 13053 } 13054 /* list of items within sub-navigation panel */ 13055 .sub-nav ul { 13056 display: inline-block; 13057 vertical-align: top; 13058 margin: 0 1em 0 0; 13059 padding: 0; 13060 } 13061 /* list item within sub-navigation panel */ 13062 .sub-nav li { 13063 display: block; 13064 list-style-type: none; 13065 margin: 0; 13066 padding: 0; 13067 } 13068 * @example <h4>JavaScript</h4><hr/> 13069 <!-- include jquery --> 13070 <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 13071 <!-- include the jquery-accessibleMegaMenu plugin script --> 13072 <script src="js/jquery-accessibleMegaMenu.js"></script> 13073 <!-- initialize a selector as an accessibleMegaMenu --> 13074 <script> 13075 $("nav:first").accessibleMegaMenu({ 13076 /* prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby */ 13077 uuidPrefix: "accessible-megamenu", 13078 /* css class used to define the megamenu styling */ 13079 menuClass: "nav-menu", 13080 /* css class for a top-level navigation item in the megamenu */ 13081 topNavItemClass: "nav-item", 13082 /* css class for a megamenu panel */ 13083 panelClass: "sub-nav", 13084 /* css class for a group of items within a megamenu panel */ 13085 panelGroupClass: "sub-nav-group", 13086 /* css class for the hover state */ 13087 hoverClass: "hover", 13088 /* css class for the focus state */ 13089 focusClass: "focus", 13090 /* css class for the open state */ 13091 openClass: "open" 13092 }); 13093 </script> 13094 * @param {object} [options] Mega Menu options 13095 * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby 13096 * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling 13097 * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu 13098 * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel 13099 * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel 13100 * @param {string} [options.hoverClass=hover] - CSS class for the hover state 13101 * @param {string} [options.focusClass=focus] - CSS class for the focus state 13102 * @param {string} [options.openClass=open] - CSS class for the open state 13103 * @param {string} [options.openDelay=0] - Open delay when opening menu via mouseover 13104 * @param {string} [options.closeDelay=250] - Open delay when opening menu via mouseover 13105 * @param {boolean} [options.openOnMouseover=false] - Should menu open on mouseover 13106 */ 13107 13108 13109 $.fn[pluginName] = function (options) { 13110 return this.each(function () { 13111 var pluginInstance = $.data(this, "plugin_" + pluginName); 13112 13113 if (!pluginInstance) { 13114 $.data(this, "plugin_" + pluginName, new $.fn[pluginName].Acce
13114ssibleMegaMenu(this, options)); 13115 } else if (typeof pluginInstance[options] === 'function') { 13116 pluginInstance[options].apply(pluginInstance, Array.prototype.slice.call(arguments, 1)); 13117 } 13118 }); 13119 }; 13120 13121 $.fn[pluginName].AccessibleMegaMenu = AccessibleMegaMenu; 13122 /* :focusable and :tabbable selectors from 13123 https://raw.github.com/jquery/jquery-ui/master/ui/jquery.ui.core.js */ 13124 13125 /** 13126 * @private 13127 */ 13128 13129 function visible(element) { 13130 return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function () { 13131 return $.css(this, "visibility") === "hidden"; 13132 }).length; 13133 } 13134 /** 13135 * @private 13136 */ 13137 13138 13139 function _focusable(element, isTabIndexNotNaN) { 13140 var map, 13141 mapName, 13142 img, 13143 nodeName = element.nodeName.toLowerCase(); 13144 13145 if ("area" === nodeName) { 13146 map = element.parentNode; 13147 mapName = map.name; 13148 13149 if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") { 13150 return false; 13151 } 13152 13153 img = $("img[usemap=#" + mapName + "]")[0]; 13154 return !!img && visible(img); 13155 } 13156 13157 return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible 13158 visible(element); 13159 } 13160 13161 $.extend($.expr[":"], { 13162 data: $.expr.createPseudo ? $.expr.createPseudo(function (dataName) { 13163 return function (elem) { 13164 return !!$.data(elem, dataName); 13165 }; 13166 }) : // support: jQuery <1.8 13167 function (elem, i, match) { 13168 return !!$.data(elem, match[3]); 13169 }, 13170 focusable: function focusable(element) { 13171 return _focusable(element, !isNaN($.attr(element, "tabindex"))); 13172 }, 13173 tabbable: function tabbable(element) { 13174 var tabIndex = $.attr(element, "tabindex"), 13175 isTabIndexNaN = isNaN(tabIndex); 13176 return (isTabIndexNaN || tabIndex >= 0) && _focusable(element, !isTabIndexNaN); 13177 } 13178 }); 13179})(jQuery, window, document); 13180 13181/***/ }), 13182 13183/***/ 7364: 13184/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { 13185 13186/* provided dependency */ var $ = __webpack_require__(3336); 13187var debug = true; 13188var buttonThemeDisabled = 'button--outline'; 13189var buttonThemeEnabled = 'button--primary'; 13190$.when($.ready).then(function () { 13191 if (debug) { 13192 console.log('cookieman initialised on ready'); 13193 } 13194 13195 var $modal = $('#cookieman-modal'); 13196 13197 if ($modal.length < 1) { 13198 return; 13199 } 13200 13201 var $checkboxes = $modal.find('input[type="checkbox"]'); 13202 var $saveButton = $modal.find('[data-cookieman-save]'); 13203 $checkboxes.change(function () { 13204 $saveButton.removeClass(buttonThemeDisabled).addClass(buttonThemeEnabled); 13205 }); 13206}); 13207 13208/***/ }), 13209 13210/***/ 5539: 13211/***/ (function() { 13212 13213var options = { 13214 selector: '.expand' 13215}; 13216 13217function initExpand(expand) { 13218 /** 13219 * Switch Labels with Open/Closed Expand State 13220 */ 13221 var expandButton = expand.querySelectorAll('.expand-button').item(0); 13222 var expandButtonText = expandButton.querySelectorAll('[data-expand-label]').item(0); 13223 var label = expandButton.textContent.trim(); 13224 var switchLabel = expandButton.getAttribute('data-expand-switch-label').trim(); 13225 document.querySelectorAll(expandButton.getAttribute('data-bs-target')).forEach(function (e) { 13226 e.addEventListener('show.bs.collapse', function () { 13227 expandButtonText.textContent = switchLabel; 13228 }); 13229 e.addEventListener('hide.bs.collapse', function () { 13230 expandButtonText.textContent = label; 13231 }); 13232 }); 13233} 13234 13235function init() { 13236 var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : options.selector; 13237 var expands = document.querySelectorAll(selector); 13238 13239 if (expands.length < 1) { 13240 return; 13241 } 13242 13243 expands.forEach(initExpand); 13244} 13245 13246document.addEventListener('DOMContentLoaded', function () { 13247 init(); 13248}); 13249 13250/***/ }), 13251 13252/***/ 4591: 13253/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { 13254 13255/* provided dependency */ var $ = __webpack_require__(3336); 13256var spinner = '<span class="spinner__wrapper"><span class="spinner">Wird geladen</span></span>'; 13257 13258function removeLoader() { 13259 $(this).removeClass('loading').find('.spinner__wrapper').remove(); 13260} 13261 13262function addLoader() { 13263 $(this).append(spinner).addClass('loading'); 13264} 13265 13266$.when($.ready).then(function () { 13267 var $ajaxButtons = $('button.ajax'); 13268 $ajaxButtons.each(function (evt, el) { 13269 $(el).on('click', addLoader); 13270 $(el).on('button:removeLoader', removeLoader); 13271 $(el).parents('form').on('field:error', function () { 13272 removeLoader(); 13273 }); 13274 }); 13275}); 13276 13277/***/ }), 13278 13279/***/ 4452: 13280/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { 13281 13282/* provided dependency */ var jQuery = __webpack_require__(3336); 13283/* 13284Copyright © 2013 Adobe Systems Incorporated. 13285 13286Licensed under the Apache License, Version 2.0 (the âLicenseâ); 13287you may not use this file except in compliance with the License. 13288You may obtain a copy of the License at 13289 13290http://www.apache.org/licenses/LICENSE-2.0 13291 13292Unless required by applicable law or agreed to in writing, softw
13292are 13293distributed under the License is distributed on an âAS ISâ BASIS, 13294WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13295See the License for the specific language governing permissions and 13296limitations under the License. 13297*/ 13298 13299/** 13300 * See <a href="http://jquery.com">http://jquery.com</a>. 13301 * @name jquery 13302 * @class 13303 * See the jQuery Library (<a href="http://jquery.com">http://jquery.com</a>) for full details. This just 13304 * documents the function and classes that are added to jQuery by this plug-in. 13305 */ 13306 13307/** 13308 * See <a href="http://jquery.com">http://jquery.com</a> 13309 * @name fn 13310 * @class 13311 * See the jQuery Library (<a href="http://jquery.com">http://jquery.com</a>) for full details. This just 13312 * documents the function and classes that are added to jQuery by this plug-in. 13313 * @memberOf jquery 13314 */ 13315 13316/** 13317 * @fileOverview accessibleMegaMenu plugin 13318 * 13319 *<p>Licensed under the Apache License, Version 2.0 (the âLicenseâ) 13320 *<br />Copyright © 2013 Adobe Systems Incorporated. 13321 *<br />Project page <a href="https://github.com/adobe-accessibility/Accessible-Mega-Menu">https://github.com/adobe-accessibility/Accessible-Mega-Menu</a> 13322 * @version 0.1 13323 * @author Michael Jordan 13324 * @requires jquery 13325 */ 13326 13327/*jslint browser: true, devel: true, plusplus: true, nomen: true */ 13328 13329/*global jQuery, window, document */ 13330(function ($, window, document) { 13331 "use strict"; 13332 13333 var pluginName = "accessibleMegaMenu", 13334 defaults = { 13335 uuidPrefix: "accessible-megamenu", 13336 // unique ID's are required to indicate aria-owns, aria-controls and aria-labelledby 13337 menuClass: "accessible-megamenu", 13338 // default css class used to define the megamenu styling 13339 topNavItemClass: "accessible-megamenu-top-nav-item", 13340 // default css class for a top-level navigation item in the megamenu 13341 panelClass: "accessible-megamenu-panel", 13342 // default css class for a megamenu panel 13343 panelGroupClass: "accessible-megamenu-panel-group", 13344 // default css class for a group of items within a megamenu panel 13345 hoverClass: "hover", 13346 // default css class for the hover state 13347 focusClass: "focus", 13348 // default css class for the focus state 13349 openClass: "open", 13350 // default css class for the open state, 13351 toggleButtonClass: "accessible-megamenu-toggle", 13352 // default css class responsive toggle button 13353 openDelay: 0, 13354 // default open delay when opening menu via mouseover 13355 closeDelay: 250, 13356 // default open delay when opening menu via mouseover 13357 openOnMouseover: true // default setting for whether menu should open on mouseover 13358 13359 }, 13360 Keyboard = { 13361 BACKSPACE: 8, 13362 COMMA: 188, 13363 DELETE: 46, 13364 DOWN: 40, 13365 END: 35, 13366 ENTER: 13, 13367 ESCAPE: 27, 13368 HOME: 36, 13369 LEFT: 37, 13370 PAGE_DOWN: 34, 13371 PAGE_UP: 33, 13372 PERIOD: 190, 13373 RIGHT: 39, 13374 SPACE: 32, 13375 TAB: 9, 13376 UP: 38, 13377 keyMap: { 13378 48: "0", 13379 49: "1", 13380 50: "2", 13381 51: "3", 13382 52: "4", 13383 53: "5", 13384 54: "6", 13385 55: "7", 13386 56: "8", 13387 57: "9", 13388 59: ";", 13389 65: "a", 13390 66: "b", 13391 67: "c", 13392 68: "d", 13393 69: "e", 13394 70: "f", 13395 71: "g", 13396 72: "h", 13397 73: "i", 13398 74: "j", 13399 75: "k", 13400 76: "l", 13401 77: "m", 13402 78: "n", 13403 79: "o", 13404 80: "p", 13405 81: "q", 13406 82: "r", 13407 83: "s", 13408 84: "t", 13409 85: "u", 13410 86: "v", 13411 87: "w", 13412 88: "x", 13413 89: "y", 13414 90: "z", 13415 96: "0", 13416 97: "1", 13417 98: "2", 13418 99: "3", 13419 100: "4", 13420 101: "5", 13421 102: "6", 13422 103: "7", 13423 104: "8", 13424 105: "9", 13425 190: "." 13426 } 13427 }, 13428 clearTimeout = window.clearTimeout, 13429 setTimeout = window.setTimeout, 13430 isOpera = window.opera && window.opera.toString() === '[object Opera]'; 13431 /** 13432 * @desc Creates a new accessible mega menu instance. 13433 * @param {jquery} element 13434 * @param {object} [options] Mega Menu options 13435 * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby 13436 * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling 13437 * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu 13438 * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel 13439 * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel 13440 * @param {string} [options.hoverClass=hover] - CSS class for the hover state 13441 * @param {string} [options.focusClass=focus] - CSS class for the focus state 13442 * @param {string} [options.openClass=open] - CSS class for the open state 13443 * @constructor 13444 */ 13445 13446 function AccessibleMegaMenu(element, options) { 13447 this.element = element; // merge optional settings and defaults into settings 13448 13449 this.settings = $.extend({}, defaults, options); 13450 this._defaults = defaults; 13451 this._name = pluginName; 13452 this.mouseTimeoutID = null; 13453 this.focusTimeoutID = null; 13454 this.mouseFocused = false;
13455 this.justFocused = false; 13456 this.init(); 13457 } 13458 13459 AccessibleMegaMenu.prototype = function () { 13460 /* private attributes and methods ------------------------ */ 13461 var uuid = 0, 13462 keydownTimeoutDuration = 1000, 13463 keydownSearchString = "", 13464 isTouch = 'ontouchstart' in window || window.navigator.msMaxTouchPoints, 13465 _getPlugin, 13466 _addUniqueId, 13467 _togglePanel, 13468 _clickHandler, 13469 _touchmoveHandler, 13470 _clickOutsideHandler, 13471 _DOMAttrModifiedHandler, 13472 _focusInHandler, 13473 _focusOutHandler, 13474 _keyDownHandler, 13475 _mouseDownHandler, 13476 _mouseOverHandler, 13477 _mouseOutHandler, 13478 _clickToggleHandler, 13479 _toggleExpandedEventHandlers, 13480 _addEventHandlers, 13481 _removeEventHandlers; 13482 /** 13483 * @name jQuery.fn.accessibleMegaMenu~_getPlugin 13484 * @desc Returns the parent accessibleMegaMenu instance for a given element 13485 * @param {jQuery} element 13486 * @memberof jQuery.fn.accessibleMegaMenu 13487 * @inner 13488 * @private 13489 */ 13490 13491 13492 _getPlugin = function _getPlugin(element) { 13493 return $(element).closest(':data(plugin_' + pluginName + ')').data("plugin_" + pluginName); 13494 }; 13495 /** 13496 * @name jQuery.fn.accessibleMegaMenu~_addUniqueId 13497 * @desc Adds a unique id and element. 13498 * The id string starts with the 13499 * string defined in settings.uuidPrefix. 13500 * @param {jQuery} element 13501 * @memberof jQuery.fn.accessibleMegaMenu 13502 * @inner 13503 * @private 13504 */ 13505 13506 13507 _addUniqueId = function _addUniqueId(element) { 13508 element = $(element); 13509 var settings = this.settings; 13510 13511 if (!element.attr("id")) { 13512 element.attr("id", settings.uuidPrefix + "-" + new Date().getTime() + "-" + ++uuid); 13513 } 13514 }; 13515 /** 13516 * @name jQuery.fn.accessibleMegaMenu~_togglePanel 13517 * @desc Toggle the display of mega menu panels in response to an event. 13518 * The optional boolean value 'hide' forces all panels to hide. 13519 * @param {event} event 13520 * @param {Boolean} [hide] Hide all mega menu panels when true 13521 * @memberof jQuery.fn.accessibleMegaMenu 13522 * @inner 13523 * @private 13524 */ 13525 13526 13527 _togglePanel = function _togglePanel(event, hide) { 13528 var target = $(event.target), 13529 that = this, 13530 settings = this.settings, 13531 menu = this.menu, 13532 topli = target.closest('.' + settings.topNavItemClass), 13533 panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass), 13534 newfocus; 13535 13536 _toggleExpandedEventHandlers.call(this, true); 13537 13538 if (hide) { 13539 topli = menu.find('.' + settings.topNavItemClass + ' .' + settings.openClass + ':first').closest('.' + settings.topNavItemClass); 13540 13541 if (!(topli.is(event.relatedTarget) || topli.has(event.relatedTarget).length > 0)) { 13542 if ((event.type === 'mouseout' || event.type === 'focusout') && topli.has(document.activeElement).length > 0) { 13543 return; 13544 } 13545 13546 topli.find('[aria-expanded]').filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true'); 13547 13548 if (event.type === 'keydown' && event.keyCode === Keyboard.ESCAPE || event.type === 'DOMAttrModified') { 13549 newfocus = topli.find(':tabbable:first'); 13550 setTimeout(function () { 13551 menu.find('[aria-expanded].' + that.settings.panelClass).off('DOMAttrModified.accessible-megamenu'); 13552 newfocus.focus(); 13553 that.justFocused = false; 13554 }, 99); 13555 } 13556 } else if (topli.length === 0) { 13557 menu.find('[aria-expanded=true]').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true'); 13558 } 13559 } else { 13560 clearTimeout(that.focusTimeoutID); 13561 topli.siblings().find('[aria-expanded]').filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'false').removeClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'true'); 13562 topli.find('[aria-expanded]').filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false'); 13563 var pageScrollPosition = $('html')[0].scrollTop; 13564 var $openPanel = $('.' + settings.panelClass + '.' + settings.openClass).parent(); 13565 13566 if ($openPanel.length > 0) { 13567 var openPanelTopPosition = $openPanel.offset().top; 13568 13569 if (pageScrollPosition > openPanelTopPosition) { 13570 $('html')[0].scrollTop = openPanelTopPosition; 13571 } 13572 } 13573 13574 if (event.type === 'mouseover' && target.is(':tabbable') && topli.length === 1 && panel.length === 0 && menu.has(document.activeElement).length > 0) {
13575 target.focus(); 13576 that.justFocused = false; 13577 } 13578 13579 _toggleExpandedEventHandlers.call(that); 13580 } 13581 }; 13582 /** 13583 * @name jQuery.fn.accessibleMegaMenu~_clickHandler 13584 * @desc Handle click event on mega menu item 13585 * @param {event} Event object 13586 * @memberof jQuery.fn.accessibleMegaMenu 13587 * @inner 13588 * @private 13589 */ 13590 13591 13592 _clickHandler = function _clickHandler(event) { 13593 var target = $(event.target).closest(':tabbable'), 13594 topli = target.closest('.' + this.settings.topNavItemClass), 13595 panel = target.closest('.' + this.settings.panelClass); 13596 13597 if (topli.length === 1 && panel.length === 0 && topli.find('.' + this.settings.panelClass).length === 1) { 13598 if (!target.hasClass(this.settings.openClass)) { 13599 event.preventDefault(); 13600 event.stopPropagation(); 13601 13602 _togglePanel.call(this, event); 13603 13604 this.justFocused = false; 13605 } else { 13606 if (this.justFocused) { 13607 event.preventDefault(); 13608 event.stopPropagation(); 13609 this.justFocused = false; 13610 } else if (isTouch || !isTouch && !this.settings.openOnMouseover) { 13611 event.preventDefault(); 13612 event.stopPropagation(); 13613 13614 _togglePanel.call(this, event, target.hasClass(this.settings.openClass)); 13615 } 13616 } 13617 } 13618 }; 13619 /** 13620 * @name jQuery.fn.accessibleMegaMenu~_touchmoveHandler 13621 * @desc Handle touch move event on menu 13622 * @memberof jQuery.fn.accessibleMegaMenu 13623 * @inner 13624 * @private 13625 */ 13626 13627 13628 _touchmoveHandler = function _touchmoveHandler() { 13629 this.justMoved = true; 13630 }; 13631 /** 13632 * @name jQuery.fn.accessibleMegaMenu~_clickOutsideHandler 13633 * @desc Handle click event outside of a the megamenu 13634 * @param {event} Event object 13635 * @memberof jQuery.fn.accessibleMegaMenu 13636 * @inner 13637 * @private 13638 */ 13639 13640 13641 _clickOutsideHandler = function _clickOutsideHandler(event) { 13642 if ($(event.target).closest(this.menu).length === 0) { 13643 event.preventDefault(); 13644 event.stopPropagation(); 13645 13646 _togglePanel.call(this, event, true); 13647 } 13648 }; 13649 /** 13650 * @name jQuery.fn.accessibleMegaMenu~_DOMAttrModifiedHandler 13651 * @desc Handle DOMAttrModified event on panel to respond to Windows 8 Narrator ExpandCollapse pattern 13652 * @param {event} Event object 13653 * @memberof jQuery.fn.accessibleMegaMenu 13654 * @inner 13655 * @private 13656 */ 13657 13658 13659 _DOMAttrModifiedHandler = function _DOMAttrModifiedHandler(event) { 13660 if (event.originalEvent.attrName === 'aria-expanded' && event.originalEvent.newValue === 'false' && $(event.target).hasClass(this.settings.openClass) && !$(event.target).hasClass('ww-megaMenu-aria-mangling-fix')) { 13661 event.preventDefault(); 13662 event.stopPropagation(); 13663 13664 _togglePanel.call(this, event, true); 13665 } 13666 }; 13667 /** 13668 * @name jQuery.fn.accessibleMegaMenu~_focusInHandler 13669 * @desc Handle focusin event on mega menu item. 13670 * @param {event} Event object 13671 * @memberof jQuery.fn.accessibleMegaMenu 13672 * @inner 13673 * @private 13674 */ 13675 13676 13677 _focusInHandler = function _focusInHandler(event) { 13678 clearTimeout(this.focusTimeoutID); 13679 var target = $(event.target), 13680 panel = target.closest('.' + this.settings.panelClass); 13681 target.addClass(this.settings.focusClass); 13682 this.justFocused = !this.mouseFocused || !this.settings.openOnMouseover && this.mouseFocused; 13683 this.mouseFocused = false; 13684 13685 if (this.justFocused && this.panels.not(panel).filter('.' + this.settings.openClass).length) { 13686 _togglePanel.call(this, event); 13687 } 13688 }; 13689 /** 13690 * @name jQuery.fn.accessibleMegaMenu~_focusOutHandler 13691 * @desc Handle focusout event on mega menu item. 13692 * @param {event} Event object 13693 * @memberof jQuery.fn.accessibleMegaMenu 13694 * @inner 13695 * @private 13696 */ 13697 13698 13699 _focusOutHandler = function _focusOutHandler(event) { 13700 this.justFocused = false; 13701 var that = this, 13702 target = $(event.target), 13703 topli = target.closest('.' + this.settings.topNavItemClass); 13704 target.removeClass(this.settings.focusClass); 13705 13706 if (window.cvox) { 13707 // If ChromeVox is running... 13708 that.focusTimeoutID = setTimeout(function () { 13709 window.cvox.Api.getCurrentNode(function (node) { 13710 if (topli.has(node).length) { 13711 // and the current node being voiced is in 13712 // the mega menu, clearTimeout, 13713 // so the panel stays open. 13714 clearTimeout(that.focusTimeoutID); 13715 } else { 13716 that.focusTimeoutID = setTimeout(function (scope, event, hide) { 13717 _togglePanel.call(scope, event, hide); 13718 }, 275, that, event, true); 13719 } 13720 }); 13721 }, 25); 13722 } else { 13723 that.focusTimeoutID = setTimeout(function () { 13724 if (that.mouseFocused && event.relatedTarget === null) { 13725 return; 13726 } 13727 13728 _togglePanel.call(that, event, true); 13729 }, 300); 13730 } 13731 }; 13732 /** 13733 * @name jQuery.fn.accessibleMegaMenu~_keyDownHandler
13734 * @desc Handle keydown event on mega menu. 13735 * @param {event} Event object 13736 * @memberof jQuery.fn.accessibleMegaMenu 13737 * @inner 13738 * @private 13739 */ 13740 13741 13742 _keyDownHandler = function _keyDownHandler(event) { 13743 var that = this.constructor === AccessibleMegaMenu ? this : _getPlugin(this), 13744 // determine the AccessibleMegaMenu plugin instance 13745 settings = that.settings, 13746 target = $($(this).is('.' + settings.hoverClass + ':tabbable') ? this : event.target), 13747 // if the element is hovered the target is this, otherwise, its the focused element 13748 menu = that.menu, 13749 topnavitems = that.topnavitems, 13750 topli = target.closest('.' + settings.topNavItemClass), 13751 tabbables = menu.find(':tabbable'), 13752 panel = target.hasClass(settings.panelClass) ? target : target.closest('.' + settings.panelClass), 13753 panelGroups = panel.find('.' + settings.panelGroupClass), 13754 currentPanelGroup = target.closest('.' + settings.panelGroupClass), 13755 next, 13756 keycode = event.keyCode || event.which, 13757 start, 13758 i, 13759 o, 13760 label, 13761 found = false, 13762 newString = Keyboard.keyMap[event.keyCode] || '', 13763 regex, 13764 isTopNavItem = topli.length === 1 && panel.length === 0; 13765
13766 if (target.is("input:focus, select:focus, textarea:focus, button:focus")) { 13767 // if the event target is a form element we should handle keydown normally 13768 return; 13769 } 13770 13771 if (target.is('.' + settings.hoverClass + ':tabbable')) { 13772 $('html').off('keydown.accessible-megamenu'); 13773 } 13774 13775 switch (keycode) { 13776 case Keyboard.ESCAPE: 13777 this.mouseFocused = false; 13778 13779 _togglePanel.call(that, event, true); 13780 13781 break; 13782 13783 case Keyboard.DOWN: 13784 event.preventDefault(); 13785 this.mouseFocused = false; 13786 13787 if (isTopNavItem) { 13788 _togglePanel.call(that, event); 13789 13790 found = topli.find('.' + settings.panelClass + ' :tabbable:first').focus().length === 1; 13791 } else { 13792 found = tabbables.filter(':gt(' + tabbables.index(target) + '):first').focus().length === 1; 13793 } 13794 13795 if (!found && isOpera && (event.ctrlKey || event.metaKey)) { 13796 tabbables = $(':tabbable'); 13797 i = tabbables.index(target); 13798 found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1; 13799 } 13800 13801 break; 13802 13803 case Keyboard.UP: 13804 event.preventDefault(); 13805 this.mouseFocused = false; 13806 13807 if (isTopNavItem && target.hasClass(settings.openClass)) { 13808 _togglePanel.call(that, event, true); 13809 13810 next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last'); 13811 13812 if (next.children('.' + settings.panelClass).length) { 13813 found = next.find('[aria-expanded]').filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus() === 1; 13814 } 13815 } else if (!isTopNavItem) { 13816 found = tabbables.filter(':lt(' + tabbables.index(target) + '):last').focus().length === 1; 13817 } 13818 13819 if (!found && isOpera && (event.ctrlKey || event.metaKey)) { 13820 tabbables = $(':tabbable'); 13821 i = tabbables.index(target); 13822 found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):first').focus().length === 1; 13823 } 13824 13825 break; 13826 13827 case Keyboard.RIGHT: 13828 event.preventDefault(); 13829 this.mouseFocused = false; 13830 13831 if (isTopNavItem) { 13832 found = topnavitems.filter(':gt(' + topnavitems.index(topli) + '):first').find(':tabbable:first').focus().length === 1; 13833 } else { 13834 if (panelGroups.length && currentPanelGroup.length) { 13835 // if the current panel contains panel groups, and we are able to focus the first tabbable element of the next panel group 13836 found = panelGroups.filter(':gt(' + panelGroups.index(currentPanelGroup) + '):first').find(':tabbable:first').focus().length === 1; 13837 } 13838 13839 if (!found) { 13840 found = topli.find(':tabbable:first').focus().length === 1; 13841 } 13842 } 13843 13844 break; 13845 13846 case Keyboard.LEFT: 13847 event.preventDefault(); 13848 this.mouseFocused = false; 13849 13850 if (isTopNavItem) { 13851 found = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last').find(':tabbable:first').focus().length === 1; 13852 } else { 13853 if (panelGroups.length && currentPanelGroup.length) { 13854 // if the current panel contains panel groups, and we are able to focus the first tabbable element of the previous panel group 13855 found = panelGroups.filter(':lt(' + panelGroups.index(currentPanelGroup) + '):last').find(':tabbable:first').focus().length === 1; 13856 } 13857 13858 if (!found) { 13859 found = topli.find(':tabbable:first').focus().length === 1; 13860 } 13861 } 13862 13863 break; 13864 13865 case Keyboard.TAB: 13866 this.mouseFocused = false; 13867 i = tabbables.index(target); 13868 13869 if (event.shiftKey && isTopNavItem && target.hasClass(settings.openClass)) { 13870 _togglePanel.call(that, event, true); 13871 13872 next = topnavitems.filter(':lt(' + topnavitems.index(topli) + '):last'); 13873 13874 if (next.children('.' + settings.panelClass).length) { 13875 found = next.children().filter(':not(.ww-megaMenu-aria-mangling-fix)').attr('aria-expanded', 'true').addClass(settings.openClass).filter('.' + settings.panelClass).attr('aria-hidden', 'false').find(':tabbable:last').focus(); 13876 } 13877 } else if (event.shiftKey && i > 0) { 13878 found = tabbables.filter(':lt(' + i + '):last').focus().length === 1; 13879 } else if (!event.shiftKey && i < tabbables.length - 1) { 13880 found = tabbables.filter(':gt(' + i + '):first').focus().length === 1; 13881 } else if (isOpera) { 13882 tabbables = $(':tabbable'); 13883 i = tabbables.index(target); 13884 13885 if (event.shiftKey) { 13886 found = $(':tabbable:lt(' + $(':tabbable').index(target) + '):last').focus().length === 1; 13887 } else { 13888 found = $(':tabbable:gt(' + $(':tabbable').index(target) + '):first').focus().length === 1; 13889 } 13890 } 13891 13892 if (found) { 13893 event.preventDefault(); 13894 } 13895 13896 break; 13897 13898 case Keyboard.SPACE: 13899 case Keyboard.ENTER: 13900 if (isTopNavItem) { 13901 event.preventDefault(); 13902 13903 _clickHandler.call(that, event); 13904 } else { 13905 return true; 13906 } 13907 13908 break; 13909 13910 default: 13911 // alphanumeric filter 13912 clearTimeout(this.keydownTimeoutID); 13913 keydownSearchString += newString !== keydownSearchString ? newString : ''; 13914 13915 if (keydownSearchString.length === 0) { 13916 return; 13917 } 13918 13919 this.keydownTimeoutID = setTimeout(function () { 13920 keydownSearchString = ''; 13921 }, keydownTimeoutDuration); 13922 13923 if (isTopNavItem && !target.hasClass(settings.openClass)) { 13924 tabbables = tabbables.filter(':not(.' + settings.panelClass + ' :tabbable)'); 13925 } else { 13926 tabbables = topli.find(':tabbable'); 13927 } 13928 13929 if (event.shiftKey) { 13930 tabbables = $(tabbables.get().reverse()); 13931 } 13932 13933 for (i = 0; i < tabbables.length; i++) { 13934 o = tabbables.eq(i); 13935 13936 if (o.is(target)) { 13937 start = keydownSearchString.length === 1 ? i + 1 : i; 13938 break; 13939 } 13940 } 13941 13942 regex = new RegExp('^' + keydownSearchString.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'), 'i'); 13943 13944 for (i = start; i < tabbables.length; i++) { 13945 o = tabbables.eq(i); 13946 label = $.trim(o.text()); 13947 13948 if (regex.test(label)) { 13949 found = true; 13950 o.focus(); 13951 break; 13952 } 13953 } 13954 13955 if (!found) { 13956 for (i = 0; i < start; i++) { 13957 o = tabbables.eq(i); 13958 label = $.trim(o.text()); 13959 13960 if (regex.test(label)) { 13961 o.focus(); 13962 break; 13963 } 13964 } 13965 } 13966 13967 break; 13968 } 13969 13970 that.justFocused = false;
13971 }; 13972 /** 13973 * @name jQuery.fn.accessibleMegaMenu~_mouseDownHandler 13974 * @desc Handle mousedown event on mega menu. 13975 * @param {event} Event object 13976 * @memberof accessibleMegaMenu 13977 * @inner 13978 * @private 13979 */ 13980 13981 13982 _mouseDownHandler = function _mouseDownHandler(event) { 13983 if ($(event.target).closest(this.settings.panelClass) || $(event.target).closest(":focusable").length) { 13984 this.mouseFocused = true; 13985 13986 if ($(event.target).closest(this.settings.menuClass)) { 13987 $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target)); 13988 } 13989 } 13990 13991 clearTimeout(this.mouseTimeoutID); 13992 this.mouseTimeoutID = setTimeout(function () { 13993 clearTimeout(this.focusTimeoutID); 13994 }, 1); 13995 }; 13996 /** 13997 * @name jQuery.fn.accessibleMegaMenu~_mouseOverHandler 13998 * @desc Handle mouseover event on mega menu. 13999 * @param {event} Event object 14000 * @memberof jQuery.fn.accessibleMegaMenu 14001 * @inner 14002 * @private 14003 */ 14004 14005 14006 _mouseOverHandler = function _mouseOverHandler(event) { 14007 clearTimeout(this.mouseTimeoutID); 14008 var that = this; 14009 14010 if (!that.settings.openOnMouseover) { 14011 return; 14012 } 14013 14014 this.mouseTimeoutID = setTimeout(function () { 14015 $(event.target).addClass(that.settings.hoverClass); 14016 14017 _togglePanel.call(that, event); 14018 14019 if ($(event.target).closest(that.settings.menuClass)) { 14020 $('html').on('keydown.accessible-megamenu', $.proxy(_keyDownHandler, event.target)); 14021 } 14022 }, this.settings.openDelay); 14023 }; 14024 /** 14025 * @name jQuery.fn.accessibleMegaMenu~_mouseOutHandler 14026 * @desc Handle mouseout event on mega menu. 14027 * @param {event} Event object 14028 * @memberof jQuery.fn.accessibleMegaMenu 14029 * @inner 14030 * @private 14031 */ 14032 14033 14034 _mouseOutHandler = function _mouseOutHandler(event) { 14035 clearTimeout(this.mouseTimeoutID); 14036 var that = this; 14037 14038 if (!that.settings.openOnMouseover) { 14039 return; 14040 } 14041 14042 $(event.target).removeClass(that.settings.hoverClass); 14043 that.mouseTimeoutID = setTimeout(function () { 14044 _togglePanel.call(that, event, true); 14045 }, this.settings.closeDelay); 14046 14047 if ($(event.target).is(':tabbable')) { 14048 $('html').off('keydown.accessible-megamenu'); 14049 } 14050 }; 14051 /** 14052 * @name jQuery.fn.accessibleMegaMenu~_clickToggleHandler 14053 * @desc Handle click event on menu toggle button. 14054 * @memberof jQuery.fn.accessibleMegaMenu 14055 * @inner 14056 * @private 14057 */ 14058 14059 14060 _clickToggleHandler = function _clickToggleHandler() { 14061 var isExpanded = this.toggleButton.attr('aria-expanded') === 'true'; 14062 this.toggleButton.attr({ 14063 'aria-expanded': !isExpanded, 14064 'aria-pressed': !isExpanded 14065 }); 14066 }; 14067 14068 _toggleExpandedEventHandlers = function _toggleExpandedEventHandlers(hide) { 14069 var menu = this.menu; 14070 14071 if (hide) { 14072 $('html').off('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu, pointerup.outside-accessible-megamenu'); 14073 menu.find('[aria-expanded].' + this.settings.panelClass).off('DOMAttrModified.accessible-megamenu'); 14074 } else { 14075 $('html').on('mouseup.outside-accessible-megamenu, touchend.outside-accessible-megamenu, mspointerup.outside-accessible-megamenu, pointerup.outside-accessible-megamenu', $.proxy(_clickOutsideHandler, this)); 14076 /* Narrator in Windows 8 automatically toggles the aria-expanded property on double tap or click. 14077 To respond to the change to collapse the panel, we must add a listener for a DOMAttrModified event. */ 14078 14079 menu.find('[aria-expanded=true].' + this.settings.panelClass).on('DOMAttrModified.accessible-megamenu', $.proxy(_DOMAttrModifiedHandler, this)); 14080 } 14081 }; 14082 14083 _addEventHandlers = function _addEventHandlers() { 14084 var menu = this.menu, 14085 toggleButton = this.toggleButton; 14086 menu.on("focusin.accessible-megamenu", ":focusable, ." + this.settings.panelClass, $.proxy(_focusInHandler, this)).on("focusout.accessible-megamenu", ":focusable, ." + this.settings.panelClass, $.proxy(_focusOutHandler, this)).on("keydown.accessible-megamenu", $.proxy(_keyDownHandler, this)).on("mouseover.accessible-megamenu", $.proxy(_mouseOverHandler, this)).on("mouseout.accessible-megamenu", $.proxy(_mouseOutHandler, this)).on("mousedown.accessible-megamenu", $.proxy(_mouseDownHandler, this)).on("click.accessible-megamenu", $.proxy(_clickHandler, this)); 14087 toggleButton.on('click.accessible-megamenu', $.proxy(_clickToggleHandler, this)); 14088 14089 if (isTouch) { 14090 menu.on("touchmove.accessible-megamenu", $.proxy(_touchmoveHandler, this)); 14091 } 14092 14093 if ($(document.activeElement).closest(menu).length) { 14094 $(document.activeElement).trigger("focusin.accessible-megamenu"); 14095 } 14096 }; 14097 14098 _removeEventHandlers = function _removeEventHandlers() { 14099 var menu = this.menu, 14100 toggleButton = this.toggleButton; 14101 menu.off('.accessible-megamenu'); 14102 14103 if (menu.find('[aria-expanded=true].' + this.settings.panelClass).length) { 14104 _toggleExpandedEventHandlers.call(this, true); 14105 } 14106 14107 toggleButton.off('.accessible-megamenu'); 14108 }; 14109 /* public attributes and methods ------------------------- */ 14110 14111 14112 return { 14113 constructor: AccessibleMegaMenu, 14114 14115 /** 14116 * @lends jQuery.fn.accessibleMegaMenu
14117 * @desc Initializes an instance of the accessibleMegaMenu plugins 14118 * @memberof jQuery.fn.accessibleMegaMenu 14119 * @instance 14120 */ 14121 init: function init() { 14122 var settings = this.settings, 14123 nav = $(this.element), 14124 menu = nav.children('ol,ul').first(), 14125 topnavitems = menu.children(), 14126 toggleButton = nav.children('button').first(); 14127 this.start(settings, nav, menu, topnavitems, toggleButton); 14128 }, 14129 start: function start(settings, nav, menu, topnavitems, toggleButton) { 14130 var that = this; 14131 this.settings = settings; 14132 this.menu = menu; 14133 this.topnavitems = topnavitems; 14134 this.toggleButton = toggleButton; 14135 nav.attr("role", "navigation"); 14136 14137 _addUniqueId.call(that, menu); 14138 14139 menu.addClass(settings.menuClass); 14140 menu.addClass(['js', settings.menuClass].join('-')); 14141 topnavitems.each(function (i, topnavitem) { 14142 var topnavitemlink, topnavitempanel; 14143 topnavitem = $(topnavitem); 14144 topnavitem.addClass(settings.topNavItemClass); 14145 topnavitemlink = topnavitem.find(":tabbable:first"); 14146 topnavitempanel = topnavitem.children(":not(:tabbable):last"); 14147 14148 _addUniqueId.call(that, topnavitemlink); 14149 14150 if (topnavitempanel.length) { 14151 _addUniqueId.call(that, topnavitempanel); 14152 14153 topnavitemlink.attr({ 14154 "role": "button", 14155 "aria-controls": topnavitempanel.attr("id"), 14156 "aria-expanded": false, 14157 "tabindex": 0 14158 }); 14159 topnavitempanel.attr({ 14160 "role": "region", 14161 "aria-expanded": false, 14162 "aria-hidden": true 14163 }).addClass(settings.panelClass).not("[aria-labelledby]").attr("aria-labelledby", topnavitemlink.attr("id")); 14164 } 14165 }); 14166 this.panels = menu.find("." + settings.panelClass); 14167 menu.find("hr").attr("role", "separator"); 14168 toggleButton.addClass(settings.toggleButtonClass); 14169 toggleButton.attr({ 14170 'aria-expanded': false, 14171 'aria-pressed': false, 14172 'aria-controls': menu.attr('id') 14173 }); 14174 14175 _addEventHandlers.call(this); 14176 }, 14177 14178 /** 14179 * @desc Removes maga menu javascript behavior 14180 * @example $(selector).accessibleMegaMenu("destroy"); 14181 * @return {object} 14182 * @memberof jQuery.fn.accessibleMegaMenu 14183 * @instance 14184 */ 14185 destroy: function destroy() { 14186 this.menu.removeClass(['js', this.settings.menuClass].join('-')); 14187 14188 _removeEventHandlers.call(this, true); 14189 }, 14190 14191 /** 14192 * @desc Get default values 14193 * @example $(selector).accessibleMegaMenu("getDefaults"); 14194 * @return {object} 14195 * @memberof jQuery.fn.accessibleMegaMenu 14196 * @instance 14197 */ 14198 getDefaults: function getDefaults() { 14199 return this._defaults; 14200 }, 14201 14202 /** 14203 * @desc Get any option set to plugin using its name (as string) 14204 * @example $(selector).accessibleMegaMenu("getOption", some_option); 14205 * @param {string} opt 14206 * @return {string} 14207 * @memberof jQuery.fn.accessibleMegaMenu 14208 * @instance 14209 */ 14210 getOption: function getOption(opt) { 14211 return this.settings[opt]; 14212 }, 14213 14214 /** 14215 * @desc Get all options 14216 * @example $(selector).accessibleMegaMenu("getAllOptions"); 14217 * @return {object} 14218 * @memberof jQuery.fn.accessibleMegaMenu 14219 * @instance 14220 */ 14221 getAllOptions: function getAllOptions() { 14222 return this.settings; 14223 }, 14224 14225 /** 14226 * @desc Set option 14227 * @example $(selector).accessibleMegaMenu("setOption", "option_name", "option_value", reinitialize); 14228 * @param {string} opt - Option name 14229 * @param {string} val - Option value 14230 * @param {boolean} [reinitialize] - boolean to re-initialize the menu. 14231 * @memberof jQuery.fn.accessibleMegaMenu 14232 * @instance 14233 */ 14234 setOption: function setOption(opt, value, reinitialize) { 14235 this.settings[opt] = value; 14236 14237 if (reinitialize) { 14238 this.init(); 14239 } 14240 } 14241 }; 14242 }(); 14243 /* lightweight plugin wrapper around the constructor, 14244 to prevent against multiple instantiations */ 14245 14246 /** 14247 * @class accessibleMegaMenu 14248 * @memberOf jQuery.fn 14249 * @classdesc Implements an accessible mega menu as a jQuery plugin. 14250 * <p>The mega-menu It is modeled after the mega menu on {@link http://adobe.com|adobe.com} but has been simplified for use by others. A brief description of the interaction design choices can be found in a blog post at {@link http://blogs.adobe.com/accessibility/2013/05/adobe-com.html|Mega menu accessibility on adobe.com}.</p> 14251 * <h3>Keyboard Accessibility</h3> 14252 * <p>The accessible mega menu supports keyboard interaction modeled after the behavior described
14252in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern}, however we also try to respect users' general expectations for the behavior of links in a global navigation. To this end, the accessible mega menu implementation permits tab focus on each of the six top-level menu items. When one of the menu items has focus, pressing the Enter key, Spacebar or Down arrow will open the submenu panel, and pressing the Left or Right arrow key will shift focus to the adjacent menu item. Links within the submenu panels are included in the tab order when the panel is open. They can also be navigated with the arrow keys or by typing the first character in the link name, which speeds up keyboard navigation considerably. Pressing the Escape key closes the submenu and restores focus to the parent menu item.</p> 14253 * <h3>Screen Reader Accessibility</h3> 14254 * <p>The accessible mega menu models its use of WAI-ARIA Roles, States, and Properties after those described in the {@link http://www.w3.org/TR/wai-aria-practices/#menu|WAI-ARIA Menu or Menu bar (widget) design pattern} with some notable exceptions, so that it behaves better with screen reader user expectations for global navigation. We don't use <code class="prettyprint prettyprinted" style=""><span class="pln">role</span><span class="pun">=</span><span class="str">"menu"</span></code> for the menu container and <code class="prettyprint prettyprinted" style=""><span class="pln">role</span><span class="pun">=</span><span class="str">"menuitem"</span></code> for each of the links therein, because if we do, assistive technology will no longer interpret the links as links, but instead, as menu items, and the links in our global navigation will no longer show up when a screen reader user executes a shortcut command to bring up a list of links in the page.</p> 14255 * @example <h4>HTML</h4><hr/> 14256 <nav> 14257 <ul class="nav-menu"> 14258 <li class="nav-item"> 14259 <a href="?movie">Movies</a> 14260 <div class="sub-nav"> 14261 <ul class="sub-nav-group"> 14262 <li><a href="?movie&genre=0">Action &amp; Adventure</a></li> 14263 <li><a href="?movie&genre=2">Children &amp; Family</a></li> 14264 <li>&#8230;</li> 14265 </ul> 14266 <ul class="sub-nav-group"> 14267 <li><a href="?movie&genre=7">Dramas</a></li> 14268 <li><a href="?movie&genre=9">Foreign</a></li> 14269 <li>&#8230;</li> 14270 </ul> 14271 <ul class="sub-nav-group"> 14272 <li><a href="?movie&genre=14">Musicals</a></li> 14273 <li><a href="?movie&genre=15">Romance</a></li> 14274 <li>&#8230;</li> 14275 </ul> 14276 </div> 14277 </li> 14278 <li class="nav-item"> 14279 <a href="?tv">TV Shows</a> 14280 <div class="sub-nav"> 14281 <ul class="sub-nav-group"> 14282 <li><a href="?tv&genre=20">Classic TV</a></li> 14283 <li><a href="?tv&genre=21">Crime TV</a></li> 14284 <li>&#8230;</li> 14285 </ul> 14286 <ul class="sub-nav-group"> 14287 <li><a href="?tv&genre=27">Reality TV</a></li> 14288 <li><a href="?tv&genre=30">TV Action</a></li> 14289 <li>&#8230;</li> 14290 </ul> 14291 <ul class="sub-nav-group"> 14292 <li><a href="?tv&genre=33">TV Dramas</a></li> 14293 <li><a href="?tv&genre=34">TV Horror</a></li> 14294 <li>&#8230;</li> 14295 </ul> 14296 </div> 14297 </li> 14298 </ul> 14299 </nav> 14300 * @example <h4>CSS</h4><hr/> 14301 /* Rudimentary mega menu CSS for demonstration */ 14302 /* mega menu list */ 14303 .nav-menu { 14304 display: block; 14305 position: relative; 14306 list-style: none; 14307 margin: 0; 14308 padding: 0; 14309 z-index: 15; 14310 } 14311 /* a top level navigation item in the mega menu */ 14312 .nav-item { 14313 list-style: none; 14314 display: inline-block; 14315 padding: 0; 14316 margin: 0; 14317 } 14318 /* first descendant link within a top level navigation item */ 14319 .nav-item > a { 14320 position: relative; 14321 display: inline-block; 14322 padding: 0.5em 1em; 14323 margin: 0 0 -1px 0; 14324 border: 1px solid transparent; 14325 } 14326 /* focus/open states of first descendant link within a top level 14327 navigation item */ 14328 .nav-item > a:focus, 14329 .nav-item > a.open { 14330 border: 1px solid #dedede; 14331 } 14332 /* open state of first descendant link within a top level 14333 navigation item */ 14334 .nav-item > a.open { 14335 background-color: #fff; 14336 border-bottom: none; 14337 z-index: 1; 14338 } 14339 /* sub-navigation panel */ 14340 .sub-nav { 14341 position: absolute; 14342 display: none; 14343 top: 2.2em;
14344 margin-top: -1px; 14345 padding: 0.5em 1em; 14346 border: 1px solid #dedede; 14347 background-color: #fff; 14348 } 14349 /* sub-navigation panel open state */ 14350 .sub-nav.open { 14351 display: block; 14352 } 14353 /* list of items within sub-navigation panel */ 14354 .sub-nav ul { 14355 display: inline-block; 14356 vertical-align: top; 14357 margin: 0 1em 0 0; 14358 padding: 0; 14359 } 14360 /* list item within sub-navigation panel */ 14361 .sub-nav li { 14362 display: block; 14363 list-style-type: none; 14364 margin: 0; 14365 padding: 0; 14366 } 14367 * @example <h4>JavaScript</h4><hr/> 14368 <!-- include jquery --> 14369 <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> 14370 <!-- include the jquery-accessibleMegaMenu plugin script --> 14371 <script src="js/jquery-accessibleMegaMenu.js"></script> 14372 <!-- initialize a selector as an accessibleMegaMenu --> 14373 <script> 14374 $("nav:first").accessibleMegaMenu({ 14375 /* prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby */ 14376 uuidPrefix: "accessible-megamenu", 14377 /* css class used to define the megamenu styling */ 14378 menuClass: "nav-menu", 14379 /* css class for a top-level navigation item in the megamenu */ 14380 topNavItemClass: "nav-item", 14381 /* css class for a megamenu panel */ 14382 panelClass: "sub-nav", 14383 /* css class for a group of items within a megamenu panel */ 14384 panelGroupClass: "sub-nav-group", 14385 /* css class for the hover state */ 14386 hoverClass: "hover", 14387 /* css class for the focus state */ 14388 focusClass: "focus", 14389 /* css class for the open state */ 14390 openClass: "open" 14391 }); 14392 </script> 14393 * @param {object} [options] Mega Menu options 14394 * @param {string} [options.uuidPrefix=accessible-megamenu] - Prefix for generated unique id attributes, which are required to indicate aria-owns, aria-controls and aria-labelledby 14395 * @param {string} [options.menuClass=accessible-megamenu] - CSS class used to define the megamenu styling 14396 * @param {string} [options.topNavItemClass=accessible-megamenu-top-nav-item] - CSS class for a top-level navigation item in the megamenu 14397 * @param {string} [options.panelClass=accessible-megamenu-panel] - CSS class for a megamenu panel 14398 * @param {string} [options.panelGroupClass=accessible-megamenu-panel-group] - CSS class for a group of items within a megamenu panel 14399 * @param {string} [options.hoverClass=hover] - CSS class for the hover state 14400 * @param {string} [options.focusClass=focus] - CSS class for the focus state 14401 * @param {string} [options.openClass=open] - CSS class for the open state 14402 * @param {string} [options.openDelay=0] - Open delay when opening menu via mouseover 14403 * @param {string} [options.closeDelay=250] - Open delay when opening menu via mouseover 14404 * @param {boolean} [options.openOnMouseover=false] - Should menu open on mouseover 14405 */ 14406 14407 14408 $.fn[pluginName] = function (options) { 14409 return this.each(function () { 14410 var pluginInstance = $.data(this, "plugin_" + pluginName); 14411 14412 if (!pluginInstance) { 14413 $.data(this, "plugin_" + pluginName, new $.fn[pluginName].Acce
14413ssibleMegaMenu(this, options)); 14414 } else if (typeof pluginInstance[options] === 'function') { 14415 pluginInstance[options].apply(pluginInstance, Array.prototype.slice.call(arguments, 1)); 14416 } 14417 }); 14418 }; 14419 14420 $.fn[pluginName].AccessibleMegaMenu = AccessibleMegaMenu; 14421 /* :focusable and :tabbable selectors from 14422 https://raw.github.com/jquery/jquery-ui/master/ui/jquery.ui.core.js */ 14423 14424 /** 14425 * @private 14426 */ 14427 14428 function visible(element) { 14429 return $.expr.filters.visible(element) && !$(element).parents().addBack().filter(function () { 14430 return $.css(this, "visibility") === "hidden"; 14431 }).length; 14432 } 14433 /** 14434 * @private 14435 */ 14436 14437 14438 function _focusable(element, isTabIndexNotNaN) { 14439 var map, 14440 mapName, 14441 img, 14442 nodeName = element.nodeName.toLowerCase(); 14443 14444 if ("area" === nodeName) { 14445 map = element.parentNode; 14446 mapName = map.name; 14447 14448 if (!element.href || !mapName || map.nodeName.toLowerCase() !== "map") { 14449 return false; 14450 } 14451 14452 img = $("img[usemap=#" + mapName + "]")[0]; 14453 return !!img && visible(img); 14454 } 14455 14456 return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : "a" === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && // the element and all of its ancestors must be visible 14457 visible(element); 14458 } 14459 14460 $.extend($.expr[":"], { 14461 data: $.expr.createPseudo ? $.expr.createPseudo(function (dataName) { 14462 return function (elem) { 14463 return !!$.data(elem, dataName); 14464 }; 14465 }) : // support: jQuery <1.8 14466 function (elem, i, match) { 14467 return !!$.data(elem, match[3]); 14468 }, 14469 focusable: function focusable(element) { 14470 return _focusable(element, !isNaN($.attr(element, "tabindex"))); 14471 }, 14472 tabbable: function tabbable(element) { 14473 var tabIndex = $.attr(element, "tabindex"), 14474 isTabIndexNaN = isNaN(tabIndex); 14475 return (isTabIndexNaN || tabIndex >= 0) && _focusable(element, !isTabIndexNaN); 14476 } 14477 }); 14478})(jQuery, window, document); 14479 14480/***/ }), 14481 14482/***/ 600: 14483/***/ (function() { 14484 14485function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 14486 14487function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 14488 14489function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } 14490 14491var ExpandablePreview = /*#__PURE__*/function () { 14492 function ExpandablePreview(rteContentDiv) { 14493 _classCallCheck(this, ExpandablePreview); 14494 14495 this.lang = document.documentElement.lang || "de"; 14496 this.lang = this.lang.slice(0, 2).toLowerCase(); 14497 this.showMoreText = this.lang === 'de' ? 'Mehr' : 'Show more'; 14498 this.showLessText = this.lang === 'de' ? 'Weniger anzeigen' : 'Show less'; 14499 this.statusMoreText = this.lang === 'de' ? 'Text wurde erweitert' : 'Text was expanded'; 14500 this.statusLessText = this.lang === 'de' ? 'Text wurde reduziert' : 'Text was reduced'; 14501 this.rteContentDiv = rteContentDiv; 14502 this.content = rteContentDiv.innerHTML; 14503 this.expandableId = 'expandable-preview-' + Math.floor(Math.random() * 1000000); 14504 this.init(); 14505 } 14506 14507 _createClass(ExpandablePreview, [{ 14508 key: "init", 14509 value: function init() { 14510 if (this.rteContentDiv.offsetHeight < 300) { 14511 // Wenn die Höhe des Inhalts kleiner als 300px ist, 14512 // wird die Klappfunktion nicht benötigt 14513 return; 14514 } 14515 14516 this.createMarkup(); 14517 this.bindEvents(); 14518 } 14519 }, { 14520 key: "createMarkup", 14521 value: function createMarkup() { 14522 var newMarkup = "\n <div class=\"rteContent expandable-preview expandable-preview--processed\">\n <div id=\"".concat(this.expandableId, "__text\" class=\"expandable-preview__text expandable-preview__text--collapsed\" aria-live=\"polite\">\n ").concat(this.content, "\n </div>\n <button id=\"").concat(this.expandableId, "__toggle\" class=\"expandable-preview__toggle ajaxLoadmore__button button button button--expand\" aria-controls=\"").concat(this.expandableId, "__text\" aria-expanded=\"false\">\n <svg aria-hidden=\"true\" xmlns=\"http://www.w3.org/2000/svg\" width=\"11\" height=\"13\" viewBox=\"0 0 11 13\">\n <g fill=\"none\" fill-rule=\"evenodd\" stroke=\"currentColor\" stroke-width=\"1.5\" transform=\"translate(0 1)\">\n <line x1=\"5.5\" x2=\"5.5\" y2=\"11\"/>\n <line x2=\"11\" y1=\"5.5\" y2=\"5.5\"/>\n </g>\n </svg>
14522\n <span>").concat(this.showMoreText, "</span>\n </button>\n <div id=\"").concat(this.expandableId, "__status\" aria-live=\"polite\" class=\"visuallyhidden\"></div>\n </div>\n "); 14523 this.rteContentDiv.outerHTML = newMarkup; 14524 } 14525 }, { 14526 key: "bindEvents", 14527 value: function bindEvents() { 14528 var _this = this; 14529 14530 var toggleButton = document.getElementById("".concat(this.expandableId, "__toggle")); 14531 var toggleButtonSpan = toggleButton.querySelector('span'); 14532 toggleButton.addEventListener('click', function () { 14533 var textDiv = document.getElementById("".concat(_this.expandableId, "__text")); 14534 var statusDiv = document.getElementById("".concat(_this.expandableId, "__status")); 14535 var isExpanded = toggleButton.getAttribute('aria-expanded') === 'true'; 14536 14537 if (isExpanded) { 14538 textDiv.classList.add('expandable-preview__text--collapsed'); 14539 } else { 14540 textDiv.classList.remove('expandable-preview__text--collapsed'); 14541 } 14542 14543 toggleButton.setAttribute('aria-expanded', !isExpanded); 14544 toggleButtonSpan.innerText = isExpanded ? _this.showMoreText : _this.showLessText; 14545 statusDiv.innerText = isExpanded ? _this.statusLessText : _this.statusMoreText; 14546 }); 14547 } 14548 }]); 14549 14550 return ExpandablePreview; 14551}(); 14552 14553document.addEventListener('DOMContentLoaded', function () { 14554 var rteContentDivs = document.querySelectorAll('.expandable-preview:not(.expandable-preview--processed)'); 14555 rteContentDivs.forEach(function (rteContentDiv) { 14556 if (rteContentDiv) { 14557 new ExpandablePreview(rteContentDiv); 14558 } 14559 }); 14560}); 14561 14562/***/ }), 14563 14564/***/ 9709: 14565/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { 14566 14567/* provided dependency */ var $ = __webpack_require__(3336); 14568function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 14569 14570function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } 14571 14572function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } 14573 14574var TileTeaser = /*#__PURE__*/function () { 14575 function TileTeaser(teaser) { 14576 _classCallCheck(this, TileTeaser); 14577 14578 this.teaser = teaser; 14579 this.teaser.classList.remove('loading'); 14580 this.title = teaser.querySelectorAll('[data-title]').item(0); 14581 this.setProperties(this.titleHeight); 14582 this.eventHandler(); 14583 } 14584 14585 _createClass(TileTeaser, [{ 14586 key: "titleHeight", 14587 get: function get() { 14588 return this.title.offsetHeight; 14589 } 14590 /** 14591 * set css variables 14592 * @param titleHeight 14593 */ 14594 14595 }, { 14596 key: "setProperties", 14597 value: function setProperties(titleHeight) { 14598 this.teaser.style.setProperty('--title-height', titleHeight + "px"); 14599 } 14600 }, { 14601 key: "eventHandler", 14602 value: function eventHandler() { 14603 window.addEventListener('resize', this.setProperties(this.titleHeight)); 14604 } 14605 }]); 14606 14607 return TileTeaser; 14608}(); 14609 14610$.when($.ready).then(function () { 14611 var tileTeasers = document.querySelectorAll('.tileTeaser'); 14612 var teaser; 14613 tileTeasers.forEach(function (t) { 14614 teaser = new TileTeaser(t); 14615 }); 14616}); 14617 14618/***/ }), 14619 14620/***/ 7729: 14621/***/ (function(module, exports, __webpack_require__) { 14622 14623var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! Magnific Popup - v1.1.0 - 2016-02-20 14624* http://dimsemenov.com/plugins/magnific-popup/ 14625* Copyright (c) 2016 Dmitry Semenov; */ 14626;(function (factory) { 14627if (true) { 14628 // AMD. Register as an anonymous module. 14629 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3336)], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 14630 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 14631 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
vendor: 42,744 bytes, lines 14632-16521
14632 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 14633 } else {} 14634 }(function($) { 14635 14636/*>>core*/ 14637/** 14638 * 14639 * Magnific Popup Core JS file 14640 * 14641 */ 14642 14643 14644/** 14645 * Private static constants 14646 */ 14647var CLOSE_EVENT = 'Close', 14648 BEFORE_CLOSE_EVENT = 'BeforeClose', 14649 AFTER_CLOSE_EVENT = 'AfterClose', 14650 BEFORE_APPEND_EVENT = 'BeforeAppend', 14651 MARKUP_PARSE_EVENT = 'MarkupParse', 14652 OPEN_EVENT = 'Open', 14653 CHANGE_EVENT = 'Change', 14654 NS = 'mfp', 14655 EVENT_NS = '.' + NS, 14656 READY_CLASS = 'mfp-ready', 14657 REMOVING_CLASS = 'mfp-removing', 14658 PREVENT_CLOSE_CLASS = 'mfp-prevent-close'; 14659 14660 14661/** 14662 * Private vars 14663 */ 14664/*jshint -W079 */ 14665var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this' 14666 MagnificPopup = function(){}, 14667 _isJQ = !!(window.jQuery), 14668 _prevStatus, 14669 _window = $(window), 14670 _document, 14671 _prevContentType, 14672 _wrapClasses, 14673 _currPopupType; 14674 14675 14676/** 14677 * Private functions 14678 */ 14679var _mfpOn = function(name, f) { 14680 mfp.ev.on(NS + name + EVENT_NS, f); 14681 }, 14682 _getEl = function(className, appendTo, html, raw) { 14683 var el = document.createElement('div'); 14684 el.className = 'mfp-'+className; 14685 if(html) { 14686 el.innerHTML = html; 14687 } 14688 if(!raw) { 14689 el = $(el); 14690 if(appendTo) { 14691 el.appendTo(appendTo); 14692 } 14693 } else if(appendTo) { 14694 appendTo.appendChild(el); 14695 } 14696 return el; 14697 }, 14698 _mfpTrigger = function(e, data) { 14699 mfp.ev.triggerHandler(NS + e, data); 14700 14701 if(mfp.st.callbacks) { 14702 // converts "mfpEventName" to "eventName" callback and triggers it if it's present 14703 e = e.charAt(0).toLowerCase() + e.slice(1); 14704 if(mfp.st.callbacks[e]) { 14705 mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]); 14706 } 14707 } 14708 }, 14709 _getCloseBtn = function(type) { 14710 if(type !== _currPopupType || !mfp.currTemplate.closeBtn) { 14711 mfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) ); 14712 _currPopupType = type; 14713 } 14714 return mfp.currTemplate.closeBtn; 14715 }, 14716 // Initialize Magnific Popup only when called at least once 14717 _checkInstance = function() { 14718 if(!$.magnificPopup.instance) { 14719 /*jshint -W020 */ 14720 mfp = new MagnificPopup(); 14721 mfp.init(); 14722 $.magnificPopup.instance = mfp; 14723 } 14724 }, 14725 // CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr 14726 supportsTransitions = function() { 14727 var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist 14728 v = ['ms','O','Moz','Webkit']; // 'v' for vendor 14729 14730 if( s['transition'] !== undefined ) { 14731 return true; 14732 } 14733 14734 while( v.length ) { 14735 if( v.pop() + 'Transition' in s ) { 14736 return true; 14737 } 14738 } 14739 14740 return false; 14741 }; 14742 14743 14744 14745/** 14746 * Public functions 14747 */ 14748MagnificPopup.prototype = { 14749 14750 constructor: MagnificPopup, 14751 14752 /** 14753 * Initializes Magnific Popup plugin. 14754 * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed 14755 */ 14756 init: function() { 14757 var appVersion = navigator.appVersion; 14758 mfp.isLowIE = mfp.isIE8 = document.all && !document.addEventListener; 14759 mfp.isAndroid = (/android/gi).test(appVersion); 14760 mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion); 14761 mfp.supportsTransition = supportsTransitions(); 14762 14763 // We disable fixed positioned lightbox on devices that don't handle it nicely. 14764 // If you know a better way of detecting this - let me know. 14765 mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) ); 14766 _document = $(document); 14767 14768 mfp.popupsCache = {}; 14769 }, 14770 14771 /** 14772 * Opens popup 14773 * @param data [description] 14774 */ 14775 open: function(data) { 14776 14777 var i; 14778 14779 if(data.isObj === false) { 14780 // convert jQuery collection to array to avoid conflicts later 14781 mfp.items = data.items.toArray(); 14782 14783 mfp.index = 0; 14784 var items = data.items, 14785 item; 14786 for(i = 0; i < items.length; i++) { 14787 item = items[i]; 14788 if(item.parsed) { 14789 item = item.el[0]; 14790 } 14791 if(item === data.el[0]) { 14792 mfp.index = i; 14793 break; 14794 } 14795 } 14796 } else { 14797 mfp.items = $.isArray(data.items) ? data.items : [data.items]; 14798 mfp.index = data.index || 0; 14799 } 14800 14801 // if popup is already opened - we just update the content 14802 if(mfp.isOpen) { 14803 mfp.updateItemHTML(); 14804 return; 14805 } 14806 14807 mfp.types = []; 14808 _wrapClasses = ''; 14809 if(data.mainEl && data.mainEl.length) { 14810 mfp.ev = data.mainEl.eq(0); 14811 } else { 14812 mfp.ev = _document; 14813 } 14814 14815 if(data.key) { 14816 if(!mfp.popupsCache[data.key]) { 14817 mfp.popupsCache[data.key] = {}; 14818 } 14819 mfp.currTemplate = mfp.popupsCache[data.key]; 14820 } else { 14821 mfp.currTemplate = {}; 14822 } 14823 14824 14825 14826 mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data ); 14827 mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos; 14828 14829 if(mfp.st.modal) { 14830 mfp.st.closeOnContentClick = false; 14831 mfp.st.closeOnBgClick = false; 14832 mfp.st.showCloseBtn = false; 14833 mfp.st.enableEscapeKey = false; 14834 } 14835 14836 14837 // Building markup 14838 // main containers are created only once 14839 if(!mfp.bgOverlay) { 14840 14841 // Dark overlay 14842 mfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() { 14843 mfp.close(); 14844 }); 14845 14846 mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) { 14847 if(mfp._checkIfClose(e.target)) { 14848 mfp.close(); 14849 } 14850 }); 14851 14852 mfp.container = _getEl('container', mfp.wrap); 14853 } 14854 14855 mfp.contentContainer = _getEl('content'); 14856 if(mfp.st.preloader) { 14857 mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading); 14858 } 14859 14860 14861 // Initializing modules 14862 var modules = $.magnificPopup.modules; 14863 for(i = 0; i < modules.length; i++) { 14864 var n = modules[i]; 14865 n = n.charAt(0).toUpperCase() + n.slice(1); 14866 mfp['init'+n].call(mfp); 14867 } 14868 _mfpTrigger('BeforeOpen'); 14869 14870 14871 if(mfp.st.showCloseBtn) { 14872 // Close button 14873 if(!mfp.st.closeBtnInside) { 14874 mfp.wrap.append( _getCloseBtn() ); 14875 } else { 14876 _mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) { 14877 values.close_replaceWith = _getCloseBtn(item.type); 14878 }); 14879 _wrapClasses += ' mfp-close-btn-in'; 14880 } 14881 } 14882 14883 if(mfp.st.alignTop) { 14884 _wrapClasses += ' mfp-align-top'; 14885 } 14886 14887 14888 14889 if(mfp.fixedContentPos) { 14890 mfp.wrap.css({ 14891 overflow: mfp.st.overflowY, 14892 overflowX: 'hidden', 14893 overflowY: mfp.st.overflowY 14894 }); 14895 } else { 14896 mfp.wrap.css({ 14897 top: _window.scrollTop(), 14898 position: 'absolute' 14899 }); 14900 } 14901 if( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) { 14902 mfp.bgOverlay.css({ 14903 height: _document.height(), 14904 position: 'absolute' 14905 }); 14906 } 14907 14908 14909 14910 if(mfp.st.enableEscapeKey) { 14911 // Close on ESC key 14912 _document.on('keyup' + EVENT_NS, function(e) { 14913 if(e.keyCode === 27) { 14914 mfp.close(); 14915 } 14916 }); 14917 } 14918 14919 _window.on('resize' + EVENT_NS, function() { 14920 mfp.updateSize(); 14921 }); 14922 14923 14924 if(!mfp.st.closeOnContentClick) { 14925 _wrapClasses += ' mfp-auto-cursor'; 14926 } 14927 14928 if(_wrapClasses) 14929 mfp.wrap.addClass(_wrapClasses); 14930 14931 14932 // this triggers recalculation of layout, so we get it once to not to trigger twice 14933 var windowHeight = mfp.wH = _window.height(); 14934 14935 14936 var windowStyles = {}; 14937 14938 if( mfp.fixedContentPos ) { 14939 if(mfp._hasScrollBar(windowHeight)){ 14940 var s = mfp._getScrollbarSize(); 14941 if(s) { 14942 windowStyles.marginRight = s; 14943 } 14944 } 14945 } 14946 14947 if(mfp.fixedContentPos) { 14948 if(!mfp.isIE7) { 14949 windowStyles.overflow = 'hidden'; 14950 } else { 14951 // ie7 double-scroll bug 14952 $('body, html').css('overflow', 'hidden'); 14953 } 14954 } 14955 14956 14957 14958 var classesToadd = mfp.st.mainClass; 14959 if(mfp.isIE7) { 14960 classesToadd += ' mfp-ie7'; 14961 } 14962 if(classesToadd) { 14963 mfp._addClassToMFP( classesToadd ); 14964 } 14965 14966 // add content 14967 mfp.updateItemHTML(); 14968 14969 _mfpTrigger('BuildControls'); 14970 14971 // remove scrollbar, add margin e.t.c 14972 $('html').css(windowStyles); 14973 14974 // add everything to DOM 14975 mfp.bgOverlay.add(mfp.wrap).prependTo( mfp.st.prependTo || $(document.body) ); 14976 14977 // Save last focused element 14978 mfp._lastFocusedEl = document.activeElement; 14979 14980 // Wait for next cycle to allow CSS transition 14981 setTimeout(function() { 14982 14983 if(mfp.content) { 14984 mfp._addClassToMFP(READY_CLASS); 14985 mfp._setFocus(); 14986 } else { 14987 // if content is not defined (not loaded e.t.c) we add class only for BG 14988 mfp.bgOverlay.addClass(READY_CLASS); 14989 } 14990 14991 // Trap the focus in popup 14992 _document.on('focusin' + EVENT_NS, mfp._onFocusIn); 14993 14994 }, 16); 14995 14996 mfp.isOpen = true; 14997 mfp.updateSize(windowHeight); 14998 _mfpTrigger(OPEN_EVENT); 14999 15000 return data; 15001 }, 15002 15003 /** 15004 * Closes the popup 15005 */ 15006 close: function() { 15007 if(!mfp.isOpen) return; 15008 _mfpTrigger(BEFORE_CLOSE_EVENT); 15009 15010 mfp.isOpen = false; 15011 // for CSS3 animation 15012 if(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition ) { 15013 mfp._addClassToMFP(REMOVING_CLASS); 15014 setTimeout(function() { 15015 mfp._close(); 15016 }, mfp.st.removalDelay); 15017 } else { 15018 mfp._close(); 15019 } 15020 }, 15021 15022 /** 15023 * Helper for close() function 15024 */ 15025 _close: function() { 15026 _mfpTrigger(CLOSE_EVENT); 15027 15028 var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' '; 15029 15030 mfp.bgOverlay.detach(); 15031 mfp.wrap.detach(); 15032 mfp.container.empty(); 15033 15034 if(mfp.st.mainClass) { 15035 classesToRemove += mfp.st.mainClass + ' '; 15036 } 15037 15038 mfp._removeClassFromMFP(classesToRemove); 15039 15040 if(mfp.fixedContentPos) { 15041 var windowStyles = {marginRight: ''}; 15042 if(mfp.isIE7) { 15043 $('body, html').css('overflow', ''); 15044 } else { 15045 windowStyles.overflow = ''; 15046 } 15047 $('html').css(windowStyles); 15048 } 15049 15050 _document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS); 15051 mfp.ev.off(EVENT_NS); 15052 15053 // clean up DOM elements that aren't removed 15054 mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style'); 15055 mfp.bgOverlay.attr('class', 'mfp-bg'); 15056 mfp.container.attr('class', 'mfp-container'); 15057 15058 // remove close button from target element 15059 if(mfp.st.showCloseBtn && 15060 (!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) { 15061 if(mfp.currTemplate.closeBtn) 15062 mfp.currTemplate.closeBtn.detach(); 15063 } 15064 15065 15066 if(mfp.st.autoFocusLast && mfp._lastFocusedEl) { 15067 $(mfp._lastFocusedEl).focus(); // put tab focus back 15068 } 15069 mfp.currItem = null; 15070 mfp.content = null; 15071 mfp.currTemplate = null; 15072 mfp.prevHeight = 0; 15073 15074 _mfpTrigger(AFTER_CLOSE_EVENT); 15075 }, 15076 15077 updateSize: function(winHeight) { 15078 15079 if(mfp.isIOS) { 15080 // fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2 15081 var zoomLevel = document.documentElement.clientWidth / window.innerWidth; 15082 var height = window.innerHeight * zoomLevel; 15083 mfp.wrap.css('height', height); 15084 mfp.wH = height; 15085 } else { 15086 mfp.wH = winHeight || _window.height(); 15087 } 15088 // Fixes #84: popup incorrectly positioned with position:relative on body 15089 if(!mfp.fixedContentPos) { 15090 mfp.wrap.css('height', mfp.wH); 15091 } 15092 15093 _mfpTrigger('Resize'); 15094 15095 }, 15096 15097 /** 15098 * Set content of popup based on current index 15099 */ 15100 updateItemHTML: function() { 15101 var item = mfp.items[mfp.index]; 15102 15103 // Detach and perform modifications 15104 mfp.contentContainer.detach(); 15105 15106 if(mfp.content) 15107 mfp.content.detach(); 15108 15109 if(!item.parsed) { 15110 item = mfp.parseEl( mfp.index ); 15111 } 15112 15113 var type = item.type; 15114 15115 _mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]); 15116 // BeforeChange event works like so: 15117 // _mfpOn('BeforeChange', function(e, prevType, newType) { }); 15118 15119 mfp.currItem = item; 15120 15121 if(!mfp.currTemplate[type]) { 15122 var markup = mfp.st[type] ? mfp.st[type].markup : false; 15123 15124 // allows to modify markup 15125 _mfpTrigger('FirstMarkupParse', markup); 15126 15127 if(markup) { 15128 mfp.currTemplate[type] = $(markup); 15129 } else { 15130 // if there is no markup found we just define that template is parsed 15131 mfp.currTemplate[type] = true; 15132 } 15133 } 15134 15135 if(_prevContentType && _prevContentType !== item.type) { 15136 mfp.container.removeClass('mfp-'+_prevContentType+'-holder'); 15137 } 15138 15139 var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]); 15140 mfp.appendContent(newContent, type); 15141 15142 item.preloaded = true; 15143 15144 _mfpTrigger(CHANGE_EVENT, item); 15145 _prevContentType = item.type; 15146 15147 // Append container back after its content changed 15148 mfp.container.prepend(mfp.contentContainer); 15149 15150 _mfpTrigger('AfterChange'); 15151 }, 15152 15153 15154 /** 15155 * Set HTML content of popup 15156 */ 15157 appendContent: function(newContent, type) { 15158 mfp.content = newContent; 15159 15160 if(newContent) { 15161 if(mfp.st.showCloseBtn && mfp.st.closeBtnInside && 15162 mfp.currTemplate[type] === true) { 15163 // if there is no markup, we just append close button element inside 15164 if(!mfp.content.find('.mfp-close').length) { 15165 mfp.content.append(_getCloseBtn()); 15166 } 15167 } else { 15168 mfp.content = newContent; 15169 } 15170 } else { 15171 mfp.content = ''; 15172 } 15173 15174 _mfpTrigger(BEFORE_APPEND_EVENT); 15175 mfp.container.addClass('mfp-'+type+'-holder'); 15176 15177 mfp.contentContainer.append(mfp.content); 15178 }, 15179 15180 15181 /** 15182 * Creates Magnific Popup data object based on given data 15183 * @param {int} index Index of item to parse 15184 */ 15185 parseEl: function(index) { 15186 var item = mfp.items[index], 15187 type; 15188 15189 if(item.tagName) { 15190 item = { el: $(item) }; 15191 } else { 15192 type = item.type; 15193 item = { data: item, src: item.src }; 15194 } 15195 15196 if(item.el) { 15197 var types = mfp.types; 15198 15199 // check for 'mfp-TYPE' class 15200 for(var i = 0; i < types.length; i++) { 15201 if( item.el.hasClass('mfp-'+types[i]) ) { 15202 type = types[i]; 15203 break; 15204 } 15205 } 15206 15207 item.src = item.el.attr('data-mfp-src'); 15208 if(!item.src) { 15209 item.src = item.el.attr('href'); 15210 } 15211 } 15212 15213 item.type = type || mfp.st.type || 'inline'; 15214 item.index = index; 15215 item.parsed = true; 15216 mfp.items[index] = item; 15217 _mfpTrigger('ElementParse', item); 15218 15219 return mfp.items[index]; 15220 }, 15221 15222 15223 /** 15224 * Initializes single popup or a group of popups 15225 */ 15226 addGroup: function(el, options) { 15227 var eHandler = function(e) { 15228 e.mfpEl = this; 15229 mfp._openClick(e, el, options); 15230 }; 15231 15232 if(!options) { 15233 options = {}; 15234 } 15235 15236 var eName = 'click.magnificPopup'; 15237 options.mainEl = el; 15238 15239 if(options.items) { 15240 options.isObj = true; 15241 el.off(eName).on(eName, eHandler); 15242 } else { 15243 options.isObj = false; 15244 if(options.delegate) { 15245 el.off(eName).on(eName, options.delegate , eHandler); 15246 } else { 15247 options.items = el; 15248 el.off(eName).on(eName, eHandler); 15249 } 15250 } 15251 }, 15252 _openClick: function(e, el, options) { 15253 var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick; 15254 15255 15256 if(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey ) ) { 15257 return; 15258 } 15259 15260 var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn; 15261 15262 if(disableOn) { 15263 if($.isFunction(disableOn)) { 15264 if( !disableOn.call(mfp) ) { 15265 return true; 15266 } 15267 } else { // else it's number 15268 if( _window.width() < disableOn ) { 15269 return true; 15270 } 15271 } 15272 } 15273 15274 if(e.type) { 15275 e.preventDefault(); 15276 15277 // This will prevent popup from closing if element is inside and popup is already opened 15278 if(mfp.isOpen) { 15279 e.stopPropagation(); 15280 } 15281 } 15282 15283 options.el = $(e.mfpEl); 15284 if(options.delegate) { 15285 options.items = el.find(options.delegate); 15286 } 15287 mfp.open(options); 15288 }, 15289 15290 15291 /** 15292 * Updates text on preloader 15293 */ 15294 updateStatus: function(status, text) { 15295 15296 if(mfp.preloader) { 15297 if(_prevStatus !== status) { 15298 mfp.container.removeClass('mfp-s-'+_prevStatus); 15299 } 15300 15301 if(!text && status === 'loading') { 15302 text = mfp.st.tLoading; 15303 } 15304 15305 var data = { 15306 status: status, 15307 text: text 15308 }; 15309 // allows to modify status 15310 _mfpTrigger('UpdateStatus', data); 15311 15312 status = data.status; 15313 text = data.text; 15314 15315 mfp.preloader.html(text); 15316 15317 mfp.preloader.find('a').on('click', function(e) { 15318 e.stopImmediatePropagation(); 15319 }); 15320 15321 mfp.container.addClass('mfp-s-'+status); 15322 _prevStatus = status; 15323 } 15324 }, 15325 15326 15327 /* 15328 "Private" helpers that aren't private at all 15329 */ 15330 // Check to close popup or not 15331 // "target" is an element that was clicked 15332 _checkIfClose: function(target) { 15333 15334 if($(target).hasClass(PREVENT_CLOSE_CLASS)) { 15335 return; 15336 } 15337 15338 var closeOnContent = mfp.st.closeOnContentClick; 15339 var closeOnBg = mfp.st.closeOnBgClick; 15340 15341 if(closeOnContent && closeOnBg) { 15342 return true; 15343 } else { 15344 15345 // We close the popup if click is on close button or on preloader. Or if there is no content. 15346 if(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) { 15347 return true; 15348 } 15349 15350 // if click is outside the content 15351 if( (target !== mfp.content[0] && !$.contains(mfp.content[0], target)) ) { 15352 if(closeOnBg) { 15353 // last check, if the clicked element is in DOM, (in case it's removed onclick) 15354 if( $.contains(document, target) ) { 15355 return true; 15356 } 15357 } 15358 } else if(closeOnContent) { 15359 return true; 15360 } 15361 15362 } 15363 return false; 15364 }, 15365 _addClassToMFP: function(cName) { 15366 mfp.bgOverlay.addClass(cName); 15367 mfp.wrap.addClass(cName); 15368 }, 15369 _removeClassFromMFP: function(cName) { 15370 this.bgOverlay.removeClass(cName); 15371 mfp.wrap.removeClass(cName); 15372 }, 15373 _hasScrollBar: function(winHeight) { 15374 return ( (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) ); 15375 }, 15376 _setFocus: function() { 15377 (mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus(); 15378 }, 15379 _onFocusIn: function(e) { 15380 if( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) { 15381 mfp._setFocus(); 15382 return false; 15383 } 15384 }, 15385 _parseMarkup: function(template, values, item) { 15386 var arr; 15387 if(item.data) { 15388 values = $.extend(item.data, values); 15389 } 15390 _mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] ); 15391 15392 $.each(values, function(key, value) { 15393 if(value === undefined || value === false) { 15394 return true; 15395 } 15396 arr = key.split('_'); 15397 if(arr.length > 1) { 15398 var el = template.find(EVENT_NS + '-'+arr[0]); 15399 15400 if(el.length > 0) { 15401 var attr = arr[1]; 15402 if(attr === 'replaceWith') { 15403 if(el[0] !== value[0]) { 15404 el.replaceWith(value); 15405 } 15406 } else if(attr === 'img') { 15407 if(el.is('img')) { 15408 el.attr('src', value); 15409 } else { 15410 el.replaceWith( $('<img>').attr('src', value).attr('class', el.attr('class')) ); 15411 } 15412 } else { 15413 el.attr(arr[1], value); 15414 } 15415 } 15416 15417 } else { 15418 template.find(EVENT_NS + '-'+key).html(value); 15419 } 15420 }); 15421 }, 15422 15423 _getScrollbarSize: function() { 15424 // thx David 15425 if(mfp.scrollbarSize === undefined) { 15426 var scrollDiv = document.createElement("div"); 15427 scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;'; 15428 document.body.appendChild(scrollDiv); 15429 mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth; 15430 document.body.removeChild(scrollDiv); 15431 } 15432 return mfp.scrollbarSize; 15433 } 15434 15435}; /* MagnificPopup core prototype end */ 15436 15437 15438 15439 15440/** 15441 * Public static functions 15442 */ 15443$.magnificPopup = { 15444 instance: null, 15445 proto: MagnificPopup.prototype, 15446 modules: [], 15447 15448 open: function(options, index) { 15449 _checkInstance(); 15450 15451 if(!options) { 15452 options = {}; 15453 } else { 15454 options = $.extend(true, {}, options); 15455 } 15456 15457 options.isObj = true; 15458 options.index = index || 0; 15459 return this.instance.open(options); 15460 }, 15461 15462 close: function() { 15463 return $.magnificPopup.instance && $.magnificPopup.instance.close(); 15464 }, 15465 15466 registerModule: function(name, module) { 15467 if(module.options) { 15468 $.magnificPopup.defaults[name] = module.options; 15469 } 15470 $.extend(this.proto, module.proto); 15471 this.modules.push(name); 15472 }, 15473 15474 defaults: { 15475 15476 // Info about options is in docs: 15477 // http://dimsemenov.com/plugins/magnific-popup/documentation.html#options 15478 15479 disableOn: 0, 15480 15481 key: null, 15482 15483 midClick: false, 15484 15485 mainClass: '', 15486 15487 preloader: true, 15488 15489 focus: '', // CSS selector of input to focus after popup is opened 15490 15491 closeOnContentClick: false, 15492 15493 closeOnBgClick: true, 15494 15495 closeBtnInside: true, 15496 15497 showCloseBtn: true, 15498 15499 enableEscapeKey: true, 15500 15501 modal: false, 15502 15503 alignTop: false, 15504 15505 removalDelay: 0, 15506 15507 prependTo: null, 15508 15509 fixedContentPos: 'auto', 15510 15511 fixedBgPos: 'auto', 15512 15513 overflowY: 'auto', 15514 15515 closeMarkup: '<button title="%title%" type="button" class="mfp-close">×</button>', 15516 15517 tClose: 'Close (Esc)', 15518 15519 tLoading: 'Loading...', 15520 15521 autoFocusLast: true 15522 15523 } 15524}; 15525 15526 15527 15528$.fn.magnificPopup = function(options) { 15529 _checkInstance(); 15530 15531 var jqEl = $(this); 15532 15533 // We call some API method of first param is a string 15534 if (typeof options === "string" ) { 15535 15536 if(options === 'open') { 15537 var items, 15538 itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup, 15539 index = parseInt(arguments[1], 10) || 0; 15540 15541 if(itemOpts.items) { 15542 items = itemOpts.items[index]; 15543 } else { 15544 items = jqEl; 15545 if(itemOpts.delegate) { 15546 items = items.find(itemOpts.delegate); 15547 } 15548 items = items.eq( index ); 15549 } 15550 mfp._openClick({mfpEl:items}, jqEl, itemOpts); 15551 } else { 15552 if(mfp.isOpen) 15553 mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1)); 15554 } 15555 15556 } else { 15557 // clone options obj 15558 options = $.extend(true, {}, options); 15559 15560 /* 15561 * As Zepto doesn't support .data() method for objects 15562 * and it works only in normal browsers 15563 * we assign "options" object directly to the DOM element. FTW! 15564 */ 15565 if(_isJQ) { 15566 jqEl.data('magnificPopup', options); 15567 } else { 15568 jqEl[0].magnificPopup = options; 15569 } 15570 15571 mfp.addGroup(jqEl, options); 15572 15573 } 15574 return jqEl; 15575}; 15576 15577/*>>core*/ 15578 15579/*>>inline*/ 15580 15581var INLINE_NS = 'inline', 15582 _hiddenClass, 15583 _inlinePlaceholder, 15584 _lastInlineElement, 15585 _putInlineElementsBack = function() { 15586 if(_lastInlineElement) { 15587 _inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach(); 15588 _lastInlineElement = null; 15589 } 15590 }; 15591 15592$.magnificPopup.registerModule(INLINE_NS, { 15593 options: { 15594 hiddenClass: 'hide', // will be appended with `mfp-` prefix 15595 markup: '', 15596 tNotFound: 'Content not found' 15597 }, 15598 proto: { 15599 15600 initInline: function() { 15601 mfp.types.push(INLINE_NS); 15602 15603 _mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() { 15604 _putInlineElementsBack(); 15605 }); 15606 }, 15607 15608 getInline: function(item, template) { 15609 15610 _putInlineElementsBack(); 15611 15612 if(item.src) { 15613 var inlineSt = mfp.st.inline, 15614 el = $(item.src); 15615 15616 if(el.length) { 15617 15618 // If target element has parent - we replace it with placeholder and put it back after popup is closed 15619 var parent = el[0].parentNode; 15620 if(parent && parent.tagName) { 15621 if(!_inlinePlaceholder) { 15622 _hiddenClass = inlineSt.hiddenClass; 15623 _inlinePlaceholder = _getEl(_hiddenClass); 15624 _hiddenClass = 'mfp-'+_hiddenClass; 15625 } 15626 // replace target inline element with placeholder 15627 _lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass); 15628 } 15629 15630 mfp.updateStatus('ready'); 15631 } else { 15632 mfp.updateStatus('error', inlineSt.tNotFound); 15633 el = $('<div>'); 15634 } 15635 15636 item.inlineElement = el; 15637 return el; 15638 } 15639 15640 mfp.updateStatus('ready'); 15641 mfp._parseMarkup(template, {}, item); 15642 return template; 15643 } 15644 } 15645}); 15646 15647/*>>inline*/ 15648 15649/*>>ajax*/ 15650var AJAX_NS = 'ajax', 15651 _ajaxCur, 15652 _removeAjaxCursor = function() { 15653 if(_ajaxCur) { 15654 $(document.body).removeClass(_ajaxCur); 15655 } 15656 }, 15657 _destroyAjaxRequest = function() { 15658 _removeAjaxCursor(); 15659 if(mfp.req) { 15660 mfp.req.abort(); 15661 } 15662 }; 15663 15664$.magnificPopup.registerModule(AJAX_NS, { 15665 15666 options: { 15667 settings: null, 15668 cursor: 'mfp-ajax-cur', 15669 tError: '<a href="%url%">The content</a> could not be loaded.' 15670 }, 15671 15672 proto: { 15673 initAjax: function() { 15674 mfp.types.push(AJAX_NS); 15675 _ajaxCur = mfp.st.ajax.cursor; 15676 15677 _mfpOn(CLOSE_EVENT+'.'+AJAX_NS, _destroyAjaxRequest); 15678 _mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest); 15679 }, 15680 getAjax: function(item) { 15681 15682 if(_ajaxCur) { 15683 $(document.body).addClass(_ajaxCur); 15684 } 15685 15686 mfp.updateStatus('loading'); 15687 15688 var opts = $.extend({ 15689 url: item.src, 15690 success: function(data, textStatus, jqXHR) { 15691 var temp = { 15692 data:data, 15693 xhr:jqXHR 15694 }; 15695 15696 _mfpTrigger('ParseAjax', temp); 15697 15698 mfp.appendContent( $(temp.data), AJAX_NS ); 15699 15700 item.finished = true; 15701 15702 _removeAjaxCursor(); 15703 15704 mfp._setFocus(); 15705 15706 setTimeout(function() { 15707 mfp.wrap.addClass(READY_CLASS); 15708 }, 16); 15709 15710 mfp.updateStatus('ready'); 15711 15712 _mfpTrigger('AjaxContentAdded'); 15713 }, 15714 error: function() { 15715 _removeAjaxCursor(); 15716 item.finished = item.loadError = true; 15717 mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src)); 15718 } 15719 }, mfp.st.ajax.settings); 15720 15721 mfp.req = $.ajax(opts); 15722 15723 return ''; 15724 } 15725 } 15726}); 15727 15728/*>>ajax*/ 15729 15730/*>>image*/ 15731var _imgInterval, 15732 _getTitle = function(item) { 15733 if(item.data && item.data.title !== undefined) 15734 return item.data.title; 15735 15736 var src = mfp.st.image.titleSrc; 15737 15738 if(src) { 15739 if($.isFunction(src)) { 15740 return src.call(mfp, item); 15741 } else if(item.el) { 15742 return item.el.attr(src) || ''; 15743 } 15744 } 15745 return ''; 15746 }; 15747 15748$.magnificPopup.registerModule('image', { 15749 15750 options: { 15751 markup: '<div class="mfp-figure">'+ 15752 '<div class="mfp-close"></div>'+ 15753 '<figure>'+ 15754 '<div class="mfp-img"></div>'+ 15755 '<figcaption>'+ 15756 '<div class="mfp-bottom-bar">'+ 15757 '<div class="mfp-title"></div>'+ 15758 '<div class="mfp-counter"></div>'+ 15759 '</div>'+ 15760 '</figcaption>'+ 15761 '</figure>'+ 15762 '</div>', 15763 cursor: 'mfp-zoom-out-cur', 15764 titleSrc: 'title', 15765 verticalFit: true, 15766 tError: '<a href="%url%">The image</a> could not be loaded.' 15767 }, 15768 15769 proto: { 15770 initImage: function() { 15771 var imgSt = mfp.st.image, 15772 ns = '.image'; 15773 15774 mfp.types.push('image'); 15775 15776 _mfpOn(OPEN_EVENT+ns, function() { 15777 if(mfp.currItem.type === 'image' && imgSt.cursor) { 15778 $(document.body).addClass(imgSt.cursor); 15779 } 15780 }); 15781 15782 _mfpOn(CLOSE_EVENT+ns, function() { 15783 if(imgSt.cursor) { 15784 $(document.body).removeClass(imgSt.cursor); 15785 } 15786 _window.off('resize' + EVENT_NS); 15787 }); 15788 15789 _mfpOn('Resize'+ns, mfp.resizeImage); 15790 if(mfp.isLowIE) { 15791 _mfpOn('AfterChange', mfp.resizeImage); 15792 } 15793 }, 15794 resizeImage: function() { 15795 var item = mfp.currItem; 15796 if(!item || !item.img) return; 15797 15798 if(mfp.st.image.verticalFit) { 15799 var decr = 0; 15800 // fix box-sizing in ie7/8 15801 if(mfp.isLowIE) { 15802 decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10); 15803 } 15804 item.img.css('max-height', mfp.wH-decr); 15805 } 15806 }, 15807 _onImageHasSize: function(item) { 15808 if(item.img) { 15809 15810 item.hasSize = true; 15811 15812 if(_imgInterval) { 15813 clearInterval(_imgInterval); 15814 } 15815 15816 item.isCheckingImgSize = false; 15817 15818 _mfpTrigger('ImageHasSize', item); 15819 15820 if(item.imgHidden) { 15821 if(mfp.content) 15822 mfp.content.removeClass('mfp-loading'); 15823 15824 item.imgHidden = false; 15825 } 15826 15827 } 15828 }, 15829 15830 /** 15831 * Function that loops until the image has size to display elements that rely on it asap 15832 */ 15833 findImageSize: function(item) { 15834 15835 var counter = 0, 15836 img = item.img[0], 15837 mfpSetInterval = function(delay) { 15838 15839 if(_imgInterval) { 15840 clearInterval(_imgInterval); 15841 } 15842 // decelerating interval that checks for size of an image 15843 _imgInterval = setInterval(function() { 15844 if(img.naturalWidth > 0) { 15845 mfp._onImageHasSize(item); 15846 return; 15847 } 15848 15849 if(counter > 200) { 15850 clearInterval(_imgInterval); 15851 } 15852 15853 counter++; 15854 if(counter === 3) { 15855 mfpSetInterval(10); 15856 } else if(counter === 40) { 15857 mfpSetInterval(50); 15858 } else if(counter === 100) { 15859 mfpSetInterval(500); 15860 } 15861 }, delay); 15862 }; 15863 15864 mfpSetInterval(1); 15865 }, 15866 15867 getImage: function(item, template) { 15868 15869 var guard = 0, 15870 15871 // image load complete handler 15872 onLoadComplete = function() { 15873 if(item) { 15874 if (item.img[0].complete) { 15875 item.img.off('.mfploader'); 15876 15877 if(item === mfp.currItem){ 15878 mfp._onImageHasSize(item); 15879 15880 mfp.updateStatus('ready'); 15881 } 15882 15883 item.hasSize = true; 15884 item.loaded = true; 15885 15886 _mfpTrigger('ImageLoadComplete'); 15887 15888 } 15889 else { 15890 // if image complete check fails 200 times (20 sec), we assume that there was an error. 15891 guard++; 15892 if(guard < 200) { 15893 setTimeout(onLoadComplete,100); 15894 } else { 15895 onLoadError(); 15896 } 15897 } 15898 } 15899 }, 15900 15901 // image error handler 15902 onLoadError = function() { 15903 if(item) { 15904 item.img.off('.mfploader'); 15905 if(item === mfp.currItem){ 15906 mfp._onImageHasSize(item); 15907 mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) ); 15908 } 15909 15910 item.hasSize = true; 15911 item.loaded = true; 15912 item.loadError = true; 15913 } 15914 }, 15915 imgSt = mfp.st.image; 15916 15917 15918 var el = template.find('.mfp-img'); 15919 if(el.length) { 15920 var img = document.createElement('img'); 15921 img.className = 'mfp-img'; 15922 if(item.el && item.el.find('img').length) { 15923 img.alt = item.el.find('img').attr('alt'); 15924 } 15925 item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError); 15926 img.src = item.src; 15927 15928 // without clone() "error" event is not firing when IMG is replaced by new IMG 15929 // TODO: find a way to avoid such cloning 15930 if(el.is('img')) { 15931 item.img = item.img.clone(); 15932 } 15933 15934 img = item.img[0]; 15935 if(img.naturalWidth > 0) { 15936 item.hasSize = true; 15937 } else if(!img.width) { 15938 item.hasSize = false; 15939 } 15940 } 15941 15942 mfp._parseMarkup(template, { 15943 title: _getTitle(item), 15944 img_replaceWith: item.img 15945 }, item); 15946 15947 mfp.resizeImage(); 15948 15949 if(item.hasSize) { 15950 if(_imgInterval) clearInterval(_imgInterval); 15951 15952 if(item.loadError) { 15953 template.addClass('mfp-loading'); 15954 mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) ); 15955 } else { 15956 template.removeClass('mfp-loading'); 15957 mfp.updateStatus('ready'); 15958 } 15959 return template; 15960 } 15961 15962 mfp.updateStatus('loading'); 15963 item.loading = true; 15964 15965 if(!item.hasSize) { 15966 item.imgHidden = true; 15967 template.addClass('mfp-loading'); 15968 mfp.findImageSize(item); 15969 } 15970 15971 return template; 15972 } 15973 } 15974}); 15975 15976/*>>image*/ 15977 15978/*>>zoom*/ 15979var hasMozTransform, 15980 getHasMozTransform = function() { 15981 if(hasMozTransform === undefined) { 15982 hasMozTransform = document.createElement('p').style.MozTransform !== undefined; 15983 } 15984 return hasMozTransform; 15985 }; 15986 15987$.magnificPopup.registerModule('zoom', { 15988 15989 options: { 15990 enabled: false, 15991 easing: 'ease-in-out', 15992 duration: 300, 15993 opener: function(element) { 15994 return element.is('img') ? element : element.find('img'); 15995 } 15996 }, 15997 15998 proto: { 15999 16000 initZoom: function() { 16001 var zoomSt = mfp.st.zoom, 16002 ns = '.zoom', 16003 image; 16004 16005 if(!zoomSt.enabled || !mfp.supportsTransition) { 16006 return; 16007 } 16008 16009 var duration = zoomSt.duration, 16010 getElToAnimate = function(image) { 16011 var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'), 16012 transition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing, 16013 cssObj = { 16014 position: 'fixed', 16015 zIndex: 9999, 16016 left: 0, 16017 top: 0, 16018 '-webkit-backface-visibility': 'hidden' 16019 }, 16020 t = 'transition'; 16021 16022 cssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition; 16023 16024 newImg.css(cssObj); 16025 return newImg; 16026 }, 16027 showMainContent = function() { 16028 mfp.content.css('visibility', 'visible'); 16029 }, 16030 openTimeout, 16031 animatedImg; 16032 16033 _mfpOn('BuildControls'+ns, function() { 16034 if(mfp._allowZoom()) { 16035 16036 clearTimeout(openTimeout); 16037 mfp.content.css('visibility', 'hidden'); 16038 16039 // Basically, all code below does is clones existing image, puts in on top of the current one and animated it 16040 16041 image = mfp._getItemToZoom(); 16042 16043 if(!image) { 16044 showMainContent(); 16045 return; 16046 } 16047 16048 animatedImg = getElToAnimate(image); 16049 16050 animatedImg.css( mfp._getOffset() ); 16051 16052 mfp.wrap.append(animatedImg); 16053 16054 openTimeout = setTimeout(function() { 16055 animatedImg.css( mfp._getOffset( true ) ); 16056 openTimeout = setTimeout(function() { 16057 16058 showMainContent(); 16059 16060 setTimeout(function() { 16061 animatedImg.remove(); 16062 image = animatedImg = null; 16063 _mfpTrigger('ZoomAnimationEnded'); 16064 }, 16); // avoid blink when switching images 16065 16066 }, duration); // this timeout equals animation duration 16067 16068 }, 16); // by adding this timeout we avoid short glitch at the beginning of animation 16069 16070 16071 // Lots of timeouts... 16072 } 16073 }); 16074 _mfpOn(BEFORE_CLOSE_EVENT+ns, function() { 16075 if(mfp._allowZoom()) { 16076 16077 clearTimeout(openTimeout); 16078 16079 mfp.st.removalDelay = duration; 16080 16081 if(!image) { 16082 image = mfp._getItemToZoom(); 16083 if(!image) { 16084 return; 16085 } 16086 animatedImg = getElToAnimate(image); 16087 } 16088 16089 animatedImg.css( mfp._getOffset(true) ); 16090 mfp.wrap.append(animatedImg); 16091 mfp.content.css('visibility', 'hidden'); 16092 16093 setTimeout(function() { 16094 animatedImg.css( mfp._getOffset() ); 16095 }, 16); 16096 } 16097 16098 }); 16099 16100 _mfpOn(CLOSE_EVENT+ns, function() { 16101 if(mfp._allowZoom()) { 16102 showMainContent(); 16103 if(animatedImg) { 16104 animatedImg.remove(); 16105 } 16106 image = null; 16107 } 16108 }); 16109 }, 16110 16111 _allowZoom: function() { 16112 return mfp.currItem.type === 'image'; 16113 }, 16114 16115 _getItemToZoom: function() { 16116 if(mfp.currItem.hasSize) { 16117 return mfp.currItem.img; 16118 } else { 16119 return false; 16120 } 16121 }, 16122 16123 // Get element postion relative to viewport 16124 _getOffset: function(isLarge) { 16125 var el; 16126 if(isLarge) { 16127 el = mfp.currItem.img; 16128 } else { 16129 el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem); 16130 } 16131 16132 var offset = el.offset(); 16133 var paddingTop = parseInt(el.css('padding-top'),10); 16134 var paddingBottom = parseInt(el.css('padding-bottom'),10); 16135 offset.top -= ( $(window).scrollTop() - paddingTop ); 16136 16137 16138 /* 16139 16140 Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa. 16141 16142 */ 16143 var obj = { 16144 width: el.width(), 16145 // fix Zepto height+padding issue 16146 height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop 16147 }; 16148 16149 // I hate to do this, but there is no another option 16150 if( getHasMozTransform() ) { 16151 obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)'; 16152 } else { 16153 obj.left = offset.left; 16154 obj.top = offset.top; 16155 } 16156 return obj; 16157 } 16158 16159 } 16160}); 16161 16162 16163 16164/*>>zoom*/ 16165 16166/*>>iframe*/ 16167 16168var IFRAME_NS = 'iframe', 16169 _emptyPage = '//about:blank', 16170 16171 _fixIframeBugs = function(isShowing) { 16172 if(mfp.currTemplate[IFRAME_NS]) { 16173 var el = mfp.currTemplate[IFRAME_NS].find('iframe'); 16174 if(el.length) { 16175 // reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug 16176 if(!isShowing) { 16177 el[0].src = _emptyPage; 16178 } 16179 16180 // IE8 black screen bug fix 16181 if(mfp.isIE8) { 16182 el.css('display', isShowing ? 'block' : 'none'); 16183 } 16184 } 16185 } 16186 }; 16187 16188$.magnificPopup.registerModule(IFRAME_NS, { 16189 16190 options: { 16191 markup: '<div class="mfp-iframe-scaler">'+ 16192 '<div class="mfp-close"></div>'+ 16193 '<iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe>'+ 16194 '</div>', 16195 16196 srcAction: 'iframe_src', 16197 16198 // we don't care and support only one default type of URL by default 16199 patterns: { 16200 youtube: { 16201 index: 'youtube.com', 16202 id: 'v=', 16203 src: '//www.youtube.com/embed/%id%?autoplay=1' 16204 }, 16205 vimeo: { 16206 index: 'vimeo.com/', 16207 id: '/', 16208 src: '//player.vimeo.com/video/%id%?autoplay=1' 16209 }, 16210 gmaps: { 16211 index: '//maps.google.', 16212 src: '%id%&output=embed' 16213 } 16214 } 16215 }, 16216 16217 proto: { 16218 initIframe: function() { 16219 mfp.types.push(IFRAME_NS); 16220 16221 _mfpOn('BeforeChange', function(e, prevType, newType) { 16222 if(prevType !== newType) { 16223 if(prevType === IFRAME_NS) { 16224 _fixIframeBugs(); // iframe if removed 16225 } else if(newType === IFRAME_NS) { 16226 _fixIframeBugs(true); // iframe is showing 16227 } 16228 }// else { 16229 // iframe source is switched, don't do anything 16230 //} 16231 }); 16232 16233 _mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() { 16234 _fixIframeBugs(); 16235 }); 16236 }, 16237 16238 getIframe: function(item, template) { 16239 var embedSrc = item.src; 16240 var iframeSt = mfp.st.iframe; 16241 16242 $.each(iframeSt.patterns, function() { 16243 if(embedSrc.indexOf( this.index ) > -1) { 16244 if(this.id) { 16245 if(typeof this.id === 'string') { 16246 embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length); 16247 } else { 16248 embedSrc = this.id.call( this, embedSrc ); 16249 } 16250 } 16251 embedSrc = this.src.replace('%id%', embedSrc ); 16252 return false; // break; 16253 } 16254 }); 16255 16256 var dataObj = {}; 16257 if(iframeSt.srcAction) { 16258 dataObj[iframeSt.srcAction] = embedSrc; 16259 } 16260 mfp._parseMarkup(template, dataObj, item); 16261 16262 mfp.updateStatus('ready'); 16263 16264 return template; 16265 } 16266 } 16267}); 16268 16269 16270 16271/*>>iframe*/ 16272 16273/*>>gallery*/ 16274/** 16275 * Get looped index depending on number of slides 16276 */ 16277var _getLoopedId = function(index) { 16278 var numSlides = mfp.items.length; 16279 if(index > numSlides - 1) { 16280 return index - numSlides; 16281 } else if(index < 0) { 16282 return numSlides + index; 16283 } 16284 return index; 16285 }, 16286 _replaceCurrTotal = function(text, curr, total) { 16287 return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total); 16288 }; 16289 16290$.magnificPopup.registerModule('gallery', { 16291 16292 options: { 16293 enabled: false, 16294 arrowMarkup: '<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>', 16295 preload: [0,2], 16296 navigateByImgClick: true, 16297 arrows: true, 16298 16299 tPrev: 'Previous (Left arrow key)', 16300 tNext: 'Next (Right arrow key)', 16301 tCounter: '%curr% of %total%' 16302 }, 16303 16304 proto: { 16305 initGallery: function() { 16306 16307 var gSt = mfp.st.gallery, 16308 ns = '.mfp-gallery'; 16309 16310 mfp.direction = true; // true - next, false - prev 16311 16312 if(!gSt || !gSt.enabled ) return false; 16313 16314 _wrapClasses += ' mfp-gallery'; 16315 16316 _mfpOn(OPEN_EVENT+ns, function() { 16317 16318 if(gSt.navigateByImgClick) { 16319 mfp.wrap.on('click'+ns, '.mfp-img', function() { 16320 if(mfp.items.length > 1) { 16321 mfp.next(); 16322 return false; 16323 } 16324 }); 16325 } 16326 16327 _document.on('keydown'+ns, function(e) { 16328 if (e.keyCode === 37) { 16329 mfp.prev(); 16330 } else if (e.keyCode === 39) { 16331 mfp.next(); 16332 } 16333 }); 16334 }); 16335 16336 _mfpOn('UpdateStatus'+ns, function(e, data) { 16337 if(data.text) { 16338 data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length); 16339 } 16340 }); 16341 16342 _mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) { 16343 var l = mfp.items.length; 16344 values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : ''; 16345 }); 16346 16347 _mfpOn('BuildControls' + ns, function() { 16348 if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) { 16349 var markup = gSt.arrowMarkup, 16350 arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS), 16351 arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS); 16352 16353 arrowLeft.click(function() { 16354 mfp.prev(); 16355 }); 16356 arrowRight.click(function() { 16357 mfp.next(); 16358 }); 16359 16360 mfp.container.append(arrowLeft.add(arrowRight)); 16361 } 16362 }); 16363 16364 _mfpOn(CHANGE_EVENT+ns, function() { 16365 if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout); 16366 16367 mfp._preloadTimeout = setTimeout(function() { 16368 mfp.preloadNearbyImages(); 16369 mfp._preloadTimeout = null; 16370 }, 16); 16371 }); 16372 16373 16374 _mfpOn(CLOSE_EVENT+ns, function() { 16375 _document.off(ns); 16376 mfp.wrap.off('click'+ns); 16377 mfp.arrowRight = mfp.arrowLeft = null; 16378 }); 16379 16380 }, 16381 next: function() { 16382 mfp.direction = true; 16383 mfp.index = _getLoopedId(mfp.index + 1); 16384 mfp.updateItemHTML(); 16385 }, 16386 prev: function() { 16387 mfp.direction = false; 16388 mfp.index = _getLoopedId(mfp.index - 1); 16389 mfp.updateItemHTML(); 16390 }, 16391 goTo: function(newIndex) { 16392 mfp.direction = (newIndex >= mfp.index); 16393 mfp.index = newIndex; 16394 mfp.updateItemHTML(); 16395 }, 16396 preloadNearbyImages: function() { 16397 var p = mfp.st.gallery.preload, 16398 preloadBefore = Math.min(p[0], mfp.items.length), 16399 preloadAfter = Math.min(p[1], mfp.items.length), 16400 i; 16401 16402 for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) { 16403 mfp._preloadItem(mfp.index+i); 16404 } 16405 for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) { 16406 mfp._preloadItem(mfp.index-i); 16407 } 16408 }, 16409 _preloadItem: function(index) { 16410 index = _getLoopedId(index); 16411 16412 if(mfp.items[index].preloaded) { 16413 return; 16414 } 16415 16416 var item = mfp.items[index]; 16417 if(!item.parsed) { 16418 item = mfp.parseEl( index ); 16419 } 16420 16421 _mfpTrigger('LazyLoad', item); 16422 16423 if(item.type === 'image') { 16424 item.img = $('<img class="mfp-img" />').on('load.mfploader', function() { 16425 item.hasSize = true; 16426 }).on('error.mfploader', function() { 16427 item.hasSize = true; 16428 item.loadError = true; 16429 _mfpTrigger('LazyLoadError', item); 16430 }).attr('src', item.src); 16431 } 16432 16433 16434 item.preloaded = true; 16435 } 16436 } 16437}); 16438 16439/*>>gallery*/ 16440 16441/*>>retina*/ 16442 16443var RETINA_NS = 'retina'; 16444 16445$.magnificPopup.registerModule(RETINA_NS, { 16446 options: { 16447 replaceSrc: function(item) { 16448 return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; }); 16449 }, 16450 ratio: 1 // Function or number. Set to 1 to disable. 16451 }, 16452 proto: { 16453 initRetina: function() { 16454 if(window.devicePixelRatio > 1) { 16455 16456 var st = mfp.st.retina, 16457 ratio = st.ratio; 16458 16459 ratio = !isNaN(ratio) ? ratio : ratio(); 16460 16461 if(ratio > 1) { 16462 _mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) { 16463 item.img.css({ 16464 'max-width': item.img[0].naturalWidth / ratio, 16465 'width': '100%' 16466 }); 16467 }); 16468 _mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) { 16469 item.src = st.replaceSrc(item, ratio); 16470 }); 16471 } 16472 } 16473 16474 } 16475 } 16476}); 16477 16478/*>>retina*/ 16479 _checkInstance(); })); 16480 16481/***/ }), 16482 16483/***/ 3336: 16484/***/ (function(module) { 16485 16486"use strict"; 16487module.exports = $; 16488 16489/***/ }) 16490 16491/******/ }); 16492/************************************************************************/ 16493/******/ // The module cache 16494/******/ var __webpack_module_cache__ = {}; 16495/******/ 16496/******/ // The require function 16497/******/ function __webpack_require__(moduleId) { 16498/******/ // Check if module is in cache 16499/******/ var cachedModule = __webpack_module_cache__[moduleId]; 16500/******/ if (cachedModule !== undefined) { 16501/******/ return cachedModule.exports; 16502/******/ } 16503/******/ // Create a new module (and put it into the cache) 16504/******/ var module = __webpack_module_cache__[moduleId] = { 16505/******/ // no module.id needed 16506/******/ // no module.loaded needed 16507/******/ exports: {} 16508/******/ }; 16509/******/ 16510/******/ // Execute the module function 16511/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); 16512/******/ 16513/******/ // Return the exports of the module 16514/******/ return module.exports; 16515/******/ } 16516/******/ 16517/************************************************************************/ 16518/******/ /* webpack/runtime/compat get default export */ 16519/******/ !function() { 16520/******/ // getDefaultExport function for compatibility with non-harmony modules 16521/******/ __webpack_require__.n = function(module) {
vendor: 4,112 bytes, lines 16522-16611
16522/******/ var getter = module && module.__esModule ? 16523/******/ function() { return module['default']; } : 16524/******/ function() { return module; }; 16525/******/ __webpack_require__.d(getter, { a: getter }); 16526/******/ return getter; 16527/******/ }; 16528/******/ }(); 16529/******/ 16530/******/ /* webpack/runtime/define property getters */ 16531/******/ !function() { 16532/******/ // define getter functions for harmony exports 16533/******/ __webpack_require__.d = function(exports, definition) { 16534/******/ for(var key in definition) { 16535/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { 16536/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); 16537/******/ } 16538/******/ } 16539/******/ }; 16540/******/ }(); 16541/******/ 16542/******/ /* webpack/runtime/hasOwnProperty shorthand */ 16543/******/ !function() { 16544/******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } 16545/******/ }(); 16546/******/ 16547/******/ /* webpack/runtime/make namespace object */ 16548/******/ !function() { 16549/******/ // define __esModule on exports 16550/******/ __webpack_require__.r = function(exports) { 16551/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 16552/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 16553/******/ } 16554/******/ Object.defineProperty(exports, '__esModule', { value: true }); 16555/******/ }; 16556/******/ }(); 16557/******/ 16558/************************************************************************/ 16559var __webpack_exports__ = {}; 16560// This entry need to be wrapped in an IIFE because it need to be in strict mode. 16561!function() { 16562"use strict"; 16563 16564// NAMESPACE OBJECT: ./node_modules/@popperjs/core/lib/index.js 16565var lib_namespaceObject = {}; 16566__webpack_require__.r(lib_namespaceObject); 16567__webpack_require__.d(lib_namespaceObject, { 16568 "afterMain": function() { return afterMain; }, 16569 "afterRead": function() { return afterRead; }, 16570 "afterWrite": function() { return afterWrite; }, 16571 "applyStyles": function() { return modifiers_applyStyles; }, 16572 "arrow": function() { return modifiers_arrow; }, 16573 "auto": function() { return auto; }, 16574 "basePlacements": function() { return basePlacements; }, 16575 "beforeMain": function() { return beforeMain; }, 16576 "beforeRead": function() { return beforeRead; }, 16577 "beforeWrite": function() { return beforeWrite; }, 16578 "bottom": function() { return bottom; }, 16579 "clippingParents": function() { return clippingParents; }, 16580 "computeStyles": function() { return modifiers_computeStyles; }, 16581 "createPopper": function() { return popper_createPopper; }, 16582 "createPopperBase": function() { return createPopper; }, 16583 "createPopperLite": function() { return popper_lite_createPopper; }, 16584 "detectOverflow": function() { return detectOverflow; }, 16585 "end": function() { return end; }, 16586 "eventListeners": function() { return eventListeners; }, 16587 "flip": function() { return modifiers_flip; }, 16588 "hide": function() { return modifiers_hide; }, 16589 "left": function() { return left; }, 16590 "main": function() { return main; }, 16591 "modifierPhases": function() { return modifierPhases; }, 16592 "offset": function() { return modifiers_offset; }, 16593 "placements": function() { return enums_placements; }, 16594 "popper": function() { return popper; }, 16595 "popperGenerator": function() { return popperGenerator; }, 16596 "popperOffsets": function() { return modifiers_popperOffsets; }, 16597 "preventOverflow": function() { return modifiers_preventOverflow; }, 16598 "read": function() { return read; }, 16599 "reference": function() { return reference; }, 16600 "right": function() { return right; }, 16601 "start": function() { return start; }, 16602 "top": function() { return enums_top; }, 16603 "variationPlacements": function() { return variationPlacements; }, 16604 "viewport": function() { return viewport; }, 16605 "write": function() { return write; } 16606}); 16607 16608// EXTERNAL MODULE: external "$" 16609var external_$_ = __webpack_require__(3336); 16610var external_$_default = /*#__PURE__*/__webpack_require__.n(external_$_); 16611;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/
16611accordionNav/accordionNav.main.js 16612/** 16613 * ARIA Handling not compatible to Accessible Mega Menu in hover mode on Firefox. 16614 * To use ARIA Handling, set openOnMouseover to false in accessibleMegaMenu 16615 */ 16616 16617 16618function changeState(state, $button, $label, $panel) { 16619 /** ARIA Handling disabled */ 16620 $button.data('expanded', !state); 16621 $button.toggleClass('open-accordion'); // .attr({'aria-expanded': !state}) 16622 // .prop({'aria-expanded': !state}); 16623 16624 $label.toggleClass('open-accordion'); 16625 /** ARIA Handling disabled */ 16626 16627 $panel.toggleClass('open-accordion'); 16628 $panel.data('expanded', !state); // .attr({'aria-expanded': !state, 'aria-hidden': state}) 16629 // .prop({'aria-expanded': !state, 'aria-hidden': state}); 16630} 16631 16632function closeSiblings($btn) { 16633 $btn.parent().siblings('.has-accordion-panel').each(function (i, el) { 16634 var $el = external_$_default()(el); 16635 var $button = $el.find('> .accordion-panel-toggle'); 16636 var $label = $el.find('> a'); 16637 var $panel = $el.find('> .secondLevel, > .thirdLevel'); 16638 /** ARIA Handling disabled */ 16639 16640 $button.data('expanded', false); 16641 $button.removeClass('open-accordion'); // .attr({'aria-expanded': false}) 16642 // .prop({'aria-expanded': false}); 16643 16644 $label.removeClass('open-accordion'); 16645 /** ARIA Handling disabled */ 16646 16647 $panel.data('expanded', false); 16648 $panel.removeClass('open-accordion'); // .attr({'aria-expanded': false, 'aria-hidden': true}) 16649 // .prop({'aria-expanded': false, 'aria-hidden': true}); 16650 }); 16651} 16652 16653function scaffold(i, el) { 16654 var $panel = external_$_default()(el); 16655 var $label = $panel.prev('a'); 16656 var svg = document.getElementById('accordionNav__panel-svg').outerHTML; 16657 var $button = external_$_default()('<button class="accordion-panel-toggle"></button>'); 16658 var buttonLabelOpen = "Untermen\xFC von ".concat($label.text(), " anzeigen"); 16659 var buttonLabelClose = "Untermen\xFC von ".concat($label.text(), " ausblenden"); 16660 $button.text(buttonLabelOpen).data({ 16661 labelOpen: buttonLabelOpen, 16662 labelClose: buttonLabelClose 16663 }); 16664 /** ARIA Handling disabled */ 16665 // const idLabel = `accordion-nav-sub-label-${i}`; 16666 // const idPanel = `accordion-nav-sub-panel-${i}`; 16667 // $button.attr({ 16668 // 'aria-controls': idPanel, 16669 // 'aria-expanded': false, 16670 // id: idLabel, 16671 // role: 'region' 16672 // }); 16673 // $panel.attr({ 16674 // 'aria-expanded': false, 16675 // 'aria-hidden': true, 16676 // 'aria-labeledby': idLabel, 16677 // id: idPanel, 16678 // role: 'region' 16679 // }); 16680 16681 $button.data('expanded', false); 16682 $panel.data('expanded', false); 16683 /* delegate click on label to the button */ 16684 16685 $label.click(function (evt) { 16686 if (!$button.data('expanded')) { 16687 evt.preventDefault(); 16688 $button.trigger('click'); 16689 } 16690 }); 16691 /* handle click on toggle: switch between open and close */ 16692 16693 $button.click(function (evt) { 16694 var state = $button.data('expanded'); 16695 evt.preventDefault(); 16696 changeState(state, $button, $label, $panel); 16697 closeSiblings($button); 16698 external_$_default()(window).trigger('accordionNav:toggle'); 16699 }); 16700 $button.append(external_$_default()(svg).removeAttr('id')); 16701 /* add functional classnames */ 16702 16703 $panel.addClass('accordion-panel'); 16704 $panel.parent().addClass('has-accordion-panel'); 16705 /* add button to the dom */ 16706 16707 $panel.before($button); 16708} 16709/* Init on DOM ready */ 16710 16711 16712function init() { 16713 var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.accordionNav .subNav'; 16714 console.log('accordionNav initialised through accordionNav on: ' + selector); 16715 external_$_default()(selector).each(scaffold); 16716} 16717external_$_default().when((external_$_default()).ready).then(function () { 16718 console.log('accordionNav initialised on DOMContentLoaded'); // init modes 16719 16720 init('.accordionNav .secondLevel'); 16721 init('.accordionNav .thirdLevel'); 16722}); 16723/* Init on document load */ 16724 16725function load() {} 16726// EXTERNAL MODULE: ./node_modules/magnific-popup/dist/jquery.magnific-popup.js 16727var jquery_magnific_popup = __webpack_require__(7729); 16728;// CONCATENATED MODULE: ./src/modules/elements/figure/figure.lightbox.js 16729 16730 16731function initLightbox() { 16732 var $figures = external_$_default()(this); 16733 16734 if ($figures.length < 1) { 16735 return; 16736 } // init popup 16737 16738
16739 $figures.magnificPopup({ 16740 delegate: '.figure__mediaContainer a:not(.figure__download-button)', 16741 type: 'image', 16742 image: { 16743 tError: '<a href="%url%">Das Bild</a> konnte nicht geladen werden.', 16744 titleSrc: function titleSrc(item) { 16745 var title = item.el.closest('.figure').find('.figure__figcaption').html() ? item.el.closest('.figure').find('.figure__figcaption').html() : ''; 16746 return title; 16747 } 16748 }, 16749 gallery: { 16750 enabled: false // set to true to enable gallery 16751 16752 }, 16753 ajax: { 16754 tError: '<a href="%url%">Der Inhalt konnte nicht geladen werden.</a>' 16755 }, 16756 tClose: 'SchlieÃen (Esc)', 16757 tLoading: 'Lädt...', 16758 callbacks: { 16759 open: function open() { 16760 external_$_default()(this.container).find('.mfp-bottom-bar').attr('tabindex', '0'); 16761 external_$_default()(this.container).find('.mfp-bottom-bar').attr('aria-label', 'Erweiterte Bildbeschreibung'); 16762 } 16763 } 16764 }); 16765 $figures.on('click', '.figure__zoom-button', function (evt) { 16766 evt.preventDefault(); // mimik click event to use options 16767 16768 external_$_default()(evt.target).parents('.figure').find('.figure__mediaContainer a:not(.figure__download-button)').trigger('click'); 16769 }); 16770} 16771/** 16772 * Init on DOM ready 16773 */ 16774 16775external_$_default().when((external_$_default()).ready).then(function () { 16776 console.log('figure initialised on DOMContentLoaded'); // do it only for figures 16777 16778 external_$_default()('.figure[data-lightbox]').each(initLightbox); 16779}); 16780;// CONCATENATED MODULE: ./src/modules/components/ajaxLoadmore/ajaxLoadmore.main.js 16781 16782 16783 16784function handleError($module) { 16785 $module.removeClass('ajaxLoadmore--is-processing'); // show some form of error message 16786 16787 $module.attr('aria-live', 'assertive'); 16788 $module.removeClass('ajaxLoadmore--has-success'); 16789 $module.addClass('ajaxLoadmore--has-error'); 16790 $module.data('error-count', $module.data('error-count') + 1); // dismiss 16791 16792 setTimeout(function () { 16793 $module.attr('aria-live', 'off'); 16794 $module.removeClass('ajaxLoadmore--has-error'); // disable module after third error in row 16795 16796 if ($module.data('error-count') > 2) { 16797 $module.find('.ajaxLoadmore__button').attr('disable', 'disable'); 16798 $module.addClass('ajaxLoadmore--has-finished'); 16799 } 16800 }, 5000); 16801 $module.data('is-loading', false); 16802 $module.find('button').trigger('button:removeLoader'); 16803} 16804 16805function loadContent($module, $list) { 16806 var url = $module.data('nextpage'); 16807 var $lastListItemBeforeLoadmore = $list.find('.teaserList__item').last(); 16808 $module.addClass('ajaxLoadmore--is-processing'); 16809 external_$_default().get({ 16810 dataType: 'json', 16811 url: url, 16812 success: function success(responseData) { 16813 if (!responseData.data) { 16814 handleError($module); 16815 return; 16816 } 16817 16818 var $el = external_$_default()(responseData.data).find('.teaserList__item'); 16819 $el.appendTo($list).fadeIn(); 16820 $el.each(function () { 16821 external_$_default()(document).trigger('ajaxLoadmore', this); 16822 16823 if (external_$_default()(this).find('[data-lightbox="true"]')) { 16824 initLightbox.call(this); 16825 } 16826 }); 16827 $module.removeClass('ajaxLoadmore--is-processing'); 16828 $module.data('is-loading', false); 16829 16830 if (responseData.nextpage === '') { 16831 $module.addClass('ajaxLoadmore--has-finished'); 16832 $module.find('button').trigger('button:removeLoader'); 16833 return; 16834 } 16835 16836 $module.data('nextpage', responseData.nextpage); 16837 $module.removeClass('ajaxLoadmore--has-error'); 16838 $module.addClass('ajaxLoadmore--has-success'); // reset error count 16839 16840 $module.data('error-count', 0); 16841 $module.data('is-loading', false); // focus on newest element to keep flow for keyboard users 16842 16843 $lastListItemBeforeLoadmore.next().find('a').focus(); 16844 $module.find('button').trigger('button:removeLoader'); 16845 }, 16846 error: function error() { 16847 handleError($module); 16848 } 16849 }); 16850} 16851 16852function initloadmore() { 16853 var $module = external_$_default()(this); 16854 var $button = $module.find('.button'); 16855 var $list = $module.closest('.co').find('.teaserList').eq(0); 16856 $module.data('error-count', 0); 16857 $module.data('nextpage', $module.attr('data-url')); // keep reference to first URL in case user klicks 'show less' 16858 16859 $module.data('firstUrl', $module.data('nextpage')); 16860 $module.data('moreButton', $button); 16861 $button.click(function () { 16862 if ($module.data('is-loading') === true) { 16863 return; 16864 } 16865 16866 $module.data('is-loading', true); 16867 loadContent($module, $list); 16868 }); 16869} 16870/** 16871 * Init on DOM ready 16872 */ 16873 16874 16875external_$_default().when((external_$_default()).ready).then(function () { 16876 console.log('ajaxLoadmore initialised on DOMContentLoaded'); 16877}); 16878/** 16879 * Init on document load 16880 */ 16881 16882external_$_default()(window).on('load', function () { 16883 console.log('ajaxLoadmore initialised on load'); 16884 external_$_default()('.ajaxLoadmore').each(initloadmore); 16885}); 16886;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/characterNav/characterNav.main.js 16887 16888external_$_default().when((external_$_default()).ready).then(function () { 16889 console.log('characterNav initialised on ready'); 16890 var $charFilter = external_$_default()('.co__characterFilter'); 16891 16892 if ($charFilter.length < 1) { 16893 return; 16894 } 16895 16896 var $listItem = $charFilter.find('li'); 16897 var $teaser = $charFilter.parent().next('.co__main').find('.teaserList .teaserList__item'); 16898 var alphabet = []; 16899 $teaser.each(function () { 16900 var $this = external_$_default()(this); 16901 var dataAttr = $this.data('jump'); // bail if undefined 16902 16903 if (typeof dataAttr === 'undefined') { 16904 return; 16905 } 16906 16907 if (!alphabet.includes(dataAttr)) { 16908 alphabet.push(dataAttr); 16909 } 16910 }); 16911 $listItem.each(function () { 16912 var $this = external_$_default()(this); 16913 var $link = $this.find('a'); 16914 var letter = $link.data('jumptarget'); 16915 16916 if (!alphabet.includes(letter)) { 16917 var linkHtml = $link.html(); 16918 $link.before('<span>' + linkHtml + '</span>'); 16919 $link.remove(); 16920 } 16921 }); 16922}); 16923external_$_default()(window).on('load', function () {// console.log('characterNav initialised on load'); 16924}); 16925;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/index.js 16926/** 16927 * -------------------------------------------------------------------------- 16928 * Bootstrap (v5.1.3): util/index.js 16929 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 16930 * -------------------------------------------------------------------------- 16931 */ 16932 16933const MAX_UID = 1000000 16934const MILLISECONDS_MULTIPLIER = 1000 16935const TRANSITION_END = 'transitionend' 16936 16937// Shoutout AngusCroll (https://goo.gl/pxwQGp) 16938const toType = obj => { 16939 if (obj === null || obj === undefined) { 16940 return `${obj}` 16941 } 16942 16943 return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase() 16944} 16945 16946/** 16947 * -------------------------------------------------------------------------- 16948 * Public Util Api 16949 * -------------------------------------------------------------------------- 16950 */ 16951 16952const getUID = prefix => { 16953 do { 16954 prefix += Math.floor(Math.random() * MAX_UID) 16955 } while (document.getElementById(prefix)) 16956 16957 return prefix 16958} 16959 16960const getSelector = element => { 16961 let selector = element.getAttribute('data-bs-target') 16962 16963 if (!selector || selector === '#') { 16964 let hrefAttr = element.getAttribute('href') 16965 16966 // The only valid content that could double as a selector are IDs or classes, 16967 // so everything starting with `#` or `.`. If a "real" URL is used as the selector, 16968 // `document.querySelector` will rightfully complain it is invali
16968d. 16969 // See https://github.com/twbs/bootstrap/issues/32273 16970 if (!hrefAttr || (!hrefAttr.includes('#') && !hrefAttr.startsWith('.'))) { 16971 return null 16972 } 16973 16974 // Just in case some CMS puts out a full URL with the anchor appended 16975 if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) { 16976 hrefAttr = `#${hrefAttr.split('#')[1]}` 16977 } 16978 16979 selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null 16980 } 16981 16982 return selector 16983} 16984 16985const getSelectorFromElement = element => { 16986 const selector = getSelector(element) 16987 16988 if (selector) { 16989 return document.querySelector(selector) ? selector : null 16990 } 16991 16992 return null 16993} 16994 16995const getElementFromSelector = element => { 16996 const selector = getSelector(element) 16997 16998 return selector ? document.querySelector(selector) : null 16999} 17000 17001const getTransitionDurationFromElement = element => { 17002 if (!element) { 17003 return 0 17004 } 17005 17006 // Get transition-duration of the element 17007 let { transitionDuration, transitionDelay } = window.getComputedStyle(element) 17008 17009 const floatTransitionDuration = Number.parseFloat(transitionDuration) 17010 const floatTransitionDelay = Number.parseFloat(transitionDelay) 17011 17012 // Return 0 if element or transition duration is not found 17013 if (!floatTransitionDuration && !floatTransitionDelay) { 17014 return 0 17015 } 17016 17017 // If multiple durations are defined, take the first 17018 transitionDuration = transitionDuration.split(',')[0] 17019 transitionDelay = transitionDelay.split(',')[0] 17020 17021 return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER 17022} 17023 17024const triggerTransitionEnd = element => { 17025 element.dispatchEvent(new Event(TRANSITION_END)) 17026} 17027 17028const isElement = obj => { 17029 if (!obj || typeof obj !== 'object') { 17030 return false 17031 } 17032 17033 if (typeof obj.jquery !== 'undefined') { 17034 obj = obj[0] 17035 } 17036 17037 return typeof obj.nodeType !== 'undefined' 17038} 17039 17040const getElement = obj => { 17041 if (isElement(obj)) { // it's a jQuery object or a node element 17042 return obj.jquery ? obj[0] : obj 17043 } 17044 17045 if (typeof obj === 'string' && obj.length > 0) { 17046 return document.querySelector(obj) 17047 } 17048 17049 return null 17050} 17051 17052const typeCheckConfig = (componentName, config, configTypes) => { 17053 Object.keys(configTypes).forEach(property => { 17054 const expectedTypes = configTypes[property] 17055 const value = config[property] 17056 const valueType = value && isElement(value) ? 'element' : toType(value) 17057 17058 if (!new RegExp(expectedTypes).test(valueType)) { 17059 throw new TypeError( 17060 `${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".` 17061 ) 17062 } 17063 }) 17064} 17065 17066const isVisible = element => { 17067 if (!isElement(element) || element.getClientRects().length === 0) { 17068 return false 17069 } 17070 17071 return getComputedStyle(element).getPropertyValue('visibility') === 'visible' 17072} 17073 17074const isDisabled = element => { 17075 if (!element || element.nodeType !== Node.ELEMENT_NODE) { 17076 return true 17077 } 17078 17079 if (element.classList.contains('disabled')) { 17080 return true 17081 } 17082 17083 if (typeof element.disabled !== 'undefined') { 17084 return element.disabled 17085 } 17086 17087 return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false' 17088} 17089 17090const findShadowRoot = element => { 17091 if (!document.documentElement.attachShadow) { 17092 return null 17093 } 17094 17095 // Can find the shadow root otherwise it'll return the document 17096 if (typeof element.getRootNode === 'function') { 17097 const root = element.getRootNode() 17098 return root instanceof ShadowRoot ? root : null 17099 } 17100 17101 if (element instanceof ShadowRoot) { 17102 return element 17103 } 17104 17105 // when we don't find a shadow root 17106 if (!element.parentNode) { 17107 return null 17108 } 17109 17110 return findShadowRoot(element.parentNode) 17111} 17112 17113const noop = () => {} 17114 17115/** 17116 * Trick to restart an element's animation 17117 * 17118 * @param {HTMLElement} element 17119 * @return void 17120 * 17121 * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation 17122 */ 17123const reflow = element => { 17124 // eslint-disable-next-line no-unused-expressions 17125 element.offsetHeight 17126} 17127 17128const getjQuery = () => { 17129 const { jQuery } = window 17130 17131 if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { 17132 return jQuery 17133 } 17134 17135 return null 17136} 17137 17138const DOMContentLoadedCallbacks = [] 17139 17140const onDOMContentLoaded = callback => { 17141 if (document.readyState === 'loading') { 17142 // add listener on the first call when the document is in loading state 17143 if (!DOMContentLoadedCallbacks.length) { 17144 document.addEventListener('DOMContentLoaded', () => { 17145 DOMContentLoadedCallbacks.forEach(callback => callback()) 17146 }) 17147 } 17148 17149 DOMContentLoadedCallbacks.push(callback) 17150 } else { 17151 callback() 17152 } 17153} 17154 17155const isRTL = () => document.documentElement.dir === 'rtl' 17156 17157const defineJQueryPlugin = plugin => { 17158 onDOMContentLoaded(() => { 17159 const $ = getjQuery() 17160 /* istanbul ignore if */ 17161 if ($) { 17162 const name = plugin.NAME 17163 const JQUERY_NO_CONFLICT = $.fn[name] 17164 $.fn[name] = plugin.jQueryInterface 17165 $.fn[name].Constructor = plugin 17166 $.fn[name].noConflict = () => { 17167 $.fn[name] = JQUERY_NO_CONFLICT 17168 return plugin.jQueryInterface 17169 } 17170 } 17171 }) 17172} 17173 17174const execute = callback => { 17175 if (typeof callback === 'function') { 17176 callback() 17177 } 17178} 17179 17180const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { 17181 if (!waitForTransition) { 17182 execute(callback) 17183 return 17184 } 17185 17186 const durationPadding = 5 17187 const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding 17188 17189 let called = false 17190 17191 const handler = ({ target }) => { 17192 if (target !== transitionElement) { 17193 return 17194 } 17195 17196 called = true 17197 transitionElement.removeEventListener(TRANSITION_END, handler) 17198 execute(callback) 17199 } 17200 17201 transitionElement.addEventListener(TRANSITION_END, handler) 17202 setTimeout(() => { 17203 if (!called) { 17204 triggerTransitionEnd(transitionElement) 17205 } 17206 }, emulatedDuration) 17207} 17208 17209/** 17210 * Return the previous/next element of a list. 17211 * 17212 * @param {array} list The list of elements 17213 * @param activeElement The active element 17214 * @param shouldGetNext Choose to get next or previous element 17215 * @param isCycleAllowed 17216 * @return {Element|elem} The proper element 17217 */ 17218const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { 17219 let index = list.indexOf(activeElement) 17220 17221 // if the element does not exist in the list return an element depending on the direction and if cycle is allowed 17222 if (index === -1) { 17223 return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0] 17224 } 17225 17226 const listLength = list.length 17227 17228 index += shouldGetNext ? 1 : -1 17229 17230 if (isCycleAllowed) { 17231 index = (index + listLength) % listLength 17232 } 17233 17234 return list[Math.max(0, Math.min(index, listLength - 1))] 17235} 17236 17237 17238 17239;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/dom/data.js 17240/** 17241 * -------------------------------------------------------------------------- 17242 * Bootstrap (v5.1.3): dom/data.js 17243 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 17244 * -------------------------------------------------------------------------- 17245 */ 17246 17247/** 17248 * ------------------------------------------------------------------------ 17249 * Constants 17250 * ------------------------------------------------------------------------ 17251 */ 17252 17253const elementMap = new Map() 17254 17255/* harmony default export */ var data = ({ 17256 set(element, key, instance) { 17257 if (!elementMap.has(element)) { 17258 elementMap.set(element, new Map()) 17259 } 17260 17261 const instanceMap = elementMap.get(element) 17262 17263 // make it clear we only want one instance per element 17264 // can be removed later when multiple key/instances are fine to be used 17265 if (!instanceMap.has(key) && instanceMap.size !== 0) { 17266 // eslint-disable-next-line no-console 17267 console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`) 17268 return 17269 } 17270 17271 instanceMap.set(key, instance) 17272 }, 17273 17274 get(element, key) { 17275 if (elementMap.has(element)) { 17276 return elementMap.get(element).get(key) || null 17277 } 17278 17279 return null 17280 }, 17281 17282 remove(element, key) { 17283 if (!elementMap.has(element)) { 17284 return 17285 } 17286 17287 const instanceMap = elementMap.get(element) 17288 17289 instanceMap.delete(key) 17290 17291 // free up element references if there are no instances left for an element 17292 if (instanceMap.size === 0) { 17293 elementMap.delete(element) 17294 } 17295 } 17296}); 17297 17298;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/dom/event-handler.js 17299/** 17300 * -------------------------------------------------------------------------- 17301 * Bootstrap (v5.1.3): dom/event-handler.js 17302 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 17303 * -------------------------------------------------------------------------- 17304 */ 17305 17306 17307 17308/** 17309 * ------------------------------------------------------------------------ 17310 * Constants 17311 * ------------------------------------------------------------------------ 17312 */ 17313 17314const namespaceRegex = /[^.]*(?=\..*)\.|.*/ 17315const stripNameRegex = /\..*/ 17316const stripUidRegex = /::\d+$/ 17317const eventRegistry = {} // Events storage 17318let uidEvent = 1 17319const customEvents = {
17320 mouseenter: 'mouseover', 17321 mouseleave: 'mouseout' 17322} 17323const customEventsRegex = /^(mouseenter|mouseleave)/i 17324const nativeEvents = new Set([ 17325 'click', 17326 'dblclick', 17327 'mouseup', 17328 'mousedown', 17329 'contextmenu', 17330 'mousewheel', 17331 'DOMMouseScroll', 17332 'mouseover', 17333 'mouseout', 17334 'mousemove', 17335 'selectstart', 17336 'selectend', 17337 'keydown', 17338 'keypress', 17339 'keyup', 17340 'orientationchange', 17341 'touchstart', 17342 'touchmove', 17343 'touchend', 17344 'touchcancel', 17345 'pointerdown', 17346 'pointermove', 17347 'pointerup', 17348 'pointerleave', 17349 'pointercancel', 17350 'gesturestart', 17351 'gesturechange', 17352 'gestureend', 17353 'focus', 17354 'blur', 17355 'change', 17356 'reset', 17357 'select', 17358 'submit', 17359 'focusin', 17360 'focusout', 17361 'load', 17362 'unload', 17363 'beforeunload', 17364 'resize', 17365 'move', 17366 'DOMContentLoaded', 17367 'readystatechange', 17368 'error', 17369 'abort', 17370 'scroll' 17371]) 17372 17373/** 17374 * ------------------------------------------------------------------------ 17375 * Private methods 17376 * ------------------------------------------------------------------------ 17377 */ 17378 17379function getUidEvent(element, uid) { 17380 return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++ 17381} 17382 17383function getEvent(element) { 17384 const uid = getUidEvent(element) 17385 17386 element.uidEvent = uid 17387 eventRegistry[uid] = eventRegistry[uid] || {} 17388 17389 return eventRegistry[uid] 17390} 17391 17392function bootstrapHandler(element, fn) { 17393 return function handler(event) { 17394 event.delegateTarget = element 17395 17396 if (handler.oneOff) { 17397 EventHandler.off(element, event.type, fn) 17398 } 17399 17400 return fn.apply(element, [event]) 17401 } 17402} 17403 17404function bootstrapDelegationHandler(element, selector, fn) { 17405 return function handler(event) { 17406 const domElements = element.querySelectorAll(selector) 17407 17408 for (let { target } = event; target && target !== this; target = target.parentNode) { 17409 for (let i = domElements.length; i--;) { 17410 if (domElements[i] === target) { 17411 event.delegateTarget = target 17412 17413 if (handler.oneOff) { 17414 EventHandler.off(element, event.type, selector, fn) 17415 } 17416 17417 return fn.apply(target, [event]) 17418 } 17419 } 17420 } 17421 17422 // To please ESLint 17423 return null 17424 } 17425} 17426 17427function findHandler(events, handler, delegationSelector = null) { 17428 const uidEventList = Object.keys(events) 17429 17430 for (let i = 0, len = uidEventList.length; i < len; i++) { 17431 const event = events[uidEventList[i]] 17432 17433 if (event.originalHandler === handler && event.delegationSelector === delegationSelector) { 17434 return event 17435 } 17436 } 17437 17438 return null 17439} 17440 17441function normalizeParams(originalTypeEvent, handler, delegationFn) { 17442 const delegation = typeof handler === 'string' 17443 const originalHandler = delegation ? delegationFn : handler 17444 17445 let typeEvent = getTypeEvent(originalTypeEvent) 17446 const isNative = nativeEvents.has(typeEvent) 17447 17448 if (!isNative) { 17449 typeEvent = originalTypeEvent 17450 } 17451 17452 return [delegation, originalHandler, typeEvent] 17453} 17454 17455function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) { 17456 if (typeof originalTypeEvent !== 'string' || !element) { 17457 return 17458 } 17459 17460 if (!handler) { 17461 handler = delegationFn 17462 delegationFn = null 17463 } 17464 17465 // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position 17466 // this prevents the handler from being dispatched the same way as mouseover or mouseout does 17467 if (customEventsRegex.test(originalTypeEvent)) { 17468 const wrapFn = fn => { 17469 return function (event) { 17470 if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) { 17471 return fn.call(this, event) 17472 } 17473 } 17474 } 17475 17476 if (delegationFn) { 17477 delegationFn = wrapFn(delegationFn) 17478 } else { 17479 handler = wrapFn(handler) 17480 } 17481 } 17482 17483 const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn) 17484 const events = getEvent(element) 17485 const handlers = events[typeEvent] || (events[typeEvent] = {}) 17486 const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null) 17487 17488 if (previousFn) { 17489 previousFn.oneOff = previousFn.oneOff && oneOff 17490 17491 return 17492 } 17493 17494 const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, '')) 17495 const fn = delegation ? 17496 bootstrapDelegationHandler(element, handler, delegationFn) : 17497 bootstrapHandler(element, handler) 17498 17499 fn.delegationSelector = delegation ? handler : null 17500 fn.originalHandler = originalHandler 17501 fn.oneOff = oneOff 17502 fn.uidEvent = uid 17503 handlers[uid] = fn 17504 17505 element.addEventListener(typeEvent, fn, delegation) 17506} 17507 17508function removeHandler(element, events, typeEvent, handler, delegationSelector) { 17509 const fn = findHandler(events[typeEvent], handler, delegationSelector) 17510 17511 if (!fn) { 17512 return 17513 } 17514 17515 element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)) 17516 delete events[typeEvent][fn.uidEvent] 17517} 17518 17519function removeNamespacedHandlers(element, events, typeEvent, namespace) { 17520 const storeElementEvent = events[typeEvent] || {} 17521 17522 Object.keys(storeElementEvent).forEach(handlerKey => { 17523 if (handlerKey.includes(namespace)) { 17524 const event = storeElementEvent[handlerKey] 17525 17526 removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector) 17527 } 17528 }) 17529} 17530 17531function getTypeEvent(event) { 17532 // allow to get the native events from namespaced events ('click.bs.button' --> 'click') 17533 event = event.replace(stripNameRegex, '') 17534 return customEvents[event] || event 17535} 17536 17537const EventHandler = { 17538 on(element, event, handler, delegationFn) { 17539 addHandler(element, event, handler, delegationFn, false) 17540 }, 17541 17542 one(element, event, handler, delegationFn) { 17543 addHandler(element, event, handler, delegationFn, true) 17544 }, 17545 17546 off(element, originalTypeEvent, handler, delegationFn) { 17547 if (typeof originalTypeEvent !== 'string' || !element) { 17548 return 17549 } 17550 17551 const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn) 17552 const inNamespace = typeEvent !== originalTypeEvent 17553 const events = getEvent(element) 17554 const isNamespace = originalTypeEvent.startsWith('.') 17555 17556 if (typeof originalHandler !== 'undefined') { 17557 // Simplest case: handler is passed, remove that listener ONLY. 17558 if (!events || !events[typeEvent]) { 17559 return 17560 } 17561 17562 removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null) 17563 return 17564 } 17565 17566 if (isNamespace) {
17567 Object.keys(events).forEach(elementEvent => { 17568 removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)) 17569 }) 17570 } 17571 17572 const storeElementEvent = events[typeEvent] || {} 17573 Object.keys(storeElementEvent).forEach(keyHandlers => { 17574 const handlerKey = keyHandlers.replace(stripUidRegex, '') 17575 17576 if (!inNamespace || originalTypeEvent.includes(handlerKey)) { 17577 const event = storeElementEvent[keyHandlers] 17578 17579 removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector) 17580 } 17581 }) 17582 }, 17583 17584 trigger(element, event, args) { 17585 if (typeof event !== 'string' || !element) { 17586 return null 17587 } 17588 17589 const $ = getjQuery() 17590 const typeEvent = getTypeEvent(event) 17591 const inNamespace = event !== typeEvent 17592 const isNative = nativeEvents.has(typeEvent) 17593 17594 let jQueryEvent 17595 let bubbles = true 17596 let nativeDispatch = true 17597 let defaultPrevented = false 17598 let evt = null 17599 17600 if (inNamespace && $) { 17601 jQueryEvent = $.Event(event, args) 17602 17603 $(element).trigger(jQueryEvent) 17604 bubbles = !jQueryEvent.isPropagationStopped() 17605 nativeDispatch = !jQueryEvent.isImmediatePropagationStopped() 17606 defaultPrevented = jQueryEvent.isDefaultPrevented() 17607 } 17608 17609 if (isNative) { 17610 evt = document.createEvent('HTMLEvents') 17611 evt.initEvent(typeEvent, bubbles, true) 17612 } else { 17613 evt = new CustomEvent(event, { 17614 bubbles, 17615 cancelable: true 17616 }) 17617 } 17618 17619 // merge custom information in our event 17620 if (typeof args !== 'undefined') { 17621 Object.keys(args).forEach(key => { 17622 Object.defineProperty(evt, key, { 17623 get() { 17624 return args[key] 17625 } 17626 }) 17627 }) 17628 } 17629 17630 if (defaultPrevented) { 17631 evt.preventDefault() 17632 } 17633 17634 if (nativeDispatch) { 17635 element.dispatchEvent(evt) 17636 } 17637 17638 if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') { 17639 jQueryEvent.preventDefault() 17640 } 17641 17642 return evt 17643 } 17644} 17645 17646/* harmony default export */ var event_handler = (EventHandler); 17647 17648;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/dom/manipulator.js 17649/** 17650 * -------------------------------------------------------------------------- 17651 * Bootstrap (v5.1.3): dom/manipulator.js 17652 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 17653 * -------------------------------------------------------------------------- 17654 */ 17655 17656function normalizeData(val) { 17657 if (val === 'true') { 17658 return true 17659 } 17660 17661 if (val === 'false') { 17662 return false 17663 } 17664 17665 if (val === Number(val).toString()) { 17666 return Number(val) 17667 } 17668 17669 if (val === '' || val === 'null') { 17670 return null 17671 } 17672 17673 return val 17674} 17675 17676function normalizeDataKey(key) { 17677 return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`) 17678} 17679 17680const Manipulator = { 17681 setDataAttribute(element, key, value) { 17682 element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value) 17683 }, 17684 17685 removeDataAttribute(element, key) { 17686 element.removeAttribute(`data-bs-${normalizeDataKey(key)}`) 17687 }, 17688 17689 getDataAttributes(element) { 17690 if (!element) { 17691 return {} 17692 } 17693 17694 const attributes = {} 17695 17696 Object.keys(element.dataset) 17697 .filter(key => key.startsWith('bs')) 17698 .forEach(key => { 17699 let pureKey = key.replace(/^bs/, '') 17700 pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length) 17701 attributes[pureKey] = normalizeData(element.dataset[key]) 17702 }) 17703 17704 return attributes 17705 }, 17706 17707 getDataAttribute(element, key) { 17708 return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)) 17709 }, 17710 17711 offset(element) { 17712 const rect = element.getBoundingClientRect() 17713 17714 return { 17715 top: rect.top + window.pageYOffset, 17716 left: rect.left + window.pageXOffset 17717 } 17718 }, 17719 17720 position(element) { 17721 return { 17722 top: element.offsetTop, 17723 left: element.offsetLeft 17724 } 17725 } 17726} 17727 17728/* harmony default export */ var manipulator = (Manipulator); 17729 17730;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/dom/selector-engine.js 17731/** 17732 * -------------------------------------------------------------------------- 17733 * Bootstrap (v5.1.3): dom/selector-engine.js 17734 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 17735 * -------------------------------------------------------------------------- 17736 */ 17737 17738/** 17739 * ------------------------------------------------------------------------ 17740 * Constants 17741 * ------------------------------------------------------------------------ 17742 */ 17743 17744 17745 17746const NODE_TEXT = 3 17747 17748const SelectorEngine = { 17749 find(selector, element = document.documentElement) { 17750 return [].concat(...Element.prototype.querySelectorAll.call(element, selector)) 17751 }, 17752 17753 findOne(selector, element = document.documentElement) { 17754 return Element.prototype.querySelector.call(element, selector) 17755 }, 17756 17757 children(element, selector) { 17758 return [].concat(...element.children) 17759 .filter(child => child.matches(selector)) 17760 }, 17761 17762 parents(element, selector) { 17763 const parents = [] 17764 17765 let ancestor = element.parentNode 17766 17767 while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { 17768 if (ancestor.matches(selector)) { 17769 parents.push(ancestor) 17770 } 17771 17772 ancestor = ancestor.parentNode 17773 } 17774 17775 return parents 17776 }, 17777 17778 prev(element, selector) { 17779 let previous = element.previousElementSibling 17780 17781 while (previous) { 17782 if (previous.matches(selector)) { 17783 return [previous] 17784 } 17785 17786 previous = previous.previousElementSibling 17787 } 17788 17789 return [] 17790 }, 17791 17792 next(element, selector) { 17793 let next = element.nextElementSibling 17794 17795 while (next) { 17796 if (next.matches(selector)) { 17797 return [next] 17798 } 17799 17800 next = next.nextElementSibling 17801 } 17802 17803 return [] 17804 }, 17805 17806 focusableChildren(element) { 17807 const focusables = [ 17808 'a', 17809 'button', 17810 'input', 17811 'textarea', 17812 'select', 17813 'details', 17814 '[tabindex]', 17815 '[contenteditable="true"]' 17816 ].map(selector => `${selector}:not([tabindex^="-"])`).join(', ') 17817 17818 return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el)) 17819 } 17820} 17821 17822/* harmony default export */ var selector_engine = (SelectorEngine); 17823 17824;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/base-component.js 17825/** 17826 * -------------------------------------------------------------------------- 17827 * Bootstrap (v5.1.3): base-component.js 17828 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 17829 * -------------------------------------------------------------------------- 17830 */ 17831 17832 17833 17834 17835 17836/** 17837 * ------------------------------------------------------------------------ 17838 * Constants 17839 * ------------------------------------------------------------------------ 17840 */ 17841 17842const VERSION = '5.1.3' 17843 17844class BaseComponent { 17845 constructor(element) { 17846 element = getElement(element) 17847 17848 if (!element) { 17849 return 17850 } 17851 17852 this._element = element 17853 data.set(this._element, this.constructor.DATA_KEY, this) 17854 } 17855 17856 dispose() { 17857 data.remove(this._element, this.constructor.DATA_KEY) 17858 event_handler.off(this._element, this.constructor.EVENT_KEY) 17859
17860 Object.getOwnPropertyNames(this).forEach(propertyName => { 17861 this[propertyName] = null 17862 }) 17863 } 17864 17865 _queueCallback(callback, element, isAnimated = true) { 17866 executeAfterTransition(callback, element, isAnimated) 17867 } 17868 17869 /** Static */ 17870 17871 static getInstance(element) { 17872 return data.get(getElement(element), this.DATA_KEY) 17873 } 17874 17875 static getOrCreateInstance(element, config = {}) { 17876 return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null) 17877 } 17878 17879 static get VERSION() { 17880 return VERSION 17881 } 17882 17883 static get NAME() { 17884 throw new Error('You have to implement the static method "NAME", for each component!') 17885 } 17886 17887 static get DATA_KEY() { 17888 return `bs.${this.NAME}` 17889 } 17890 17891 static get EVENT_KEY() { 17892 return `.${this.DATA_KEY}` 17893 } 17894} 17895 17896/* harmony default export */ var base_component = (BaseComponent); 17897 17898;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/collapse.js 17899/** 17900 * -------------------------------------------------------------------------- 17901 * Bootstrap (v5.1.3): collapse.js 17902 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 17903 * -------------------------------------------------------------------------- 17904 */ 17905 17906 17907 17908 17909 17910 17911 17912 17913/** 17914 * ------------------------------------------------------------------------ 17915 * Constants 17916 * ------------------------------------------------------------------------ 17917 */ 17918 17919const NAME = 'collapse' 17920const DATA_KEY = 'bs.collapse' 17921const EVENT_KEY = `.${DATA_KEY}` 17922const DATA_API_KEY = '.data-api' 17923 17924const Default = { 17925 toggle: true, 17926 parent: null 17927} 17928 17929const DefaultType = { 17930 toggle: 'boolean', 17931 parent: '(null|element)' 17932} 17933 17934const EVENT_SHOW = `show${EVENT_KEY}` 17935const EVENT_SHOWN = `shown${EVENT_KEY}` 17936const EVENT_HIDE = `hide${EVENT_KEY}` 17937const EVENT_HIDDEN = `hidden${EVENT_KEY}` 17938const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}` 17939 17940const CLASS_NAME_SHOW = 'show' 17941const CLASS_NAME_COLLAPSE = 'collapse' 17942const CLASS_NAME_COLLAPSING = 'collapsing' 17943const CLASS_NAME_COLLAPSED = 'collapsed' 17944const CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}` 17945const CLASS_NAME_HORIZONTAL = 'collapse-horizontal' 17946 17947const WIDTH = 'width' 17948const HEIGHT = 'height' 17949 17950const SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing' 17951const SELECTOR_DATA_TOGGLE = '[data-bs-toggle="collapse"]' 17952 17953/** 17954 * ------------------------------------------------------------------------ 17955 * Class Definition 17956 * ------------------------------------------------------------------------ 17957 */ 17958 17959class Collapse extends base_component { 17960 constructor(element, config) { 17961 super(element) 17962 17963 this._isTransitioning = false 17964 this._config = this._getConfig(config) 17965 this._triggerArray = [] 17966 17967 const toggleList = selector_engine.find(SELECTOR_DATA_TOGGLE) 17968 17969 for (let i = 0, len = toggleList.length; i < len; i++) { 17970 const elem = toggleList[i] 17971 const selector = getSelectorFromElement(elem) 17972 const filterElement = selector_engine.find(selector) 17973 .filter(foundElem => foundElem === this._element) 17974 17975 if (selector !== null && filterElement.length) { 17976 this._selector = selector 17977 this._triggerArray.push(elem) 17978 } 17979 } 17980 17981 this._initializeChildren() 17982 17983 if (!this._config.parent) { 17984 this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()) 17985 } 17986 17987 if (this._config.toggle) { 17988 this.toggle() 17989 } 17990 } 17991 17992 // Getters 17993 17994 static get Default() { 17995 return Default 17996 } 17997 17998 static get NAME() { 17999 return NAME 18000 } 18001 18002 // Public 18003 18004 toggle() { 18005 if (this._isShown()) { 18006 this.hide() 18007 } else { 18008 this.show() 18009 } 18010 } 18011 18012 show() { 18013 if (this._isTransitioning || this._isShown()) { 18014 return 18015 } 18016 18017 let actives = [] 18018 let activesData 18019 18020 if (this._config.parent) { 18021 const children = selector_engine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent) 18022 actives = selector_engine.find(SELECTOR_ACTIVES, this._config.parent).filter(elem => !children.includes(elem)) // remove children if greater depth 18023 } 18024 18025 const container = selector_engine.findOne(this._selector) 18026 if (actives.length) { 18027 const tempActiveData = actives.find(elem => container !== elem) 18028 activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null 18029 18030 if (activesData && activesData._isTransitioning) { 18031 return 18032 } 18033 } 18034 18035 const startEvent = event_handler.trigger(this._element, EVENT_SHOW) 18036 if (startEvent.defaultPrevented) { 18037 return 18038 } 18039
18040 actives.forEach(elemActive => { 18041 if (container !== elemActive) { 18042 Collapse.getOrCreateInstance(elemActive, { toggle: false }).hide() 18043 } 18044 18045 if (!activesData) { 18046 data.set(elemActive, DATA_KEY, null) 18047 } 18048 }) 18049 18050 const dimension = this._getDimension() 18051 18052 this._element.classList.remove(CLASS_NAME_COLLAPSE) 18053 this._element.classList.add(CLASS_NAME_COLLAPSING) 18054 18055 this._element.style[dimension] = 0 18056 18057 this._addAriaAndCollapsedClass(this._triggerArray, true) 18058 this._isTransitioning = true 18059 18060 const complete = () => { 18061 this._isTransitioning = false 18062 18063 this._element.classList.remove(CLASS_NAME_COLLAPSING) 18064 this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW) 18065 18066 this._element.style[dimension] = '' 18067 18068 event_handler.trigger(this._element, EVENT_SHOWN) 18069 } 18070 18071 const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1) 18072 const scrollSize = `scroll${capitalizedDimension}` 18073 18074 this._queueCallback(complete, this._element, true) 18075 this._element.style[dimension] = `${this._element[scrollSize]}px` 18076 } 18077 18078 hide() { 18079 if (this._isTransitioning || !this._isShown()) { 18080 return 18081 } 18082 18083 const startEvent = event_handler.trigger(this._element, EVENT_HIDE) 18084 if (startEvent.defaultPrevented) { 18085 return 18086 } 18087 18088 const dimension = this._getDimension() 18089 18090 this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px` 18091 18092 reflow(this._element) 18093 18094 this._element.classList.add(CLASS_NAME_COLLAPSING) 18095 this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW) 18096 18097 const triggerArrayLength = this._triggerArray.length 18098 for (let i = 0; i < triggerArrayLength; i++) { 18099 const trigger = this._triggerArray[i] 18100 const elem = getElementFromSelector(trigger) 18101 18102 if (elem && !this._isShown(elem)) { 18103 this._addAriaAndCollapsedClass([trigger], false) 18104 } 18105 } 18106 18107 this._isTransitioning = true 18108 18109 const complete = () => { 18110 this._isTransitioning = false 18111 this._element.classList.remove(CLASS_NAME_COLLAPSING) 18112 this._element.classList.add(CLASS_NAME_COLLAPSE) 18113 event_handler.trigger(this._element, EVENT_HIDDEN) 18114 } 18115 18116 this._element.style[dimension] = '' 18117 18118 this._queueCallback(complete, this._element, true) 18119 } 18120 18121 _isShown(element = this._element) { 18122 return element.classList.contains(CLASS_NAME_SHOW) 18123 } 18124 18125 // Private 18126 18127 _getConfig(config) { 18128 config = { 18129 ...Default, 18130 ...manipulator.getDataAttributes(this._element), 18131 ...config 18132 } 18133 config.toggle = Boolean(config.toggle) // Coerce string values 18134 config.parent = getElement(config.parent) 18135 typeCheckConfig(NAME, config, DefaultType) 18136 return config 18137 } 18138 18139 _getDimension() { 18140 return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT 18141 } 18142 18143 _initializeChildren() { 18144 if (!this._config.parent) { 18145 return 18146 } 18147 18148 const children = selector_engine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent) 18149 selector_engine.find(SELECTOR_DATA_TOGGLE, this._config.parent).filter(elem => !children.includes(elem)) 18150 .forEach(element => { 18151 const selected = getElementFromSelector(element) 18152 18153 if (selected) { 18154 this._addAriaAndCollapsedClass([element], this._isShown(selected)) 18155 } 18156 }) 18157 } 18158 18159 _addAriaAndCollapsedClass(triggerArray, isOpen) { 18160 if (!triggerArray.length) { 18161 return 18162 } 18163 18164 triggerArray.forEach(elem => { 18165 if (isOpen) { 18166 elem.classList.remove(CLASS_NAME_COLLAPSED) 18167 } else { 18168 elem.classList.add(CLASS_NAME_COLLAPSED) 18169 } 18170 18171 elem.setAttribute('aria-expanded', isOpen) 18172 }) 18173 } 18174 18175 // Static 18176 18177 static jQueryInterface(config) { 18178 return this.each(function () { 18179 const _config = {} 18180 if (typeof config === 'string' && /show|hide/.test(config)) { 18181 _config.toggle = false 18182 } 18183 18184 const data = Collapse.getOrCreateInstance(this, _config) 18185 18186 if (typeof config === 'string') { 18187 if (typeof data[config] === 'undefined') {
18188 throw new TypeError(`No method named "${config}"`) 18189 } 18190 18191 data[config]() 18192 } 18193 }) 18194 } 18195} 18196 18197/** 18198 * ------------------------------------------------------------------------ 18199 * Data Api implementation 18200 * ------------------------------------------------------------------------ 18201 */ 18202 18203event_handler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) { 18204 // preventDefault only for <a> elements (which change the URL) not inside the collapsible element 18205 if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) { 18206 event.preventDefault() 18207 } 18208 18209 const selector = getSelectorFromElement(this) 18210 const selectorElements = selector_engine.find(selector) 18211 18212 selectorElements.forEach(element => { 18213 Collapse.getOrCreateInstance(element, { toggle: false }).toggle() 18214 }) 18215}) 18216 18217/** 18218 * ------------------------------------------------------------------------ 18219 * jQuery 18220 * ------------------------------------------------------------------------ 18221 * add .Collapse to jQuery only if jQuery is present 18222 */ 18223 18224defineJQueryPlugin(Collapse) 18225 18226/* harmony default export */ var collapse = ((/* unused pure expression or super */ null && (Collapse))); 18227 18228;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/collapse/collapse.main.js 18229 18230// EXTERNAL MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/cookieman/cookieman.main.js 18231var cookieman_main = __webpack_require__(7364); 18232// EXTERNAL MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/vendor/Accessible-Mega-Menu/js/jquery-accessibleMegaMenu.js 18233var jquery_accessibleMegaMenu = __webpack_require__(2873); 18234// EXTERNAL MODULE: ./src/js/vendor/Accessible-Mega-Menu/js/jquery-accessibleMegaMenu.js 18235var js_jquery_accessibleMegaMenu = __webpack_require__(4452); 18236;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/dropdownNav/dropdownNav.main.js 18237// todo: is this import needed 18238// must test with only one nav available! 18239 18240 18241 18242function clickHandler(el) { 18243 external_$_default()(el).on('click', function (e) { 18244 var url = e.target.href; // this catches if event is on a span etc instead on the a tag 18245 18246 if (url === undefined) { 18247 url = external_$_default()(e.target).closest('a')[0].href; 18248 } // workaround, as megamenu will deactivate top level links 18249 18250 18251 window.location.href = url; 18252 }); 18253} 18254 18255function touchHandler(el) { 18256 external_$_default()(el).on('touchstart', function () { 18257 external_$_default()('.firstLevel__list > li > a').removeClass('focus'); 18258 external_$_default()('.subNav').removeClass('open'); 18259 external_$_default()(el).addClass('focus'); 18260 external_$_default()(el).siblings('.subNav').addClass('open'); 18261 }); 18262} 18263/** 18264 * Init on DOM ready 18265 */ 18266 18267 18268function dropdownNav_main_init() { 18269 var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.dropdownNav .firstLevel'; 18270 console.log('dropdownNav initialised through dropdownNav on: ' + selector); 18271 external_$_default()(selector).accessibleMegaMenu({ 18272 openOnMouseover: true 18273 }); // hack so that the megamenu doesn't show flash of css animation after the page loads. 18274 18275 setTimeout(function () { 18276 external_$_default()('body').removeClass('init'); 18277 }, 500); 18278 var $links = external_$_default()('.dropdownNav .firstLevel__list > li > a'); 18279 $links.each(function (e, el) { 18280 return clickHandler(el); 18281 }); 18282 $links.each(function (e, el) { 18283 return touchHandler(el); 18284 }); 18285 external_$_default()(window).on('touchstart', function (e) { 18286 if (external_$_default()(e.target).parents('.dropdownNav').length < 1) { 18287 external_$_default()('.dropdownNav .firstLevel__list > li > a').removeClass('focus'); 18288 external_$_default()('.dropdownNav .subNav').removeClass('open'); 18289 } 18290 }); 18291} 18292external_$_default().when((external_$_default()).ready).then(function () { 18293 console.log('dropdownNav initialised on DOMContentLoaded'); // init modes 18294 18295 dropdownNav_main_init('.dropdownNav .firstLevel'); 18296}); 18297;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/dropdownAccordionNav/dropdownAccordionNav.main.js 18298 18299 18300 18301 18302external_$_default().when((external_$_default()).ready).then(function () { 18303 console.log('dropdownAccordionNav initialised on DOMContentLoaded'); // init modes 18304 18305 dropdownNav_main_init('.dropdownAccordionNav .firstLevel'); 18306 init('.dropdownAccordionNav .thirdLevel'); 18307}); 18308;// CONCATENATED MODULE: ./src/modules/components/dropdownFilter/dropdownFilter.main.js 18309 18310 18311function isFilterEmpty($filter) { 18312 var $selects = $filter.find('select');
18313 var $inputs = $filter.find('input:not(:hidden)'); 18314 var isEmpty = true; 18315 $selects.each(function () { 18316 var $select = external_$_default()(this); 18317 18318 if ($select[0].selectedIndex !== 0) { 18319 isEmpty = false; 18320 } 18321 }); 18322 $inputs.each(function () { 18323 var $input = external_$_default()(this); 18324 18325 if ($input.val() !== '') { 18326 isEmpty = false; 18327 } 18328 18329 if ($input.next().length > 0) { 18330 if ($input.next().val() !== '') { 18331 isEmpty = false; 18332 } 18333 } 18334 }); 18335 return isEmpty; 18336} 18337 18338function resetFilter($filter) { 18339 var $selects = $filter.find('select'); 18340 var $inputs = $filter.find('input:not(:hidden)'); 18341 $selects.each(function () { 18342 var $select = external_$_default()(this); 18343 $select[0].selectedIndex = 0; 18344 }); 18345 $inputs.each(function () { 18346 var $input = external_$_default()(this); 18347 $input.val(''); 18348 18349 if ($input.next().length > 0) { 18350 $input.next().val(''); 18351 } 18352 }); 18353} 18354/** 18355 * Init on DOM ready 18356 */ 18357 18358 18359external_$_default().when((external_$_default()).ready).then(function () { 18360 external_$_default()('.dropdownFilter').each(function () { 18361 var $dropdownFilter = external_$_default()(this); 18362 var $submit = $dropdownFilter.find('[type="submit"]'); 18363 var $resetButtonLabel = 'Filter zurücksetzen'; 18364 18365 if (external_$_default()('html').attr('lang') != 'de-de') { 18366 $resetButtonLabel = 'filter reset'; 18367 } 18368 18369 if (isFilterEmpty($dropdownFilter)) { 18370 return; 18371 } 18372 18373 var $filterReset = external_$_default()('<span class="f-navigation__reset">' + '<button class="dropdownFilter__reset">' + $resetButtonLabel + '</button></span>'); 18374 $dropdownFilter.find('.f-navigation').append($filterReset); 18375 $filterReset.on('click', function (evt) { 18376 evt.preventDefault(); 18377 resetFilter($dropdownFilter); 18378 $submit.trigger('click'); 18379 }); 18380 }); 18381}); 18382/** 18383 * Init on document load 18384 */ 18385 18386function dropdownFilter_main_load() {} 18387// EXTERNAL MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/expand/expand.main.js 18388var expand_main = __webpack_require__(5539); 18389;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/enums.js 18390var enums_top = 'top'; 18391var bottom = 'bottom'; 18392var right = 'right'; 18393var left = 'left'; 18394var auto = 'auto'; 18395var basePlacements = [enums_top, bottom, right, left]; 18396var start = 'start'; 18397var end = 'end'; 18398var clippingParents = 'clippingParents'; 18399var viewport = 'viewport'; 18400var popper = 'popper'; 18401var reference = 'reference'; 18402var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) { 18403 return acc.concat([placement + "-" + start, placement + "-" + end]); 18404}, []); 18405var enums_placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) { 18406 return acc.concat([placement, placement + "-" + start, placement + "-" + end]); 18407}, []); // modifiers that need to read the DOM 18408 18409var beforeRead = 'beforeRead'; 18410var read = 'read'; 18411var afterRead = 'afterRead'; // pure-logic modifiers 18412 18413var beforeMain = 'beforeMain'; 18414var main = 'main'; 18415var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) 18416 18417var beforeWrite = 'beforeWrite'; 18418var write = 'write'; 18419var afterWrite = 'afterWrite'; 18420var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; 18421;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js 18422function getNodeName(element) { 18423 return element ? (element.nodeName || '').toLowerCase() : null; 18424} 18425;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindow.js 18426function getWindow(node) { 18427 if (node == null) { 18428 return window; 18429 } 18430 18431 if (node.toString() !== '[object Window]') { 18432 var ownerDocument = node.ownerDocument; 18433 return ownerDocument ? ownerDocument.defaultView || window : window; 18434 } 18435 18436 return node; 18437} 18438;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js 18439 18440 18441function instanceOf_isElement(node) { 18442 var OwnElement = getWindow(node).Element; 18443 return node instanceof OwnElement || node instanceof Element; 18444} 18445 18446function isHTMLElement(node) { 18447 var OwnElement = getWindow(node).HTMLElement; 18448 return node instanceof OwnElement || node instanceof HTMLElement; 18449} 18450 18451function isShadowRoot(node) { 18452 // IE 11 has no ShadowRoot 18453 if (typeof ShadowRoot === 'undefined') { 18454 return false;
vendor: 9,203 bytes, lines 18455-18743
18455 } 18456 18457 var OwnElement = getWindow(node).ShadowRoot; 18458 return node instanceof OwnElement || node instanceof ShadowRoot; 18459} 18460 18461 18462;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/applyStyles.js 18463 18464 // This modifier takes the styles prepared by the `computeStyles` modifier 18465// and applies them to the HTMLElements such as popper and arrow 18466 18467function applyStyles(_ref) { 18468 var state = _ref.state; 18469 Object.keys(state.elements).forEach(function (name) { 18470 var style = state.styles[name] || {}; 18471 var attributes = state.attributes[name] || {}; 18472 var element = state.elements[name]; // arrow is optional + virtual elements 18473 18474 if (!isHTMLElement(element) || !getNodeName(element)) { 18475 return; 18476 } // Flow doesn't support to extend this property, but it's the most 18477 // effective way to apply styles to an HTMLElement 18478 // $FlowFixMe[cannot-write] 18479 18480 18481 Object.assign(element.style, style); 18482 Object.keys(attributes).forEach(function (name) { 18483 var value = attributes[name]; 18484 18485 if (value === false) { 18486 element.removeAttribute(name); 18487 } else { 18488 element.setAttribute(name, value === true ? '' : value); 18489 } 18490 }); 18491 }); 18492} 18493 18494function effect(_ref2) { 18495 var state = _ref2.state; 18496 var initialStyles = { 18497 popper: { 18498 position: state.options.strategy, 18499 left: '0', 18500 top: '0', 18501 margin: '0' 18502 }, 18503 arrow: { 18504 position: 'absolute' 18505 }, 18506 reference: {} 18507 }; 18508 Object.assign(state.elements.popper.style, initialStyles.popper); 18509 state.styles = initialStyles; 18510 18511 if (state.elements.arrow) { 18512 Object.assign(state.elements.arrow.style, initialStyles.arrow); 18513 } 18514 18515 return function () { 18516 Object.keys(state.elements).forEach(function (name) { 18517 var element = state.elements[name]; 18518 var attributes = state.attributes[name] || {}; 18519 var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them 18520 18521 var style = styleProperties.reduce(function (style, property) { 18522 style[property] = ''; 18523 return style; 18524 }, {}); // arrow is optional + virtual elements 18525 18526 if (!isHTMLElement(element) || !getNodeName(element)) { 18527 return; 18528 } 18529 18530 Object.assign(element.style, style); 18531 Object.keys(attributes).forEach(function (attribute) { 18532 element.removeAttribute(attribute); 18533 }); 18534 }); 18535 }; 18536} // eslint-disable-next-line import/no-unused-modules 18537 18538 18539/* harmony default export */ var modifiers_applyStyles = ({ 18540 name: 'applyStyles', 18541 enabled: true, 18542 phase: 'write', 18543 fn: applyStyles, 18544 effect: effect, 18545 requires: ['computeStyles'] 18546}); 18547;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getBasePlacement.js 18548 18549function getBasePlacement(placement) { 18550 return placement.split('-')[0]; 18551} 18552;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/math.js 18553var math_max = Math.max; 18554var math_min = Math.min; 18555var round = Math.round; 18556;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js 18557 18558 18559function getBoundingClientRect(element, includeScale) { 18560 if (includeScale === void 0) { 18561 includeScale = false; 18562 } 18563 18564 var rect = element.getBoundingClientRect(); 18565 var scaleX = 1; 18566 var scaleY = 1; 18567 18568 if (isHTMLElement(element) && includeScale) { 18569 var offsetHeight = element.offsetHeight; 18570 var offsetWidth = element.offsetWidth; // Do not attempt to divide by 0, otherwise we get `Infinity` as scale 18571 // Fallback to 1 in case both values are `0` 18572 18573 if (offsetWidth > 0) { 18574 scaleX = round(rect.width) / offsetWidth || 1; 18575 } 18576 18577 if (offsetHeight > 0) { 18578 scaleY = round(rect.height) / offsetHeight || 1; 18579 } 18580 } 18581 18582 return { 18583 width: rect.width / scaleX, 18584 height: rect.height / scaleY, 18585 top: rect.top / scaleY, 18586 right: rect.right / scaleX, 18587 bottom: rect.bottom / scaleY, 18588 left: rect.left / scaleX, 18589 x: rect.left / scaleX, 18590 y: rect.top / scaleY 18591 }; 18592} 18593;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js 18594 // Returns the layout rect of an element relative to its offsetParent. Layout 18595// means it doesn't take into account transforms. 18596 18597function getLayoutRect(element) { 18598 var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed. 18599 // Fixes https://github.com/popperjs/popper-core/issues/1223 18600 18601 var width = element.offsetWidth; 18602 var height = element.offsetHeight; 18603 18604 if (Math.abs(clientRect.width - width) <= 1) { 18605 width = clientRect.width; 18606 } 18607 18608 if (Math.abs(clientRect.height - height) <= 1) { 18609 height = clientRect.height; 18610 } 18611 18612 return { 18613 x: element.offsetLeft, 18614 y: element.offsetTop, 18615 width: width, 18616 height: height 18617 }; 18618} 18619;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/contains.js 18620 18621function contains(parent, child) { 18622 var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method 18623 18624 if (parent.contains(child)) { 18625 return true; 18626 } // then fallback to custom implementation with Shadow DOM support 18627 else if (rootNode && isShadowRoot(rootNode)) { 18628 var next = child; 18629 18630 do { 18631 if (next && parent.isSameNode(next)) { 18632 return true; 18633 } // $FlowFixMe[prop-missing]: need a better way to handle this... 18634 18635 18636 next = next.parentNode || next.host; 18637 } while (next); 18638 } // Give up, the result is false 18639 18640 18641 return false; 18642} 18643;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js 18644 18645function getComputedStyle_getComputedStyle(element) { 18646 return getWindow(element).getComputedStyle(element); 18647} 18648;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js 18649 18650function isTableElement(element) { 18651 return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; 18652} 18653;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js 18654 18655function getDocumentElement(element) { 18656 // $FlowFixMe[incompatible-return]: assume body is always available 18657 return ((instanceOf_isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing] 18658 element.document) || window.document).documentElement; 18659} 18660;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js 18661 18662 18663 18664function getParentNode(element) { 18665 if (getNodeName(element) === 'html') { 18666 return element; 18667 } 18668 18669 return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle 18670 // $FlowFixMe[incompatible-return] 18671 // $FlowFixMe[prop-missing] 18672 element.assignedSlot || // step into the shadow DOM of the parent of a slotted node 18673 element.parentNode || ( // DOM Element detected 18674 isShadowRoot(element) ? element.host : null) || // ShadowRoot detected 18675 // $FlowFixMe[incompatible-call]: HTMLElement is a Node 18676 getDocumentElement(element) // fallback 18677 18678 ); 18679} 18680;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js 18681 18682 18683 18684 18685 18686 18687 18688function getTrueOffsetParent(element) { 18689 if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 18690 getComputedStyle_getComputedStyle(element).position === 'fixed') { 18691 return null; 18692 } 18693 18694 return element.offsetParent; 18695} // `.offsetParent` reports `null` for fixed elements, while absolute elements 18696// return the containing block 18697 18698 18699function getContainingBlock(element) { 18700 var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1; 18701 var isIE = navigator.userAgent.indexOf('Trident') !== -1; 18702 18703 if (isIE && isHTMLElement(element)) { 18704 // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport 18705 var elementCss = getComputedStyle_getComputedStyle(element); 18706 18707 if (elementCss.position === 'fixed') { 18708 return null; 18709 } 18710 } 18711 18712 var currentNode = getParentNode(element); 18713 18714 if (isShadowRoot(currentNode)) { 18715 currentNode = currentNode.host; 18716 } 18717 18718 while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { 18719 var css = getComputedStyle_getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that 18720 // create a containing block. 18721 // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block 18722 18723 if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') { 18724 return currentNode; 18725 } else { 18726 currentNode = currentNode.parentNode; 18727 } 18728 } 18729 18730 return null; 18731} // Gets the closest ancestor positioned element. Handles some edge cases, 18732// such as table ancestors and cross browser bugs. 18733 18734 18735function getOffsetParent(element) { 18736 var window = getWindow(element); 18737 var offsetParent = getTrueOffsetParent(element); 18738 18739 while (offsetParent && isTableElement(offsetParent) && getComputedStyle_getComputedStyle(offsetParent).position === 'static') { 18740 offsetParent = getTrueOffsetParent(offsetParent); 18741 } 18742 18743 if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle_
vendor: 6,229 bytes, lines 18743-18955
18743getComputedStyle(offsetParent).position === 'static')) { 18744 return window; 18745 } 18746 18747 return offsetParent || getContainingBlock(element) || window; 18748} 18749;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js 18750function getMainAxisFromPlacement(placement) { 18751 return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; 18752} 18753;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/within.js 18754 18755function within(min, value, max) { 18756 return math_max(min, math_min(value, max)); 18757} 18758function withinMaxClamp(min, value, max) { 18759 var v = within(min, value, max); 18760 return v > max ? max : v; 18761} 18762;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js 18763function getFreshSideObject() { 18764 return { 18765 top: 0, 18766 right: 0, 18767 bottom: 0, 18768 left: 0 18769 }; 18770} 18771;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js 18772 18773function mergePaddingObject(paddingObject) { 18774 return Object.assign({}, getFreshSideObject(), paddingObject); 18775} 18776;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/expandToHashMap.js 18777function expandToHashMap(value, keys) { 18778 return keys.reduce(function (hashMap, key) { 18779 hashMap[key] = value; 18780 return hashMap; 18781 }, {}); 18782} 18783;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/arrow.js 18784 18785 18786 18787 18788 18789 18790 18791 18792 18793 // eslint-disable-next-line import/no-unused-modules 18794 18795var toPaddingObject = function toPaddingObject(padding, state) { 18796 padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, { 18797 placement: state.placement 18798 })) : padding; 18799 return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); 18800}; 18801 18802function arrow(_ref) { 18803 var _state$modifiersData$; 18804 18805 var state = _ref.state, 18806 name = _ref.name, 18807 options = _ref.options; 18808 var arrowElement = state.elements.arrow; 18809 var popperOffsets = state.modifiersData.popperOffsets; 18810 var basePlacement = getBasePlacement(state.placement); 18811 var axis = getMainAxisFromPlacement(basePlacement); 18812 var isVertical = [left, right].indexOf(basePlacement) >= 0; 18813 var len = isVertical ? 'height' : 'width'; 18814 18815 if (!arrowElement || !popperOffsets) { 18816 return; 18817 } 18818 18819 var paddingObject = toPaddingObject(options.padding, state); 18820 var arrowRect = getLayoutRect(arrowElement); 18821 var minProp = axis === 'y' ? enums_top : left; 18822 var maxProp = axis === 'y' ? bottom : right; 18823 var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; 18824 var startDiff = popperOffsets[axis] - state.rects.reference[axis]; 18825 var arrowOffsetParent = getOffsetParent(arrowElement); 18826 var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; 18827 var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is 18828 // outside of the popper bounds 18829 18830 var min = paddingObject[minProp]; 18831 var max = clientSize - arrowRect[len] - paddingObject[maxProp]; 18832 var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; 18833 var offset = within(min, center, max); // Prevents breaking syntax highlighting... 18834 18835 var axisProp = axis; 18836 state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); 18837} 18838 18839function arrow_effect(_ref2) { 18840 var state = _ref2.state, 18841 options = _ref2.options; 18842 var _options$element = options.element, 18843 arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element; 18844 18845 if (arrowElement == null) { 18846 return; 18847 } // CSS selector 18848 18849 18850 if (typeof arrowElement === 'string') { 18851 arrowElement = state.elements.popper.querySelector(arrowElement); 18852 18853 if (!arrowElement) { 18854 return; 18855 } 18856 } 18857 18858 if (false) {} 18859 18860 if (!contains(state.elements.popper, arrowElement)) { 18861 if (false) {} 18862 18863 return; 18864 } 18865 18866 state.elements.arrow = arrowElement; 18867} // eslint-disable-next-line import/no-unused-modules 18868 18869 18870/* harmony default export */ var modifiers_arrow = ({ 18871 name: 'arrow', 18872 enabled: true, 18873 phase: 'main', 18874 fn: arrow, 18875 effect: arrow_effect, 18876 requires: ['popperOffsets'], 18877 requiresIfExists: ['preventOverflow'] 18878}); 18879;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getVariation.js 18880function getVariation(placement) { 18881 return placement.split('-')[1]; 18882} 18883;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/computeStyles.js 18884 18885 18886 18887 18888 18889 18890 18891 // eslint-disable-next-line import/no-unused-modules 18892 18893var unsetSides = { 18894 top: 'auto', 18895 right: 'auto', 18896 bottom: 'auto', 18897 left: 'auto' 18898}; // Round the offsets to the nearest suitable subpixel based on the DPR. 18899// Zooming can change the DPR, but it seems to report a value that will 18900// cleanly divide the values into the appropriate subpixels. 18901 18902function roundOffsetsByDPR(_ref) { 18903 var x = _ref.x, 18904 y = _ref.y; 18905 var win = window; 18906 var dpr = win.devicePixelRatio || 1; 18907 return { 18908 x: round(x * dpr) / dpr || 0, 18909 y: round(y * dpr) / dpr || 0 18910 }; 18911} 18912 18913function mapToStyles(_ref2) { 18914 var _Object$assign2; 18915 18916 var popper = _ref2.popper, 18917 popperRect = _ref2.popperRect, 18918 placement = _ref2.placement, 18919 variation = _ref2.variation, 18920 offsets = _ref2.offsets, 18921 position = _ref2.position, 18922 gpuAcceleration = _ref2.gpuAcceleration, 18923 adaptive = _ref2.adaptive, 18924 roundOffsets = _ref2.roundOffsets, 18925 isFixed = _ref2.isFixed; 18926 var _offsets$x = offsets.x, 18927 x = _offsets$x === void 0 ? 0 : _offsets$x, 18928 _offsets$y = offsets.y, 18929 y = _offsets$y === void 0 ? 0 : _offsets$y; 18930 18931 var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({ 18932 x: x, 18933 y: y 18934 }) : { 18935 x: x, 18936 y: y 18937 }; 18938 18939 x = _ref3.x; 18940 y = _ref3.y; 18941 var hasX = offsets.hasOwnProperty('x'); 18942 var hasY = offsets.hasOwnProperty('y'); 18943 var sideX = left; 18944 var sideY = enums_top; 18945 var win = window; 18946 18947 if (adaptive) { 18948 var offsetParent = getOffsetParent(popper); 18949 var heightProp = 'clientHeight'; 18950 var widthProp = 'clientWidth'; 18951 18952 if (offsetParent === getWindow(popper)) { 18953 offsetParent = getDocumentElement(popper); 18954 18955 if (getComputedStyle
vendor: 7,421 bytes, lines 18955-19172
18955_getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') { 18956 heightProp = 'scrollHeight'; 18957 widthProp = 'scrollWidth'; 18958 } 18959 } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it 18960 18961 18962 offsetParent = offsetParent; 18963 18964 if (placement === enums_top || (placement === left || placement === right) && variation === end) { 18965 sideY = bottom; 18966 var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing] 18967 offsetParent[heightProp]; 18968 y -= offsetY - popperRect.height; 18969 y *= gpuAcceleration ? 1 : -1; 18970 } 18971 18972 if (placement === left || (placement === enums_top || placement === bottom) && variation === end) { 18973 sideX = right; 18974 var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing] 18975 offsetParent[widthProp]; 18976 x -= offsetX - popperRect.width; 18977 x *= gpuAcceleration ? 1 : -1; 18978 } 18979 } 18980 18981 var commonStyles = Object.assign({ 18982 position: position 18983 }, adaptive && unsetSides); 18984 18985 var _ref4 = roundOffsets === true ? roundOffsetsByDPR({ 18986 x: x, 18987 y: y 18988 }) : { 18989 x: x, 18990 y: y 18991 }; 18992 18993 x = _ref4.x; 18994 y = _ref4.y; 18995 18996 if (gpuAcceleration) { 18997 var _Object$assign; 18998 18999 return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); 19000 } 19001 19002 return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); 19003} 19004 19005function computeStyles(_ref5) { 19006 var state = _ref5.state, 19007 options = _ref5.options; 19008 var _options$gpuAccelerat = options.gpuAcceleration, 19009 gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, 19010 _options$adaptive = options.adaptive, 19011 adaptive = _options$adaptive === void 0 ? true : _options$adaptive, 19012 _options$roundOffsets = options.roundOffsets, 19013 roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; 19014 19015 if (false) { var transitionProperty; } 19016 19017 var commonStyles = { 19018 placement: getBasePlacement(state.placement), 19019 variation: getVariation(state.placement), 19020 popper: state.elements.popper, 19021 popperRect: state.rects.popper, 19022 gpuAcceleration: gpuAcceleration, 19023 isFixed: state.options.strategy === 'fixed' 19024 }; 19025 19026 if (state.modifiersData.popperOffsets != null) { 19027 state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, { 19028 offsets: state.modifiersData.popperOffsets, 19029 position: state.options.strategy, 19030 adaptive: adaptive, 19031 roundOffsets: roundOffsets 19032 }))); 19033 } 19034 19035 if (state.modifiersData.arrow != null) { 19036 state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, { 19037 offsets: state.modifiersData.arrow, 19038 position: 'absolute', 19039 adaptive: false, 19040 roundOffsets: roundOffsets 19041 }))); 19042 } 19043 19044 state.attributes.popper = Object.assign({}, state.attributes.popper, { 19045 'data-popper-placement': state.placement 19046 }); 19047} // eslint-disable-next-line import/no-unused-modules 19048 19049 19050/* harmony default export */ var modifiers_computeStyles = ({ 19051 name: 'computeStyles', 19052 enabled: true, 19053 phase: 'beforeWrite', 19054 fn: computeStyles, 19055 data: {} 19056}); 19057;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/eventListeners.js 19058 // eslint-disable-next-line import/no-unused-modules 19059 19060var passive = { 19061 passive: true 19062}; 19063 19064function eventListeners_effect(_ref) { 19065 var state = _ref.state, 19066 instance = _ref.instance, 19067 options = _ref.options; 19068 var _options$scroll = options.scroll, 19069 scroll = _options$scroll === void 0 ? true : _options$scroll, 19070 _options$resize = options.resize, 19071 resize = _options$resize === void 0 ? true : _options$resize; 19072 var window = getWindow(state.elements.popper); 19073 var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); 19074 19075 if (scroll) { 19076 scrollParents.forEach(function (scrollParent) { 19077 scrollParent.addEventListener('scroll', instance.update, passive); 19078 }); 19079 } 19080 19081 if (resize) { 19082 window.addEventListener('resize', instance.update, passive); 19083 } 19084 19085 return function () { 19086 if (scroll) { 19087 scrollParents.forEach(function (scrollParent) { 19088 scrollParent.removeEventListener('scroll', instance.update, passive); 19089 }); 19090 } 19091 19092 if (resize) { 19093 window.removeEventListener('resize', instance.update, passive); 19094 } 19095 }; 19096} // eslint-disable-next-line import/no-unused-modules 19097 19098 19099/* harmony default export */ var eventListeners = ({ 19100 name: 'eventListeners', 19101 enabled: true, 19102 phase: 'write', 19103 fn: function fn() {}, 19104 effect: eventListeners_effect, 19105 data: {} 19106}); 19107;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js 19108var hash = { 19109 left: 'right', 19110 right: 'left', 19111 bottom: 'top', 19112 top: 'bottom' 19113}; 19114function getOppositePlacement(placement) { 19115 return placement.replace(/left|right|bottom|top/g, function (matched) { 19116 return hash[matched]; 19117 }); 19118} 19119;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js 19120var getOppositeVariationPlacement_hash = { 19121 start: 'end', 19122 end: 'start' 19123}; 19124function getOppositeVariationPlacement(placement) { 19125 return placement.replace(/start|end/g, function (matched) { 19126 return getOppositeVariationPlacement_hash[matched]; 19127 }); 19128} 19129;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js 19130 19131function getWindowScroll(node) { 19132 var win = getWindow(node); 19133 var scrollLeft = win.pageXOffset; 19134 var scrollTop = win.pageYOffset; 19135 return { 19136 scrollLeft: scrollLeft, 19137 scrollTop: scrollTop 19138 }; 19139} 19140;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js 19141 19142 19143 19144function getWindowScrollBarX(element) { 19145 // If <html> has a CSS width greater than the viewport, then this will be 19146 // incorrect for RTL. 19147 // Popper 1 is broken in this case and never had a bug report so let's assume 19148 // it's not an issue. I don't think anyone ever specifies width on <html> 19149 // anyway. 19150 // Browsers where the left scrollbar doesn't cause an issue report `0` for 19151 // this (e.g. Edge 2019, IE11, Safari) 19152 return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; 19153} 19154;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js 19155 19156 19157 19158function getViewportRect(element) { 19159 var win = getWindow(element); 19160 var html = getDocumentElement(element); 19161 var visualViewport = win.visualViewport; 19162 var width = html.clientWidth; 19163 var height = html.clientHeight; 19164 var x = 0; 19165 var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper 19166 // can be obscured underneath it. 19167 // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even 19168 // if it isn't open, so if this isn't available, the popper will be detected 19169 // to overflow the bottom of the screen too early. 19170 19171 if (visualViewport) { 19172 width = visualViewport.width;
vendor: 9,843 bytes, lines 19173-19464
19173 height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently) 19174 // In Chrome, it returns a value very close to 0 (+/-) but contains rounding 19175 // errors due to floating point numbers, so we need to check precision. 19176 // Safari returns a number <= 0, usually < -1 when pinch-zoomed 19177 // Feature detection fails in mobile emulation mode in Chrome. 19178 // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) < 19179 // 0.001 19180 // Fallback here: "Not Safari" userAgent 19181 19182 if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { 19183 x = visualViewport.offsetLeft; 19184 y = visualViewport.offsetTop; 19185 } 19186 } 19187 19188 return { 19189 width: width, 19190 height: height, 19191 x: x + getWindowScrollBarX(element), 19192 y: y 19193 }; 19194} 19195;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js 19196 19197 19198 19199 19200 // Gets the entire size of the scrollable document area, even extending outside 19201// of the `<html>` and `<body>` rect bounds if horizontally scrollable 19202 19203function getDocumentRect(element) { 19204 var _element$ownerDocumen; 19205 19206 var html = getDocumentElement(element); 19207 var winScroll = getWindowScroll(element); 19208 var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body; 19209 var width = math_max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); 19210 var height = math_max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); 19211 var x = -winScroll.scrollLeft + getWindowScrollBarX(element); 19212 var y = -winScroll.scrollTop; 19213 19214 if (getComputedStyle_getComputedStyle(body || html).direction === 'rtl') { 19215 x += math_max(html.clientWidth, body ? body.clientWidth : 0) - width; 19216 } 19217 19218 return { 19219 width: width, 19220 height: height, 19221 x: x, 19222 y: y 19223 }; 19224} 19225;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js 19226 19227function isScrollParent(element) { 19228 // Firefox wants us to check `-x` and `-y` variations as well 19229 var _getComputedStyle = getComputedStyle_getComputedStyle(element), 19230 overflow = _getComputedStyle.overflow, 19231 overflowX = _getComputedStyle.overflowX, 19232 overflowY = _getComputedStyle.overflowY; 19233 19234 return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); 19235} 19236;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js 19237 19238 19239 19240 19241function getScrollParent(node) { 19242 if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { 19243 // $FlowFixMe[incompatible-return]: assume body is always available 19244 return node.ownerDocument.body; 19245 } 19246 19247 if (isHTMLElement(node) && isScrollParent(node)) { 19248 return node; 19249 } 19250 19251 return getScrollParent(getParentNode(node)); 19252} 19253;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js 19254 19255 19256 19257 19258/* 19259given a DOM element, return the list of all scroll parents, up the list of ancesors 19260until we get to the top window object. This list is what we attach scroll listeners 19261to, because if any of these parent elements scroll, we'll need to re-calculate the 19262reference element's position. 19263*/ 19264 19265function listScrollParents(element, list) { 19266 var _element$ownerDocumen; 19267 19268 if (list === void 0) { 19269 list = []; 19270 } 19271 19272 var scrollParent = getScrollParent(element); 19273 var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body); 19274 var win = getWindow(scrollParent); 19275 var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; 19276 var updatedList = list.concat(target); 19277 return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here 19278 updatedList.concat(listScrollParents(getParentNode(target))); 19279} 19280;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/rectToClientRect.js 19281function rectToClientRect(rect) { 19282 return Object.assign({}, rect, { 19283 left: rect.x, 19284 top: rect.y, 19285 right: rect.x + rect.width, 19286 bottom: rect.y + rect.height 19287 }); 19288} 19289;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js 19290 19291 19292 19293 19294 19295 19296 19297 19298 19299 19300 19301 19302 19303 19304 19305function getInnerBoundingClientRect(element) { 19306 var rect = getBoundingClientRect(element); 19307 rect.top = rect.top + element.clientTop; 19308 rect.left = rect.left + element.clientLeft; 19309 rect.bottom = rect.top + element.clientHeight; 19310 rect.right = rect.left + element.clientWidth; 19311 rect.width = element.clientWidth; 19312 rect.height = element.clientHeight; 19313 rect.x = rect.left; 19314 rect.y = rect.top; 19315 return rect; 19316} 19317 19318function getClientRectFromMixedType(element, clippingParent) { 19319 return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : instanceOf_isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); 19320} // A "clipping parent" is an overflowable container with the characteristic of 19321// clipping (or hiding) overflowing elements with a position different from 19322// `initial` 19323 19324 19325function getClippingParents(element) { 19326 var clippingParents = listScrollParents(getParentNode(element)); 19327 var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle_getComputedStyle(element).position) >= 0; 19328 var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; 19329 19330 if (!instanceOf_isElement(clipperElement)) { 19331 return []; 19332 } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 19333 19334 19335 return clippingParents.filter(function (clippingParent) { 19336 return instanceOf_isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; 19337 }); 19338} // Gets the maximum area that the element is visible in due to any number of 19339// clipping parents 19340 19341 19342function getClippingRect(element, boundary, rootBoundary) { 19343 var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); 19344 var clippingParents = [].concat(mainClippingParents, [rootBoundary]); 19345 var firstClippingParent = clippingParents[0]; 19346 var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { 19347 var rect = getClientRectFromMixedType(element, clippingParent); 19348 accRect.top = math_max(rect.top, accRect.top); 19349 accRect.right = math_min(rect.right, accRect.right); 19350 accRect.bottom = math_min(rect.bottom, accRect.bottom); 19351 accRect.left = math_max(rect.left, accRect.left); 19352 return accRect; 19353 }, getClientRectFromMixedType(element, firstClippingParent)); 19354 clippingRect.width = clippingRect.right - clippingRect.left; 19355 clippingRect.height = clippingRect.bottom - clippingRect.top; 19356 clippingRect.x = clippingRect.left; 19357 clippingRect.y = clippingRect.top; 19358 return clippingRect; 19359} 19360;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/computeOffsets.js 19361 19362 19363 19364 19365function computeOffsets(_ref) { 19366 var reference = _ref.reference, 19367 element = _ref.element, 19368 placement = _ref.placement; 19369 var basePlacement = placement ? getBasePlacement(placement) : null; 19370 var variation = placement ? getVariation(placement) : null; 19371 var commonX = reference.x + reference.width / 2 - element.width / 2; 19372 var commonY = reference.y + reference.height / 2 - element.height / 2; 19373 var offsets; 19374 19375 switch (basePlacement) { 19376 case enums_top: 19377 offsets = { 19378 x: commonX, 19379 y: reference.y - element.height 19380 }; 19381 break; 19382 19383 case bottom: 19384 offsets = { 19385 x: commonX, 19386 y: reference.y + reference.height 19387 }; 19388 break; 19389 19390 case right: 19391 offsets = { 19392 x: reference.x + reference.width, 19393 y: commonY 19394 }; 19395 break; 19396 19397 case left: 19398 offsets = { 19399 x: reference.x - element.width, 19400 y: commonY 19401 }; 19402 break; 19403 19404 default: 19405 offsets = { 19406 x: reference.x, 19407 y: reference.y 19408 }; 19409 } 19410 19411 var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; 19412 19413 if (mainAxis != null) { 19414 var len = mainAxis === 'y' ? 'height' : 'width'; 19415 19416 switch (variation) { 19417 case start: 19418 offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); 19419 break; 19420 19421 case end: 19422 offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); 19423 break; 19424 19425 default: 19426 } 19427 } 19428 19429 return offsets; 19430} 19431;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/detectOverflow.js 19432 19433 19434 19435 19436 19437 19438 19439 19440 // eslint-disable-next-line import/no-unused-modules 19441 19442function detectOverflow(state, options) { 19443 if (options === void 0) { 19444 options = {}; 19445 } 19446 19447 var _options = options, 19448 _options$placement = _options.placement, 19449 placement = _options$placement === void 0 ? state.placement : _options$placement, 19450 _options$boundary = _options.boundary, 19451 boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, 19452 _options$rootBoundary = _options.rootBoundary, 19453 rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, 19454 _options$elementConte = _options.elementContext, 19455 elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, 19456 _options$altBoundary = _options.altBoundary, 19457 altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, 19458 _options$padding = _options.padding, 19459 padding = _options$padding === void 0 ? 0 : _options$padding; 19460 var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); 19461 var altContext = elementContext === popper ? reference : popper; 19462 var popperRect = state.rects.popper; 19463 var element = state.elements[altBoundary ? altContext : elementContext]; 19464 var clippingClientRect = getClippingRect(instanceOf_
vendor: 5,572 bytes, lines 19464-19607
19464isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); 19465 var referenceClientRect = getBoundingClientRect(state.elements.reference); 19466 var popperOffsets = computeOffsets({ 19467 reference: referenceClientRect, 19468 element: popperRect, 19469 strategy: 'absolute', 19470 placement: placement 19471 }); 19472 var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets)); 19473 var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect 19474 // 0 or negative = within the clipping rect 19475 19476 var overflowOffsets = { 19477 top: clippingClientRect.top - elementClientRect.top + paddingObject.top, 19478 bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, 19479 left: clippingClientRect.left - elementClientRect.left + paddingObject.left, 19480 right: elementClientRect.right - clippingClientRect.right + paddingObject.right 19481 }; 19482 var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element 19483 19484 if (elementContext === popper && offsetData) { 19485 var offset = offsetData[placement]; 19486 Object.keys(overflowOffsets).forEach(function (key) { 19487 var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; 19488 var axis = [enums_top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; 19489 overflowOffsets[key] += offset[axis] * multiply; 19490 }); 19491 } 19492 19493 return overflowOffsets; 19494} 19495;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js 19496 19497 19498 19499 19500function computeAutoPlacement(state, options) { 19501 if (options === void 0) { 19502 options = {}; 19503 } 19504 19505 var _options = options, 19506 placement = _options.placement, 19507 boundary = _options.boundary, 19508 rootBoundary = _options.rootBoundary, 19509 padding = _options.padding, 19510 flipVariations = _options.flipVariations, 19511 _options$allowedAutoP = _options.allowedAutoPlacements, 19512 allowedAutoPlacements = _options$allowedAutoP === void 0 ? enums_placements : _options$allowedAutoP; 19513 var variation = getVariation(placement); 19514 var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { 19515 return getVariation(placement) === variation; 19516 }) : basePlacements; 19517 var allowedPlacements = placements.filter(function (placement) { 19518 return allowedAutoPlacements.indexOf(placement) >= 0; 19519 }); 19520 19521 if (allowedPlacements.length === 0) { 19522 allowedPlacements = placements; 19523 19524 if (false) {} 19525 } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... 19526 19527 19528 var overflows = allowedPlacements.reduce(function (acc, placement) { 19529 acc[placement] = detectOverflow(state, { 19530 placement: placement, 19531 boundary: boundary, 19532 rootBoundary: rootBoundary, 19533 padding: padding 19534 })[getBasePlacement(placement)]; 19535 return acc; 19536 }, {}); 19537 return Object.keys(overflows).sort(function (a, b) { 19538 return overflows[a] - overflows[b]; 19539 }); 19540} 19541;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/flip.js 19542 19543 19544 19545 19546 19547 19548 // eslint-disable-next-line import/no-unused-modules 19549 19550function getExpandedFallbackPlacements(placement) { 19551 if (getBasePlacement(placement) === auto) { 19552 return []; 19553 } 19554 19555 var oppositePlacement = getOppositePlacement(placement); 19556 return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; 19557} 19558 19559function flip(_ref) { 19560 var state = _ref.state, 19561 options = _ref.options, 19562 name = _ref.name; 19563 19564 if (state.modifiersData[name]._skip) { 19565 return; 19566 } 19567 19568 var _options$mainAxis = options.mainAxis, 19569 checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, 19570 _options$altAxis = options.altAxis, 19571 checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, 19572 specifiedFallbackPlacements = options.fallbackPlacements, 19573 padding = options.padding, 19574 boundary = options.boundary, 19575 rootBoundary = options.rootBoundary, 19576 altBoundary = options.altBoundary, 19577 _options$flipVariatio = options.flipVariations, 19578 flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, 19579 allowedAutoPlacements = options.allowedAutoPlacements; 19580 var preferredPlacement = state.options.placement; 19581 var basePlacement = getBasePlacement(preferredPlacement); 19582 var isBasePlacement = basePlacement === preferredPlacement; 19583 var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); 19584 var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { 19585 return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { 19586 placement: placement, 19587 boundary: boundary, 19588 rootBoundary: rootBoundary, 19589 padding: padding, 19590 flipVariations: flipVariations, 19591 allowedAutoPlacements: allowedAutoPlacements 19592 }) : placement); 19593 }, []); 19594 var referenceRect = state.rects.reference; 19595 var popperRect = state.rects.popper; 19596 var checksMap = new Map(); 19597 var makeFallbackChecks = true; 19598 var firstFittingPlacement = placements[0]; 19599 19600 for (var i = 0; i < placements.length; i++) { 19601 var placement = placements[i]; 19602 19603 var _basePlacement = getBasePlacement(placement); 19604 19605 var isStartVariation = getVariation(placement) === start; 19606 var isVertical = [enums_top, bottom].indexOf(_basePlacement) >= 0; 19607 var len = isVertical ? 'width' : 'height';
vendor: 14,091 bytes, lines 19608-20035
19608 var overflow = detectOverflow(state, { 19609 placement: placement, 19610 boundary: boundary, 19611 rootBoundary: rootBoundary, 19612 altBoundary: altBoundary, 19613 padding: padding 19614 }); 19615 var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : enums_top; 19616 19617 if (referenceRect[len] > popperRect[len]) { 19618 mainVariationSide = getOppositePlacement(mainVariationSide); 19619 } 19620 19621 var altVariationSide = getOppositePlacement(mainVariationSide); 19622 var checks = []; 19623 19624 if (checkMainAxis) { 19625 checks.push(overflow[_basePlacement] <= 0); 19626 } 19627 19628 if (checkAltAxis) { 19629 checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); 19630 } 19631 19632 if (checks.every(function (check) { 19633 return check; 19634 })) { 19635 firstFittingPlacement = placement; 19636 makeFallbackChecks = false; 19637 break; 19638 } 19639 19640 checksMap.set(placement, checks); 19641 } 19642 19643 if (makeFallbackChecks) { 19644 // `2` may be desired in some cases â research later 19645 var numberOfChecks = flipVariations ? 3 : 1; 19646 19647 var _loop = function _loop(_i) { 19648 var fittingPlacement = placements.find(function (placement) { 19649 var checks = checksMap.get(placement); 19650 19651 if (checks) { 19652 return checks.slice(0, _i).every(function (check) { 19653 return check; 19654 }); 19655 } 19656 }); 19657 19658 if (fittingPlacement) { 19659 firstFittingPlacement = fittingPlacement; 19660 return "break"; 19661 } 19662 }; 19663 19664 for (var _i = numberOfChecks; _i > 0; _i--) { 19665 var _ret = _loop(_i); 19666 19667 if (_ret === "break") break; 19668 } 19669 } 19670 19671 if (state.placement !== firstFittingPlacement) { 19672 state.modifiersData[name]._skip = true; 19673 state.placement = firstFittingPlacement; 19674 state.reset = true; 19675 } 19676} // eslint-disable-next-line import/no-unused-modules 19677 19678 19679/* harmony default export */ var modifiers_flip = ({ 19680 name: 'flip', 19681 enabled: true, 19682 phase: 'main', 19683 fn: flip, 19684 requiresIfExists: ['offset'], 19685 data: { 19686 _skip: false 19687 } 19688}); 19689;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/hide.js 19690 19691 19692 19693function getSideOffsets(overflow, rect, preventedOffsets) { 19694 if (preventedOffsets === void 0) { 19695 preventedOffsets = { 19696 x: 0, 19697 y: 0 19698 }; 19699 } 19700 19701 return { 19702 top: overflow.top - rect.height - preventedOffsets.y, 19703 right: overflow.right - rect.width + preventedOffsets.x, 19704 bottom: overflow.bottom - rect.height + preventedOffsets.y, 19705 left: overflow.left - rect.width - preventedOffsets.x 19706 }; 19707} 19708 19709function isAnySideFullyClipped(overflow) { 19710 return [enums_top, right, bottom, left].some(function (side) { 19711 return overflow[side] >= 0; 19712 }); 19713} 19714 19715function hide(_ref) { 19716 var state = _ref.state, 19717 name = _ref.name; 19718 var referenceRect = state.rects.reference; 19719 var popperRect = state.rects.popper; 19720 var preventedOffsets = state.modifiersData.preventOverflow; 19721 var referenceOverflow = detectOverflow(state, { 19722 elementContext: 'reference' 19723 }); 19724 var popperAltOverflow = detectOverflow(state, { 19725 altBoundary: true 19726 }); 19727 var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); 19728 var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); 19729 var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); 19730 var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); 19731 state.modifiersData[name] = { 19732 referenceClippingOffsets: referenceClippingOffsets, 19733 popperEscapeOffsets: popperEscapeOffsets, 19734 isReferenceHidden: isReferenceHidden, 19735 hasPopperEscaped: hasPopperEscaped 19736 }; 19737 state.attributes.popper = Object.assign({}, state.attributes.popper, { 19738 'data-popper-reference-hidden': isReferenceHidden, 19739 'data-popper-escaped': hasPopperEscaped 19740 }); 19741} // eslint-disable-next-line import/no-unused-modules 19742 19743 19744/* harmony default export */ var modifiers_hide = ({ 19745 name: 'hide', 19746 enabled: true, 19747 phase: 'main', 19748 requiresIfExists: ['preventOverflow'], 19749 fn: hide 19750}); 19751;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/offset.js 19752 19753 // eslint-disable-next-line import/no-unused-modules 19754 19755function distanceAndSkiddingToXY(placement, rects, offset) { 19756 var basePlacement = getBasePlacement(placement); 19757 var invertDistance = [left, enums_top].indexOf(basePlacement) >= 0 ? -1 : 1; 19758 19759 var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, { 19760 placement: placement 19761 })) : offset, 19762 skidding = _ref[0], 19763 distance = _ref[1]; 19764 19765 skidding = skidding || 0; 19766 distance = (distance || 0) * invertDistance; 19767 return [left, right].indexOf(basePlacement) >= 0 ? { 19768 x: distance, 19769 y: skidding 19770 } : { 19771 x: skidding, 19772 y: distance 19773 }; 19774} 19775 19776function offset(_ref2) { 19777 var state = _ref2.state, 19778 options = _ref2.options, 19779 name = _ref2.name; 19780 var _options$offset = options.offset, 19781 offset = _options$offset === void 0 ? [0, 0] : _options$offset; 19782 var data = enums_placements.reduce(function (acc, placement) { 19783 acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); 19784 return acc; 19785 }, {}); 19786 var _data$state$placement = data[state.placement], 19787 x = _data$state$placement.x, 19788 y = _data$state$placement.y; 19789 19790 if (state.modifiersData.popperOffsets != null) { 19791 state.modifiersData.popperOffsets.x += x; 19792 state.modifiersData.popperOffsets.y += y; 19793 } 19794 19795 state.modifiersData[name] = data; 19796} // eslint-disable-next-line import/no-unused-modules 19797 19798 19799/* harmony default export */ var modifiers_offset = ({ 19800 name: 'offset', 19801 enabled: true, 19802 phase: 'main', 19803 requires: ['popperOffsets'], 19804 fn: offset 19805}); 19806;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js 19807 19808 19809function popperOffsets(_ref) { 19810 var state = _ref.state, 19811 name = _ref.name; 19812 // Offsets are the actual position the popper needs to have to be 19813 // properly positioned near its reference element 19814 // This is the most basic placement, and will be adjusted by 19815 // the modifiers in the next step 19816 state.modifiersData[name] = computeOffsets({ 19817 reference: state.rects.reference, 19818 element: state.rects.popper, 19819 strategy: 'absolute', 19820 placement: state.placement 19821 }); 19822} // eslint-disable-next-line import/no-unused-modules 19823 19824 19825/* harmony default export */ var modifiers_popperOffsets = ({ 19826 name: 'popperOffsets', 19827 enabled: true, 19828 phase: 'read', 19829 fn: popperOffsets, 19830 data: {} 19831}); 19832;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/getAltAxis.js 19833function getAltAxis(axis) { 19834 return axis === 'x' ? 'y' : 'x'; 19835} 19836;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js 19837 19838 19839 19840 19841 19842 19843 19844 19845 19846 19847 19848 19849function preventOverflow(_ref) { 19850 var state = _ref.state, 19851 options = _ref.options, 19852 name = _ref.name; 19853 var _options$mainAxis = options.mainAxis, 19854 checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, 19855 _options$altAxis = options.altAxis, 19856 checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, 19857 boundary = options.boundary, 19858 rootBoundary = options.rootBoundary, 19859 altBoundary = options.altBoundary, 19860 padding = options.padding, 19861 _options$tether = options.tether, 19862 tether = _options$tether === void 0 ? true : _options$tether, 19863 _options$tetherOffset = options.tetherOffset, 19864 tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; 19865 var overflow = detectOverflow(state, { 19866 boundary: boundary, 19867 rootBoundary: rootBoundary, 19868 padding: padding, 19869 altBoundary: altBoundary 19870 }); 19871 var basePlacement = getBasePlacement(state.placement); 19872 var variation = getVariation(state.placement); 19873 var isBasePlacement = !variation; 19874 var mainAxis = getMainAxisFromPlacement(basePlacement); 19875 var altAxis = getAltAxis(mainAxis); 19876 var popperOffsets = state.modifiersData.popperOffsets; 19877 var referenceRect = state.rects.reference; 19878 var popperRect = state.rects.popper; 19879 var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, { 19880 placement: state.placement 19881 })) : tetherOffset; 19882 var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? { 19883 mainAxis: tetherOffsetValue, 19884 altAxis: tetherOffsetValue 19885 } : Object.assign({ 19886 mainAxis: 0, 19887 altAxis: 0 19888 }, tetherOffsetValue); 19889 var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null; 19890 var data = { 19891 x: 0, 19892 y: 0 19893 }; 19894 19895 if (!popperOffsets) { 19896 return; 19897 } 19898 19899 if (checkMainAxis) { 19900 var _offsetModifierState$; 19901 19902 var mainSide = mainAxis === 'y' ? enums_top : left; 19903 var altSide = mainAxis === 'y' ? bottom : right; 19904 var len = mainAxis === 'y' ? 'height' : 'width'; 19905 var offset = popperOffsets[mainAxis]; 19906 var min = offset + overflow[mainSide]; 19907 var max = offset - overflow[altSide]; 19908 var additive = tether ? -popperRect[len] / 2 : 0; 19909 var minLen = variation === start ? referenceRect[len] : popperRect[len]; 19910 var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go 19911 // outside the reference bounds 19912 19913 var arrowElement = state.elements.arrow; 19914 var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { 19915 width: 0, 19916 height: 0 19917 }; 19918 var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); 19919 var arrowPaddingMin = arrowPaddingObject[mainSide]; 19920 var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want 19921 // to include its full size in the calculation. If the reference is small 19922 // and near the edge of a boundary, the popper can overflow even if the 19923 // reference is not overflowing as well (e.g. virtual elements with no 19924 // width or height) 19925 19926 var arrowLen = within(0, referenceRect[len], arrowRect[len]); 19927 var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis; 19928 var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis; 19929 var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); 19930 var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; 19931 var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0; 19932 var tetherMin = offset + minOffset - offsetModifierValue - clientOffset; 19933 var tetherMax = offset + maxOffset - offsetModifierValue; 19934 var preventedOffset = within(tether ? math_min(min, tetherMin) : min, offset, tether ? math_max(max, tetherMax) : max); 19935 popperOffsets[mainAxis] = preventedOffset; 19936 data[mainAxis] = preventedOffset - offset; 19937 } 19938 19939 if (checkAltAxis) { 19940 var _offsetModifierState$2; 19941 19942 var _mainSide = mainAxis === 'x' ? enums_top : left; 19943 19944 var _altSide = mainAxis === 'x' ? bottom : right; 19945 19946 var _offset = popperOffsets[altAxis]; 19947 19948 var _len = altAxis === 'y' ? 'height' : 'width'; 19949 19950 var _min = _offset + overflow[_mainSide]; 19951 19952 var _max = _offset - overflow[_altSide]; 19953 19954 var isOriginSide = [enums_top, left].indexOf(basePlacement) !== -1; 19955 19956 var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0; 19957 19958 var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis; 19959 19960 var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max; 19961 19962 var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max); 19963 19964 popperOffsets[altAxis] = _preventedOffset; 19965 data[altAxis] = _preventedOffset - _offset; 19966 } 19967 19968 state.modifiersData[name] = data; 19969} // eslint-disable-next-line import/no-unused-modules 19970 19971 19972/* harmony default export */ var modifiers_preventOverflow = ({ 19973 name: 'preventOverflow', 19974 enabled: true, 19975 phase: 'main', 19976 fn: preventOverflow, 19977 requiresIfExists: ['offset'] 19978}); 19979;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/modifiers/index.js 19980 19981 19982 19983 19984 19985 19986 19987 19988 19989;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js 19990function getHTMLElementScroll(element) { 19991 return { 19992 scrollLeft: element.scrollLeft, 19993 scrollTop: element.scrollTop 19994 }; 19995} 19996;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js 19997 19998 19999 20000 20001function getNodeScroll(node) { 20002 if (node === getWindow(node) || !isHTMLElement(node)) { 20003 return getWindowScroll(node); 20004 } else { 20005 return getHTMLElementScroll(node); 20006 } 20007} 20008;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js 20009 20010 20011 20012 20013 20014 20015 20016 20017 20018function isElementScaled(element) { 20019 var rect = element.getBoundingClientRect(); 20020 var scaleX = round(rect.width) / element.offsetWidth || 1; 20021 var scaleY = round(rect.height) / element.offsetHeight || 1; 20022 return scaleX !== 1 || scaleY !== 1; 20023} // Returns the composite rect of an element relative to its offsetParent. 20024// Composite means it takes into account transforms as well as layout. 20025 20026 20027function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { 20028 if (isFixed === void 0) { 20029 isFixed = false; 20030 } 20031 20032 var isOffsetParentAnElement = isHTMLElement(offsetParent); 20033 var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent); 20034 var documentElement = getDocumentElement(offsetParent); 20035 var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled
vendor: 13,030 bytes, lines 20035-20438
20035); 20036 var scroll = { 20037 scrollLeft: 0, 20038 scrollTop: 0 20039 }; 20040 var offsets = { 20041 x: 0, 20042 y: 0 20043 }; 20044 20045 if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { 20046 if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 20047 isScrollParent(documentElement)) { 20048 scroll = getNodeScroll(offsetParent); 20049 } 20050 20051 if (isHTMLElement(offsetParent)) { 20052 offsets = getBoundingClientRect(offsetParent, true); 20053 offsets.x += offsetParent.clientLeft; 20054 offsets.y += offsetParent.clientTop; 20055 } else if (documentElement) { 20056 offsets.x = getWindowScrollBarX(documentElement); 20057 } 20058 } 20059 20060 return { 20061 x: rect.left + scroll.scrollLeft - offsets.x, 20062 y: rect.top + scroll.scrollTop - offsets.y, 20063 width: rect.width, 20064 height: rect.height 20065 }; 20066} 20067;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/orderModifiers.js 20068 // source: https://stackoverflow.com/questions/49875255 20069 20070function order(modifiers) { 20071 var map = new Map(); 20072 var visited = new Set(); 20073 var result = []; 20074 modifiers.forEach(function (modifier) { 20075 map.set(modifier.name, modifier); 20076 }); // On visiting object, check for its dependencies and visit them recursively 20077 20078 function sort(modifier) { 20079 visited.add(modifier.name); 20080 var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); 20081 requires.forEach(function (dep) { 20082 if (!visited.has(dep)) { 20083 var depModifier = map.get(dep); 20084 20085 if (depModifier) { 20086 sort(depModifier); 20087 } 20088 } 20089 }); 20090 result.push(modifier); 20091 } 20092 20093 modifiers.forEach(function (modifier) { 20094 if (!visited.has(modifier.name)) { 20095 // check for visited object 20096 sort(modifier); 20097 } 20098 }); 20099 return result; 20100} 20101 20102function orderModifiers(modifiers) { 20103 // order based on dependencies 20104 var orderedModifiers = order(modifiers); // order based on phase 20105 20106 return modifierPhases.reduce(function (acc, phase) { 20107 return acc.concat(orderedModifiers.filter(function (modifier) { 20108 return modifier.phase === phase; 20109 })); 20110 }, []); 20111} 20112;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/debounce.js 20113function debounce(fn) { 20114 var pending; 20115 return function () { 20116 if (!pending) { 20117 pending = new Promise(function (resolve) { 20118 Promise.resolve().then(function () { 20119 pending = undefined; 20120 resolve(fn()); 20121 }); 20122 }); 20123 } 20124 20125 return pending; 20126 }; 20127} 20128;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/utils/mergeByName.js 20129function mergeByName(modifiers) { 20130 var merged = modifiers.reduce(function (merged, current) { 20131 var existing = merged[current.name]; 20132 merged[current.name] = existing ? Object.assign({}, existing, current, { 20133 options: Object.assign({}, existing.options, current.options), 20134 data: Object.assign({}, existing.data, current.data) 20135 }) : current; 20136 return merged; 20137 }, {}); // IE11 does not support Object.values 20138 20139 return Object.keys(merged).map(function (key) { 20140 return merged[key]; 20141 }); 20142} 20143;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/createPopper.js 20144 20145 20146 20147 20148 20149 20150 20151 20152 20153 20154 20155 20156 20157 20158var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.'; 20159var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.'; 20160var DEFAULT_OPTIONS = { 20161 placement: 'bottom', 20162 modifiers: [], 20163 strategy: 'absolute' 20164}; 20165 20166function areValidElements() { 20167 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 20168 args[_key] = arguments[_key]; 20169 } 20170 20171 return !args.some(function (element) { 20172 return !(element && typeof element.getBoundingClientRect === 'function'); 20173 }); 20174} 20175 20176function popperGenerator(generatorOptions) { 20177 if (generatorOptions === void 0) { 20178 generatorOptions = {}; 20179 } 20180 20181 var _generatorOptions = generatorOptions, 20182 _generatorOptions$def = _generatorOptions.defaultModifiers, 20183 defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, 20184 _generatorOptions$def2 = _generatorOptions.defaultOptions, 20185 defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; 20186 return function createPopper(reference, popper, options) { 20187 if (options === void 0) { 20188 options = defaultOptions; 20189 } 20190 20191 var state = { 20192 placement: 'bottom', 20193 orderedModifiers: [], 20194 options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions), 20195 modifiersData: {}, 20196 elements: { 20197 reference: reference, 20198 popper: popper 20199 }, 20200 attributes: {}, 20201 styles: {} 20202 }; 20203 var effectCleanupFns = []; 20204 var isDestroyed = false; 20205 var instance = { 20206 state: state, 20207 setOptions: function setOptions(setOptionsAction) { 20208 var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction; 20209 cleanupModifierEffects(); 20210 state.options = Object.assign({}, defaultOptions, state.options, options); 20211 state.scrollParents = { 20212 reference: instanceOf_isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], 20213 popper: listScrollParents(popper) 20214 }; // Orders the modifiers based on their dependencies and `phase` 20215 // properties 20216 20217 var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers 20218 20219 state.orderedModifiers = orderedModifiers.filter(function (m) { 20220 return m.enabled; 20221 }); // Validate the provided modifiers so that the consumer will get warned 20222 // if one of the modifiers is invalid for any reason 20223 20224 if (false) { var _getComputedStyle, marginTop, marginRight, marginBottom, marginLeft, flipModifier, modifiers; } 20225 20226 runModifierEffects(); 20227 return instance.update(); 20228 }, 20229 // Sync update â it will always be executed, even if not necessary. This 20230 // is useful for low frequency updates where sync behavior simplifies the 20231 // logic. 20232 // For high frequency updates (e.g. `resize` and `scroll` events), always 20233 // prefer the async Popper#update method 20234 forceUpdate: function forceUpdate() { 20235 if (isDestroyed) { 20236 return; 20237 } 20238 20239 var _state$elements = state.elements, 20240 reference = _state$elements.reference, 20241 popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements 20242 // anymore 20243 20244 if (!areValidElements(reference, popper)) { 20245 if (false) {} 20246 20247 return; 20248 } // Store the reference and popper rects to be read by modifiers 20249 20250 20251 state.rects = { 20252 reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), 20253 popper: getLayoutRect(popper) 20254 }; // Modifiers have the ability to reset the current update cycle. The 20255 // most common use case for this is the `flip` modifier changing the 20256 // placement, which then needs to re-run all the modifiers, because the 20257 // logic was previously ran for the previous placement and is therefore 20258 // stale/incorrect 20259 20260 state.reset = false; 20261 state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier 20262 // is filled with the initial data specified by the modifier. This means 20263 // it doesn't persist and is fresh on each update. 20264 // To ensure persistent data, use `${name}#persistent` 20265 20266 state.orderedModifiers.forEach(function (modifier) { 20267 return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); 20268 }); 20269 var __debug_loops__ = 0; 20270 20271 for (var index = 0; index < state.orderedModifiers.length; index++) { 20272 if (false) {} 20273 20274 if (state.reset === true) { 20275 state.reset = false; 20276 index = -1; 20277 continue; 20278 } 20279 20280 var _state$orderedModifie = state.orderedModifiers[index], 20281 fn = _state$orderedModifie.fn, 20282 _state$orderedModifie2 = _state$orderedModifie.options, 20283 _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, 20284 name = _state$orderedModifie.name; 20285 20286 if (typeof fn === 'function') { 20287 state = fn({ 20288 state: state, 20289 options: _options, 20290 name: name, 20291 instance: instance 20292 }) || state; 20293 } 20294 } 20295 }, 20296 // Async and optimistically optimized update â it will not be executed if 20297 // not necessary (debounced to run at most once-per-tick) 20298 update: debounce(function () { 20299 return new Promise(function (resolve) { 20300 instance.forceUpdate(); 20301 resolve(state); 20302 }); 20303 }), 20304 destroy: function destroy() { 20305 cleanupModifierEffects(); 20306 isDestroyed = true; 20307 } 20308 }; 20309 20310 if (!areValidElements(reference, popper)) { 20311 if (false) {} 20312 20313 return instance; 20314 } 20315 20316 instance.setOptions(options).then(function (state) { 20317 if (!isDestroyed && options.onFirstUpdate) { 20318 options.onFirstUpdate(state); 20319 } 20320 }); // Modifiers have the ability to execute arbitrary code before the first 20321 // update cycle runs. They will be executed in the same order as the update 20322 // cycle. This is useful when a modifier adds some persistent data that 20323 // other modifiers need to use, but the modifier is run after the dependent 20324 // one. 20325 20326 function runModifierEffects() { 20327 state.orderedModifiers.forEach(function (_ref3) { 20328 var name = _ref3.name, 20329 _ref3$options = _ref3.options, 20330 options = _ref3$options === void 0 ? {} : _ref3$options, 20331 effect = _ref3.effect; 20332 20333 if (typeof effect === 'function') { 20334 var cleanupFn = effect({ 20335 state: state, 20336 name: name, 20337 instance: instance, 20338 options: options 20339 }); 20340 20341 var noopFn = function noopFn() {}; 20342 20343 effectCleanupFns.push(cleanupFn || noopFn); 20344 } 20345 }); 20346 } 20347 20348 function cleanupModifierEffects() { 20349 effectCleanupFns.forEach(function (fn) { 20350 return fn(); 20351 }); 20352 effectCleanupFns = []; 20353 } 20354 20355 return instance; 20356 }; 20357} 20358var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules 20359 20360 20361;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/popper.js 20362 20363 20364 20365 20366 20367 20368 20369 20370 20371 20372var defaultModifiers = [eventListeners, modifiers_popperOffsets, modifiers_computeStyles, modifiers_applyStyles, modifiers_offset, modifiers_flip, modifiers_preventOverflow, modifiers_arrow, modifiers_hide]; 20373var popper_createPopper = /*#__PURE__*/popperGenerator({ 20374 defaultModifiers: defaultModifiers 20375}); // eslint-disable-next-line import/no-unused-modules 20376 20377 // eslint-disable-next-line import/no-unused-modules 20378 20379 // eslint-disable-next-line import/no-unused-modules 20380 20381 20382;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/popper-lite.js 20383 20384 20385 20386 20387 20388var popper_lite_defaultModifiers = [eventListeners, modifiers_popperOffsets, modifiers_computeStyles, modifiers_applyStyles]; 20389var popper_lite_createPopper = /*#__PURE__*/popperGenerator({ 20390 defaultModifiers: popper_lite_defaultModifiers 20391}); // eslint-disable-next-line import/no-unused-modules 20392 20393 20394;// CONCATENATED MODULE: ./node_modules/@popperjs/core/lib/index.js 20395 20396 // eslint-disable-next-line import/no-unused-modules 20397 20398 // eslint-disable-next-line import/no-unused-modules 20399 20400 // eslint-disable-next-line import/no-unused-modules 20401 20402 20403;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/sanitizer.js 20404/** 20405 * -------------------------------------------------------------------------- 20406 * Bootstrap (v5.1.3): util/sanitizer.js 20407 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 20408 * -------------------------------------------------------------------------- 20409 */ 20410 20411const uriAttributes = new Set([ 20412 'background', 20413 'cite', 20414 'href', 20415 'itemtype', 20416 'longdesc', 20417 'poster', 20418 'src', 20419 'xlink:href' 20420]) 20421 20422const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i 20423 20424/** 20425 * A pattern that recognizes a commonly useful subset of URLs that are safe. 20426 * 20427 * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts 20428 */ 20429const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i 20430 20431/** 20432 * A pattern that matches safe data URLs. Only matches image, video and audio types. 20433 * 20434 * Shoutout to Angular https://github.com/angular/angular/blob/12.2.x/packages/core/src/sanitization/url_sanitizer.ts 20435 */ 20436const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i 20437 20438const allowedAttribute = (attribute, allowedAttributeList) => {
20439 const attributeName = attribute.nodeName.toLowerCase() 20440 20441 if (allowedAttributeList.includes(attributeName)) { 20442 if (uriAttributes.has(attributeName)) { 20443 return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue)) 20444 } 20445 20446 return true 20447 } 20448 20449 const regExp = allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp) 20450 20451 // Check if a regular expression validates the attribute. 20452 for (let i = 0, len = regExp.length; i < len; i++) { 20453 if (regExp[i].test(attributeName)) { 20454 return true 20455 } 20456 } 20457 20458 return false 20459} 20460 20461const DefaultAllowlist = { 20462 // Global attributes allowed on any supplied element below. 20463 '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], 20464 a: ['target', 'href', 'title', 'rel'], 20465 area: [], 20466 b: [], 20467 br: [], 20468 col: [], 20469 code: [], 20470 div: [], 20471 em: [], 20472 hr: [], 20473 h1: [], 20474 h2: [], 20475 h3: [], 20476 h4: [], 20477 h5: [], 20478 h6: [], 20479 i: [], 20480 img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], 20481 li: [], 20482 ol: [], 20483 p: [], 20484 pre: [], 20485 s: [], 20486 small: [], 20487 span: [], 20488 sub: [], 20489 sup: [], 20490 strong: [], 20491 u: [], 20492 ul: [] 20493} 20494 20495function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) { 20496 if (!unsafeHtml.length) { 20497 return unsafeHtml 20498 } 20499 20500 if (sanitizeFn && typeof sanitizeFn === 'function') { 20501 return sanitizeFn(unsafeHtml) 20502 } 20503 20504 const domParser = new window.DOMParser() 20505 const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html') 20506 const elements = [].concat(...createdDocument.body.querySelectorAll('*')) 20507 20508 for (let i = 0, len = elements.length; i < len; i++) { 20509 const element = elements[i] 20510 const elementName = element.nodeName.toLowerCase() 20511 20512 if (!Object.keys(allowList).includes(elementName)) { 20513 element.remove() 20514 20515 continue 20516 } 20517 20518 const attributeList = [].concat(...element.attributes) 20519 const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || []) 20520 20521 attributeList.forEach(attribute => { 20522 if (!allowedAttribute(attribute, allowedAttributes)) { 20523 element.removeAttribute(attribute.nodeName) 20524 } 20525 }) 20526 } 20527 20528 return createdDocument.body.innerHTML 20529} 20530 20531;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/tooltip.js 20532/** 20533 * -------------------------------------------------------------------------- 20534 * Bootstrap (v5.1.3): tooltip.js 20535 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 20536 * -------------------------------------------------------------------------- 20537 */ 20538 20539 20540 20541 20542 20543 20544 20545 20546 20547 20548 20549/** 20550 * ------------------------------------------------------------------------ 20551 * Constants 20552 * ------------------------------------------------------------------------ 20553 */ 20554 20555const tooltip_NAME = 'tooltip' 20556const tooltip_DATA_KEY = 'bs.tooltip' 20557const tooltip_EVENT_KEY = `.${tooltip_DATA_KEY}` 20558const CLASS_PREFIX = 'bs-tooltip' 20559const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']) 20560 20561const tooltip_DefaultType = { 20562 animation: 'boolean', 20563 template: 'string', 20564 title: '(string|element|function)', 20565 trigger: 'string', 20566 delay: '(number|object)', 20567 html: 'boolean', 20568 selector: '(string|boolean)', 20569 placement: '(string|function)', 20570 offset: '(array|string|function)', 20571 container: '(string|element|boolean)', 20572 fallbackPlacements: 'array', 20573 boundary: '(string|element)', 20574 customClass: '(string|function)', 20575 sanitize: 'boolean', 20576 sanitizeFn: '(null|function)', 20577 allowList: 'object', 20578 popperConfig: '(null|object|function)' 20579} 20580 20581const AttachmentMap = { 20582 AUTO: 'auto', 20583 TOP: 'top', 20584 RIGHT: isRTL() ? 'left' : 'right', 20585 BOTTOM: 'bottom', 20586 LEFT: isRTL() ? 'right' : 'left' 20587} 20588 20589const tooltip_Default = { 20590 animation: true, 20591 template: '<div class="tooltip" role="tooltip">' + 20592 '<div class="tooltip-arrow"></div>' + 20593 '<div class="tooltip-inner"></div>' + 20594 '</div>', 20595 trigger: 'hover focus', 20596 title: '', 20597 delay: 0, 20598 html: false, 20599 selector: false, 20600 placement: 'top', 20601 offset: [0, 0], 20602 container: false, 20603 fallbackPlacements: ['top', 'right', 'bottom', 'left'], 20604 boundary: 'clippingParents', 20605 customClass: '', 20606 sanitize: true, 20607 sanitizeFn: null, 20608 allowList: DefaultAllowlist, 20609 popperConfig: null 20610} 20611 20612const tooltip_Event = { 20613 HIDE: `hide${tooltip_EVENT_KEY}`, 20614 HIDDEN: `hidden${tooltip_EVENT_KEY}`, 20615 SHOW: `show${tooltip_EVENT_KEY}`, 20616 SHOWN: `shown${tooltip_EVENT_KEY}`, 20617 INSERTED: `inserted${tooltip_EVENT_KEY}`, 20618 CLICK: `click${tooltip_EVENT_KEY}`, 20619 FOCUSIN: `focusin${tooltip_EVENT_KEY}`, 20620 FOCUSOUT: `focusout${tooltip_EVENT_KEY}`, 20621 MOUSEENTER: `mouseenter${tooltip_EVENT_KEY}`, 20622 MOUSELEAVE: `mouseleave${tooltip_EVENT_KEY}` 20623} 20624 20625const CLASS_NAME_FADE = 'fade' 20626const CLASS_NAME_MODAL = 'modal' 20627const tooltip_CLASS_NAME_SHOW = 'show' 20628 20629const HOVER_STATE_SHOW = 'show' 20630const HOVER_STATE_OUT = 'out' 20631 20632const SELECTOR_TOOLTIP_INNER = '.tooltip-inner' 20633const SELECTOR_MODAL = `.${CLASS_NAME_MODAL}` 20634 20635const EVENT_MODAL_HIDE = 'hide.bs.modal' 20636 20637const TRIGGER_HOVER = 'hover' 20638const TRIGGER_FOCUS = 'focus' 20639const TRIGGER_CLICK = 'click' 20640const TRIGGER_MANUAL = 'manual' 20641 20642/** 20643 * ------------------------------------------------------------------------ 20644 * Class Definition 20645 * ------------------------------------------------------------------------ 20646 */ 20647 20648class Tooltip extends base_component { 20649 constructor(element, config) { 20650 if (typeof lib_namespaceObject === 'undefined') { 20651 throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)') 20652 } 20653 20654 super(element) 20655 20656 // private 20657 this._isEnabled = true 20658 this._timeout = 0 20659 this._hoverState = '' 20660 this._activeTrigger = {} 20661 this._popper = null 20662 20663 // Protected 20664 this._config = this._getConfig(config) 20665 this.tip = null 20666 20667 this._setListeners() 20668 } 20669 20670 // Getters 20671 20672 static get Default() { 20673 return tooltip_Default 20674 } 20675 20676 static get NAME() { 20677 return tooltip_NAME 20678 } 20679 20680 static get Event() { 20681 return tooltip_Event 20682 } 20683 20684 static get DefaultType() { 20685 return tooltip_DefaultType 20686 } 20687 20688 // Public 20689 20690 enable() { 20691 this._isEnabled = true 20692 } 20693 20694 disable() { 20695 this._isEnabled = false 20696 } 20697 20698 toggleEnabled() { 20699 this._isEnabled = !this._isEnabled 20700 } 20701 20702 toggle(event) { 20703 if (!this._isEnabled) { 20704 return 20705 } 20706 20707 if (event) { 20708 const context = this._initializeOnDelegatedTarget(event) 20709 20710 context._activeTrigger.click = !context._activeTrigger.click 20711 20712 if (context._isWithActiveTrigger()) { 20713 context._enter(null, context) 20714 } else { 20715 context._leave(null, context) 20716 } 20717 } else { 20718 if (this.getTipElement().classList.contains(tooltip_CLASS_NAME_SHOW)) { 20719 this._leave(null, this) 20720 return 20721 } 20722 20723 this._enter(null, this) 20724 } 20725 } 20726 20727 dispose() { 20728 clearTimeout(this._timeout) 20729 20730 event_handler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler) 20731 20732 if (this.tip) { 20733 this.tip.remove() 20734 } 20735 20736 this._disposePopper() 20737 super.dispose() 20738 } 20739 20740 show() { 20741 if (this._element.style.display === 'none') { 20742 throw new Error('Please use show on visible elements') 20743 } 20744 20745 if (!(this.isWithContent() && this._isEnabled)) { 20746 return 20747 } 20748 20749 const showEvent = event_handler.trigger(this._element, this.constructor.Event.SHOW) 20750 const shadowRoot = findShadowRoot(this._element) 20751 const isInTheDom = shadowRoot === null ? 20752 this._element.ownerDocument.documentElement.contains(this._element) : 20753 shadowRoot.contains(this._element) 20754 20755 if (showEvent.defaultPrevented || !isInTheDom) { 20756 return 20757 } 20758 20759 // A trick to recreate a tooltip in case a new title is given by using the NOT documented `data-bs-original-title` 20760 // This will be removed later in favor of a `setContent` method
20761 if (this.constructor.NAME === 'tooltip' && this.tip && this.getTitle() !== this.tip.querySelector(SELECTOR_TOOLTIP_INNER).innerHTML) { 20762 this._disposePopper() 20763 this.tip.remove() 20764 this.tip = null 20765 } 20766 20767 const tip = this.getTipElement() 20768 const tipId = getUID(this.constructor.NAME) 20769 20770 tip.setAttribute('id', tipId) 20771 this._element.setAttribute('aria-describedby', tipId) 20772 20773 if (this._config.animation) { 20774 tip.classList.add(CLASS_NAME_FADE) 20775 } 20776 20777 const placement = typeof this._config.placement === 'function' ? 20778 this._config.placement.call(this, tip, this._element) : 20779 this._config.placement 20780 20781 const attachment = this._getAttachment(placement) 20782 this._addAttachmentClass(attachment) 20783 20784 const { container } = this._config 20785 data.set(tip, this.constructor.DATA_KEY, this) 20786 20787 if (!this._element.ownerDocument.documentElement.contains(this.tip)) { 20788 container.append(tip) 20789 event_handler.trigger(this._element, this.constructor.Event.INSERTED) 20790 } 20791 20792 if (this._popper) { 20793 this._popper.update() 20794 } else { 20795 this._popper = popper_createPopper(this._element, tip, this._getPopperConfig(attachment)) 20796 } 20797 20798 tip.classList.add(tooltip_CLASS_NAME_SHOW) 20799 20800 const customClass = this._resolvePossibleFunction(this._config.customClass) 20801 if (customClass) { 20802 tip.classList.add(...customClass.split(' ')) 20803 } 20804 20805 // If this is a touch-enabled device we add extra 20806 // empty mouseover listeners to the body's immediate children; 20807 // only needed because of broken event delegation on iOS 20808 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 20809 if ('ontouchstart' in document.documentElement) { 20810 [].concat(...document.body.children).forEach(element => { 20811 event_handler.on(element, 'mouseover', noop) 20812 }) 20813 } 20814 20815 const complete = () => { 20816 const prevHoverState = this._hoverState 20817 20818 this._hoverState = null 20819 event_handler.trigger(this._element, this.constructor.Event.SHOWN) 20820 20821 if (prevHoverState === HOVER_STATE_OUT) { 20822 this._leave(null, this) 20823 } 20824 } 20825 20826 const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE) 20827 this._queueCallback(complete, this.tip, isAnimated) 20828 } 20829 20830 hide() { 20831 if (!this._popper) { 20832 return 20833 } 20834 20835 const tip = this.getTipElement() 20836 const complete = () => { 20837 if (this._isWithActiveTrigger()) { 20838 return 20839 } 20840 20841 if (this._hoverState !== HOVER_STATE_SHOW) { 20842 tip.remove() 20843 } 20844 20845 this._cleanTipClass() 20846 this._element.removeAttribute('aria-describedby') 20847 event_handler.trigger(this._element, this.constructor.Event.HIDDEN) 20848 20849 this._disposePopper() 20850 } 20851 20852 const hideEvent = event_handler.trigger(this._element, this.constructor.Event.HIDE) 20853 if (hideEvent.defaultPrevented) { 20854 return 20855 } 20856 20857 tip.classList.remove(tooltip_CLASS_NAME_SHOW) 20858 20859 // If this is a touch-enabled device we remove the extra 20860 // empty mouseover listeners we added for iOS support 20861 if ('ontouchstart' in document.documentElement) { 20862 [].concat(...document.body.children) 20863 .forEach(element => event_handler.off(element, 'mouseover', noop)) 20864 } 20865 20866 this._activeTrigger[TRIGGER_CLICK] = false 20867 this._activeTrigger[TRIGGER_FOCUS] = false 20868 this._activeTrigger[TRIGGER_HOVER] = false 20869 20870 const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE) 20871 this._queueCallback(complete, this.tip, isAnimated) 20872 this._hoverState = '' 20873 } 20874 20875 update() { 20876 if (this._popper !== null) { 20877 this._popper.update() 20878 } 20879 } 20880 20881 // Protected 20882 20883 isWithContent() { 20884 return Boolean(this.getTitle()) 20885 } 20886 20887 getTipElement() { 20888 if (this.tip) { 20889 return this.tip 20890 } 20891 20892 const element = document.createElement('div') 20893 element.innerHTML = this._config.template 20894 20895 const tip = element.children[0] 20896 this.setContent(tip) 20897 tip.classList.remove(CLASS_NAME_FADE, tooltip_CLASS_NAME_SHOW) 20898 20899 this.tip = tip 20900 return this.tip 20901 } 20902 20903 setContent(tip) { 20904 this._sanitizeAndSetContent(tip, this.getTitle(), SELECTOR_TOOLTIP_INNER) 20905 } 20906 20907 _sanitizeAndSetContent(template, content, selector) { 20908 const templateElement = selector_engine.findOne(selector, template) 20909 20910 if (!content && templateElement) { 20911 templateElement.remove() 20912 return 20913 } 20914 20915 // we use append for html objects to maintain js events 20916 this.setElementContent(templateElement, content) 20917 } 20918 20919 setElementContent(element, content) { 20920 if (element === null) { 20921 return 20922 } 20923 20924 if (isElement(content)) { 20925 content = getElement(content) 20926 20927 // content is a DOM node or a jQuery 20928 if (this._config.html) { 20929 if (content.parentNode !== element) { 20930 element.innerHTML = '' 20931 element.append(content) 20932 } 20933 } else { 20934 element.textContent = content.textContent 20935 } 20936 20937 return 20938 } 20939 20940 if (this._config.html) { 20941 if (this._config.sanitize) { 20942 content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn) 20943 } 20944 20945 element.innerHTML = content 20946 } else { 20947 element.textContent = content 20948 } 20949 } 20950 20951 getTitle() { 20952 const title = this._element.getAttribute('data-bs-original-title') || this._config.title 20953 20954 return this._resolvePossibleFunction(title) 20955 } 20956 20957 updateAttachment(attachment) { 20958 if (attachment === 'right') { 20959 return 'end'
20960 } 20961 20962 if (attachment === 'left') { 20963 return 'start' 20964 } 20965 20966 return attachment 20967 } 20968 20969 // Private 20970 20971 _initializeOnDelegatedTarget(event, context) { 20972 return context || this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig()) 20973 } 20974 20975 _getOffset() { 20976 const { offset } = this._config 20977 20978 if (typeof offset === 'string') { 20979 return offset.split(',').map(val => Number.parseInt(val, 10)) 20980 } 20981 20982 if (typeof offset === 'function') { 20983 return popperData => offset(popperData, this._element) 20984 } 20985 20986 return offset 20987 } 20988 20989 _resolvePossibleFunction(content) { 20990 return typeof content === 'function' ? content.call(this._element) : content 20991 } 20992 20993 _getPopperConfig(attachment) { 20994 const defaultBsPopperConfig = { 20995 placement: attachment, 20996 modifiers: [ 20997 { 20998 name: 'flip', 20999 options: { 21000 fallbackPlacements: this._config.fallbackPlacements 21001 } 21002 }, 21003 { 21004 name: 'offset', 21005 options: { 21006 offset: this._getOffset() 21007 } 21008 }, 21009 { 21010 name: 'preventOverflow', 21011 options: { 21012 boundary: this._config.boundary 21013 } 21014 }, 21015 { 21016 name: 'arrow', 21017 options: { 21018 element: `.${this.constructor.NAME}-arrow` 21019 } 21020 }, 21021 { 21022 name: 'onChange', 21023 enabled: true, 21024 phase: 'afterWrite', 21025 fn: data => this._handlePopperPlacementChange(data) 21026 } 21027 ], 21028 onFirstUpdate: data => { 21029 if (data.options.placement !== data.placement) { 21030 this._handlePopperPlacementChange(data) 21031 } 21032 } 21033 } 21034 21035 return { 21036 ...defaultBsPopperConfig, 21037 ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) 21038 } 21039 } 21040 21041 _addAttachmentClass(attachment) { 21042 this.getTipElement().classList.add(`${this._getBasicClassPrefix()}-${this.updateAttachment(attachment)}`) 21043 } 21044 21045 _getAttachment(placement) { 21046 return AttachmentMap[placement.toUpperCase()] 21047 } 21048 21049 _setListeners() { 21050 const triggers = this._config.trigger.split(' ') 21051 21052 triggers.forEach(trigger => { 21053 if (trigger === 'click') { 21054 event_handler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event)) 21055 } else if (trigger !== TRIGGER_MANUAL) { 21056 const eventIn = trigger === TRIGGER_HOVER ? 21057 this.constructor.Event.MOUSEENTER : 21058 this.constructor.Event.FOCUSIN 21059 const eventOut = trigger === TRIGGER_HOVER ? 21060 this.constructor.Event.MOUSELEAVE : 21061 this.constructor.Event.FOCUSOUT 21062 21063 event_handler.on(this._element, eventIn, this._config.selector, event => this._enter(event)) 21064 event_handler.on(this._element, eventOut, this._config.selector, event => this._leave(event)) 21065 } 21066 }) 21067 21068 this._hideModalHandler = () => { 21069 if (this._element) { 21070 this.hide() 21071 } 21072 } 21073 21074 event_handler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler) 21075 21076 if (this._config.selector) { 21077 this._config = { 21078 ...this._config, 21079 trigger: 'manual', 21080 selector: '' 21081 } 21082 } else { 21083 this._fixTitle() 21084 } 21085 } 21086 21087 _fixTitle() { 21088 const title = this._element.getAttribute('title') 21089 const originalTitleType = typeof this._element.getAttribute('data-bs-original-title') 21090 21091 if (title || originalTitleType !== 'string') { 21092 this._element.setAttribute('data-bs-original-title', title || '') 21093 if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) { 21094 this._element.setAttribute('aria-label', title) 21095 } 21096 21097 this._element.setAttribute('title', '') 21098 } 21099 } 21100 21101 _enter(event, context) { 21102 context = this._initializeOnDelegatedTarget(event, context) 21103 21104 if (event) { 21105 context._activeTrigger[ 21106 event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER 21107 ] = true 21108 } 21109 21110 if (context.getTipElement().classList.contains(tooltip_CLASS_NAME_SHOW) || context._hoverState === HOVER_STATE_SHOW) { 21111 context._hoverState = HOVER_STATE_SHOW 21112 return 21113 } 21114 21115 clearTimeout(context._timeout) 21116 21117 context._hoverState = HOVER_STATE_SHOW 21118 21119 if (!context._config.delay || !context._config.delay.show) { 21120 context.show() 21121 return 21122 } 21123 21124 context._timeout = setTimeout(() => { 21125 if (context._hoverState === HOVER_STATE_SHOW) { 21126 context.show() 21127 } 21128 }, context._config.delay.show) 21129 } 21130 21131 _leave(event, context) { 21132 context = this._initializeOnDelegatedTarget(event, context) 21133 21134 if (event) { 21135 context._activeTrigger[ 21136 event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER 21137 ] = context._element.contains(event.relatedTarget) 21138 } 21139 21140 if (context._isWithActiveTrigger()) { 21141 return 21142 } 21143 21144 clearTimeout(context._timeout) 21145 21146 context._hoverState = HOVER_STATE_OUT 21147 21148 if (!context._config.delay || !context._config.delay.hide) { 21149 context.hide() 21150 return 21151 } 21152 21153 context._timeout = setTimeout(() => { 21154 if (context._hoverState === HOVER_STATE_OUT) { 21155 context.hide() 21156 } 21157 }, context._config.delay.hide) 21158 } 21159 21160 _isWithActiveTrigger() { 21161 for (const trigger in this._activeTrigger) { 21162 if (this._activeTrigger[trigger]) { 21163 return true 21164 } 21165 } 21166 21167 return false 21168 } 21169 21170 _getConfig(config) { 21171 const dataAttributes = manipulator.getDataAttributes(this._element) 21172
21173 Object.keys(dataAttributes).forEach(dataAttr => { 21174 if (DISALLOWED_ATTRIBUTES.has(dataAttr)) { 21175 delete dataAttributes[dataAttr] 21176 } 21177 }) 21178 21179 config = { 21180 ...this.constructor.Default, 21181 ...dataAttributes, 21182 ...(typeof config === 'object' && config ? config : {}) 21183 } 21184 21185 config.container = config.container === false ? document.body : getElement(config.container) 21186 21187 if (typeof config.delay === 'number') { 21188 config.delay = { 21189 show: config.delay, 21190 hide: config.delay 21191 } 21192 } 21193 21194 if (typeof config.title === 'number') { 21195 config.title = config.title.toString() 21196 } 21197 21198 if (typeof config.content === 'number') { 21199 config.content = config.content.toString() 21200 } 21201 21202 typeCheckConfig(tooltip_NAME, config, this.constructor.DefaultType) 21203 21204 if (config.sanitize) { 21205 config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn) 21206 } 21207 21208 return config 21209 } 21210 21211 _getDelegateConfig() { 21212 const config = {} 21213 21214 for (const key in this._config) { 21215 if (this.constructor.Default[key] !== this._config[key]) { 21216 config[key] = this._config[key] 21217 } 21218 } 21219 21220 // In the future can be replaced with: 21221 // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]]) 21222 // `Object.fromEntries(keysWithDifferentValues)` 21223 return config 21224 } 21225 21226 _cleanTipClass() { 21227 const tip = this.getTipElement() 21228 const basicClassPrefixRegex = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g') 21229 const tabClass = tip.getAttribute('class').match(basicClassPrefixRegex) 21230 if (tabClass !== null && tabClass.length > 0) { 21231 tabClass.map(token => token.trim()) 21232 .forEach(tClass => tip.classList.remove(tClass)) 21233 } 21234 } 21235 21236 _getBasicClassPrefix() { 21237 return CLASS_PREFIX 21238 } 21239 21240 _handlePopperPlacementChange(popperData) { 21241 const { state } = popperData 21242 21243 if (!state) { 21244 return 21245 } 21246 21247 this.tip = state.elements.popper 21248 this._cleanTipClass() 21249 this._addAttachmentClass(this._getAttachment(state.placement)) 21250 } 21251 21252 _disposePopper() { 21253 if (this._popper) { 21254 this._popper.destroy() 21255 this._popper = null 21256 } 21257 } 21258 21259 // Static 21260 21261 static jQueryInterface(config) { 21262 return this.each(function () { 21263 const data = Tooltip.getOrCreateInstance(this, config) 21264 21265 if (typeof config === 'string') { 21266 if (typeof data[config] === 'undefined') { 21267 throw new TypeError(`No method named "${config}"`) 21268 } 21269 21270 data[config]() 21271 } 21272 }) 21273 } 21274} 21275 21276/** 21277 * ------------------------------------------------------------------------ 21278 * jQuery 21279 * ------------------------------------------------------------------------ 21280 * add .Tooltip to jQuery only if jQuery is present 21281 */ 21282 21283defineJQueryPlugin(Tooltip) 21284 21285/* harmony default export */ var src_tooltip = (Tooltip); 21286 21287;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/glossary/glossary.main.js 21288 21289 21290external_$_default().when((external_$_default()).ready).then(function () { 21291 var $assets = external_$_default()('.dpnglossary'); 21292 21293 if (!$assets.length) { 21294 return; 21295 } 21296 21297 console.log('glossary initialised on load'); 21298 var tooltips = document.querySelectorAll('.dpnglossary.link'); 21299 tooltips.forEach(function (tt) { 21300 new src_tooltip(tt); 21301 }); 21302}); 21303;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/headerSearch/headerSearch.main.js 21304//todo: toggle label 21305 21306var $searchToggle = external_$_default()('.headerSearch__toggle'); 21307var $search = external_$_default()('.headerSearch'); 21308function openHeaderSearch() { 21309 var mq = window.matchMedia("(max-width: 48.75em)"); 21310 21311 if (mq.matches) { 21312 external_$_default()('.main-nav-toggle--show').click(); 21313 } 21314 21315 external_$_default()('body').addClass('headerSearch-is-visible'); 21316 external_$_default()('.documentHeader .headerSearch__submit').attr('tabindex', '0'); 21317 $searchToggle.attr('aria-expanded', true); 21318 $search.attr('aria-expanded', true); 21319 $search.find('.headerSearch__q').focus(); 21320} 21321function closeHeaderSearch() { 21322 external_$_default()('body').removeClass('headerSearch-is-visible'); 21323 external_$_default()('.documentHeader .headerSearch__submit').attr('tabindex', '-1'); 21324 $searchToggle.attr('aria-expanded', false); 21325 $search.attr('aria-expanded', false); 21326} 21327/** 21328 * Init on DOM ready 21329 */ 21330 21331external_$_default().when((external_$_default()).ready).then(function () { 21332 console.log('headerSearch initialised on DOMContentLoaded'); 21333 21334 if ($searchToggle.length < 1) { 21335 return; 21336 } 21337 21338 var $body = external_$_default()('body'); // add a canvas to put an opacity layer over the content except the header 21339 // rather add 2 items than have complicated CSS 21340 21341 external_$_default()('<div class="headerSearch__canvas"></div>').appendTo('.documentMain'); 21342 external_$_default()('<div class="headerSearch__canvas"></div>').appendTo('.documentFooter'); // close on click elsewhere 21343 21344 external_$_default()(window).on('click', function (evt) { 21345 if ($body.hasClass('headerSearch-is-visible') && external_$_default()(evt.target).parents('.headerSearch').length < 1) { 21346 $body.removeClass('headerSearch-is-visible'); 21347 } 21348 }); 21349 $searchToggle.click(function () { 21350 if ($searchToggle.attr('aria-expanded') === 'false') { 21351 openHeaderSearch(); 21352 } else { 21353 closeHeaderSearch(); 21354 } 21355 }); // close on ESC 21356 21357 $body.on('keydown', function (evt) { 21358 if (evt.keyCode === 27 && $body.hasClass('headerSearch-is-visible')) { 21359 closeHeaderSearch(); 21360 $searchToggle.focus(); 21361 } 21362 }); 21363 external_$_default()(window).on('focusin', function (e) { 21364 if (external_$_default()(e.target).parents('.headerSearch').length < 1 && $search.attr('aria-expanded', true)) { 21365 closeHeaderSearch(); 21366 } 21367 }); 21368}); 21369;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/infoBox/infobox.main.js 21370 21371external_$_default().when((external_$_default()).ready).then(function () { 21372 console.log('hello im infobox'); 21373 var $this; 21374 /** 21375 * Create Context for different behaviour of Textmedia Elements with, without or only infoboxes 21376 */ 21377 21378 external_$_default()('.infoBox').each(function (e, el) { 21379 $this = external_$_default()(el); 21380 $this.siblings('figure').addClass('figure--infoBox'); 21381 console.log($this.parent().siblings().length, $this.siblings().length); 21382 21383 if ($this.parent().siblings().length < 1) { 21384 $this.parents('.co').addClass('coInfobox'); 21385 } 21386 }); 21387}); 21388;// CONCATENATED MODULE: ./src/modules/components/megaNav/megaNav.main.js 21389 21390 21391 21392function positionSecondLevel() { 21393 var $docHeader = external_$_default()('.documentHeader__container'); 21394 21395 if ($docHeader.length < 1) { 21396 return; 21397 } 21398 21399 var menuBottom = $docHeader[0].getBoundingClientRect().top; 21400 external_$_default()('.megaNav .secondLevel').css('transform', 'translateY(' + menuBottom + 'px)'); 21401} 21402/** 21403 * Init on DOM ready 21404 */ 21405 21406 21407function megaNav_main_init() { 21408 var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '.megaNav .firstLevel'; 21409 console.log('megaNav initialised on DOMContentLoaded'); 21410 external_$_default()(selector).accessibleMegaMenu({ 21411 openOnMouseover: true 21412 }); 21413 external_$_default()(selector).removeAttr('role'); //set by aMM but not needed 21414 // $('.documentHeader__offscreen').css('display', 'none'); 21415 // hack so that the megamenu doesn't show flash of css animation after the page loads. 21416 21417 setTimeout(function () { 21418 external_$_default()('body').removeClass('init'); 21419 }, 500); 21420 positionSecondLevel(); 21421 var timeoutID; 21422 external_$_default()(window).on('scroll resize', function () { 21423 positionSecondLevel(); // Verzögertes Ausführen der Repositionierungs-Funktion 21424 // (Falls dich die Header-Position beim Wechsel von Sticky zu Non-Sticky ändert, wird die Position mit einer 21425 // CSS-Animation verändert, was erst nach dem Animations-Ende zu korrekt auslesbaren Werten führt) 21426 21427 clearTimeout(timeoutID); 21428 timeoutID = setTimeout(positionSecondLevel, 500); 21429 }); 21430} 21431external_$_default().when((external_$_default()).ready).then(function () { 21432 console.log('megaNav initialised on DOMContentLoaded'); // init modes 21433 21434 megaNav_main_init('.megaNav .firstLevel'); 21435}); 21436;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/scrollbar.
21436js 21437/** 21438 * -------------------------------------------------------------------------- 21439 * Bootstrap (v5.1.3): util/scrollBar.js 21440 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 21441 * -------------------------------------------------------------------------- 21442 */ 21443 21444 21445 21446 21447 21448const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top' 21449const SELECTOR_STICKY_CONTENT = '.sticky-top' 21450 21451class ScrollBarHelper { 21452 constructor() { 21453 this._element = document.body 21454 } 21455 21456 getWidth() { 21457 // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes 21458 const documentWidth = document.documentElement.clientWidth 21459 return Math.abs(window.innerWidth - documentWidth) 21460 } 21461 21462 hide() { 21463 const width = this.getWidth() 21464 this._disableOverFlow() 21465 // give padding to element to balance the hidden scrollbar width 21466 this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width) 21467 // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth 21468 this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width) 21469 this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width) 21470 } 21471 21472 _disableOverFlow() { 21473 this._saveInitialAttribute(this._element, 'overflow') 21474 this._element.style.overflow = 'hidden' 21475 } 21476 21477 _setElementAttributes(selector, styleProp, callback) { 21478 const scrollbarWidth = this.getWidth() 21479 const manipulationCallBack = element => { 21480 if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) { 21481 return 21482 } 21483 21484 this._saveInitialAttribute(element, styleProp) 21485 const calculatedValue = window.getComputedStyle(element)[styleProp] 21486 element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px` 21487 } 21488 21489 this._applyManipulationCallback(selector, manipulationCallBack) 21490 } 21491 21492 reset() { 21493 this._resetElementAttributes(this._element, 'overflow') 21494 this._resetElementAttributes(this._element, 'paddingRight') 21495 this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight') 21496 this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight') 21497 } 21498 21499 _saveInitialAttribute(element, styleProp) { 21500 const actualValue = element.style[styleProp] 21501 if (actualValue) { 21502 manipulator.setDataAttribute(element, styleProp, actualValue) 21503 } 21504 } 21505 21506 _resetElementAttributes(selector, styleProp) { 21507 const manipulationCallBack = element => { 21508 const value = manipulator.getDataAttribute(element, styleProp) 21509 if (typeof value === 'undefined') { 21510 element.style.removeProperty(styleProp) 21511 } else { 21512 manipulator.removeDataAttribute(element, styleProp) 21513 element.style[styleProp] = value 21514 } 21515 } 21516 21517 this._applyManipulationCallback(selector, manipulationCallBack) 21518 } 21519 21520 _applyManipulationCallback(selector, callBack) { 21521 if (isElement(selector)) { 21522 callBack(selector) 21523 } else { 21524 selector_engine.find(selector, this._element).forEach(callBack) 21525 } 21526 } 21527 21528 isOverflowing() { 21529 return this.getWidth() > 0 21530 } 21531} 21532 21533/* harmony default export */ var scrollbar = (ScrollBarHelper); 21534 21535;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/backdrop.js 21536/** 21537 * -------------------------------------------------------------------------- 21538 * Bootstrap (v5.1.3): util/backdrop.js 21539 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 21540 * -------------------------------------------------------------------------- 21541 */ 21542 21543 21544 21545 21546const backdrop_Default = { 21547 className: 'modal-backdrop', 21548 isVisible: true, // if false, we use the backdrop helper without adding any element to the dom 21549 isAnimated: false, 21550 rootElement: 'body', // give the choice to place backdrop under different elements 21551 clickCallback: null 21552} 21553 21554const backdrop_DefaultType = { 21555 className: 'string', 21556 isVisible: 'boolean', 21557 isAnimated: 'boolean', 21558 rootElement: '(element|string)', 21559 clickCallback: '(function|null)' 21560} 21561const backdrop_NAME = 'backdrop' 21562const backdrop_CLASS_NAME_FADE = 'fade' 21563const backdrop_CLASS_NAME_SHOW = 'show' 21564 21565const EVENT_MOUSEDOWN = `mousedown.bs.${backdrop_NAME}` 21566 21567class Backdrop { 21568 constructor(config) { 21569 this._config = this._getConfig(config) 21570 this._isAppended = false 21571 this._element = null 21572 } 21573 21574 show(callback) { 21575 if (!this._config.isVisible) { 21576 execute(callback) 21577 return 21578 } 21579 21580 this._append() 21581 21582 if (this._config.isAnimated) { 21583 reflow(this._getElement()) 21584 } 21585 21586 this._getElement().classList.add(backdrop_CLASS_NAME_SHOW) 21587 21588 this._emulateAnimation(() => { 21589 execute(callback) 21590 }) 21591 } 21592 21593 hide(callback) { 21594 if (!this._config.isVisible) { 21595 execute(callback) 21596 return 21597 } 21598 21599 this._getElement().classList.remove(backdrop_CLASS_NAME_SHOW) 21600 21601 this._emulateAnimation(() => { 21602 this.dispose() 21603 execute(callback) 21604 }) 21605 } 21606 21607 // Private 21608 21609 _getElement() { 21610 if (!this._element) { 21611 const backdrop = document.createElement('div') 21612 backdrop.className = this._config.className 21613 if (this._config.isAnimated) { 21614 backdrop.classList.add(backdrop_CLASS_NAME_FADE) 21615 } 21616 21617 this._element = backdrop 21618 } 21619 21620 return this._element 21621 } 21622 21623 _getConfig(config) { 21624 config = { 21625 ...backdrop_Default, 21626 ...(typeof config === 'object' ? config : {}) 21627 } 21628 21629 // use getElement() with the default "body" to get a fresh Element on each instantiation 21630 config.rootElement = getElement(config.rootElement)
21631 typeCheckConfig(backdrop_NAME, config, backdrop_DefaultType) 21632 return config 21633 } 21634 21635 _append() { 21636 if (this._isAppended) { 21637 return 21638 } 21639 21640 this._config.rootElement.append(this._getElement()) 21641 21642 event_handler.on(this._getElement(), EVENT_MOUSEDOWN, () => { 21643 execute(this._config.clickCallback) 21644 }) 21645 21646 this._isAppended = true 21647 } 21648 21649 dispose() { 21650 if (!this._isAppended) { 21651 return 21652 } 21653 21654 event_handler.off(this._element, EVENT_MOUSEDOWN) 21655 21656 this._element.remove() 21657 this._isAppended = false 21658 } 21659 21660 _emulateAnimation(callback) { 21661 executeAfterTransition(callback, this._getElement(), this._config.isAnimated) 21662 } 21663} 21664 21665/* harmony default export */ var backdrop = (Backdrop); 21666 21667;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/focustrap.js 21668/** 21669 * -------------------------------------------------------------------------- 21670 * Bootstrap (v5.1.3): util/focustrap.js 21671 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 21672 * -------------------------------------------------------------------------- 21673 */ 21674 21675 21676 21677 21678 21679const focustrap_Default = { 21680 trapElement: null, // The element to trap focus inside of 21681 autofocus: true 21682} 21683 21684const focustrap_DefaultType = { 21685 trapElement: 'element', 21686 autofocus: 'boolean' 21687} 21688 21689const focustrap_NAME = 'focustrap' 21690const focustrap_DATA_KEY = 'bs.focustrap' 21691const focustrap_EVENT_KEY = `.${focustrap_DATA_KEY}` 21692const EVENT_FOCUSIN = `focusin${focustrap_EVENT_KEY}` 21693const EVENT_KEYDOWN_TAB = `keydown.tab${focustrap_EVENT_KEY}` 21694 21695const TAB_KEY = 'Tab' 21696const TAB_NAV_FORWARD = 'forward' 21697const TAB_NAV_BACKWARD = 'backward' 21698 21699class FocusTrap { 21700 constructor(config) { 21701 this._config = this._getConfig(config) 21702 this._isActive = false 21703 this._lastTabNavDirection = null 21704 } 21705 21706 activate() { 21707 const { trapElement, autofocus } = this._config 21708 21709 if (this._isActive) { 21710 return 21711 } 21712 21713 if (autofocus) { 21714 trapElement.focus() 21715 } 21716 21717 event_handler.off(document, focustrap_EVENT_KEY) // guard against infinite focus loop 21718 event_handler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event)) 21719 event_handler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event)) 21720 21721 this._isActive = true 21722 } 21723 21724 deactivate() { 21725 if (!this._isActive) { 21726 return 21727 } 21728 21729 this._isActive = false 21730 event_handler.off(document, focustrap_EVENT_KEY) 21731 } 21732 21733 // Private 21734 21735 _handleFocusin(event) { 21736 const { target } = event 21737 const { trapElement } = this._config 21738 21739 if (target === document || target === trapElement || trapElement.contains(target)) { 21740 return 21741 } 21742 21743 const elements = selector_engine.focusableChildren(trapElement) 21744 21745 if (elements.length === 0) { 21746 trapElement.focus() 21747 } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) { 21748 elements[elements.length - 1].focus() 21749 } else { 21750 elements[0].focus() 21751 } 21752 } 21753 21754 _handleKeydown(event) { 21755 if (event.key !== TAB_KEY) { 21756 return 21757 } 21758 21759 this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD 21760 } 21761 21762 _getConfig(config) { 21763 config = { 21764 ...focustrap_Default, 21765 ...(typeof config === 'object' ? config : {}) 21766 } 21767 typeCheckConfig(focustrap_NAME, config, focustrap_DefaultType) 21768 return config 21769 } 21770} 21771 21772/* harmony default export */ var focustrap = (FocusTrap); 21773 21774;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/util/component-functions.js 21775/** 21776 * -------------------------------------------------------------------------- 21777 * Bootstrap (v5.1.3): util/component-functions.js 21778 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 21779 * -------------------------------------------------------------------------- 21780 */ 21781 21782 21783 21784 21785const enableDismissTrigger = (component, method = 'hide') => { 21786 const clickEvent = `click.dismiss${component.EVENT_KEY}` 21787 const name = component.NAME 21788 21789 event_handler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function (event) { 21790 if (['A', 'AREA'].includes(this.tagName)) { 21791 event.preventDefault() 21792 } 21793 21794 if (isDisabled(this)) { 21795 return 21796 } 21797 21798 const target = getElementFromSelector(this) || this.closest(`.${name}`) 21799 const instance = component.getOrCreateInstance(target) 21800 21801 // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method 21802 instance[method]() 21803 }) 21804} 21805 21806 21807 21808;// CONCATENATED MODULE: ./node_modules/bootstrap/js/src/offcanvas.js 21809/** 21810 * -------------------------------------------------------------------------- 21811 * Bootstrap (v5.1.3): offcanvas.js 21812 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) 21813 * -------------------------------------------------------------------------- 21814 */ 21815 21816 21817 21818 21819 21820 21821 21822 21823 21824 21825 21826/** 21827 * ------------------------------------------------------------------------ 21828 * Constants 21829 * ------------------------------------------------------------------------ 21830 */ 21831
21832const offcanvas_NAME = 'offcanvas' 21833const offcanvas_DATA_KEY = 'bs.offcanvas' 21834const offcanvas_EVENT_KEY = `.${offcanvas_DATA_KEY}` 21835const offcanvas_DATA_API_KEY = '.data-api' 21836const EVENT_LOAD_DATA_API = `load${offcanvas_EVENT_KEY}${offcanvas_DATA_API_KEY}` 21837const ESCAPE_KEY = 'Escape' 21838 21839const offcanvas_Default = { 21840 backdrop: true, 21841 keyboard: true, 21842 scroll: false 21843} 21844 21845const offcanvas_DefaultType = { 21846 backdrop: 'boolean', 21847 keyboard: 'boolean', 21848 scroll: 'boolean' 21849} 21850 21851const offcanvas_CLASS_NAME_SHOW = 'show' 21852const CLASS_NAME_BACKDROP = 'offcanvas-backdrop' 21853const OPEN_SELECTOR = '.offcanvas.show' 21854 21855const offcanvas_EVENT_SHOW = `show${offcanvas_EVENT_KEY}` 21856const offcanvas_EVENT_SHOWN = `shown${offcanvas_EVENT_KEY}` 21857const offcanvas_EVENT_HIDE = `hide${offcanvas_EVENT_KEY}` 21858const offcanvas_EVENT_HIDDEN = `hidden${offcanvas_EVENT_KEY}` 21859const offcanvas_EVENT_CLICK_DATA_API = `click${offcanvas_EVENT_KEY}${offcanvas_DATA_API_KEY}` 21860const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${offcanvas_EVENT_KEY}` 21861 21862const offcanvas_SELECTOR_DATA_TOGGLE = '[data-bs-toggle="offcanvas"]' 21863 21864/** 21865 * ------------------------------------------------------------------------ 21866 * Class Definition 21867 * ------------------------------------------------------------------------ 21868 */ 21869 21870class Offcanvas extends base_component { 21871 constructor(element, config) { 21872 super(element) 21873 21874 this._config = this._getConfig(config) 21875 this._isShown = false 21876 this._backdrop = this._initializeBackDrop() 21877 this._focustrap = this._initializeFocusTrap() 21878 this._addEventListeners() 21879 } 21880 21881 // Getters 21882 21883 static get NAME() { 21884 return offcanvas_NAME 21885 } 21886 21887 static get Default() { 21888 return offcanvas_Default 21889 } 21890 21891 // Public 21892 21893 toggle(relatedTarget) { 21894 return this._isShown ? this.hide() : this.show(relatedTarget) 21895 } 21896 21897 show(relatedTarget) { 21898 if (this._isShown) { 21899 return 21900 } 21901 21902 const showEvent = event_handler.trigger(this._element, offcanvas_EVENT_SHOW, { relatedTarget }) 21903 21904 if (showEvent.defaultPrevented) { 21905 return 21906 } 21907 21908 this._isShown = true 21909 this._element.style.visibility = 'visible' 21910 21911 this._backdrop.show() 21912 21913 if (!this._config.scroll) { 21914 new scrollbar().hide() 21915 } 21916 21917 this._element.removeAttribute('aria-hidden') 21918 this._element.setAttribute('aria-modal', true) 21919 this._element.setAttribute('role', 'dialog') 21920 this._element.classList.add(offcanvas_CLASS_NAME_SHOW) 21921 21922 const completeCallBack = () => { 21923 if (!this._config.scroll) { 21924 this._focustrap.activate() 21925 } 21926 21927 event_handler.trigger(this._element, offcanvas_EVENT_SHOWN, { relatedTarget }) 21928 } 21929 21930 this._queueCallback(completeCallBack, this._element, true) 21931 } 21932 21933 hide() { 21934 if (!this._isShown) { 21935 return 21936 } 21937 21938 const hideEvent = event_handler.trigger(this._element, offcanvas_EVENT_HIDE) 21939 21940 if (hideEvent.defaultPrevented) { 21941 return 21942 } 21943 21944 this._focustrap.deactivate() 21945 this._element.blur() 21946 this._isShown = false 21947 this._element.classList.remove(offcanvas_CLASS_NAME_SHOW) 21948 this._backdrop.hide() 21949 21950 const completeCallback = () => { 21951 this._element.setAttribute('aria-hidden', true) 21952 this._element.removeAttribute('aria-modal') 21953 this._element.removeAttribute('role') 21954 this._element.style.visibility = 'hidden' 21955 21956 if (!this._config.scroll) { 21957 new scrollbar().reset() 21958 } 21959 21960 event_handler.trigger(this._element, offcanvas_EVENT_HIDDEN) 21961 } 21962 21963 this._queueCallback(completeCallback, this._element, true) 21964 } 21965 21966 dispose() { 21967 this._backdrop.dispose() 21968 this._focustrap.deactivate() 21969 super.dispose() 21970 } 21971 21972 // Private 21973 21974 _getConfig(config) { 21975 config = { 21976 ...offcanvas_Default, 21977 ...manipulator.getDataAttributes(this._element), 21978 ...(typeof config === 'object' ? config : {}) 21979 } 21980 typeCheckConfig(offcanvas_NAME, config, offcanvas_DefaultType) 21981 return config 21982 } 21983 21984 _initializeBackDrop() { 21985 return new backdrop({ 21986 className: CLASS_NAME_BACKDROP, 21987 isVisible: this._config.backdrop, 21988 isAnimated: true, 21989 rootElement: this._element.parentNode, 21990 clickCallback: () => this.hide() 21991 }) 21992 } 21993 21994 _initializeFocusTrap() {
21995 return new focustrap({ 21996 trapElement: this._element 21997 }) 21998 } 21999 22000 _addEventListeners() { 22001 event_handler.on(this._element, EVENT_KEYDOWN_DISMISS, event => { 22002 if (this._config.keyboard && event.key === ESCAPE_KEY) { 22003 this.hide() 22004 } 22005 }) 22006 } 22007 22008 // Static 22009 22010 static jQueryInterface(config) { 22011 return this.each(function () { 22012 const data = Offcanvas.getOrCreateInstance(this, config) 22013 22014 if (typeof config !== 'string') { 22015 return 22016 } 22017 22018 if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { 22019 throw new TypeError(`No method named "${config}"`) 22020 } 22021 22022 data[config](this) 22023 }) 22024 } 22025} 22026 22027/** 22028 * ------------------------------------------------------------------------ 22029 * Data Api implementation 22030 * ------------------------------------------------------------------------ 22031 */ 22032 22033event_handler.on(document, offcanvas_EVENT_CLICK_DATA_API, offcanvas_SELECTOR_DATA_TOGGLE, function (event) { 22034 const target = getElementFromSelector(this) 22035 22036 if (['A', 'AREA'].includes(this.tagName)) { 22037 event.preventDefault() 22038 } 22039 22040 if (isDisabled(this)) { 22041 return 22042 } 22043 22044 event_handler.one(target, offcanvas_EVENT_HIDDEN, () => { 22045 // focus on trigger when it is closed 22046 if (isVisible(this)) { 22047 this.focus() 22048 } 22049 }) 22050 22051 // avoid conflict when clicking a toggler of an offcanvas, while another is open 22052 const allReadyOpen = selector_engine.findOne(OPEN_SELECTOR) 22053 if (allReadyOpen && allReadyOpen !== target) { 22054 Offcanvas.getInstance(allReadyOpen).hide() 22055 } 22056 22057 const data = Offcanvas.getOrCreateInstance(target) 22058 data.toggle(this) 22059}) 22060 22061event_handler.on(window, EVENT_LOAD_DATA_API, () => 22062 selector_engine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show()) 22063) 22064 22065enableDismissTrigger(Offcanvas) 22066/** 22067 * ------------------------------------------------------------------------ 22068 * jQuery 22069 * ------------------------------------------------------------------------ 22070 */ 22071 22072defineJQueryPlugin(Offcanvas) 22073 22074/* harmony default export */ var src_offcanvas = (Offcanvas); 22075 22076;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/core/config.core.js 22077// Keep in sync with breakpoints in sass/_variables.scss 22078var breakpoints = { 22079 base: 0, 22080 mobile: 320, 22081 phablet: 540, 22082 tablet: 740, 22083 desktop: 980, 22084 mainNavigation: 980, 22085 wide: 1200, 22086 slider: 1280, 22087 extraordinary: 1400 22088}; // Keep in sync with transitions in sass/_variables.scss 22089 22090var speed = { 22091 instant: 5, 22092 fast: 100, 22093 normal: 300, 22094 slow: 700, 22095 sluggish: 1200 22096}; // todo @skm: ist this the right place for this? copied from gf-023... 22097 22098if ("ontouchstart" in document.documentElement) { 22099 var root = document.getElementsByTagName('html')[0]; // '0' to assign the first (and only `HTML` tag) 22100 22101 root.className += ' touch-device'; 22102} 22103 22104window.addEventListener('beforeprint', function () { 22105 window.scrollTo(0, 0); 22106}); 22107;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/offcanvas/offcanvas.main.js 22108 22109 22110function offcanvas_main_init() { 22111 var id = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'offcanvas'; 22112 var offcanvas = new src_offcanvas(document.getElementById(id)); 22113 window.addEventListener('resize', function () { 22114 if (window.innerWidth > breakpoints.mainNavigation) { 22115 offcanvas.hide(); 22116 } 22117 }); 22118} 22119document.addEventListener('DOMContentLoaded', function () { 22120 offcanvas_main_init(); 22121}); 22122;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/printButton/printButton.main.js 22123/** 22124 * Trigger print 22125 */ 22126 22127/** 22128 * module initialisation 22129 */ 22130 22131external_$_default().when((external_$_default()).ready).then(function () { 22132 external_$_default()('.printButton').on('click', function (evt) { 22133 evt.preventDefault(); 22134 window.print(); 22135 }); 22136}); 22137;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/skiplinks/skiplinks.main.js 22138 // Init on DOM ready 22139 22140external_$_default().when((external_$_default()).ready).then(function () { 22141 console.log('skiplinks initialised on DOMContentLoaded'); 22142 var $skiplinksContainer = external_$_default()('.skiplinks'); 22143 var $skiplinks = $skiplinksContainer.find('a'); 22144 $skiplinks.on('focus', function () { 22145 $skiplinksContainer.addClass('is-focussed'); 22146 }); 22147 $skiplinks.on('blur', function () { 22148 $skiplinksContainer.removeClass('is-focussed'); 22149 }); 22150}); 22151;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/toggle/toggle.main.js 22152 22153 22154function getTarget($toggle) { 22155 var $target; 22156 var mode = $toggle.data('mode'); 22157 var target = $toggle.data('target') || 'body'; 22158 22159 if (mode === 'siblings') { 22160 $target = $toggle.siblings(target); 22161 } else if (mode === 'closest') { 22162 $target = $toggle.closest(target); 22163 } else { 22164 $target = external_$_default()(target); 22165 } 22166 22167 return $target; 22168} 22169/** 22170 * build toggle 22171 * @param el 22172 */ 22173 22174 22175function prepare(el) { 22176 /* jshint maxcomplexity: false */ 22177 var $toggle = external_$_default()(el); 22178 var $label = $toggle.find('.m-toggle__label'); 22179 var $target = getTarget($toggle); 22180 var ariaTarget = $toggle.data('aria-target') || false; 22181 var $ariaTarget = ariaTarget ? external_$_default()(ariaTarget) : false;
22182 var mode = $toggle.data('mode') || false; 22183 var accordion = $toggle.closest('.coAccordion .co__main').data('accordion') || false; // accordion functionality 22184 22185 var firstOpen = $toggle.closest('.coAccordion .co__main').data('first-open') || false; // accordion functionality 22186 22187 var closeOnClickOutside = $toggle.data('close-on-click-outside') || false; 22188 var expanded = $toggle.data('expanded') || false; // initially opens Expand 22189 22190 var switchClassname = $toggle.data('switch-classname') || 'm-toggle--active'; 22191 var switchLabel = $toggle.data('switch-label') ? $toggle.data('switch-label') || $toggle.text() : false; 22192 var toggleOnce = $toggle.data('toggle-once') || false; 22193 var focus = $toggle.data('focus') || false; // defines element that should be focussed - used in header search 22194 // wrap toggle text if not already happened 22195 22196 if ($label.length < 1) { 22197 $label = $toggle.wrapInner('<span class="m-toggle__label"></span>'); 22198 } // store current label 22199 22200 22201 if (switchLabel) { 22202 $toggle.data('default-label', $toggle.text()); 22203 } // set aria attribute 22204 22205 22206 if ($ariaTarget) { 22207 $ariaTarget.attr('aria-expanded', 'false'); 22208 } // set tabindex 22209 // could be a bit better maybe... 22210 // see: https://stackoverflow.com/questions/1599660/which-html-elements-can-receive-focus 22211 22212 22213 $target.find('.expand__main').find('a[href], button, input, select, textarea').attr('tabindex', '-1'); // close toggle when clicked outside 22214 22215 if (closeOnClickOutside) { 22216 external_$_default()(document).on('click', function (evt) { 22217 if (external_$_default()(evt.target).is($toggle) === false && $toggle.hasClass(switchClassname)) { 22218 $toggle.trigger('click'); 22219 } 22220 }); 22221 } 22222 /* jshint maxcomplexity: false */ 22223 22224 22225 var doToggle = function doToggle(evt) { 22226 evt.preventDefault(); 22227 evt.stopPropagation(); 22228 console.log('toggle.js triggered'); 22229 var state; 22230 var isToggled = $target.data('is-toggled') || false; 22231 22232 if (toggleOnce && isToggled) { 22233 $toggle.off('click', doToggle); 22234 return; 22235 } 22236 22237 if ($target.hasClass(switchClassname)) { 22238 $target.removeClass(switchClassname); 22239 $toggle.removeClass(switchClassname); 22240 22241 if (switchLabel) { 22242 $label.text($toggle.data('default-label')); 22243 } 22244 22245 state = false; 22246 } else { 22247 if (accordion === true) { 22248 $toggle.closest('.coAccordion .co__main').find('.expand--expanded .m-toggle').not($toggle).click(); 22249 } else if (mode !== 'siblings' && mode !== 'closest') { 22250 $toggle.siblings().removeClass(switchClassname); 22251 $target.siblings().removeClass(switchClassname); 22252 $toggle.parent().parent().find('.' + switchClassname).removeClass(switchClassname); 22253 } 22254 22255 if (switchLabel) { 22256 $label.text(switchLabel); 22257 } 22258 22259 $target.addClass(switchClassname); 22260 $toggle.addClass(switchClassname); 22261 state = true; 22262 } 22263 22264 $target.data('is-toggled', true).data('toggle-state', state); // set aria attribute 22265 22266 if ($ariaTarget) { 22267 $ariaTarget.attr('aria-expanded', state); 22268 } // focus on element defined in data focus 22269 22270 22271 if (focus !== false) { 22272 setTimeout(function () { 22273 external_$_default()(focus).focus(); 22274 }, 500); 22275 } 22276 }; 22277 22278 $toggle.on('click', doToggle); // mark toggle as initialised 22279 22280 $toggle.addClass('m-toggle--initialised'); 22281 $toggle.trigger('mToggleInitialised'); // only for cco--accordion 22282 22283 if (expanded) { 22284 $toggle.trigger('click'); 22285 } //open first expand if firstOpen is set 22286 22287 22288 if (firstOpen && $toggle.parent().is(':first-child')) { 22289 $toggle.trigger('click'); 22290 } 22291} 22292/** 22293 * module initialisation 22294 */ 22295 22296external_$_default().when((external_$_default()).ready).then(function () { 22297 console.log('toggle initialised on DOMContentLoaded'); // prevent double-initialisation when combined with solrSearch.solr.js 22298 22299 var $toggle = external_$_default()('.m-toggle:not(.m-toggle--initialised)'); 22300 $toggle.each(function () { 22301 prepare(this); 22302 }); 22303}); 22304;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/tooltip/tooltip.settings.main.js 22305var options = { 22306 selector: '[data-bs-toggle="tooltip"]', 22307 attrConsentType: 'data-bs-cookie-consent-type', 22308 attrCookieDependency: 'data-bs-cookie-dependency' 22309}; 22310;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/components/tooltip/tooltip.main.js 22311/* provided dependency */ var $ = __webpack_require__(3336); 22312 22313 22314 22315function updateTooltip(cookieman, tooltip) { 22316 tooltip.enable(); 22317 22318 var cookieConsentType = tooltip._element.getAttribute(options.attrConsentType); 22319 22320 var cookieDependency = tooltip._element.getAttribute(options.attrCookieDependency) ? tooltip._element.getAttribute(options.attrCookieDependency) : 'if'; 22321 22322 if (!cookieman.hasConsented(cookieConsentType) && cookieDependency === 'if') { 22323 tooltip.disable(); 22324 } 22325 22326 if (cookieman.hasConsented(cookieConsentType) && cookieDependency === 'else') { 22327 tooltip.disable(); 22328 } 22329} 22330 22331function initTooltip(tt) { 22332 var tooltip = new src_tooltip(tt); 22333 var cookieman = window.cookieman ? window.cookieman : null; 22334 22335 var cookieConsentType = tooltip._element.getAttribute(options.attrConsentType); 22336 22337 if (!cookieman || !cookieConsentType) { 22338 return; 22339 } 22340 22341 updateTooltip(cookieman, tooltip); 22342 $(document).on('cookieman-updated', function () { 22343 updateTooltip(cookieman, tooltip); 22344 }); 22345} 22346function tooltip_main_init() { 22347 var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : options.selector; 22348 var tooltips = document.querySelectorAll(selector); 22349 22350 if (tooltips.length < 1) { 22351 return; 22352 } 22353 22354 tooltips.forEach(initTooltip); 22355} 22356document.addEventListener('DOMContentLoaded', function () { 22357 tooltip_main_init(); 22358}); 22359;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/contentObjects/coTextmedia/coTextmedia.main.js 22360 22361 22362 22363function checkLines($el) { 22364 var height = $el.height(); 22365 var lineheight = parseInt($el.css('line-height')); 22366 return height > lineheight; 22367} 22368 22369function alignToNumber($el) { 22370 var $sibling = $el.find('+ *'); 22371 var y1 = $el[0].getBoundingClientRect().bottom; 22372 var y2 = $sibling[0].getBoundingClientRect().bottom; 22373 $sibling.css('transform', 'translateY(' + (y1 - y2) + 'px)'); 22374} 22375 22376function setMarginForBeside() { 22377 // only do this from tablet up 22378 if (external_$_default()(window).width() > breakpoints.phablet) { 22379 external_$_default()('.coTextmedia.co--beside').each(function () { 22380 var $co = external_$_default()(this); 22381 var $mediaContainer = $co.find('.mediaContainer');
22382 var $rteContent = $co.find('.co__rteContent'); 22383 var alignment = $mediaContainer.hasClass('mediaContainer--left') ? 'left' : 'right'; 22384 var mediaWidth = $mediaContainer.outerWidth(); 22385 $rteContent.css('margin-' + alignment, mediaWidth); 22386 }); 22387 } else { 22388 external_$_default()('.coTextmedia.co--beside').each(function () { 22389 var $co = external_$_default()(this); 22390 var $rteContent = $co.find('.co__rteContent'); 22391 $rteContent.css({ 22392 'margin-left': '', 22393 'margin-right': '' 22394 }); 22395 }); 22396 } 22397} 22398 22399external_$_default().when((external_$_default()).ready).then(function () { 22400 external_$_default()('.coTextmedia p').filter(function () { 22401 return !external_$_default().trim(external_$_default()(this).text()); 22402 }).remove(); 22403 /** 22404 * [#27812], [#28443] CO »Herausgestellte Zahl 22405 */ 22406 22407 var $floatedNumber = external_$_default()('.number-floated'); 22408 $floatedNumber.each(function () { 22409 var $this = external_$_default()(this); 22410 /** 22411 * if sibling of floated number is a oneliner, align to baseline of number 22412 */ 22413 22414 if (!checkLines($this.find('+ *'))) { 22415 alignToNumber($this); 22416 } 22417 }); // todo: maybe there is a pure CSS solution but could not find anything 22418 // problem is that the image size/width can be adjusted in the BE 22419 22420 if (external_$_default()('.coTextmedia.co--beside').length > 0) { 22421 setMarginForBeside(); // update the slider options on resize 22422 22423 var resizeTimer = null; 22424 external_$_default()(window).on('resize', function () { 22425 clearTimeout(resizeTimer); 22426 resizeTimer = setTimeout(setMarginForBeside(), 50); 22427 }); 22428 } 22429}); 22430;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/js/core/supports.core.js 22431function supports_core_passive() { 22432 var supports = false; 22433 22434 try { 22435 var opts = Object.defineProperty({}, 'passive', { 22436 get: function get() { 22437 supports = true; 22438 } 22439 }); 22440 window.addEventListener("test", null, opts); 22441 } catch (e) {} 22442 22443 return supports; 22444} 22445;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/document/documentHeader/fixedHeader.settings.js 22446var fixedHeader_settings_options = { 22447 // On-Off Switch 22448 active: true, 22449 // <string>, element selector -> element that is being fixed 22450 element: '.documentHeader', 22451 // <string>, element selector 22452 switchOnElement: 'body', 22453 // <string>, switch classname 22454 switchClassname: 'is-fixed', 22455 // <string>, set scroll offset -> offset is calculated 22456 offsetElement: '.documentHeader', 22457 // <string>, element to receive padding to make sure we do not get any jumping of content 22458 paddingElement: 'body', 22459 // <bool> set to true, if documentHeader is basically fixed 22460 paddingInstant: false, 22461 // the sticky handler 22462 priority: 1 22463}; 22464;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/document/documentHeader/fixedHeader.main.js 22465 22466 22467 22468 22469function getPosition(selector) { 22470 var $element = external_$_default()(selector); 22471 var element = $element[0]; 22472 var xPosition = 0; 22473 var yPosition = 0; // bail if element is hidden with CSS 22474 22475 if ($element.css('display') === 'none') { 22476 return { 22477 x: false, 22478 y: false 22479 }; 22480 } 22481 22482 while (element) { 22483 xPosition += element.offsetLeft - element.scrollLeft + element.clientLeft; 22484 yPosition += element.offsetTop - element.scrollTop + element.clientTop; 22485 element = element.offsetParent; 22486 } 22487 22488 return { 22489 x: xPosition, 22490 y: yPosition 22491 }; 22492} 22493 22494external_$_default().when((external_$_default()).ready).then(function () { 22495 console.log('fixedHeader initialised on DOMContentLoaded'); 22496 22497 if (!fixedHeader_settings_options.active) { 22498 return; 22499 } 22500 22501 var $window = external_$_default()(window); 22502 var $el = external_$_default()(fixedHeader_settings_options.element); 22503 22504 if ($el.length < 1) { 22505 return; 22506 } 22507 22508 var elClass = external_$_default()(fixedHeader_settings_options.element).attr('class').split(' ')[0]; 22509 var $elSwitch = external_$_default()(fixedHeader_settings_options.switchOnElement); 22510 var $paddingElement = external_$_default()(fixedHeader_settings_options.paddingElement); 22511 22512 if (!$el || !$elSwitch) { 22513 return; 22514 } 22515 22516 var attached = false;
22517 var offset = getPosition(fixedHeader_settings_options.offsetElement).y || $el.outerHeight(); 22518 var headerHeight = $el.outerHeight(); 22519 22520 var attachhandler = function attachhandler() { 22521 $elSwitch.addClass(elClass + '-' + fixedHeader_settings_options.switchClassname); 22522 $el.addClass(fixedHeader_settings_options.switchClassname); 22523 headerHeight = $el.outerHeight(); // get headerHeight in case it changed 22524 22525 $paddingElement.css('padding-top', parseInt(headerHeight, 10)); // dispatch to sticky handler 22526 22527 $window.trigger('sticky', { 22528 $el: $el, 22529 priority: fixedHeader_settings_options.priority, 22530 status: 'stuck' 22531 }); 22532 }; 22533 22534 var detachhandler = function detachhandler() { 22535 $elSwitch.removeClass(elClass + '-' + fixedHeader_settings_options.switchClassname); 22536 $el.removeClass(fixedHeader_settings_options.switchClassname); 22537 22538 if (!fixedHeader_settings_options.paddingInstant) { 22539 $paddingElement.css('padding-top', ''); 22540 } // dispatch to sticky handler 22541 22542 22543 $window.trigger('sticky', { 22544 $el: $el, 22545 priority: fixedHeader_settings_options.priority, 22546 status: 'unstuck' 22547 }); 22548 }; 22549 22550 var resizeUpdate = function resizeUpdate() { 22551 if (attached) { 22552 $el.removeClass(fixedHeader_settings_options.switchClassname); 22553 } 22554 22555 offset = getPosition(fixedHeader_settings_options.offsetElement).y || $el.outerHeight(); 22556 headerHeight = $el.outerHeight(); 22557 22558 if (attached) { 22559 $el.addClass(fixedHeader_settings_options.switchClassname); 22560 $paddingElement.css('padding-top', parseInt(headerHeight, 10)); 22561 } 22562 22563 external_$_default()(window).scroll(); 22564 }; 22565 22566 var lastScrollTop = 0; 22567 window.addEventListener('scroll', function () { 22568 var nextScrollTop = window.pageYOffset || document.documentElement.scrollTop; 22569 22570 if (nextScrollTop > lastScrollTop) { 22571 $elSwitch.removeClass('is-topscrolling'); 22572 } else { 22573 $elSwitch.addClass('is-topscrolling'); 22574 } 22575 22576 lastScrollTop = nextScrollTop <= 0 ? 0 : nextScrollTop; 22577 22578 if (!attached && window.pageYOffset > offset) { 22579 attached = true; 22580 attachhandler(); 22581 } else if (attached && window.pageYOffset <= offset) { 22582 attached = false; 22583 detachhandler(); 22584 } 22585 }, supports_core_passive() ? { 22586 passive: true 22587 } : false); // update the slider options on resize 22588 22589 var resizeTimer = null; 22590 external_$_default()(window).on('resize', function () { 22591 clearTimeout(resizeTimer); 22592 resizeTimer = setTimeout(resizeUpdate, 20); 22593 }); 22594 window.dispatchEvent(new CustomEvent('scroll')); 22595}); 22596;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/elements/audio/audio.main.js 22597 22598 22599function initAudio() { 22600 var $audios = external_$_default()(this); 22601 22602 if ($audios.length < 1) { 22603 return; 22604 } 22605 22606 $audios.each(function (i, audio) { 22607 var $audio = external_$_default()(audio); 22608 var $playButton = $audio.find('.audio__play-button'); 22609 var $player = $audio.find('.audio__player audio'); 22610 $playButton.on('click', function () { 22611 $audio.addClass('player-is-initialised'); 22612 $player[0].play(); 22613 }); 22614 }); 22615} 22616/** 22617 * Init on DOM ready 22618 */ 22619 22620 22621external_$_default().when((external_$_default()).ready).then(function () { 22622 // console.log('audios initialised on DOMContentLoaded'); 22623 external_$_default()('.audio').each(initAudio); 22624}); 22625// EXTERNAL MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/elements/button/button.main.js 22626var button_main = __webpack_require__(4591); 22627;// CONCATENATED MODULE: ../../backend/packages/wwt3_frontend_prototype/src/modules/rteElements/sortableTable/sortableTable.main.js 22628// import { breakpoints, speed } from 'Src/core/config'; 22629 22630 22631function sortableTable_main_init() { 22632 var $table = external_$_default()(this); 22633 var $tHead = $table.find('thead').eq(0); 22634 var $tHeadRow = $tHead.find('tr').eq(0); 22635 var $tHeadRowCells = $tHeadRow.find('th, td'); 22636 22637 var _hasTHead = $tHeadRowCells.length > 1; 22638 22639 var $headerTR = _hasTHead ? $tHeadRow : $table.find('tr').eq(0); 22640 var $allTableHeadCells = $headerTR.find('th, td'); 22641 $table.addClass('sortable-table'); 22642 $allTableHeadCells.addClass('sortable-table__th'); 22643 var $sortableRows = $table.find('tr').not($headerTR); 22644 var sortableData = []; 22645 $sortableRows.each(function () { 22646 var $row = external_$_default()(this); 22647 var row = [$row]; 22648 var $td = $row.find('td'); 22649 $td.each(function () { 22650 row.push(external_$_default()(this).text()); 22651 }); 22652 sortableData.push(row); 22653 }); 22654
22655 var stripSpaces = function stripSpaces(string) { 22656 var temp = String(string).split(' '); 22657 return temp.join(''); 22658 }; 22659 22660 var sortTable = function sortTable(index, direction) { 22661 console.log("sortTable: " + index + " : " + direction); // index 0 is the jQuery Object, so comparable Data is starting at index 1 22662 22663 index = index + 1; 22664 22665 var _supportsLocaleCompare = !!String.prototype.localeCompare; 22666 22667 sortableData.sort(function (a, b) { 22668 var valueA = stripSpaces(a[index]); 22669 var valueB = stripSpaces(b[index]); 22670 22671 var _compareByString = isNaN(Number(valueA)) || isNaN(Number(valueB)); 22672 22673 if (_compareByString) { 22674 valueA = valueA.toLowerCase(); 22675 valueB = valueB.toLowerCase(); 22676 22677 if (_supportsLocaleCompare) { 22678 return valueA.localeCompare(valueB) * direction; 22679 } else { 22680 if (valueA > valueB) { 22681 return -1 * direction; 22682 } else if (valueB > valueA) { 22683 return 1 * direction; 22684 } else { 22685 return 0; 22686 } 22687 } 22688 } else { 22689 valueA = Number(valueA); 22690 valueB = Number(valueB); 22691 22692 if (valueA > valueB) { 22693 return -1 * direction; 22694 } else if (valueB > valueA) { 22695 return 1 * direction; 22696 } else { 22697 return 0; 22698 } 22699 } 22700 }); 22701 sortableData.map(function (e) { 22702 e[0].appendTo($table); 22703 }); 22704 }; 22705 22706 $allTableHeadCells.each(function (index) { 22707 var $th = external_$_default()(this); 22708 $th.data('direction', 0); 22709 $th.click(function () { 22710 var $this = external_$_default()(this); 22711 var direction = Number($this.data('direction')); 22712 $allTableHeadCells.data('direction', 0).removeClass('sortable-table__th--active sortable-table__th--up sortable-table__th--down'); 22713 22714 if (direction === 0 || direction === 1) { 22715 direction = -1; 22716 } else { 22717 direction = 1; 22718 } 22719 22720 $this.data('direction', direction).addClass('sortable-table__th--active').addClass('sortable-table__th--' + (direction === 1 ? "up" : "down")); 22721 sortTable(index, direction); 22722 }); 22723 }); 22724 return $table; 22725} 22726/** 22727 * Init on DOM ready 22728 */ 22729 22730 22731external_$_default().when((external_$_default()).ready).then(function () { 22732 console.log('sortableTable initialised on DOMContentLoaded'); // do it only for figures 22733 22734 var $table = external_$_default()('table.contenttable'); 22735 $table.each(sortableTable_main_init); 22736 $table.wrap('<div class="contenttable__outer-wrapper">'); 22737}); 22738;// CONCATENATED MODULE: ./src/modules/components/teaser/stageTeaser/stageTeaser.main.js 22739 22740 22741function checkImage($img, $wrapper) { 22742 if (!$wrapper.data('imageFillsHeight') && $img.height() < $wrapper.height()) { 22743 $wrapper.addClass('js-imageFillsHeight'); 22744 $wrapper.data('imageFillsHeight', true); 22745 } 22746 22747 if ($wrapper.data('imageFillsHeight') && $img.width() < $wrapper.width()) { 22748 $wrapper.removeClass('js-imageFillsHeight'); 22749 $wrapper.data('imageFillsHeight', false); 22750 return false; 22751 } 22752} 22753 22754external_$_default().when((external_$_default()).ready).then(function () { 22755 console.log('stageTeaser initialised at DOM Ready'); 22756 external_$_default()('.stageTeaser__content').each(function () { 22757 var $content = external_$_default()(this); 22758 $content.parents('.stageTeaser').addClass('js-ready'); 22759 }); 22760 external_$_default()('.stageTeaser--layout-c .stageTeaser__media').each(function () { 22761 var $this = external_$_default()(this); 22762 var $img = $this.find('img'); 22763 $this.data('imageFillsHeight', false); 22764 checkImage($img, $this); 22765 external_$_default()(window).resize(function () { 22766 checkImage($img, $this); 22767 }); 22768 }); 22769}); 22770// EXTERNAL MODULE: ./src/modules/components/teaser/tileTeaser/tileTeaser.main.js 22771var tileTeaser_main = __webpack_require__(9709); 22772// EXTERNAL MODULE: ./.modernizrrc 22773var _modernizrrc = __webpack_require__(7669); 22774var _modernizrrc_default = /*#__PURE__*/__webpack_require__.n(_modernizrrc); 22775;// CONCATENATED MODULE: ./src/modules/contentObjects/coBreaking/variants/coBreaking5050/coBreaking5050.main.js 22776 22777 22778/** 22779 * Init on DOM ready 22780 */ 22781 22782external_$_default().when((external_$_default()).ready).then(function () { 22783 console.log('coBreaking initialised on DOMContentLoaded'); 22784 22785 if (!(_modernizrrc_default()).objectfit) { 22786 external_$_default()('.coBreaking--coBreaking5050 .co__media').each(function () { 22787 var $container = external_$_default()(this), 22788 imgUrl = $container.find('img').prop('src'); 22789 22790 if (imgUrl) { 22791 $container.css('backgroundImage', 'url(' + imgUrl + ')').addClass('compat-object-fit'); 22792 } 22793 }); 22794 } 22795}); 22796// EXTERNAL MODULE: ./src/modules/components/contentHeader/simpleHeader/simpleHeader.main.js 22797var simpleHeader_main = __webpack_require__(600); 22798;// CONCATENATED MODULE: ./src/js/_imports/main.js 22799 22800 22801 22802 22803 22804 22805 22806 22807 22808 22809 22810 22811 22812 22813 22814 22815 22816 22817 22818 22819 22820 22821 22822 22823 22824 22825 22826}(); 22827/******/ })() 22828; 22829/******/ (function() { // webpackBootstrap 22830var __webpack_exports__ = {}; 22831 22832/******/ })() 22833;
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.