vendor: 4,853 bytes, lines 1-184
1/*jquery.js*/ 2/*! 3 * jQuery JavaScript Library v1.12.4-joomla 4 * http://jquery.com/ 5 * 6 * Includes Sizzle.js 7 * http://sizzlejs.com/ 8 * 9 * Copyright jQuery Foundation and other contributors 10 * Released under the MIT license 11 * http://jquery.org/license 12 * 13 * Date: 2016-05-20T17:17Z 14 * 15 * Modified by Joomla: Mitigate possible XSS vulnerability (gh-2432), CMS Issue 19464; Prevent Object Prototype Polution, https://github.com/jquery/jquery/pull/4333 16 * Modified by Joomla: Mitigate possible XSS vulnerability CVE-2020-11022 and CVE-2020-11023, CMS Issue 28948; https://github.com/DanielRuf/snyk-js-jquery-565129 & https://git.drupalcode.org/project/drupal/-/commit/8a48ad8710aa2ec3dc32e03ad5985710079b65aa 17 */ 18 19(function( global, factory ) { 20 21 if ( typeof module === "object" && typeof module.exports === "object" ) { 22 // For CommonJS and CommonJS-like environments where a proper `window` 23 // is present, execute the factory and get jQuery. 24 // For environments that do not have a `window` with a `document` 25 // (such as Node.js), expose a factory as module.exports. 26 // This accentuates the need for the creation of a real `window`. 27 // e.g. var jQuery = require("jquery")(window); 28 // See ticket #14549 for more info. 29 module.exports = global.document ? 30 factory( global, true ) : 31 function( w ) { 32 if ( !w.document ) { 33 throw new Error( "jQuery requires a window with a document" ); 34 } 35 return factory( w ); 36 }; 37 } else { 38 factory( global ); 39 } 40 41// Pass this if window is not defined yet 42}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 43 44// Support: Firefox 18+ 45// Can't be in strict mode, several libs including ASP.NET trace 46// the stack via arguments.caller.callee and Firefox dies if 47// you try to trace through "use strict" call chains. (#13335) 48//"use strict"; 49var deletedIds = []; 50 51var document = window.document; 52 53var slice = deletedIds.slice; 54 55var concat = deletedIds.concat; 56 57var push = deletedIds.push; 58 59var indexOf = deletedIds.indexOf; 60 61var class2type = {}; 62 63var toString = class2type.toString; 64 65var hasOwn = class2type.hasOwnProperty; 66 67var support = {}; 68 69 70 71var 72 version = "1.12.4", 73 74 // Define a local copy of jQuery 75 jQuery = function( selector, context ) { 76 77 // The jQuery object is actually just the init constructor 'enhanced' 78 // Need init if jQuery is called (just allow error to be thrown if not included) 79 return new jQuery.fn.init( selector, context ); 80 }, 81 82 // Support: Android<4.1, IE<9 83 // Make sure we trim BOM and NBSP 84 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, 85 86 // Matches dashed string for camelizing 87 rmsPrefix = /^-ms-/, 88 rdashAlpha = /-([\da-z])/gi, 89 90 // Used by jQuery.camelCase as callback to replace() 91 fcamelCase = function( all, letter ) { 92 return letter.toUpperCase(); 93 }; 94 95jQuery.fn = jQuery.prototype = { 96 97 // The current version of jQuery being used 98 jquery: version, 99 100 constructor: jQuery, 101 102 // Start with an empty selector 103 selector: "", 104 105 // The default length of a jQuery object is 0 106 length: 0, 107 108 toArray: function() { 109 return slice.call( this ); 110 }, 111 112 // Get the Nth element in the matched element set OR 113 // Get the whole matched element set as a clean array 114 get: function( num ) { 115 return num != null ? 116 117 // Return just the one element from the set 118 ( num < 0 ? this[ num + this.length ] : this[ num ] ) : 119 120 // Return all the elements in a clean array 121 slice.call( this ); 122 }, 123 124 // Take an array of elements and push it onto the stack 125 // (returning the new matched element set) 126 pushStack: function( elems ) { 127 128 // Build a new jQuery matched element set 129 var ret = jQuery.merge( this.constructor(), elems ); 130 131 // Add the old object onto the stack (as a reference) 132 ret.prevObject = this; 133 ret.context = this.context; 134 135 // Return the newly-formed element set 136 return ret; 137 }, 138 139 // Execute a callback for every element in the matched set. 140 each: function( callback ) { 141 return jQuery.each( this, callback ); 142 }, 143 144 map: function( callback ) { 145 return this.pushStack( jQuery.map( this, function( elem, i ) { 146 return callback.call( elem, i, elem ); 147 } ) ); 148 }, 149 150 slice: function() { 151 return this.pushStack( slice.apply( this, arguments ) ); 152 }, 153 154 first: function() { 155 return this.eq( 0 ); 156 }, 157 158 last: function() { 159 return this.eq( -1 ); 160 }, 161 162 eq: function( i ) { 163 var len = this.length, 164 j = +i + ( i < 0 ? len : 0 ); 165 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 166 }, 167 168 end: function() { 169 return this.prevObject || this.constructor(); 170 }, 171 172 // For internal use only. 173 // Behaves like an Array's method, not like a jQuery method. 174 push: push, 175 sort: deletedIds.sort, 176 splice: deletedIds.splice 177}; 178 179jQuery.extend = jQuery.fn.extend = function() { 180 var src, copyIsArray, copy, name, options, clone, 181 target = arguments[ 0 ] || {}, 182 i = 1, 183 length = arguments.length, 184 deep = false;
vendor: 8,993 bytes, lines 185-558
185 186 // Handle a deep copy situation 187 if ( typeof target === "boolean" ) { 188 deep = target; 189 190 // skip the boolean and the target 191 target = arguments[ i ] || {}; 192 i++; 193 } 194 195 // Handle case when target is a string or something (possible in deep copy) 196 if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { 197 target = {}; 198 } 199 200 // extend jQuery itself if only one argument is passed 201 if ( i === length ) { 202 target = this; 203 i--; 204 } 205 206 for ( ; i < length; i++ ) { 207 208 // Only deal with non-null/undefined values 209 if ( ( options = arguments[ i ] ) != null ) { 210 211 // Extend the base object 212 for ( name in options ) { 213 src = target[ name ]; 214 copy = options[ name ]; 215 216 // Prevent never-ending loop 217 // ADDED by Joomla: Prevent Object Prototype Polution, see https://github.com/jquery/jquery/pull/4333 218 if ( name === "__proto__" || target === copy ) { 219 continue; 220 } 221 222 // Recurse if we're merging plain objects or arrays 223 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 224 ( copyIsArray = jQuery.isArray( copy ) ) ) ) { 225 226 if ( copyIsArray ) { 227 copyIsArray = false; 228 clone = src && jQuery.isArray( src ) ? src : []; 229 230 } else { 231 clone = src && jQuery.isPlainObject( src ) ? src : {}; 232 } 233 234 // Never move original objects, clone them 235 target[ name ] = jQuery.extend( deep, clone, copy ); 236 237 // Don't bring in undefined values 238 } else if ( copy !== undefined ) { 239 target[ name ] = copy; 240 } 241 } 242 } 243 } 244 245 // Return the modified object 246 return target; 247}; 248 249jQuery.extend( { 250 251 // Unique for each copy of jQuery on the page 252 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 253 254 // Assume jQuery is ready without the ready module 255 isReady: true, 256 257 error: function( msg ) { 258 throw new Error( msg ); 259 }, 260 261 noop: function() {}, 262 263 // See test/unit/core.js for details concerning isFunction. 264 // Since version 1.3, DOM methods and functions like alert 265 // aren't supported. They return false on IE (#2968). 266 isFunction: function( obj ) { 267 return jQuery.type( obj ) === "function"; 268 }, 269 270 isArray: Array.isArray || function( obj ) { 271 return jQuery.type( obj ) === "array"; 272 }, 273 274 isWindow: function( obj ) { 275 /* jshint eqeqeq: false */ 276 return obj != null && obj == obj.window; 277 }, 278 279 isNumeric: function( obj ) { 280 281 // parseFloat NaNs numeric-cast false positives (null|true|false|"") 282 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 283 // subtraction forces infinities to NaN 284 // adding 1 corrects loss of precision from parseFloat (#15100) 285 var realStringObj = obj && obj.toString(); 286 return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; 287 }, 288 289 isEmptyObject: function( obj ) { 290 var name; 291 for ( name in obj ) { 292 return false; 293 } 294 return true; 295 }, 296 297 isPlainObject: function( obj ) { 298 var key; 299 300 // Must be an Object. 301 // Because of IE, we also have to check the presence of the constructor property. 302 // Make sure that DOM nodes and window objects don't pass through, as well 303 if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { 304 return false; 305 } 306 307 try { 308 309 // Not own constructor property must be Object 310 if ( obj.constructor && 311 !hasOwn.call( obj, "constructor" ) && 312 !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { 313 return false; 314 } 315 } catch ( e ) { 316 317 // IE8,9 Will throw exceptions on certain host objects #9897 318 return false; 319 } 320 321 // Support: IE<9 322 // Handle iteration over inherited properties before own properties. 323 if ( !support.ownFirst ) { 324 for ( key in obj ) { 325 return hasOwn.call( obj, key ); 326 } 327 } 328 329 // Own properties are enumerated firstly, so to speed up, 330 // if last one is own, then all properties are own. 331 for ( key in obj ) {} 332 333 return key === undefined || hasOwn.call( obj, key ); 334 }, 335 336 type: function( obj ) { 337 if ( obj == null ) { 338 return obj + ""; 339 } 340 return typeof obj === "object" || typeof obj === "function" ? 341 class2type[ toString.call( obj ) ] || "object" : 342 typeof obj; 343 }, 344 345 // Workarounds based on findings by Jim Driscoll 346 // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context 347 globalEval: function( data ) { 348 if ( data && jQuery.trim( data ) ) { 349 350 // We use execScript on Internet Explorer 351 // We use an anonymous function so that context is window 352 // rather than jQuery in Firefox 353 ( window.execScript || function( data ) { 354 window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation 355 } )( data ); 356 } 357 }, 358 359 // Convert dashed to camelCase; used by the css and data modules 360 // Microsoft forgot to hump their vendor prefix (#9572) 361 camelCase: function( string ) { 362 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 363 }, 364 365 nodeName: function( elem, name ) { 366 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 367 }, 368 369 each: function( obj, callback ) { 370 var length, i = 0; 371 372 if ( isArrayLike( obj ) ) { 373 length = obj.length; 374 for ( ; i < length; i++ ) { 375 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 376 break; 377 } 378 } 379 } else { 380 for ( i in obj ) { 381 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 382 break; 383 } 384 } 385 } 386 387 return obj; 388 }, 389 390 // Support: Android<4.1, IE<9 391 trim: function( text ) { 392 return text == null ? 393 "" : 394 ( text + "" ).replace( rtrim, "" ); 395 }, 396 397 // results is for internal usage only 398 makeArray: function( arr, results ) { 399 var ret = results || []; 400 401 if ( arr != null ) { 402 if ( isArrayLike( Object( arr ) ) ) { 403 jQuery.merge( ret, 404 typeof arr === "string" ? 405 [ arr ] : arr 406 ); 407 } else { 408 push.call( ret, arr ); 409 } 410 } 411 412 return ret; 413 }, 414 415 inArray: function( elem, arr, i ) { 416 var len; 417 418 if ( arr ) { 419 if ( indexOf ) { 420 return indexOf.call( arr, elem, i ); 421 } 422 423 len = arr.length; 424 i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; 425 426 for ( ; i < len; i++ ) { 427 428 // Skip accessing in sparse arrays 429 if ( i in arr && arr[ i ] === elem ) { 430 return i; 431 } 432 } 433 } 434 435 return -1; 436 }, 437 438 merge: function( first, second ) { 439 var len = +second.length, 440 j = 0, 441 i = first.length; 442 443 while ( j < len ) { 444 first[ i++ ] = second[ j++ ]; 445 } 446 447 // Support: IE<9 448 // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) 449 if ( len !== len ) { 450 while ( second[ j ] !== undefined ) { 451 first[ i++ ] = second[ j++ ]; 452 } 453 } 454 455 first.length = i; 456 457 return first; 458 }, 459 460 grep: function( elems, callback, invert ) { 461 var callbackInverse, 462 matches = [], 463 i = 0, 464 length = elems.length, 465 callbackExpect = !invert; 466 467 // Go through the array, only saving the items 468 // that pass the validator function 469 for ( ; i < length; i++ ) { 470 callbackInverse = !callback( elems[ i ], i ); 471 if ( callbackInverse !== callbackExpect ) { 472 matches.push( elems[ i ] ); 473 } 474 } 475 476 return matches; 477 }, 478 479 // arg is for internal usage only 480 map: function( elems, callback, arg ) { 481 var length, value, 482 i = 0, 483 ret = []; 484 485 // Go through the array, translating each of the items to their new values 486 if ( isArrayLike( elems ) ) { 487 length = elems.length; 488 for ( ; i < length; i++ ) { 489 value = callback( elems[ i ], i, arg ); 490 491 if ( value != null ) { 492 ret.push( value ); 493 } 494 } 495 496 // Go through every key on the object, 497 } else { 498 for ( i in elems ) { 499 value = callback( elems[ i ], i, arg ); 500 501 if ( value != null ) { 502 ret.push( value ); 503 } 504 } 505 } 506 507 // Flatten any nested arrays 508 return concat.apply( [], ret ); 509 }, 510 511 // A global GUID counter for objects 512 guid: 1, 513 514 // Bind a function to a context, optionally partially applying any 515 // arguments. 516 proxy: function( fn, context ) { 517 var args, proxy, tmp; 518 519 if ( typeof context === "string" ) { 520 tmp = fn[ context ]; 521 context = fn; 522 fn = tmp; 523 } 524 525 // Quick check to determine if target is callable, in the spec 526 // this throws a TypeError, but we will just return undefined. 527 if ( !jQuery.isFunction( fn ) ) { 528 return undefined; 529 } 530 531 // Simulated bind 532 args = slice.call( arguments, 2 ); 533 proxy = function() { 534 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 535 }; 536 537 // Set the guid of unique handler to the same of original handler, so it can be removed 538 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 539 540 return proxy; 541 }, 542 543 now: function() { 544 return +( new Date() ); 545 }, 546 547 // jQuery.support is not used in Core but other projects attach their 548 // properties to it so it needs to exist. 549 support: support 550} ); 551 552// JSHint would error on this code due to the Symbol not being defined in ES5. 553// Defining this global in .jshintrc would create a danger of using the global 554// unguarded in another place, it seems safer to just disable JSHint for these 555// three lines. 556/* jshint ignore: start */ 557if ( typeof Symbol === "function" ) { 558 jQuery.fn[ Symbol.iterator ] = deletedIds
vendor: 63,327 bytes, lines 558-2795
558[ Symbol.iterator ]; 559} 560/* jshint ignore: end */ 561 562// Populate the class2type map 563jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 564function( i, name ) { 565 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 566} ); 567 568function isArrayLike( obj ) { 569 570 // Support: iOS 8.2 (not reproducible in simulator) 571 // `in` check used to prevent JIT error (gh-2145) 572 // hasOwn isn't used here due to false negatives 573 // regarding Nodelist length in IE 574 var length = !!obj && "length" in obj && obj.length, 575 type = jQuery.type( obj ); 576 577 if ( type === "function" || jQuery.isWindow( obj ) ) { 578 return false; 579 } 580 581 return type === "array" || length === 0 || 582 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 583} 584var Sizzle = 585/*! 586 * Sizzle CSS Selector Engine v2.2.1 587 * http://sizzlejs.com/ 588 * 589 * Copyright jQuery Foundation and other contributors 590 * Released under the MIT license 591 * http://jquery.org/license 592 * 593 * Date: 2015-10-17 594 */ 595(function( window ) { 596 597var i, 598 support, 599 Expr, 600 getText, 601 isXML, 602 tokenize, 603 compile, 604 select, 605 outermostContext, 606 sortInput, 607 hasDuplicate, 608 609 // Local document vars 610 setDocument, 611 document, 612 docElem, 613 documentIsHTML, 614 rbuggyQSA, 615 rbuggyMatches, 616 matches, 617 contains, 618 619 // Instance-specific data 620 expando = "sizzle" + 1 * new Date(), 621 preferredDoc = window.document, 622 dirruns = 0, 623 done = 0, 624 classCache = createCache(), 625 tokenCache = createCache(), 626 compilerCache = createCache(), 627 sortOrder = function( a, b ) { 628 if ( a === b ) { 629 hasDuplicate = true; 630 } 631 return 0; 632 }, 633 634 // General-purpose constants 635 MAX_NEGATIVE = 1 << 31, 636 637 // Instance methods 638 hasOwn = ({}).hasOwnProperty, 639 arr = [], 640 pop = arr.pop, 641 push_native = arr.push, 642 push = arr.push, 643 slice = arr.slice, 644 // Use a stripped-down indexOf as it's faster than native 645 // http://jsperf.com/thor-indexof-vs-for/5 646 indexOf = function( list, elem ) { 647 var i = 0, 648 len = list.length; 649 for ( ; i < len; i++ ) { 650 if ( list[i] === elem ) { 651 return i; 652 } 653 } 654 return -1; 655 }, 656 657 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", 658 659 // Regular expressions 660 661 // http://www.w3.org/TR/css3-selectors/#whitespace 662 whitespace = "[\\x20\\t\\r\\n\\f]", 663 664 // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier 665 identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", 666 667 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 668 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 669 // Operator (capture 2) 670 "*([*^$|!~]?=)" + whitespace + 671 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 672 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + 673 "*\\]", 674 675 pseudos = ":(" + identifier + ")(?:\\((" + 676 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 677 // 1. quoted (capture 3; capture 4 or capture 5) 678 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 679 // 2. simple (capture 6) 680 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 681 // 3. anything else (capture 2) 682 ".*" + 683 ")\\)|)", 684 685 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 686 rwhitespace = new RegExp( whitespace + "+", "g" ), 687 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), 688 689 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 690 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), 691 692 rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), 693 694 rpseudo = new RegExp( pseudos ), 695 ridentifier = new RegExp( "^" + identifier + "$" ), 696 697 matchExpr = { 698 "ID": new RegExp( "^#(" + identifier + ")" ), 699 "CLASS": new RegExp( "^\\.(" + identifier + ")" ), 700 "TAG": new RegExp( "^(" + identifier + "|[*])" ), 701 "ATTR": new RegExp( "^" + attributes ), 702 "PSEUDO": new RegExp( "^" + pseudos ), 703 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + 704 "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + 705 "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 706 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), 707 // For use in libraries implementing .is() 708 // We use this for POS matching in `select` 709 "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + 710 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 711 }, 712 713 rinputs = /^(?:input|select|textarea|button)$/i, 714 rheader = /^h\d$/i, 715 716 rnative = /^[^{]+\{\s*\[native \w/, 717 718 // Easily-parseable/retrievable ID or TAG or CLASS selectors 719 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 720 721 rsibling = /[+~]/, 722 rescape = /'|\\/g, 723 724 // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 725 runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), 726 funescape = function( _, escaped, escapedWhitespace ) { 727 var high = "0x" + escaped - 0x10000; 728 // NaN means non-codepoint 729 // Support: Firefox<24 730 // Workaround erroneous numeric interpretation of +"0x" 731 return high !== high || escapedWhitespace ? 732 escaped : 733 high < 0 ? 734 // BMP codepoint 735 String.fromCharCode( high + 0x10000 ) : 736 // Supplemental Plane codepoint (surrogate pair) 737 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 738 }, 739 740 // Used for iframes 741 // See setDocument() 742 // Removing the function wrapper causes a "Permission Denied" 743 // error in IE 744 unloadHandler = function() { 745 setDocument(); 746 }; 747 748// Optimize for push.apply( _, NodeList ) 749try { 750 push.apply( 751 (arr = slice.call( preferredDoc.childNodes )), 752 preferredDoc.childNodes 753 ); 754 // Support: Android<4.0 755 // Detect silently failing push.apply 756 arr[ preferredDoc.childNodes.length ].nodeType; 757} catch ( e ) { 758 push = { apply: arr.length ? 759 760 // Leverage slice if possible 761 function( target, els ) { 762 push_native.apply( target, slice.call(els) ); 763 } : 764 765 // Support: IE<9 766 // Otherwise append directly 767 function( target, els ) { 768 var j = target.length, 769 i = 0; 770 // Can't trust NodeList.length 771 while ( (target[j++] = els[i++]) ) {} 772 target.length = j - 1; 773 } 774 }; 775} 776 777function Sizzle( selector, context, results, seed ) { 778 var m, i, elem, nid, nidselect, match, groups, newSelector, 779 newContext = context && context.ownerDocument, 780 781 // nodeType defaults to 9, since context defaults to document 782 nodeType = context ? context.nodeType : 9; 783 784 results = results || []; 785 786 // Return early from calls with invalid selector or context 787 if ( typeof selector !== "string" || !selector || 788 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 789 790 return results; 791 } 792 793 // Try to shortcut find operations (as opposed to filters) in HTML documents 794 if ( !seed ) { 795 796 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { 797 setDocument( context ); 798 } 799 context = context || document; 800 801 if ( documentIsHTML ) { 802 803 // If the selector is sufficiently simple, try using a "get*By*" DOM method 804 // (excepting DocumentFragment context, where the methods don't exist) 805 if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { 806 807 // ID selector 808 if ( (m = match[1]) ) { 809 810 // Document context 811 if ( nodeType === 9 ) { 812 if ( (elem = context.getElementById( m )) ) { 813 814 // Support: IE, Opera, Webkit 815 // TODO: identify versions 816 // getElementById can match elements by name instead of ID 817 if ( elem.id === m ) { 818 results.push( elem ); 819 return results; 820 } 821 } else { 822 return results; 823 } 824 825 // Element context 826 } else { 827 828 // Support: IE, Opera, Webkit 829 // TODO: identify versions 830 // getElementById can match elements by name instead of ID 831 if ( newContext && (elem = newContext.getElementById( m )) && 832 contains( context, elem ) && 833 elem.id === m ) { 834 835 results.push( elem ); 836 return results; 837 } 838 } 839 840 // Type selector 841 } else if ( match[2] ) { 842 push.apply( results, context.getElementsByTagName( selector ) ); 843 return results; 844 845 // Class selector 846 } else if ( (m = match[3]) && support.getElementsByClassName && 847 context.getElementsByClassName ) { 848 849 push.apply( results, context.getElementsByClassName( m ) ); 850 return results; 851 } 852 } 853 854 // Take advantage of querySelectorAll 855 if ( support.qsa && 856 !compilerCache[ selector + " " ] && 857 (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { 858 859 if ( nodeType !== 1 ) { 860 newContext = context; 861 newSelector = selector; 862 863 // qSA looks outside Element context, which is not what we want 864 // Thanks to Andrew Dupont for this workaround technique 865 // Support: IE <=8 866 // Exclude object elements 867 } else if ( context.nodeName.toLowerCase() !== "object" ) { 868 869 // Capture the context ID, setting it first if necessary 870 if ( (nid = context.getAttribute( "id" )) ) { 871 nid = nid.replace( rescape, "\\$&" ); 872 } else { 873 context.setAttribute( "id", (nid = expando) ); 874 } 875 876 // Prefix every selector in the list 877 groups = tokenize( selector ); 878 i = groups.length; 879 nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; 880 while ( i-- ) { 881 groups[i] = nidselect + " " + toSelector( groups[i] ); 882 } 883 newSelector = groups.join( "," ); 884 885 // Expand context for sibling selectors 886 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 887 context; 888 } 889 890 if ( newSelector ) { 891 try { 892 push.apply( results, 893 newContext.querySelectorAll( newSelector ) 894 ); 895 return results; 896 } catch ( qsaError ) { 897 } finally { 898 if ( nid === expando ) { 899 context.removeAttribute( "id" ); 900 } 901 } 902 } 903 } 904 } 905 } 906 907 // All others 908 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 909} 910 911/** 912 * Create key-value caches of limited size 913 * @returns {function(string, object)} Returns the Object data after storing it on itself with 914 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 915 * deleting the oldest entry 916 */ 917function createCache() { 918 var keys = []; 919 920 function cache( key, value ) { 921 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 922 if ( keys.push( key + " " ) > Expr.cacheLength ) { 923 // Only keep the most recent entries 924 delete cache[ keys.shift() ]; 925 } 926 return (cache[ key + " " ] = value); 927 } 928 return cache; 929} 930 931/** 932 * Mark a function for special use by Sizzle 933 * @param {Function} fn The function to mark 934 */ 935function markFunction( fn ) { 936 fn[ expando ] = true; 937 return fn; 938} 939 940/** 941 * Support testing using an element 942 * @param {Function} fn Passed the created div and expects a boolean result 943 */ 944function assert( fn ) { 945 var div = document.createElement("div"); 946 947 try { 948 return !!fn( div ); 949 } catch (e) { 950 return false; 951 } finally { 952 // Remove from its parent by default 953 if ( div.parentNode ) { 954 div.parentNode.removeChild( div ); 955 } 956 // release memory in IE 957 div = null; 958 } 959} 960 961/** 962 * Adds the same handler for all of the specified attrs 963 * @param {String} attrs Pipe-separated list of attributes 964 * @param {Function} handler The method that will be applied 965 */ 966function addHandle( attrs, handler ) { 967 var arr = attrs.split("|"), 968 i = arr.length; 969 970 while ( i-- ) { 971 Expr.attrHandle[ arr[i] ] = handler; 972 } 973} 974 975/** 976 * Checks document order of two siblings 977 * @param {Element} a 978 * @param {Element} b 979 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 980 */ 981function siblingCheck( a, b ) { 982 var cur = b && a, 983 diff = cur && a.nodeType === 1 && b.nodeType === 1 && 984 ( ~b.sourceIndex || MAX_NEGATIVE ) - 985 ( ~a.sourceIndex || MAX_NEGATIVE ); 986 987 // Use IE sourceIndex if available on both nodes 988 if ( diff ) { 989 return diff; 990 } 991 992 // Check if b follows a 993 if ( cur ) { 994 while ( (cur = cur.nextSibling) ) { 995 if ( cur === b ) { 996 return -1; 997 } 998 } 999 } 1000 1001 return a ? 1 : -1; 1002} 1003 1004/** 1005 * Returns a function to use in pseudos for input types 1006 * @param {String} type 1007 */ 1008function createInputPseudo( type ) { 1009 return function( elem ) { 1010 var name = elem.nodeName.toLowerCase(); 1011 return name === "input" && elem.type === type; 1012 }; 1013} 1014 1015/** 1016 * Returns a function to use in pseudos for buttons 1017 * @param {String} type 1018 */ 1019function createButtonPseudo( type ) { 1020 return function( elem ) { 1021 var name = elem.nodeName.toLowerCase(); 1022 return (name === "input" || name === "button") && elem.type === type; 1023 }; 1024} 1025 1026/** 1027 * Returns a function to use in pseudos for positionals 1028 * @param {Function} fn 1029 */ 1030function createPositionalPseudo( fn ) { 1031 return markFunction(function( argument ) { 1032 argument = +argument; 1033 return markFunction(function( seed, matches ) { 1034 var j, 1035 matchIndexes = fn( [], seed.length, argument ), 1036 i = matchIndexes.length; 1037 1038 // Match elements found at the specified indexes 1039 while ( i-- ) { 1040 if ( seed[ (j = matchIndexes[i]) ] ) { 1041 seed[j] = !(matches[j] = seed[j]); 1042 } 1043 } 1044 }); 1045 }); 1046} 1047 1048/** 1049 * Checks a node for validity as a Sizzle context 1050 * @param {Element|Object=} context 1051 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 1052 */ 1053function testContext( context ) { 1054 return context && typeof context.getElementsByTagName !== "undefined" && context; 1055} 1056 1057// Expose support vars for convenience 1058support = Sizzle.support = {}; 1059 1060/** 1061 * Detects XML nodes 1062 * @param {Element|Object} elem An element or a document 1063 * @returns {Boolean} True iff elem is a non-HTML XML node 1064 */ 1065isXML = Sizzle.isXML = function( elem ) { 1066 // documentElement is verified for cases where it doesn't yet exist 1067 // (such as loading iframes in IE - #4833) 1068 var documentElement = elem && (elem.ownerDocument || elem).documentElement; 1069 return documentElement ? documentElement.nodeName !== "HTML" : false; 1070}; 1071 1072/** 1073 * Sets document-related variables once based on the current document 1074 * @param {Element|Object} [doc] An element or document object to use to set the document 1075 * @returns {Object} Returns the current document 1076 */ 1077setDocument = Sizzle.setDocument = function( node ) { 1078 var hasCompare, parent, 1079 doc = node ? node.ownerDocument || node : preferredDoc; 1080 1081 // Return early if doc is invalid or already selected 1082 if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { 1083 return document; 1084 } 1085 1086 // Update global variables 1087 document = doc; 1088 docElem = document.documentElement; 1089 documentIsHTML = !isXML( document ); 1090 1091 // Support: IE 9-11, Edge 1092 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 1093 if ( (parent = document.defaultView) && parent.top !== parent ) { 1094 // Support: IE 11 1095 if ( parent.addEventListener ) { 1096 parent.addEventListener( "unload", unloadHandler, false ); 1097 1098 // Support: IE 9 - 10 only 1099 } else if ( parent.attachEvent ) { 1100 parent.attachEvent( "onunload", unloadHandler ); 1101 } 1102 } 1103 1104 /* Attributes 1105 ---------------------------------------------------------------------- */ 1106 1107 // Support: IE<8 1108 // Verify that getAttribute really returns attributes and not properties 1109 // (excepting IE8 booleans) 1110 support.attributes = assert(function( div ) { 1111 div.className = "i"; 1112 return !div.getAttribute("className"); 1113 }); 1114 1115 /* getElement(s)By* 1116 ---------------------------------------------------------------------- */ 1117 1118 // Check if getElementsByTagName("*") returns only elements 1119 support.getElementsByTagName = assert(function( div ) { 1120 div.appendChild( document.createComment("") ); 1121 return !div.getElementsByTagName("*").length; 1122 }); 1123 1124 // Support: IE<9 1125 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); 1126 1127 // Support: IE<10 1128 // Check if getElementById returns elements by name 1129 // The broken getElementById methods don't pick up programatically-set names, 1130 // so use a roundabout getElementsByName test 1131 support.getById = assert(function( div ) { 1132 docElem.appendChild( div ).id = expando; 1133 return !document.getElementsByName || !document.getElementsByName( expando ).length; 1134 }); 1135 1136 // ID find and filter 1137 if ( support.getById ) { 1138 Expr.find["ID"] = function( id, context ) { 1139 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1140 var m = context.getElementById( id ); 1141 return m ? [ m ] : []; 1142 } 1143 }; 1144 Expr.filter["ID"] = function( id ) { 1145 var attrId = id.replace( runescape, funescape ); 1146 return function( elem ) { 1147 return elem.getAttribute("id") === attrId; 1148 }; 1149 }; 1150 } else { 1151 // Support: IE6/7 1152 // getElementById is not reliable as a find shortcut 1153 delete Expr.find["ID"]; 1154 1155 Expr.filter["ID"] = function( id ) { 1156 var attrId = id.replace( runescape, funescape ); 1157 return function( elem ) { 1158 var node = typeof elem.getAttributeNode !== "undefined" && 1159 elem.getAttributeNode("id"); 1160 return node && node.value === attrId; 1161 }; 1162 }; 1163 } 1164 1165 // Tag 1166 Expr.find["TAG"] = support.getElementsByTagName ? 1167 function( tag, context ) { 1168 if ( typeof context.getElementsByTagName !== "undefined" ) { 1169 return context.getElementsByTagName( tag ); 1170 1171 // DocumentFragment nodes don't have gEBTN 1172 } else if ( support.qsa ) { 1173 return context.querySelectorAll( tag ); 1174 } 1175 } : 1176 1177 function( tag, context ) { 1178 var elem, 1179 tmp = [], 1180 i = 0, 1181 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 1182 results = context.getElementsByTagName( tag ); 1183 1184 // Filter out possible comments 1185 if ( tag === "*" ) { 1186 while ( (elem = results[i++]) ) { 1187 if ( elem.nodeType === 1 ) { 1188 tmp.push( elem ); 1189 } 1190 } 1191 1192 return tmp; 1193 } 1194 return results; 1195 }; 1196 1197 // Class 1198 Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { 1199 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 1200 return context.getElementsByClassName( className ); 1201 } 1202 }; 1203 1204 /* QSA/matchesSelector 1205 ---------------------------------------------------------------------- */ 1206 1207 // QSA and matchesSelector support 1208 1209 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 1210 rbuggyMatches = []; 1211 1212 // qSa(:focus) reports false when true (Chrome 21) 1213 // We allow this because of a bug in IE8/9 that throws an error 1214 // whenever `document.activeElement` is accessed on an iframe 1215 // So, we allow :focus to pass through QSA all the time to avoid the IE error 1216 // See http://bugs.jquery.com/ticket/13378 1217 rbuggyQSA = []; 1218 1219 if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { 1220 // Build QSA regex 1221 // Regex strategy adopted from Diego Perini 1222 assert(function( div ) { 1223 // Select is set to empty string on purpose 1224 // This is to test IE's treatment of not explicitly 1225 // setting a boolean content attribute, 1226 // since its presence should be enough 1227 // http://bugs.jquery.com/ticket/12359 1228 docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" + 1229 "<select id='" + expando + "-\r\\' msallowcapture=''>" + 1230 "<option selected=''></option></select>"; 1231 1232 // Support: IE8, Opera 11-12.16 1233 // Nothing should be selected when empty strings follow ^= or $= or *= 1234 // The test attribute must be unknown in Opera but "safe" for WinRT 1235 // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 1236 if ( div.querySelectorAll("[msallowcapture^='']").length ) { 1237 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); 1238 } 1239 1240 // Support: IE8 1241 // Boolean attributes and "value" are not treated correctly 1242 if ( !div.querySelectorAll("[selected]").length ) { 1243 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 1244 } 1245 1246 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 1247 if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 1248 rbuggyQSA.push("~="); 1249 } 1250 1251 // Webkit/Opera - :checked should return selected option elements 1252 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1253 // IE8 throws error here and will not see later tests 1254 if ( !div.querySelectorAll(":checked").length ) { 1255 rbuggyQSA.push(":checked"); 1256 } 1257 1258 // Support: Safari 8+, iOS 8+ 1259 // https://bugs.webkit.org/show_bug.cgi?id=136851 1260 // In-page `selector#id sibing-combinator selector` fails 1261 if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { 1262 rbuggyQSA.push(".#.+[+~]"); 1263 } 1264 }); 1265 1266 assert(function( div ) { 1267 // Support: Windows 8 Native Apps 1268 // The type and name attributes are restricted during .innerHTML assignment 1269 var input = document.createElement("input"); 1270 input.setAttribute( "type", "hidden" ); 1271 div.appendChild( input ).setAttribute( "name", "D" ); 1272 1273 // Support: IE8 1274 // Enforce case-sensitivity of name attribute 1275 if ( div.querySelectorAll("[name=d]").length ) { 1276 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); 1277 } 1278 1279 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 1280 // IE8 throws error here and will not see later tests 1281 if ( !div.querySelectorAll(":enabled").length ) { 1282 rbuggyQSA.push( ":enabled", ":disabled" ); 1283 } 1284 1285 // Opera 10-11 does not throw on post-comma invalid pseudos 1286 div.querySelectorAll("*,:x"); 1287 rbuggyQSA.push(",.*:"); 1288 }); 1289 } 1290 1291 if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || 1292 docElem.webkitMatchesSelector || 1293 docElem.mozMatchesSelector || 1294 docElem.oMatchesSelector || 1295 docElem.msMatchesSelector) )) ) { 1296 1297 assert(function( div ) { 1298 // Check to see if it's possible to do matchesSelector 1299 // on a disconnected node (IE 9) 1300 support.disconnectedMatch = matches.call( div, "div" ); 1301 1302 // This should fail with an exception 1303 // Gecko does not error, returns false instead 1304 matches.call( div, "[s!='']:x" ); 1305 rbuggyMatches.push( "!=", pseudos ); 1306 }); 1307 } 1308 1309 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); 1310 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); 1311 1312 /* Contains 1313 ---------------------------------------------------------------------- */ 1314 hasCompare = rnative.test( docElem.compareDocumentPosition ); 1315 1316 // Element contains another 1317 // Purposefully self-exclusive 1318 // As in, an element does not contain itself 1319 contains = hasCompare || rnative.test( docElem.contains ) ? 1320 function( a, b ) { 1321 var adown = a.nodeType === 9 ? a.documentElement : a, 1322 bup = b && b.parentNode; 1323 return a === bup || !!( bup && bup.nodeType === 1 && ( 1324 adown.contains ? 1325 adown.contains( bup ) : 1326 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 1327 )); 1328 } : 1329 function( a, b ) { 1330 if ( b ) { 1331 while ( (b = b.parentNode) ) { 1332 if ( b === a ) { 1333 return true; 1334 } 1335 } 1336 } 1337 return false; 1338 }; 1339 1340 /* Sorting 1341 ---------------------------------------------------------------------- */ 1342 1343 // Document order sorting 1344 sortOrder = hasCompare ? 1345 function( a, b ) { 1346 1347 // Flag for duplicate removal 1348 if ( a === b ) { 1349 hasDuplicate = true; 1350 return 0; 1351 } 1352 1353 // Sort on method existence if only one input has compareDocumentPosition 1354 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 1355 if ( compare ) { 1356 return compare; 1357 } 1358 1359 // Calculate position if both inputs belong to the same document 1360 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? 1361 a.compareDocumentPosition( b ) : 1362 1363 // Otherwise we know they are disconnected 1364 1; 1365 1366 // Disconnected nodes 1367 if ( compare & 1 || 1368 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { 1369 1370 // Choose the first element that is related to our preferred document 1371 if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { 1372 return -1; 1373 } 1374 if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { 1375 return 1; 1376 } 1377 1378 // Maintain original order 1379 return sortInput ? 1380 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1381 0; 1382 } 1383 1384 return compare & 4 ? -1 : 1; 1385 } : 1386 function( a, b ) { 1387 // Exit early if the nodes are identical 1388 if ( a === b ) { 1389 hasDuplicate = true; 1390 return 0; 1391 } 1392 1393 var cur, 1394 i = 0, 1395 aup = a.parentNode, 1396 bup = b.parentNode, 1397 ap = [ a ], 1398 bp = [ b ]; 1399 1400 // Parentless nodes are either documents or disconnected 1401 if ( !aup || !bup ) { 1402 return a === document ? -1 : 1403 b === document ? 1 : 1404 aup ? -1 : 1405 bup ? 1 : 1406 sortInput ? 1407 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1408 0; 1409 1410 // If the nodes are siblings, we can do a quick check 1411 } else if ( aup === bup ) { 1412 return siblingCheck( a, b ); 1413 } 1414 1415 // Otherwise we need full lists of their ancestors for comparison 1416 cur = a; 1417 while ( (cur = cur.parentNode) ) { 1418 ap.unshift( cur ); 1419 } 1420 cur = b; 1421 while ( (cur = cur.parentNode) ) { 1422 bp.unshift( cur ); 1423 } 1424 1425 // Walk down the tree looking for a discrepancy 1426 while ( ap[i] === bp[i] ) { 1427 i++; 1428 } 1429 1430 return i ? 1431 // Do a sibling check if the nodes have a common ancestor 1432 siblingCheck( ap[i], bp[i] ) : 1433 1434 // Otherwise nodes in our document sort first 1435 ap[i] === preferredDoc ? -1 : 1436 bp[i] === preferredDoc ? 1 : 1437 0; 1438 }; 1439 1440 return document; 1441}; 1442 1443Sizzle.matches = function( expr, elements ) { 1444 return Sizzle( expr, null, null, elements ); 1445}; 1446 1447Sizzle.matchesSelector = function( elem, expr ) { 1448 // Set document vars if needed 1449 if ( ( elem.ownerDocument || elem ) !== document ) { 1450 setDocument( elem ); 1451 } 1452 1453 // Make sure that attribute selectors are quoted 1454 expr = expr.replace( rattributeQuotes, "='$1']" ); 1455 1456 if ( support.matchesSelector && documentIsHTML && 1457 !compilerCache[ expr + " " ] && 1458 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 1459 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 1460 1461 try { 1462 var ret = matches.call( elem, expr ); 1463 1464 // IE 9's matchesSelector returns false on disconnected nodes 1465 if ( ret || support.disconnectedMatch || 1466 // As well, disconnected nodes are said to be in a document 1467 // fragment in IE 9 1468 elem.document && elem.document.nodeType !== 11 ) { 1469 return ret; 1470 } 1471 } catch (e) {} 1472 } 1473 1474 return Sizzle( expr, document, null, [ elem ] ).length > 0; 1475}; 1476 1477Sizzle.contains = function( context, elem ) { 1478 // Set document vars if needed 1479 if ( ( context.ownerDocument || context ) !== document ) { 1480 setDocument( context ); 1481 } 1482 return contains( context, elem ); 1483}; 1484 1485Sizzle.attr = function( elem, name ) { 1486 // Set document vars if needed 1487 if ( ( elem.ownerDocument || elem ) !== document ) { 1488 setDocument( elem ); 1489 } 1490 1491 var fn = Expr.attrHandle[ name.toLowerCase() ], 1492 // Don't get fooled by Object.prototype properties (jQuery #13807) 1493 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 1494 fn( elem, name, !documentIsHTML ) : 1495 undefined; 1496 1497 return val !== undefined ? 1498 val : 1499 support.attributes || !documentIsHTML ? 1500 elem.getAttribute( name ) : 1501 (val = elem.getAttributeNode(name)) && val.specified ? 1502 val.value : 1503 null; 1504}; 1505 1506Sizzle.error = function( msg ) { 1507 throw new Error( "Syntax error, unrecognized expression: " + msg ); 1508}; 1509 1510/** 1511 * Document sorting and removing duplicates 1512 * @param {ArrayLike} results 1513 */ 1514Sizzle.uniqueSort = function( results ) { 1515 var elem, 1516 duplicates = [], 1517 j = 0, 1518 i = 0; 1519 1520 // Unless we *know* we can detect duplicates, assume their presence 1521 hasDuplicate = !support.detectDuplicates; 1522 sortInput = !support.sortStable && results.slice( 0 ); 1523 results.sort( sortOrder ); 1524 1525 if ( hasDuplicate ) { 1526 while ( (elem = results[i++]) ) { 1527 if ( elem === results[ i ] ) { 1528 j = duplicates.push( i ); 1529 } 1530 } 1531 while ( j-- ) { 1532 results.splice( duplicates[ j ], 1 ); 1533 } 1534 } 1535 1536 // Clear input after sorting to release objects 1537 // See https://github.com/jquery/sizzle/pull/225 1538 sortInput = null; 1539 1540 return results; 1541}; 1542 1543/** 1544 * Utility function for retrieving the text value of an array of DOM nodes 1545 * @param {Array|Element} elem 1546 */ 1547getText = Sizzle.getText = function( elem ) { 1548 var node, 1549 ret = "", 1550 i = 0, 1551 nodeType = elem.nodeType; 1552 1553 if ( !nodeType ) { 1554 // If no nodeType, this is expected to be an array 1555 while ( (node = elem[i++]) ) { 1556 // Do not traverse comment nodes 1557 ret += getText( node ); 1558 } 1559 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 1560 // Use textContent for elements 1561 // innerText usage removed for consistency of new lines (jQuery #11153) 1562 if ( typeof elem.textContent === "string" ) { 1563 return elem.textContent; 1564 } else { 1565 // Traverse its children 1566 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 1567 ret += getText( elem ); 1568 } 1569 } 1570 } else if ( nodeType === 3 || nodeType === 4 ) { 1571 return elem.nodeValue; 1572 } 1573 // Do not include comment or processing instruction nodes 1574 1575 return ret; 1576}; 1577 1578Expr = Sizzle.selectors = { 1579 1580 // Can be adjusted by the user 1581 cacheLength: 50, 1582 1583 createPseudo: markFunction, 1584 1585 match: matchExpr, 1586 1587 attrHandle: {}, 1588 1589 find: {}, 1590 1591 relative: { 1592 ">": { dir: "parentNode", first: true }, 1593 " ": { dir: "parentNode" }, 1594 "+": { dir: "previousSibling", first: true }, 1595 "~": { dir: "previousSibling" } 1596 }, 1597 1598 preFilter: { 1599 "ATTR": function( match ) { 1600 match[1] = match[1].replace( runescape, funescape ); 1601 1602 // Move the given value to match[3] whether quoted or unquoted 1603 match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); 1604 1605 if ( match[2] === "~=" ) { 1606 match[3] = " " + match[3] + " "; 1607 } 1608 1609 return match.slice( 0, 4 ); 1610 }, 1611 1612 "CHILD": function( match ) { 1613 /* matches from matchExpr["CHILD"] 1614 1 type (only|nth|...) 1615 2 what (child|of-type) 1616 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 1617 4 xn-component of xn+y argument ([+-]?\d*n|) 1618 5 sign of xn-component 1619 6 x of xn-component 1620 7 sign of y-component 1621 8 y of y-component 1622 */ 1623 match[1] = match[1].toLowerCase(); 1624 1625 if ( match[1].slice( 0, 3 ) === "nth" ) { 1626 // nth-* requires argument 1627 if ( !match[3] ) { 1628 Sizzle.error( match[0] ); 1629 } 1630 1631 // numeric x and y parameters for Expr.filter.CHILD 1632 // remember that false/true cast respectively to 0/1 1633 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); 1634 match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); 1635 1636 // other types prohibit arguments 1637 } else if ( match[3] ) { 1638 Sizzle.error( match[0] ); 1639 } 1640 1641 return match; 1642 }, 1643 1644 "PSEUDO": function( match ) { 1645 var excess, 1646 unquoted = !match[6] && match[2]; 1647 1648 if ( matchExpr["CHILD"].test( match[0] ) ) { 1649 return null; 1650 } 1651 1652 // Accept quoted arguments as-is 1653 if ( match[3] ) { 1654 match[2] = match[4] || match[5] || ""; 1655 1656 // Strip excess characters from unquoted arguments 1657 } else if ( unquoted && rpseudo.test( unquoted ) && 1658 // Get excess from tokenize (recursively) 1659 (excess = tokenize( unquoted, true )) && 1660 // advance to the next closing parenthesis 1661 (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { 1662 1663 // excess is a negative index 1664 match[0] = match[0].slice( 0, excess ); 1665 match[2] = unquoted.slice( 0, excess ); 1666 } 1667 1668 // Return only captures needed by the pseudo filter method (type and argument) 1669 return match.slice( 0, 3 ); 1670 } 1671 }, 1672 1673 filter: { 1674 1675 "TAG": function( nodeNameSelector ) { 1676 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 1677 return nodeNameSelector === "*" ? 1678 function() { return true; } : 1679 function( elem ) { 1680 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 1681 }; 1682 }, 1683 1684 "CLASS": function( className ) { 1685 var pattern = classCache[ className + " " ]; 1686 1687 return pattern || 1688 (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && 1689 classCache( className, function( elem ) { 1690 return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); 1691 }); 1692 }, 1693 1694 "ATTR": function( name, operator, check ) { 1695 return function( elem ) { 1696 var result = Sizzle.attr( elem, name ); 1697 1698 if ( result == null ) { 1699 return operator === "!="; 1700 } 1701 if ( !operator ) { 1702 return true; 1703 } 1704 1705 result += ""; 1706 1707 return operator === "=" ? result === check : 1708 operator === "!=" ? result !== check : 1709 operator === "^=" ? check && result.indexOf( check ) === 0 : 1710 operator === "*=" ? check && result.indexOf( check ) > -1 : 1711 operator === "$=" ? check && result.slice( -check.length ) === check : 1712 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : 1713 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 1714 false; 1715 }; 1716 }, 1717 1718 "CHILD": function( type, what, argument, first, last ) { 1719 var simple = type.slice( 0, 3 ) !== "nth", 1720 forward = type.slice( -4 ) !== "last", 1721 ofType = what === "of-type"; 1722 1723 return first === 1 && last === 0 ? 1724 1725 // Shortcut for :nth-*(n) 1726 function( elem ) { 1727 return !!elem.parentNode; 1728 } : 1729 1730 function( elem, context, xml ) { 1731 var cache, uniqueCache, outerCache, node, nodeIndex, start, 1732 dir = simple !== forward ? "nextSibling" : "previousSibling", 1733 parent = elem.parentNode, 1734 name = ofType && elem.nodeName.toLowerCase(), 1735 useCache = !xml && !ofType, 1736 diff = false; 1737 1738 if ( parent ) { 1739 1740 // :(first|last|only)-(child|of-type) 1741 if ( simple ) { 1742 while ( dir ) { 1743 node = elem; 1744 while ( (node = node[ dir ]) ) { 1745 if ( ofType ? 1746 node.nodeName.toLowerCase() === name : 1747 node.nodeType === 1 ) { 1748 1749 return false; 1750 } 1751 } 1752 // Reverse direction for :only-* (if we haven't yet done so) 1753 start = dir = type === "only" && !start && "nextSibling"; 1754 } 1755 return true; 1756 } 1757 1758 start = [ forward ? parent.firstChild : parent.lastChild ]; 1759 1760 // non-xml :nth-child(...) stores cache data on `parent` 1761 if ( forward && useCache ) { 1762 1763 // Seek `elem` from a previously-cached index 1764 1765 // ...in a gzip-friendly way 1766 node = parent; 1767 outerCache = node[ expando ] || (node[ expando ] = {}); 1768 1769 // Support: IE <9 only 1770 // Defend against cloned attroperties (jQuery gh-1709) 1771 uniqueCache = outerCache[ node.uniqueID ] || 1772 (outerCache[ node.uniqueID ] = {}); 1773 1774 cache = uniqueCache[ type ] || []; 1775 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 1776 diff = nodeIndex && cache[ 2 ]; 1777 node = nodeIndex && parent.childNodes[ nodeIndex ]; 1778 1779 while ( (node = ++nodeIndex && node && node[ dir ] || 1780 1781 // Fallback to seeking `elem` from the start 1782 (diff = nodeIndex = 0) || start.pop()) ) { 1783 1784 // When found, cache indexes on `parent` and break 1785 if ( node.nodeType === 1 && ++diff && node === elem ) { 1786 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; 1787 break; 1788 } 1789 } 1790 1791 } else { 1792 // Use previously-cached element index if available 1793 if ( useCache ) { 1794 // ...in a gzip-friendly way 1795 node = elem; 1796 outerCache = node[ expando ] || (node[ expando ] = {}); 1797 1798 // Support: IE <9 only 1799 // Defend against cloned attroperties (jQuery gh-1709) 1800 uniqueCache = outerCache[ node.uniqueID ] || 1801 (outerCache[ node.uniqueID ] = {}); 1802 1803 cache = uniqueCache[ type ] || []; 1804 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 1805 diff = nodeIndex; 1806 } 1807 1808 // xml :nth-child(...) 1809 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 1810 if ( diff === false ) { 1811 // Use the same loop as above to seek `elem` from the start 1812 while ( (node = ++nodeIndex && node && node[ dir ] || 1813 (diff = nodeIndex = 0) || start.pop()) ) { 1814 1815 if ( ( ofType ? 1816 node.nodeName.toLowerCase() === name : 1817 node.nodeType === 1 ) && 1818 ++diff ) { 1819 1820 // Cache the index of each encountered element 1821 if ( useCache ) { 1822 outerCache = node[ expando ] || (node[ expando ] = {}); 1823 1824 // Support: IE <9 only 1825 // Defend against cloned attroperties (jQuery gh-1709) 1826 uniqueCache = outerCache[ node.uniqueID ] || 1827 (outerCache[ node.uniqueID ] = {}); 1828 1829 uniqueCache[ type ] = [ dirruns, diff ]; 1830 } 1831 1832 if ( node === elem ) { 1833 break; 1834 } 1835 } 1836 } 1837 } 1838 } 1839 1840 // Incorporate the offset, then check against cycle size 1841 diff -= last; 1842 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 1843 } 1844 }; 1845 }, 1846 1847 "PSEUDO": function( pseudo, argument ) { 1848 // pseudo-class names are case-insensitive 1849 // http://www.w3.org/TR/selectors/#pseudo-classes 1850 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 1851 // Remember that setFilters inherits from pseudos 1852 var args, 1853 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 1854 Sizzle.error( "unsupported pseudo: " + pseudo ); 1855 1856 // The user may use createPseudo to indicate that 1857 // arguments are needed to create the filter function 1858 // just as Sizzle does 1859 if ( fn[ expando ] ) { 1860 return fn( argument ); 1861 } 1862 1863 // But maintain support for old signatures 1864 if ( fn.length > 1 ) { 1865 args = [ pseudo, pseudo, "", argument ]; 1866 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 1867 markFunction(function( seed, matches ) { 1868 var idx, 1869 matched = fn( seed, argument ), 1870 i = matched.length; 1871 while ( i-- ) { 1872 idx = indexOf( seed, matched[i] ); 1873 seed[ idx ] = !( matches[ idx ] = matched[i] ); 1874 } 1875 }) : 1876 function( elem ) { 1877 return fn( elem, 0, args ); 1878 }; 1879 } 1880 1881 return fn; 1882 } 1883 }, 1884 1885 pseudos: { 1886 // Potentially complex pseudos 1887 "not": markFunction(function( selector ) { 1888 // Trim the selector passed to compile 1889 // to avoid treating leading and trailing 1890 // spaces as combinators 1891 var input = [], 1892 results = [], 1893 matcher = compile( selector.replace( rtrim, "$1" ) ); 1894 1895 return matcher[ expando ] ? 1896 markFunction(function( seed, matches, context, xml ) { 1897 var elem, 1898 unmatched = matcher( seed, null, xml, [] ), 1899 i = seed.length; 1900 1901 // Match elements unmatched by `matcher` 1902 while ( i-- ) { 1903 if ( (elem = unmatched[i]) ) { 1904 seed[i] = !(matches[i] = elem); 1905 } 1906 } 1907 }) : 1908 function( elem, context, xml ) { 1909 input[0] = elem; 1910 matcher( input, null, xml, results ); 1911 // Don't keep the element (issue #299) 1912 input[0] = null; 1913 return !results.pop(); 1914 }; 1915 }), 1916 1917 "has": markFunction(function( selector ) { 1918 return function( elem ) { 1919 return Sizzle( selector, elem ).length > 0; 1920 }; 1921 }), 1922 1923 "contains": markFunction(function( text ) { 1924 text = text.replace( runescape, funescape ); 1925 return function( elem ) { 1926 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; 1927 }; 1928 }), 1929 1930 // "Whether an element is represented by a :lang() selector 1931 // is based solely on the element's language value 1932 // being equal to the identifier C, 1933 // or beginning with the identifier C immediately followed by "-". 1934 // The matching of C against the element's language value is performed case-insensitively. 1935 // The identifier C does not have to be a valid language name." 1936 // http://www.w3.org/TR/selectors/#lang-pseudo 1937 "lang": markFunction( function( lang ) { 1938 // lang value must be a valid identifier 1939 if ( !ridentifier.test(lang || "") ) { 1940 Sizzle.error( "unsupported lang: " + lang ); 1941 } 1942 lang = lang.replace( runescape, funescape ).toLowerCase(); 1943 return function( elem ) { 1944 var elemLang; 1945 do { 1946 if ( (elemLang = documentIsHTML ? 1947 elem.lang : 1948 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { 1949 1950 elemLang = elemLang.toLowerCase(); 1951 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 1952 } 1953 } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); 1954 return false; 1955 }; 1956 }), 1957 1958 // Miscellaneous 1959 "target": function( elem ) { 1960 var hash = window.location && window.location.hash; 1961 return hash && hash.slice( 1 ) === elem.id; 1962 }, 1963 1964 "root": function( elem ) { 1965 return elem === docElem; 1966 }, 1967 1968 "focus": function( elem ) { 1969 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); 1970 }, 1971 1972 // Boolean properties 1973 "enabled": function( elem ) { 1974 return elem.disabled === false; 1975 }, 1976 1977 "disabled": function( elem ) { 1978 return elem.disabled === true; 1979 }, 1980 1981 "checked": function( elem ) { 1982 // In CSS3, :checked should return both checked and selected elements 1983 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1984 var nodeName = elem.nodeName.toLowerCase(); 1985 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); 1986 }, 1987 1988 "selected": function( elem ) { 1989 // Accessing this property makes selected-by-default 1990 // options in Safari work properly 1991 if ( elem.parentNode ) { 1992 elem.parentNode.selectedIndex; 1993 } 1994 1995 return elem.selected === true; 1996 }, 1997 1998 // Contents 1999 "empty": function( elem ) { 2000 // http://www.w3.org/TR/selectors/#empty-pseudo 2001 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 2002 // but not by others (comment: 8; processing instruction: 7; etc.) 2003 // nodeType < 6 works because attributes (2) do not appear as children 2004 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 2005 if ( elem.nodeType < 6 ) { 2006 return false; 2007 } 2008 } 2009 return true; 2010 }, 2011 2012 "parent": function( elem ) { 2013 return !Expr.pseudos["empty"]( elem ); 2014 }, 2015 2016 // Element/input types 2017 "header": function( elem ) { 2018 return rheader.test( elem.nodeName ); 2019 }, 2020 2021 "input": function( elem ) { 2022 return rinputs.test( elem.nodeName ); 2023 }, 2024 2025 "button": function( elem ) { 2026 var name = elem.nodeName.toLowerCase(); 2027 return name === "input" && elem.type === "button" || name === "button"; 2028 }, 2029 2030 "text": function( elem ) { 2031 var attr; 2032 return elem.nodeName.toLowerCase() === "input" && 2033 elem.type === "text" && 2034 2035 // Support: IE<8 2036 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 2037 ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); 2038 }, 2039 2040 // Position-in-collection 2041 "first": createPositionalPseudo(function() { 2042 return [ 0 ]; 2043 }), 2044 2045 "last": createPositionalPseudo(function( matchIndexes, length ) { 2046 return [ length - 1 ]; 2047 }), 2048 2049 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { 2050 return [ argument < 0 ? argument + length : argument ]; 2051 }), 2052 2053 "even": createPositionalPseudo(function( matchIndexes, length ) { 2054 var i = 0; 2055 for ( ; i < length; i += 2 ) { 2056 matchIndexes.push( i ); 2057 } 2058 return matchIndexes; 2059 }), 2060 2061 "odd": createPositionalPseudo(function( matchIndexes, length ) { 2062 var i = 1; 2063 for ( ; i < length; i += 2 ) { 2064 matchIndexes.push( i ); 2065 } 2066 return matchIndexes; 2067 }), 2068 2069 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { 2070 var i = argument < 0 ? argument + length : argument; 2071 for ( ; --i >= 0; ) { 2072 matchIndexes.push( i ); 2073 } 2074 return matchIndexes; 2075 }), 2076 2077 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { 2078 var i = argument < 0 ? argument + length : argument; 2079 for ( ; ++i < length; ) { 2080 matchIndexes.push( i ); 2081 } 2082 return matchIndexes; 2083 }) 2084 } 2085}; 2086 2087Expr.pseudos["nth"] = Expr.pseudos["eq"]; 2088 2089// Add button/input type pseudos 2090for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 2091 Expr.pseudos[ i ] = createInputPseudo( i ); 2092} 2093for ( i in { submit: true, reset: true } ) { 2094 Expr.pseudos[ i ] = createButtonPseudo( i ); 2095} 2096 2097// Easy API for creating new setFilters 2098function setFilters() {} 2099setFilters.prototype = Expr.filters = Expr.pseudos; 2100Expr.setFilters = new setFilters(); 2101 2102tokenize = Sizzle.tokenize = function( selector, parseOnly ) { 2103 var matched, match, tokens, type, 2104 soFar, groups, preFilters, 2105 cached = tokenCache[ selector + " " ]; 2106 2107 if ( cached ) { 2108 return parseOnly ? 0 : cached.slice( 0 ); 2109 } 2110 2111 soFar = selector; 2112 groups = []; 2113 preFilters = Expr.preFilter; 2114 2115 while ( soFar ) { 2116 2117 // Comma and first run 2118 if ( !matched || (match = rcomma.exec( soFar )) ) { 2119 if ( match ) { 2120 // Don't consume trailing commas as valid 2121 soFar = soFar.slice( match[0].length ) || soFar; 2122 } 2123 groups.push( (tokens = []) ); 2124 } 2125 2126 matched = false; 2127 2128 // Combinators 2129 if ( (match = rcombinators.exec( soFar )) ) { 2130 matched = match.shift(); 2131 tokens.push({ 2132 value: matched, 2133 // Cast descendant combinators to space 2134 type: match[0].replace( rtrim, " " ) 2135 }); 2136 soFar = soFar.slice( matched.length ); 2137 } 2138 2139 // Filters 2140 for ( type in Expr.filter ) { 2141 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || 2142 (match = preFilters[ type ]( match ))) ) { 2143 matched = match.shift(); 2144 tokens.push({ 2145 value: matched, 2146 type: type, 2147 matches: match 2148 }); 2149 soFar = soFar.slice( matched.length ); 2150 } 2151 } 2152 2153 if ( !matched ) { 2154 break; 2155 } 2156 } 2157 2158 // Return the length of the invalid excess 2159 // if we're just parsing 2160 // Otherwise, throw an error or return tokens 2161 return parseOnly ? 2162 soFar.length : 2163 soFar ? 2164 Sizzle.error( selector ) : 2165 // Cache the tokens 2166 tokenCache( selector, groups ).slice( 0 ); 2167}; 2168 2169function toSelector( tokens ) { 2170 var i = 0, 2171 len = tokens.length, 2172 selector = ""; 2173 for ( ; i < len; i++ ) { 2174 selector += tokens[i].value; 2175 } 2176 return selector; 2177} 2178 2179function addCombinator( matcher, combinator, base ) { 2180 var dir = combinator.dir, 2181 checkNonElements = base && dir === "parentNode", 2182 doneName = done++; 2183 2184 return combinator.first ? 2185 // Check against closest ancestor/preceding element 2186 function( elem, context, xml ) { 2187 while ( (elem = elem[ dir ]) ) { 2188 if ( elem.nodeType === 1 || checkNonElements ) { 2189 return matcher( elem, context, xml ); 2190 } 2191 } 2192 } : 2193 2194 // Check against all ancestor/preceding elements 2195 function( elem, context, xml ) { 2196 var oldCache, uniqueCache, outerCache, 2197 newCache = [ dirruns, doneName ]; 2198 2199 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 2200 if ( xml ) { 2201 while ( (elem = elem[ dir ]) ) { 2202 if ( elem.nodeType === 1 || checkNonElements ) { 2203 if ( matcher( elem, context, xml ) ) { 2204 return true; 2205 } 2206 } 2207 } 2208 } else { 2209 while ( (elem = elem[ dir ]) ) { 2210 if ( elem.nodeType === 1 || checkNonElements ) { 2211 outerCache = elem[ expando ] || (elem[ expando ] = {}); 2212 2213 // Support: IE <9 only 2214 // Defend against cloned attroperties (jQuery gh-1709) 2215 uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); 2216 2217 if ( (oldCache = uniqueCache[ dir ]) && 2218 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 2219 2220 // Assign to newCache so results back-propagate to previous elements 2221 return (newCache[ 2 ] = oldCache[ 2 ]); 2222 } else { 2223 // Reuse newcache so results back-propagate to previous elements 2224 uniqueCache[ dir ] = newCache; 2225 2226 // A match means we're done; a fail means we have to keep checking 2227 if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { 2228 return true; 2229 } 2230 } 2231 } 2232 } 2233 } 2234 }; 2235} 2236 2237function elementMatcher( matchers ) { 2238 return matchers.length > 1 ? 2239 function( elem, context, xml ) { 2240 var i = matchers.length; 2241 while ( i-- ) { 2242 if ( !matchers[i]( elem, context, xml ) ) { 2243 return false; 2244 } 2245 } 2246 return true; 2247 } : 2248 matchers[0]; 2249} 2250 2251function multipleContexts( selector, contexts, results ) { 2252 var i = 0, 2253 len = contexts.length; 2254 for ( ; i < len; i++ ) { 2255 Sizzle( selector, contexts[i], results ); 2256 } 2257 return results; 2258} 2259 2260function condense( unmatched, map, filter, context, xml ) { 2261 var elem, 2262 newUnmatched = [], 2263 i = 0, 2264 len = unmatched.length, 2265 mapped = map != null; 2266 2267 for ( ; i < len; i++ ) { 2268 if ( (elem = unmatched[i]) ) { 2269 if ( !filter || filter( elem, context, xml ) ) { 2270 newUnmatched.push( elem ); 2271 if ( mapped ) { 2272 map.push( i ); 2273 } 2274 } 2275 } 2276 } 2277 2278 return newUnmatched; 2279} 2280 2281function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 2282 if ( postFilter && !postFilter[ expando ] ) { 2283 postFilter = setMatcher( postFilter ); 2284 } 2285 if ( postFinder && !postFinder[ expando ] ) { 2286 postFinder = setMatcher( postFinder, postSelector ); 2287 } 2288 return markFunction(function( seed, results, context, xml ) { 2289 var temp, i, elem, 2290 preMap = [], 2291 postMap = [], 2292 preexisting = results.length, 2293 2294 // Get initial elements from seed or context 2295 elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), 2296 2297 // Prefilter to get matcher input, preserving a map for seed-results synchronization 2298 matcherIn = preFilter && ( seed || !selector ) ? 2299 condense( elems, preMap, preFilter, context, xml ) : 2300 elems, 2301 2302 matcherOut = matcher ? 2303 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 2304 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 2305 2306 // ...intermediate processing is necessary 2307 [] : 2308 2309 // ...otherwise use results directly 2310 results : 2311 matcherIn; 2312 2313 // Find primary matches 2314 if ( matcher ) { 2315 matcher( matcherIn, matcherOut, context, xml ); 2316 } 2317 2318 // Apply postFilter 2319 if ( postFilter ) { 2320 temp = condense( matcherOut, postMap ); 2321 postFilter( temp, [], context, xml ); 2322 2323 // Un-match failing elements by moving them back to matcherIn 2324 i = temp.length; 2325 while ( i-- ) { 2326 if ( (elem = temp[i]) ) { 2327 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); 2328 } 2329 } 2330 } 2331 2332 if ( seed ) { 2333 if ( postFinder || preFilter ) { 2334 if ( postFinder ) { 2335 // Get the final matcherOut by condensing this intermediate into postFinder contexts 2336 temp = []; 2337 i = matcherOut.length; 2338 while ( i-- ) { 2339 if ( (elem = matcherOut[i]) ) { 2340 // Restore matcherIn since elem is not yet a final match 2341 temp.push( (matcherIn[i] = elem) ); 2342 } 2343 } 2344 postFinder( null, (matcherOut = []), temp, xml ); 2345 } 2346 2347 // Move matched elements from seed to results to keep them synchronized 2348 i = matcherOut.length; 2349 while ( i-- ) { 2350 if ( (elem = matcherOut[i]) && 2351 (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { 2352 2353 seed[temp] = !(results[temp] = elem); 2354 } 2355 } 2356 } 2357 2358 // Add elements to results, through postFinder if defined 2359 } else { 2360 matcherOut = condense( 2361 matcherOut === results ? 2362 matcherOut.splice( preexisting, matcherOut.length ) : 2363 matcherOut 2364 ); 2365 if ( postFinder ) { 2366 postFinder( null, results, matcherOut, xml ); 2367 } else { 2368 push.apply( results, matcherOut ); 2369 } 2370 } 2371 }); 2372} 2373 2374function matcherFromTokens( tokens ) { 2375 var checkContext, matcher, j, 2376 len = tokens.length, 2377 leadingRelative = Expr.relative[ tokens[0].type ], 2378 implicitRelative = leadingRelative || Expr.relative[" "], 2379 i = leadingRelative ? 1 : 0, 2380 2381 // The foundational matcher ensures that elements are reachable from top-level context(s) 2382 matchContext = addCombinator( function( elem ) { 2383 return elem === checkContext; 2384 }, implicitRelative, true ), 2385 matchAnyContext = addCombinator( function( elem ) { 2386 return indexOf( checkContext, elem ) > -1; 2387 }, implicitRelative, true ), 2388 matchers = [ function( elem, context, xml ) { 2389 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 2390 (checkContext = context).nodeType ? 2391 matchContext( elem, context, xml ) : 2392 matchAnyContext( elem, context, xml ) ); 2393 // Avoid hanging onto element (issue #299) 2394 checkContext = null; 2395 return ret; 2396 } ]; 2397 2398 for ( ; i < len; i++ ) { 2399 if ( (matcher = Expr.relative[ tokens[i].type ]) ) { 2400 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; 2401 } else { 2402 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); 2403 2404 // Return special upon seeing a positional matcher 2405 if ( matcher[ expando ] ) { 2406 // Find the next relative operator (if any) for proper handling 2407 j = ++i; 2408 for ( ; j < len; j++ ) { 2409 if ( Expr.relative[ tokens[j].type ] ) { 2410 break; 2411 } 2412 } 2413 return setMatcher( 2414 i > 1 && elementMatcher( matchers ), 2415 i > 1 && toSelector( 2416 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 2417 tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) 2418 ).replace( rtrim, "$1" ), 2419 matcher, 2420 i < j && matcherFromTokens( tokens.slice( i, j ) ), 2421 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), 2422 j < len && toSelector( tokens ) 2423 ); 2424 } 2425 matchers.push( matcher ); 2426 } 2427 } 2428 2429 return elementMatcher( matchers ); 2430} 2431 2432function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 2433 var bySet = setMatchers.length > 0, 2434 byElement = elementMatchers.length > 0, 2435 superMatcher = function( seed, context, xml, results, outermost ) { 2436 var elem, j, matcher, 2437 matchedCount = 0, 2438 i = "0", 2439 unmatched = seed && [], 2440 setMatched = [], 2441 contextBackup = outermostContext, 2442 // We must always have either seed elements or outermost context 2443 elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), 2444 // Use integer dirruns iff this is the outermost matcher 2445 dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), 2446 len = elems.length; 2447 2448 if ( outermost ) { 2449 outermostContext = context === document || context || outermost; 2450 } 2451 2452 // Add elements passing elementMatchers directly to results 2453 // Support: IE<9, Safari 2454 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 2455 for ( ; i !== len && (elem = elems[i]) != null; i++ ) { 2456 if ( byElement && elem ) { 2457 j = 0; 2458 if ( !context && elem.ownerDocument !== document ) { 2459 setDocument( elem ); 2460 xml = !documentIsHTML; 2461 } 2462 while ( (matcher = elementMatchers[j++]) ) { 2463 if ( matcher( elem, context || document, xml) ) { 2464 results.push( elem ); 2465 break; 2466 } 2467 } 2468 if ( outermost ) { 2469 dirruns = dirrunsUnique; 2470 } 2471 } 2472 2473 // Track unmatched elements for set filters 2474 if ( bySet ) { 2475 // They will have gone through all possible matchers 2476 if ( (elem = !matcher && elem) ) { 2477 matchedCount--; 2478 } 2479 2480 // Lengthen the array for every element, matched or not 2481 if ( seed ) { 2482 unmatched.push( elem ); 2483 } 2484 } 2485 } 2486 2487 // `i` is now the count of elements visited above, and adding it to `matchedCount` 2488 // makes the latter nonnegative. 2489 matchedCount += i; 2490 2491 // Apply set filters to unmatched elements 2492 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 2493 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 2494 // no element matchers and no seed. 2495 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 2496 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 2497 // numerically zero. 2498 if ( bySet && i !== matchedCount ) { 2499 j = 0; 2500 while ( (matcher = setMatchers[j++]) ) { 2501 matcher( unmatched, setMatched, context, xml ); 2502 } 2503 2504 if ( seed ) { 2505 // Reintegrate element matches to eliminate the need for sorting 2506 if ( matchedCount > 0 ) { 2507 while ( i-- ) { 2508 if ( !(unmatched[i] || setMatched[i]) ) { 2509 setMatched[i] = pop.call( results ); 2510 } 2511 } 2512 } 2513 2514 // Discard index placeholder values to get only actual matches 2515 setMatched = condense( setMatched ); 2516 } 2517 2518 // Add matches to results 2519 push.apply( results, setMatched ); 2520 2521 // Seedless set matches succeeding multiple successful matchers stipulate sorting 2522 if ( outermost && !seed && setMatched.length > 0 && 2523 ( matchedCount + setMatchers.length ) > 1 ) { 2524 2525 Sizzle.uniqueSort( results ); 2526 } 2527 } 2528 2529 // Override manipulation of globals by nested matchers 2530 if ( outermost ) { 2531 dirruns = dirrunsUnique; 2532 outermostContext = contextBackup; 2533 } 2534 2535 return unmatched; 2536 }; 2537 2538 return bySet ? 2539 markFunction( superMatcher ) : 2540 superMatcher; 2541} 2542 2543compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { 2544 var i, 2545 setMatchers = [], 2546 elementMatchers = [], 2547 cached = compilerCache[ selector + " " ]; 2548 2549 if ( !cached ) { 2550 // Generate a function of recursive functions that can be used to check each element 2551 if ( !match ) { 2552 match = tokenize( selector ); 2553 } 2554 i = match.length; 2555 while ( i-- ) { 2556 cached = matcherFromTokens( match[i] ); 2557 if ( cached[ expando ] ) { 2558 setMatchers.push( cached ); 2559 } else { 2560 elementMatchers.push( cached ); 2561 } 2562 } 2563 2564 // Cache the compiled function 2565 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); 2566 2567 // Save selector and tokenization 2568 cached.selector = selector; 2569 } 2570 return cached; 2571}; 2572 2573/** 2574 * A low-level selection function that works with Sizzle's compiled 2575 * selector functions 2576 * @param {String|Function} selector A selector or a pre-compiled 2577 * selector function built with Sizzle.compile 2578 * @param {Element} context 2579 * @param {Array} [results] 2580 * @param {Array} [seed] A set of elements to match against 2581 */ 2582select = Sizzle.select = function( selector, context, results, seed ) { 2583 var i, tokens, token, type, find, 2584 compiled = typeof selector === "function" && selector, 2585 match = !seed && tokenize( (selector = compiled.selector || selector) ); 2586 2587 results = results || []; 2588 2589 // Try to minimize operations if there is only one selector in the list and no seed 2590 // (the latter of which guarantees us context) 2591 if ( match.length === 1 ) { 2592 2593 // Reduce context if the leading compound selector is an ID 2594 tokens = match[0] = match[0].slice( 0 ); 2595 if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && 2596 support.getById && context.nodeType === 9 && documentIsHTML && 2597 Expr.relative[ tokens[1].type ] ) { 2598 2599 context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; 2600 if ( !context ) { 2601 return results; 2602 2603 // Precompiled matchers will still verify ancestry, so step up a level 2604 } else if ( compiled ) { 2605 context = context.parentNode; 2606 } 2607 2608 selector = selector.slice( tokens.shift().value.length ); 2609 } 2610 2611 // Fetch a seed set for right-to-left matching 2612 i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; 2613 while ( i-- ) { 2614 token = tokens[i]; 2615 2616 // Abort if we hit a combinator 2617 if ( Expr.relative[ (type = token.type) ] ) { 2618 break; 2619 } 2620 if ( (find = Expr.find[ type ]) ) { 2621 // Search, expanding context for leading sibling combinators 2622 if ( (seed = find( 2623 token.matches[0].replace( runescape, funescape ), 2624 rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context 2625 )) ) { 2626 2627 // If seed is empty or no tokens remain, we can return early 2628 tokens.splice( i, 1 ); 2629 selector = seed.length && toSelector( tokens ); 2630 if ( !selector ) { 2631 push.apply( results, seed ); 2632 return results; 2633 } 2634 2635 break; 2636 } 2637 } 2638 } 2639 } 2640 2641 // Compile and execute a filtering function if one is not provided 2642 // Provide `match` to avoid retokenization if we modified the selector above 2643 ( compiled || compile( selector, match ) )( 2644 seed, 2645 context, 2646 !documentIsHTML, 2647 results, 2648 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 2649 ); 2650 return results; 2651}; 2652 2653// One-time assignments 2654 2655// Sort stability 2656support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; 2657 2658// Support: Chrome 14-35+ 2659// Always assume duplicates if they aren't passed to the comparison function 2660support.detectDuplicates = !!hasDuplicate; 2661 2662// Initialize against the default document 2663setDocument(); 2664 2665// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 2666// Detached nodes confoundingly follow *each other* 2667support.sortDetached = assert(function( div1 ) { 2668 // Should return 1, but returns 4 (following) 2669 return div1.compareDocumentPosition( document.createElement("div") ) & 1; 2670}); 2671 2672// Support: IE<8 2673// Prevent attribute/property "interpolation" 2674// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 2675if ( !assert(function( div ) { 2676 div.innerHTML = "<a href='#'></a>"; 2677 return div.firstChild.getAttribute("href") === "#" ; 2678}) ) { 2679 addHandle( "type|href|height|width", function( elem, name, isXML ) { 2680 if ( !isXML ) { 2681 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); 2682 } 2683 }); 2684} 2685 2686// Support: IE<9 2687// Use defaultValue in place of getAttribute("value") 2688if ( !support.attributes || !assert(function( div ) { 2689 div.innerHTML = "<input/>"; 2690 div.firstChild.setAttribute( "value", "" ); 2691 return div.firstChild.getAttribute( "value" ) === ""; 2692}) ) { 2693 addHandle( "value", function( elem, name, isXML ) { 2694 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { 2695 return elem.defaultValue; 2696 } 2697 }); 2698} 2699 2700// Support: IE<9 2701// Use getAttributeNode to fetch booleans when getAttribute lies 2702if ( !assert(function( div ) { 2703 return div.getAttribute("disabled") == null; 2704}) ) { 2705 addHandle( booleans, function( elem, name, isXML ) { 2706 var val; 2707 if ( !isXML ) { 2708 return elem[ name ] === true ? name.toLowerCase() : 2709 (val = elem.getAttributeNode( name )) && val.specified ? 2710 val.value : 2711 null; 2712 } 2713 }); 2714} 2715 2716return Sizzle; 2717 2718})( window ); 2719 2720 2721 2722jQuery.find = Sizzle; 2723jQuery.expr = Sizzle.selectors; 2724jQuery.expr[ ":" ] = jQuery.expr.pseudos; 2725jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 2726jQuery.text = Sizzle.getText; 2727jQuery.isXMLDoc = Sizzle.isXML; 2728jQuery.contains = Sizzle.contains; 2729 2730 2731 2732var dir = function( elem, dir, until ) { 2733 var matched = [], 2734 truncate = until !== undefined; 2735 2736 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 2737 if ( elem.nodeType === 1 ) { 2738 if ( truncate && jQuery( elem ).is( until ) ) { 2739 break; 2740 } 2741 matched.push( elem ); 2742 } 2743 } 2744 return matched; 2745}; 2746 2747 2748var siblings = function( n, elem ) { 2749 var matched = []; 2750 2751 for ( ; n; n = n.nextSibling ) { 2752 if ( n.nodeType === 1 && n !== elem ) { 2753 matched.push( n ); 2754 } 2755 } 2756 2757 return matched; 2758}; 2759 2760 2761var rneedsContext = jQuery.expr.match.needsContext; 2762 2763var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); 2764 2765 2766 2767var risSimple = /^.[^:#\[\.,]*$/; 2768 2769// Implement the identical functionality for filter and not 2770function winnow( elements, qualifier, not ) { 2771 if ( jQuery.isFunction( qualifier ) ) { 2772 return jQuery.grep( elements, function( elem, i ) { 2773 /* jshint -W018 */ 2774 return !!qualifier.call( elem, i, elem ) !== not; 2775 } ); 2776 2777 } 2778 2779 if ( qualifier.nodeType ) { 2780 return jQuery.grep( elements, function( elem ) { 2781 return ( elem === qualifier ) !== not; 2782 } ); 2783 2784 } 2785 2786 if ( typeof qualifier === "string" ) { 2787 if ( risSimple.test( qualifier ) ) { 2788 return jQuery.filter( qualifier, elements, not ); 2789 } 2790 2791 qualifier = jQuery.filter( qualifier, elements ); 2792 } 2793 2794 return jQuery.grep( elements, function( elem ) { 2795 return (
2795jQuery.inArray( elem, qualifier ) > -1 ) !== not; 2796 } ); 2797} 2798 2799jQuery.filter = function( expr, elems, not ) { 2800 var elem = elems[ 0 ]; 2801 2802 if ( not ) { 2803 expr = ":not(" + expr + ")"; 2804 } 2805 2806 return elems.length === 1 && elem.nodeType === 1 ? 2807 jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : 2808 jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 2809 return elem.nodeType === 1; 2810 } ) ); 2811}; 2812 2813jQuery.fn.extend( { 2814 find: function( selector ) { 2815 var i, 2816 ret = [], 2817 self = this, 2818 len = self.length; 2819 2820 if ( typeof selector !== "string" ) {
vendor: 5,394 bytes, lines 2821-3023
2821 return this.pushStack( jQuery( selector ).filter( function() { 2822 for ( i = 0; i < len; i++ ) { 2823 if ( jQuery.contains( self[ i ], this ) ) { 2824 return true; 2825 } 2826 } 2827 } ) ); 2828 } 2829 2830 for ( i = 0; i < len; i++ ) { 2831 jQuery.find( selector, self[ i ], ret ); 2832 } 2833 2834 // Needed because $( selector, context ) becomes $( context ).find( selector ) 2835 ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); 2836 ret.selector = this.selector ? this.selector + " " + selector : selector; 2837 return ret; 2838 }, 2839 filter: function( selector ) { 2840 return this.pushStack( winnow( this, selector || [], false ) ); 2841 }, 2842 not: function( selector ) { 2843 return this.pushStack( winnow( this, selector || [], true ) ); 2844 }, 2845 is: function( selector ) { 2846 return !!winnow( 2847 this, 2848 2849 // If this is a positional/relative selector, check membership in the returned set 2850 // so $("p:first").is("p:last") won't return true for a doc with two "p". 2851 typeof selector === "string" && rneedsContext.test( selector ) ? 2852 jQuery( selector ) : 2853 selector || [], 2854 false 2855 ).length; 2856 } 2857} ); 2858 2859 2860// Initialize a jQuery object 2861 2862 2863// A central reference to the root jQuery(document) 2864var rootjQuery, 2865 2866 // A simple way to check for HTML strings 2867 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 2868 // Strict HTML recognition (#11290: must start with <) 2869 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, 2870 2871 init = jQuery.fn.init = function( selector, context, root ) { 2872 var match, elem; 2873 2874 // HANDLE: $(""), $(null), $(undefined), $(false) 2875 if ( !selector ) { 2876 return this; 2877 } 2878 2879 // init accepts an alternate rootjQuery 2880 // so migrate can support jQuery.sub (gh-2101) 2881 root = root || rootjQuery; 2882 2883 // Handle HTML strings 2884 if ( typeof selector === "string" ) { 2885 if ( selector.charAt( 0 ) === "<" && 2886 selector.charAt( selector.length - 1 ) === ">" && 2887 selector.length >= 3 ) { 2888 2889 // Assume that strings that start and end with <> are HTML and skip the regex check 2890 match = [ null, selector, null ]; 2891 2892 } else { 2893 match = rquickExpr.exec( selector ); 2894 } 2895 2896 // Match html or make sure no context is specified for #id 2897 if ( match && ( match[ 1 ] || !context ) ) { 2898 2899 // HANDLE: $(html) -> $(array) 2900 if ( match[ 1 ] ) { 2901 context = context instanceof jQuery ? context[ 0 ] : context; 2902 2903 // scripts is true for back-compat 2904 // Intentionally let the error be thrown if parseHTML is not present 2905 jQuery.merge( this, jQuery.parseHTML( 2906 match[ 1 ], 2907 context && context.nodeType ? context.ownerDocument || context : document, 2908 true 2909 ) ); 2910 2911 // HANDLE: $(html, props) 2912 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 2913 for ( match in context ) { 2914 2915 // Properties of context are called as methods if possible 2916 if ( jQuery.isFunction( this[ match ] ) ) { 2917 this[ match ]( context[ match ] ); 2918 2919 // ...and otherwise set as attributes 2920 } else { 2921 this.attr( match, context[ match ] ); 2922 } 2923 } 2924 } 2925 2926 return this; 2927 2928 // HANDLE: $(#id) 2929 } else { 2930 elem = document.getElementById( match[ 2 ] ); 2931 2932 // Check parentNode to catch when Blackberry 4.6 returns 2933 // nodes that are no longer in the document #6963 2934 if ( elem && elem.parentNode ) { 2935 2936 // Handle the case where IE and Opera return items 2937 // by name instead of ID 2938 if ( elem.id !== match[ 2 ] ) { 2939 return rootjQuery.find( selector ); 2940 } 2941 2942 // Otherwise, we inject the element directly into the jQuery object 2943 this.length = 1; 2944 this[ 0 ] = elem; 2945 } 2946 2947 this.context = document; 2948 this.selector = selector; 2949 return this; 2950 } 2951 2952 // HANDLE: $(expr, $(...)) 2953 } else if ( !context || context.jquery ) { 2954 return ( context || root ).find( selector ); 2955 2956 // HANDLE: $(expr, context) 2957 // (which is just equivalent to: $(context).find(expr) 2958 } else { 2959 return this.constructor( context ).find( selector ); 2960 } 2961 2962 // HANDLE: $(DOMElement) 2963 } else if ( selector.nodeType ) { 2964 this.context = this[ 0 ] = selector; 2965 this.length = 1; 2966 return this; 2967 2968 // HANDLE: $(function) 2969 // Shortcut for document ready 2970 } else if ( jQuery.isFunction( selector ) ) { 2971 return typeof root.ready !== "undefined" ? 2972 root.ready( selector ) : 2973 2974 // Execute immediately if ready is not present 2975 selector( jQuery ); 2976 } 2977 2978 if ( selector.selector !== undefined ) { 2979 this.selector = selector.selector; 2980 this.context = selector.context; 2981 } 2982 2983 return jQuery.makeArray( selector, this ); 2984 }; 2985 2986// Give the init function the jQuery prototype for later instantiation 2987init.prototype = jQuery.fn; 2988 2989// Initialize central reference 2990rootjQuery = jQuery( document ); 2991 2992 2993var rparentsprev = /^(?:parents|prev(?:Until|All))/, 2994 2995 // methods guaranteed to produce a unique set when starting from a unique set 2996 guaranteedUnique = { 2997 children: true, 2998 contents: true, 2999 next: true, 3000 prev: true 3001 }; 3002 3003jQuery.fn.extend( { 3004 has: function( target ) { 3005 var i, 3006 targets = jQuery( target, this ), 3007 len = targets.length; 3008 3009 return this.filter( function() { 3010 for ( i = 0; i < len; i++ ) { 3011 if ( jQuery.contains( this, targets[ i ] ) ) { 3012 return true; 3013 } 3014 } 3015 } ); 3016 }, 3017 3018 closest: function( selectors, context ) { 3019 var cur, 3020 i = 0, 3021 l = this.length, 3022 matched = [], 3023 pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
vendor: 12,881 bytes, lines 3024-3532
3024 jQuery( selectors, context || this.context ) : 3025 0; 3026 3027 for ( ; i < l; i++ ) { 3028 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 3029 3030 // Always skip document fragments 3031 if ( cur.nodeType < 11 && ( pos ? 3032 pos.index( cur ) > -1 : 3033 3034 // Don't pass non-elements to Sizzle 3035 cur.nodeType === 1 && 3036 jQuery.find.matchesSelector( cur, selectors ) ) ) { 3037 3038 matched.push( cur ); 3039 break; 3040 } 3041 } 3042 } 3043 3044 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 3045 }, 3046 3047 // Determine the position of an element within 3048 // the matched set of elements 3049 index: function( elem ) { 3050 3051 // No argument, return index in parent 3052 if ( !elem ) { 3053 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 3054 } 3055 3056 // index in selector 3057 if ( typeof elem === "string" ) { 3058 return jQuery.inArray( this[ 0 ], jQuery( elem ) ); 3059 } 3060 3061 // Locate the position of the desired element 3062 return jQuery.inArray( 3063 3064 // If it receives a jQuery object, the first element is used 3065 elem.jquery ? elem[ 0 ] : elem, this ); 3066 }, 3067 3068 add: function( selector, context ) { 3069 return this.pushStack( 3070 jQuery.uniqueSort( 3071 jQuery.merge( this.get(), jQuery( selector, context ) ) 3072 ) 3073 ); 3074 }, 3075 3076 addBack: function( selector ) { 3077 return this.add( selector == null ? 3078 this.prevObject : this.prevObject.filter( selector ) 3079 ); 3080 } 3081} ); 3082 3083function sibling( cur, dir ) { 3084 do { 3085 cur = cur[ dir ]; 3086 } while ( cur && cur.nodeType !== 1 ); 3087 3088 return cur; 3089} 3090 3091jQuery.each( { 3092 parent: function( elem ) { 3093 var parent = elem.parentNode; 3094 return parent && parent.nodeType !== 11 ? parent : null; 3095 }, 3096 parents: function( elem ) { 3097 return dir( elem, "parentNode" ); 3098 }, 3099 parentsUntil: function( elem, i, until ) { 3100 return dir( elem, "parentNode", until ); 3101 }, 3102 next: function( elem ) { 3103 return sibling( elem, "nextSibling" ); 3104 }, 3105 prev: function( elem ) { 3106 return sibling( elem, "previousSibling" ); 3107 }, 3108 nextAll: function( elem ) { 3109 return dir( elem, "nextSibling" ); 3110 }, 3111 prevAll: function( elem ) { 3112 return dir( elem, "previousSibling" ); 3113 }, 3114 nextUntil: function( elem, i, until ) { 3115 return dir( elem, "nextSibling", until ); 3116 }, 3117 prevUntil: function( elem, i, until ) { 3118 return dir( elem, "previousSibling", until ); 3119 }, 3120 siblings: function( elem ) { 3121 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 3122 }, 3123 children: function( elem ) { 3124 return siblings( elem.firstChild ); 3125 }, 3126 contents: function( elem ) { 3127 return jQuery.nodeName( elem, "iframe" ) ? 3128 elem.contentDocument || elem.contentWindow.document : 3129 jQuery.merge( [], elem.childNodes ); 3130 } 3131}, function( name, fn ) { 3132 jQuery.fn[ name ] = function( until, selector ) { 3133 var ret = jQuery.map( this, fn, until ); 3134 3135 if ( name.slice( -5 ) !== "Until" ) { 3136 selector = until; 3137 } 3138 3139 if ( selector && typeof selector === "string" ) { 3140 ret = jQuery.filter( selector, ret ); 3141 } 3142 3143 if ( this.length > 1 ) { 3144 3145 // Remove duplicates 3146 if ( !guaranteedUnique[ name ] ) { 3147 ret = jQuery.uniqueSort( ret ); 3148 } 3149 3150 // Reverse order for parents* and prev-derivatives 3151 if ( rparentsprev.test( name ) ) { 3152 ret = ret.reverse(); 3153 } 3154 } 3155 3156 return this.pushStack( ret ); 3157 }; 3158} ); 3159var rnotwhite = ( /\S+/g ); 3160 3161 3162 3163// Convert String-formatted options into Object-formatted ones 3164function createOptions( options ) { 3165 var object = {}; 3166 jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { 3167 object[ flag ] = true; 3168 } ); 3169 return object; 3170} 3171 3172/* 3173 * Create a callback list using the following parameters: 3174 * 3175 * options: an optional list of space-separated options that will change how 3176 * the callback list behaves or a more traditional option object 3177 * 3178 * By default a callback list will act like an event callback list and can be 3179 * "fired" multiple times. 3180 * 3181 * Possible options: 3182 * 3183 * once: will ensure the callback list can only be fired once (like a Deferred) 3184 * 3185 * memory: will keep track of previous values and will call any callback added 3186 * after the list has been fired right away with the latest "memorized" 3187 * values (like a Deferred) 3188 * 3189 * unique: will ensure a callback can only be added once (no duplicate in the list) 3190 * 3191 * stopOnFalse: interrupt callings when a callback returns false 3192 * 3193 */ 3194jQuery.Callbacks = function( options ) { 3195 3196 // Convert options from String-formatted to Object-formatted if needed 3197 // (we check in cache first) 3198 options = typeof options === "string" ? 3199 createOptions( options ) : 3200 jQuery.extend( {}, options ); 3201 3202 var // Flag to know if list is currently firing 3203 firing, 3204 3205 // Last fire value for non-forgettable lists 3206 memory, 3207 3208 // Flag to know if list was already fired 3209 fired, 3210 3211 // Flag to prevent firing 3212 locked, 3213 3214 // Actual callback list 3215 list = [], 3216 3217 // Queue of execution data for repeatable lists 3218 queue = [], 3219 3220 // Index of currently firing callback (modified by add/remove as needed) 3221 firingIndex = -1, 3222 3223 // Fire callbacks 3224 fire = function() { 3225 3226 // Enforce single-firing 3227 locked = options.once; 3228 3229 // Execute callbacks for all pending executions, 3230 // respecting firingIndex overrides and runtime changes 3231 fired = firing = true; 3232 for ( ; queue.length; firingIndex = -1 ) { 3233 memory = queue.shift(); 3234 while ( ++firingIndex < list.length ) { 3235 3236 // Run callback and check for early termination 3237 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 3238 options.stopOnFalse ) { 3239 3240 // Jump to end and forget the data so .add doesn't re-fire 3241 firingIndex = list.length; 3242 memory = false; 3243 } 3244 } 3245 } 3246 3247 // Forget the data if we're done with it 3248 if ( !options.memory ) { 3249 memory = false; 3250 } 3251 3252 firing = false; 3253 3254 // Clean up if we're done firing for good 3255 if ( locked ) { 3256 3257 // Keep an empty list if we have data for future add calls 3258 if ( memory ) { 3259 list = []; 3260 3261 // Otherwise, this object is spent 3262 } else { 3263 list = ""; 3264 } 3265 } 3266 }, 3267 3268 // Actual Callbacks object 3269 self = { 3270 3271 // Add a callback or a collection of callbacks to the list 3272 add: function() { 3273 if ( list ) { 3274 3275 // If we have memory from a past run, we should fire after adding 3276 if ( memory && !firing ) { 3277 firingIndex = list.length - 1; 3278 queue.push( memory ); 3279 } 3280 3281 ( function add( args ) { 3282 jQuery.each( args, function( _, arg ) { 3283 if ( jQuery.isFunction( arg ) ) { 3284 if ( !options.unique || !self.has( arg ) ) { 3285 list.push( arg ); 3286 } 3287 } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { 3288 3289 // Inspect recursively 3290 add( arg ); 3291 } 3292 } ); 3293 } )( arguments ); 3294 3295 if ( memory && !firing ) { 3296 fire(); 3297 } 3298 } 3299 return this; 3300 }, 3301 3302 // Remove a callback from the list 3303 remove: function() { 3304 jQuery.each( arguments, function( _, arg ) { 3305 var index; 3306 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 3307 list.splice( index, 1 ); 3308 3309 // Handle firing indexes 3310 if ( index <= firingIndex ) { 3311 firingIndex--; 3312 } 3313 } 3314 } ); 3315 return this; 3316 }, 3317 3318 // Check if a given callback is in the list. 3319 // If no argument is given, return whether or not list has callbacks attached. 3320 has: function( fn ) { 3321 return fn ? 3322 jQuery.inArray( fn, list ) > -1 : 3323 list.length > 0; 3324 }, 3325 3326 // Remove all callbacks from the list 3327 empty: function() { 3328 if ( list ) { 3329 list = []; 3330 } 3331 return this; 3332 }, 3333 3334 // Disable .fire and .add 3335 // Abort any current/pending executions 3336 // Clear all callbacks and values 3337 disable: function() { 3338 locked = queue = []; 3339 list = memory = ""; 3340 return this; 3341 }, 3342 disabled: function() { 3343 return !list; 3344 }, 3345 3346 // Disable .fire 3347 // Also disable .add unless we have memory (since it would have no effect) 3348 // Abort any pending executions 3349 lock: function() { 3350 locked = true; 3351 if ( !memory ) { 3352 self.disable(); 3353 } 3354 return this; 3355 }, 3356 locked: function() { 3357 return !!locked; 3358 }, 3359 3360 // Call all callbacks with the given context and arguments 3361 fireWith: function( context, args ) { 3362 if ( !locked ) { 3363 args = args || []; 3364 args = [ context, args.slice ? args.slice() : args ]; 3365 queue.push( args ); 3366 if ( !firing ) { 3367 fire(); 3368 } 3369 } 3370 return this; 3371 }, 3372 3373 // Call all the callbacks with the given arguments 3374 fire: function() { 3375 self.fireWith( this, arguments ); 3376 return this; 3377 }, 3378 3379 // To know if the callbacks have already been called at least once 3380 fired: function() { 3381 return !!fired; 3382 } 3383 }; 3384 3385 return self; 3386}; 3387 3388 3389jQuery.extend( { 3390 3391 Deferred: function( func ) { 3392 var tuples = [ 3393 3394 // action, add listener, listener list, final state 3395 [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], 3396 [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], 3397 [ "notify", "progress", jQuery.Callbacks( "memory" ) ] 3398 ], 3399 state = "pending", 3400 promise = { 3401 state: function() { 3402 return state; 3403 }, 3404 always: function() { 3405 deferred.done( arguments ).fail( arguments ); 3406 return this; 3407 }, 3408 then: function( /* fnDone, fnFail, fnProgress */ ) { 3409 var fns = arguments; 3410 return jQuery.Deferred( function( newDefer ) { 3411 jQuery.each( tuples, function( i, tuple ) { 3412 var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; 3413 3414 // deferred[ done | fail | progress ] for forwarding actions to newDefer 3415 deferred[ tuple[ 1 ] ]( function() { 3416 var returned = fn && fn.apply( this, arguments ); 3417 if ( returned && jQuery.isFunction( returned.promise ) ) { 3418 returned.promise() 3419 .progress( newDefer.notify ) 3420 .done( newDefer.resolve ) 3421 .fail( newDefer.reject ); 3422 } else { 3423 newDefer[ tuple[ 0 ] + "With" ]( 3424 this === promise ? newDefer.promise() : this, 3425 fn ? [ returned ] : arguments 3426 ); 3427 } 3428 } ); 3429 } ); 3430 fns = null; 3431 } ).promise(); 3432 }, 3433 3434 // Get a promise for this deferred 3435 // If obj is provided, the promise aspect is added to the object 3436 promise: function( obj ) { 3437 return obj != null ? jQuery.extend( obj, promise ) : promise; 3438 } 3439 }, 3440 deferred = {}; 3441 3442 // Keep pipe for back-compat 3443 promise.pipe = promise.then; 3444 3445 // Add list-specific methods 3446 jQuery.each( tuples, function( i, tuple ) { 3447 var list = tuple[ 2 ], 3448 stateString = tuple[ 3 ]; 3449 3450 // promise[ done | fail | progress ] = list.add 3451 promise[ tuple[ 1 ] ] = list.add; 3452 3453 // Handle state 3454 if ( stateString ) { 3455 list.add( function() { 3456 3457 // state = [ resolved | rejected ] 3458 state = stateString; 3459 3460 // [ reject_list | resolve_list ].disable; progress_list.lock 3461 }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); 3462 } 3463 3464 // deferred[ resolve | reject | notify ] 3465 deferred[ tuple[ 0 ] ] = function() { 3466 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); 3467 return this; 3468 }; 3469 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 3470 } ); 3471 3472 // Make the deferred a promise 3473 promise.promise( deferred ); 3474 3475 // Call given func if any 3476 if ( func ) { 3477 func.call( deferred, deferred ); 3478 } 3479 3480 // All done! 3481 return deferred; 3482 }, 3483 3484 // Deferred helper 3485 when: function( subordinate /* , ..., subordinateN */ ) { 3486 var i = 0, 3487 resolveValues = slice.call( arguments ), 3488 length = resolveValues.length, 3489 3490 // the count of uncompleted subordinates 3491 remaining = length !== 1 || 3492 ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, 3493 3494 // the master Deferred. 3495 // If resolveValues consist of only a single Deferred, just use that. 3496 deferred = remaining === 1 ? subordinate : jQuery.Deferred(), 3497 3498 // Update function for both resolve and progress values 3499 updateFunc = function( i, contexts, values ) { 3500 return function( value ) { 3501 contexts[ i ] = this; 3502 values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 3503 if ( values === progressValues ) { 3504 deferred.notifyWith( contexts, values ); 3505 3506 } else if ( !( --remaining ) ) { 3507 deferred.resolveWith( contexts, values ); 3508 } 3509 }; 3510 }, 3511 3512 progressValues, progressContexts, resolveContexts; 3513 3514 // add listeners to Deferred subordinates; treat others as resolved 3515 if ( length > 1 ) { 3516 progressValues = new Array( length ); 3517 progressContexts = new Array( length ); 3518 resolveContexts = new Array( length ); 3519 for ( ; i < length; i++ ) { 3520 if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { 3521 resolveValues[ i ].promise() 3522 .progress( updateFunc( i, progressContexts, progressValues ) ) 3523 .done( updateFunc( i, resolveContexts, resolveValues ) ) 3524 .fail( deferred.reject ); 3525 } else { 3526 --remaining; 3527 } 3528 } 3529 } 3530 3531 // if we're not waiting on anything, resolve the master 3532 if ( !remaining ) {
vendor: 2,149 bytes, lines 3533-3632
3533 deferred.resolveWith( resolveContexts, resolveValues ); 3534 } 3535 3536 return deferred.promise(); 3537 } 3538} ); 3539 3540 3541// The deferred used on DOM ready 3542var readyList; 3543 3544jQuery.fn.ready = function( fn ) { 3545 3546 // Add the callback 3547 jQuery.ready.promise().done( fn ); 3548 3549 return this; 3550}; 3551 3552jQuery.extend( { 3553 3554 // Is the DOM ready to be used? Set to true once it occurs. 3555 isReady: false, 3556 3557 // A counter to track how many items to wait for before 3558 // the ready event fires. See #6781 3559 readyWait: 1, 3560 3561 // Hold (or release) the ready event 3562 holdReady: function( hold ) { 3563 if ( hold ) { 3564 jQuery.readyWait++; 3565 } else { 3566 jQuery.ready( true ); 3567 } 3568 }, 3569 3570 // Handle when the DOM is ready 3571 ready: function( wait ) { 3572 3573 // Abort if there are pending holds or we're already ready 3574 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 3575 return; 3576 } 3577 3578 // Remember that the DOM is ready 3579 jQuery.isReady = true; 3580 3581 // If a normal DOM Ready event fired, decrement, and wait if need be 3582 if ( wait !== true && --jQuery.readyWait > 0 ) { 3583 return; 3584 } 3585 3586 // If there are functions bound, to execute 3587 readyList.resolveWith( document, [ jQuery ] ); 3588 3589 // Trigger any bound ready events 3590 if ( jQuery.fn.triggerHandler ) { 3591 jQuery( document ).triggerHandler( "ready" ); 3592 jQuery( document ).off( "ready" ); 3593 } 3594 } 3595} ); 3596 3597/** 3598 * Clean-up method for dom ready events 3599 */ 3600function detach() { 3601 if ( document.addEventListener ) { 3602 document.removeEventListener( "DOMContentLoaded", completed ); 3603 window.removeEventListener( "load", completed ); 3604 3605 } else { 3606 document.detachEvent( "onreadystatechange", completed ); 3607 window.detachEvent( "onload", completed ); 3608 } 3609} 3610 3611/** 3612 * The ready event handler and self cleanup method 3613 */ 3614function completed() { 3615 3616 // readyState === "complete" is good enough for us to call the dom ready in oldIE 3617 if ( document.addEventListener || 3618 window.event.type === "load" || 3619 document.readyState === "complete" ) { 3620 3621 detach(); 3622 jQuery.ready(); 3623 } 3624} 3625 3626jQuery.ready.promise = function( obj ) { 3627 if ( !readyList ) { 3628 3629 readyList = jQuery.Deferred(); 3630 3631 // Catch cases where $(document).ready() is called 3632 // after the browser event has already occurred.
3633 // Support: IE6-10 3634 // Older IE sometimes signals "interactive" too soon 3635 if ( document.readyState === "complete" || 3636 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 3637 3638 // Handle it asynchronously to allow scripts the opportunity to delay ready 3639 window.setTimeout( jQuery.ready ); 3640 3641 // Standards-based browsers support DOMContentLoaded 3642 } else if ( document.addEventListener ) { 3643 3644 // Use the handy event callback 3645 document.addEventListener( "DOMContentLoaded", completed ); 3646 3647 // A fallback to window.onload, that will always work 3648 window.addEventListener( "load", completed ); 3649 3650 // If IE event model is used 3651 } else { 3652 3653 // Ensure firing before onload, maybe late but safe also for iframes 3654 document.attachEvent( "onreadystatechange", completed ); 3655 3656 // A fallback to window.onload, that will always work 3657 window.attachEvent( "onload", completed ); 3658 3659 // If IE and not a frame 3660 // continually check to see if the document is ready 3661 var top = false; 3662 3663 try { 3664 top = window.frameElement == null && document.documentElement; 3665 } catch ( e ) {} 3666 3667 if ( top && top.doScroll ) { 3668 ( function doScrollCheck() { 3669 if ( !jQuery.isReady ) { 3670 3671 try { 3672 3673 // Use the trick by Diego Perini 3674 // http://javascript.nwbox.com/IEContentLoaded/ 3675 top.doScroll( "left" ); 3676 } catch ( e ) { 3677 return window.setTimeout( doScrollCheck, 50 ); 3678 } 3679 3680 // detach all dom ready events 3681 detach(); 3682 3683 // and execute any waiting functions 3684 jQuery.ready(); 3685 } 3686 } )(); 3687 } 3688 } 3689 } 3690 return readyList.promise( obj ); 3691}; 3692 3693// Kick off the DOM ready check even if the user does not 3694jQuery.ready.promise(); 3695 3696 3697 3698 3699// Support: IE<9 3700// Iteration over object's inherited properties before its own 3701var i; 3702for ( i in jQuery( support ) ) { 3703 break; 3704} 3705support.ownFirst = i === "0"; 3706 3707// Note: most support tests are defined in their respective modules. 3708// false until the test is run 3709support.inlineBlockNeedsLayout = false; 3710 3711// Execute ASAP in case we need to set body.style.zoom 3712jQuery( function() { 3713 3714 // Minified: var a,b,c,d 3715 var val, div, body, container; 3716 3717 body = document.getElementsByTagName( "body" )[ 0 ]; 3718 if ( !body || !body.style ) { 3719 3720 // Return for frameset docs that don't have a body 3721 return; 3722 } 3723 3724 // Setup 3725 div = document.createElement( "div" ); 3726 container = document.createElement( "div" ); 3727 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; 3728 body.appendChild( container ).appendChild( div ); 3729 3730 if ( typeof div.style.zoom !== "undefined" ) { 3731 3732 // Support: IE<8 3733 // Check if natively block-level elements act like inline-block 3734 // elements when setting their display to 'inline' and giving 3735 // them layout 3736 div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; 3737 3738 support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; 3739 if ( val ) { 3740 3741 // Prevent IE 6 from affecting layout for positioned elements #11048 3742 // Prevent IE from shrinking the body in IE 7 mode #12869 3743 // Support: IE<8 3744 body.style.zoom = 1; 3745 } 3746 } 3747 3748 body.removeChild( container ); 3749} ); 3750 3751 3752( function() { 3753 var div = document.createElement( "div" ); 3754 3755 // Support: IE<9 3756 support.deleteExpando = true; 3757 try { 3758 delete div.test; 3759 } catch ( e ) { 3760 support.deleteExpando = false; 3761 } 3762 3763 // Null elements to avoid leaks in IE. 3764 div = null; 3765} )(); 3766var acceptData = function( elem ) { 3767 var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], 3768 nodeType = +elem.nodeType || 1; 3769 3770 // Do not set data on non-element DOM nodes because it will not be cleared (#8335). 3771 return nodeType !== 1 && nodeType !== 9 ? 3772 false : 3773 3774 // Nodes accept data unless otherwise specified; rejection can be conditional 3775 !noData || noData !== true && elem.getAttribute( "classid" ) === noData; 3776}; 3777 3778 3779 3780 3781var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 3782 rmultiDash = /([A-Z])/g; 3783 3784function dataAttr( elem, key, data ) { 3785 3786 // If nothing was found internally, try to fetch any 3787 // data from the HTML5 data-* attribute 3788 if ( data === undefined && elem.nodeType === 1 ) { 3789 3790 var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); 3791 3792 data = elem.getAttribute( name ); 3793 3794 if ( typeof data === "string" ) { 3795 try { 3796 data = data === "true" ? true :
vendor: 11,186 bytes, lines 3797-4261
3797 data === "false" ? false : 3798 data === "null" ? null : 3799 3800 // Only convert to a number if it doesn't change the string 3801 +data + "" === data ? +data : 3802 rbrace.test( data ) ? jQuery.parseJSON( data ) : 3803 data; 3804 } catch ( e ) {} 3805 3806 // Make sure we set the data so it isn't changed later 3807 jQuery.data( elem, key, data ); 3808 3809 } else { 3810 data = undefined; 3811 } 3812 } 3813 3814 return data; 3815} 3816 3817// checks a cache object for emptiness 3818function isEmptyDataObject( obj ) { 3819 var name; 3820 for ( name in obj ) { 3821 3822 // if the public data object is empty, the private is still empty 3823 if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { 3824 continue; 3825 } 3826 if ( name !== "toJSON" ) { 3827 return false; 3828 } 3829 } 3830 3831 return true; 3832} 3833 3834function internalData( elem, name, data, pvt /* Internal Use Only */ ) { 3835 if ( !acceptData( elem ) ) { 3836 return; 3837 } 3838 3839 var ret, thisCache, 3840 internalKey = jQuery.expando, 3841 3842 // We have to handle DOM nodes and JS objects differently because IE6-7 3843 // can't GC object references properly across the DOM-JS boundary 3844 isNode = elem.nodeType, 3845 3846 // Only DOM nodes need the global jQuery cache; JS object data is 3847 // attached directly to the object so GC can occur automatically 3848 cache = isNode ? jQuery.cache : elem, 3849 3850 // Only defining an ID for JS objects if its cache already exists allows 3851 // the code to shortcut on the same path as a DOM node with no cache 3852 id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; 3853 3854 // Avoid doing any more work than we need to when trying to get data on an 3855 // object that has no data at all 3856 if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && 3857 data === undefined && typeof name === "string" ) { 3858 return; 3859 } 3860 3861 if ( !id ) { 3862 3863 // Only DOM nodes need a new unique ID for each element since their data 3864 // ends up in the global cache 3865 if ( isNode ) { 3866 id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; 3867 } else { 3868 id = internalKey; 3869 } 3870 } 3871 3872 if ( !cache[ id ] ) { 3873 3874 // Avoid exposing jQuery metadata on plain JS objects when the object 3875 // is serialized using JSON.stringify 3876 cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; 3877 } 3878 3879 // An object can be passed to jQuery.data instead of a key/value pair; this gets 3880 // shallow copied over onto the existing cache 3881 if ( typeof name === "object" || typeof name === "function" ) { 3882 if ( pvt ) { 3883 cache[ id ] = jQuery.extend( cache[ id ], name ); 3884 } else { 3885 cache[ id ].data = jQuery.extend( cache[ id ].data, name ); 3886 } 3887 } 3888 3889 thisCache = cache[ id ]; 3890 3891 // jQuery data() is stored in a separate object inside the object's internal data 3892 // cache in order to avoid key collisions between internal data and user-defined 3893 // data. 3894 if ( !pvt ) { 3895 if ( !thisCache.data ) { 3896 thisCache.data = {}; 3897 } 3898 3899 thisCache = thisCache.data; 3900 } 3901 3902 if ( data !== undefined ) { 3903 thisCache[ jQuery.camelCase( name ) ] = data; 3904 } 3905 3906 // Check for both converted-to-camel and non-converted data property names 3907 // If a data property was specified 3908 if ( typeof name === "string" ) { 3909 3910 // First Try to find as-is property data 3911 ret = thisCache[ name ]; 3912 3913 // Test for null|undefined property data 3914 if ( ret == null ) { 3915 3916 // Try to find the camelCased property 3917 ret = thisCache[ jQuery.camelCase( name ) ]; 3918 } 3919 } else { 3920 ret = thisCache; 3921 } 3922 3923 return ret; 3924} 3925 3926function internalRemoveData( elem, name, pvt ) { 3927 if ( !acceptData( elem ) ) { 3928 return; 3929 } 3930 3931 var thisCache, i, 3932 isNode = elem.nodeType, 3933 3934 // See jQuery.data for more information 3935 cache = isNode ? jQuery.cache : elem, 3936 id = isNode ? elem[ jQuery.expando ] : jQuery.expando; 3937 3938 // If there is already no cache entry for this object, there is no 3939 // purpose in continuing 3940 if ( !cache[ id ] ) { 3941 return; 3942 } 3943 3944 if ( name ) { 3945 3946 thisCache = pvt ? cache[ id ] : cache[ id ].data; 3947 3948 if ( thisCache ) { 3949 3950 // Support array or space separated string names for data keys 3951 if ( !jQuery.isArray( name ) ) { 3952 3953 // try the string as a key before any manipulation 3954 if ( name in thisCache ) { 3955 name = [ name ]; 3956 } else { 3957 3958 // split the camel cased version by spaces unless a key with the spaces exists 3959 name = jQuery.camelCase( name ); 3960 if ( name in thisCache ) { 3961 name = [ name ]; 3962 } else { 3963 name = name.split( " " ); 3964 } 3965 } 3966 } else { 3967 3968 // If "name" is an array of keys... 3969 // When data is initially created, via ("key", "val") signature, 3970 // keys will be converted to camelCase. 3971 // Since there is no way to tell _how_ a key was added, remove 3972 // both plain key and camelCase key. #12786 3973 // This will only penalize the array argument path. 3974 name = name.concat( jQuery.map( name, jQuery.camelCase ) ); 3975 } 3976 3977 i = name.length; 3978 while ( i-- ) { 3979 delete thisCache[ name[ i ] ]; 3980 } 3981 3982 // If there is no data left in the cache, we want to continue 3983 // and let the cache object itself get destroyed 3984 if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { 3985 return; 3986 } 3987 } 3988 } 3989 3990 // See jQuery.data for more information 3991 if ( !pvt ) { 3992 delete cache[ id ].data; 3993 3994 // Don't destroy the parent cache unless the internal data object 3995 // had been the only thing left in it 3996 if ( !isEmptyDataObject( cache[ id ] ) ) { 3997 return; 3998 } 3999 } 4000 4001 // Destroy the cache 4002 if ( isNode ) { 4003 jQuery.cleanData( [ elem ], true ); 4004 4005 // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) 4006 /* jshint eqeqeq: false */ 4007 } else if ( support.deleteExpando || cache != cache.window ) { 4008 /* jshint eqeqeq: true */ 4009 delete cache[ id ]; 4010 4011 // When all else fails, undefined 4012 } else { 4013 cache[ id ] = undefined; 4014 } 4015} 4016 4017jQuery.extend( { 4018 cache: {}, 4019 4020 // The following elements (space-suffixed to avoid Object.prototype collisions) 4021 // throw uncatchable exceptions if you attempt to set expando properties 4022 noData: { 4023 "applet ": true, 4024 "embed ": true, 4025 4026 // ...but Flash objects (which have this classid) *can* handle expandos 4027 "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" 4028 }, 4029 4030 hasData: function( elem ) { 4031 elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; 4032 return !!elem && !isEmptyDataObject( elem ); 4033 }, 4034 4035 data: function( elem, name, data ) { 4036 return internalData( elem, name, data ); 4037 }, 4038 4039 removeData: function( elem, name ) { 4040 return internalRemoveData( elem, name ); 4041 }, 4042 4043 // For internal use only. 4044 _data: function( elem, name, data ) { 4045 return internalData( elem, name, data, true ); 4046 }, 4047 4048 _removeData: function( elem, name ) { 4049 return internalRemoveData( elem, name, true ); 4050 } 4051} ); 4052 4053jQuery.fn.extend( { 4054 data: function( key, value ) { 4055 var i, name, data, 4056 elem = this[ 0 ], 4057 attrs = elem && elem.attributes; 4058 4059 // Special expections of .data basically thwart jQuery.access, 4060 // so implement the relevant behavior ourselves 4061 4062 // Gets all values 4063 if ( key === undefined ) { 4064 if ( this.length ) { 4065 data = jQuery.data( elem ); 4066 4067 if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { 4068 i = attrs.length; 4069 while ( i-- ) { 4070 4071 // Support: IE11+ 4072 // The attrs elements can be null (#14894) 4073 if ( attrs[ i ] ) { 4074 name = attrs[ i ].name; 4075 if ( name.indexOf( "data-" ) === 0 ) { 4076 name = jQuery.camelCase( name.slice( 5 ) ); 4077 dataAttr( elem, name, data[ name ] ); 4078 } 4079 } 4080 } 4081 jQuery._data( elem, "parsedAttrs", true ); 4082 } 4083 } 4084 4085 return data; 4086 } 4087 4088 // Sets multiple values 4089 if ( typeof key === "object" ) { 4090 return this.each( function() { 4091 jQuery.data( this, key ); 4092 } ); 4093 } 4094 4095 return arguments.length > 1 ? 4096 4097 // Sets one value 4098 this.each( function() { 4099 jQuery.data( this, key, value ); 4100 } ) : 4101 4102 // Gets one value 4103 // Try to fetch any internally stored data first 4104 elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; 4105 }, 4106 4107 removeData: function( key ) { 4108 return this.each( function() { 4109 jQuery.removeData( this, key ); 4110 } ); 4111 } 4112} ); 4113 4114 4115jQuery.extend( { 4116 queue: function( elem, type, data ) { 4117 var queue; 4118 4119 if ( elem ) { 4120 type = ( type || "fx" ) + "queue"; 4121 queue = jQuery._data( elem, type ); 4122 4123 // Speed up dequeue by getting out quickly if this is just a lookup 4124 if ( data ) { 4125 if ( !queue || jQuery.isArray( data ) ) { 4126 queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); 4127 } else { 4128 queue.push( data ); 4129 } 4130 } 4131 return queue || []; 4132 } 4133 }, 4134 4135 dequeue: function( elem, type ) { 4136 type = type || "fx"; 4137 4138 var queue = jQuery.queue( elem, type ), 4139 startLength = queue.length, 4140 fn = queue.shift(), 4141 hooks = jQuery._queueHooks( elem, type ), 4142 next = function() { 4143 jQuery.dequeue( elem, type ); 4144 }; 4145 4146 // If the fx queue is dequeued, always remove the progress sentinel 4147 if ( fn === "inprogress" ) { 4148 fn = queue.shift(); 4149 startLength--; 4150 } 4151 4152 if ( fn ) { 4153 4154 // Add a progress sentinel to prevent the fx queue from being 4155 // automatically dequeued 4156 if ( type === "fx" ) { 4157 queue.unshift( "inprogress" ); 4158 } 4159 4160 // clear up the last queue stop function 4161 delete hooks.stop; 4162 fn.call( elem, next, hooks ); 4163 } 4164 4165 if ( !startLength && hooks ) { 4166 hooks.empty.fire(); 4167 } 4168 }, 4169 4170 // not intended for public consumption - generates a queueHooks object, 4171 // or returns the current one 4172 _queueHooks: function( elem, type ) { 4173 var key = type + "queueHooks"; 4174 return jQuery._data( elem, key ) || jQuery._data( elem, key, { 4175 empty: jQuery.Callbacks( "once memory" ).add( function() { 4176 jQuery._removeData( elem, type + "queue" ); 4177 jQuery._removeData( elem, key ); 4178 } ) 4179 } ); 4180 } 4181} ); 4182 4183jQuery.fn.extend( { 4184 queue: function( type, data ) { 4185 var setter = 2; 4186 4187 if ( typeof type !== "string" ) { 4188 data = type; 4189 type = "fx"; 4190 setter--; 4191 } 4192 4193 if ( arguments.length < setter ) { 4194 return jQuery.queue( this[ 0 ], type ); 4195 } 4196 4197 return data === undefined ? 4198 this : 4199 this.each( function() { 4200 var queue = jQuery.queue( this, type, data ); 4201 4202 // ensure a hooks for this queue 4203 jQuery._queueHooks( this, type ); 4204 4205 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 4206 jQuery.dequeue( this, type ); 4207 } 4208 } ); 4209 }, 4210 dequeue: function( type ) { 4211 return this.each( function() { 4212 jQuery.dequeue( this, type ); 4213 } ); 4214 }, 4215 clearQueue: function( type ) { 4216 return this.queue( type || "fx", [] ); 4217 }, 4218 4219 // Get a promise resolved when queues of a certain type 4220 // are emptied (fx is the type by default) 4221 promise: function( type, obj ) { 4222 var tmp, 4223 count = 1, 4224 defer = jQuery.Deferred(), 4225 elements = this, 4226 i = this.length, 4227 resolve = function() { 4228 if ( !( --count ) ) { 4229 defer.resolveWith( elements, [ elements ] ); 4230 } 4231 }; 4232 4233 if ( typeof type !== "string" ) { 4234 obj = type; 4235 type = undefined; 4236 } 4237 type = type || "fx"; 4238 4239 while ( i-- ) { 4240 tmp = jQuery._data( elements[ i ], type + "queueHooks" ); 4241 if ( tmp && tmp.empty ) { 4242 count++; 4243 tmp.empty.add( resolve ); 4244 } 4245 } 4246 resolve(); 4247 return defer.promise( obj ); 4248 } 4249} ); 4250 4251 4252( function() { 4253 var shrinkWrapBlocksVal; 4254 4255 support.shrinkWrapBlocks = function() { 4256 if ( shrinkWrapBlocksVal != null ) { 4257 return shrinkWrapBlocksVal; 4258 } 4259 4260 // Will be changed later if needed. 4261 shrinkWrapBlocksVal = false;
vendor: 4,171 bytes, lines 4262-4410
4262 4263 // Minified: var b,c,d 4264 var div, body, container; 4265 4266 body = document.getElementsByTagName( "body" )[ 0 ]; 4267 if ( !body || !body.style ) { 4268 4269 // Test fired too early or in an unsupported environment, exit. 4270 return; 4271 } 4272 4273 // Setup 4274 div = document.createElement( "div" ); 4275 container = document.createElement( "div" ); 4276 container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; 4277 body.appendChild( container ).appendChild( div ); 4278 4279 // Support: IE6 4280 // Check if elements with layout shrink-wrap their children 4281 if ( typeof div.style.zoom !== "undefined" ) { 4282 4283 // Reset CSS: box-sizing; display; margin; border 4284 div.style.cssText = 4285 4286 // Support: Firefox<29, Android 2.3 4287 // Vendor-prefix box-sizing 4288 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + 4289 "box-sizing:content-box;display:block;margin:0;border:0;" + 4290 "padding:1px;width:1px;zoom:1"; 4291 div.appendChild( document.createElement( "div" ) ).style.width = "5px"; 4292 shrinkWrapBlocksVal = div.offsetWidth !== 3; 4293 } 4294 4295 body.removeChild( container ); 4296 4297 return shrinkWrapBlocksVal; 4298 }; 4299 4300} )(); 4301var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 4302 4303var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 4304 4305 4306var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 4307 4308var isHidden = function( elem, el ) { 4309 4310 // isHidden might be called from jQuery#filter function; 4311 // in that case, element will be second argument 4312 elem = el || elem; 4313 return jQuery.css( elem, "display" ) === "none" || 4314 !jQuery.contains( elem.ownerDocument, elem ); 4315 }; 4316 4317 4318 4319function adjustCSS( elem, prop, valueParts, tween ) { 4320 var adjusted, 4321 scale = 1, 4322 maxIterations = 20, 4323 currentValue = tween ? 4324 function() { return tween.cur(); } : 4325 function() { return jQuery.css( elem, prop, "" ); }, 4326 initial = currentValue(), 4327 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 4328 4329 // Starting value computation is required for potential unit mismatches 4330 initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 4331 rcssNum.exec( jQuery.css( elem, prop ) ); 4332 4333 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 4334 4335 // Trust units reported by jQuery.css 4336 unit = unit || initialInUnit[ 3 ]; 4337 4338 // Make sure we update the tween properties later on 4339 valueParts = valueParts || []; 4340 4341 // Iteratively approximate from a nonzero starting point 4342 initialInUnit = +initial || 1; 4343 4344 do { 4345 4346 // If previous iteration zeroed out, double until we get *something*. 4347 // Use string for doubling so we don't accidentally see scale as unchanged below 4348 scale = scale || ".5"; 4349 4350 // Adjust and apply 4351 initialInUnit = initialInUnit / scale; 4352 jQuery.style( elem, prop, initialInUnit + unit ); 4353 4354 // Update scale, tolerating zero or NaN from tween.cur() 4355 // Break the loop if scale is unchanged or perfect, or if we've just had enough. 4356 } while ( 4357 scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations 4358 ); 4359 } 4360 4361 if ( valueParts ) { 4362 initialInUnit = +initialInUnit || +initial || 0; 4363 4364 // Apply relative offset (+=/-=) if specified 4365 adjusted = valueParts[ 1 ] ? 4366 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 4367 +valueParts[ 2 ]; 4368 if ( tween ) { 4369 tween.unit = unit; 4370 tween.start = initialInUnit; 4371 tween.end = adjusted; 4372 } 4373 } 4374 return adjusted; 4375} 4376 4377 4378// Multifunctional method to get and set values of a collection 4379// The value/s can optionally be executed if it's a function 4380var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 4381 var i = 0, 4382 length = elems.length, 4383 bulk = key == null; 4384 4385 // Sets many values 4386 if ( jQuery.type( key ) === "object" ) { 4387 chainable = true; 4388 for ( i in key ) { 4389 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 4390 } 4391 4392 // Sets one value 4393 } else if ( value !== undefined ) { 4394 chainable = true; 4395 4396 if ( !jQuery.isFunction( value ) ) { 4397 raw = true; 4398 } 4399 4400 if ( bulk ) { 4401 4402 // Bulk operations run against the entire set 4403 if ( raw ) { 4404 fn.call( elems, value ); 4405 fn = null; 4406 4407 // ...except when executing function values 4408 } else { 4409 bulk = fn; 4410 fn = function( elem, key, value ) {
4411 return bulk.call( jQuery( elem ), value ); 4412 }; 4413 } 4414 } 4415 4416 if ( fn ) { 4417 for ( ; i < length; i++ ) { 4418 fn( 4419 elems[ i ], 4420 key, 4421 raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) 4422 ); 4423 } 4424 } 4425 } 4426 4427 return chainable ? 4428 elems : 4429 4430 // Gets 4431 bulk ? 4432 fn.call( elems ) : 4433 length ? fn( elems[ 0 ], key ) : emptyGet; 4434}; 4435var rcheckableType = ( /^(?:checkbox|radio)$/i ); 4436 4437var rtagName = ( /<([\w:-]+)/ ); 4438 4439var rscriptType = ( /^$|\/(?:java|ecma)script/i ); 4440 4441var rleadingWhitespace = ( /^\s+/ ); 4442 4443var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + 4444 "details|dialog|figcaption|figure|footer|header|hgroup|main|" + 4445 "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; 4446 4447 4448 4449function createSafeFragment( document ) { 4450 var list = nodeNames.split( "|" ), 4451 safeFrag = document.createDocumentFragment(); 4452 4453 if ( safeFrag.createElement ) { 4454 while ( list.length ) { 4455 safeFrag.createElement( 4456 list.pop() 4457 ); 4458 } 4459 } 4460 return safeFrag; 4461} 4462 4463 4464( function() { 4465 var div = document.createElement( "div" ), 4466 fragment = document.createDocumentFragment(), 4467 input = document.createElement( "input" ); 4468 4469 // Setup 4470 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; 4471 4472 // IE strips leading whitespace when .innerHTML is used 4473 support.leadingWhitespace = div.firstChild.nodeType === 3; 4474 4475 // Make sure that tbody elements aren't automatically inserted 4476 // IE will insert them into empty tables 4477 support.tbody = !div.getElementsByTagName( "tbody" ).length; 4478 4479 // Make sure that link elements get serialized correctly by innerHTML 4480 // This requires a wrapper element in IE 4481 support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; 4482 4483 // Makes sure cloning an html5 element does not cause problems 4484 // Where outerHTML is undefined, this still works 4485 support.html5Clone = 4486 document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>"; 4487 4488 // Check if a disconnected checkbox will retain its checked 4489 // value of true after appended to the DOM (IE6/7) 4490 input.type = "checkbox"; 4491 input.checked = true; 4492 fragment.appendChild( input ); 4493 support.appendChecked = input.checked; 4494 4495 // Make sure textarea (and checkbox) defaultValue is properly cloned 4496 // Support: IE6-IE11+ 4497 div.innerHTML = "<textarea>x</textarea>"; 4498 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 4499 4500 // Support: IE <=9 only 4501 // IE <=9 replaces <option> tags with their contents when inserted outside of 4502 // the select element. 4503 div.innerHTML = "<option></option>"; 4504 support.option = !!div.lastChild; 4505 4506 // #11217 - WebKit loses check when the name is after the checked attribute 4507 fragment.appendChild( div ); 4508 4509 // Support: Windows Web Apps (WWA) 4510 // `name` and `type` must use .setAttribute for WWA (#14901) 4511 input = document.createElement( "input" ); 4512 input.setAttribute( "type", "radio" ); 4513 input.setAttribute( "checked", "checked" ); 4514 input.setAttribute( "name", "t" ); 4515 4516 div.appendChild( input ); 4517 4518 // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 4519 // old WebKit doesn't clone checked state correctly in fragments 4520 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 4521 4522 // Support: IE<9 4523 // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ 4524 support.noCloneEvent = !!div.addEventListener; 4525 4526 // Support: IE<9 4527 // Since attributes and properties are the same in IE, 4528 // cleanData must set properties to undefined rather than use removeAttribute 4529 div[ jQuery.expando ] = 1; 4530 support.attributes = !div.getAttribute( jQuery.expando ); 4531} )(); 4532 4533 4534// We have to close these tags to support XHTML (#13200) 4535var wrapMap = { 4536 legend: [ 1, "<fieldset>", "</fieldset>" ], 4537 area: [ 1, "<map>", "</map>" ], 4538 4539 // Support: IE8 4540 param: [ 1, "<object>", "</object>" ], 4541 thead: [ 1, "<table>", "</table>" ], 4542 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 4543 col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ], 4544 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 4545 4546 // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, 4547 // unless wrapped in a div with non-breaking characters in front of it. 4548 _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>" ] 4549}; 4550 4551// Support: IE8-IE9 4552wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 4553wrapMap.th = wrapMap.td; 4554 4555 4556// Support: IE <=9 only 4557if ( !support.option ) { 4558 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 4559} 4560 4561 4562function getAll( context, tag ) { 4563 var elems, elem, 4564 i = 0, 4565 found = typeof context.getElementsByTagName !== "undefined" ? 4566 context.getElementsByTagName( tag || "*" ) : 4567 typeof context.querySelectorAll !== "undefined" ? 4568 context.querySelectorAll( tag || "*" ) : 4569 undefined; 4570 4571 if ( !found ) { 4572 for ( found = [], elems = context.childNodes || context; 4573 ( elem = elems[ i ] ) != null; 4574 i++ 4575 ) { 4576 if ( !tag || jQuery.nodeName( elem, tag ) ) { 4577 found.push( elem ); 4578 } else { 4579 jQuery.merge( found, getAll( elem, tag ) ); 4580 } 4581 } 4582 } 4583 4584 return tag === undefined || tag && jQuery.nodeName( context, tag ) ? 4585 jQuery.merge( [ context ], found ) : 4586 found; 4587} 4588 4589 4590// Mark scripts as having already been evaluated 4591function setGlobalEval( elems, refElements ) { 4592 var elem, 4593 i = 0; 4594 for ( ; ( elem = elems[ i ] ) != null; i++ ) { 4595 jQuery._data( 4596 elem, 4597 "globalEval", 4598 !refElements || jQuery._data( refElements[ i ], "globalEval" ) 4599 ); 4600 } 4601} 4602 4603
vendor: 45,423 bytes, lines 4604-6235
4604var rhtml = /<|&#?\w+;/, 4605 rtbody = /<tbody/i; 4606 4607function fixDefaultChecked( elem ) { 4608 if ( rcheckableType.test( elem.type ) ) { 4609 elem.defaultChecked = elem.checked; 4610 } 4611} 4612 4613function buildFragment( elems, context, scripts, selection, ignored ) { 4614 var j, elem, contains, 4615 tmp, tag, tbody, wrap, 4616 l = elems.length, 4617 4618 // Ensure a safe fragment 4619 safe = createSafeFragment( context ), 4620 4621 nodes = [], 4622 i = 0; 4623 4624 for ( ; i < l; i++ ) { 4625 elem = elems[ i ]; 4626 4627 if ( elem || elem === 0 ) { 4628 4629 // Add nodes directly 4630 if ( jQuery.type( elem ) === "object" ) { 4631 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 4632 4633 // Convert non-html into a text node 4634 } else if ( !rhtml.test( elem ) ) { 4635 nodes.push( context.createTextNode( elem ) ); 4636 4637 // Convert html into DOM nodes 4638 } else { 4639 tmp = tmp || safe.appendChild( context.createElement( "div" ) ); 4640 4641 // Deserialize a standard representation 4642 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 4643 wrap = wrapMap[ tag ] || wrapMap._default; 4644 4645 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 4646 4647 // Descend through wrappers to the right content 4648 j = wrap[ 0 ]; 4649 while ( j-- ) { 4650 tmp = tmp.lastChild; 4651 } 4652 4653 // Manually add leading whitespace removed by IE 4654 if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { 4655 nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[ 0 ] ) ); 4656 } 4657 4658 // Remove IE's autoinserted <tbody> from table fragments 4659 if ( !support.tbody ) { 4660 4661 // String was a <table>, *may* have spurious <tbody> 4662 elem = tag === "table" && !rtbody.test( elem ) ? 4663 tmp.firstChild : 4664 4665 // String was a bare <thead> or <tfoot> 4666 wrap[ 1 ] === "<table>" && !rtbody.test( elem ) ? 4667 tmp : 4668 0; 4669 4670 j = elem && elem.childNodes.length; 4671 while ( j-- ) { 4672 if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && 4673 !tbody.childNodes.length ) { 4674 4675 elem.removeChild( tbody ); 4676 } 4677 } 4678 } 4679 4680 jQuery.merge( nodes, tmp.childNodes ); 4681 4682 // Fix #12392 for WebKit and IE > 9 4683 tmp.textContent = ""; 4684 4685 // Fix #12392 for oldIE 4686 while ( tmp.firstChild ) { 4687 tmp.removeChild( tmp.firstChild ); 4688 } 4689 4690 // Remember the top-level container for proper cleanup 4691 tmp = safe.lastChild; 4692 } 4693 } 4694 } 4695 4696 // Fix #11356: Clear elements from fragment 4697 if ( tmp ) { 4698 safe.removeChild( tmp ); 4699 } 4700 4701 // Reset defaultChecked for any radios and checkboxes 4702 // about to be appended to the DOM in IE 6/7 (#8060) 4703 if ( !support.appendChecked ) { 4704 jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); 4705 } 4706 4707 i = 0; 4708 while ( ( elem = nodes[ i++ ] ) ) { 4709 4710 // Skip elements already in the context collection (trac-4087) 4711 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 4712 if ( ignored ) { 4713 ignored.push( elem ); 4714 } 4715 4716 continue; 4717 } 4718 4719 contains = jQuery.contains( elem.ownerDocument, elem ); 4720 4721 // Append to fragment 4722 tmp = getAll( safe.appendChild( elem ), "script" ); 4723 4724 // Preserve script evaluation history 4725 if ( contains ) { 4726 setGlobalEval( tmp ); 4727 } 4728 4729 // Capture executables 4730 if ( scripts ) { 4731 j = 0; 4732 while ( ( elem = tmp[ j++ ] ) ) { 4733 if ( rscriptType.test( elem.type || "" ) ) { 4734 scripts.push( elem ); 4735 } 4736 } 4737 } 4738 } 4739 4740 tmp = null; 4741 4742 return safe; 4743} 4744 4745 4746( function() { 4747 var i, eventName, 4748 div = document.createElement( "div" ); 4749 4750 // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) 4751 for ( i in { submit: true, change: true, focusin: true } ) { 4752 eventName = "on" + i; 4753 4754 if ( !( support[ i ] = eventName in window ) ) { 4755 4756 // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) 4757 div.setAttribute( eventName, "t" ); 4758 support[ i ] = div.attributes[ eventName ].expando === false; 4759 } 4760 } 4761 4762 // Null elements to avoid leaks in IE. 4763 div = null; 4764} )(); 4765 4766 4767var rformElems = /^(?:input|select|textarea)$/i, 4768 rkeyEvent = /^key/, 4769 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, 4770 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 4771 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 4772 4773function returnTrue() { 4774 return true; 4775} 4776 4777function returnFalse() { 4778 return false; 4779} 4780 4781// Support: IE9 4782// See #13393 for more info 4783function safeActiveElement() { 4784 try { 4785 return document.activeElement; 4786 } catch ( err ) { } 4787} 4788 4789function on( elem, types, selector, data, fn, one ) { 4790 var origFn, type; 4791 4792 // Types can be a map of types/handlers 4793 if ( typeof types === "object" ) { 4794 4795 // ( types-Object, selector, data ) 4796 if ( typeof selector !== "string" ) { 4797 4798 // ( types-Object, data ) 4799 data = data || selector; 4800 selector = undefined; 4801 } 4802 for ( type in types ) { 4803 on( elem, type, selector, data, types[ type ], one ); 4804 } 4805 return elem; 4806 } 4807 4808 if ( data == null && fn == null ) { 4809 4810 // ( types, fn ) 4811 fn = selector; 4812 data = selector = undefined; 4813 } else if ( fn == null ) { 4814 if ( typeof selector === "string" ) { 4815 4816 // ( types, selector, fn ) 4817 fn = data; 4818 data = undefined; 4819 } else { 4820 4821 // ( types, data, fn ) 4822 fn = data; 4823 data = selector; 4824 selector = undefined; 4825 } 4826 } 4827 if ( fn === false ) { 4828 fn = returnFalse; 4829 } else if ( !fn ) { 4830 return elem; 4831 } 4832 4833 if ( one === 1 ) { 4834 origFn = fn; 4835 fn = function( event ) { 4836 4837 // Can use an empty set, since event contains the info 4838 jQuery().off( event ); 4839 return origFn.apply( this, arguments ); 4840 }; 4841 4842 // Use same guid so caller can remove using origFn 4843 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 4844 } 4845 return elem.each( function() { 4846 jQuery.event.add( this, types, fn, data, selector ); 4847 } ); 4848} 4849 4850/* 4851 * Helper functions for managing events -- not part of the public interface. 4852 * Props to Dean Edwards' addEvent library for many of the ideas. 4853 */ 4854jQuery.event = { 4855 4856 global: {}, 4857 4858 add: function( elem, types, handler, data, selector ) { 4859 var tmp, events, t, handleObjIn, 4860 special, eventHandle, handleObj, 4861 handlers, type, namespaces, origType, 4862 elemData = jQuery._data( elem ); 4863 4864 // Don't attach events to noData or text/comment nodes (but allow plain objects) 4865 if ( !elemData ) { 4866 return; 4867 } 4868 4869 // Caller can pass in an object of custom data in lieu of the handler 4870 if ( handler.handler ) { 4871 handleObjIn = handler; 4872 handler = handleObjIn.handler; 4873 selector = handleObjIn.selector; 4874 } 4875 4876 // Make sure that the handler has a unique ID, used to find/remove it later 4877 if ( !handler.guid ) { 4878 handler.guid = jQuery.guid++; 4879 } 4880 4881 // Init the element's event structure and main handler, if this is the first 4882 if ( !( events = elemData.events ) ) { 4883 events = elemData.events = {}; 4884 } 4885 if ( !( eventHandle = elemData.handle ) ) { 4886 eventHandle = elemData.handle = function( e ) { 4887 4888 // Discard the second event of a jQuery.event.trigger() and 4889 // when an event is called after a page has unloaded 4890 return typeof jQuery !== "undefined" && 4891 ( !e || jQuery.event.triggered !== e.type ) ? 4892 jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : 4893 undefined; 4894 }; 4895 4896 // Add elem as a property of the handle fn to prevent a memory leak 4897 // with IE non-native events 4898 eventHandle.elem = elem; 4899 } 4900 4901 // Handle multiple events separated by a space 4902 types = ( types || "" ).match( rnotwhite ) || [ "" ]; 4903 t = types.length; 4904 while ( t-- ) { 4905 tmp = rtypenamespace.exec( types[ t ] ) || []; 4906 type = origType = tmp[ 1 ]; 4907 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 4908 4909 // There *must* be a type, no attaching namespace-only handlers 4910 if ( !type ) { 4911 continue; 4912 } 4913 4914 // If event changes its type, use the special event handlers for the changed type 4915 special = jQuery.event.special[ type ] || {}; 4916 4917 // If selector defined, determine special event api type, otherwise given type 4918 type = ( selector ? special.delegateType : special.bindType ) || type; 4919 4920 // Update special based on newly reset type 4921 special = jQuery.event.special[ type ] || {}; 4922 4923 // handleObj is passed to all event handlers 4924 handleObj = jQuery.extend( { 4925 type: type, 4926 origType: origType, 4927 data: data, 4928 handler: handler, 4929 guid: handler.guid, 4930 selector: selector, 4931 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 4932 namespace: namespaces.join( "." ) 4933 }, handleObjIn ); 4934 4935 // Init the event handler queue if we're the first 4936 if ( !( handlers = events[ type ] ) ) { 4937 handlers = events[ type ] = []; 4938 handlers.delegateCount = 0; 4939 4940 // Only use addEventListener/attachEvent if the special events handler returns false 4941 if ( !special.setup || 4942 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 4943 4944 // Bind the global event handler to the element 4945 if ( elem.addEventListener ) { 4946 elem.addEventListener( type, eventHandle, false ); 4947 4948 } else if ( elem.attachEvent ) { 4949 elem.attachEvent( "on" + type, eventHandle ); 4950 } 4951 } 4952 } 4953 4954 if ( special.add ) { 4955 special.add.call( elem, handleObj ); 4956 4957 if ( !handleObj.handler.guid ) { 4958 handleObj.handler.guid = handler.guid; 4959 } 4960 } 4961 4962 // Add to the element's handler list, delegates in front 4963 if ( selector ) { 4964 handlers.splice( handlers.delegateCount++, 0, handleObj ); 4965 } else { 4966 handlers.push( handleObj ); 4967 } 4968 4969 // Keep track of which events have ever been used, for event optimization 4970 jQuery.event.global[ type ] = true; 4971 } 4972 4973 // Nullify elem to prevent memory leaks in IE 4974 elem = null; 4975 }, 4976 4977 // Detach an event or set of events from an element 4978 remove: function( elem, types, handler, selector, mappedTypes ) { 4979 var j, handleObj, tmp, 4980 origCount, t, events, 4981 special, handlers, type, 4982 namespaces, origType, 4983 elemData = jQuery.hasData( elem ) && jQuery._data( elem ); 4984 4985 if ( !elemData || !( events = elemData.events ) ) { 4986 return; 4987 } 4988 4989 // Once for each type.namespace in types; type may be omitted 4990 types = ( types || "" ).match( rnotwhite ) || [ "" ]; 4991 t = types.length; 4992 while ( t-- ) { 4993 tmp = rtypenamespace.exec( types[ t ] ) || []; 4994 type = origType = tmp[ 1 ]; 4995 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 4996 4997 // Unbind all events (on this namespace, if provided) for the element 4998 if ( !type ) { 4999 for ( type in events ) { 5000 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 5001 } 5002 continue; 5003 } 5004 5005 special = jQuery.event.special[ type ] || {}; 5006 type = ( selector ? special.delegateType : special.bindType ) || type; 5007 handlers = events[ type ] || []; 5008 tmp = tmp[ 2 ] && 5009 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 5010 5011 // Remove matching events 5012 origCount = j = handlers.length; 5013 while ( j-- ) { 5014 handleObj = handlers[ j ]; 5015 5016 if ( ( mappedTypes || origType === handleObj.origType ) && 5017 ( !handler || handler.guid === handleObj.guid ) && 5018 ( !tmp || tmp.test( handleObj.namespace ) ) && 5019 ( !selector || selector === handleObj.selector || 5020 selector === "**" && handleObj.selector ) ) { 5021 handlers.splice( j, 1 ); 5022 5023 if ( handleObj.selector ) { 5024 handlers.delegateCount--; 5025 } 5026 if ( special.remove ) { 5027 special.remove.call( elem, handleObj ); 5028 } 5029 } 5030 } 5031 5032 // Remove generic event handler if we removed something and no more handlers exist 5033 // (avoids potential for endless recursion during removal of special event handlers) 5034 if ( origCount && !handlers.length ) { 5035 if ( !special.teardown || 5036 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 5037 5038 jQuery.removeEvent( elem, type, elemData.handle ); 5039 } 5040 5041 delete events[ type ]; 5042 } 5043 } 5044 5045 // Remove the expando if it's no longer used 5046 if ( jQuery.isEmptyObject( events ) ) { 5047 delete elemData.handle; 5048 5049 // removeData also checks for emptiness and clears the expando if empty 5050 // so use it instead of delete 5051 jQuery._removeData( elem, "events" ); 5052 } 5053 }, 5054 5055 trigger: function( event, data, elem, onlyHandlers ) { 5056 var handle, ontype, cur, 5057 bubbleType, special, tmp, i, 5058 eventPath = [ elem || document ], 5059 type = hasOwn.call( event, "type" ) ? event.type : event, 5060 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 5061 5062 cur = tmp = elem = elem || document; 5063 5064 // Don't do events on text and comment nodes 5065 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 5066 return; 5067 } 5068 5069 // focus/blur morphs to focusin/out; ensure we're not firing them right now 5070 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 5071 return; 5072 } 5073 5074 if ( type.indexOf( "." ) > -1 ) { 5075 5076 // Namespaced trigger; create a regexp to match event type in handle() 5077 namespaces = type.split( "." ); 5078 type = namespaces.shift(); 5079 namespaces.sort(); 5080 } 5081 ontype = type.indexOf( ":" ) < 0 && "on" + type; 5082 5083 // Caller can pass in a jQuery.Event object, Object, or just an event type string 5084 event = event[ jQuery.expando ] ? 5085 event : 5086 new jQuery.Event( type, typeof event === "object" && event ); 5087 5088 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 5089 event.isTrigger = onlyHandlers ? 2 : 3; 5090 event.namespace = namespaces.join( "." ); 5091 event.rnamespace = event.namespace ? 5092 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 5093 null; 5094 5095 // Clean up the event in case it is being reused 5096 event.result = undefined; 5097 if ( !event.target ) { 5098 event.target = elem; 5099 } 5100 5101 // Clone any incoming data and prepend the event, creating the handler arg list 5102 data = data == null ? 5103 [ event ] : 5104 jQuery.makeArray( data, [ event ] ); 5105 5106 // Allow special events to draw outside the lines 5107 special = jQuery.event.special[ type ] || {}; 5108 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 5109 return; 5110 } 5111 5112 // Determine event propagation path in advance, per W3C events spec (#9951) 5113 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 5114 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { 5115 5116 bubbleType = special.delegateType || type; 5117 if ( !rfocusMorph.test( bubbleType + type ) ) { 5118 cur = cur.parentNode; 5119 } 5120 for ( ; cur; cur = cur.parentNode ) { 5121 eventPath.push( cur ); 5122 tmp = cur; 5123 } 5124 5125 // Only add window if we got to document (e.g., not plain obj or detached DOM) 5126 if ( tmp === ( elem.ownerDocument || document ) ) { 5127 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 5128 } 5129 } 5130 5131 // Fire handlers on the event path 5132 i = 0; 5133 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 5134 5135 event.type = i > 1 ? 5136 bubbleType : 5137 special.bindType || type; 5138 5139 // jQuery handler 5140 handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && 5141 jQuery._data( cur, "handle" ); 5142 5143 if ( handle ) { 5144 handle.apply( cur, data ); 5145 } 5146 5147 // Native handler 5148 handle = ontype && cur[ ontype ]; 5149 if ( handle && handle.apply && acceptData( cur ) ) { 5150 event.result = handle.apply( cur, data ); 5151 if ( event.result === false ) { 5152 event.preventDefault(); 5153 } 5154 } 5155 } 5156 event.type = type; 5157 5158 // If nobody prevented the default action, do it now 5159 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 5160 5161 if ( 5162 ( !special._default || 5163 special._default.apply( eventPath.pop(), data ) === false 5164 ) && acceptData( elem ) 5165 ) { 5166 5167 // Call a native DOM method on the target with the same name name as the event. 5168 // Can't use an .isFunction() check here because IE6/7 fails that test. 5169 // Don't do default actions on window, that's where global variables be (#6170) 5170 if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { 5171 5172 // Don't re-trigger an onFOO event when we call its FOO() method 5173 tmp = elem[ ontype ]; 5174 5175 if ( tmp ) { 5176 elem[ ontype ] = null; 5177 } 5178 5179 // Prevent re-triggering of the same event, since we already bubbled it above 5180 jQuery.event.triggered = type; 5181 try { 5182 elem[ type ](); 5183 } catch ( e ) { 5184 5185 // IE<9 dies on focus/blur to hidden element (#1486,#12518) 5186 // only reproducible on winXP IE8 native, not IE9 in IE8 mode 5187 } 5188 jQuery.event.triggered = undefined; 5189 5190 if ( tmp ) { 5191 elem[ ontype ] = tmp; 5192 } 5193 } 5194 } 5195 } 5196 5197 return event.result; 5198 }, 5199 5200 dispatch: function( event ) { 5201 5202 // Make a writable jQuery.Event from the native event object 5203 event = jQuery.event.fix( event ); 5204 5205 var i, j, ret, matched, handleObj, 5206 handlerQueue = [], 5207 args = slice.call( arguments ), 5208 handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], 5209 special = jQuery.event.special[ event.type ] || {}; 5210 5211 // Use the fix-ed jQuery.Event rather than the (read-only) native event 5212 args[ 0 ] = event; 5213 event.delegateTarget = this; 5214 5215 // Call the preDispatch hook for the mapped type, and let it bail if desired 5216 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 5217 return; 5218 } 5219 5220 // Determine handlers 5221 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 5222 5223 // Run delegates first; they may want to stop propagation beneath us 5224 i = 0; 5225 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 5226 event.currentTarget = matched.elem; 5227 5228 j = 0; 5229 while ( ( handleObj = matched.handlers[ j++ ] ) && 5230 !event.isImmediatePropagationStopped() ) { 5231 5232 // Triggered event must either 1) have no namespace, or 2) have namespace(s) 5233 // a subset or equal to those in the bound event (both can have no namespace). 5234 if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { 5235 5236 event.handleObj = handleObj; 5237 event.data = handleObj.data; 5238 5239 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 5240 handleObj.handler ).apply( matched.elem, args ); 5241 5242 if ( ret !== undefined ) { 5243 if ( ( event.result = ret ) === false ) { 5244 event.preventDefault(); 5245 event.stopPropagation(); 5246 } 5247 } 5248 } 5249 } 5250 } 5251 5252 // Call the postDispatch hook for the mapped type 5253 if ( special.postDispatch ) { 5254 special.postDispatch.call( this, event ); 5255 } 5256 5257 return event.result; 5258 }, 5259 5260 handlers: function( event, handlers ) { 5261 var i, matches, sel, handleObj, 5262 handlerQueue = [], 5263 delegateCount = handlers.delegateCount, 5264 cur = event.target; 5265 5266 // Support (at least): Chrome, IE9 5267 // Find delegate handlers 5268 // Black-hole SVG <use> instance trees (#13180) 5269 // 5270 // Support: Firefox<=42+ 5271 // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) 5272 if ( delegateCount && cur.nodeType && 5273 ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { 5274 5275 /* jshint eqeqeq: false */ 5276 for ( ; cur != this; cur = cur.parentNode || this ) { 5277 /* jshint eqeqeq: true */ 5278 5279 // Don't check non-elements (#13208) 5280 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 5281 if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { 5282 matches = []; 5283 for ( i = 0; i < delegateCount; i++ ) { 5284 handleObj = handlers[ i ]; 5285 5286 // Don't conflict with Object.prototype properties (#13203) 5287 sel = handleObj.selector + " "; 5288 5289 if ( matches[ sel ] === undefined ) { 5290 matches[ sel ] = handleObj.needsContext ? 5291 jQuery( sel, this ).index( cur ) > -1 : 5292 jQuery.find( sel, this, null, [ cur ] ).length; 5293 } 5294 if ( matches[ sel ] ) { 5295 matches.push( handleObj ); 5296 } 5297 } 5298 if ( matches.length ) { 5299 handlerQueue.push( { elem: cur, handlers: matches } ); 5300 } 5301 } 5302 } 5303 } 5304 5305 // Add the remaining (directly-bound) handlers 5306 if ( delegateCount < handlers.length ) { 5307 handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); 5308 } 5309 5310 return handlerQueue; 5311 }, 5312 5313 fix: function( event ) { 5314 if ( event[ jQuery.expando ] ) { 5315 return event; 5316 } 5317 5318 // Create a writable copy of the event object and normalize some properties 5319 var i, prop, copy, 5320 type = event.type, 5321 originalEvent = event, 5322 fixHook = this.fixHooks[ type ]; 5323 5324 if ( !fixHook ) { 5325 this.fixHooks[ type ] = fixHook = 5326 rmouseEvent.test( type ) ? this.mouseHooks : 5327 rkeyEvent.test( type ) ? this.keyHooks : 5328 {}; 5329 } 5330 copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; 5331 5332 event = new jQuery.Event( originalEvent ); 5333 5334 i = copy.length; 5335 while ( i-- ) { 5336 prop = copy[ i ]; 5337 event[ prop ] = originalEvent[ prop ]; 5338 } 5339 5340 // Support: IE<9 5341 // Fix target property (#1925) 5342 if ( !event.target ) { 5343 event.target = originalEvent.srcElement || document; 5344 } 5345 5346 // Support: Safari 6-8+ 5347 // Target should not be a text node (#504, #13143) 5348 if ( event.target.nodeType === 3 ) { 5349 event.target = event.target.parentNode; 5350 } 5351 5352 // Support: IE<9 5353 // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) 5354 event.metaKey = !!event.metaKey; 5355 5356 return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; 5357 }, 5358 5359 // Includes some event props shared by KeyEvent and MouseEvent 5360 props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + 5361 "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), 5362 5363 fixHooks: {}, 5364 5365 keyHooks: { 5366 props: "char charCode key keyCode".split( " " ), 5367 filter: function( event, original ) { 5368 5369 // Add which for key events 5370 if ( event.which == null ) { 5371 event.which = original.charCode != null ? original.charCode : original.keyCode; 5372 } 5373 5374 return event; 5375 } 5376 }, 5377 5378 mouseHooks: { 5379 props: ( "button buttons clientX clientY fromElement offsetX offsetY " + 5380 "pageX pageY screenX screenY toElement" ).split( " " ), 5381 filter: function( event, original ) { 5382 var body, eventDoc, doc, 5383 button = original.button, 5384 fromElement = original.fromElement; 5385 5386 // Calculate pageX/Y if missing and clientX/Y available 5387 if ( event.pageX == null && original.clientX != null ) { 5388 eventDoc = event.target.ownerDocument || document; 5389 doc = eventDoc.documentElement; 5390 body = eventDoc.body; 5391 5392 event.pageX = original.clientX + 5393 ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - 5394 ( doc && doc.clientLeft || body && body.clientLeft || 0 ); 5395 event.pageY = original.clientY + 5396 ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - 5397 ( doc && doc.clientTop || body && body.clientTop || 0 ); 5398 } 5399 5400 // Add relatedTarget, if necessary 5401 if ( !event.relatedTarget && fromElement ) { 5402 event.relatedTarget = fromElement === event.target ? 5403 original.toElement : 5404 fromElement; 5405 } 5406 5407 // Add which for click: 1 === left; 2 === middle; 3 === right 5408 // Note: button is not normalized, so don't use it 5409 if ( !event.which && button !== undefined ) { 5410 event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); 5411 } 5412 5413 return event; 5414 } 5415 }, 5416 5417 special: { 5418 load: { 5419 5420 // Prevent triggered image.load events from bubbling to window.load 5421 noBubble: true 5422 }, 5423 focus: { 5424 5425 // Fire native event if possible so blur/focus sequence is correct 5426 trigger: function() { 5427 if ( this !== safeActiveElement() && this.focus ) { 5428 try { 5429 this.focus(); 5430 return false; 5431 } catch ( e ) { 5432 5433 // Support: IE<9 5434 // If we error on focus to hidden element (#1486, #12518), 5435 // let .trigger() run the handlers 5436 } 5437 } 5438 }, 5439 delegateType: "focusin" 5440 }, 5441 blur: { 5442 trigger: function() { 5443 if ( this === safeActiveElement() && this.blur ) { 5444 this.blur(); 5445 return false; 5446 } 5447 }, 5448 delegateType: "focusout" 5449 }, 5450 click: { 5451 5452 // For checkbox, fire native event so checked state will be right 5453 trigger: function() { 5454 if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { 5455 this.click(); 5456 return false; 5457 } 5458 }, 5459 5460 // For cross-browser consistency, don't fire native .click() on links 5461 _default: function( event ) { 5462 return jQuery.nodeName( event.target, "a" ); 5463 } 5464 }, 5465 5466 beforeunload: { 5467 postDispatch: function( event ) { 5468 5469 // Support: Firefox 20+ 5470 // Firefox doesn't alert if the returnValue field is not set. 5471 if ( event.result !== undefined && event.originalEvent ) { 5472 event.originalEvent.returnValue = event.result; 5473 } 5474 } 5475 } 5476 }, 5477 5478 // Piggyback on a donor event to simulate a different one 5479 simulate: function( type, elem, event ) { 5480 var e = jQuery.extend( 5481 new jQuery.Event(), 5482 event, 5483 { 5484 type: type, 5485 isSimulated: true 5486 5487 // Previously, `originalEvent: {}` was set here, so stopPropagation call 5488 // would not be triggered on donor event, since in our own 5489 // jQuery.event.stopPropagation function we had a check for existence of 5490 // originalEvent.stopPropagation method, so, consequently it would be a noop. 5491 // 5492 // Guard for simulated events was moved to jQuery.event.stopPropagation function 5493 // since `originalEvent` should point to the original event for the 5494 // constancy with other events and for more focused logic 5495 } 5496 ); 5497 5498 jQuery.event.trigger( e, null, elem ); 5499 5500 if ( e.isDefaultPrevented() ) { 5501 event.preventDefault(); 5502 } 5503 } 5504}; 5505 5506jQuery.removeEvent = document.removeEventListener ? 5507 function( elem, type, handle ) { 5508 5509 // This "if" is needed for plain objects 5510 if ( elem.removeEventListener ) { 5511 elem.removeEventListener( type, handle ); 5512 } 5513 } : 5514 function( elem, type, handle ) { 5515 var name = "on" + type; 5516 5517 if ( elem.detachEvent ) { 5518 5519 // #8545, #7054, preventing memory leaks for custom events in IE6-8 5520 // detachEvent needed property on element, by name of that event, 5521 // to properly expose it to GC 5522 if ( typeof elem[ name ] === "undefined" ) { 5523 elem[ name ] = null; 5524 } 5525 5526 elem.detachEvent( name, handle ); 5527 } 5528 }; 5529 5530jQuery.Event = function( src, props ) { 5531 5532 // Allow instantiation without the 'new' keyword 5533 if ( !( this instanceof jQuery.Event ) ) { 5534 return new jQuery.Event( src, props ); 5535 } 5536 5537 // Event object 5538 if ( src && src.type ) { 5539 this.originalEvent = src; 5540 this.type = src.type; 5541 5542 // Events bubbling up the document may have been marked as prevented 5543 // by a handler lower down the tree; reflect the correct value. 5544 this.isDefaultPrevented = src.defaultPrevented || 5545 src.defaultPrevented === undefined && 5546 5547 // Support: IE < 9, Android < 4.0 5548 src.returnValue === false ? 5549 returnTrue : 5550 returnFalse; 5551 5552 // Event type 5553 } else { 5554 this.type = src; 5555 } 5556 5557 // Put explicitly provided properties onto the event object 5558 if ( props ) { 5559 jQuery.extend( this, props ); 5560 } 5561 5562 // Create a timestamp if incoming event doesn't have one 5563 this.timeStamp = src && src.timeStamp || jQuery.now(); 5564 5565 // Mark it as fixed 5566 this[ jQuery.expando ] = true; 5567}; 5568 5569// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 5570// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 5571jQuery.Event.prototype = { 5572 constructor: jQuery.Event, 5573 isDefaultPrevented: returnFalse, 5574 isPropagationStopped: returnFalse, 5575 isImmediatePropagationStopped: returnFalse, 5576 5577 preventDefault: function() { 5578 var e = this.originalEvent; 5579 5580 this.isDefaultPrevented = returnTrue; 5581 if ( !e ) { 5582 return; 5583 } 5584 5585 // If preventDefault exists, run it on the original event 5586 if ( e.preventDefault ) { 5587 e.preventDefault(); 5588 5589 // Support: IE 5590 // Otherwise set the returnValue property of the original event to false 5591 } else { 5592 e.returnValue = false; 5593 } 5594 }, 5595 stopPropagation: function() { 5596 var e = this.originalEvent; 5597 5598 this.isPropagationStopped = returnTrue; 5599 5600 if ( !e || this.isSimulated ) { 5601 return; 5602 } 5603 5604 // If stopPropagation exists, run it on the original event 5605 if ( e.stopPropagation ) { 5606 e.stopPropagation(); 5607 } 5608 5609 // Support: IE 5610 // Set the cancelBubble property of the original event to true 5611 e.cancelBubble = true; 5612 }, 5613 stopImmediatePropagation: function() { 5614 var e = this.originalEvent; 5615 5616 this.isImmediatePropagationStopped = returnTrue; 5617 5618 if ( e && e.stopImmediatePropagation ) { 5619 e.stopImmediatePropagation(); 5620 } 5621 5622 this.stopPropagation(); 5623 } 5624}; 5625 5626// Create mouseenter/leave events using mouseover/out and event-time checks 5627// so that event delegation works in jQuery. 5628// Do the same for pointerenter/pointerleave and pointerover/pointerout 5629// 5630// Support: Safari 7 only 5631// Safari sends mouseenter too often; see: 5632// https://code.google.com/p/chromium/issues/detail?id=470258 5633// for the description of the bug (it existed in older Chrome versions as well). 5634jQuery.each( { 5635 mouseenter: "mouseover", 5636 mouseleave: "mouseout", 5637 pointerenter: "pointerover", 5638 pointerleave: "pointerout" 5639}, function( orig, fix ) { 5640 jQuery.event.special[ orig ] = { 5641 delegateType: fix, 5642 bindType: fix, 5643 5644 handle: function( event ) { 5645 var ret, 5646 target = this, 5647 related = event.relatedTarget, 5648 handleObj = event.handleObj; 5649 5650 // For mouseenter/leave call the handler if related is outside the target. 5651 // NB: No relatedTarget if the mouse left/entered the browser window 5652 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 5653 event.type = handleObj.origType; 5654 ret = handleObj.handler.apply( this, arguments ); 5655 event.type = fix; 5656 } 5657 return ret; 5658 } 5659 }; 5660} ); 5661 5662// IE submit delegation 5663if ( !support.submit ) { 5664 5665 jQuery.event.special.submit = { 5666 setup: function() { 5667 5668 // Only need this for delegated form submit events 5669 if ( jQuery.nodeName( this, "form" ) ) { 5670 return false; 5671 } 5672 5673 // Lazy-add a submit handler when a descendant form may potentially be submitted 5674 jQuery.event.add( this, "click._submit keypress._submit", function( e ) { 5675 5676 // Node name check avoids a VML-related crash in IE (#9807) 5677 var elem = e.target, 5678 form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? 5679 5680 // Support: IE <=8 5681 // We use jQuery.prop instead of elem.form 5682 // to allow fixing the IE8 delegated submit issue (gh-2332) 5683 // by 3rd party polyfills/workarounds. 5684 jQuery.prop( elem, "form" ) : 5685 undefined; 5686 5687 if ( form && !jQuery._data( form, "submit" ) ) { 5688 jQuery.event.add( form, "submit._submit", function( event ) { 5689 event._submitBubble = true; 5690 } ); 5691 jQuery._data( form, "submit", true ); 5692 } 5693 } ); 5694 5695 // return undefined since we don't need an event listener 5696 }, 5697 5698 postDispatch: function( event ) { 5699 5700 // If form was submitted by the user, bubble the event up the tree 5701 if ( event._submitBubble ) { 5702 delete event._submitBubble; 5703 if ( this.parentNode && !event.isTrigger ) { 5704 jQuery.event.simulate( "submit", this.parentNode, event ); 5705 } 5706 } 5707 }, 5708 5709 teardown: function() { 5710 5711 // Only need this for delegated form submit events 5712 if ( jQuery.nodeName( this, "form" ) ) { 5713 return false; 5714 } 5715 5716 // Remove delegated handlers; cleanData eventually reaps submit handlers attached above 5717 jQuery.event.remove( this, "._submit" ); 5718 } 5719 }; 5720} 5721 5722// IE change delegation and checkbox/radio fix 5723if ( !support.change ) { 5724 5725 jQuery.event.special.change = { 5726 5727 setup: function() { 5728 5729 if ( rformElems.test( this.nodeName ) ) { 5730 5731 // IE doesn't fire change on a check/radio until blur; trigger it on click 5732 // after a propertychange. Eat the blur-change in special.change.handle. 5733 // This still fires onchange a second time for check/radio after blur. 5734 if ( this.type === "checkbox" || this.type === "radio" ) { 5735 jQuery.event.add( this, "propertychange._change", function( event ) { 5736 if ( event.originalEvent.propertyName === "checked" ) { 5737 this._justChanged = true; 5738 } 5739 } ); 5740 jQuery.event.add( this, "click._change", function( event ) { 5741 if ( this._justChanged && !event.isTrigger ) { 5742 this._justChanged = false; 5743 } 5744 5745 // Allow triggered, simulated change events (#11500) 5746 jQuery.event.simulate( "change", this, event ); 5747 } ); 5748 } 5749 return false; 5750 } 5751 5752 // Delegated event; lazy-add a change handler on descendant inputs 5753 jQuery.event.add( this, "beforeactivate._change", function( e ) { 5754 var elem = e.target; 5755 5756 if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { 5757 jQuery.event.add( elem, "change._change", function( event ) { 5758 if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { 5759 jQuery.event.simulate( "change", this.parentNode, event ); 5760 } 5761 } ); 5762 jQuery._data( elem, "change", true ); 5763 } 5764 } ); 5765 }, 5766 5767 handle: function( event ) { 5768 var elem = event.target; 5769 5770 // Swallow native change events from checkbox/radio, we already triggered them above 5771 if ( this !== elem || event.isSimulated || event.isTrigger || 5772 ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { 5773 5774 return event.handleObj.handler.apply( this, arguments ); 5775 } 5776 }, 5777 5778 teardown: function() { 5779 jQuery.event.remove( this, "._change" ); 5780 5781 return !rformElems.test( this.nodeName ); 5782 } 5783 }; 5784} 5785 5786// Support: Firefox 5787// Firefox doesn't have focus(in | out) events 5788// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 5789// 5790// Support: Chrome, Safari 5791// focus(in | out) events fire after focus & blur events, 5792// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 5793// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 5794if ( !support.focusin ) { 5795 jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { 5796 5797 // Attach a single capturing handler on the document while someone wants focusin/focusout 5798 var handler = function( event ) { 5799 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); 5800 }; 5801 5802 jQuery.event.special[ fix ] = { 5803 setup: function() { 5804 var doc = this.ownerDocument || this, 5805 attaches = jQuery._data( doc, fix ); 5806 5807 if ( !attaches ) { 5808 doc.addEventListener( orig, handler, true ); 5809 } 5810 jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); 5811 }, 5812 teardown: function() { 5813 var doc = this.ownerDocument || this, 5814 attaches = jQuery._data( doc, fix ) - 1; 5815 5816 if ( !attaches ) { 5817 doc.removeEventListener( orig, handler, true ); 5818 jQuery._removeData( doc, fix ); 5819 } else { 5820 jQuery._data( doc, fix, attaches ); 5821 } 5822 } 5823 }; 5824 } ); 5825} 5826 5827jQuery.fn.extend( { 5828 5829 on: function( types, selector, data, fn ) { 5830 return on( this, types, selector, data, fn ); 5831 }, 5832 one: function( types, selector, data, fn ) { 5833 return on( this, types, selector, data, fn, 1 ); 5834 }, 5835 off: function( types, selector, fn ) { 5836 var handleObj, type; 5837 if ( types && types.preventDefault && types.handleObj ) { 5838 5839 // ( event ) dispatched jQuery.Event 5840 handleObj = types.handleObj; 5841 jQuery( types.delegateTarget ).off( 5842 handleObj.namespace ? 5843 handleObj.origType + "." + handleObj.namespace : 5844 handleObj.origType, 5845 handleObj.selector, 5846 handleObj.handler 5847 ); 5848 return this; 5849 } 5850 if ( typeof types === "object" ) { 5851 5852 // ( types-object [, selector] ) 5853 for ( type in types ) { 5854 this.off( type, selector, types[ type ] ); 5855 } 5856 return this; 5857 } 5858 if ( selector === false || typeof selector === "function" ) { 5859 5860 // ( types [, fn] ) 5861 fn = selector; 5862 selector = undefined; 5863 } 5864 if ( fn === false ) { 5865 fn = returnFalse; 5866 } 5867 return this.each( function() { 5868 jQuery.event.remove( this, types, fn, selector ); 5869 } ); 5870 }, 5871 5872 trigger: function( type, data ) { 5873 return this.each( function() { 5874 jQuery.event.trigger( type, data, this ); 5875 } ); 5876 }, 5877 triggerHandler: function( type, data ) { 5878 var elem = this[ 0 ]; 5879 if ( elem ) { 5880 return jQuery.event.trigger( type, data, elem, true ); 5881 } 5882 } 5883} ); 5884 5885 5886var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, 5887 rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), 5888 5889 // Support: IE 10-11, Edge 10240+ 5890 // In IE/Edge using regex groups here causes severe slowdowns. 5891 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 5892 rnoInnerhtml = /<script|<style|<link/i, 5893 5894 // checked="checked" or checked 5895 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5896 rscriptTypeMasked = /^true\/(.*)/, 5897 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g, 5898 safeFragment = createSafeFragment( document ), 5899 fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); 5900 5901// Support: IE<8 5902// Manipulating tables requires a tbody 5903function manipulationTarget( elem, content ) { 5904 return jQuery.nodeName( elem, "table" ) && 5905 jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? 5906 5907 elem.getElementsByTagName( "tbody" )[ 0 ] || 5908 elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : 5909 elem; 5910} 5911 5912// Replace/restore the type attribute of script elements for safe DOM manipulation 5913function disableScript( elem ) { 5914 elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; 5915 return elem; 5916} 5917function restoreScript( elem ) { 5918 var match = rscriptTypeMasked.exec( elem.type ); 5919 if ( match ) { 5920 elem.type = match[ 1 ]; 5921 } else { 5922 elem.removeAttribute( "type" ); 5923 } 5924 return elem; 5925} 5926 5927function cloneCopyEvent( src, dest ) { 5928 if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { 5929 return; 5930 } 5931 5932 var type, i, l, 5933 oldData = jQuery._data( src ), 5934 curData = jQuery._data( dest, oldData ), 5935 events = oldData.events; 5936 5937 if ( events ) { 5938 delete curData.handle; 5939 curData.events = {}; 5940 5941 for ( type in events ) { 5942 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 5943 jQuery.event.add( dest, type, events[ type ][ i ] ); 5944 } 5945 } 5946 } 5947 5948 // make the cloned public data object a copy from the original 5949 if ( curData.data ) { 5950 curData.data = jQuery.extend( {}, curData.data ); 5951 } 5952} 5953 5954function fixCloneNodeIssues( src, dest ) { 5955 var nodeName, e, data; 5956 5957 // We do not need to do anything for non-Elements 5958 if ( dest.nodeType !== 1 ) { 5959 return; 5960 } 5961 5962 nodeName = dest.nodeName.toLowerCase(); 5963 5964 // IE6-8 copies events bound via attachEvent when using cloneNode. 5965 if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { 5966 data = jQuery._data( dest ); 5967 5968 for ( e in data.events ) { 5969 jQuery.removeEvent( dest, e, data.handle ); 5970 } 5971 5972 // Event data gets referenced instead of copied if the expando gets copied too 5973 dest.removeAttribute( jQuery.expando ); 5974 } 5975 5976 // IE blanks contents when cloning scripts, and tries to evaluate newly-set text 5977 if ( nodeName === "script" && dest.text !== src.text ) { 5978 disableScript( dest ).text = src.text; 5979 restoreScript( dest ); 5980 5981 // IE6-10 improperly clones children of object elements using classid. 5982 // IE10 throws NoModificationAllowedError if parent is null, #12132. 5983 } else if ( nodeName === "object" ) { 5984 if ( dest.parentNode ) { 5985 dest.outerHTML = src.outerHTML; 5986 } 5987 5988 // This path appears unavoidable for IE9. When cloning an object 5989 // element in IE9, the outerHTML strategy above is not sufficient. 5990 // If the src has innerHTML and the destination does not, 5991 // copy the src.innerHTML into the dest.innerHTML. #10324 5992 if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { 5993 dest.innerHTML = src.innerHTML; 5994 } 5995 5996 } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 5997 5998 // IE6-8 fails to persist the checked state of a cloned checkbox 5999 // or radio button. Worse, IE6-7 fail to give the cloned element 6000 // a checked appearance if the defaultChecked value isn't also set 6001 6002 dest.defaultChecked = dest.checked = src.checked; 6003 6004 // IE6-7 get confused and end up setting the value of a cloned 6005 // checkbox/radio button to an empty string instead of "on" 6006 if ( dest.value !== src.value ) { 6007 dest.value = src.value; 6008 } 6009 6010 // IE6-8 fails to return the selected option to the default selected 6011 // state when cloning options 6012 } else if ( nodeName === "option" ) { 6013 dest.defaultSelected = dest.selected = src.defaultSelected; 6014 6015 // IE6-8 fails to set the defaultValue to the correct value when 6016 // cloning other types of input fields 6017 } else if ( nodeName === "input" || nodeName === "textarea" ) { 6018 dest.defaultValue = src.defaultValue; 6019 } 6020} 6021 6022function domManip( collection, args, callback, ignored ) { 6023 6024 // Flatten any nested arrays 6025 args = concat.apply( [], args ); 6026 6027 var first, node, hasScripts, 6028 scripts, doc, fragment, 6029 i = 0, 6030 l = collection.length, 6031 iNoClone = l - 1, 6032 value = args[ 0 ], 6033 isFunction = jQuery.isFunction( value ); 6034 6035 // We can't cloneNode fragments that contain checked, in WebKit 6036 if ( isFunction || 6037 ( l > 1 && typeof value === "string" && 6038 !support.checkClone && rchecked.test( value ) ) ) { 6039 return collection.each( function( index ) { 6040 var self = collection.eq( index ); 6041 if ( isFunction ) { 6042 args[ 0 ] = value.call( this, index, self.html() ); 6043 } 6044 domManip( self, args, callback, ignored ); 6045 } ); 6046 } 6047 6048 if ( l ) { 6049 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 6050 first = fragment.firstChild; 6051 6052 if ( fragment.childNodes.length === 1 ) { 6053 fragment = first; 6054 } 6055 6056 // Require either new content or an interest in ignored elements to invoke the callback 6057 if ( first || ignored ) { 6058 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 6059 hasScripts = scripts.length; 6060 6061 // Use the original fragment for the last item 6062 // instead of the first because it can end up 6063 // being emptied incorrectly in certain situations (#8070). 6064 for ( ; i < l; i++ ) { 6065 node = fragment; 6066 6067 if ( i !== iNoClone ) { 6068 node = jQuery.clone( node, true, true ); 6069 6070 // Keep references to cloned scripts for later restoration 6071 if ( hasScripts ) { 6072 6073 // Support: Android<4.1, PhantomJS<2 6074 // push.apply(_, arraylike) throws on ancient WebKit 6075 jQuery.merge( scripts, getAll( node, "script" ) ); 6076 } 6077 } 6078 6079 callback.call( collection[ i ], node, i ); 6080 } 6081 6082 if ( hasScripts ) { 6083 doc = scripts[ scripts.length - 1 ].ownerDocument; 6084 6085 // Reenable scripts 6086 jQuery.map( scripts, restoreScript ); 6087 6088 // Evaluate executable scripts on first document insertion 6089 for ( i = 0; i < hasScripts; i++ ) { 6090 node = scripts[ i ]; 6091 if ( rscriptType.test( node.type || "" ) && 6092 !jQuery._data( node, "globalEval" ) && 6093 jQuery.contains( doc, node ) ) { 6094 6095 if ( node.src ) { 6096 6097 // Optional AJAX dependency, but won't run scripts if not present 6098 if ( jQuery._evalUrl ) { 6099 jQuery._evalUrl( node.src ); 6100 } 6101 } else { 6102 jQuery.globalEval( 6103 ( node.text || node.textContent || node.innerHTML || "" ) 6104 .replace( rcleanScript, "" ) 6105 ); 6106 } 6107 } 6108 } 6109 } 6110 6111 // Fix #11809: Avoid leaking memory 6112 fragment = first = null; 6113 } 6114 } 6115 6116 return collection; 6117} 6118 6119function remove( elem, selector, keepData ) { 6120 var node, 6121 elems = selector ? jQuery.filter( selector, elem ) : elem, 6122 i = 0; 6123 6124 for ( ; ( node = elems[ i ] ) != null; i++ ) { 6125 6126 if ( !keepData && node.nodeType === 1 ) { 6127 jQuery.cleanData( getAll( node ) ); 6128 } 6129 6130 if ( node.parentNode ) { 6131 if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { 6132 setGlobalEval( getAll( node, "script" ) ); 6133 } 6134 node.parentNode.removeChild( node ); 6135 } 6136 } 6137 6138 return elem; 6139} 6140 6141jQuery.extend( { 6142 htmlPrefilter: function( html ) { 6143 return html; 6144 }, 6145 6146 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 6147 var destElements, node, clone, i, srcElements, 6148 inPage = jQuery.contains( elem.ownerDocument, elem ); 6149 6150 if ( support.html5Clone || jQuery.isXMLDoc( elem ) || 6151 !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { 6152 6153 clone = elem.cloneNode( true ); 6154 6155 // IE<=8 does not properly clone detached, unknown element nodes 6156 } else { 6157 fragmentDiv.innerHTML = elem.outerHTML; 6158 fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); 6159 } 6160 6161 if ( ( !support.noCloneEvent || !support.noCloneChecked ) && 6162 ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { 6163 6164 // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 6165 destElements = getAll( clone ); 6166 srcElements = getAll( elem ); 6167 6168 // Fix all IE cloning issues 6169 for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { 6170 6171 // Ensure that the destination node is not null; Fixes #9587 6172 if ( destElements[ i ] ) { 6173 fixCloneNodeIssues( node, destElements[ i ] ); 6174 } 6175 } 6176 } 6177 6178 // Copy the events from the original to the clone 6179 if ( dataAndEvents ) { 6180 if ( deepDataAndEvents ) { 6181 srcElements = srcElements || getAll( elem ); 6182 destElements = destElements || getAll( clone ); 6183 6184 for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { 6185 cloneCopyEvent( node, destElements[ i ] ); 6186 } 6187 } else { 6188 cloneCopyEvent( elem, clone ); 6189 } 6190 } 6191 6192 // Preserve script evaluation history 6193 destElements = getAll( clone, "script" ); 6194 if ( destElements.length > 0 ) { 6195 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 6196 } 6197 6198 destElements = srcElements = node = null; 6199 6200 // Return the cloned set 6201 return clone; 6202 }, 6203 6204 cleanData: function( elems, /* internal */ forceAcceptData ) { 6205 var elem, type, id, data, 6206 i = 0, 6207 internalKey = jQuery.expando, 6208 cache = jQuery.cache, 6209 attributes = support.attributes, 6210 special = jQuery.event.special; 6211 6212 for ( ; ( elem = elems[ i ] ) != null; i++ ) { 6213 if ( forceAcceptData || acceptData( elem ) ) { 6214 6215 id = elem[ internalKey ]; 6216 data = id && cache[ id ]; 6217 6218 if ( data ) { 6219 if ( data.events ) { 6220 for ( type in data.events ) { 6221 if ( special[ type ] ) { 6222 jQuery.event.remove( elem, type ); 6223 6224 // This is a shortcut to avoid jQuery.event.remove's overhead 6225 } else { 6226 jQuery.removeEvent( elem, type, data.handle ); 6227 } 6228 } 6229 } 6230 6231 // Remove cache only if it was not already removed by jQuery.event.remove 6232 if ( cache[ id ] ) { 6233 6234 delete cache[ id ]; 6235
6236 // Support: IE<9 6237 // IE does not allow us to delete expando properties from nodes 6238 // IE creates expando attributes along with the property 6239 // IE does not have a removeAttribute function on Document nodes 6240 if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { 6241 elem.removeAttribute( internalKey ); 6242 6243 // Webkit & Blink performance suffers when deleting properties 6244 // from DOM nodes, so set to undefined instead 6245 // https://code.google.com/p/chromium/issues/detail?id=378607 6246 } else { 6247 elem[ internalKey ] = undefined; 6248 } 6249 6250 deletedIds.push( id ); 6251 } 6252 } 6253 } 6254 } 6255 } 6256} ); 6257 6258jQuery.fn.extend( { 6259 6260 // Keep domManip exposed until 3.0 (gh-2225) 6261 domManip: domManip, 6262 6263 detach: function( selector ) { 6264 return remove( this, selector, true ); 6265 }, 6266 6267 remove: function( selector ) { 6268 return remove( this, selector ); 6269 }, 6270 6271 text: function( value ) { 6272 return access( this, function( value ) { 6273 return value === undefined ? 6274 jQuery.text( this ) : 6275 this.empty().append( 6276 ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) 6277 ); 6278 }, null, value, arguments.length ); 6279 }, 6280 6281 append: function() { 6282 return domManip( this, arguments, function( elem ) { 6283 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6284 var target = manipulationTarget( this, elem ); 6285 target.appendChild( elem ); 6286 } 6287 } ); 6288 }, 6289
vendor: 4,288 bytes, lines 6290-6463
6290 prepend: function() { 6291 return domManip( this, arguments, function( elem ) { 6292 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6293 var target = manipulationTarget( this, elem ); 6294 target.insertBefore( elem, target.firstChild ); 6295 } 6296 } ); 6297 }, 6298 6299 before: function() { 6300 return domManip( this, arguments, function( elem ) { 6301 if ( this.parentNode ) { 6302 this.parentNode.insertBefore( elem, this ); 6303 } 6304 } ); 6305 }, 6306 6307 after: function() { 6308 return domManip( this, arguments, function( elem ) { 6309 if ( this.parentNode ) { 6310 this.parentNode.insertBefore( elem, this.nextSibling ); 6311 } 6312 } ); 6313 }, 6314 6315 empty: function() { 6316 var elem, 6317 i = 0; 6318 6319 for ( ; ( elem = this[ i ] ) != null; i++ ) { 6320 6321 // Remove element nodes and prevent memory leaks 6322 if ( elem.nodeType === 1 ) { 6323 jQuery.cleanData( getAll( elem, false ) ); 6324 } 6325 6326 // Remove any remaining nodes 6327 while ( elem.firstChild ) { 6328 elem.removeChild( elem.firstChild ); 6329 } 6330 6331 // If this is a select, ensure that it displays empty (#12336) 6332 // Support: IE<9 6333 if ( elem.options && jQuery.nodeName( elem, "select" ) ) { 6334 elem.options.length = 0; 6335 } 6336 } 6337 6338 return this; 6339 }, 6340 6341 clone: function( dataAndEvents, deepDataAndEvents ) { 6342 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 6343 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 6344 6345 return this.map( function() { 6346 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 6347 } ); 6348 }, 6349 6350 html: function( value ) { 6351 return access( this, function( value ) { 6352 var elem = this[ 0 ] || {}, 6353 i = 0, 6354 l = this.length; 6355 6356 if ( value === undefined ) { 6357 return elem.nodeType === 1 ? 6358 elem.innerHTML.replace( rinlinejQuery, "" ) : 6359 undefined; 6360 } 6361 6362 // See if we can take a shortcut and just use innerHTML 6363 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 6364 ( support.htmlSerialize || !rnoshimcache.test( value ) ) && 6365 ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && 6366 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 6367 6368 value = jQuery.htmlPrefilter( value ); 6369 6370 try { 6371 for ( ; i < l; i++ ) { 6372 6373 // Remove element nodes and prevent memory leaks 6374 elem = this[ i ] || {}; 6375 if ( elem.nodeType === 1 ) { 6376 jQuery.cleanData( getAll( elem, false ) ); 6377 elem.innerHTML = value; 6378 } 6379 } 6380 6381 elem = 0; 6382 6383 // If using innerHTML throws an exception, use the fallback method 6384 } catch ( e ) {} 6385 } 6386 6387 if ( elem ) { 6388 this.empty().append( value ); 6389 } 6390 }, null, value, arguments.length ); 6391 }, 6392 6393 replaceWith: function() { 6394 var ignored = []; 6395 6396 // Make the changes, replacing each non-ignored context element with the new content 6397 return domManip( this, arguments, function( elem ) { 6398 var parent = this.parentNode; 6399 6400 if ( jQuery.inArray( this, ignored ) < 0 ) { 6401 jQuery.cleanData( getAll( this ) ); 6402 if ( parent ) { 6403 parent.replaceChild( elem, this ); 6404 } 6405 } 6406 6407 // Force callback invocation 6408 }, ignored ); 6409 } 6410} ); 6411 6412jQuery.each( { 6413 appendTo: "append", 6414 prependTo: "prepend", 6415 insertBefore: "before", 6416 insertAfter: "after", 6417 replaceAll: "replaceWith" 6418}, function( name, original ) { 6419 jQuery.fn[ name ] = function( selector ) { 6420 var elems, 6421 i = 0, 6422 ret = [], 6423 insert = jQuery( selector ), 6424 last = insert.length - 1; 6425 6426 for ( ; i <= last; i++ ) { 6427 elems = i === last ? this : this.clone( true ); 6428 jQuery( insert[ i ] )[ original ]( elems ); 6429 6430 // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() 6431 push.apply( ret, elems.get() ); 6432 } 6433 6434 return this.pushStack( ret ); 6435 }; 6436} ); 6437 6438 6439var iframe, 6440 elemdisplay = { 6441 6442 // Support: Firefox 6443 // We have to pre-define these values for FF (#10227) 6444 HTML: "block", 6445 BODY: "block" 6446 }; 6447 6448/** 6449 * Retrieve the actual display of a element 6450 * @param {String} name nodeName of the element 6451 * @param {Object} doc Document object 6452 */ 6453 6454// Called only from within defaultDisplay 6455function actualDisplay( name, doc ) { 6456 var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), 6457 6458 display = jQuery.css( elem[ 0 ], "display" ); 6459 6460 // We don't have any data stored on the element, 6461 // so use "detach" method as fast way to get rid of the element 6462 elem.detach(); 6463
6464 return display; 6465} 6466 6467/** 6468 * Try to determine the default display value of an element 6469 * @param {String} nodeName 6470 */ 6471function defaultDisplay( nodeName ) { 6472 var doc = document, 6473 display = elemdisplay[ nodeName ]; 6474 6475 if ( !display ) { 6476 display = actualDisplay( nodeName, doc ); 6477 6478 // If the simple way fails, read from inside an iframe 6479 if ( display === "none" || !display ) { 6480 6481 // Use the already-created iframe if possible 6482 iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) ) 6483 .appendTo( doc.documentElement ); 6484 6485 // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse 6486 doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document; 6487 6488 // Support: IE 6489 doc.write(); 6490 doc.close(); 6491 6492 display = actualDisplay( nodeName, doc ); 6493 iframe.detach(); 6494 } 6495 6496 // Store the correct default display 6497 elemdisplay[ nodeName ] = display; 6498 } 6499 6500 return display; 6501} 6502var rmargin = ( /^margin/ ); 6503 6504var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 6505 6506var swap = function( elem, options, callback, args ) { 6507 var ret, name, 6508 old = {}; 6509 6510 // Remember the old values, and insert the new ones 6511 for ( name in options ) { 6512 old[ name ] = elem.style[ name ]; 6513 elem.style[ name ] = options[ name ]; 6514 } 6515 6516 ret = callback.apply( elem, args || [] ); 6517 6518 // Revert the old values 6519 for ( name in options ) { 6520 elem.style[ name ] = old[ name ]; 6521 } 6522 6523 return ret; 6524}; 6525 6526 6527var documentElement = document.documentElement; 6528 6529 6530 6531( function() { 6532 var pixelPositionVal, pixelMarginRightVal, boxSizingReliableVal, 6533 reliableHiddenOffsetsVal, reliableMarginRightVal, reliableMarginLeftVal, 6534 container = document.createElement( "div" ), 6535 div = document.createElement( "div" ); 6536 6537 // Finish early in limited (non-browser) environments 6538 if ( !div.style ) { 6539 return; 6540 } 6541 6542 div.style.cssText = "float:left;opacity:.5"; 6543 6544 // Support: IE<9 6545 // Make sure that element opacity exists (as opposed to filter) 6546 support.opacity = div.style.opacity === "0.5"; 6547 6548 // Verify style float existence 6549 // (IE uses styleFloat instead of cssFloat) 6550 support.cssFloat = !!div.style.cssFloat; 6551 6552 div.style.backgroundClip = "content-box"; 6553 div.cloneNode( true ).style.backgroundClip = ""; 6554 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 6555 6556 container = document.createElement( "div" ); 6557 container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + 6558 "padding:0;margin-top:1px;position:absolute"; 6559 div.innerHTML = ""; 6560 container.appendChild( div ); 6561 6562 // Support: Firefox<29, Android 2.3 6563 // Vendor-prefix box-sizing 6564 support.boxSizing = div.style.boxSizing === "" || div.style.MozBoxSizing === "" || 6565 div.style.WebkitBoxSizing === ""; 6566 6567 jQuery.extend( support, { 6568 reliableHiddenOffsets: function() { 6569 if ( pixelPositionVal == null ) { 6570 computeStyleTests(); 6571 } 6572 return reliableHiddenOffsetsVal; 6573 }, 6574 6575 boxSizingReliable: function() { 6576 6577 // We're checking for pixelPositionVal here instead of boxSizingReliableVal 6578 // since that compresses better and they're computed together anyway. 6579 if ( pixelPositionVal == null ) { 6580 computeStyleTests(); 6581 } 6582 return boxSizingReliableVal; 6583 }, 6584 6585 pixelMarginRight: function() { 6586 6587 // Support: Android 4.0-4.3 6588 if ( pixelPositionVal == null ) { 6589 computeStyleTests(); 6590 } 6591 return pixelMarginRightVal; 6592 }, 6593 6594 pixelPosition: function() { 6595 if ( pixelPositionVal == null ) { 6596 computeStyleTests(); 6597 } 6598 return pixelPositionVal; 6599 }, 6600 6601 reliableMarginRight: function() { 6602 6603 // Support: Android 2.3 6604 if ( pixelPositionVal == null ) { 6605 computeStyleTests(); 6606 } 6607 return reliableMarginRightVal; 6608 }, 6609 6610 reliableMarginLeft: function() { 6611 6612 // Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37 6613 if ( pixelPositionVal == null ) { 6614 computeStyleTests(); 6615 } 6616 return reliableMarginLeftVal; 6617 } 6618 } ); 6619 6620 function computeStyleTests() { 6621 var contents, divStyle, 6622 documentElement = document.documentElement; 6623 6624 // Setup 6625 documentElement.appendChild( container ); 6626 6627 div.style.cssText = 6628 6629 // Support: Android 2.3 6630 // Vendor-prefix box-sizing 6631 "-webkit-box-sizing:border-box;box-sizing:border-box;" + 6632 "position:relative;display:block;" + 6633 "margin:auto;border:1px;padding:1px;" + 6634 "top:1%;width:50%"; 6635
6636 // Support: IE<9 6637 // Assume reasonable values in the absence of getComputedStyle 6638 pixelPositionVal = boxSizingReliableVal = reliableMarginLeftVal = false; 6639 pixelMarginRightVal = reliableMarginRightVal = true; 6640 6641 // Check for getComputedStyle so that this code is not run in IE<9. 6642 if ( window.getComputedStyle ) { 6643 divStyle = window.getComputedStyle( div ); 6644 pixelPositionVal = ( divStyle || {} ).top !== "1%"; 6645 reliableMarginLeftVal = ( divStyle || {} ).marginLeft === "2px"; 6646 boxSizingReliableVal = ( divStyle || { width: "4px" } ).width === "4px"; 6647 6648 // Support: Android 4.0 - 4.3 only 6649 // Some styles come back with percentage values, even though they shouldn't 6650 div.style.marginRight = "50%"; 6651 pixelMarginRightVal = ( divStyle || { marginRight: "4px" } ).marginRight === "4px"; 6652 6653 // Support: Android 2.3 only 6654 // Div with explicit width and no margin-right incorrectly 6655 // gets computed margin-right based on width of container (#3333) 6656 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right 6657 contents = div.appendChild( document.createElement( "div" ) ); 6658 6659 // Reset CSS: box-sizing; display; margin; border; padding 6660 contents.style.cssText = div.style.cssText = 6661 6662 // Support: Android 2.3 6663 // Vendor-prefix box-sizing 6664 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + 6665 "box-sizing:content-box;display:block;margin:0;border:0;padding:0"; 6666 contents.style.marginRight = contents.style.width = "0"; 6667 div.style.width = "1px"; 6668 6669 reliableMarginRightVal = 6670 !parseFloat( ( window.getComputedStyle( contents ) || {} ).marginRight ); 6671 6672 div.removeChild( contents ); 6673 } 6674 6675 // Support: IE6-8 6676 // First check that getClientRects works as expected 6677 // Check if table cells still have offsetWidth/Height when they are set 6678 // to display:none and there are still other visible table cells in a 6679 // table row; if so, offsetWidth/Height are not reliable for use when 6680 // determining if an element has been hidden directly using 6681 // display:none (it is still safe to use offsets if a parent element is 6682 // hidden; don safety goggles and see bug #4512 for more information). 6683 div.style.display = "none"; 6684 reliableHiddenOffsetsVal = div.getClientRects().length === 0; 6685 if ( reliableHiddenOffsetsVal ) { 6686 div.style.display = ""; 6687 div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>"; 6688 div.childNodes[ 0 ].style.borderCollapse = "separate"; 6689 contents = div.getElementsByTagName( "td" ); 6690 contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none"; 6691 reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0; 6692 if ( reliableHiddenOffsetsVal ) { 6693 contents[ 0 ].style.display = ""; 6694 contents[ 1 ].style.display = "none"; 6695 reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0; 6696 } 6697 } 6698 6699 // Teardown 6700 documentElement.removeChild( container ); 6701 } 6702 6703} )(); 6704 6705 6706var getStyles, curCSS, 6707 rposition = /^(top|right|bottom|left)$/; 6708 6709if ( window.getComputedStyle ) { 6710 getStyles = function( elem ) { 6711 6712 // Support: IE<=11+, Firefox<=30+ (#15098, #14150) 6713 // IE throws on elements created in popups 6714 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 6715 var view = elem.ownerDocument.defaultView; 6716 6717 if ( !view || !view.opener ) { 6718 view = window; 6719 } 6720 6721 return view.getComputedStyle( elem ); 6722 }; 6723 6724 curCSS = function( elem, name, computed ) { 6725 var width, minWidth, maxWidth, ret, 6726 style = elem.style; 6727 6728 computed = computed || getStyles( elem ); 6729 6730 // getPropertyValue is only needed for .css('filter') in IE9, see #12537 6731 ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined; 6732 6733 // Support: Opera 12.1x only 6734 // Fall back to style even without computed 6735 // computed is undefined for elems on document fragments 6736 if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) { 6737 ret = jQuery.style( elem, name ); 6738 } 6739 6740 if ( computed ) { 6741 6742 // A tribute to the "awesome hack by Dean Edwards" 6743 // Chrome < 17 and Safari 5.0 uses "computed value" 6744 // instead of "used value" for margin-right 6745 // Safari 5.1.7 (at least) returns percentage for a larger set of values, 6746 // but width seems to be reliably pixels 6747 // this is against the CSSOM draft spec: 6748 // http://dev.w3.org/csswg/cssom/#resolved-values 6749 if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { 6750 6751 // Remember the original values 6752 width = style.width; 6753 minWidth = style.minWidth; 6754 maxWidth = style.maxWidth; 6755 6756 // Put in the new values to get a computed value out 6757 style.minWidth = style.maxWidth = style.width = ret; 6758 ret = computed.width; 6759 6760 // Revert the changed values 6761 style.width = width; 6762 style.minWidth = minWidth; 6763 style.maxWidth = maxWidth; 6764 } 6765 } 6766
vendor: 4,152 bytes, lines 6767-6929
6767 // Support: IE 6768 // IE returns zIndex value as an integer. 6769 return ret === undefined ? 6770 ret : 6771 ret + ""; 6772 }; 6773} else if ( documentElement.currentStyle ) { 6774 getStyles = function( elem ) { 6775 return elem.currentStyle; 6776 }; 6777 6778 curCSS = function( elem, name, computed ) { 6779 var left, rs, rsLeft, ret, 6780 style = elem.style; 6781 6782 computed = computed || getStyles( elem ); 6783 ret = computed ? computed[ name ] : undefined; 6784 6785 // Avoid setting ret to empty string here 6786 // so we don't default to auto 6787 if ( ret == null && style && style[ name ] ) { 6788 ret = style[ name ]; 6789 } 6790 6791 // From the awesome hack by Dean Edwards 6792 // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 6793 6794 // If we're not dealing with a regular pixel number 6795 // but a number that has a weird ending, we need to convert it to pixels 6796 // but not position css attributes, as those are 6797 // proportional to the parent element instead 6798 // and we can't measure the parent instead because it 6799 // might trigger a "stacking dolls" problem 6800 if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { 6801 6802 // Remember the original values 6803 left = style.left; 6804 rs = elem.runtimeStyle; 6805 rsLeft = rs && rs.left; 6806 6807 // Put in the new values to get a computed value out 6808 if ( rsLeft ) { 6809 rs.left = elem.currentStyle.left; 6810 } 6811 style.left = name === "fontSize" ? "1em" : ret; 6812 ret = style.pixelLeft + "px"; 6813 6814 // Revert the changed values 6815 style.left = left; 6816 if ( rsLeft ) { 6817 rs.left = rsLeft; 6818 } 6819 } 6820 6821 // Support: IE 6822 // IE returns zIndex value as an integer. 6823 return ret === undefined ? 6824 ret : 6825 ret + "" || "auto"; 6826 }; 6827} 6828 6829 6830 6831 6832function addGetHookIf( conditionFn, hookFn ) { 6833 6834 // Define the hook, we'll check on the first run if it's really needed. 6835 return { 6836 get: function() { 6837 if ( conditionFn() ) { 6838 6839 // Hook not needed (or it's not possible to use it due 6840 // to missing dependency), remove it. 6841 delete this.get; 6842 return; 6843 } 6844 6845 // Hook needed; redefine it so that the support test is not executed again. 6846 return ( this.get = hookFn ).apply( this, arguments ); 6847 } 6848 }; 6849} 6850 6851 6852var 6853 6854 ralpha = /alpha\([^)]*\)/i, 6855 ropacity = /opacity\s*=\s*([^)]*)/i, 6856 6857 // swappable if display is none or starts with table except 6858 // "table", "table-cell", or "table-caption" 6859 // see here for display values: 6860 // https://developer.mozilla.org/en-US/docs/CSS/display 6861 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 6862 rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ), 6863 6864 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6865 cssNormalTransform = { 6866 letterSpacing: "0", 6867 fontWeight: "400" 6868 }, 6869 6870 cssPrefixes = [ "Webkit", "O", "Moz", "ms" ], 6871 emptyStyle = document.createElement( "div" ).style; 6872 6873 6874// return a css property mapped to a potentially vendor prefixed property 6875function vendorPropName( name ) { 6876 6877 // shortcut for names that are not vendor prefixed 6878 if ( name in emptyStyle ) { 6879 return name; 6880 } 6881 6882 // check for vendor prefixed names 6883 var capName = name.charAt( 0 ).toUpperCase() + name.slice( 1 ), 6884 i = cssPrefixes.length; 6885 6886 while ( i-- ) { 6887 name = cssPrefixes[ i ] + capName; 6888 if ( name in emptyStyle ) { 6889 return name; 6890 } 6891 } 6892} 6893 6894function showHide( elements, show ) { 6895 var display, elem, hidden, 6896 values = [], 6897 index = 0, 6898 length = elements.length; 6899 6900 for ( ; index < length; index++ ) { 6901 elem = elements[ index ]; 6902 if ( !elem.style ) { 6903 continue; 6904 } 6905 6906 values[ index ] = jQuery._data( elem, "olddisplay" ); 6907 display = elem.style.display; 6908 if ( show ) { 6909 6910 // Reset the inline display of this element to learn if it is 6911 // being hidden by cascaded rules or not 6912 if ( !values[ index ] && display === "none" ) { 6913 elem.style.display = ""; 6914 } 6915 6916 // Set elements which have been overridden with display: none 6917 // in a stylesheet to whatever the default browser style is 6918 // for such an element 6919 if ( elem.style.display === "" && isHidden( elem ) ) { 6920 values[ index ] = 6921 jQuery._data( elem, "olddisplay", defaultDisplay( elem.nodeName ) ); 6922 } 6923 } else { 6924 hidden = isHidden( elem ); 6925 6926 if ( display && display !== "none" || !hidden ) { 6927 jQuery._data( 6928 elem, 6929 "olddisplay",
vendor: 6,043 bytes, lines 6930-7141
6930 hidden ? display : jQuery.css( elem, "display" ) 6931 ); 6932 } 6933 } 6934 } 6935 6936 // Set the display of most of the elements in a second loop 6937 // to avoid the constant reflow 6938 for ( index = 0; index < length; index++ ) { 6939 elem = elements[ index ]; 6940 if ( !elem.style ) { 6941 continue; 6942 } 6943 if ( !show || elem.style.display === "none" || elem.style.display === "" ) { 6944 elem.style.display = show ? values[ index ] || "" : "none"; 6945 } 6946 } 6947 6948 return elements; 6949} 6950 6951function setPositiveNumber( elem, value, subtract ) { 6952 var matches = rnumsplit.exec( value ); 6953 return matches ? 6954 6955 // Guard against undefined "subtract", e.g., when used as in cssHooks 6956 Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : 6957 value; 6958} 6959 6960function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { 6961 var i = extra === ( isBorderBox ? "border" : "content" ) ? 6962 6963 // If we already have the right measurement, avoid augmentation 6964 4 : 6965 6966 // Otherwise initialize for horizontal or vertical properties 6967 name === "width" ? 1 : 0, 6968 6969 val = 0; 6970 6971 for ( ; i < 4; i += 2 ) { 6972 6973 // both box models exclude margin, so add it if we want it 6974 if ( extra === "margin" ) { 6975 val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); 6976 } 6977 6978 if ( isBorderBox ) { 6979 6980 // border-box includes padding, so remove it if we want content 6981 if ( extra === "content" ) { 6982 val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6983 } 6984 6985 // at this point, extra isn't border nor margin, so remove border 6986 if ( extra !== "margin" ) { 6987 val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6988 } 6989 } else { 6990 6991 // at this point, extra isn't content, so add padding 6992 val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6993 6994 // at this point, extra isn't content nor padding, so add border 6995 if ( extra !== "padding" ) { 6996 val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6997 } 6998 } 6999 } 7000 7001 return val; 7002} 7003 7004function getWidthOrHeight( elem, name, extra ) { 7005 7006 // Start with offset property, which is equivalent to the border-box value 7007 var valueIsBorderBox = true, 7008 val = name === "width" ? elem.offsetWidth : elem.offsetHeight, 7009 styles = getStyles( elem ), 7010 isBorderBox = support.boxSizing && 7011 jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 7012 7013 // some non-html elements return undefined for offsetWidth, so check for null/undefined 7014 // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 7015 // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 7016 if ( val <= 0 || val == null ) { 7017 7018 // Fall back to computed then uncomputed css if necessary 7019 val = curCSS( elem, name, styles ); 7020 if ( val < 0 || val == null ) { 7021 val = elem.style[ name ]; 7022 } 7023 7024 // Computed unit is not pixels. Stop here and return. 7025 if ( rnumnonpx.test( val ) ) { 7026 return val; 7027 } 7028 7029 // we need the check for style in case a browser which returns unreliable values 7030 // for getComputedStyle silently falls back to the reliable elem.style 7031 valueIsBorderBox = isBorderBox && 7032 ( support.boxSizingReliable() || val === elem.style[ name ] ); 7033 7034 // Normalize "", auto, and prepare for extra 7035 val = parseFloat( val ) || 0; 7036 } 7037 7038 // use the active box-sizing model to add/subtract irrelevant styles 7039 return ( val + 7040 augmentWidthOrHeight( 7041 elem, 7042 name, 7043 extra || ( isBorderBox ? "border" : "content" ), 7044 valueIsBorderBox, 7045 styles 7046 ) 7047 ) + "px"; 7048} 7049 7050jQuery.extend( { 7051 7052 // Add in style property hooks for overriding the default 7053 // behavior of getting and setting a style property 7054 cssHooks: { 7055 opacity: { 7056 get: function( elem, computed ) { 7057 if ( computed ) { 7058 7059 // We should always get a number back from opacity 7060 var ret = curCSS( elem, "opacity" ); 7061 return ret === "" ? "1" : ret; 7062 } 7063 } 7064 } 7065 }, 7066 7067 // Don't automatically add "px" to these possibly-unitless properties 7068 cssNumber: { 7069 "animationIterationCount": true, 7070 "columnCount": true, 7071 "fillOpacity": true, 7072 "flexGrow": true, 7073 "flexShrink": true, 7074 "fontWeight": true, 7075 "lineHeight": true, 7076 "opacity": true, 7077 "order": true, 7078 "orphans": true, 7079 "widows": true, 7080 "zIndex": true, 7081 "zoom": true 7082 }, 7083 7084 // Add in properties whose names you wish to fix before 7085 // setting or getting the value 7086 cssProps: { 7087 7088 // normalize float css property 7089 "float": support.cssFloat ? "cssFloat" : "styleFloat" 7090 }, 7091 7092 // Get and set the style property on a DOM Node 7093 style: function( elem, name, value, extra ) { 7094 7095 // Don't set styles on text and comment nodes 7096 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 7097 return; 7098 } 7099 7100 // Make sure that we're working with the right name 7101 var ret, type, hooks, 7102 origName = jQuery.camelCase( name ), 7103 style = elem.style; 7104 7105 name = jQuery.cssProps[ origName ] || 7106 ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); 7107 7108 // gets hook for the prefixed version 7109 // followed by the unprefixed version 7110 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 7111 7112 // Check if we're setting a value 7113 if ( value !== undefined ) { 7114 type = typeof value; 7115 7116 // Convert "+=" or "-=" to relative numbers (#7345) 7117 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 7118 value = adjustCSS( elem, name, ret ); 7119 7120 // Fixes bug #9237 7121 type = "number"; 7122 } 7123 7124 // Make sure that null and NaN values aren't set. See: #7116 7125 if ( value == null || value !== value ) { 7126 return; 7127 } 7128 7129 // If a number was passed in, add the unit (except for certain CSS properties) 7130 if ( type === "number" ) { 7131 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 7132 } 7133 7134 // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, 7135 // but it would mean to define eight 7136 // (for every problematic property) identical functions 7137 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 7138 style[ name ] = "inherit"; 7139 } 7140 7141 // If a hook was provided, use that value, otherwise just set the specified value
vendor: 4,586 bytes, lines 7142-7297
7142 if ( !hooks || !( "set" in hooks ) || 7143 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 7144 7145 // Support: IE 7146 // Swallow errors from 'invalid' CSS values (#5509) 7147 try { 7148 style[ name ] = value; 7149 } catch ( e ) {} 7150 } 7151 7152 } else { 7153 7154 // If a hook was provided get the non-computed value from there 7155 if ( hooks && "get" in hooks && 7156 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 7157 7158 return ret; 7159 } 7160 7161 // Otherwise just get the value from the style object 7162 return style[ name ]; 7163 } 7164 }, 7165 7166 css: function( elem, name, extra, styles ) { 7167 var num, val, hooks, 7168 origName = jQuery.camelCase( name ); 7169 7170 // Make sure that we're working with the right name 7171 name = jQuery.cssProps[ origName ] || 7172 ( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName ); 7173 7174 // gets hook for the prefixed version 7175 // followed by the unprefixed version 7176 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 7177 7178 // If a hook was provided get the computed value from there 7179 if ( hooks && "get" in hooks ) { 7180 val = hooks.get( elem, true, extra ); 7181 } 7182 7183 // Otherwise, if a way to get the computed value exists, use that 7184 if ( val === undefined ) { 7185 val = curCSS( elem, name, styles ); 7186 } 7187 7188 //convert "normal" to computed value 7189 if ( val === "normal" && name in cssNormalTransform ) { 7190 val = cssNormalTransform[ name ]; 7191 } 7192 7193 // Return, converting to number if forced or a qualifier was provided and val looks numeric 7194 if ( extra === "" || extra ) { 7195 num = parseFloat( val ); 7196 return extra === true || isFinite( num ) ? num || 0 : val; 7197 } 7198 return val; 7199 } 7200} ); 7201 7202jQuery.each( [ "height", "width" ], function( i, name ) { 7203 jQuery.cssHooks[ name ] = { 7204 get: function( elem, computed, extra ) { 7205 if ( computed ) { 7206 7207 // certain elements can have dimension info if we invisibly show them 7208 // however, it must have a current display style that would benefit from this 7209 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 7210 elem.offsetWidth === 0 ? 7211 swap( elem, cssShow, function() { 7212 return getWidthOrHeight( elem, name, extra ); 7213 } ) : 7214 getWidthOrHeight( elem, name, extra ); 7215 } 7216 }, 7217 7218 set: function( elem, value, extra ) { 7219 var styles = extra && getStyles( elem ); 7220 return setPositiveNumber( elem, value, extra ? 7221 augmentWidthOrHeight( 7222 elem, 7223 name, 7224 extra, 7225 support.boxSizing && 7226 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 7227 styles 7228 ) : 0 7229 ); 7230 } 7231 }; 7232} ); 7233 7234if ( !support.opacity ) { 7235 jQuery.cssHooks.opacity = { 7236 get: function( elem, computed ) { 7237 7238 // IE uses filters for opacity 7239 return ropacity.test( ( computed && elem.currentStyle ? 7240 elem.currentStyle.filter : 7241 elem.style.filter ) || "" ) ? 7242 ( 0.01 * parseFloat( RegExp.$1 ) ) + "" : 7243 computed ? "1" : ""; 7244 }, 7245 7246 set: function( elem, value ) { 7247 var style = elem.style, 7248 currentStyle = elem.currentStyle, 7249 opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", 7250 filter = currentStyle && currentStyle.filter || style.filter || ""; 7251 7252 // IE has trouble with opacity if it does not have layout 7253 // Force it by setting the zoom level 7254 style.zoom = 1; 7255 7256 // if setting opacity to 1, and no other filters exist - 7257 // attempt to remove filter attribute #6652 7258 // if value === "", then remove inline opacity #12685 7259 if ( ( value >= 1 || value === "" ) && 7260 jQuery.trim( filter.replace( ralpha, "" ) ) === "" && 7261 style.removeAttribute ) { 7262 7263 // Setting style.filter to null, "" & " " still leave "filter:" in the cssText 7264 // if "filter:" is present at all, clearType is disabled, we want to avoid this 7265 // style.removeAttribute is IE Only, but so apparently is this code path... 7266 style.removeAttribute( "filter" ); 7267 7268 // if there is no filter style applied in a css rule 7269 // or unset inline opacity, we are done 7270 if ( value === "" || currentStyle && !currentStyle.filter ) { 7271 return; 7272 } 7273 } 7274 7275 // otherwise, set new filter values 7276 style.filter = ralpha.test( filter ) ? 7277 filter.replace( ralpha, opacity ) : 7278 filter + " " + opacity; 7279 } 7280 }; 7281} 7282 7283jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight, 7284 function( elem, computed ) { 7285 if ( computed ) { 7286 return swap( elem, { "display": "inline-block" }, 7287 curCSS, [ elem, "marginRight" ] ); 7288 } 7289 } 7290); 7291 7292jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 7293 function( elem, computed ) { 7294 if ( computed ) { 7295 return ( 7296 parseFloat( curCSS( elem, "marginLeft" ) ) || 7297
vendor: 4,625 bytes, lines 7298-7476
7298 // Support: IE<=11+ 7299 // Running getBoundingClientRect on a disconnected node in IE throws an error 7300 // Support: IE8 only 7301 // getClientRects() errors on disconnected elems 7302 ( jQuery.contains( elem.ownerDocument, elem ) ? 7303 elem.getBoundingClientRect().left - 7304 swap( elem, { marginLeft: 0 }, function() { 7305 return elem.getBoundingClientRect().left; 7306 } ) : 7307 0 7308 ) 7309 ) + "px"; 7310 } 7311 } 7312); 7313 7314// These hooks are used by animate to expand properties 7315jQuery.each( { 7316 margin: "", 7317 padding: "", 7318 border: "Width" 7319}, function( prefix, suffix ) { 7320 jQuery.cssHooks[ prefix + suffix ] = { 7321 expand: function( value ) { 7322 var i = 0, 7323 expanded = {}, 7324 7325 // assumes a single number if not a string 7326 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 7327 7328 for ( ; i < 4; i++ ) { 7329 expanded[ prefix + cssExpand[ i ] + suffix ] = 7330 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 7331 } 7332 7333 return expanded; 7334 } 7335 }; 7336 7337 if ( !rmargin.test( prefix ) ) { 7338 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 7339 } 7340} ); 7341 7342jQuery.fn.extend( { 7343 css: function( name, value ) { 7344 return access( this, function( elem, name, value ) { 7345 var styles, len, 7346 map = {}, 7347 i = 0; 7348 7349 if ( jQuery.isArray( name ) ) { 7350 styles = getStyles( elem ); 7351 len = name.length; 7352 7353 for ( ; i < len; i++ ) { 7354 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 7355 } 7356 7357 return map; 7358 } 7359 7360 return value !== undefined ? 7361 jQuery.style( elem, name, value ) : 7362 jQuery.css( elem, name ); 7363 }, name, value, arguments.length > 1 ); 7364 }, 7365 show: function() { 7366 return showHide( this, true ); 7367 }, 7368 hide: function() { 7369 return showHide( this ); 7370 }, 7371 toggle: function( state ) { 7372 if ( typeof state === "boolean" ) { 7373 return state ? this.show() : this.hide(); 7374 } 7375 7376 return this.each( function() { 7377 if ( isHidden( this ) ) { 7378 jQuery( this ).show(); 7379 } else { 7380 jQuery( this ).hide(); 7381 } 7382 } ); 7383 } 7384} ); 7385 7386 7387function Tween( elem, options, prop, end, easing ) { 7388 return new Tween.prototype.init( elem, options, prop, end, easing ); 7389} 7390jQuery.Tween = Tween; 7391 7392Tween.prototype = { 7393 constructor: Tween, 7394 init: function( elem, options, prop, end, easing, unit ) { 7395 this.elem = elem; 7396 this.prop = prop; 7397 this.easing = easing || jQuery.easing._default; 7398 this.options = options; 7399 this.start = this.now = this.cur(); 7400 this.end = end; 7401 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 7402 }, 7403 cur: function() { 7404 var hooks = Tween.propHooks[ this.prop ]; 7405 7406 return hooks && hooks.get ? 7407 hooks.get( this ) : 7408 Tween.propHooks._default.get( this ); 7409 }, 7410 run: function( percent ) { 7411 var eased, 7412 hooks = Tween.propHooks[ this.prop ]; 7413 7414 if ( this.options.duration ) { 7415 this.pos = eased = jQuery.easing[ this.easing ]( 7416 percent, this.options.duration * percent, 0, 1, this.options.duration 7417 ); 7418 } else { 7419 this.pos = eased = percent; 7420 } 7421 this.now = ( this.end - this.start ) * eased + this.start; 7422 7423 if ( this.options.step ) { 7424 this.options.step.call( this.elem, this.now, this ); 7425 } 7426 7427 if ( hooks && hooks.set ) { 7428 hooks.set( this ); 7429 } else { 7430 Tween.propHooks._default.set( this ); 7431 } 7432 return this; 7433 } 7434}; 7435 7436Tween.prototype.init.prototype = Tween.prototype; 7437 7438Tween.propHooks = { 7439 _default: { 7440 get: function( tween ) { 7441 var result; 7442 7443 // Use a property on the element directly when it is not a DOM element, 7444 // or when there is no matching style property that exists. 7445 if ( tween.elem.nodeType !== 1 || 7446 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 7447 return tween.elem[ tween.prop ]; 7448 } 7449 7450 // passing an empty string as a 3rd parameter to .css will automatically 7451 // attempt a parseFloat and fallback to a string if the parse fails 7452 // so, simple values such as "10px" are parsed to Float. 7453 // complex values such as "rotate(1rad)" are returned as is. 7454 result = jQuery.css( tween.elem, tween.prop, "" ); 7455 7456 // Empty strings, null, undefined and "auto" are converted to 0. 7457 return !result || result === "auto" ? 0 : result; 7458 }, 7459 set: function( tween ) { 7460 7461 // use step hook for back compat - use cssHook if its there - use .style if its 7462 // available and use plain properties where available 7463 if ( jQuery.fx.step[ tween.prop ] ) { 7464 jQuery.fx.step[ tween.prop ]( tween ); 7465 } else if ( tween.elem.nodeType === 1 && 7466 ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || 7467 jQuery.cssHooks[ tween.prop ] ) ) { 7468 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 7469 } else { 7470 tween.elem[ tween.prop ] = tween.now; 7471 } 7472 } 7473 } 7474}; 7475 7476// Support: IE <=9
vendor: 5,654 bytes, lines 7477-7693
7477// Panic based approach to setting things on disconnected nodes 7478 7479Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 7480 set: function( tween ) { 7481 if ( tween.elem.nodeType && tween.elem.parentNode ) { 7482 tween.elem[ tween.prop ] = tween.now; 7483 } 7484 } 7485}; 7486 7487jQuery.easing = { 7488 linear: function( p ) { 7489 return p; 7490 }, 7491 swing: function( p ) { 7492 return 0.5 - Math.cos( p * Math.PI ) / 2; 7493 }, 7494 _default: "swing" 7495}; 7496 7497jQuery.fx = Tween.prototype.init; 7498 7499// Back Compat <1.8 extension point 7500jQuery.fx.step = {}; 7501 7502 7503 7504 7505var 7506 fxNow, timerId, 7507 rfxtypes = /^(?:toggle|show|hide)$/, 7508 rrun = /queueHooks$/; 7509 7510// Animations created synchronously will run synchronously 7511function createFxNow() { 7512 window.setTimeout( function() { 7513 fxNow = undefined; 7514 } ); 7515 return ( fxNow = jQuery.now() ); 7516} 7517 7518// Generate parameters to create a standard animation 7519function genFx( type, includeWidth ) { 7520 var which, 7521 attrs = { height: type }, 7522 i = 0; 7523 7524 // if we include width, step value is 1 to do all cssExpand values, 7525 // if we don't include width, step value is 2 to skip over Left and Right 7526 includeWidth = includeWidth ? 1 : 0; 7527 for ( ; i < 4 ; i += 2 - includeWidth ) { 7528 which = cssExpand[ i ]; 7529 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 7530 } 7531 7532 if ( includeWidth ) { 7533 attrs.opacity = attrs.width = type; 7534 } 7535 7536 return attrs; 7537} 7538 7539function createTween( value, prop, animation ) { 7540 var tween, 7541 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 7542 index = 0, 7543 length = collection.length; 7544 for ( ; index < length; index++ ) { 7545 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 7546 7547 // we're done with this property 7548 return tween; 7549 } 7550 } 7551} 7552 7553function defaultPrefilter( elem, props, opts ) { 7554 /* jshint validthis: true */ 7555 var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay, 7556 anim = this, 7557 orig = {}, 7558 style = elem.style, 7559 hidden = elem.nodeType && isHidden( elem ), 7560 dataShow = jQuery._data( elem, "fxshow" ); 7561 7562 // handle queue: false promises 7563 if ( !opts.queue ) { 7564 hooks = jQuery._queueHooks( elem, "fx" ); 7565 if ( hooks.unqueued == null ) { 7566 hooks.unqueued = 0; 7567 oldfire = hooks.empty.fire; 7568 hooks.empty.fire = function() { 7569 if ( !hooks.unqueued ) { 7570 oldfire(); 7571 } 7572 }; 7573 } 7574 hooks.unqueued++; 7575 7576 anim.always( function() { 7577 7578 // doing this makes sure that the complete handler will be called 7579 // before this completes 7580 anim.always( function() { 7581 hooks.unqueued--; 7582 if ( !jQuery.queue( elem, "fx" ).length ) { 7583 hooks.empty.fire(); 7584 } 7585 } ); 7586 } ); 7587 } 7588 7589 // height/width overflow pass 7590 if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) { 7591 7592 // Make sure that nothing sneaks out 7593 // Record all 3 overflow attributes because IE does not 7594 // change the overflow attribute when overflowX and 7595 // overflowY are set to the same value 7596 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 7597 7598 // Set display property to inline-block for height/width 7599 // animations on inline elements that are having width/height animated 7600 display = jQuery.css( elem, "display" ); 7601 7602 // Test default display if display is currently "none" 7603 checkDisplay = display === "none" ? 7604 jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display; 7605 7606 if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) { 7607 7608 // inline-level elements accept inline-block; 7609 // block-level elements need to be inline with layout 7610 if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) { 7611 style.display = "inline-block"; 7612 } else { 7613 style.zoom = 1; 7614 } 7615 } 7616 } 7617 7618 if ( opts.overflow ) { 7619 style.overflow = "hidden"; 7620 if ( !support.shrinkWrapBlocks() ) { 7621 anim.always( function() { 7622 style.overflow = opts.overflow[ 0 ]; 7623 style.overflowX = opts.overflow[ 1 ]; 7624 style.overflowY = opts.overflow[ 2 ]; 7625 } ); 7626 } 7627 } 7628 7629 // show/hide pass 7630 for ( prop in props ) { 7631 value = props[ prop ]; 7632 if ( rfxtypes.exec( value ) ) { 7633 delete props[ prop ]; 7634 toggle = toggle || value === "toggle"; 7635 if ( value === ( hidden ? "hide" : "show" ) ) { 7636 7637 // If there is dataShow left over from a stopped hide or show 7638 // and we are going to proceed with show, we should pretend to be hidden 7639 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 7640 hidden = true; 7641 } else { 7642 continue; 7643 } 7644 } 7645 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 7646 7647 // Any non-fx value stops us from restoring the original display value 7648 } else { 7649 display = undefined; 7650 } 7651 } 7652 7653 if ( !jQuery.isEmptyObject( orig ) ) { 7654 if ( dataShow ) { 7655 if ( "hidden" in dataShow ) { 7656 hidden = dataShow.hidden; 7657 } 7658 } else { 7659 dataShow = jQuery._data( elem, "fxshow", {} ); 7660 } 7661 7662 // store state if its toggle - enables .stop().toggle() to "reverse" 7663 if ( toggle ) { 7664 dataShow.hidden = !hidden; 7665 } 7666 if ( hidden ) { 7667 jQuery( elem ).show(); 7668 } else { 7669 anim.done( function() { 7670 jQuery( elem ).hide(); 7671 } ); 7672 } 7673 anim.done( function() { 7674 var prop; 7675 jQuery._removeData( elem, "fxshow" ); 7676 for ( prop in orig ) { 7677 jQuery.style( elem, prop, orig[ prop ] ); 7678 } 7679 } ); 7680 for ( prop in orig ) { 7681 tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 7682 7683 if ( !( prop in dataShow ) ) { 7684 dataShow[ prop ] = tween.start; 7685 if ( hidden ) { 7686 tween.end = tween.start; 7687 tween.start = prop === "width" || prop === "height" ? 1 : 0; 7688 } 7689 } 7690 } 7691 7692 // If this is a noop like .hide().hide(), restore an overwritten display value 7693 } else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : dis
vendor: 10,851 bytes, lines 7693-8125
7693play ) === "inline" ) { 7694 style.display = display; 7695 } 7696} 7697 7698function propFilter( props, specialEasing ) { 7699 var index, name, easing, value, hooks; 7700 7701 // camelCase, specialEasing and expand cssHook pass 7702 for ( index in props ) { 7703 name = jQuery.camelCase( index ); 7704 easing = specialEasing[ name ]; 7705 value = props[ index ]; 7706 if ( jQuery.isArray( value ) ) { 7707 easing = value[ 1 ]; 7708 value = props[ index ] = value[ 0 ]; 7709 } 7710 7711 if ( index !== name ) { 7712 props[ name ] = value; 7713 delete props[ index ]; 7714 } 7715 7716 hooks = jQuery.cssHooks[ name ]; 7717 if ( hooks && "expand" in hooks ) { 7718 value = hooks.expand( value ); 7719 delete props[ name ]; 7720 7721 // not quite $.extend, this wont overwrite keys already present. 7722 // also - reusing 'index' from above because we have the correct "name" 7723 for ( index in value ) { 7724 if ( !( index in props ) ) { 7725 props[ index ] = value[ index ]; 7726 specialEasing[ index ] = easing; 7727 } 7728 } 7729 } else { 7730 specialEasing[ name ] = easing; 7731 } 7732 } 7733} 7734 7735function Animation( elem, properties, options ) { 7736 var result, 7737 stopped, 7738 index = 0, 7739 length = Animation.prefilters.length, 7740 deferred = jQuery.Deferred().always( function() { 7741 7742 // don't match elem in the :animated selector 7743 delete tick.elem; 7744 } ), 7745 tick = function() { 7746 if ( stopped ) { 7747 return false; 7748 } 7749 var currentTime = fxNow || createFxNow(), 7750 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 7751 7752 // Support: Android 2.3 7753 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) 7754 temp = remaining / animation.duration || 0, 7755 percent = 1 - temp, 7756 index = 0, 7757 length = animation.tweens.length; 7758 7759 for ( ; index < length ; index++ ) { 7760 animation.tweens[ index ].run( percent ); 7761 } 7762 7763 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 7764 7765 if ( percent < 1 && length ) { 7766 return remaining; 7767 } else { 7768 deferred.resolveWith( elem, [ animation ] ); 7769 return false; 7770 } 7771 }, 7772 animation = deferred.promise( { 7773 elem: elem, 7774 props: jQuery.extend( {}, properties ), 7775 opts: jQuery.extend( true, { 7776 specialEasing: {}, 7777 easing: jQuery.easing._default 7778 }, options ), 7779 originalProperties: properties, 7780 originalOptions: options, 7781 startTime: fxNow || createFxNow(), 7782 duration: options.duration, 7783 tweens: [], 7784 createTween: function( prop, end ) { 7785 var tween = jQuery.Tween( elem, animation.opts, prop, end, 7786 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 7787 animation.tweens.push( tween ); 7788 return tween; 7789 }, 7790 stop: function( gotoEnd ) { 7791 var index = 0, 7792 7793 // if we are going to the end, we want to run all the tweens 7794 // otherwise we skip this part 7795 length = gotoEnd ? animation.tweens.length : 0; 7796 if ( stopped ) { 7797 return this; 7798 } 7799 stopped = true; 7800 for ( ; index < length ; index++ ) { 7801 animation.tweens[ index ].run( 1 ); 7802 } 7803 7804 // resolve when we played the last frame 7805 // otherwise, reject 7806 if ( gotoEnd ) { 7807 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7808 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 7809 } else { 7810 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 7811 } 7812 return this; 7813 } 7814 } ), 7815 props = animation.props; 7816 7817 propFilter( props, animation.opts.specialEasing ); 7818 7819 for ( ; index < length ; index++ ) { 7820 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 7821 if ( result ) { 7822 if ( jQuery.isFunction( result.stop ) ) { 7823 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 7824 jQuery.proxy( result.stop, result ); 7825 } 7826 return result; 7827 } 7828 } 7829 7830 jQuery.map( props, createTween, animation ); 7831 7832 if ( jQuery.isFunction( animation.opts.start ) ) { 7833 animation.opts.start.call( elem, animation ); 7834 } 7835 7836 jQuery.fx.timer( 7837 jQuery.extend( tick, { 7838 elem: elem, 7839 anim: animation, 7840 queue: animation.opts.queue 7841 } ) 7842 ); 7843 7844 // attach callbacks from options 7845 return animation.progress( animation.opts.progress ) 7846 .done( animation.opts.done, animation.opts.complete ) 7847 .fail( animation.opts.fail ) 7848 .always( animation.opts.always ); 7849} 7850 7851jQuery.Animation = jQuery.extend( Animation, { 7852 7853 tweeners: { 7854 "*": [ function( prop, value ) { 7855 var tween = this.createTween( prop, value ); 7856 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 7857 return tween; 7858 } ] 7859 }, 7860 7861 tweener: function( props, callback ) { 7862 if ( jQuery.isFunction( props ) ) { 7863 callback = props; 7864 props = [ "*" ]; 7865 } else { 7866 props = props.match( rnotwhite ); 7867 } 7868 7869 var prop, 7870 index = 0, 7871 length = props.length; 7872 7873 for ( ; index < length ; index++ ) { 7874 prop = props[ index ]; 7875 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 7876 Animation.tweeners[ prop ].unshift( callback ); 7877 } 7878 }, 7879 7880 prefilters: [ defaultPrefilter ], 7881 7882 prefilter: function( callback, prepend ) { 7883 if ( prepend ) { 7884 Animation.prefilters.unshift( callback ); 7885 } else { 7886 Animation.prefilters.push( callback ); 7887 } 7888 } 7889} ); 7890 7891jQuery.speed = function( speed, easing, fn ) { 7892 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 7893 complete: fn || !fn && easing || 7894 jQuery.isFunction( speed ) && speed, 7895 duration: speed, 7896 easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing 7897 }; 7898 7899 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : 7900 opt.duration in jQuery.fx.speeds ? 7901 jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default; 7902 7903 // normalize opt.queue - true/undefined/null -> "fx" 7904 if ( opt.queue == null || opt.queue === true ) { 7905 opt.queue = "fx"; 7906 } 7907 7908 // Queueing 7909 opt.old = opt.complete; 7910 7911 opt.complete = function() { 7912 if ( jQuery.isFunction( opt.old ) ) { 7913 opt.old.call( this ); 7914 } 7915 7916 if ( opt.queue ) { 7917 jQuery.dequeue( this, opt.queue ); 7918 } 7919 }; 7920 7921 return opt; 7922}; 7923 7924jQuery.fn.extend( { 7925 fadeTo: function( speed, to, easing, callback ) { 7926 7927 // show any hidden elements after setting opacity to 0 7928 return this.filter( isHidden ).css( "opacity", 0 ).show() 7929 7930 // animate to the value specified 7931 .end().animate( { opacity: to }, speed, easing, callback ); 7932 }, 7933 animate: function( prop, speed, easing, callback ) { 7934 var empty = jQuery.isEmptyObject( prop ), 7935 optall = jQuery.speed( speed, easing, callback ), 7936 doAnimation = function() { 7937 7938 // Operate on a copy of prop so per-property easing won't be lost 7939 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 7940 7941 // Empty animations, or finishing resolves immediately 7942 if ( empty || jQuery._data( this, "finish" ) ) { 7943 anim.stop( true ); 7944 } 7945 }; 7946 doAnimation.finish = doAnimation; 7947 7948 return empty || optall.queue === false ? 7949 this.each( doAnimation ) : 7950 this.queue( optall.queue, doAnimation ); 7951 }, 7952 stop: function( type, clearQueue, gotoEnd ) { 7953 var stopQueue = function( hooks ) { 7954 var stop = hooks.stop; 7955 delete hooks.stop; 7956 stop( gotoEnd ); 7957 }; 7958 7959 if ( typeof type !== "string" ) { 7960 gotoEnd = clearQueue; 7961 clearQueue = type; 7962 type = undefined; 7963 } 7964 if ( clearQueue && type !== false ) { 7965 this.queue( type || "fx", [] ); 7966 } 7967 7968 return this.each( function() { 7969 var dequeue = true, 7970 index = type != null && type + "queueHooks", 7971 timers = jQuery.timers, 7972 data = jQuery._data( this ); 7973 7974 if ( index ) { 7975 if ( data[ index ] && data[ index ].stop ) { 7976 stopQueue( data[ index ] ); 7977 } 7978 } else { 7979 for ( index in data ) { 7980 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 7981 stopQueue( data[ index ] ); 7982 } 7983 } 7984 } 7985 7986 for ( index = timers.length; index--; ) { 7987 if ( timers[ index ].elem === this && 7988 ( type == null || timers[ index ].queue === type ) ) { 7989 7990 timers[ index ].anim.stop( gotoEnd ); 7991 dequeue = false; 7992 timers.splice( index, 1 ); 7993 } 7994 } 7995 7996 // start the next in the queue if the last step wasn't forced 7997 // timers currently will call their complete callbacks, which will dequeue 7998 // but only if they were gotoEnd 7999 if ( dequeue || !gotoEnd ) { 8000 jQuery.dequeue( this, type ); 8001 } 8002 } ); 8003 }, 8004 finish: function( type ) { 8005 if ( type !== false ) { 8006 type = type || "fx"; 8007 } 8008 return this.each( function() { 8009 var index, 8010 data = jQuery._data( this ), 8011 queue = data[ type + "queue" ], 8012 hooks = data[ type + "queueHooks" ], 8013 timers = jQuery.timers, 8014 length = queue ? queue.length : 0; 8015 8016 // enable finishing flag on private data 8017 data.finish = true; 8018 8019 // empty the queue first 8020 jQuery.queue( this, type, [] ); 8021 8022 if ( hooks && hooks.stop ) { 8023 hooks.stop.call( this, true ); 8024 } 8025 8026 // look for any active animations, and finish them 8027 for ( index = timers.length; index--; ) { 8028 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 8029 timers[ index ].anim.stop( true ); 8030 timers.splice( index, 1 ); 8031 } 8032 } 8033 8034 // look for any animations in the old queue and finish them 8035 for ( index = 0; index < length; index++ ) { 8036 if ( queue[ index ] && queue[ index ].finish ) { 8037 queue[ index ].finish.call( this ); 8038 } 8039 } 8040 8041 // turn off finishing flag 8042 delete data.finish; 8043 } ); 8044 } 8045} ); 8046 8047jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { 8048 var cssFn = jQuery.fn[ name ]; 8049 jQuery.fn[ name ] = function( speed, easing, callback ) { 8050 return speed == null || typeof speed === "boolean" ? 8051 cssFn.apply( this, arguments ) : 8052 this.animate( genFx( name, true ), speed, easing, callback ); 8053 }; 8054} ); 8055 8056// Generate shortcuts for custom animations 8057jQuery.each( { 8058 slideDown: genFx( "show" ), 8059 slideUp: genFx( "hide" ), 8060 slideToggle: genFx( "toggle" ), 8061 fadeIn: { opacity: "show" }, 8062 fadeOut: { opacity: "hide" }, 8063 fadeToggle: { opacity: "toggle" } 8064}, function( name, props ) { 8065 jQuery.fn[ name ] = function( speed, easing, callback ) { 8066 return this.animate( props, speed, easing, callback ); 8067 }; 8068} ); 8069 8070jQuery.timers = []; 8071jQuery.fx.tick = function() { 8072 var timer, 8073 timers = jQuery.timers, 8074 i = 0; 8075 8076 fxNow = jQuery.now(); 8077 8078 for ( ; i < timers.length; i++ ) { 8079 timer = timers[ i ]; 8080 8081 // Checks the timer has not already been removed 8082 if ( !timer() && timers[ i ] === timer ) { 8083 timers.splice( i--, 1 ); 8084 } 8085 } 8086 8087 if ( !timers.length ) { 8088 jQuery.fx.stop(); 8089 } 8090 fxNow = undefined; 8091}; 8092 8093jQuery.fx.timer = function( timer ) { 8094 jQuery.timers.push( timer ); 8095 if ( timer() ) { 8096 jQuery.fx.start(); 8097 } else { 8098 jQuery.timers.pop(); 8099 } 8100}; 8101 8102jQuery.fx.interval = 13; 8103 8104jQuery.fx.start = function() { 8105 if ( !timerId ) { 8106 timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval ); 8107 } 8108}; 8109 8110jQuery.fx.stop = function() { 8111 window.clearInterval( timerId ); 8112 timerId = null; 8113}; 8114 8115jQuery.fx.speeds = { 8116 slow: 600, 8117 fast: 200, 8118 8119 // Default speed 8120 _default: 400 8121}; 8122 8123 8124// Based off of the plugin by Clint Helfers, with permission. 8125// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
8126jQuery.fn.delay = function( time, type ) { 8127 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 8128 type = type || "fx"; 8129 8130 return this.queue( type, function( next, hooks ) { 8131 var timeout = window.setTimeout( next, time ); 8132 hooks.stop = function() { 8133 window.clearTimeout( timeout ); 8134 }; 8135 } ); 8136}; 8137 8138 8139( function() { 8140 var a, 8141 input = document.createElement( "input" ), 8142 div = document.createElement( "div" ), 8143 select = document.createElement( "select" ), 8144 opt = select.appendChild( document.createElement( "option" ) ); 8145 8146 // Setup 8147 div = document.createElement( "div" ); 8148 div.setAttribute( "className", "t" ); 8149 div.innerHTML = " <link/><table></table><a href='/a'>a</a><input type='checkbox'/>"; 8150 a = div.getElementsByTagName( "a" )[ 0 ]; 8151 8152 // Support: Windows Web Apps (WWA) 8153 // `type` must use .setAttribute for WWA (#14901) 8154 input.setAttribute( "type", "checkbox" ); 8155 div.appendChild( input ); 8156 8157 a = div.getElementsByTagName( "a" )[ 0 ]; 8158 8159 // First batch of tests. 8160 a.style.cssText = "top:1px"; 8161 8162 // Test setAttribute on camelCase class. 8163 // If it works, we need attrFixes when doing get/setAttribute (ie6/7)
vendor: 2,696 bytes, lines 8164-8265
8164 support.getSetAttribute = div.className !== "t"; 8165 8166 // Get the style information from getAttribute 8167 // (IE uses .cssText instead) 8168 support.style = /top/.test( a.getAttribute( "style" ) ); 8169 8170 // Make sure that URLs aren't manipulated 8171 // (IE normalizes it by default) 8172 support.hrefNormalized = a.getAttribute( "href" ) === "/a"; 8173 8174 // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) 8175 support.checkOn = !!input.value; 8176 8177 // Make sure that a selected-by-default option has a working selected property. 8178 // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) 8179 support.optSelected = opt.selected; 8180 8181 // Tests for enctype support on a form (#6743) 8182 support.enctype = !!document.createElement( "form" ).enctype; 8183 8184 // Make sure that the options inside disabled selects aren't marked as disabled 8185 // (WebKit marks them as disabled) 8186 select.disabled = true; 8187 support.optDisabled = !opt.disabled; 8188 8189 // Support: IE8 only 8190 // Check if we can trust getAttribute("value") 8191 input = document.createElement( "input" ); 8192 input.setAttribute( "value", "" ); 8193 support.input = input.getAttribute( "value" ) === ""; 8194 8195 // Check if an input maintains its value after becoming a radio 8196 input.value = "t"; 8197 input.setAttribute( "type", "radio" ); 8198 support.radioValue = input.value === "t"; 8199} )(); 8200 8201 8202var rreturn = /\r/g, 8203 rspaces = /[\x20\t\r\n\f]+/g; 8204 8205jQuery.fn.extend( { 8206 val: function( value ) { 8207 var hooks, ret, isFunction, 8208 elem = this[ 0 ]; 8209 8210 if ( !arguments.length ) { 8211 if ( elem ) { 8212 hooks = jQuery.valHooks[ elem.type ] || 8213 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 8214 8215 if ( 8216 hooks && 8217 "get" in hooks && 8218 ( ret = hooks.get( elem, "value" ) ) !== undefined 8219 ) { 8220 return ret; 8221 } 8222 8223 ret = elem.value; 8224 8225 return typeof ret === "string" ? 8226 8227 // handle most common string cases 8228 ret.replace( rreturn, "" ) : 8229 8230 // handle cases where value is null/undef or number 8231 ret == null ? "" : ret; 8232 } 8233 8234 return; 8235 } 8236 8237 isFunction = jQuery.isFunction( value ); 8238 8239 return this.each( function( i ) { 8240 var val; 8241 8242 if ( this.nodeType !== 1 ) { 8243 return; 8244 } 8245 8246 if ( isFunction ) { 8247 val = value.call( this, i, jQuery( this ).val() ); 8248 } else { 8249 val = value; 8250 } 8251 8252 // Treat null/undefined as ""; convert numbers to string 8253 if ( val == null ) { 8254 val = ""; 8255 } else if ( typeof val === "number" ) { 8256 val += ""; 8257 } else if ( jQuery.isArray( val ) ) { 8258 val = jQuery.map( val, function( value ) { 8259 return value == null ? "" : value + ""; 8260 } ); 8261 } 8262 8263 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 8264 8265 // If set returns undefined, fall back to normal setting
vendor: 4,648 bytes, lines 8266-8456
8266 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 8267 this.value = val; 8268 } 8269 } ); 8270 } 8271} ); 8272 8273jQuery.extend( { 8274 valHooks: { 8275 option: { 8276 get: function( elem ) { 8277 var val = jQuery.find.attr( elem, "value" ); 8278 return val != null ? 8279 val : 8280 8281 // Support: IE10-11+ 8282 // option.text throws exceptions (#14686, #14858) 8283 // Strip and collapse whitespace 8284 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 8285 jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " ); 8286 } 8287 }, 8288 select: { 8289 get: function( elem ) { 8290 var value, option, 8291 options = elem.options, 8292 index = elem.selectedIndex, 8293 one = elem.type === "select-one" || index < 0, 8294 values = one ? null : [], 8295 max = one ? index + 1 : options.length, 8296 i = index < 0 ? 8297 max : 8298 one ? index : 0; 8299 8300 // Loop through all the selected options 8301 for ( ; i < max; i++ ) { 8302 option = options[ i ]; 8303 8304 // oldIE doesn't update selected after form reset (#2551) 8305 if ( ( option.selected || i === index ) && 8306 8307 // Don't return options that are disabled or in a disabled optgroup 8308 ( support.optDisabled ? 8309 !option.disabled : 8310 option.getAttribute( "disabled" ) === null ) && 8311 ( !option.parentNode.disabled || 8312 !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { 8313 8314 // Get the specific value for the option 8315 value = jQuery( option ).val(); 8316 8317 // We don't need an array for one selects 8318 if ( one ) { 8319 return value; 8320 } 8321 8322 // Multi-Selects return an array 8323 values.push( value ); 8324 } 8325 } 8326 8327 return values; 8328 }, 8329 8330 set: function( elem, value ) { 8331 var optionSet, option, 8332 options = elem.options, 8333 values = jQuery.makeArray( value ), 8334 i = options.length; 8335 8336 while ( i-- ) { 8337 option = options[ i ]; 8338 8339 if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 ) { 8340 8341 // Support: IE6 8342 // When new option element is added to select box we need to 8343 // force reflow of newly added node in order to workaround delay 8344 // of initialization properties 8345 try { 8346 option.selected = optionSet = true; 8347 8348 } catch ( _ ) { 8349 8350 // Will be executed only in IE6 8351 option.scrollHeight; 8352 } 8353 8354 } else { 8355 option.selected = false; 8356 } 8357 } 8358 8359 // Force browsers to behave consistently when non-matching value is set 8360 if ( !optionSet ) { 8361 elem.selectedIndex = -1; 8362 } 8363 8364 return options; 8365 } 8366 } 8367 } 8368} ); 8369 8370// Radios and checkboxes getter/setter 8371jQuery.each( [ "radio", "checkbox" ], function() { 8372 jQuery.valHooks[ this ] = { 8373 set: function( elem, value ) { 8374 if ( jQuery.isArray( value ) ) { 8375 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 8376 } 8377 } 8378 }; 8379 if ( !support.checkOn ) { 8380 jQuery.valHooks[ this ].get = function( elem ) { 8381 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 8382 }; 8383 } 8384} ); 8385 8386 8387 8388 8389var nodeHook, boolHook, 8390 attrHandle = jQuery.expr.attrHandle, 8391 ruseDefault = /^(?:checked|selected)$/i, 8392 getSetAttribute = support.getSetAttribute, 8393 getSetInput = support.input; 8394 8395jQuery.fn.extend( { 8396 attr: function( name, value ) { 8397 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 8398 }, 8399 8400 removeAttr: function( name ) { 8401 return this.each( function() { 8402 jQuery.removeAttr( this, name ); 8403 } ); 8404 } 8405} ); 8406 8407jQuery.extend( { 8408 attr: function( elem, name, value ) { 8409 var ret, hooks, 8410 nType = elem.nodeType; 8411 8412 // Don't get/set attributes on text, comment and attribute nodes 8413 if ( nType === 3 || nType === 8 || nType === 2 ) { 8414 return; 8415 } 8416 8417 // Fallback to prop when attributes are not supported 8418 if ( typeof elem.getAttribute === "undefined" ) { 8419 return jQuery.prop( elem, name, value ); 8420 } 8421 8422 // All attributes are lowercase 8423 // Grab necessary hook if one is defined 8424 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8425 name = name.toLowerCase(); 8426 hooks = jQuery.attrHooks[ name ] || 8427 ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); 8428 } 8429 8430 if ( value !== undefined ) { 8431 if ( value === null ) { 8432 jQuery.removeAttr( elem, name ); 8433 return; 8434 } 8435 8436 if ( hooks && "set" in hooks && 8437 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8438 return ret; 8439 } 8440 8441 elem.setAttribute( name, value + "" ); 8442 return value; 8443 } 8444 8445 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8446 return ret; 8447 } 8448 8449 ret = jQuery.find.attr( elem, name ); 8450 8451 // Non-existent attributes return null, we normalize to undefined 8452 return ret == null ? undefined : ret; 8453 }, 8454 8455 attrHooks: { 8456 type: {
vendor: 4,457 bytes, lines 8457-8623
8457 set: function( elem, value ) { 8458 if ( !support.radioValue && value === "radio" && 8459 jQuery.nodeName( elem, "input" ) ) { 8460 8461 // Setting the type on a radio button after the value resets the value in IE8-9 8462 // Reset value to default in case type is set after value during creation 8463 var val = elem.value; 8464 elem.setAttribute( "type", value ); 8465 if ( val ) { 8466 elem.value = val; 8467 } 8468 return value; 8469 } 8470 } 8471 } 8472 }, 8473 8474 removeAttr: function( elem, value ) { 8475 var name, propName, 8476 i = 0, 8477 attrNames = value && value.match( rnotwhite ); 8478 8479 if ( attrNames && elem.nodeType === 1 ) { 8480 while ( ( name = attrNames[ i++ ] ) ) { 8481 propName = jQuery.propFix[ name ] || name; 8482 8483 // Boolean attributes get special treatment (#10870) 8484 if ( jQuery.expr.match.bool.test( name ) ) { 8485 8486 // Set corresponding property to false 8487 if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { 8488 elem[ propName ] = false; 8489 8490 // Support: IE<9 8491 // Also clear defaultChecked/defaultSelected (if appropriate) 8492 } else { 8493 elem[ jQuery.camelCase( "default-" + name ) ] = 8494 elem[ propName ] = false; 8495 } 8496 8497 // See #9699 for explanation of this approach (setting first, then removal) 8498 } else { 8499 jQuery.attr( elem, name, "" ); 8500 } 8501 8502 elem.removeAttribute( getSetAttribute ? name : propName ); 8503 } 8504 } 8505 } 8506} ); 8507 8508// Hooks for boolean attributes 8509boolHook = { 8510 set: function( elem, value, name ) { 8511 if ( value === false ) { 8512 8513 // Remove boolean attributes when set to false 8514 jQuery.removeAttr( elem, name ); 8515 } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { 8516 8517 // IE<8 needs the *property* name 8518 elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); 8519 8520 } else { 8521 8522 // Support: IE<9 8523 // Use defaultChecked and defaultSelected for oldIE 8524 elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; 8525 } 8526 return name; 8527 } 8528}; 8529 8530jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { 8531 var getter = attrHandle[ name ] || jQuery.find.attr; 8532 8533 if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { 8534 attrHandle[ name ] = function( elem, name, isXML ) { 8535 var ret, handle; 8536 if ( !isXML ) { 8537 8538 // Avoid an infinite loop by temporarily removing this function from the getter 8539 handle = attrHandle[ name ]; 8540 attrHandle[ name ] = ret; 8541 ret = getter( elem, name, isXML ) != null ? 8542 name.toLowerCase() : 8543 null; 8544 attrHandle[ name ] = handle; 8545 } 8546 return ret; 8547 }; 8548 } else { 8549 attrHandle[ name ] = function( elem, name, isXML ) { 8550 if ( !isXML ) { 8551 return elem[ jQuery.camelCase( "default-" + name ) ] ? 8552 name.toLowerCase() : 8553 null; 8554 } 8555 }; 8556 } 8557} ); 8558 8559// fix oldIE attroperties 8560if ( !getSetInput || !getSetAttribute ) { 8561 jQuery.attrHooks.value = { 8562 set: function( elem, value, name ) { 8563 if ( jQuery.nodeName( elem, "input" ) ) { 8564 8565 // Does not return so that setAttribute is also used 8566 elem.defaultValue = value; 8567 } else { 8568 8569 // Use nodeHook if defined (#1954); otherwise setAttribute is fine 8570 return nodeHook && nodeHook.set( elem, value, name ); 8571 } 8572 } 8573 }; 8574} 8575 8576// IE6/7 do not support getting/setting some attributes with get/setAttribute 8577if ( !getSetAttribute ) { 8578 8579 // Use this for any attribute in IE6/7 8580 // This fixes almost every IE6/7 issue 8581 nodeHook = { 8582 set: function( elem, value, name ) { 8583 8584 // Set the existing or create a new attribute node 8585 var ret = elem.getAttributeNode( name ); 8586 if ( !ret ) { 8587 elem.setAttributeNode( 8588 ( ret = elem.ownerDocument.createAttribute( name ) ) 8589 ); 8590 } 8591 8592 ret.value = value += ""; 8593 8594 // Break association with cloned elements by also using setAttribute (#9646) 8595 if ( name === "value" || value === elem.getAttribute( name ) ) { 8596 return value; 8597 } 8598 } 8599 }; 8600 8601 // Some attributes are constructed with empty-string values when not defined 8602 attrHandle.id = attrHandle.name = attrHandle.coords = 8603 function( elem, name, isXML ) { 8604 var ret; 8605 if ( !isXML ) { 8606 return ( ret = elem.getAttributeNode( name ) ) && ret.value !== "" ? 8607 ret.value : 8608 null; 8609 } 8610 }; 8611 8612 // Fixing value retrieval on a button requires this module 8613 jQuery.valHooks.button = { 8614 get: function( elem, name ) { 8615 var ret = elem.getAttributeNode( name ); 8616 if ( ret && ret.specified ) { 8617 return ret.value; 8618 } 8619 }, 8620 set: nodeHook.set 8621 }; 8622 8623 // Set contenteditable to false on removals(#10429)
8624 // Setting to empty string throws an error as an invalid value 8625 jQuery.attrHooks.contenteditable = { 8626 set: function( elem, value, name ) { 8627 nodeHook.set( elem, value === "" ? false : value, name ); 8628 } 8629 }; 8630 8631 // Set width and height to auto instead of 0 on empty string( Bug #8150 ) 8632 // This is for removals 8633 jQuery.each( [ "width", "height" ], function( i, name ) { 8634 jQuery.attrHooks[ name ] = { 8635 set: function( elem, value ) { 8636 if ( value === "" ) { 8637 elem.setAttribute( name, "auto" ); 8638 return value; 8639 } 8640 } 8641 }; 8642 } ); 8643} 8644 8645if ( !support.style ) { 8646 jQuery.attrHooks.style = { 8647 get: function( elem ) { 8648 8649 // Return undefined in the case of empty string 8650 // Note: IE uppercases css property names, but if we were to .toLowerCase() 8651 // .cssText, that would destroy case sensitivity in URL's, like in "background" 8652 return elem.style.cssText || undefined; 8653 }, 8654 set: function( elem, value ) { 8655 return ( elem.style.cssText = value + "" ); 8656 } 8657 }; 8658} 8659 8660 8661 8662 8663var rfocusable = /^(?:input|select|textarea|button|object)$/i, 8664 rclickable = /^(?:a|area)$/i; 8665 8666jQuery.fn.extend( { 8667 prop: function( name, value ) { 8668 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 8669 }, 8670 8671 removeProp: function( name ) { 8672 name = jQuery.propFix[ name ] || name; 8673 return this.each( function() { 8674 8675 // try/catch handles cases where IE balks (such as removing a property on window) 8676 try { 8677 this[ name ] = undefined; 8678 delete this[ name ]; 8679 } catch ( e ) {} 8680 } ); 8681 } 8682} ); 8683 8684jQuery.extend( { 8685 prop: function( elem, name, value ) { 8686 var ret, hooks, 8687 nType = elem.nodeType; 8688 8689 // Don't get/set properties on text, comment and attribute nodes 8690 if ( nType === 3 || nType === 8 || nType === 2 ) { 8691 return; 8692 } 8693 8694 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8695 8696 // Fix name and attach hooks 8697 name = jQuery.propFix[ name ] || name; 8698 hooks = jQuery.propHooks[ name ]; 8699 } 8700 8701 if ( value !== undefined ) { 8702 if ( hooks && "set" in hooks && 8703 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8704 return ret; 8705 } 8706 8707 return ( elem[ name ] = value ); 8708 } 8709 8710 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8711 return ret; 8712 } 8713 8714 return elem[ name ]; 8715 }, 8716 8717 propHooks: { 8718 tabIndex: { 8719 get: function( elem ) { 8720 8721 // elem.tabIndex doesn't always return the 8722 // correct value when it hasn't been explicitly set 8723 // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 8724 // Use proper attribute retrieval(#12072) 8725 var tabindex = jQuery.find.attr( elem, "tabindex" ); 8726 8727 return tabindex ? 8728 parseInt( tabindex, 10 ) : 8729 rfocusable.test( elem.nodeName ) || 8730 rclickable.test( elem.nodeName ) && elem.href ? 8731 0 : 8732 -1; 8733 } 8734 } 8735 }, 8736 8737 propFix: { 8738 "for": "htmlFor", 8739 "class": "className" 8740 } 8741} ); 8742 8743// Some attributes require a special call on IE 8744// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 8745if ( !support.hrefNormalized ) { 8746 8747 // href/src property should get the full normalized URL (#10299/#12915) 8748 jQuery.each( [ "href", "src" ], function( i, name ) { 8749 jQuery.propHooks[ name ] = { 8750 get: function( elem ) { 8751 return elem.getAttribute( name, 4 ); 8752 } 8753 }; 8754 } ); 8755} 8756 8757// Support: Safari, IE9+ 8758// Accessing the selectedIndex property 8759// forces the browser to respect setting selected 8760// on the option 8761// The getter ensures a default option is selected 8762// when in an optgroup 8763if ( !support.optSelected ) { 8764 jQuery.propHooks.selected = { 8765 get: function( elem ) { 8766 var parent = elem.parentNode; 8767 8768 if ( parent ) { 8769 parent.selectedIndex; 8770 8771 // Make sure that it also works with optgroups, see #5701 8772 if ( parent.parentNode ) { 8773 parent.parentNode.selectedIndex; 8774 } 8775 } 8776 return null; 8777 }, 8778 set: function( elem ) { 8779 var parent = elem.parentNode; 8780 if ( parent ) { 8781 parent.selectedIndex; 8782 8783 if ( parent.parentNode ) { 8784 parent.parentNode.selectedIndex; 8785 } 8786 } 8787 } 8788 }; 8789} 8790 8791jQuery.each( [ 8792 "tabIndex", 8793 "readOnly", 8794 "maxLength", 8795 "cellSpacing", 8796 "cellPadding", 8797 "rowSpan", 8798 "colSpan", 8799 "useMap", 8800 "frameBorder", 8801 "contentEditable" 8802], function() { 8803 jQuery.propFix[ this.toLowerCase() ] = this; 8804} ); 8805 8806// IE6/7 call enctype encoding 8807if ( !support.enctype ) { 8808 jQuery.propFix.enctype = "encoding"; 8809} 8810 8811 8812 8813 8814var rclass = /[\t\r\n\f]/g; 8815 8816function getClass( elem ) { 8817 return jQuery.attr( elem, "class" ) || ""; 8818} 8819 8820jQuery.fn.extend( { 8821 addClass: function( value ) { 8822 var classes, elem, cur, curValue, clazz, j, finalValue, 8823 i = 0; 8824 8825 if ( jQuery.isFunction( value ) ) { 8826 return this.each( function( j ) { 8827 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 8828 } ); 8829 } 8830 8831 if ( typeof value === "string" && value ) { 8832 classes = value.match( rnotwhite ) || []; 8833 8834 while ( ( elem = this[ i++ ] ) ) { 8835 curValue = getClass( elem ); 8836 cur = elem.nodeType === 1 && 8837 ( " " + curValue + " " ).replace( rclass, " " ); 8838 8839 if ( cur ) { 8840 j = 0; 8841 while ( ( clazz = classes[ j++ ] ) ) { 8842 if ( cur.indexOf( " " + clazz + " " ) < 0 ) { 8843 cur += clazz + " "; 8844 } 8845 } 8846 8847 // only assign if different to avoid unneeded rendering. 8848 finalValue = jQuery.trim( cur ); 8849 if ( curValue !== finalValue ) { 8850 jQuery.attr( elem, "class", finalValue ); 8851 } 8852 } 8853 } 8854 } 8855 8856 return this; 8857 }, 8858 8859 removeClass: function( value ) { 8860 var classes, elem, cur, curValue, clazz, j, finalValue, 8861 i = 0; 8862 8863 if ( jQuery.isFunction( value ) ) { 8864 return this.each( function( j ) { 8865 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 8866 } ); 8867 } 8868 8869 if ( !arguments.length ) { 8870 return this.attr( "class", "" ); 8871 } 8872 8873 if ( typeof value === "string" && value ) { 8874 classes = value.match( rnotwhite ) || []; 8875 8876 while ( ( elem = this[ i++ ] ) ) { 8877 curValue = getClass( elem ); 8878 8879 // This expression is here for better compressibility (see addClass) 8880 cur = elem.nodeType === 1 && 8881 ( " " + curValue + " " ).replace( rclass, " " ); 8882 8883 if ( cur ) { 8884 j = 0; 8885 while ( ( clazz = classes[ j++ ] ) ) { 8886
8887 // Remove *all* instances 8888 while ( cur.indexOf( " " + clazz + " " ) > -1 ) { 8889 cur = cur.replace( " " + clazz + " ", " " ); 8890 } 8891 } 8892 8893 // Only assign if different to avoid unneeded rendering. 8894 finalValue = jQuery.trim( cur ); 8895 if ( curValue !== finalValue ) { 8896 jQuery.attr( elem, "class", finalValue ); 8897 } 8898 } 8899 } 8900 } 8901 8902 return this; 8903 }, 8904 8905 toggleClass: function( value, stateVal ) { 8906 var type = typeof value; 8907 8908 if ( typeof stateVal === "boolean" && type === "string" ) { 8909 return stateVal ? this.addClass( value ) : this.removeClass( value ); 8910 } 8911 8912 if ( jQuery.isFunction( value ) ) { 8913 return this.each( function( i ) { 8914 jQuery( this ).toggleClass( 8915 value.call( this, i, getClass( this ), stateVal ), 8916 stateVal 8917 ); 8918 } ); 8919 } 8920 8921 return this.each( function() { 8922 var className, i, self, classNames; 8923 8924 if ( type === "string" ) { 8925 8926 // Toggle individual class names 8927 i = 0; 8928 self = jQuery( this ); 8929 classNames = value.match( rnotwhite ) || []; 8930 8931 while ( ( className = classNames[ i++ ] ) ) { 8932 8933 // Check each className given, space separated list 8934 if ( self.hasClass( className ) ) { 8935 self.removeClass( className ); 8936 } else { 8937 self.addClass( className ); 8938 } 8939 } 8940 8941 // Toggle whole class name 8942 } else if ( value === undefined || type === "boolean" ) { 8943 className = getClass( this ); 8944 if ( className ) { 8945 8946 // store className if set 8947 jQuery._data( this, "__className__", className ); 8948 } 8949 8950 // If the element has a class name or if we're passed "false", 8951 // then remove the whole classname (if there was one, the above saved it). 8952 // Otherwise bring back whatever was previously saved (if anything), 8953 // falling back to the empty string if nothing was stored. 8954 jQuery.attr( this, "class", 8955 className || value === false ? 8956 "" : 8957 jQuery._data( this, "__className__" ) || "" 8958 ); 8959 } 8960 } ); 8961 }, 8962 8963 hasClass: function( selector ) { 8964 var className, elem, 8965 i = 0; 8966 8967 className = " " + selector + " "; 8968 while ( ( elem = this[ i++ ] ) ) { 8969 if ( elem.nodeType === 1 && 8970 ( " " + getClass( elem ) + " " ).replace( rclass, " " ) 8971 .indexOf( className ) > -1 8972 ) { 8973 return true; 8974 } 8975 } 8976 8977 return false; 8978 } 8979} ); 8980 8981 8982 8983 8984// Return jQuery for attributes-only inclusion 8985 8986 8987jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " + 8988 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 8989 "change select submit keydown keypress keyup error contextmenu" ).split( " " ), 8990 function( i, name ) { 8991 8992 // Handle event binding 8993 jQuery.fn[ name ] = function( data, fn ) { 8994 return arguments.length > 0 ? 8995 this.on( name, null, data, fn ) : 8996 this.trigger( name ); 8997 }; 8998} ); 8999 9000jQuery.fn.extend( { 9001 hover: function( fnOver, fnOut ) { 9002 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 9003 } 9004} ); 9005 9006 9007var location = window.location; 9008 9009var nonce = jQuery.now(); 9010 9011var rquery = ( /\?/ ); 9012 9013 9014 9015var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g; 9016 9017jQuery.parseJSON = function( data ) { 9018 9019 // Attempt to parse using the native JSON parser first 9020 if ( window.JSON && window.JSON.parse ) { 9021 9022 // Support: Android 2.3 9023 // Workaround failure to string-cast null input 9024 return window.JSON.parse( data + "" ); 9025 } 9026 9027 var requireNonComma, 9028 depth = null, 9029 str = jQuery.trim( data + "" ); 9030 9031 // Guard against invalid (and possibly dangerous) input by ensuring that nothing remains 9032 // after removing valid tokens 9033 return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) { 9034 9035 // Force termination if we see a misplaced comma 9036 if ( requireNonComma && comma ) { 9037 depth = 0; 9038 } 9039 9040 // Perform no more replacements after returning to outermost depth 9041 if ( depth === 0 ) { 9042 return token; 9043 } 9044 9045 // Commas must not follow "[", "{", or "," 9046 requireNonComma = open || comma; 9047 9048 // Determine new depth 9049 // array/object open ("[" or "{"): depth += true - false (increment) 9050 // array/object close ("]" or "}"): depth += false - true (decrement) 9051 // other cases ("," or primitive): depth += true - true (numeric cast) 9052 depth += !close - !open; 9053 9054 // Remove this token 9055 return ""; 9056 } ) ) ? 9057 ( Function( "return " + str ) )() : 9058 jQuery.error( "Invalid JSON: " + data ); 9059}; 9060 9061 9062// Cross-browser xml parsing
vendor: 10,551 bytes, lines 9063-9473
9063jQuery.parseXML = function( data ) { 9064 var xml, tmp; 9065 if ( !data || typeof data !== "string" ) { 9066 return null; 9067 } 9068 try { 9069 if ( window.DOMParser ) { // Standard 9070 tmp = new window.DOMParser(); 9071 xml = tmp.parseFromString( data, "text/xml" ); 9072 } else { // IE 9073 xml = new window.ActiveXObject( "Microsoft.XMLDOM" ); 9074 xml.async = "false"; 9075 xml.loadXML( data ); 9076 } 9077 } catch ( e ) { 9078 xml = undefined; 9079 } 9080 if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { 9081 jQuery.error( "Invalid XML: " + data ); 9082 } 9083 return xml; 9084}; 9085 9086 9087var 9088 rhash = /#.*$/, 9089 rts = /([?&])_=[^&]*/, 9090 9091 // IE leaves an \r character at EOL 9092 rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, 9093 9094 // #7653, #8125, #8152: local protocol detection 9095 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 9096 rnoContent = /^(?:GET|HEAD)$/, 9097 rprotocol = /^\/\//, 9098 rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/, 9099 9100 /* Prefilters 9101 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 9102 * 2) These are called: 9103 * - BEFORE asking for a transport 9104 * - AFTER param serialization (s.data is a string if s.processData is true) 9105 * 3) key is the dataType 9106 * 4) the catchall symbol "*" can be used 9107 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 9108 */ 9109 prefilters = {}, 9110 9111 /* Transports bindings 9112 * 1) key is the dataType 9113 * 2) the catchall symbol "*" can be used 9114 * 3) selection will start with transport dataType and THEN go to "*" if needed 9115 */ 9116 transports = {}, 9117 9118 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 9119 allTypes = "*/".concat( "*" ), 9120 9121 // Document location 9122 ajaxLocation = location.href, 9123 9124 // Segment location into parts 9125 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || []; 9126 9127// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 9128function addToPrefiltersOrTransports( structure ) { 9129 9130 // dataTypeExpression is optional and defaults to "*" 9131 return function( dataTypeExpression, func ) { 9132 9133 if ( typeof dataTypeExpression !== "string" ) { 9134 func = dataTypeExpression; 9135 dataTypeExpression = "*"; 9136 } 9137 9138 var dataType, 9139 i = 0, 9140 dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || []; 9141 9142 if ( jQuery.isFunction( func ) ) { 9143 9144 // For each dataType in the dataTypeExpression 9145 while ( ( dataType = dataTypes[ i++ ] ) ) { 9146 9147 // Prepend if requested 9148 if ( dataType.charAt( 0 ) === "+" ) { 9149 dataType = dataType.slice( 1 ) || "*"; 9150 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 9151 9152 // Otherwise append 9153 } else { 9154 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 9155 } 9156 } 9157 } 9158 }; 9159} 9160 9161// Base inspection function for prefilters and transports 9162function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 9163 9164 var inspected = {}, 9165 seekingTransport = ( structure === transports ); 9166 9167 function inspect( dataType ) { 9168 var selected; 9169 inspected[ dataType ] = true; 9170 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 9171 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 9172 if ( typeof dataTypeOrTransport === "string" && 9173 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 9174 9175 options.dataTypes.unshift( dataTypeOrTransport ); 9176 inspect( dataTypeOrTransport ); 9177 return false; 9178 } else if ( seekingTransport ) { 9179 return !( selected = dataTypeOrTransport ); 9180 } 9181 } ); 9182 return selected; 9183 } 9184 9185 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 9186} 9187 9188// A special extend for ajax options 9189// that takes "flat" options (not to be deep extended) 9190// Fixes #9887 9191function ajaxExtend( target, src ) { 9192 var deep, key, 9193 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 9194 9195 for ( key in src ) { 9196 if ( src[ key ] !== undefined ) { 9197 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 9198 } 9199 } 9200 if ( deep ) { 9201 jQuery.extend( true, target, deep ); 9202 } 9203 9204 return target; 9205} 9206 9207/* Handles responses to an ajax request: 9208 * - finds the right dataType (mediates between content-type and expected dataType) 9209 * - returns the corresponding response 9210 */ 9211function ajaxHandleResponses( s, jqXHR, responses ) { 9212 var firstDataType, ct, finalDataType, type, 9213 contents = s.contents, 9214 dataTypes = s.dataTypes; 9215 9216 // Remove auto dataType and get content-type in the process 9217 while ( dataTypes[ 0 ] === "*" ) { 9218 dataTypes.shift(); 9219 if ( ct === undefined ) { 9220 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 9221 } 9222 } 9223 9224 // Check if we're dealing with a known content-type 9225 if ( ct ) { 9226 for ( type in contents ) { 9227 if ( contents[ type ] && contents[ type ].test( ct ) ) { 9228 dataTypes.unshift( type ); 9229 break; 9230 } 9231 } 9232 } 9233 9234 // Check to see if we have a response for the expected dataType 9235 if ( dataTypes[ 0 ] in responses ) { 9236 finalDataType = dataTypes[ 0 ]; 9237 } else { 9238 9239 // Try convertible dataTypes 9240 for ( type in responses ) { 9241 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 9242 finalDataType = type; 9243 break; 9244 } 9245 if ( !firstDataType ) { 9246 firstDataType = type; 9247 } 9248 } 9249 9250 // Or just use first one 9251 finalDataType = finalDataType || firstDataType; 9252 } 9253 9254 // If we found a dataType 9255 // We add the dataType to the list if needed 9256 // and return the corresponding response 9257 if ( finalDataType ) { 9258 if ( finalDataType !== dataTypes[ 0 ] ) { 9259 dataTypes.unshift( finalDataType ); 9260 } 9261 return responses[ finalDataType ]; 9262 } 9263} 9264 9265/* Chain conversions given the request and the original response 9266 * Also sets the responseXXX fields on the jqXHR instance 9267 */ 9268function ajaxConvert( s, response, jqXHR, isSuccess ) { 9269 var conv2, current, conv, tmp, prev, 9270 converters = {}, 9271 9272 // Work with a copy of dataTypes in case we need to modify it for conversion 9273 dataTypes = s.dataTypes.slice(); 9274 9275 // Create converters map with lowercased keys 9276 if ( dataTypes[ 1 ] ) { 9277 for ( conv in s.converters ) { 9278 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 9279 } 9280 } 9281 9282 current = dataTypes.shift(); 9283 9284 // Convert to each sequential dataType 9285 while ( current ) { 9286 9287 if ( s.responseFields[ current ] ) { 9288 jqXHR[ s.responseFields[ current ] ] = response; 9289 } 9290 9291 // Apply the dataFilter if provided 9292 if ( !prev && isSuccess && s.dataFilter ) { 9293 response = s.dataFilter( response, s.dataType ); 9294 } 9295 9296 prev = current; 9297 current = dataTypes.shift(); 9298 9299 if ( current ) { 9300 9301 // There's only work to do if current dataType is non-auto 9302 if ( current === "*" ) { 9303 9304 current = prev; 9305 9306 // Convert response if prev dataType is non-auto and differs from current 9307 } else if ( prev !== "*" && prev !== current ) { 9308 9309 // ADDED by Joomla: Mitigate possible XSS vulnerability (gh-2432), CMS Issue 19464 9310 if (s.crossDomain && current === "script") { 9311 continue; 9312 } 9313 9314 // Seek a direct converter 9315 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 9316 9317 // If none found, seek a pair 9318 if ( !conv ) { 9319 for ( conv2 in converters ) { 9320 9321 // If conv2 outputs current 9322 tmp = conv2.split( " " ); 9323 if ( tmp[ 1 ] === current ) { 9324 9325 // If prev can be converted to accepted input 9326 conv = converters[ prev + " " + tmp[ 0 ] ] || 9327 converters[ "* " + tmp[ 0 ] ]; 9328 if ( conv ) { 9329 9330 // Condense equivalence converters 9331 if ( conv === true ) { 9332 conv = converters[ conv2 ]; 9333 9334 // Otherwise, insert the intermediate dataType 9335 } else if ( converters[ conv2 ] !== true ) { 9336 current = tmp[ 0 ]; 9337 dataTypes.unshift( tmp[ 1 ] ); 9338 } 9339 break; 9340 } 9341 } 9342 } 9343 } 9344 9345 // Apply converter (if not an equivalence) 9346 if ( conv !== true ) { 9347 9348 // Unless errors are allowed to bubble, catch and return them 9349 if ( conv && s[ "throws" ] ) { // jscs:ignore requireDotNotation 9350 response = conv( response ); 9351 } else { 9352 try { 9353 response = conv( response ); 9354 } catch ( e ) { 9355 return { 9356 state: "parsererror", 9357 error: conv ? e : "No conversion from " + prev + " to " + current 9358 }; 9359 } 9360 } 9361 } 9362 } 9363 } 9364 } 9365 9366 return { state: "success", data: response }; 9367} 9368 9369jQuery.extend( { 9370 9371 // Counter for holding the number of active queries 9372 active: 0, 9373 9374 // Last-Modified header cache for next request 9375 lastModified: {}, 9376 etag: {}, 9377 9378 ajaxSettings: { 9379 url: ajaxLocation, 9380 type: "GET", 9381 isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), 9382 global: true, 9383 processData: true, 9384 async: true, 9385 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 9386 /* 9387 timeout: 0, 9388 data: null, 9389 dataType: null, 9390 username: null, 9391 password: null, 9392 cache: null, 9393 throws: false, 9394 traditional: false, 9395 headers: {}, 9396 */ 9397 9398 accepts: { 9399 "*": allTypes, 9400 text: "text/plain", 9401 html: "text/html", 9402 xml: "application/xml, text/xml", 9403 json: "application/json, text/javascript" 9404 }, 9405 9406 contents: { 9407 xml: /\bxml\b/, 9408 html: /\bhtml/, 9409 json: /\bjson\b/ 9410 }, 9411 9412 responseFields: { 9413 xml: "responseXML", 9414 text: "responseText", 9415 json: "responseJSON" 9416 }, 9417 9418 // Data converters 9419 // Keys separate source (or catchall "*") and destination types with a single space 9420 converters: { 9421 9422 // Convert anything to text 9423 "* text": String, 9424 9425 // Text to html (true = no transformation) 9426 "text html": true, 9427 9428 // Evaluate text as a json expression 9429 "text json": jQuery.parseJSON, 9430 9431 // Parse text as xml 9432 "text xml": jQuery.parseXML 9433 }, 9434 9435 // For options that shouldn't be deep extended: 9436 // you can add your own custom options here if 9437 // and when you create one that shouldn't be 9438 // deep extended (see ajaxExtend) 9439 flatOptions: { 9440 url: true, 9441 context: true 9442 } 9443 }, 9444 9445 // Creates a full fledged settings object into target 9446 // with both ajaxSettings and settings fields. 9447 // If target is omitted, writes into ajaxSettings. 9448 ajaxSetup: function( target, settings ) { 9449 return settings ? 9450 9451 // Building a settings object 9452 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 9453 9454 // Extending ajaxSettings 9455 ajaxExtend( jQuery.ajaxSettings, target ); 9456 }, 9457 9458 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 9459 ajaxTransport: addToPrefiltersOrTransports( transports ), 9460 9461 // Main method 9462 ajax: function( url, options ) { 9463 9464 // If url is an object, simulate pre-1.5 signature 9465 if ( typeof url === "object" ) { 9466 options = url; 9467 url = undefined; 9468 } 9469 9470 // Force options to be an object 9471 options = options || {}; 9472 9473 var
vendor: 5,146 bytes, lines 9474-9664
9474 9475 // Cross-domain detection vars 9476 parts, 9477 9478 // Loop variable 9479 i, 9480 9481 // URL without anti-cache param 9482 cacheURL, 9483 9484 // Response headers as string 9485 responseHeadersString, 9486 9487 // timeout handle 9488 timeoutTimer, 9489 9490 // To know if global events are to be dispatched 9491 fireGlobals, 9492 9493 transport, 9494 9495 // Response headers 9496 responseHeaders, 9497 9498 // Create the final options object 9499 s = jQuery.ajaxSetup( {}, options ), 9500 9501 // Callbacks context 9502 callbackContext = s.context || s, 9503 9504 // Context for global events is callbackContext if it is a DOM node or jQuery collection 9505 globalEventContext = s.context && 9506 ( callbackContext.nodeType || callbackContext.jquery ) ? 9507 jQuery( callbackContext ) : 9508 jQuery.event, 9509 9510 // Deferreds 9511 deferred = jQuery.Deferred(), 9512 completeDeferred = jQuery.Callbacks( "once memory" ), 9513 9514 // Status-dependent callbacks 9515 statusCode = s.statusCode || {}, 9516 9517 // Headers (they are sent all at once) 9518 requestHeaders = {}, 9519 requestHeadersNames = {}, 9520 9521 // The jqXHR state 9522 state = 0, 9523 9524 // Default abort message 9525 strAbort = "canceled", 9526 9527 // Fake xhr 9528 jqXHR = { 9529 readyState: 0, 9530 9531 // Builds headers hashtable if needed 9532 getResponseHeader: function( key ) { 9533 var match; 9534 if ( state === 2 ) { 9535 if ( !responseHeaders ) { 9536 responseHeaders = {}; 9537 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 9538 responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; 9539 } 9540 } 9541 match = responseHeaders[ key.toLowerCase() ]; 9542 } 9543 return match == null ? null : match; 9544 }, 9545 9546 // Raw string 9547 getAllResponseHeaders: function() { 9548 return state === 2 ? responseHeadersString : null; 9549 }, 9550 9551 // Caches the header 9552 setRequestHeader: function( name, value ) { 9553 var lname = name.toLowerCase(); 9554 if ( !state ) { 9555 name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name; 9556 requestHeaders[ name ] = value; 9557 } 9558 return this; 9559 }, 9560 9561 // Overrides response content-type header 9562 overrideMimeType: function( type ) { 9563 if ( !state ) { 9564 s.mimeType = type; 9565 } 9566 return this; 9567 }, 9568 9569 // Status-dependent callbacks 9570 statusCode: function( map ) { 9571 var code; 9572 if ( map ) { 9573 if ( state < 2 ) { 9574 for ( code in map ) { 9575 9576 // Lazy-add the new callback in a way that preserves old ones 9577 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 9578 } 9579 } else { 9580 9581 // Execute the appropriate callbacks 9582 jqXHR.always( map[ jqXHR.status ] ); 9583 } 9584 } 9585 return this; 9586 }, 9587 9588 // Cancel the request 9589 abort: function( statusText ) { 9590 var finalText = statusText || strAbort; 9591 if ( transport ) { 9592 transport.abort( finalText ); 9593 } 9594 done( 0, finalText ); 9595 return this; 9596 } 9597 }; 9598 9599 // Attach deferreds 9600 deferred.promise( jqXHR ).complete = completeDeferred.add; 9601 jqXHR.success = jqXHR.done; 9602 jqXHR.error = jqXHR.fail; 9603 9604 // Remove hash character (#7531: and string promotion) 9605 // Add protocol if not provided (#5866: IE7 issue with protocol-less urls) 9606 // Handle falsy url in the settings object (#10093: consistency with old signature) 9607 // We also use the url parameter if available 9608 s.url = ( ( url || s.url || ajaxLocation ) + "" ) 9609 .replace( rhash, "" ) 9610 .replace( rprotocol, ajaxLocParts[ 1 ] + "//" ); 9611 9612 // Alias method option to type as per ticket #12004 9613 s.type = options.method || options.type || s.method || s.type; 9614 9615 // Extract dataTypes list 9616 s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ]; 9617 9618 // A cross-domain request is in order when we have a protocol:host:port mismatch 9619 if ( s.crossDomain == null ) { 9620 parts = rurl.exec( s.url.toLowerCase() ); 9621 s.crossDomain = !!( parts && 9622 ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] || 9623 ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !== 9624 ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) ) 9625 ); 9626 } 9627 9628 // Convert data if not already a string 9629 if ( s.data && s.processData && typeof s.data !== "string" ) { 9630 s.data = jQuery.param( s.data, s.traditional ); 9631 } 9632 9633 // Apply prefilters 9634 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 9635 9636 // If request was aborted inside a prefilter, stop there 9637 if ( state === 2 ) { 9638 return jqXHR; 9639 } 9640 9641 // We can fire global events as of now if asked to 9642 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 9643 fireGlobals = jQuery.event && s.global; 9644 9645 // Watch for a new set of requests 9646 if ( fireGlobals && jQuery.active++ === 0 ) { 9647 jQuery.event.trigger( "ajaxStart" ); 9648 } 9649 9650 // Uppercase the type 9651 s.type = s.type.toUpperCase(); 9652 9653 // Determine if request has content 9654 s.hasContent = !rnoContent.test( s.type ); 9655 9656 // Save the URL in case we're toying with the If-Modified-Since 9657 // and/or If-None-Match header later on 9658 cacheURL = s.url; 9659 9660 // More options handling for requests with no content 9661 if ( !s.hasContent ) { 9662 9663 // If data is available, append data to url 9664 if ( s.data ) {
vendor: 8,244 bytes, lines 9665-10004
9665 cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data ); 9666 9667 // #9682: remove data so that it's not used in an eventual retry 9668 delete s.data; 9669 } 9670 9671 // Add anti-cache in url if needed 9672 if ( s.cache === false ) { 9673 s.url = rts.test( cacheURL ) ? 9674 9675 // If there is already a '_' parameter, set its value 9676 cacheURL.replace( rts, "$1_=" + nonce++ ) : 9677 9678 // Otherwise add one to the end 9679 cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++; 9680 } 9681 } 9682 9683 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9684 if ( s.ifModified ) { 9685 if ( jQuery.lastModified[ cacheURL ] ) { 9686 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 9687 } 9688 if ( jQuery.etag[ cacheURL ] ) { 9689 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 9690 } 9691 } 9692 9693 // Set the correct header, if data is being sent 9694 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 9695 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 9696 } 9697 9698 // Set the Accepts header for the server, depending on the dataType 9699 jqXHR.setRequestHeader( 9700 "Accept", 9701 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 9702 s.accepts[ s.dataTypes[ 0 ] ] + 9703 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 9704 s.accepts[ "*" ] 9705 ); 9706 9707 // Check for headers option 9708 for ( i in s.headers ) { 9709 jqXHR.setRequestHeader( i, s.headers[ i ] ); 9710 } 9711 9712 // Allow custom headers/mimetypes and early abort 9713 if ( s.beforeSend && 9714 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) { 9715 9716 // Abort if not done already and return 9717 return jqXHR.abort(); 9718 } 9719 9720 // aborting is no longer a cancellation 9721 strAbort = "abort"; 9722 9723 // Install callbacks on deferreds 9724 for ( i in { success: 1, error: 1, complete: 1 } ) { 9725 jqXHR[ i ]( s[ i ] ); 9726 } 9727 9728 // Get transport 9729 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 9730 9731 // If no transport, we auto-abort 9732 if ( !transport ) { 9733 done( -1, "No Transport" ); 9734 } else { 9735 jqXHR.readyState = 1; 9736 9737 // Send global event 9738 if ( fireGlobals ) { 9739 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 9740 } 9741 9742 // If request was aborted inside ajaxSend, stop there 9743 if ( state === 2 ) { 9744 return jqXHR; 9745 } 9746 9747 // Timeout 9748 if ( s.async && s.timeout > 0 ) { 9749 timeoutTimer = window.setTimeout( function() { 9750 jqXHR.abort( "timeout" ); 9751 }, s.timeout ); 9752 } 9753 9754 try { 9755 state = 1; 9756 transport.send( requestHeaders, done ); 9757 } catch ( e ) { 9758 9759 // Propagate exception as error if not done 9760 if ( state < 2 ) { 9761 done( -1, e ); 9762 9763 // Simply rethrow otherwise 9764 } else { 9765 throw e; 9766 } 9767 } 9768 } 9769 9770 // Callback for when everything is done 9771 function done( status, nativeStatusText, responses, headers ) { 9772 var isSuccess, success, error, response, modified, 9773 statusText = nativeStatusText; 9774 9775 // Called once 9776 if ( state === 2 ) { 9777 return; 9778 } 9779 9780 // State is "done" now 9781 state = 2; 9782 9783 // Clear timeout if it exists 9784 if ( timeoutTimer ) { 9785 window.clearTimeout( timeoutTimer ); 9786 } 9787 9788 // Dereference transport for early garbage collection 9789 // (no matter how long the jqXHR object will be used) 9790 transport = undefined; 9791 9792 // Cache response headers 9793 responseHeadersString = headers || ""; 9794 9795 // Set readyState 9796 jqXHR.readyState = status > 0 ? 4 : 0; 9797 9798 // Determine if successful 9799 isSuccess = status >= 200 && status < 300 || status === 304; 9800 9801 // Get response data 9802 if ( responses ) { 9803 response = ajaxHandleResponses( s, jqXHR, responses ); 9804 } 9805 9806 // Convert no matter what (that way responseXXX fields are always set) 9807 response = ajaxConvert( s, response, jqXHR, isSuccess ); 9808 9809 // If successful, handle type chaining 9810 if ( isSuccess ) { 9811 9812 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9813 if ( s.ifModified ) { 9814 modified = jqXHR.getResponseHeader( "Last-Modified" ); 9815 if ( modified ) { 9816 jQuery.lastModified[ cacheURL ] = modified; 9817 } 9818 modified = jqXHR.getResponseHeader( "etag" ); 9819 if ( modified ) { 9820 jQuery.etag[ cacheURL ] = modified; 9821 } 9822 } 9823 9824 // if no content 9825 if ( status === 204 || s.type === "HEAD" ) { 9826 statusText = "nocontent"; 9827 9828 // if not modified 9829 } else if ( status === 304 ) { 9830 statusText = "notmodified"; 9831 9832 // If we have data, let's convert it 9833 } else { 9834 statusText = response.state; 9835 success = response.data; 9836 error = response.error; 9837 isSuccess = !error; 9838 } 9839 } else { 9840 9841 // We extract error from statusText 9842 // then normalize statusText and status for non-aborts 9843 error = statusText; 9844 if ( status || !statusText ) { 9845 statusText = "error"; 9846 if ( status < 0 ) { 9847 status = 0; 9848 } 9849 } 9850 } 9851 9852 // Set data for the fake xhr object 9853 jqXHR.status = status; 9854 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 9855 9856 // Success/Error 9857 if ( isSuccess ) { 9858 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 9859 } else { 9860 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 9861 } 9862 9863 // Status-dependent callbacks 9864 jqXHR.statusCode( statusCode ); 9865 statusCode = undefined; 9866 9867 if ( fireGlobals ) { 9868 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 9869 [ jqXHR, s, isSuccess ? success : error ] ); 9870 } 9871 9872 // Complete 9873 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 9874 9875 if ( fireGlobals ) { 9876 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 9877 9878 // Handle the global AJAX counter 9879 if ( !( --jQuery.active ) ) { 9880 jQuery.event.trigger( "ajaxStop" ); 9881 } 9882 } 9883 } 9884 9885 return jqXHR; 9886 }, 9887 9888 getJSON: function( url, data, callback ) { 9889 return jQuery.get( url, data, callback, "json" ); 9890 }, 9891 9892 getScript: function( url, callback ) { 9893 return jQuery.get( url, undefined, callback, "script" ); 9894 } 9895} ); 9896 9897jQuery.each( [ "get", "post" ], function( i, method ) { 9898 jQuery[ method ] = function( url, data, callback, type ) { 9899 9900 // shift arguments if data argument was omitted 9901 if ( jQuery.isFunction( data ) ) { 9902 type = type || callback; 9903 callback = data; 9904 data = undefined; 9905 } 9906 9907 // The url can be an options object (which then must have .url) 9908 return jQuery.ajax( jQuery.extend( { 9909 url: url, 9910 type: method, 9911 dataType: type, 9912 data: data, 9913 success: callback 9914 }, jQuery.isPlainObject( url ) && url ) ); 9915 }; 9916} ); 9917 9918 9919jQuery._evalUrl = function( url ) { 9920 return jQuery.ajax( { 9921 url: url, 9922 9923 // Make this explicit, since user can override this through ajaxSetup (#11264) 9924 type: "GET", 9925 dataType: "script", 9926 cache: true, 9927 async: false, 9928 global: false, 9929 "throws": true 9930 } ); 9931}; 9932 9933 9934jQuery.fn.extend( { 9935 wrapAll: function( html ) { 9936 if ( jQuery.isFunction( html ) ) { 9937 return this.each( function( i ) { 9938 jQuery( this ).wrapAll( html.call( this, i ) ); 9939 } ); 9940 } 9941 9942 if ( this[ 0 ] ) { 9943 9944 // The elements to wrap the target around 9945 var wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 9946 9947 if ( this[ 0 ].parentNode ) { 9948 wrap.insertBefore( this[ 0 ] ); 9949 } 9950 9951 wrap.map( function() { 9952 var elem = this; 9953 9954 while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { 9955 elem = elem.firstChild; 9956 } 9957 9958 return elem; 9959 } ).append( this ); 9960 } 9961 9962 return this; 9963 }, 9964 9965 wrapInner: function( html ) { 9966 if ( jQuery.isFunction( html ) ) { 9967 return this.each( function( i ) { 9968 jQuery( this ).wrapInner( html.call( this, i ) ); 9969 } ); 9970 } 9971 9972 return this.each( function() { 9973 var self = jQuery( this ), 9974 contents = self.contents(); 9975 9976 if ( contents.length ) { 9977 contents.wrapAll( html ); 9978 9979 } else { 9980 self.append( html ); 9981 } 9982 } ); 9983 }, 9984 9985 wrap: function( html ) { 9986 var isFunction = jQuery.isFunction( html ); 9987 9988 return this.each( function( i ) { 9989 jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); 9990 } ); 9991 }, 9992 9993 unwrap: function() { 9994 return this.parent().each( function() { 9995 if ( !jQuery.nodeName( this, "body" ) ) { 9996 jQuery( this ).replaceWith( this.childNodes ); 9997 } 9998 } ).end(); 9999 } 10000} ); 10001 10002 10003function getDisplay( elem ) { 10004 return elem.style && elem.style.display || jQuery.css( elem, "dis
10004play" ); 10005} 10006 10007function filterHidden( elem ) { 10008 10009 // Disconnected elements are considered hidden 10010 if ( !jQuery.contains( elem.ownerDocument || document, elem ) ) { 10011 return true; 10012 } 10013 while ( elem && elem.nodeType === 1 ) { 10014 if ( getDisplay( elem ) === "none" || elem.type === "hidden" ) { 10015 return true; 10016 } 10017 elem = elem.parentNode; 10018 } 10019 return false; 10020} 10021 10022jQuery.expr.filters.hidden = function( elem ) { 10023 10024 // Support: Opera <= 12.12 10025 // Opera reports offsetWidths and offsetHeights less than zero on some elements 10026 return support.reliableHiddenOffsets() ? 10027 ( elem.offsetWidth <= 0 && elem.offsetHeight <= 0 && 10028 !elem.getClientRects().length ) : 10029 filterHidden( elem ); 10030}; 10031 10032jQuery.expr.filters.visible = function( elem ) { 10033 return !jQuery.expr.filters.hidden( elem ); 10034}; 10035 10036 10037 10038 10039var r20 = /%20/g, 10040 rbracket = /\[\]$/, 10041 rCRLF = /\r?\n/g, 10042 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 10043 rsubmittable = /^(?:input|select|textarea|keygen)/i; 10044 10045function buildParams( prefix, obj, traditional, add ) { 10046 var name; 10047 10048 if ( jQuery.isArray( obj ) ) { 10049 10050 // Serialize array item. 10051 jQuery.each( obj, function( i, v ) { 10052 if ( traditional || rbracket.test( prefix ) ) { 10053 10054 // Treat each array item as a scalar. 10055 add( prefix, v ); 10056 10057 } else { 10058 10059 // Item is non-scalar (array or object), encode its numeric index. 10060 buildParams( 10061 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 10062 v, 10063 traditional, 10064 add 10065 ); 10066 } 10067 } ); 10068 10069 } else if ( !traditional && jQuery.type( obj ) === "object" ) { 10070 10071 // Serialize object item. 10072 for ( name in obj ) { 10073 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 10074 } 10075 10076 } else { 10077 10078 // Serialize scalar item. 10079 add( prefix, obj ); 10080 } 10081} 10082 10083// Serialize an array of form elements or a set of 10084// key/values into a query string 10085jQuery.param = function( a, traditional ) { 10086 var prefix, 10087 s = [], 10088 add = function( key, value ) { 10089 10090 // If value is a function, invoke it and return its value 10091 value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value ); 10092 s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value ); 10093 }; 10094 10095 // Set traditional to true for jQuery <= 1.3.2 behavior. 10096 if ( traditional === undefined ) { 10097 traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; 10098 } 10099 10100 // If an array was passed in, assume that it is an array of form elements. 10101 if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 10102 10103 // Serialize the form elements 10104 jQuery.each( a, function() { 10105 add( this.name, this.value ); 10106 } ); 10107 10108 } else { 10109 10110 // If traditional, encode the "old" way (the way 1.3.2 or older 10111 // did it), otherwise encode params recursively. 10112 for ( prefix in a ) { 10113 buildParams( prefix, a[ prefix ], traditional, add ); 10114 } 10115 } 10116 10117 // Return the resulting serialization 10118 return s.join( "&" ).replace( r20, "+" ); 10119}; 10120 10121jQuery.fn.extend( { 10122 serialize: function() { 10123 return jQuery.param( this.serializeArray() ); 10124 }, 10125 serializeArray: function() { 10126 return this.map( function() { 10127 10128 // Can add propHook for "elements" to filter or add form elements 10129 var elements = jQuery.prop( this, "elements" ); 10130 return elements ? jQuery.makeArray( elements ) : this; 10131 } ) 10132 .filter( function() { 10133 var type = this.type; 10134 10135 // Use .is(":disabled") so that fieldset[disabled] works 10136 return this.name && !jQuery( this ).is( ":disabled" ) && 10137 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 10138 ( this.checked || !rcheckableType.test( type ) ); 10139 } ) 10140 .map( function( i, elem ) { 10141 var val = jQuery( this ).val(); 10142 10143 return val == null ? 10144 null : 10145 jQuery.isArray( val ) ? 10146 jQuery.map( val, function( val ) { 10147 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 10148 } ) : 10149 { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 10150 } ).get(); 10151 } 10152} ); 10153 10154 10155// Create the request object 10156// (This is still attached to ajaxSettings for backward compatibility) 10157jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ? 10158 10159 // Support: IE6-IE8 10160 function() { 10161 10162 // XHR cannot access local files, always use ActiveX for that case 10163 if ( this.isLocal ) { 10164 return createActiveXHR(); 10165 } 10166
vendor: 22,565 bytes, lines 10167-10987
10167 // Support: IE 9-11 10168 // IE seems to error on cross-domain PATCH requests when ActiveX XHR 10169 // is used. In IE 9+ always use the native XHR. 10170 // Note: this condition won't catch Edge as it doesn't define 10171 // document.documentMode but it also doesn't support ActiveX so it won't 10172 // reach this code. 10173 if ( document.documentMode > 8 ) { 10174 return createStandardXHR(); 10175 } 10176 10177 // Support: IE<9 10178 // oldIE XHR does not support non-RFC2616 methods (#13240) 10179 // See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx 10180 // and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9 10181 // Although this check for six methods instead of eight 10182 // since IE also does not support "trace" and "connect" 10183 return /^(get|post|head|put|delete|options)$/i.test( this.type ) && 10184 createStandardXHR() || createActiveXHR(); 10185 } : 10186 10187 // For all other browsers, use the standard XMLHttpRequest object 10188 createStandardXHR; 10189 10190var xhrId = 0, 10191 xhrCallbacks = {}, 10192 xhrSupported = jQuery.ajaxSettings.xhr(); 10193 10194// Support: IE<10 10195// Open requests must be manually aborted on unload (#5280) 10196// See https://support.microsoft.com/kb/2856746 for more info 10197if ( window.attachEvent ) { 10198 window.attachEvent( "onunload", function() { 10199 for ( var key in xhrCallbacks ) { 10200 xhrCallbacks[ key ]( undefined, true ); 10201 } 10202 } ); 10203} 10204 10205// Determine support properties 10206support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 10207xhrSupported = support.ajax = !!xhrSupported; 10208 10209// Create transport if the browser can provide an xhr 10210if ( xhrSupported ) { 10211 10212 jQuery.ajaxTransport( function( options ) { 10213 10214 // Cross domain only allowed if supported through XMLHttpRequest 10215 if ( !options.crossDomain || support.cors ) { 10216 10217 var callback; 10218 10219 return { 10220 send: function( headers, complete ) { 10221 var i, 10222 xhr = options.xhr(), 10223 id = ++xhrId; 10224 10225 // Open the socket 10226 xhr.open( 10227 options.type, 10228 options.url, 10229 options.async, 10230 options.username, 10231 options.password 10232 ); 10233 10234 // Apply custom fields if provided 10235 if ( options.xhrFields ) { 10236 for ( i in options.xhrFields ) { 10237 xhr[ i ] = options.xhrFields[ i ]; 10238 } 10239 } 10240 10241 // Override mime type if needed 10242 if ( options.mimeType && xhr.overrideMimeType ) { 10243 xhr.overrideMimeType( options.mimeType ); 10244 } 10245 10246 // X-Requested-With header 10247 // For cross-domain requests, seeing as conditions for a preflight are 10248 // akin to a jigsaw puzzle, we simply never set it to be sure. 10249 // (it can always be set on a per-request basis or even using ajaxSetup) 10250 // For same-domain requests, won't change header if already provided. 10251 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 10252 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 10253 } 10254 10255 // Set headers 10256 for ( i in headers ) { 10257 10258 // Support: IE<9 10259 // IE's ActiveXObject throws a 'Type Mismatch' exception when setting 10260 // request header to a null-value. 10261 // 10262 // To keep consistent with other XHR implementations, cast the value 10263 // to string and ignore `undefined`. 10264 if ( headers[ i ] !== undefined ) { 10265 xhr.setRequestHeader( i, headers[ i ] + "" ); 10266 } 10267 } 10268 10269 // Do send the request 10270 // This may raise an exception which is actually 10271 // handled in jQuery.ajax (so no try/catch here) 10272 xhr.send( ( options.hasContent && options.data ) || null ); 10273 10274 // Listener 10275 callback = function( _, isAbort ) { 10276 var status, statusText, responses; 10277 10278 // Was never called and is aborted or complete 10279 if ( callback && ( isAbort || xhr.readyState === 4 ) ) { 10280 10281 // Clean up 10282 delete xhrCallbacks[ id ]; 10283 callback = undefined; 10284 xhr.onreadystatechange = jQuery.noop; 10285 10286 // Abort manually if needed 10287 if ( isAbort ) { 10288 if ( xhr.readyState !== 4 ) { 10289 xhr.abort(); 10290 } 10291 } else { 10292 responses = {}; 10293 status = xhr.status; 10294 10295 // Support: IE<10 10296 // Accessing binary-data responseText throws an exception 10297 // (#11426) 10298 if ( typeof xhr.responseText === "string" ) { 10299 responses.text = xhr.responseText; 10300 } 10301 10302 // Firefox throws an exception when accessing 10303 // statusText for faulty cross-domain requests 10304 try { 10305 statusText = xhr.statusText; 10306 } catch ( e ) { 10307 10308 // We normalize with Webkit giving an empty statusText 10309 statusText = ""; 10310 } 10311 10312 // Filter status for non standard behaviors 10313 10314 // If the request is local and we have data: assume a success 10315 // (success with no data won't get notified, that's the best we 10316 // can do given current implementations) 10317 if ( !status && options.isLocal && !options.crossDomain ) { 10318 status = responses.text ? 200 : 404; 10319 10320 // IE - #1450: sometimes returns 1223 when it should be 204 10321 } else if ( status === 1223 ) { 10322 status = 204; 10323 } 10324 } 10325 } 10326 10327 // Call complete if needed 10328 if ( responses ) { 10329 complete( status, statusText, responses, xhr.getAllResponseHeaders() ); 10330 } 10331 }; 10332 10333 // Do send the request 10334 // `xhr.send` may raise an exception, but it will be 10335 // handled in jQuery.ajax (so no try/catch here) 10336 if ( !options.async ) { 10337 10338 // If we're in sync mode we fire the callback 10339 callback(); 10340 } else if ( xhr.readyState === 4 ) { 10341 10342 // (IE6 & IE7) if it's in cache and has been 10343 // retrieved directly we need to fire the callback 10344 window.setTimeout( callback ); 10345 } else { 10346 10347 // Register the callback, but delay it in case `xhr.send` throws 10348 // Add to the list of active xhr callbacks 10349 xhr.onreadystatechange = xhrCallbacks[ id ] = callback; 10350 } 10351 }, 10352 10353 abort: function() { 10354 if ( callback ) { 10355 callback( undefined, true ); 10356 } 10357 } 10358 }; 10359 } 10360 } ); 10361} 10362 10363// Functions to create xhrs 10364function createStandardXHR() { 10365 try { 10366 return new window.XMLHttpRequest(); 10367 } catch ( e ) {} 10368} 10369 10370function createActiveXHR() { 10371 try { 10372 return new window.ActiveXObject( "Microsoft.XMLHTTP" ); 10373 } catch ( e ) {} 10374} 10375 10376 10377 10378 10379// Install script dataType 10380jQuery.ajaxSetup( { 10381 accepts: { 10382 script: "text/javascript, application/javascript, " + 10383 "application/ecmascript, application/x-ecmascript" 10384 }, 10385 contents: { 10386 script: /\b(?:java|ecma)script\b/ 10387 }, 10388 converters: { 10389 "text script": function( text ) { 10390 jQuery.globalEval( text ); 10391 return text; 10392 } 10393 } 10394} ); 10395 10396// Handle cache's special case and global 10397jQuery.ajaxPrefilter( "script", function( s ) { 10398 if ( s.cache === undefined ) { 10399 s.cache = false; 10400 } 10401 if ( s.crossDomain ) { 10402 s.type = "GET"; 10403 s.global = false; 10404 } 10405} ); 10406 10407// Bind script tag hack transport 10408jQuery.ajaxTransport( "script", function( s ) { 10409 10410 // This transport only deals with cross domain requests 10411 if ( s.crossDomain ) { 10412 10413 var script, 10414 head = document.head || jQuery( "head" )[ 0 ] || document.documentElement; 10415 10416 return { 10417 10418 send: function( _, callback ) { 10419 10420 script = document.createElement( "script" ); 10421 10422 script.async = true; 10423 10424 if ( s.scriptCharset ) { 10425 script.charset = s.scriptCharset; 10426 } 10427 10428 script.src = s.url; 10429 10430 // Attach handlers for all browsers 10431 script.onload = script.onreadystatechange = function( _, isAbort ) { 10432 10433 if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) { 10434 10435 // Handle memory leak in IE 10436 script.onload = script.onreadystatechange = null; 10437 10438 // Remove the script 10439 if ( script.parentNode ) { 10440 script.parentNode.removeChild( script ); 10441 } 10442 10443 // Dereference the script 10444 script = null; 10445 10446 // Callback if not abort 10447 if ( !isAbort ) { 10448 callback( 200, "success" ); 10449 } 10450 } 10451 }; 10452 10453 // Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending 10454 // Use native DOM manipulation to avoid our domManip AJAX trickery 10455 head.insertBefore( script, head.firstChild ); 10456 }, 10457 10458 abort: function() { 10459 if ( script ) { 10460 script.onload( undefined, true ); 10461 } 10462 } 10463 }; 10464 } 10465} ); 10466 10467 10468 10469 10470var oldCallbacks = [], 10471 rjsonp = /(=)\?(?=&|$)|\?\?/; 10472 10473// Default jsonp settings 10474jQuery.ajaxSetup( { 10475 jsonp: "callback", 10476 jsonpCallback: function() { 10477 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); 10478 this[ callback ] = true; 10479 return callback; 10480 } 10481} ); 10482 10483// Detect, normalize options and install callbacks for jsonp requests 10484jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 10485 10486 var callbackName, overwritten, responseContainer, 10487 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 10488 "url" : 10489 typeof s.data === "string" && 10490 ( s.contentType || "" ) 10491 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 10492 rjsonp.test( s.data ) && "data" 10493 ); 10494 10495 // Handle iff the expected data type is "jsonp" or we have a parameter to set 10496 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 10497 10498 // Get callback name, remembering preexisting value associated with it 10499 callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? 10500 s.jsonpCallback() : 10501 s.jsonpCallback; 10502 10503 // Insert callback into url or form data 10504 if ( jsonProp ) { 10505 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 10506 } else if ( s.jsonp !== false ) { 10507 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 10508 } 10509 10510 // Use data converter to retrieve json after script execution 10511 s.converters[ "script json" ] = function() { 10512 if ( !responseContainer ) { 10513 jQuery.error( callbackName + " was not called" ); 10514 } 10515 return responseContainer[ 0 ]; 10516 }; 10517 10518 // force json dataType 10519 s.dataTypes[ 0 ] = "json"; 10520 10521 // Install callback 10522 overwritten = window[ callbackName ]; 10523 window[ callbackName ] = function() { 10524 responseContainer = arguments; 10525 }; 10526 10527 // Clean-up function (fires after converters) 10528 jqXHR.always( function() { 10529 10530 // If previous value didn't exist - remove it 10531 if ( overwritten === undefined ) { 10532 jQuery( window ).removeProp( callbackName ); 10533 10534 // Otherwise restore preexisting value 10535 } else { 10536 window[ callbackName ] = overwritten; 10537 } 10538 10539 // Save back as free 10540 if ( s[ callbackName ] ) { 10541 10542 // make sure that re-using the options doesn't screw things around 10543 s.jsonpCallback = originalSettings.jsonpCallback; 10544 10545 // save the callback name for future use 10546 oldCallbacks.push( callbackName ); 10547 } 10548 10549 // Call if it was a function and we have a response 10550 if ( responseContainer && jQuery.isFunction( overwritten ) ) { 10551 overwritten( responseContainer[ 0 ] ); 10552 } 10553 10554 responseContainer = overwritten = undefined; 10555 } ); 10556 10557 // Delegate to script 10558 return "script"; 10559 } 10560} ); 10561 10562 10563 10564 10565// data: string of html 10566// context (optional): If specified, the fragment will be created in this context, 10567// defaults to document 10568// keepScripts (optional): If true, will include scripts passed in the html string 10569jQuery.parseHTML = function( data, context, keepScripts ) { 10570 if ( !data || typeof data !== "string" ) { 10571 return null; 10572 } 10573 if ( typeof context === "boolean" ) { 10574 keepScripts = context; 10575 context = false; 10576 } 10577 context = context || document; 10578 10579 var parsed = rsingleTag.exec( data ), 10580 scripts = !keepScripts && []; 10581 10582 // Single tag 10583 if ( parsed ) { 10584 return [ context.createElement( parsed[ 1 ] ) ]; 10585 } 10586 10587 parsed = buildFragment( [ data ], context, scripts ); 10588 10589 if ( scripts && scripts.length ) { 10590 jQuery( scripts ).remove(); 10591 } 10592 10593 return jQuery.merge( [], parsed.childNodes ); 10594}; 10595 10596 10597// Keep a copy of the old load method 10598var _load = jQuery.fn.load; 10599 10600/** 10601 * Load a url into a page 10602 */ 10603jQuery.fn.load = function( url, params, callback ) { 10604 if ( typeof url !== "string" && _load ) { 10605 return _load.apply( this, arguments ); 10606 } 10607 10608 var selector, type, response, 10609 self = this, 10610 off = url.indexOf( " " ); 10611 10612 if ( off > -1 ) { 10613 selector = jQuery.trim( url.slice( off, url.length ) ); 10614 url = url.slice( 0, off ); 10615 } 10616 10617 // If it's a function 10618 if ( jQuery.isFunction( params ) ) { 10619 10620 // We assume that it's the callback 10621 callback = params; 10622 params = undefined; 10623 10624 // Otherwise, build a param string 10625 } else if ( params && typeof params === "object" ) { 10626 type = "POST"; 10627 } 10628 10629 // If we have elements to modify, make the request 10630 if ( self.length > 0 ) { 10631 jQuery.ajax( { 10632 url: url, 10633 10634 // If "type" variable is undefined, then "GET" method will be used. 10635 // Make value of this field explicit since 10636 // user can override it through ajaxSetup method 10637 type: type || "GET", 10638 dataType: "html", 10639 data: params 10640 } ).done( function( responseText ) { 10641 10642 // Save response for use in complete callback 10643 response = arguments; 10644 10645 self.html( selector ? 10646 10647 // If a selector was specified, locate the right elements in a dummy div 10648 // Exclude scripts to avoid IE 'Permission Denied' errors 10649 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 10650 10651 // Otherwise use the full result 10652 responseText ); 10653 10654 // If the request succeeds, this function gets "data", "status", "jqXHR" 10655 // but they are ignored because response was set above. 10656 // If it fails, this function gets "jqXHR", "status", "error" 10657 } ).always( callback && function( jqXHR, status ) { 10658 self.each( function() { 10659 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 10660 } ); 10661 } ); 10662 } 10663 10664 return this; 10665}; 10666 10667 10668 10669 10670// Attach a bunch of functions for handling common AJAX events 10671jQuery.each( [ 10672 "ajaxStart", 10673 "ajaxStop", 10674 "ajaxComplete", 10675 "ajaxError", 10676 "ajaxSuccess", 10677 "ajaxSend" 10678], function( i, type ) { 10679 jQuery.fn[ type ] = function( fn ) { 10680 return this.on( type, fn ); 10681 }; 10682} ); 10683 10684 10685 10686 10687jQuery.expr.filters.animated = function( elem ) { 10688 return jQuery.grep( jQuery.timers, function( fn ) { 10689 return elem === fn.elem; 10690 } ).length; 10691}; 10692 10693 10694 10695 10696 10697/** 10698 * Gets a window from an element 10699 */ 10700function getWindow( elem ) { 10701 return jQuery.isWindow( elem ) ? 10702 elem : 10703 elem.nodeType === 9 ? 10704 elem.defaultView || elem.parentWindow : 10705 false; 10706} 10707 10708jQuery.offset = { 10709 setOffset: function( elem, options, i ) { 10710 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 10711 position = jQuery.css( elem, "position" ), 10712 curElem = jQuery( elem ), 10713 props = {}; 10714 10715 // set position first, in-case top/left are set even on static elem 10716 if ( position === "static" ) { 10717 elem.style.position = "relative"; 10718 } 10719 10720 curOffset = curElem.offset(); 10721 curCSSTop = jQuery.css( elem, "top" ); 10722 curCSSLeft = jQuery.css( elem, "left" ); 10723 calculatePosition = ( position === "absolute" || position === "fixed" ) && 10724 jQuery.inArray( "auto", [ curCSSTop, curCSSLeft ] ) > -1; 10725 10726 // need to be able to calculate position if either top or left 10727 // is auto and position is either absolute or fixed 10728 if ( calculatePosition ) { 10729 curPosition = curElem.position(); 10730 curTop = curPosition.top; 10731 curLeft = curPosition.left; 10732 } else { 10733 curTop = parseFloat( curCSSTop ) || 0; 10734 curLeft = parseFloat( curCSSLeft ) || 0; 10735 } 10736 10737 if ( jQuery.isFunction( options ) ) { 10738 10739 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 10740 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 10741 } 10742 10743 if ( options.top != null ) { 10744 props.top = ( options.top - curOffset.top ) + curTop; 10745 } 10746 if ( options.left != null ) { 10747 props.left = ( options.left - curOffset.left ) + curLeft; 10748 } 10749 10750 if ( "using" in options ) { 10751 options.using.call( elem, props ); 10752 } else { 10753 curElem.css( props ); 10754 } 10755 } 10756}; 10757 10758jQuery.fn.extend( { 10759 offset: function( options ) { 10760 if ( arguments.length ) { 10761 return options === undefined ? 10762 this : 10763 this.each( function( i ) { 10764 jQuery.offset.setOffset( this, options, i ); 10765 } ); 10766 } 10767 10768 var docElem, win, 10769 box = { top: 0, left: 0 }, 10770 elem = this[ 0 ], 10771 doc = elem && elem.ownerDocument; 10772 10773 if ( !doc ) { 10774 return; 10775 } 10776 10777 docElem = doc.documentElement; 10778 10779 // Make sure it's not a disconnected DOM node 10780 if ( !jQuery.contains( docElem, elem ) ) { 10781 return box; 10782 } 10783 10784 // If we don't have gBCR, just use 0,0 rather than error 10785 // BlackBerry 5, iOS 3 (original iPhone) 10786 if ( typeof elem.getBoundingClientRect !== "undefined" ) { 10787 box = elem.getBoundingClientRect(); 10788 } 10789 win = getWindow( doc ); 10790 return { 10791 top: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ), 10792 left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 ) 10793 }; 10794 }, 10795 10796 position: function() { 10797 if ( !this[ 0 ] ) { 10798 return; 10799 } 10800 10801 var offsetParent, offset, 10802 parentOffset = { top: 0, left: 0 }, 10803 elem = this[ 0 ]; 10804 10805 // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, 10806 // because it is its only offset parent 10807 if ( jQuery.css( elem, "position" ) === "fixed" ) { 10808 10809 // we assume that getBoundingClientRect is available when computed position is fixed 10810 offset = elem.getBoundingClientRect(); 10811 } else { 10812 10813 // Get *real* offsetParent 10814 offsetParent = this.offsetParent(); 10815 10816 // Get correct offsets 10817 offset = this.offset(); 10818 if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) { 10819 parentOffset = offsetParent.offset(); 10820 } 10821 10822 // Add offsetParent borders 10823 parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ); 10824 parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ); 10825 } 10826 10827 // Subtract parent offsets and element margins 10828 // note: when an element has margin: auto the offsetLeft and marginLeft 10829 // are the same in Safari causing offset.left to incorrectly be 0 10830 return { 10831 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 10832 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 10833 }; 10834 }, 10835 10836 offsetParent: function() { 10837 return this.map( function() { 10838 var offsetParent = this.offsetParent; 10839 10840 while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && 10841 jQuery.css( offsetParent, "position" ) === "static" ) ) { 10842 offsetParent = offsetParent.offsetParent; 10843 } 10844 return offsetParent || documentElement; 10845 } ); 10846 } 10847} ); 10848 10849// Create scrollLeft and scrollTop methods 10850jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 10851 var top = /Y/.test( prop ); 10852 10853 jQuery.fn[ method ] = function( val ) { 10854 return access( this, function( elem, method, val ) { 10855 var win = getWindow( elem ); 10856 10857 if ( val === undefined ) { 10858 return win ? ( prop in win ) ? win[ prop ] : 10859 win.document.documentElement[ method ] : 10860 elem[ method ]; 10861 } 10862 10863 if ( win ) { 10864 win.scrollTo( 10865 !top ? val : jQuery( win ).scrollLeft(), 10866 top ? val : jQuery( win ).scrollTop() 10867 ); 10868 10869 } else { 10870 elem[ method ] = val; 10871 } 10872 }, method, val, arguments.length, null ); 10873 }; 10874} ); 10875 10876// Support: Safari<7-8+, Chrome<37-44+ 10877// Add the top/left cssHooks using jQuery.fn.position 10878// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 10879// getComputedStyle returns percent when specified for top/left/bottom/right 10880// rather than make the css module depend on the offset module, we just check for it here 10881jQuery.each( [ "top", "left" ], function( i, prop ) { 10882 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 10883 function( elem, computed ) { 10884 if ( computed ) { 10885 computed = curCSS( elem, prop ); 10886 10887 // if curCSS returns percentage, fallback to offset 10888 return rnumnonpx.test( computed ) ? 10889 jQuery( elem ).position()[ prop ] + "px" : 10890 computed; 10891 } 10892 } 10893 ); 10894} ); 10895 10896 10897// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 10898jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 10899 jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, 10900 function( defaultExtra, funcName ) { 10901 10902 // margin is only for outerHeight, outerWidth 10903 jQuery.fn[ funcName ] = function( margin, value ) { 10904 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 10905 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 10906 10907 return access( this, function( elem, type, value ) { 10908 var doc; 10909 10910 if ( jQuery.isWindow( elem ) ) { 10911 10912 // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there 10913 // isn't a whole lot we can do. See pull request at this URL for discussion: 10914 // https://github.com/jquery/jquery/pull/764 10915 return elem.document.documentElement[ "client" + name ]; 10916 } 10917 10918 // Get document width or height 10919 if ( elem.nodeType === 9 ) { 10920 doc = elem.documentElement; 10921 10922 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 10923 // whichever is greatest 10924 // unfortunately, this causes bug #3838 in IE6/8 only, 10925 // but there is currently no good, small way to fix it. 10926 return Math.max( 10927 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 10928 elem.body[ "offset" + name ], doc[ "offset" + name ], 10929 doc[ "client" + name ] 10930 ); 10931 } 10932 10933 return value === undefined ? 10934 10935 // Get width or height on the element, requesting but not forcing parseFloat 10936 jQuery.css( elem, type, extra ) : 10937 10938 // Set width or height on the element 10939 jQuery.style( elem, type, value, extra ); 10940 }, type, chainable ? margin : undefined, chainable, null ); 10941 }; 10942 } ); 10943} ); 10944 10945 10946jQuery.fn.extend( { 10947 10948 bind: function( types, data, fn ) { 10949 return this.on( types, null, data, fn ); 10950 }, 10951 unbind: function( types, fn ) { 10952 return this.off( types, null, fn ); 10953 }, 10954 10955 delegate: function( selector, types, data, fn ) { 10956 return this.on( types, selector, data, fn ); 10957 }, 10958 undelegate: function( selector, types, fn ) { 10959 10960 // ( namespace ) or ( selector, types [, fn] ) 10961 return arguments.length === 1 ? 10962 this.off( selector, "**" ) : 10963 this.off( types, selector || "**", fn ); 10964 } 10965} ); 10966 10967// The number of elements contained in the matched element set 10968jQuery.fn.size = function() { 10969 return this.length; 10970}; 10971 10972jQuery.fn.andSelf = jQuery.fn.addBack; 10973 10974 10975 10976 10977// Register as a named AMD module, since jQuery can be concatenated with other 10978// files that may use define, but not via a proper concatenation script that 10979// understands anonymous AMD modules. A named AMD is safest and most robust 10980// way to register. Lowercase jquery is used because AMD module names are 10981// derived from file names, and jQuery is normally delivered in a lowercase 10982// file name. Do this after creating the global so that if an AMD module wants 10983// to call noConflict to hide this version of jQuery, it will work. 10984 10985// Note that for maximum portability, libraries that are not jQuery should 10986// declare themselves as anonymous modules, and avoid setting a global if an 10987// AMD loader is present. jQuery is a special case. For more information, see
10988// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 10989 10990if ( typeof define === "function" && define.amd ) { 10991 define( "jquery", [], function() { 10992 return jQuery; 10993 } ); 10994} 10995 10996 10997 10998var 10999 11000 // Map over jQuery in case of overwrite 11001 _jQuery = window.jQuery, 11002 11003 // Map over the $ in case of overwrite 11004 _$ = window.$; 11005 11006jQuery.noConflict = function( deep ) { 11007 if ( window.$ === jQuery ) { 11008 window.$ = _$; 11009 } 11010 11011 if ( deep && window.jQuery === jQuery ) { 11012 window.jQuery = _jQuery; 11013 } 11014 11015 return jQuery; 11016}; 11017 11018// Expose jQuery and $ identifiers, even in 11019// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 11020// and CommonJS for browser emulators (#13566) 11021if ( !noGlobal ) { 11022 window.jQuery = window.$ = jQuery; 11023} 11024 11025return jQuery; 11026})); 11027 11028 11029/** 11030 * For jQuery versions less than 3.5.0, this replaces the jQuery.htmlPrefilter() 11031 * function with one that fixes these security vulnerabilities while also 11032 * retaining the pre-3.5.0 behavior where it's safe to do so. 11033 * - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11022 11034 * - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11023 11035 */ 11036(function (jQuery) { 11037 11038 // No backport is needed if we're already on jQuery 3.5 or higher. 11039 var versionParts = jQuery.fn.jquery.split('.'); 11040 var majorVersion = parseInt(versionParts[0]); 11041 var minorVersion = parseInt(versionParts[1]); 11042 if ( (majorVersion > 3) || (majorVersion === 3 && minorVersion >= 5) ) { 11043 return; 11044 } 11045 11046 // Prior to jQuery 3.5, jQuery converted XHTML-style self-closing tags to 11047 // their XML equivalent: e.g., "<div />" to "<div></div>". This is 11048 // problematic for several reasons, including that it's vulnerable to XSS 11049 // attacks. However, since this was jQuery's behavior for many years, many 11050 // Joomla extnesions jQuery plugins may be relying on it. Therefore, we 11051 // preserve that behavior, but for a limited set of tags only, that we believe 11052 // to not be vulnerable. This is the set of HTML tags that satisfy all of the 11053 // following conditions: 11054 // - In DOMPurify's list of HTML tags. If an HTML tag isn't safe enough to 11055 // appear in that list, then we don't want to mess with it here either. 11056 // @see https://github.com/cure53/DOMPurify/blob/2.0.11/dist/purify.js#L128 11057 // - A normal element (not a void, template, text, or foreign element). 11058 // @see https://html.spec.whatwg.org/multipage/syntax.html#elements-2 11059 // - An element that is still defined by the current HTML specification 11060 // (not a deprecated element), because we do not want to rely on how 11061 // browsers parse deprecated elements. 11062 // @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element 11063 // - Not 'html', 'head', or 'body', because this pseudo-XHTML expansion is 11064 // designed for fragments, not entire documents. 11065 // - Not 'colgroup', because due to an idiosyncrasy of jQuery's original 11066 // regular expression, it didn't match on colgroup, and we don't want to 11067 // introduce a behavior change for that. 11068 var selfClosingTagsToReplace = [ 11069 'a', 'abbr', 'address', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 11070 'blockquote', 'button', 'canvas', 'caption', 'cite', 'code', 'data', 11071 'datalist', 'dd', 'del', 'details', 'dfn', 'div', 'dl', 'dt', 'em', 11072 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'h1', 'h2', 'h3', 11073 'h4', 'h5', 'h6', 'header', 'hgroup', 'i', 'ins', 'kbd', 'label', 'legend', 11074 'li', 'main', 'map', 'mark', 'menu', 'meter', 'nav', 'ol', 'optgroup', 11075 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 11076 'ruby', 's', 'samp', 'section', 'select', 'small', 'source', 'span', 11077 'strong', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'tfoot', 'th', 11078 'thead', 'time', 'tr', 'u', 'ul', 'var', 'video' 11079 ]; 11080 11081 // Define regular expressions for <TAG/> and <TAG ATTRIBUTES/>. Doing this as 11082 // two expressions makes it easier to target <a/> without also targeting 11083 // every tag that starts with "a". 11084 var xhtmlRegExpGroup = '(' + selfClosingTagsToReplace.join('|') + ')'; 11085 var whitespace = '[\\x20\\t\\r\\n\\f]'; 11086 var rxhtmlTagWithoutSpaceOrAttributes = new RegExp('<' + xhtmlRegExpGroup + '\\/>', 'gi'); 11087 var rxhtmlTagWithSpaceAndMaybeAttributes = new RegExp('<' + xhtmlRegExpGroup + '(' + whitespace + '[^>]*)\\/>', 'gi'); 11088 11089 // jQuery 3.5 also fixed a vulnerability for when </select> appears within 11090 // an <option> or <optgroup>, but it did that in local code that we can't 11091 // backport directly. Instead, we filter such cases out. To do so, we need to 11092 // determine when jQuery would otherwise invoke the vulnerable code, which it 11093 // uses this regular expression to determine. 11094 // @see https://github.com/jquery/jquery/blob/3.4.1/dist/jquery.js#L4716 11095 var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 11096 11097 jQuery.extend({ 11098 htmlPrefilter: function (html) { 11099 // This is how jQuery determines the first tag in the HTML. 11100 // @see https://github.com/jquery/jquery/blob/3.4.1/dist/jquery.js#L4815 11101 var tag = ( rtagName.exec( html ) || [ "", "" ] )[ 1 ].toLowerCase(); 11102
11103 // It is not valid HTML for <option> or <optgroup> to have <select> as 11104 // either a descendant or sibling, and attempts to inject one can cause 11105 // XSS on jQuery versions before 3.5. Since this is invalid HTML and a 11106 // possible XSS attack, reject the entire string. 11107 // @see https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11023 11108 if ((tag === 'option' || tag === 'optgroup') && html.match(/<\/?select/i)) { 11109 html = ''; 11110 } 11111 11112 // Retain jQuery 3.4's conversion of pseudo-XHTML, but for only the 11113 // tags in the `selfClosingTagsToReplace` list defined above. 11114 // @see https://github.com/jquery/jquery/blob/3.4.1/dist/jquery.js#L5979 11115 // @see https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-11022 11116 html = html.replace(rxhtmlTagWithoutSpaceOrAttributes, "<$1></$1>"); 11117 html = html.replace(rxhtmlTagWithSpaceAndMaybeAttributes, "<$1$2></$1>"); 11118 11119 return html; 11120 } 11121 }); 11122 11123})(jQuery); 11124 11125/*jquery-noconflict.js*/ 11126jQuery.noConflict(); 11127 11128/*jquery-migrate.js*/ 11129/*! 11130 * jQuery Migrate - v1.4.1 - 2016-05-19 11131 * Copyright jQuery Foundation and other contributors 11132 */ 11133(function( jQuery, window, undefined ) { 11134// See http://bugs.jquery.com/ticket/13335 11135// "use strict"; 11136 11137 11138jQuery.migrateVersion = "1.4.1"; 11139 11140 11141var warnedAbout = {}; 11142 11143// List of warnings already given; public read only 11144jQuery.migrateWarnings = []; 11145 11146// Set to true to prevent console output; migrateWarnings still maintained 11147// jQuery.migrateMute = false; 11148 11149// Show a message on the console so devs know we're active 11150if ( window.console && window.console.log ) { 11151 window.console.log( "JQMIGRATE: Migrate is installed" + 11152 ( jQuery.migrateMute ? "" : " with logging active" ) + 11153 ", version " + jQuery.migrateVersion ); 11154} 11155 11156// Set to false to disable traces that appear with warnings 11157if ( jQuery.migrateTrace === undefined ) { 11158 jQuery.migrateTrace = true; 11159} 11160 11161// Forget any warnings we've already given; public 11162jQuery.migrateReset = function() { 11163 warnedAbout = {}; 11164 jQuery.migrateWarnings.length = 0; 11165}; 11166 11167function migrateWarn( msg) { 11168 var console = window.console; 11169 if ( !warnedAbout[ msg ] ) { 11170 warnedAbout[ msg ] = true; 11171 jQuery.migrateWarnings.push( msg ); 11172 if ( console && console.warn && !jQuery.migrateMute ) { 11173 console.warn( "JQMIGRATE: " + msg ); 11174 if ( jQuery.migrateTrace && console.trace ) { 11175 console.trace(); 11176 } 11177 } 11178 } 11179} 11180 11181function migrateWarnProp( obj, prop, value, msg ) { 11182 if ( Object.defineProperty ) { 11183 // On ES5 browsers (non-oldIE), warn if the code tries to get prop; 11184 // allow property to be overwritten in case some other plugin wants it 11185 try { 11186 Object.defineProperty( obj, prop, { 11187 configurable: true, 11188 enumerable: true, 11189 get: function() { 11190 migrateWarn( msg ); 11191 return value; 11192 }, 11193 set: function( newValue ) { 11194 migrateWarn( msg ); 11195 value = newValue; 11196 } 11197 }); 11198 return; 11199 } catch( err ) { 11200 // IE8 is a dope about Object.defineProperty, can't warn there 11201 } 11202 } 11203 11204 // Non-ES5 (or broken) browser; just set the property 11205 jQuery._definePropertyBroken = true; 11206 obj[ prop ] = value; 11207} 11208 11209if ( document.compatMode === "BackCompat" ) { 11210 // jQuery has never supported or tested Quirks Mode 11211 migrateWarn( "jQuery is not compatible with Quirks Mode" ); 11212} 11213 11214 11215var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn, 11216 oldAttr = jQuery.attr, 11217 valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get || 11218 function() { return null; }, 11219 valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set || 11220 function() { return undefined; }, 11221 rnoType = /^(?:input|button)$/i, 11222 rnoAttrNodeType = /^[238]$/, 11223 rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, 11224 ruseDefault = /^(?:checked|selected)$/i; 11225 11226// jQuery.attrFn 11227migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" ); 11228 11229jQuery.attr = function( elem, name, value, pass ) { 11230 var lowerName = name.toLowerCase(), 11231 nType = elem && elem.nodeType; 11232 11233 if ( pass ) { 11234 // Since pass is used internally, we only warn for new jQuery 11235 // versions where there isn't a pass arg in the formal params 11236 if ( oldAttr.length < 4 ) { 11237 migrateWarn("jQuery.fn.attr( props, pass ) is deprecated"); 11238 } 11239 if ( elem && !rnoAttrNodeType.test( nType ) && 11240 (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) { 11241 return jQuery( elem )[ name ]( value ); 11242 } 11243 } 11244 11245 // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking 11246 // for disconnected elements we don't warn on $( "<button>", { type: "button" } ). 11247 if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) { 11248 migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8"); 11249 } 11250 11251 // Restore boolHook for boolean property/attribute synchronization 11252 if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) { 11253 jQuery.attrHooks[ lowerName ] = { 11254 get: function( elem, name ) { 11255 // Align boolean attributes with corresponding properties 11256 // Fall back to attribute presence where some booleans are not supported 11257 var attrNode, 11258 property = jQuery.prop( elem, name ); 11259 return property === true || typeof property !== "boolean" && 11260 ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? 11261 11262 name.toLowerCase() : 11263 undefined; 11264 },
11265 set: function( elem, value, name ) { 11266 var propName; 11267 if ( value === false ) { 11268 // Remove boolean attributes when set to false 11269 jQuery.removeAttr( elem, name ); 11270 } else { 11271 // value is true since we know at this point it's type boolean and not false 11272 // Set boolean attributes to the same name and set the DOM property 11273 propName = jQuery.propFix[ name ] || name; 11274 if ( propName in elem ) { 11275 // Only set the IDL specifically if it already exists on the element 11276 elem[ propName ] = true; 11277 } 11278 11279 elem.setAttribute( name, name.toLowerCase() ); 11280 } 11281 return name; 11282 } 11283 }; 11284 11285 // Warn only for attributes that can remain distinct from their properties post-1.9 11286 if ( ruseDefault.test( lowerName ) ) { 11287 migrateWarn( "jQuery.fn.attr('" + lowerName + "') might use property instead of attribute" ); 11288 } 11289 } 11290 11291 return oldAttr.call( jQuery, elem, name, value ); 11292}; 11293 11294// attrHooks: value 11295jQuery.attrHooks.value = { 11296 get: function( elem, name ) { 11297 var nodeName = ( elem.nodeName || "" ).toLowerCase(); 11298 if ( nodeName === "button" ) { 11299 return valueAttrGet.apply( this, arguments ); 11300 } 11301 if ( nodeName !== "input" && nodeName !== "option" ) { 11302 migrateWarn("jQuery.fn.attr('value') no longer gets properties"); 11303 } 11304 return name in elem ? 11305 elem.value : 11306 null; 11307 }, 11308 set: function( elem, value ) { 11309 var nodeName = ( elem.nodeName || "" ).toLowerCase(); 11310 if ( nodeName === "button" ) { 11311 return valueAttrSet.apply( this, arguments ); 11312 } 11313 if ( nodeName !== "input" && nodeName !== "option" ) { 11314 migrateWarn("jQuery.fn.attr('value', val) no longer sets properties"); 11315 } 11316 // Does not return so that setAttribute is also used 11317 elem.value = value; 11318 } 11319}; 11320 11321 11322var matched, browser, 11323 oldInit = jQuery.fn.init, 11324 oldFind = jQuery.find, 11325 oldParseJSON = jQuery.parseJSON, 11326 rspaceAngle = /^\s*</, 11327 rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/, 11328 rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g, 11329 // Note: XSS check is done below after string is trimmed 11330 rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/; 11331 11332// $(html) "looks like html" rule change 11333jQuery.fn.init = function( selector, context, rootjQuery ) { 11334 var match, ret; 11335 11336 if ( selector && typeof selector === "string" ) { 11337 if ( !jQuery.isPlainObject( context ) && 11338 (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) { 11339 11340 // This is an HTML string according to the "old" rules; is it still? 11341 if ( !rspaceAngle.test( selector ) ) { 11342 migrateWarn("$(html) HTML strings must start with '<' character"); 11343 } 11344 if ( match[ 3 ] ) { 11345 migrateWarn("$(html) HTML text after last tag is ignored"); 11346 } 11347 11348 // Consistently reject any HTML-like string starting with a hash (gh-9521) 11349 // Note that this may break jQuery 1.6.x code that otherwise would work. 11350 if ( match[ 0 ].charAt( 0 ) === "#" ) { 11351 migrateWarn("HTML string cannot start with a '#' character"); 11352 jQuery.error("JQMIGRATE: Invalid selector string (XSS)"); 11353 } 11354 11355 // Now process using loose rules; let pre-1.8 play too 11356 // Is this a jQuery context? parseHTML expects a DOM element (#178) 11357 if ( context && context.context && context.context.nodeType ) { 11358 context = context.context; 11359 } 11360 11361 if ( jQuery.parseHTML ) { 11362 return oldInit.call( this, 11363 jQuery.parseHTML( match[ 2 ], context && context.ownerDocument || 11364 context || document, true ), context, rootjQuery ); 11365 } 11366 } 11367 } 11368 11369 ret = oldInit.apply( this, arguments ); 11370 11371 // Fill in selector and context properties so .live() works 11372 if ( selector && selector.selector !== undefined ) { 11373 // A jQuery object, copy its properties 11374 ret.selector = selector.selector; 11375 ret.context = selector.context; 11376 11377 } else { 11378 ret.selector = typeof selector === "string" ? selector : ""; 11379 if ( selector ) { 11380 ret.context = selector.nodeType? selector : context || document; 11381 } 11382 } 11383 11384 return ret; 11385}; 11386jQuery.fn.init.prototype = jQuery.fn; 11387 11388jQuery.find = function( selector ) { 11389 var args = Array.prototype.slice.call( arguments ); 11390 11391 // Support: PhantomJS 1.x 11392 // String#match fails to match when used with a //g RegExp, only on some strings 11393 if ( typeof selector === "string" && rattrHashTest.test( selector ) ) { 11394 11395 // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0 11396 // First see if qS thinks it's a valid selector, if so avoid a false positive 11397 try { 11398 document.querySelector( selector ); 11399 } catch ( err1 ) { 11400 11401 // Didn't *look* valid to qSA, warn and try quoting what we think is the value 11402 selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) { 11403 return "[" + attr + op + "\"" + value + "\"]"; 11404 } ); 11405
11406 // If the regexp *may* have created an invalid selector, don't update it 11407 // Note that there may be false alarms if selector uses jQuery extensions 11408 try { 11409 document.querySelector( selector ); 11410 migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] ); 11411 args[ 0 ] = selector; 11412 } catch ( err2 ) { 11413 migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] ); 11414 } 11415 } 11416 } 11417 11418 return oldFind.apply( this, args ); 11419}; 11420 11421// Copy properties attached to original jQuery.find method (e.g. .attr, .isXML) 11422var findProp; 11423for ( findProp in oldFind ) { 11424 if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) { 11425 jQuery.find[ findProp ] = oldFind[ findProp ]; 11426 } 11427} 11428 11429// Let $.parseJSON(falsy_value) return null 11430jQuery.parseJSON = function( json ) { 11431 if ( !json ) { 11432 migrateWarn("jQuery.parseJSON requires a valid JSON string"); 11433 return null; 11434 } 11435 return oldParseJSON.apply( this, arguments ); 11436}; 11437 11438jQuery.uaMatch = function( ua ) { 11439 ua = ua.toLowerCase(); 11440 11441 var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || 11442 /(webkit)[ \/]([\w.]+)/.exec( ua ) || 11443 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || 11444 /(msie) ([\w.]+)/.exec( ua ) || 11445 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || 11446 []; 11447 11448 return { 11449 browser: match[ 1 ] || "", 11450 version: match[ 2 ] || "0" 11451 }; 11452}; 11453 11454// Don't clobber any existing jQuery.browser in case it's different 11455if ( !jQuery.browser ) { 11456 matched = jQuery.uaMatch( navigator.userAgent ); 11457 browser = {}; 11458 11459 if ( matched.browser ) { 11460 browser[ matched.browser ] = true; 11461 browser.version = matched.version; 11462 } 11463 11464 // Chrome is Webkit, but Webkit is also Safari. 11465 if ( browser.chrome ) { 11466 browser.webkit = true; 11467 } else if ( browser.webkit ) { 11468 browser.safari = true; 11469 } 11470 11471 jQuery.browser = browser; 11472} 11473 11474// Warn if the code tries to get jQuery.browser 11475migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" ); 11476
11477// jQuery.boxModel deprecated in 1.3, jQuery.support.boxModel deprecated in 1.7 11478jQuery.boxModel = jQuery.support.boxModel = (document.compatMode === "CSS1Compat"); 11479migrateWarnProp( jQuery, "boxModel", jQuery.boxModel, "jQuery.boxModel is deprecated" ); 11480migrateWarnProp( jQuery.support, "boxModel", jQuery.support.boxModel, "jQuery.support.boxModel is deprecated" ); 11481 11482jQuery.sub = function() { 11483 function jQuerySub( selector, context ) { 11484 return new jQuerySub.fn.init( selector, context ); 11485 } 11486 jQuery.extend( true, jQuerySub, this ); 11487 jQuerySub.superclass = this; 11488 jQuerySub.fn = jQuerySub.prototype = this(); 11489 jQuerySub.fn.constructor = jQuerySub; 11490 jQuerySub.sub = this.sub; 11491 jQuerySub.fn.init = function init( selector, context ) { 11492 var instance = jQuery.fn.init.call( this, selector, context, rootjQuerySub ); 11493 return instance instanceof jQuerySub ? 11494 instance : 11495 jQuerySub( instance ); 11496 }; 11497 jQuerySub.fn.init.prototype = jQuerySub.fn; 11498 var rootjQuerySub = jQuerySub(document); 11499 migrateWarn( "jQuery.sub() is deprecated" ); 11500 return jQuerySub; 11501}; 11502 11503// The number of elements contained in the matched element set 11504jQuery.fn.size = function() { 11505 migrateWarn( "jQuery.fn.size() is deprecated; use the .length property" ); 11506 return this.length; 11507}; 11508 11509 11510var internalSwapCall = false; 11511 11512// If this version of jQuery has .swap(), don't false-alarm on internal uses 11513if ( jQuery.swap ) { 11514 jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) { 11515 var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get; 11516 11517 if ( oldHook ) { 11518 jQuery.cssHooks[ name ].get = function() { 11519 var ret; 11520 11521 internalSwapCall = true; 11522 ret = oldHook.apply( this, arguments ); 11523 internalSwapCall = false; 11524 return ret; 11525 }; 11526 } 11527 }); 11528} 11529 11530jQuery.swap = function( elem, options, callback, args ) { 11531 var ret, name, 11532 old = {}; 11533 11534 if ( !internalSwapCall ) { 11535 migrateWarn( "jQuery.swap() is undocumented and deprecated" ); 11536 } 11537 11538 // Remember the old values, and insert the new ones 11539 for ( name in options ) { 11540 old[ name ] = elem.style[ name ]; 11541 elem.style[ name ] = options[ name ]; 11542 } 11543 11544 ret = callback.apply( elem, args || [] ); 11545 11546 // Revert the old values 11547 for ( name in options ) { 11548 elem.style[ name ] = old[ name ]; 11549 } 11550 11551 return ret; 11552}; 11553 11554 11555// Ensure that $.ajax gets the new parseJSON defined in core.js 11556jQuery.ajaxSetup({ 11557 converters: { 11558 "text json": jQuery.parseJSON 11559 } 11560}); 11561 11562 11563var oldFnData = jQuery.fn.data; 11564 11565jQuery.fn.data = function( name ) { 11566 var ret, evt, 11567 elem = this[0]; 11568 11569 // Handles 1.7 which has this behavior and 1.8 which doesn't 11570 if ( elem && name === "events" && arguments.length === 1 ) { 11571 ret = jQuery.data( elem, name ); 11572 evt = jQuery._data( elem, name ); 11573 if ( ( ret === undefined || ret === evt ) && evt !== undefined ) { 11574 migrateWarn("Use of jQuery.fn.data('events') is deprecated"); 11575 return evt; 11576 } 11577 } 11578 return oldFnData.apply( this, arguments ); 11579}; 11580 11581 11582var rscriptType = /\/(java|ecma)script/i; 11583 11584// Since jQuery.clean is used internally on older versions, we only shim if it's missing 11585if ( !jQuery.clean ) { 11586 jQuery.clean = function( elems, context, fragment, scripts ) { 11587 // Set context per 1.8 logic 11588 context = context || document; 11589 context = !context.nodeType && context[0] || context; 11590 context = context.ownerDocument || context; 11591 11592 migrateWarn("jQuery.clean() is deprecated"); 11593 11594 var i, elem, handleScript, jsTags, 11595 ret = []; 11596 11597 jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes ); 11598 11599 // Complex logic lifted directly from jQuery 1.8 11600 if ( fragment ) { 11601 // Special handling of each script element 11602 handleScript = function( elem ) { 11603 // Check if we consider it executable 11604 if ( !elem.type || rscriptType.test( elem.type ) ) { 11605 // Detach the script and store it in the scripts array (if provided) or the fragment 11606 // Return truthy to indicate that it has been handled 11607 return scripts ? 11608 scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) : 11609 fragment.appendChild( elem ); 11610 } 11611 }; 11612 11613 for ( i = 0; (elem = ret[i]) != null; i++ ) { 11614 // Check if we're done after handling an executable script 11615 if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) { 11616 // Append to fragment and handle embedded scripts 11617 fragment.appendChild( elem ); 11618 if ( typeof elem.getElementsByTagName !== "undefined" ) { 11619 // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration 11620 jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript ); 11621 11622 // Splice the scripts into ret after their former ancestor and advance our index beyond them 11623 ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); 11624 i += jsTags.length; 11625 } 11626 } 11627 } 11628 } 11629 11630 return ret; 11631 }; 11632} 11633 11634var eventAdd = jQuery.event.add, 11635 eventRemove = jQuery.event.remove, 11636 eventTrigger = jQuery.event.trigger, 11637 oldToggle = jQuery.fn.toggle, 11638 oldLive = jQuery.fn.live, 11639 oldDie = jQuery.fn.die, 11640 oldLoad = jQuery.fn.load, 11641 ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess", 11642 rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ), 11643 rhoverHack = /(?:^|\s)hover(\.\S+|)\b/, 11644 hoverHack = function( events ) { 11645 if ( typeof( events ) !== "string" || jQuery.event.special.hover ) { 11646 return events; 11647 } 11648 if ( rhoverHack.test( events ) ) { 11649 migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"); 11650 } 11651 return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); 11652 }; 11653 11654// Event props removed in 1.9, put them back if needed; no practical way to warn them 11655if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) { 11656 jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" ); 11657} 11658 11659// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7 11660if ( jQuery.event.dispatch ) { 11661 migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" ); 11662} 11663 11664// Support for 'hover' pseudo-event and ajax event warnings 11665jQuery.event.add = function( elem, types, handler, data, selector ){ 11666 if ( elem !== document && rajaxEvent.test( types ) ) { 11667 migrateWarn( "AJAX events should be attached to document: " + types ); 11668 } 11669 eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector ); 11670}; 11671jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){ 11672 eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes ); 11673}; 11674 11675jQuery.each( [ "load", "unload", "error" ], function( _, name ) { 11676 11677 jQuery.fn[ name ] = function() { 11678 var args = Array.prototype.slice.call( arguments, 0 ); 11679 11680 // If this is an ajax load() the first arg should be the string URL; 11681 // technically this could also be the "Anything" arg of the event .load() 11682 // which just goes to show why this dumb signature has been deprecated! 11683 // jQuery custom builds that exclude the Ajax module justifiably die here. 11684 if ( name === "load" && typeof args[ 0 ] === "string" ) { 11685 return oldLoad.apply( this, args ); 11686 } 11687 11688 migrateWarn( "jQuery.fn." + name + "() is deprecated" ); 11689 11690 args.splice( 0, 0, name ); 11691 if ( arguments.length ) { 11692 return this.bind.apply( this, args ); 11693 } 11694 11695 // Use .triggerHandler here because: 11696 // - load and unload events don't need to bubble, only applied to window or image 11697 // - error event should not bubble to window, although it does pre-1.7 11698 // See http://bugs.jquery.com/ticket/11820 11699 this.triggerHandler.apply( this, args ); 11700 return this; 11701 }; 11702 11703}); 11704 11705jQuery.fn.toggle = function( fn, fn2 ) { 11706 11707 // Don't mess with animation or css toggles 11708 if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) { 11709 return oldToggle.apply( this, arguments ); 11710 } 11711 migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated"); 11712 11713 // Save reference to arguments for access in closure 11714 var args = arguments, 11715 guid = fn.guid || jQuery.guid++, 11716 i = 0, 11717 toggler = function( event ) { 11718 // Figure out which function to execute 11719 var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; 11720 jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); 11721 11722 // Make sure that clicks stop 11723 event.preventDefault(); 11724 11725 // and execute the function 11726 return args[ lastToggle ].apply( this, arguments ) || false; 11727 }; 11728 11729 // link all the functions, so any of them can unbind this click handler 11730 toggler.guid = guid; 11731 while ( i < args.length ) { 11732 args[ i++ ].guid = guid; 11733 } 11734 11735 return this.click( toggler ); 11736}; 11737 11738jQuery.fn.live = function( types, data, fn ) { 11739 migrateWarn("jQuery.fn.live() is deprecated"); 11740 if ( oldLive ) { 11741 return oldLive.apply( this, arguments ); 11742 } 11743 jQuery( this.context ).on( types, this.selector, data, fn ); 11744 return this; 11745}; 11746 11747jQuery.fn.die = function( types, fn ) { 11748 migrateWarn("jQuery.fn.die() is deprecated"); 11749 if ( oldDie ) { 11750 return oldDie.apply( this, arguments ); 11751 } 11752 jQuery( this.context ).off( types, this.selector || "**", fn ); 11753 return this; 11754}; 11755 11756// Turn global events into document-triggered events 11757jQuery.event.trigger = function( event, data, elem, onlyHandlers ){ 11758 if ( !elem && !rajaxEvent.test( event ) ) { 11759 migrateWarn( "Global events are undocumented and deprecated" ); 11760 } 11761 return eventTrigger.call( this, event, data, elem || document, onlyHandlers ); 11762}; 11763jQuery.each( ajaxEvents.split("|"), 11764 function( _, name ) { 11765 jQuery.event.special[ name ] = { 11766 setup: function() { 11767 var elem = this; 11768 11769 // The document needs no shimming; must be !== for oldIE 11770 if ( elem !== document ) { 11771 jQuery.event.add( document, name + "." + jQuery.guid, function() { 11772 jQuery.event.trigger( name, Array.prototype.slice.call( arguments, 1 ), elem, true ); 11773 }); 11774 jQuery._data( this, name, jQuery.guid++ ); 11775 } 11776 return false;
11777 }, 11778 teardown: function() { 11779 if ( this !== document ) { 11780 jQuery.event.remove( document, name + "." + jQuery._data( this, name ) ); 11781 } 11782 return false; 11783 } 11784 }; 11785 } 11786); 11787 11788jQuery.event.special.ready = { 11789 setup: function() { 11790 if ( this === document ) { 11791 migrateWarn( "'ready' event is deprecated" ); 11792 } 11793 } 11794}; 11795 11796var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack, 11797 oldFnFind = jQuery.fn.find; 11798 11799jQuery.fn.andSelf = function() { 11800 migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"); 11801 return oldSelf.apply( this, arguments ); 11802}; 11803 11804jQuery.fn.find = function( selector ) { 11805 var ret = oldFnFind.apply( this, arguments ); 11806 ret.context = this.context; 11807 ret.selector = this.selector ? this.selector + " " + selector : selector; 11808 return ret; 11809}; 11810 11811 11812// jQuery 1.6 did not support Callbacks, do not warn there 11813if ( jQuery.Callbacks ) { 11814 11815 var oldDeferred = jQuery.Deferred, 11816 tuples = [ 11817 // action, add listener, callbacks, .then handlers, final state 11818 [ "resolve", "done", jQuery.Callbacks("once memory"), 11819 jQuery.Callbacks("once memory"), "resolved" ], 11820 [ "reject", "fail", jQuery.Callbacks("once memory"), 11821 jQuery.Callbacks("once memory"), "rejected" ], 11822 [ "notify", "progress", jQuery.Callbacks("memory"), 11823 jQuery.Callbacks("memory") ] 11824 ]; 11825 11826 jQuery.Deferred = function( func ) { 11827 var deferred = oldDeferred(), 11828 promise = deferred.promise(); 11829 11830 deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) { 11831 var fns = arguments; 11832 11833 migrateWarn( "deferred.pipe() is deprecated" ); 11834 11835 return jQuery.Deferred(function( newDefer ) { 11836 jQuery.each( tuples, function( i, tuple ) { 11837 var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; 11838 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 11839 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 11840 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 11841 deferred[ tuple[1] ](function() { 11842 var returned = fn && fn.apply( this, arguments ); 11843 if ( returned && jQuery.isFunction( returned.promise ) ) { 11844 returned.promise() 11845 .done( newDefer.resolve ) 11846 .fail( newDefer.reject ) 11847 .progress( newDefer.notify ); 11848 } else { 11849 newDefer[ tuple[ 0 ] + "With" ]( 11850 this === promise ? newDefer.promise() : this, 11851 fn ? [ returned ] : arguments 11852 ); 11853 } 11854 }); 11855 }); 11856 fns = null; 11857 }).promise(); 11858 11859 }; 11860 11861 deferred.isResolved = function() { 11862 migrateWarn( "deferred.isResolved is deprecated" ); 11863 return deferred.state() === "resolved"; 11864 }; 11865 11866 deferred.isRejected = function() { 11867 migrateWarn( "deferred.isRejected is deprecated" ); 11868 return deferred.state() === "rejected"; 11869 }; 11870 11871 if ( func ) { 11872 func.call( deferred, deferred ); 11873 } 11874 11875 return deferred; 11876 }; 11877 11878} 11879 11880})( jQuery, window ); 11881 11882jQuery(document).ready(function(){var mySwiper=undefined;function initSwiper(){var screenWidth=jQuery(window).outerWidth();if((screenWidth<901)&&(mySwiper===undefined)){mySwiper=new Swiper('.js-catalog-slider',{slidesPerView:2,spaceBetween:10,observer:!0,observeParents:!0,observeSlideChildren:!0,breakpoints:{320:{spaceBetween:10,slidesPerView:1},480:{spaceBetween:10,slidesPerView:2}},navigation:{nextEl:'.js-catalog-slider-next',prevEl:'.js-catalog-slider-prev',}})}else if((screenWidth>901)&&(mySwiper!==undefined)){mySwiper.destroy();mySwiper=undefined}} 11883initSwiper();jQuery(window).resize(function(){initSwiper()})});jQuery.noConflict();jQuery(document).ready(function(){jQuery(document).on("click",'[data-toggle="lightbox"]',function(event){event.preventDefault();jQuery(this).ekkoLightbox({alwaysShowClose:!0})});jQuery('.photo-slider-buttons').show();jQuery('.video-slider-buttons').hide();jQuery('.audio-slider-buttons').hide();jQuery(".main-sites-slide").click(function(e){var id=jQuery(this).attr('data-id');jQuery.post("/libs/themesites.php",{id:id}).done(function(data){jQuery.cookie("tsites"+id,id,{expires:0.032})})});if(jQuery('.js-main-banner-slider .swiper-slide').length>1){var mainSlider=new Swiper('.js-main-banner-slider',{navigation:{nextEl:'.js-main-banner-next',prevEl:'.js-main-banner-prev',},pagination:{el:'.js-main-banner-pagination',type:'bullets',clickable:!0},autoplay:{delay:5000,}})} 11884var i=-1;jQuery('.main-banner-scroll').hover(function(){i=i*(-1);if(i==1){jQuery(this).animate({scrollTop:jQuery(this).css("height")},"slow")} 11885if(i==-1){jQuery(this).animate({scrollTop:0},"slow")}});
11885if(jQuery('.js-main-soon-slider1 .swiper-slide').length>1){jQuery('.js-main-soon-slider-buttons1').addClass('active');var mainPosterSlider=new Swiper('.js-main-soon-slider1',{slidesPerView:7,preloadImages:!1,lazy:!0,spaceBetween:24,navigation:{nextEl:'.js-main-soon-next1',prevEl:'.js-main-soon-prev1',},breakpoints:{1200:{slidesPerView:7,spaceBetween:15},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},}})} 11886if(jQuery('.js-main-soon-slider .swiper-slide').length>4){jQuery('.js-main-soon-slider-buttons').addClass('active');var mainPosterSlider=new Swiper('.js-main-soon-slider',{slidesPerView:1,preloadImages:!1,lazy:!0,spaceBetween:24,navigation:{nextEl:'.js-main-soon-next',prevEl:'.js-main-soon-prev',},breakpoints:{1200:{slidesPerView:8,spaceBetween:15},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},}})} 11887if(jQuery('.js-main-sites-slider .swiper-slide').length>4){jQuery('.js-main-sites-slider-buttons').addClass('active');var mainPosterSlider=new Swiper('.js-main-sites-slider',{slidesPerView:1,preloadImages:!1,lazy:!0,spaceBetween:24,navigation:{nextEl:'.js-main-sites-next',prevEl:'.js-main-sites-prev',},breakpoints:{1200:{slidesPerView:7,spaceBetween:20},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},}})} 11888var mainPhotoSlider=new Swiper('.js-main-multimedia-slider',{spaceBetween:24,navigation:{nextEl:'.js-main-photo-next',prevEl:'.js-main-photo-prev',},breakpoints:{1200:{slidesPerView:5,spaceBetween:15},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},320:{slidesPerView:1,spaceBetween:20}}});if(jQuery('.js-main-multimedia-vid-slider .swiper-slide').length>3){var mainVideoSlider=new Swiper('.js-main-multimedia-vid-slider',{spaceBetween:24,navigation:{nextEl:'.js-main-video-next',prevEl:'.js-main-video-prev',},breakpoints:{1200:{slidesPerView:5,spaceBetween:15},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},320:{slidesPerView:1,spaceBetween:20}}})} 11889if(jQuery('.js-main-multimedia-audio-slider .swiper-slide').length>3){var mainAudioSlider=new Swiper('.js-main-multimedia-audio-slider',{spaceBetween:24,navigation:{nextEl:'.js-main-audio-next',prevEl:'.js-main-audio-prev',},breakpoints:{1200:{slidesPerView:5,spaceBetween:20},991:{slidesPerView:4,spaceBetween:20},768:{slidesPerView:3,spaceBetween:20},480:{slidesPerView:2,spaceBetween:20},320:{slidesPerView:1,spaceBetween:20}}})} 11890if(jQuery('.js-main-partners-slider .swiper-slide').length>4){jQuery('.js-main-partners-slider-buttons').addClass('active');var mainPosterSlider=new Swiper('.js-main-partners-slider',{slidesPerView:4,spaceBetween:24,navigation:{nextEl:'.js-main-partners-next',prevEl:'.js-main-partners-prev',}})} 11891if(jQuery('.main-articles').length>0){let $el,newWidth,magicLine=jQuery(".main-articles-link-line"),currentBtnWidth=jQuery(".main-articles-link-item.active-js"),leftPos=currentBtnWidth.position().left;jQuery(document).ready(function(){setTimeout(function(){magicLine.width(currentBtnWidth[0].offsetWidth).css("left",currentBtnWidth.position().left)},1)});jQuery('body').on('click','.main-articles-link-item',function(){let tabIndex=jQuery(this).index();$el=jQuery(this);leftPos=$el.position().left;newWidth=$el.innerWidth();magicLine.animate({left:leftPos,width:newWidth},200);jQuery(this).parent().find('button').removeClass('active-js');jQuery(this).addClass('active-js');jQuery(this).parent().parent().children().eq(1).children().removeClass('active-js');jQuery(this).parent().parent().children().eq(1).children().eq(tabIndex).addClass('active-js')});jQuery(window).resize(function(){let $elResize=jQuery('.main-articles-link-item.active-js');let leftPosResize=$elResize.position().left;let newWidthResize=$elResize.innerWidth();let magicLineResize=jQuery(".main-articles-link-line");magicLineResize.animate({left:leftPosResize,width:newWidthResize},0)})} 11892if(jQuery('.main-multimedia').length>0){let $el,newWidth,magicLine=jQuery(".main-multimedia-link-line"),currentBtnWidth=jQuery(".main-multimedia-link-item.active-js"),leftPos=currentBtnWidth.position().left;jQuery(document).ready(function(){setTimeout(function(){magicLine.width(currentBtnWidth[0].offsetWidth).css("left",currentBtnWidth.position().left)},1)});jQuery('body').on('click','.main-multimedia-link-item',function(){let tabIndex=jQuery(this).index();$el=jQuery(this);leftPos=$el.position().left;newWidth=$el.innerWidth();magicLine.animate({left:leftPos,width:newWidth},200);jQuery(this).parent().find('button').removeClass('active-js');jQuery(this).addClass('active-js');jQuery(this).parent().parent().children().eq(1).children().removeClass('active-js');jQuery(this).parent().parent().children().eq(1).children().eq(tabIndex).addClass('active-js');
11892if(mainVideoSlider!==undefined){mainVideoSlider.update()} 11893if(mainAudioSlider!==undefined){mainAudioSlider.update()}});jQuery('body').on('click','.link-photo',function(){jQuery('.photo-slider-buttons').show();jQuery('.video-slider-buttons').hide();jQuery('.audio-slider-buttons').hide()});jQuery('body').on('click','.link-video',function(){jQuery('.photo-slider-buttons').hide();jQuery('.video-slider-buttons').show();jQuery('.audio-slider-buttons').hide()});jQuery('body').on('click','.link-audio',function(){jQuery('.photo-slider-buttons').hide();jQuery('.video-slider-buttons').hide();jQuery('.audio-slider-buttons').show()});jQuery(window).resize(function(){let $elResize=jQuery('.main-multimedia-link-item.active-js');let leftPosResize=$elResize.position().left;let newWidthResize=$elResize.innerWidth();let magicLineResize=jQuery(".main-multimedia-link-line");magicLineResize.animate({left:leftPosResize,width:newWidthResize},0)})}}) 11894/*caption-uncompressed.js*/ 11895/** 11896 * @copyright (C) 2010 Open Source Matters, Inc. <https://www.joomla.org> 11897 * @license GNU General Public License version 2 or later; see LICENSE.txt 11898 */ 11899 11900/** 11901 * JCaption javascript behavior 11902 * 11903 * Used for displaying image captions 11904 * 11905 * @package Joomla 11906 * @since 1.5 11907 * @version 1.0 11908 */ 11909var JCaption = function(_selector) { 11910 var $, selector, 11911 11912 initialize = function(_selector) { 11913 $ = jQuery.noConflict(); 11914 selector = _selector; 11915 $(selector).each(function(index, el) { 11916 createCaption(el); 11917 }) 11918 }, 11919 11920 createCaption = function(element) { 11921 var $el = $(element), 11922 caption = $el.attr('title'), 11923 width = $el.attr("width") || element.width, 11924 align = $el.attr("align") || $el.css("float") || element.style.styleFloat || "none", 11925 $p = $('<p/>', { 11926 "text" : caption, 11927 "class" : selector.replace('.', '_') 11928 }),
11929 $container = $('<div/>', { 11930 "class" : selector.replace('.', '_') + " " + align, 11931 "css" : { 11932 "float" : align, 11933 "width" : width 11934 } 11935 }); 11936 $el.before($container); 11937 $container.append($el); 11938 if (caption !== "") { 11939 $container.append($p); 11940 } 11941 } 11942 initialize(_selector); 11943} 11944 11945/*js.cookie.min.js*/ 11946/*! 11947 * JavaScript Cookie v2.2.1 11948 * https://github.com/js-cookie/js-cookie 11949 * 11950 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack 11951 * Released under the MIT license 11952 */ 11953;(function(b){var d;if(typeof define==="function"&&define.amd){define(b);d=true}if(typeof exports==="object"){module.exports=b();d=true}if(!d){var a=window.Cookies;var c=window.Cookies=b();c.noConflict=function(){window.Cookies=a;return c}}}(function(){function c(){var g=0;var d={};for(;g<arguments.length;g++){var e=arguments[g];for(var f in e){d[f]=e[f]}}return d}function a(d){return d.replace(/(%[0-9A-Z]{2})+/g,decodeURIComponent)}function b(f){function e(){}function g(k,m,i){if(typeof document==="undefined"){return}i=c({path:"/"},e.defaults,i);if(typeof i.expires==="number"){i.expires=new Date(new Date()*1+i.expires*86400000)}i.expires=i.expires?i.expires.toUTCString():"";try{var h=JSON.stringify(m);if(/^[\{\[]/.test(h)){m=h}}catch(n){}m=f.write?f.write(m,k):encodeURIComponent(String(m)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent);k=encodeURIComponent(String(k)).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent).replace(/[\(\)]/g,escape);var l="";for(var j in i){if(!i[j]){continue}l+="; "+j;if(i[j]===true){continue}l+="="+i[j].split(";")[0]}return(document.cookie=k+"="+m+l)}function d(o,q){if(typeof document==="undefined"){return}var k={};var p=document.cookie?document.cookie.split("; "):[];var m=0;for(;m<p.length;m++){var l=p[m].split("=");var j=l.slice(1).join("=");if(!q&&j.charAt(0)==='"'){j=j.slice(1,-1)}try{var h=a(l[0]);j=(f.read||f)(j,h)||a(j);if(q){try{j=JSON.parse(j)}catch(n){}}k[h]=j;if(o===h){break}}catch(n){}}return o?k[o]:k}e.set=g;e.get=function(h){return d(h,false)};e.getJSON=function(h){return d(h,true)};e.remove=function(i,h){g(i,"",c(h,{expires:-1}))};e.defaults={};e.withConverter=b;return e}return b(function(){})})); 11954jQuery(document).ready(function($){$.bvi({'bvi_target':'.bvi-open',"bvi_theme":"white","bvi_font":"arial","bvi_font_size":16,"bvi_letter_spacing":"normal","bvi_line_height":"normal","bvi_images":!0,"bvi_reload":!1,"bvi_fixed":!1,"bvi_tts":!0,"bvi_flash_iframe":!0,"bvi_hide":!1})}) 11955/*swiped-events.min.js*/ 11956/*! 11957 * swiped-events.js - v1.1.0 11958 * Pure JavaScript swipe events 11959 * https://github.com/john-doherty/swiped-events 11960 * @inspiration https://stackoverflow.com/questions/16348031/disable-scrolling-when-touch-moving-certain-element 11961 * @author John Doherty <www.johndoherty.info> 11962 * @license MIT 11963 */ 11964!function(t,e){"use strict";"function"!=typeof t.CustomEvent&&(t.CustomEvent=function(t,n){n=n||{bubbles:!1,cancelable:!1,detail:void 0};var u=e.createEvent("CustomEvent");return u.initCustomEvent(t,n.bubbles,n.cancelable,n.detail),u},t.CustomEvent.prototype=t.Event.prototype),e.addEventListener("touchstart",function(t){if("true"===t.target.getAttribute("data-swipe-ignore"))return;o=t.target,l=Date.now(),n=t.touches[0].clientX,u=t.touches[0].clientY,a=0,i=0},!1),e.addEventListener("touchmove",function(t){if(!n||!u)return;var e=t.touches[0].clientX,l=t.touches[0].clientY;a=n-e,i=u-l},!1),e.addEventListener("touchend",function(t){if(o!==t.target)return;var e=parseInt(o.getAttribute("data-swipe-threshold")||"20",10),s=parseInt(o.getAttribute("data-swipe-timeout")||"500",10),r=Date.now()-l,c="";Math.abs(a)>Math.abs(i)?Math.abs(a)>e&&r<s&&(c=a>0?"swiped-left":"swiped-right"):Math.abs(i)>e&&r<s&&(c=i>0?"swiped-up":"swiped-down");""!==c&&o.dispatchEvent(new CustomEvent(c,{bubbles:!0,cancelable:!0}));n=null,u=null,l=null},!1);var n=null,u=null,a=null,i=null,l=null,o=null}(window,document); 11965/*bootstrap.min.js*/ 11966/*! 11967 * Bootstrap v4.0.0 (https://getbootstrap.com) 11968 * Copyright 2011-2018 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) 11969 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 11970 */ 11971!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function r(){return(r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}e=e&&e.hasOwnProperty("default")?e.default:e,n=n&&n.hasOwnProperty("default")?n.default:n;var o,a,l,h,c,u,f,d,_,g,p,m,v,E,T,y,C,I,A,b,D,S,w,N,O,k,P=function(t){var e=!1;function n(e){var n=this,s=!1;return t(this).one(i.TRANSITION_END,function(){s=!0}),setTimeout(function(){s||i.triggerTransitionEnd(n)},e),this}var i={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n,i=e.getAttribute("data-target");i&&"#"!==i||(i=e.getAttribute("href")||""),"#"===i.charAt(0)&&(n=i,i=n="function"==typeof t.escapeSelector?t.escapeSelector(n).substr(1):n.replace(/(:|\.|\[|\]|,|=|@)/g,"\\$1"));try{return t(document).find(i).length>0?i:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(n){t(n).trigger(e.end)},supportsTransitionEnd:function(){return Boolean(e)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,e,n){for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)){var r=n[s],o=e[s],a=o&&i.isElement(o)?"element":(l=o,{}.toString.call(l).match(/\s([a-zA-Z]+)/)[1].toLowerCase());if(!new RegExp(r).test(a))throw new Error(t.toUpperCase()+': Option "'+s+'" provided type "'+a+'" but expected type "'+r+'".')}var l}};return e=("undefined"==typeof window||!window.QUnit)&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,i.supportsTransitionEnd()&&(t.event.special[i.TRANSITION_END]={bindType:e.end,delegateType:e.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),i}(e),L=(a="alert",h="."+(l="bs.alert"),c=(o=e).fn[a],u={CLOSE:"close"+h,CLOSED:"closed"+h,CLICK_DATA_API:"click"+h+".data-api"},f="alert",d="fade",_="show",g=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){o.removeData(this._element,l),this._element=null},e._getRootElement=function(t){var e=P.getSelectorFromElement(t),n=!1;return e&&(n=o(e)[0]),n||(n=o(t).closest("."+f)[0]),n},e._triggerCloseEvent=function(t){var e=o.Event(u.CLOSE);return o(t).trigger(e),e},e._removeElement=function(t){var e=this;o(t).removeClass(_),P.supportsTransitionEnd()&&o(t).hasClass(d)?o(t).one(P.TRANSITION_END,function(n){return e._destroyElement(t,n)}).emulateTransitionEnd(150):this._destroyElement(t)},e._destroyElement=function(t){o(t).detach().trigger(u.CLOSED).remove()},t._jQueryInterface=function(e){return this.each(function(){var n=o(this),i=n.data(l);i||(i=new t(this),n.data(l,i)),"close"===e&&i[e](this)})},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),o(document).on(u.CLICK_DATA_API,'[data-dismiss="alert"]',g._handleDismiss(new g)),o.fn[a]=g._jQueryInterface,o.fn[a].Constructor=g,o.fn[a].noConflict=function(){return o.fn[a]=c,g._jQueryInterface},g),R=(m="button",E="."+(v="bs.button"),T=".data-api",y=(p=e).fn[m],C="active",I="btn",A="focus",b='[data-toggle^="button"]',D='[data-toggle="buttons"]',S="input",w=".active",N=".btn",O={CLICK_DATA_API:"click"+E+T,FOCUS_BLUR_DATA_API:"focus"+E+T+" blur"+E+T},k=function(){function t(t){this._element=t}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p(this._element).closest(D)[0];if(n){var i=p(this._element).find(S)[0];if(i){if("radio"===i.type)if(i.checked&&p(this._element).hasClass(C))t=!1;else{var s=p(n).find(w)[0];s&&p(s).removeClass(C)}if(t){if(i.hasAttribute("disabled")||n.hasAttribute("disabled")||i.classList.contains("disabled")||n.classList.contains("disabled"))return;i.checked=!p(this._element).hasClass(C),p(i).trigger("change")}i.focus(),e=!1}}e&&this._element.setAttribute("aria-pressed",!p(this._element).hasClass(C)),t&&p(this._element).toggleClass(C)},e.dispose=function(){p.removeData(this._element,v),this._element=null},t._jQueryInterface=function(e){return this.each(function(){var n=p(this).data(v);n||(n=new t(this),p(this).data(v,n)),"toggle"===e&&n[e]()})},s(t,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),t}(),p(document).on(O.CLICK_DATA_API,b,function(t){t.preventDefault();var e=t.target;p(e).hasClass(I)||(e=p(e).closest(N)),k._jQueryInterface.call(p(e),"toggle")}).on(O.FOCUS_BLUR_DATA_API,b,function(t){var e=p(t.target).closest(N)[0];p(e).toggleClass(A,/^focus(in)?$/.test(t.type))}),p.fn[m]=k._jQueryInterface,p.fn[m].Constructor=k,p.fn[m].noConflict=function(){return p.fn[m]=y,k._jQueryInterface},k),j=function(t){var e="carousel",n="bs.carousel",i="."+n,o=t.fn[e],a={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},l={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},h="next",c="prev",u="left",f="right",d={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},_="carousel",g="active",p="slide",m="carousel-item-right",v="carousel-item-left",E="carousel-item-next",T="carousel-item-prev",y={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-sli
11971de], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},C=function(){function o(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(y.INDICATORS)[0],this._addEventListeners()}var C=o.prototype;return C.next=function(){this._isSliding||this._slide(h)},C.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},C.prev=function(){this._isSliding||this._slide(c)},C.pause=function(e){e||(this._isPaused=!0),t(this._element).find(y.NEXT_PREV)[0]&&P.supportsTransitionEnd()&&(P.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},C.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},C.to=function(e){var n=this;this._activeElement=t(this._element).find(y.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?h:c;this._slide(s,this._items[e])}},C.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},C._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},C._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},C._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next()}},C._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(y.ITEM)),this._items.indexOf(e)},C._getItemByDirection=function(t,e){var n=t===h,i=t===c,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===c?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},C._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(y.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},C._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(y.ACTIVE).removeClass(g);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(g)}},C._slide=function(e,n){var i,s,r,o=this,a=t(this._element).find(y.ACTIVE_ITEM)[0],l=this._getItemIndex(a),c=n||a&&this._getItemByDirection(e,a),_=this._getItemIndex(c),C=Boolean(this._interval);if(e===h?(i=v,s=E,r=u):(i=m,s=T,r=f),c&&t(c).hasClass(g))this._isSliding=!1;else if(!this._triggerSlideEvent(c,r).isDefaultPrevented()&&a&&c){this._isSliding=!0,C&&this.pause(),this._setActiveIndicatorElement(c);var I=t.Event(d.SLID,{relatedTarget:c,direction:r,from:l,to:_});P.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(c).addClass(s),P.reflow(c),t(a).addClass(i),t(c).addClass(i),t(a).one(P.TRANSITION_END,function(){t(c).removeClass(i+" "+s).addClass(g),t(a).removeClass(g+" "+s+" "+i),o._isSliding=!1,setTimeout(function(){return t(o._element).trigger(I)},0)}).emulateTransitionEnd(600)):(t(a).removeClass(g),t(c).addClass(g),this._isSliding=!1,t(this._element).trigger(I)),C&&this.cycle()}},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},a,t(this).data());"object"==typeof e&&(s=r({},s,e));var l="string"==typeof e?e:s.slide;if(i||(i=new o(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof l){if("undefined"==typeof i[l])throw new TypeError('No method n
11971amed "'+l+'"');i[l]()}else s.interval&&(i.pause(),i.cycle())})},o._dataApiClickHandler=function(e){var i=P.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(_)){var a=r({},t(s).data(),t(this).data()),l=this.getAttribute("data-slide-to");l&&(a.interval=!1),o._jQueryInterface.call(t(s),a),l&&t(s).data(n).to(l),e.preventDefault()}}},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(d.CLICK_DATA_API,y.DATA_SLIDE,C._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(y.DATA_RIDE).each(function(){var e=t(this);C._jQueryInterface.call(e,e.data())})}),t.fn[e]=C._jQueryInterface,t.fn[e].Constructor=C,t.fn[e].noConflict=function(){return t.fn[e]=o,C._jQueryInterface},C}(e),H=function(t){var e="collapse",n="bs.collapse",i="."+n,o=t.fn[e],a={toggle:!0,parent:""},l={toggle:"boolean",parent:"(string|element)"},h={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},c="show",u="collapse",f="collapsing",d="collapsed",_="width",g="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},m=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s<i.length;s++){var r=i[s],o=P.getSelectorFromElement(r);null!==o&&t(o).filter(e).length>0&&(this._selector=o,this._triggerArray.push(r))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var o=i.prototype;return o.toggle=function(){t(this._element).hasClass(c)?this.hide():this.show()},o.show=function(){var e,s,r=this;if(!this._isTransitioning&&!t(this._element).hasClass(c)&&(this._parent&&0===(e=t.makeArray(t(this._parent).find(p.ACTIVES).filter('[data-parent="'+this._config.parent+'"]'))).length&&(e=null),!(e&&(s=t(e).not(this._selector).data(n))&&s._isTransitioning))){var o=t.Event(h.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){e&&(i._jQueryInterface.call(t(e).not(this._selector),"hide"),s||t(e).data(n,null));var a=this._getDimension();t(this._element).removeClass(u).addClass(f),this._element.style[a]=0,this._triggerArray.length>0&&t(this._triggerArray).removeClass(d).attr("aria-expanded",!0),this.setTransitioning(!0);var l=function(){t(r._element).removeClass(f).addClass(u).addClass(c),r._element.style[a]="",r.setTransitioning(!1),t(r._element).trigger(h.SHOWN)};if(P.supportsTransitionEnd()){var _="scroll"+(a[0].toUpperCase()+a.slice(1));t(this._element).one(P.TRANSITION_END,l).emulateTransitionEnd(600),this._element.style[a]=this._element[_]+"px"}else l()}}},o.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(c)){var n=t.Event(h.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",P.reflow(this._element),t(this._element).addClass(f).removeClass(u).removeClass(c),this._triggerArray.length>0)for(var s=0;s<this._triggerArray.length;s++){var r=this._triggerArray[s],o=P.getSelectorFromElement(r);if(null!==o)t(o).hasClass(c)||t(r).addClass(d).attr("aria-expanded",!1)}this.setTransitioning(!0);var a=function(){e.setTransitioning(!1),t(e._element).removeClass(f).addClass(u).trigger(h.HIDDEN)};this._element.style[i]="",P.supportsTransitionEnd()?t(this._element).one(P.TRANSITION_END,a).emulateTransitionEnd(600):a()}}},o.setTransitioning=function(t){this._isTransitioning=t},o.dispose=function(){t.removeData(this._element,n),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},o._getConfig=function(t){return(t=r({},a,t)).toggle=Boolean(t.toggle),P.typeCheckConfig(e,t,l),t},o._getDimension=function(){return t(this._element).hasClass(_)?_:g},o._getParent=function(){var e=this,n=null;P.isElement(this._config.parent)?(n=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(n=this._config.parent[0])):n=t(this._config.parent)[0];var s='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(s).each(function(t,n){e._addAriaAndCollapsedClass(i._getTargetFromElement(n),[n])}),n},o._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(c);n.length>0&&t(n).toggleClass(d,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=P.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),l=r({},a,s.data(),"object"==typeof e&&e);if(!o&&l.toggle&&/show|hide/.test(e)&&(l.toggle=!1),o||(o=new i(this,l),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new TypeError('No method n
11971amed "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),i}();return t(document).on(h.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=P.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();m._jQueryInterface.call(e,s)})}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),W=function(t){var e="dropdown",i="bs.dropdown",o="."+i,a=".data-api",l=t.fn[e],h=new RegExp("38|40|27"),c={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,CLICK:"click"+o,CLICK_DATA_API:"click"+o+a,KEYDOWN_DATA_API:"keydown"+o+a,KEYUP_DATA_API:"keyup"+o+a},u="disabled",f="show",d="dropup",_="dropright",g="dropleft",p="dropdown-menu-right",m="dropdown-menu-left",v="position-static",E='[data-toggle="dropdown"]',T=".dropdown form",y=".dropdown-menu",C=".navbar-nav",I=".dropdown-menu .dropdown-item:not(.disabled)",A="top-start",b="top-end",D="bottom-start",S="bottom-end",w="right-start",N="left-start",O={offset:0,flip:!0,boundary:"scrollParent"},k={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function a(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var l=a.prototype;return l.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(u)){var e=a._getParentFromElement(this._element),i=t(this._menu).hasClass(f);if(a._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(c.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new TypeError("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(d)&&(t(this._menu).hasClass(m)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(v),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&0===t(e).closest(C).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(f),t(e).toggleClass(f).trigger(t.Event(c.SHOWN,s))}}}},l.dispose=function(){t.removeData(this._element,i),t(this._element).off(o),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},l.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},l._addEventListeners=function(){var e=this;t(this._element).on(c.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},l._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},l._getMenuElement=function(){if(!this._menu){var e=a._getParentFromElement(this._element);this._menu=t(e).find(y)[0]}return this._menu},l._getPlacement=function(){var e=t(this._element).parent(),n=D;return e.hasClass(d)?(n=A,t(this._menu).hasClass(p)&&(n=b)):e.hasClass(_)?n=w:e.hasClass(g)?n=N:t(this._menu).hasClass(p)&&(n=S),n},l._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},l._getPopperConfig=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset,{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new a(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new TypeError('No method named "'+e+'"');n[e]()}})},a._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(E)),s=0;s<n.length;s++){var r=a._getParentFromElement(n[s]),o=t(n[s]).data(i),l={relatedTarget:n[s]};if(o){var h=o._menu;if(t(r).hasClass(f)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&t.contains(r,e.target))){var u=t.Event(c.HIDE,l);t(r).trigger(u),u.isDefaultPrevented()||("ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),n[s].setAttribute("aria-expanded","fal
11971se"),t(h).removeClass(f),t(r).removeClass(f).trigger(t.Event(c.HIDDEN,l)))}}}},a._getParentFromElement=function(e){var n,i=P.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},a._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||t(e.target).closest(y).length)):h.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!t(this).hasClass(u))){var n=a._getParentFromElement(this),i=t(n).hasClass(f);if((i||27===e.which&&32===e.which)&&(!i||27!==e.which&&32!==e.which)){var s=t(n).find(I).get();if(0!==s.length){var r=s.indexOf(e.target);38===e.which&&r>0&&r--,40===e.which&&r<s.length-1&&r++,r<0&&(r=0),s[r].focus()}}else{if(27===e.which){var o=t(n).find(E)[0];t(o).trigger("focus")}t(this).trigger("click")}}},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return O}},{key:"DefaultType",get:function(){return k}}]),a}();return t(document).on(c.KEYDOWN_DATA_API,E,L._dataApiKeydownHandler).on(c.KEYDOWN_DATA_API,y,L._dataApiKeydownHandler).on(c.CLICK_DATA_API+" "+c.KEYUP_DATA_API,L._clearMenus).on(c.CLICK_DATA_API,E,function(e){e.preventDefault(),e.stopPropagation(),L._jQueryInterface.call(t(this),"toggle")}).on(c.CLICK_DATA_API,T,function(t){t.stopPropagation()}),t.fn[e]=L._jQueryInterface,t.fn[e].Constructor=L,t.fn[e].noConflict=function(){return t.fn[e]=l,L._jQueryInterface},L}(e),M=function(t){var e="modal",n="bs.modal",i="."+n,o=t.fn.modal,a={backdrop:!0,keyboard:!0,focus:!0,show:!0},l={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},h={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,FOCUSIN:"focusin"+i,RESIZE:"resize"+i,CLICK_DISMISS:"click.dismiss"+i,KEYDOWN_DISMISS:"keydown.dismiss"+i,MOUSEUP_DISMISS:"mouseup.dismiss"+i,MOUSEDOWN_DISMISS:"mousedown.dismiss"+i,CLICK_DATA_API:"click"+i+".data-api"},c="modal-scrollbar-measure",u="modal-backdrop",f="modal-open",d="fade",_="show",g={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",STICKY_CONTENT:".sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},p=function(){function o(e,n){this._config=this._getConfig(n),this._element=e,this._dialog=t(e).find(g.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}var p=o.prototype;return p.toggle=function(t){return this._isShown?this.hide():this.show(t)},p.show=function(e){var n=this;if(!this._isTransitioning&&!this._isShown){P.supportsTransitionEnd()&&t(this._element).hasClass(d)&&(this._isTransitioning=!0);var i=t.Event(h.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),t(document.body).addClass(f),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(h.CLICK_DISMISS,g.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(h.MOUSEDOWN_DISMISS,function(){t(n._element).one(h.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))}},p.hide=function(e){var n=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var i=t.Event(h.HIDE);if(t(this._element).trigger(i),this._isShown&&!i.isDefaultPrevented()){this._isShown=!1;var s=P.supportsTransitionEnd()&&t(this._element).hasClass(d);s&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),t(document).off(h.FOCUSIN),t(this._element).removeClass(_),t(this._element).off(h.CLICK_DISMISS),t(this._dialog).off(h.MOUSEDOWN_DISMISS),s?t(this._element).one(P.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(300):this._hideModal()}}},p.dispose=function(){t.removeData(this._element,n),t(window,document,this._element,this._backdrop).off(i),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},p.handleUpdate=function(){this._adjustDialog()},p._getConfig=function(t){return t=r({},a,t),P.typeCheckConfig(e,t,l),t},p._showElement=function(e){var n=this,i=P.supportsTransitionEnd()&&t(this._element).hasClass(d);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&P.reflow(this._element),t(this._element).addClass(_),this._config.focus&&this._enforceFocus();var s=t.Event(h.SHOWN,{relatedTarget:e}),r=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(s)};i?t(this._dialog).one(P.TRANSITION_END,r).emulateTransitionEnd(300):r()},p._enforceFocus=function(){var e=this;t(document).off(h.FOCUSIN).on(h.FOCUSIN,function(n){document!==n.target&&e._element!==n.target&&0===t(e._element).has(n.target).length&&e._element.focus()})},p._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(h.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||t(this._element).off(h.KEYDOWN_DISMISS)},p._setResizeEvent=function(){var e=this;this._isShown?t(window).on(h.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(h.RESIZE)},p._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(f),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(h.HIDDEN)})},p._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},p._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(d)?d:"";if(this._isShown&&this._config.backdrop){var s=P.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=u,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(h.CLICK_DISMISS,function(t){n._ignoreBackdropClick?n._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide())}),s&&P.reflow(this._backdrop),t(this._backdrop).addClass(_),!e)return;if(!s)return void e();t(this._backdrop).one(P.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(_);var r=function(){n._removeBackdrop(),e&&e()};P.supportsTransitionEnd()&&t(this._element).hasClass(d)?t(this._backdrop).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r()}else e&&e()},p._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},p._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){t(g.FIXED_CONTENT).each(function(n,i){var s=t(i)[0].style.paddingRight,r=t(i).css("padding-right");t(i).data("padding-right",s).css("padding-right",parseFloat(r)+e._scrollbarWidth+"px")}),t(g.STICKY_CONTENT).each(function(n,i){var s=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",s).css("margin-right",parseFloat(r)-e._scrollbarWidth+"px")}),t(g.NAVBAR_TOGGLER).each(function(n,i){var s=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",s).css("margin-right",parseFloat(r)+e._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=t("body").css("padding-right");t("body").data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},p._resetScrollbar=function(){t(g.FIXED_CONTENT).each(function(e,n){var i=t(n).data("padding-right");"undefined"!=typeof i&&t(n).css("padding-right",i).removeData("padding-right")}),t(g.STICKY_CONTENT+", "+g.NAVBAR_TOGGLER).each(function(e,n){var i=t(n).data("margin-right");"undefined"!=typeof i&&t(n).css("margin-right",i).removeData("margin-right")});var e=t("body").data("padding-right");"undefined"!=typeof e&&t("body").css("padding-right",e).removeData("padding-right")},p._getScrollbarWidth=function(){var t=document.createElement("div");t.className=c,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},o._jQueryInterface=function(e,i){return this.each(function(){var s=t(this).data(n),a=r({},o.Default,t(this).data(),"object"==typeof e&&e);if(s||(s=new o(this,a),t(this).data(n,s)),"string"==typeof e){if("undefined"==typeof s[e])throw new TypeError('No method n
11971amed "'+e+'"');s[e](i)}else a.show&&s.show(i)})},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(document).on(h.CLICK_DATA_API,g.DATA_TOGGLE,function(e){var i,s=this,o=P.getSelectorFromElement(this);o&&(i=t(o)[0]);var a=t(i).data(n)?"toggle":r({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var l=t(i).one(h.SHOW,function(e){e.isDefaultPrevented()||l.one(h.HIDDEN,function(){t(s).is(":visible")&&s.focus()})});p._jQueryInterface.call(t(i),a,this)}),t.fn.modal=p._jQueryInterface,t.fn.modal.Constructor=p,t.fn.modal.noConflict=function(){return t.fn.modal=o,p._jQueryInterface},p}(e),U=function(t){var e="tooltip",i="bs.tooltip",o="."+i,a=t.fn[e],l=new RegExp("(^|\\s)bs-tooltip\\S+","g"),h={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"},c={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},u={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},f="show",d="out",_={HIDE:"hide"+o,HIDDEN:"hidden"+o,SHOW:"show"+o,SHOWN:"shown"+o,INSERTED:"inserted"+o,CLICK:"click"+o,FOCUSIN:"focusin"+o,FOCUSOUT:"focusout"+o,MOUSEENTER:"mouseenter"+o,MOUSELEAVE:"mouseleave"+o},g="fade",p="show",m=".tooltip-inner",v=".arrow",E="hover",T="focus",y="click",C="manual",I=function(){function a(t,e){if("undefined"==typeof n)throw new TypeError("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var I=a.prototype;return I.enable=function(){this._isEnabled=!0},I.disable=function(){this._isEnabled=!1},I.toggleEnabled=function(){this._isEnabled=!this._isEnabled},I.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},I.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},I.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),o=P.getUID(this.constructor.NAME);r.setAttribute("id",o),this.element.setAttribute("aria-describedby",o),this.setContent(),this.config.animation&&t(r).addClass(g);var l="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:v}
11971,preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d&&e._leave(null,e)};P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(this.tip).one(P.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},I.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==f&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,this._activeTrigger[E]=!1,P.supportsTransitionEnd()&&t(this.tip).hasClass(g)?t(i).one(P.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},I.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},I.isWithContent=function(){return Boolean(this.getTitle())},I.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},I.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},I.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(m),this.getTitle()),e.removeClass(g+" "+p)},I.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},I.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},I._getAttachment=function(t){return c[t.toUpperCase()]},I._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==C){var i=n===E?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===E?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},I._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},I._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?T:E]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===f?n._hoverState=f:(clearTimeout(n._timeout),n._hoverState=f,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===f&&n.show()},n.config.delay.show):n.show())},I._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?T:E]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d&&n.hide()},n.config.delay.hide):n.hide())},I._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},I._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),P.typeCheckConfig(e,n,this.constructor.DefaultType),n},I._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},I._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},I._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},I._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(g),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new TypeError('No method n
11971amed "'+e+'"');n[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return o}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),x=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},U.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),h=r({},U.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",d=".popover-body",_={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},g=function(r){var o,g;function p(){return r.apply(this,arguments)||this}g=r,(o=p).prototype=Object.create(g.prototype),o.prototype.constructor=o,o.__proto__=g;var m=p.prototype;return m.isWithContent=function(){return this.getTitle()||this._getContent()},m.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},m.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},m.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(d),n),e.removeClass(c+" "+u)},m._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},m._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},p._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new p(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(p,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),p}(U);return t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),K=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,o=t.fn[e],a={offset:10,method:"auto",target:""},l={offset:"number",method:"string",target:"(string|element)"},h={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},c="dropdown-item",u="active",f={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},d="offset",_="position",g=function(){function o(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+f.NAV_LINKS+","+this._config.target+" "+f.LIST_ITEMS+","+this._config.target+" "+f.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(h.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var g=o.prototype;return g.refresh=function(){var e=this,n=this._scrollElement===this._scrollElement.window?d:_,i="auto"===this._config.method?n:this._config.method,s=i===_?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),t.makeArray(t(this._selector)).map(function(e){var n,r=P.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var o=n.getBoundingClientRect();if(o.width||o.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}
11971).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},g.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},g._getConfig=function(n){if("string"!=typeof(n=r({},a,n)).target){var i=t(n.target).attr("id");i||(i=P.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return P.typeCheckConfig(e,n,l),n},g._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},g._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},g._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},g._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t<this._offsets[s+1])&&this._activate(this._targets[s])}}},g._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var i=t(n.join(","));i.hasClass(c)?(i.closest(f.DROPDOWN).find(f.DROPDOWN_TOGGLE).addClass(u),i.addClass(u)):(i.addClass(u),i.parents(f.NAV_LIST_GROUP).prev(f.NAV_LINKS+", "+f.LIST_ITEMS).addClass(u),i.parents(f.NAV_LIST_GROUP).prev(f.NAV_ITEMS).children(f.NAV_LINKS).addClass(u)),t(this._scrollElement).trigger(h.ACTIVATE,{relatedTarget:e})},g._clear=function(){t(this._selector).filter(f.ACTIVE).removeClass(u)},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n);if(i||(i=new o(this,"object"==typeof e&&e),t(this).data(n,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new TypeError('No method named "'+e+'"');i[e]()}})},s(o,null,[{key:"VERSION",get:function(){return"4.0.0"}},{key:"Default",get:function(){return a}}]),o}();return t(window).on(h.LOAD_DATA_API,function(){for(var e=t.makeArray(t(f.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);g._jQueryInterface.call(i,i.data())}}),t.fn[e]=g._jQueryInterface,t.fn[e].Constructor=g,t.fn[e].noConflict=function(){return t.fn[e]=o,g._jQueryInterface},g}(e),V=function(t){var e="bs.tab",n="."+e,i=t.fn.tab,r={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,CLICK_DATA_API:"click.bs.tab.data-api"},o="dropdown-menu",a="active",l="disabled",h="fade",c="show",u=".dropdown",f=".nav, .list-group",d=".active",_="> li > .active",g='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',p=".dropdown-toggle",m="> .dropdown-menu .active",v=function(){function n(t){this._element=t}var i=n.prototype;return i.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(a)||t(this._element).hasClass(l))){var n,i,s=t(this._element).closest(f)[0],o=P.getSelectorFromElement(this._element);if(s){var h="UL"===s.nodeName?_:d;i=(i=t.makeArray(t(s).find(h)))[i.length-1]}var c=t.Event(r.HIDE,{relatedTarget:this._element}),u=t.Event(r.SHOW,{relatedTarget:i});if(i&&t(i).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){o&&(n=t(o)[0]),this._activate(this._element,s);var g=function(){var n=t.Event(r.HIDDEN,{relatedTarget:e._element}),s=t.Event(r.SHOWN,{relatedTarget:i});t(i).trigger(n),t(e._element).trigger(s)};n?this._activate(n,n.parentNode,g):g()}}},i.dispose=function(){t.removeData(this._element,e),this._element=null},i._activate=function(e,n,i){var s=this,r=("UL"===n.nodeName?t(n).find(_):t(n).children(d))[0],o=i&&P.supportsTransitionEnd()&&r&&t(r).hasClass(h),a=function(){return s._transitionComplete(e,r,i)};r&&o?t(r).one(P.TRANSITION_END,a).emulateTransitionEnd(150):a()},i._transitionComplete=function(e,n,i){if(n){t(n).removeClass(c+" "+a);var s=t(n.parentNode).find(m)[0];s&&t(s).removeClass(a),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(t(e).addClass(a),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),P.reflow(e),t(e).addClass(c),e.parentNode&&t(e.parentNode).hasClass(o)){var r=t(e).closest(u)[0];r&&t(r).find(p).addClass(a),e.setAttribute("aria-expanded",!0)}i&&i()},n._jQueryInterface=function(i){return this.each(function(){var s=t(this),r=s.data(e);if(r||(r=new n(this),s.data(e,r)),"string"==typeof i){if("undefined"==typeof r[i])throw new TypeError('No method n
11971amed "'+i+'"');r[i]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.0.0"}}]),n}();return t(document).on(r.CLICK_DATA_API,g,function(e){e.preventDefault(),v._jQueryInterface.call(t(this),"show")}),t.fn.tab=v._jQueryInterface,t.fn.tab.Constructor=v,t.fn.tab.noConflict=function(){return t.fn.tab=i,v._jQueryInterface},v}(e);!function(t){if("undefined"==typeof t)throw new TypeError("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=P,t.Alert=L,t.Button=R,t.Carousel=j,t.Collapse=H,t.Dropdown=W,t.Modal=M,t.Popover=x,t.Scrollspy=K,t.Tab=V,t.Tooltip=U,Object.defineProperty(t,"__esModule",{value:!0})}); 11972//# sourceMappingURL=bootstrap.min.js.map 11973(function($){"use strict";var initPalettes=function(){var $plmodal=$('.t4-palettes-modal');if(!$plmodal.parent().is('.themeConfigModal'))$plmodal.appendTo($('.themeConfigModal'));var $plEdit=$('.pattern.active'),$data=$plEdit.data(),$data_color={};$plmodal.find('.config_pattern').find('.t4-pattern').each(function(){$(this).parents('.controls').find('li').removeClass('active');var data=$(this).data();var attrName=$(this).data('attrname'),$value="";if(attrName!='title'){$data_color[attrName]=$data[attrName];$value=$data[attrName];if(!$value)$value="#FFF";$(this).val($value);$(this).spectrum("set",$value)} 11974if(attrName=='title')$(this).val($data[attrName]);$(this).data('val',$data[attrName])});if(typeof $data_color=='object'){Object.keys($data_color).forEach(function(cls,index){initPalettePreview(cls,$data_color)})} 11975$('.error-name-exist').hide();$('.error-title-null').hide();$plmodal.show()} 11976var generatedPalettes=function(trigger){var colorPattern={},$pattern;if(trigger){$pattern='.pattern'}else{$pattern='.pattern.active'} 11977$('.group_palette').find($pattern).not('.pattern-clone').each(function(index){var dataColorPt=$(this).data();colorPattern[dataColorPt.class]=dataColorPt});return colorPattern} 11978var validationData=function(){var allPalette=generatedPalettes(!0);var $return=!0;if(!$('.t4-pattern.title').val()){$('.error-title-null').show();$return=!1}else{$('.error-title-null').hide();var title=$('.t4-pattern.title').val();var $cls=title.replace(/\s+/g,"_").toLowerCase();Object.keys(allPalette).forEach(function(cls,idx){if(cls==$cls||allPalette[cls].title==title){$('.error-name-exist').show();$return=!1}})} 11979return $return} 11980var updateToJson=function(trigger){var AllData=generatedPalettes(!0);$('#typelist_theme_styles_palettes').val(JSON.stringify(AllData));$('#typelist_theme_styles_palettes').trigger('change');if(trigger){doSave()}} 11981var doSave=function(trigger){var dataSave=generatedPalettes(trigger);var url=location.pathname+'?option=com_ajax&plugin=t4&format=json&t4do=Palettes&id='+tempId;$.post(url,{task:'save',all:trigger,value:dataSave}).then(function(response){if(response.ok){T4Admin.Messages(T4Admin.langs.palettesUpdated,'message')}else{T4Admin.Messages(response.error,'error')}})} 11982var initPalettePreview=function(name,data){if(name=='background_color'){$('.pattern-preview').css({background:data.background_color})}else{$('.pattern-preview .'+name).data(name,data[name]);$('.pattern-preview .'+name).css({color:data[name]});if(name.match(/_hover/)){$('.pattern-preview .'+name.replace(/_hover/,"")).data(name,data[name]);$('.pattern-preview .'+name.replace(/_hover/,"")).hover(function(){var colorArr=$(this).data();$(this).css("color",colorArr[name])},function(){var colorArr=$(this).data();$(this).css("color",colorArr[name.replace(/_hover/,"")])})}}} 11983var doRemove=function(el){var $message='colorPalettes'+$(el).data('tooltip'),action=$(el).data('action'),plEl=$(el).closest('.pattern'),plName=plEl.data('class'),plDel=$(el).parents('li');var url=location.pathname+'?option=com_ajax&plugin=t4&format=json&t4do=Palettes&id='+tempId;$.post(url,{task:'remove',name:plName}).then(function(response){if(response.ok){var resData=response.data;var resDataColor=response.datacolor;if(action=='remove'){plEl.remove()}else{console.log(plEl) 11984var plObj=plEl.find('li');plObj.each(function(){var elClass=$(this).find('span').attr('class');
11984if(elClass){plEl.data(elClass,resDataColor[elClass]);if(!resDataColor[elClass])resDataColor[elClass]='';$(this).find('span').css({'background':resDataColor[elClass]})}});plDel.addClass('hidden')} 11985updateToJson();T4Admin.Messages(T4Admin.langs[$message],'message')}else{T4Admin.Messages(response.error,'error')}})} 11986$(document).ready(function(){var createPalette=function(data){let clone=data.clone();let dataColor=data.data();clone.removeClass('pattern-clone');clone.removeClass('hidden');$('.t4-palettes-modal').find('.config_pattern').find('input.t4-pattern').each(function(){var name=$(this).data('attrname'),val=$(this).val();if(name=='title'){if(clone.data('class')==''){var $classes=val.replace(/\s+/g,"_").toLowerCase();clone.data('class',$classes)} 11987clone.find('.pattern-title').text(val)}else{clone.find('span.'+name).css({background:val})} 11988clone.data(name,val)});clone.appendTo($('.pattern-list'));var action_del=clone.find('.pt-color-del');if(action_del.is(":hidden")){action_del.parents('li').removeClass('hidden')}} 11989$(document).on('click','.pt-color-edit',function(e){e.preventDefault();var paletteEdit=$(this).closest('.pattern');$('.pattern.active').removeClass('active');paletteEdit.addClass('active');$('.t4-palettes-modal').data('action','edit');initPalettes()});$(document).on('change','.t4-pattern',function(e){var $data=$(this).data(),attrName=$data.attrname,$val=$data.val,$color=$(this).val();var data_color={} 11990data_color[attrName]=$color;initPalettePreview(attrName,data_color)});$(document).on('click','.pt-color-create',function(e){e.preventDefault();var palettes=$('.pattern-list.t4-theme-palettes');var $parentColor=$(this).parents('.add-more-palettes').find('.pattern').clone(!0);var action_del=$parentColor.find('.pt-color-del');if(action_del.is(":hidden")){action_del.parents('li').removeClass('hidden')} 11991action_del.parents('li').html('<a class="pt-color-del" href="#" data-tooltip="Delete" data-action="remove"><i class="fal fa-trash-alt fa-fw"></i></a>');$('.pattern.active').removeClass('active');$parentColor.addClass('hidden active clone');$parentColor.data('class','');$parentColor.appendTo(palettes);$('.t4-palettes-modal').data('action','create');initPalettes()});$(document).on('click','.pt-color-clone',function(e){e.preventDefault();var $parentColor=$(this).closest('.pattern'),$patternClone=$parentColor.clone(!0),$data=$patternClone.data();var $val=$(this).val(),$name_palette=[];$('.pattern-list').find('.pattern').each(function(){$name_palette.push($(this).data('title'))});$patternClone.removeClass($data.class);var random='',newTitle='',title=$data.title;for(var i=0;i<100;i++){random=' copy '+i;if(i==0)random=' copy';newTitle=title+random;if($name_palette.indexOf(newTitle)==-1){break}} 11992$patternClone.addClass($data.class+random.replace(/\s/g,'_'));$patternClone.addClass('clone');$patternClone.data('class','');$patternClone.data('status','loc');$patternClone.find('.pattern-title').text(newTitle);$patternClone.data('title',newTitle);var action_del=$patternClone.find('.pt-color-del');if(action_del.is(":hidden")){action_del.parents('li').removeClass('hidden')} 11993action_del.parents('li').html('<a class="pt-color-del" href="#" data-tooltip="Delete" data-action="remove"><i class="fal fa-trash-alt fa-fw"></i></a>');$patternClone.insertAfter($parentColor);$patternClone.find('.pt-color-edit').trigger('click');$('.t4-palettes-modal').data('action','clone')});$('body').on('click','.t4-patterns-apply',function(e){e.preventDefault();var $plmodal=$('.t4-palettes-modal');if(!validationData()&&$plmodal.data('action')=='create'){return!1} 11994var savetofile=!1;var patternActive=$('.pattern.active');if(patternActive.hasClass('clone')){patternActive.removeClass('clone');savetofile=!0} 11995console.log($plmodal.data('action')) 11996if(patternActive.hasClass('hidden')){patternActive.removeClass('hidden');patternActive.removeClass('pattern-clone')} 11997var status=patternActive.data('status');if(['ovr','org'].indexOf(status)>-1){patternActive.data('status','ovr')} 11998$plmodal.find('.config_pattern').find('input.t4-pattern').each(function(){var name=$(this).data('attrname'),val=$(this).val();if(name=='title'){if(patternActive.data('class')==''){var $classes=val.replace(/\s+/g,"_").toLowerCase();patternActive.data('class',$classes)} 11999patternActive.find('.pattern-title').text(val)}else{patternActive.find('span.'+name).css({background:val})} 12000patternActive.data(name,val)});$(this).closest('.t4-palettes-modal').hide();updateToJson(savetofile)});$('body').on('click','.t4-patterns-cancel, .action-t4-modal-close',function(e){$(this).closest('.t4-palettes-modal').hide();var $pattern=$('.pattern.active'),dataClass=$pattern.data('class');$('.t4-palettes-modal').data('action','');if($pattern.hasClass('clone')){$pattern.remove();$(document).find('.pattern[data-class="'+dataClass+'"]').addClass('active')}});$('body').on('click','.pt-color-del',function(e){e.stopPropagation();e.preventDefault();var that=this;var $langs='colorPalettesConfirm'+$(this).data('tooltip');T4Admin.Confirm(T4Admin.langs[$langs],function(ans){if(ans){doRemove(that)}else{return!1}},'')});$(document).on('click','.pattern-actions-list',function(e){e.stopPropagation()})})})(jQuery);jQuery(document).ready(function(){jQuery(document).on("scroll",onScroll);onepageNavLinks=jQuery('.onepage .t4-navbar .nav-link');function onScroll(event){var scrollPos=jQuery(document).scrollTop();onepageNavLinks.each(function(){var currLink=jQuery(this);var refElement=jQuery(currLink.attr("href"));if(refElement.position().top<=scrollPos){onepageNavLinks.removeClass("active");currLink.addClass("active")}else{currLink.removeClass("active")}})}}) 12001document.addEventListener('DOMContentLoaded',function(){document.getElementById('CheckPDNlc').addEventListener('change',function(){var alertDiv=document.getElementById('LcAllert');if(this.checked){alertDiv.classList.remove('alert-danger');alertDiv.classList.add('alert-primary')}else{alertDiv.classList.remove('alert-primary');alertDiv.classList.add('alert-danger')}});document.getElementById('CheckPDNlc').checked=!1}
12001);jQuery(document).ready(function($){$(window).ready(function(){if("IntersectionObserver" in window&&"IntersectionObserverEntry" in window&&"intersectionRatio" in window.IntersectionObserverEntry.prototype){var options={root:null,rootMargin:'0px',threshold:0};var sections=document.querySelectorAll(".t4-section");var maxIdx=0;var sticky=document.querySelectorAll(".t4-sticky");function isValid(el){return el.offsetTop<window.innerHeight&&el.offsetTop+el.offsetHeight<window.innerHeight+200} 12002function doChange(changes,observer){changes.forEach(function(change){var clientRect=change.boundingClientRect,target=change.target;if(clientRect.top<=-clientRect.height){document.body.setAttribute('data-top-'+target.id,'over');document.body.classList.add('top-away')}else{document.body.setAttribute('data-top-'+target.id,'under');document.body.classList.remove('top-away')}})} 12003var observer=new IntersectionObserver(doChange,options);for(var i=0;i<sections.length;i++){var el=sections[i];if(isValid(el)){el.idx=i;observer.observe(el)}else{maxIdx=i-1;break}} 12004var top=0;var zindex=300;for(var i=0;i<sticky.length;i++){var elSk=sticky[i];top+=elSk.offsetHeight;if(typeof sticky[i+1]!='undefined'){$(elSk).css({'z-index':zindex});zindex-=1;$(sticky[i+1]).css({top:top,'z-index':zindex})}} 12005var options2={root:null,rootMargin:'0px',threshold:0};function doChange2(changes){var clientRect=changes[0].boundingClientRect;if(clientRect.top<=-100){document.body.classList.add('not-at-top')}else{document.body.classList.remove('not-at-top')}} 12006var observer2=new IntersectionObserver(doChange2,options2);var anchorEl=$('<a name="top-anchor">').prependTo('.t4-content-inner');if(anchorEl.get(0))observer2.observe(anchorEl.get(0))}});$(document).on('click','a[href^="#"]',function(event){event.preventDefault();if($(this).data('slide'))return;if(['tab'].indexOf($(this).data('toggle'))>-1)return;if(!$($.attr(this,'href')).length)return;$('.js-offcanvas-close').trigger('click');$('html, body').animate({scrollTop:$($.attr(this,'href')).offset().top},500)});$('a.dropdown-toggle').on('click',function(e){if($(this).parent('.nav-titem.dropdown.animating').length)$(this).parent('.nav-titem.dropdown.animating').removeClass('animating');if($(this).next().is(':visible')){location.href=this.href;return} 12007if(!$(this).next().hasClass('show')){$(this).parents('.dropdown-menu').first().find('.show').removeClass('show')} 12008var $subMenu=$(this).next('.dropdown-menu');$subMenu.toggleClass('show');return});$('li.nav-item.dropdown').on('hidden.bs.dropdown',function(e){$(this).find('.show').removeClass('show')});$('body').on('click','#back-to-top',function(){$('body,html,.t4-content').animate({scrollTop:0},500);return!1});$(document).find('.t4-content').scroll(function(event){var scroll=$('.t4-content').scrollTop();localStorage.setItem("page_scroll",scroll)})});(function($){$(document).ready(function(){var bootstrapLoaded=(typeof $().carousel=='function');var mootoolsLoaded=(typeof MooTools!='undefined');if(bootstrapLoaded&&mootoolsLoaded){Element.implement({hide:function(){return this},show:function(v){return this},slide:function(v){return this}})}});function refreshCurrentPage(){var page=window.location.href;var cur=localStorage.getItem('page');if(cur==page){return!0} 12009return!1} 12010window.onload=function(){var check=refreshCurrentPage();localStorage.setItem("page",window.location.href);if(document.getElementsByClassName("t4-content").length){if(check){var match=localStorage.getItem("page_scroll");document.getElementsByClassName("t4-content")[0].scrollTop=match}else{document.getElementsByClassName("t4-content")[0].scrollTop=0}}}})(jQuery)
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.