1(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ 2(function (global){ 3; var __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) { 4/*! Fixedfixed: a CSS position:fixed qualifier. (c)2012 @scottjehl, Filament Group, Inc. Dual license: MIT and/or GPLv2 */ 5(function( w, undefined ){ 6 7 var htmlclass = "fixed-supported", 8 el = w.document.createElement( "div" ), 9 ua = w.navigator.userAgent, 10 docEl = w.document.documentElement; 11 12 // fix the test element 13 el.style.position = "fixed"; 14 el.style.top = 0; 15 16 // support test 17 function checkFixed(){ 18 19 var scroll = "scrollTop" in w.document.body ? w.document.body.scrollTop : docEl.scrollTop; 20 21 // only run test if there's a scroll we can compare 22 if( scroll !== undefined && scroll > 0 && w.document.body ){ 23 24 w.document.body.insertBefore( el, w.document.body.firstChild ); 25 26 if( !el.getBoundingClientRect || el.getBoundingClientRect().top !== 0 ){ 27 // Fixed is not working or can't be tested 28 docEl.className = docEl.className.replace( htmlclass, "" ); 29 } 30 31 // remove the test element 32 w.document.body.removeChild( el ); 33 34 // unbind the handlers 35 if( w.removeEventListener ){ 36 w.removeEventListener( "scroll", checkFixed, false ); 37 } 38 else{ 39 w.detachEvent( "onscroll", checkFixed ); 40 } 41 } 42 } 43 44 // if a particular UA is known to return false results with this feature test, try and avoid that UA here. 45 if( 46 // Android 2.1, 2.2, 2.5, and 2.6 Webkit 47 !( ua.match( /Android 2\.[1256]/ ) && ua.indexOf( "AppleWebKit") > -1 ) || 48 // Opera Mobile less than version 11.0 (7458) 49 !( ua.match( /Opera Mobi\/([0-9]+)/ ) && RegExp.$1 < 7458 ) || 50 // Opera Mini 51 !( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) || 52 // Firefox Mobile less than version 6 53 !( ua.match( /Fennec\/([0-9]+)/ ) && RegExp.$1 < 6 ) 54 // If necessary, add the other untestable browsers here... 55 ){ 56 //add the HTML class for now. 57 docEl.className += " " + htmlclass; 58 59 // bind to scroll event so we can test and potentially degrade 60 if( w.addEventListener ){ 61 w.addEventListener( "scroll", checkFixed, false ); 62 } 63 else{ 64 w.attachEvent( "onscroll", checkFixed ); 65 } 66 } 67 68 w.FixedFixed = checkFixed; 69}( this )); 70; browserify_shim__define__module__export__(typeof FixedFixed != "undefined" ? FixedFixed : window.FixedFixed); 71 72}).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; }); 73 74}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 75},{}],2:[function(require,module,exports){ 76(function (global){ 77; var __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) { 78;(function( win, $ ) { 79 80 function featureTest( property, value, noPrefixes ) { 81 // Thanks Modernizr! https://github.com/phistuck/Modernizr/commit/3fb7217f5f8274e2f11fe6cfeda7cfaf9948a1f5 82 var prop = property + ':', 83 el = document.createElement( 'test' ), 84 mStyle = el.style; 85 86 if( !noPrefixes ) { 87 mStyle.cssText = prop + [ '-webkit-', '-moz-', '-ms-', '-o-', '' ].join( value + ';' + prop ) + value + ';'; 88 } else { 89 mStyle.cssText = prop + value; 90 } 91 return mStyle[ property ].indexOf( value ) !== -1; 92 } 93 94 function getPx( unit ) { 95 return parseInt( unit, 10 ) || 0; 96 } 97 98 var uniqueIdCounter = 0; 99 100 var S = { 101 classes: { 102 plugin: 'fixedsticky', 103 active: 'fixedsticky-on', 104 inactive: 'fixedsticky-off', 105 clone: 'fixedsticky-dummy', 106 withoutFixedFixed: 'fixedsticky-withoutfixedfixed' 107 }, 108 keys: { 109 offset: 'fixedStickyOffset', 110 position: 'fixedStickyPosition', 111 id: 'fixedStickyId' 112 }, 113 tests: { 114 sticky: featureTest( 'position', 'sticky' ), 115 fixed: featureTest( 'position', 'fixed', true ) 116 }, 117 // Thanks jQuery! 118 getScrollTop: function() { 119 var prop = 'pageYOffset', 120 method = 'scrollTop'; 121 return win ? (prop in win) ? win[ prop ] : 122 win.document.documentElement[ method ] : 123 win.document.body[ method ]; 124 }, 125 bypass: function() { 126 // Check native sticky, check fixed and if fixed-fixed is also included on the page and is supported 127 return ( S.tests.sticky && !S.optOut ) || 128 !S.tests.fixed || 129 win.FixedFixed && !$( win.document.documentElement ).hasClass( 'fixed-supported' ); 130 }, 131 update: function( el ) { 132 if( !el.offsetWidth ) { return; } 133 134 var $el = $( el ), 135 height = $el.outerHeight(),
136 initialOffset = $el.data( S.keys.offset ), 137 scroll = S.getScrollTop(), 138 isAlreadyOn = $el.is( '.' + S.classes.active ), 139 toggle = function( turnOn ) { 140 $el[ turnOn ? 'addClass' : 'removeClass' ]( S.classes.active ) 141 [ !turnOn ? 'addClass' : 'removeClass' ]( S.classes.inactive ); 142 }, 143 viewportHeight = $( window ).height(), 144 position = $el.data( S.keys.position ), 145 skipSettingToFixed, 146 elTop, 147 elBottom, 148 $parent = $el.parent(), 149 parentOffset = $parent.offset().top, 150 parentHeight = $parent.outerHeight(); 151 152 if( initialOffset === undefined ) { 153 initialOffset = $el.offset().top; 154 $el.data( S.keys.offset, initialOffset ); 155 $el.after( $( '<div>' ).addClass( S.classes.clone ).height( height ) ); 156 } 157 158 if( !position ) { 159 // Some browsers require fixed/absolute to report accurate top/left values. 160 skipSettingToFixed = $el.css( 'top' ) !== 'auto' || $el.css( 'bottom' ) !== 'auto'; 161 162 if( !skipSettingToFixed ) { 163 $el.css( 'position', 'fixed' ); 164 } 165 166 position = { 167 top: $el.css( 'top' ) !== 'auto', 168 bottom: $el.css( 'bottom' ) !== 'auto' 169 }; 170 171 if( !skipSettingToFixed ) { 172 $el.css( 'position', '' ); 173 } 174 175 $el.data( S.keys.position, position ); 176 } 177 178 function isFixedToTop() { 179 var offsetTop = scroll + elTop; 180 181 // Initial Offset Top 182 return initialOffset < offsetTop && 183 // Container Bottom 184 offsetTop + height <= parentOffset + parentHeight; 185 } 186 187 function isFixedToBottom() { 188 // Initial Offset Top + Height 189 return initialOffset + ( height || 0 ) > scroll + viewportHeight - elBottom && 190 // Container Top 191 scroll + viewportHeight - elBottom >= parentOffset + ( height || 0 ); 192 } 193 194 elTop = getPx( $el.css( 'top' ) ); 195 elBottom = getPx( $el.css( 'bottom' ) ); 196 197 if( position.top && isFixedToTop() || position.bottom && isFixedToBottom() ) { 198 if( !isAlreadyOn ) { 199 toggle( true ); 200 } 201 } else { 202 if( isAlreadyOn ) { 203 toggle( false ); 204 } 205 } 206 }, 207 destroy: function( el ) { 208 var $el = $( el ); 209 if (S.bypass()) { 210 return $el; 211 } 212 213 return $el.each(function() { 214 var $this = $( this ); 215 var id = $this.data( S.keys.id ); 216 $( win ).unbind( '.fixedsticky' + id ); 217 218 $this 219 .removeData( [ S.keys.offset, S.keys.position, S.keys.id ] ) 220 .removeClass( S.classes.active ) 221 .removeClass( S.classes.inactive ) 222 .next( '.' + S.classes.clone ).remove(); 223 }); 224 }, 225 init: function( el ) { 226 var $el = $( el ); 227 228 if( S.bypass() ) { 229 return $el; 230 } 231 232 return $el.each(function() { 233 var _this = this; 234 var id = uniqueIdCounter++; 235 $( this ).data( S.keys.id, id ); 236 237 $( win ).bind( 'scroll.fixedsticky' + id, function() { 238 S.update( _this ); 239 }).trigger( 'scroll.fixedsticky' + id ); 240 241 $( win ).bind( 'resize.fixedsticky' + id , function() { 242 if( $el.is( '.' + S.classes.active ) ) { 243 S.update( _this ); 244 } 245 }); 246 }); 247 } 248 }; 249 250 win.FixedSticky = S; 251 252 // Plugin 253 $.fn.fixedsticky = function( method ) { 254 if ( typeof S[ method ] === 'function') { 255 return S[ method ].call( S, this); 256 } else if ( typeof method === 'object' || ! method ) { 257 return S.init.call( S, this ); 258 } else { 259 throw new Error( 'Method `' + method + '` does not exist on jQuery.fixedsticky' ); 260 } 261 }; 262 263 // Add fallback when fixed-fixed is not available. 264 if( !win.FixedFixed ) { 265 $( win.document.documentElement ).addClass( S.classes.withoutFixedFixed ); 266 } 267 268})( window, jQuery ); 269 270; browserify_shim__define__module__export__(typeof FixedSticky != "undefined" ? FixedSticky : window.FixedSticky); 271 272}).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; }); 273 274}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 275},{}],3:[function(require,module,exports){ 276(function (global){ 277; var __browserify_shim_require__=require;(function browserifyShim(module, exports, require, define, browserify_shim__define__module__export__) { 278/*! 279 * jQuery JavaScript Library v3.2.1 280 * https://jquery.com/ 281 * 282 * Includes Sizzle.js 283 * https://sizzlejs.com/ 284 * 285 * Copyright JS Foundation and other contributors 286 * Released under the MIT license 287 * https://jquery.org/license 288 * 289 * Date: 2017-03-20T18:59Z 290 */ 291( function( global, factory ) { 292 293 "use strict"; 294 295 if ( typeof module === "object" && typeof module.exports === "object" ) { 296 297 // For CommonJS and CommonJS-like environments where a proper `window` 298 // is present, execute the factory and get jQuery. 299 // For environments that do not have a `window` with a `document` 300 // (such as Node.js), expose a factory as module.exports. 301 // This accentuates the need for the creation of a real `window`. 302 // e.g. var jQuery = require("jquery")(window); 303 // See ticket #14549 for more info. 304 module.exports = global.document ? 305 factory( global, true ) : 306 function( w ) { 307 if ( !w.document ) { 308 throw new Error( "jQuery requires a window with a document" ); 309 } 310 return factory( w ); 311 }; 312 } else { 313 factory( global ); 314 } 315 316// Pass this if window is not defined yet 317} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 318 319// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 320// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 321// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), str
vendor: 11,277 bytes, lines 321-808
321ict mode should be common 322// enough that all such attempts are guarded in a try block. 323"use strict"; 324 325var arr = []; 326 327var document = window.document; 328 329var getProto = Object.getPrototypeOf; 330 331var slice = arr.slice; 332 333var concat = arr.concat; 334 335var push = arr.push; 336 337var indexOf = arr.indexOf; 338 339var class2type = {}; 340 341var toString = class2type.toString; 342 343var hasOwn = class2type.hasOwnProperty; 344 345var fnToString = hasOwn.toString; 346 347var ObjectFunctionString = fnToString.call( Object ); 348 349var support = {}; 350 351 352 353 function DOMEval( code, doc ) { 354 doc = doc || document; 355 356 var script = doc.createElement( "script" ); 357 358 script.text = code; 359 doc.head.appendChild( script ).parentNode.removeChild( script ); 360 } 361/* global Symbol */ 362// Defining this global in .eslintrc.json would create a danger of using the global 363// unguarded in another place, it seems safer to define global only for this module 364 365 366 367var 368 version = "3.2.1", 369 370 // Define a local copy of jQuery 371 jQuery = function( selector, context ) { 372 373 // The jQuery object is actually just the init constructor 'enhanced' 374 // Need init if jQuery is called (just allow error to be thrown if not included) 375 return new jQuery.fn.init( selector, context ); 376 }, 377 378 // Support: Android <=4.0 only 379 // Make sure we trim BOM and NBSP 380 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, 381 382 // Matches dashed string for camelizing 383 rmsPrefix = /^-ms-/, 384 rdashAlpha = /-([a-z])/g, 385 386 // Used by jQuery.camelCase as callback to replace() 387 fcamelCase = function( all, letter ) { 388 return letter.toUpperCase(); 389 }; 390 391jQuery.fn = jQuery.prototype = { 392 393 // The current version of jQuery being used 394 jquery: version, 395 396 constructor: jQuery, 397 398 // The default length of a jQuery object is 0 399 length: 0, 400 401 toArray: function() { 402 return slice.call( this ); 403 }, 404 405 // Get the Nth element in the matched element set OR 406 // Get the whole matched element set as a clean array 407 get: function( num ) { 408 409 // Return all the elements in a clean array 410 if ( num == null ) { 411 return slice.call( this ); 412 } 413 414 // Return just the one element from the set 415 return num < 0 ? this[ num + this.length ] : this[ num ]; 416 }, 417 418 // Take an array of elements and push it onto the stack 419 // (returning the new matched element set) 420 pushStack: function( elems ) { 421 422 // Build a new jQuery matched element set 423 var ret = jQuery.merge( this.constructor(), elems ); 424 425 // Add the old object onto the stack (as a reference) 426 ret.prevObject = this; 427 428 // Return the newly-formed element set 429 return ret; 430 }, 431 432 // Execute a callback for every element in the matched set. 433 each: function( callback ) { 434 return jQuery.each( this, callback ); 435 }, 436 437 map: function( callback ) { 438 return this.pushStack( jQuery.map( this, function( elem, i ) { 439 return callback.call( elem, i, elem ); 440 } ) ); 441 }, 442 443 slice: function() { 444 return this.pushStack( slice.apply( this, arguments ) ); 445 }, 446 447 first: function() { 448 return this.eq( 0 ); 449 }, 450 451 last: function() { 452 return this.eq( -1 ); 453 }, 454 455 eq: function( i ) { 456 var len = this.length, 457 j = +i + ( i < 0 ? len : 0 ); 458 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 459 }, 460 461 end: function() { 462 return this.prevObject || this.constructor(); 463 }, 464 465 // For internal use only. 466 // Behaves like an Array's method, not like a jQuery method. 467 push: push, 468 sort: arr.sort, 469 splice: arr.splice 470}; 471 472jQuery.extend = jQuery.fn.extend = function() { 473 var options, name, src, copy, copyIsArray, clone, 474 target = arguments[ 0 ] || {}, 475 i = 1, 476 length = arguments.length, 477 deep = false; 478 479 // Handle a deep copy situation 480 if ( typeof target === "boolean" ) { 481 deep = target; 482 483 // Skip the boolean and the target 484 target = arguments[ i ] || {}; 485 i++; 486 } 487 488 // Handle case when target is a string or something (possible in deep copy) 489 if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { 490 target = {}; 491 } 492 493 // Extend jQuery itself if only one argument is passed 494 if ( i === length ) { 495 target = this; 496 i--; 497 } 498 499 for ( ; i < length; i++ ) { 500 501 // Only deal with non-null/undefined values 502 if ( ( options = arguments[ i ] ) != null ) { 503 504 // Extend the base object 505 for ( name in options ) { 506 src = target[ name ]; 507 copy = options[ name ]; 508 509 // Prevent never-ending loop 510 if ( target === copy ) { 511 continue; 512 } 513 514 // Recurse if we're merging plain objects or arrays 515 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 516 ( copyIsArray = Array.isArray( copy ) ) ) ) { 517 518 if ( copyIsArray ) { 519 copyIsArray = false; 520 clone = src && Array.isArray( src ) ? src : []; 521 522 } else { 523 clone = src && jQuery.isPlainObject( src ) ? src : {}; 524 } 525 526 // Never move original objects, clone them 527 target[ name ] = jQuery.extend( deep, clone, copy ); 528 529 // Don't bring in undefined values 530 } else if ( copy !== undefined ) { 531 target[ name ] = copy; 532 } 533 } 534 } 535 } 536 537 // Return the modified object 538 return target; 539}; 540 541jQuery.extend( { 542 543 // Unique for each copy of jQuery on the page 544 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 545 546 // Assume jQuery is ready without the ready module 547 isReady: true, 548 549 error: function( msg ) { 550 throw new Error( msg ); 551 }, 552 553 noop: function() {}, 554 555 isFunction: function( obj ) { 556 return jQuery.type( obj ) === "function"; 557 }, 558 559 isWindow: function( obj ) { 560 return obj != null && obj === obj.window; 561 }, 562 563 isNumeric: function( obj ) { 564 565 // As of jQuery 3.0, isNumeric is limited to 566 // strings and numbers (primitives or objects) 567 // that can be coerced to finite numbers (gh-2662) 568 var type = jQuery.type( obj ); 569 return ( type === "number" || type === "string" ) && 570 571 // parseFloat NaNs numeric-cast false positives ("") 572 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 573 // subtraction forces infinities to NaN 574 !isNaN( obj - parseFloat( obj ) ); 575 }, 576 577 isPlainObject: function( obj ) { 578 var proto, Ctor; 579 580 // Detect obvious negatives 581 // Use toString instead of jQuery.type to catch host objects 582 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 583 return false; 584 } 585 586 proto = getProto( obj ); 587 588 // Objects with no prototype (e.g., `Object.create( null )`) are plain 589 if ( !proto ) { 590 return true; 591 } 592 593 // Objects with prototype are plain iff they were constructed by a global Object function 594 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 595 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 596 }, 597 598 isEmptyObject: function( obj ) { 599 600 /* eslint-disable no-unused-vars */ 601 // See https://github.com/eslint/eslint/issues/6125 602 var name; 603 604 for ( name in obj ) { 605 return false; 606 } 607 return true; 608 }, 609 610 type: function( obj ) { 611 if ( obj == null ) { 612 return obj + ""; 613 } 614 615 // Support: Android <=2.3 only (functionish RegExp) 616 return typeof obj === "object" || typeof obj === "function" ? 617 class2type[ toString.call( obj ) ] || "object" : 618 typeof obj; 619 }, 620 621 // Evaluates a script in a global context 622 globalEval: function( code ) { 623 DOMEval( code ); 624 }, 625 626 // Convert dashed to camelCase; used by the css and data modules 627 // Support: IE <=9 - 11, Edge 12 - 13 628 // Microsoft forgot to hump their vendor prefix (#9572) 629 camelCase: function( string ) { 630 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 631 }, 632 633 each: function( obj, callback ) { 634 var length, i = 0; 635 636 if ( isArrayLike( obj ) ) { 637 length = obj.length; 638 for ( ; i < length; i++ ) { 639 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 640 break; 641 } 642 } 643 } else { 644 for ( i in obj ) { 645 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 646 break; 647 } 648 } 649 } 650 651 return obj; 652 }, 653 654 // Support: Android <=4.0 only 655 trim: function( text ) { 656 return text == null ? 657 "" : 658 ( text + "" ).replace( rtrim, "" ); 659 }, 660 661 // results is for internal usage only 662 makeArray: function( arr, results ) { 663 var ret = results || []; 664 665 if ( arr != null ) { 666 if ( isArrayLike( Object( arr ) ) ) { 667 jQuery.merge( ret, 668 typeof arr === "string" ? 669 [ arr ] : arr 670 ); 671 } else { 672 push.call( ret, arr ); 673 } 674 } 675 676 return ret; 677 }, 678 679 inArray: function( elem, arr, i ) { 680 return arr == null ? -1 : indexOf.call( arr, elem, i ); 681 }, 682 683 // Support: Android <=4.0 only, PhantomJS 1 only 684 // push.apply(_, arraylike) throws on ancient WebKit 685 merge: function( first, second ) { 686 var len = +second.length, 687 j = 0, 688 i = first.length; 689 690 for ( ; j < len; j++ ) { 691 first[ i++ ] = second[ j ]; 692 } 693 694 first.length = i; 695 696 return first; 697 }, 698 699 grep: function( elems, callback, invert ) { 700 var callbackInverse, 701 matches = [], 702 i = 0, 703 length = elems.length, 704 callbackExpect = !invert; 705 706 // Go through the array, only saving the items 707 // that pass the validator function 708 for ( ; i < length; i++ ) { 709 callbackInverse = !callback( elems[ i ], i ); 710 if ( callbackInverse !== callbackExpect ) { 711 matches.push( elems[ i ] ); 712 } 713 } 714 715 return matches; 716 }, 717 718 // arg is for internal usage only 719 map: function( elems, callback, arg ) { 720 var length, value, 721 i = 0, 722 ret = []; 723 724 // Go through the array, translating each of the items to their new values 725 if ( isArrayLike( elems ) ) { 726 length = elems.length; 727 for ( ; i < length; i++ ) { 728 value = callback( elems[ i ], i, arg ); 729 730 if ( value != null ) { 731 ret.push( value ); 732 } 733 } 734 735 // Go through every key on the object, 736 } else { 737 for ( i in elems ) { 738 value = callback( elems[ i ], i, arg ); 739 740 if ( value != null ) { 741 ret.push( value ); 742 } 743 } 744 } 745 746 // Flatten any nested arrays 747 return concat.apply( [], ret ); 748 }, 749 750 // A global GUID counter for objects 751 guid: 1, 752 753 // Bind a function to a context, optionally partially applying any 754 // arguments. 755 proxy: function( fn, context ) { 756 var tmp, args, proxy; 757 758 if ( typeof context === "string" ) { 759 tmp = fn[ context ]; 760 context = fn; 761 fn = tmp; 762 } 763 764 // Quick check to determine if target is callable, in the spec 765 // this throws a TypeError, but we will just return undefined. 766 if ( !jQuery.isFunction( fn ) ) { 767 return undefined; 768 } 769 770 // Simulated bind 771 args = slice.call( arguments, 2 ); 772 proxy = function() { 773 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 774 }; 775 776 // Set the guid of unique handler to the same of original handler, so it can be removed 777 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 778 779 return proxy; 780 }, 781 782 now: Date.now, 783 784 // jQuery.support is not used in Core but other projects attach their 785 // properties to it so it needs to exist. 786 support: support 787} ); 788 789if ( typeof Symbol === "function" ) { 790 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 791} 792 793// Populate the class2type map 794jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 795function( i, name ) { 796 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 797} ); 798 799function isArrayLike( obj ) { 800 801 // Support: real iOS 8.2 only (not reproducible in simulator) 802 // `in` check used to prevent JIT error (gh-2145) 803 // hasOwn isn't used here due to false negatives 804 // regarding Nodelist length in IE 805 var length = !!obj && "length" in obj && obj.length, 806 type = jQuery.type( obj ); 807 808 if ( type === "function" || jQuery.
vendor: 31,442 bytes, lines 808-1905
808isWindow( obj ) ) { 809 return false; 810 } 811 812 return type === "array" || length === 0 || 813 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 814} 815var Sizzle = 816/*! 817 * Sizzle CSS Selector Engine v2.3.3 818 * https://sizzlejs.com/ 819 * 820 * Copyright jQuery Foundation and other contributors 821 * Released under the MIT license 822 * http://jquery.org/license 823 * 824 * Date: 2016-08-08 825 */ 826(function( window ) { 827 828var i, 829 support, 830 Expr, 831 getText, 832 isXML, 833 tokenize, 834 compile, 835 select, 836 outermostContext, 837 sortInput, 838 hasDuplicate, 839 840 // Local document vars 841 setDocument, 842 document, 843 docElem, 844 documentIsHTML, 845 rbuggyQSA, 846 rbuggyMatches, 847 matches, 848 contains, 849 850 // Instance-specific data 851 expando = "sizzle" + 1 * new Date(), 852 preferredDoc = window.document, 853 dirruns = 0, 854 done = 0, 855 classCache = createCache(), 856 tokenCache = createCache(), 857 compilerCache = createCache(), 858 sortOrder = function( a, b ) { 859 if ( a === b ) { 860 hasDuplicate = true; 861 } 862 return 0; 863 }, 864 865 // Instance methods 866 hasOwn = ({}).hasOwnProperty, 867 arr = [], 868 pop = arr.pop, 869 push_native = arr.push, 870 push = arr.push, 871 slice = arr.slice, 872 // Use a stripped-down indexOf as it's faster than native 873 // https://jsperf.com/thor-indexof-vs-for/5 874 indexOf = function( list, elem ) { 875 var i = 0, 876 len = list.length; 877 for ( ; i < len; i++ ) { 878 if ( list[i] === elem ) { 879 return i; 880 } 881 } 882 return -1; 883 }, 884 885 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", 886 887 // Regular expressions 888 889 // http://www.w3.org/TR/css3-selectors/#whitespace 890 whitespace = "[\\x20\\t\\r\\n\\f]", 891 892 // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier 893 identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", 894 895 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 896 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 897 // Operator (capture 2) 898 "*([*^$|!~]?=)" + whitespace + 899 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 900 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + 901 "*\\]", 902 903 pseudos = ":(" + identifier + ")(?:\\((" + 904 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 905 // 1. quoted (capture 3; capture 4 or capture 5) 906 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 907 // 2. simple (capture 6) 908 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 909 // 3. anything else (capture 2) 910 ".*" + 911 ")\\)|)", 912 913 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 914 rwhitespace = new RegExp( whitespace + "+", "g" ), 915 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), 916 917 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 918 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), 919 920 rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), 921 922 rpseudo = new RegExp( pseudos ), 923 ridentifier = new RegExp( "^" + identifier + "$" ), 924 925 matchExpr = { 926 "ID": new RegExp( "^#(" + identifier + ")" ), 927 "CLASS": new RegExp( "^\\.(" + identifier + ")" ), 928 "TAG": new RegExp( "^(" + identifier + "|[*])" ), 929 "ATTR": new RegExp( "^" + attributes ), 930 "PSEUDO": new RegExp( "^" + pseudos ), 931 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + 932 "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + 933 "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 934 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), 935 // For use in libraries implementing .is() 936 // We use this for POS matching in `select` 937 "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + 938 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 939 }, 940 941 rinputs = /^(?:input|select|textarea|button)$/i, 942 rheader = /^h\d$/i, 943 944 rnative = /^[^{]+\{\s*\[native \w/, 945 946 // Easily-parseable/retrievable ID or TAG or CLASS selectors 947 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 948 949 rsibling = /[+~]/, 950 951 // CSS escapes 952 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 953 runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), 954 funescape = function( _, escaped, escapedWhitespace ) { 955 var high = "0x" + escaped - 0x10000; 956 // NaN means non-codepoint 957 // Support: Firefox<24 958 // Workaround erroneous numeric interpretation of +"0x" 959 return high !== high || escapedWhitespace ? 960 escaped : 961 high < 0 ? 962 // BMP codepoint 963 String.fromCharCode( high + 0x10000 ) : 964 // Supplemental Plane codepoint (surrogate pair) 965 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 966 }, 967 968 // CSS string/identifier serialization 969 // https://drafts.csswg.org/cssom/#common-serializing-idioms 970 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, 971 fcssescape = function( ch, asCodePoint ) { 972 if ( asCodePoint ) { 973 974 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 975 if ( ch === "\0" ) { 976 return "\uFFFD"; 977 } 978 979 // Control characters and (dependent upon position) numbers get escaped as code points 980 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 981 } 982 983 // Other potentially-special ASCII characters get backslash-escaped 984 return "\\" + ch; 985 }, 986 987 // Used for iframes 988 // See setDocument() 989 // Removing the function wrapper causes a "Permission Denied" 990 // error in IE 991 unloadHandler = function() { 992 setDocument(); 993 }, 994 995 disabledAncestor = addCombinator( 996 function( elem ) { 997 return elem.disabled === true && ("form" in elem || "label" in elem); 998 }, 999 { dir: "parentNode", next: "legend" } 1000 ); 1001 1002// Optimize for push.apply( _, NodeList ) 1003try { 1004 push.apply( 1005 (arr = slice.call( preferredDoc.childNodes )), 1006 preferredDoc.childNodes 1007 ); 1008 // Support: Android<4.0 1009 // Detect silently failing push.apply 1010 arr[ preferredDoc.childNodes.length ].nodeType; 1011} catch ( e ) { 1012 push = { apply: arr.length ? 1013 1014 // Leverage slice if possible 1015 function( target, els ) { 1016 push_native.apply( target, slice.call(els) ); 1017 } : 1018 1019 // Support: IE<9 1020 // Otherwise append directly 1021 function( target, els ) { 1022 var j = target.length, 1023 i = 0; 1024 // Can't trust NodeList.length 1025 while ( (target[j++] = els[i++]) ) {} 1026 target.length = j - 1; 1027 } 1028 }; 1029} 1030 1031function Sizzle( selector, context, results, seed ) { 1032 var m, i, elem, nid, match, groups, newSelector, 1033 newContext = context && context.ownerDocument, 1034 1035 // nodeType defaults to 9, since context defaults to document 1036 nodeType = context ? context.nodeType : 9; 1037 1038 results = results || []; 1039 1040 // Return early from calls with invalid selector or context 1041 if ( typeof selector !== "string" || !selector || 1042 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 1043 1044 return results; 1045 } 1046 1047 // Try to shortcut find operations (as opposed to filters) in HTML documents 1048 if ( !seed ) { 1049 1050 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { 1051 setDocument( context ); 1052 } 1053 context = context || document; 1054 1055 if ( documentIsHTML ) { 1056 1057 // If the selector is sufficiently simple, try using a "get*By*" DOM method 1058 // (excepting DocumentFragment context, where the methods don't exist) 1059 if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { 1060 1061 // ID selector 1062 if ( (m = match[1]) ) { 1063 1064 // Document context 1065 if ( nodeType === 9 ) { 1066 if ( (elem = context.getElementById( m )) ) { 1067 1068 // Support: IE, Opera, Webkit 1069 // TODO: identify versions 1070 // getElementById can match elements by name instead of ID 1071 if ( elem.id === m ) { 1072 results.push( elem ); 1073 return results; 1074 } 1075 } else { 1076 return results; 1077 } 1078 1079 // Element context 1080 } else { 1081 1082 // Support: IE, Opera, Webkit 1083 // TODO: identify versions 1084 // getElementById can match elements by name instead of ID 1085 if ( newContext && (elem = newContext.getElementById( m )) && 1086 contains( context, elem ) && 1087 elem.id === m ) { 1088 1089 results.push( elem ); 1090 return results; 1091 } 1092 } 1093 1094 // Type selector 1095 } else if ( match[2] ) { 1096 push.apply( results, context.getElementsByTagName( selector ) ); 1097 return results; 1098 1099 // Class selector 1100 } else if ( (m = match[3]) && support.getElementsByClassName && 1101 context.getElementsByClassName ) { 1102 1103 push.apply( results, context.getElementsByClassName( m ) ); 1104 return results; 1105 } 1106 } 1107 1108 // Take advantage of querySelectorAll 1109 if ( support.qsa && 1110 !compilerCache[ selector + " " ] && 1111 (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { 1112 1113 if ( nodeType !== 1 ) { 1114 newContext = context; 1115 newSelector = selector; 1116 1117 // qSA looks outside Element context, which is not what we want 1118 // Thanks to Andrew Dupont for this workaround technique 1119 // Support: IE <=8 1120 // Exclude object elements 1121 } else if ( context.nodeName.toLowerCase() !== "object" ) { 1122 1123 // Capture the context ID, setting it first if necessary 1124 if ( (nid = context.getAttribute( "id" )) ) { 1125 nid = nid.replace( rcssescape, fcssescape ); 1126 } else { 1127 context.setAttribute( "id", (nid = expando) ); 1128 } 1129 1130 // Prefix every selector in the list 1131 groups = tokenize( selector ); 1132 i = groups.length; 1133 while ( i-- ) { 1134 groups[i] = "#" + nid + " " + toSelector( groups[i] ); 1135 } 1136 newSelector = groups.join( "," ); 1137 1138 // Expand context for sibling selectors 1139 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 1140 context; 1141 } 1142 1143 if ( newSelector ) { 1144 try { 1145 push.apply( results, 1146 newContext.querySelectorAll( newSelector ) 1147 ); 1148 return results; 1149 } catch ( qsaError ) { 1150 } finally { 1151 if ( nid === expando ) { 1152 context.removeAttribute( "id" ); 1153 } 1154 } 1155 } 1156 } 1157 } 1158 } 1159 1160 // All others 1161 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 1162} 1163 1164/** 1165 * Create key-value caches of limited size 1166 * @returns {function(string, object)} Returns the Object data after storing it on itself with 1167 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 1168 * deleting the oldest entry 1169 */ 1170function createCache() { 1171 var keys = []; 1172 1173 function cache( key, value ) { 1174 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 1175 if ( keys.push( key + " " ) > Expr.cacheLength ) { 1176 // Only keep the most recent entries 1177 delete cache[ keys.shift() ]; 1178 } 1179 return (cache[ key + " " ] = value); 1180 } 1181 return cache; 1182} 1183 1184/** 1185 * Mark a function for special use by Sizzle 1186 * @param {Function} fn The function to mark 1187 */ 1188function markFunction( fn ) { 1189 fn[ expando ] = true; 1190 return fn; 1191} 1192 1193/** 1194 * Support testing using an element 1195 * @param {Function} fn Passed the created element and returns a boolean result 1196 */ 1197function assert( fn ) { 1198 var el = document.createElement("fieldset"); 1199 1200 try { 1201 return !!fn( el ); 1202 } catch (e) { 1203 return false; 1204 } finally { 1205 // Remove from its parent by default 1206 if ( el.parentNode ) { 1207 el.parentNode.removeChild( el ); 1208 } 1209 // release memory in IE 1210 el = null; 1211 } 1212} 1213 1214/** 1215 * Adds the same handler for all of the specified attrs 1216 * @param {String} attrs Pipe-separated list of attributes 1217 * @param {Function} handler The method that will be applied 1218 */ 1219function addHandle( attrs, handler ) { 1220 var arr = attrs.split("|"), 1221 i = arr.length; 1222 1223 while ( i-- ) { 1224 Expr.attrHandle[ arr[i] ] = handler; 1225 } 1226} 1227 1228/** 1229 * Checks document order of two siblings 1230 * @param {Element} a 1231 * @param {Element} b 1232 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 1233 */ 1234function siblingCheck( a, b ) { 1235 var cur = b && a, 1236 diff = cur && a.nodeType === 1 && b.nodeType === 1 && 1237 a.sourceIndex - b.sourceIndex; 1238 1239 // Use IE sourceIndex if available on both nodes 1240 if ( diff ) { 1241 return diff; 1242 } 1243 1244 // Check if b follows a 1245 if ( cur ) { 1246 while ( (cur = cur.nextSibling) ) { 1247 if ( cur === b ) { 1248 return -1; 1249 } 1250 } 1251 } 1252 1253 return a ? 1 : -1; 1254} 1255 1256/** 1257 * Returns a function to use in pseudos for input types 1258 * @param {String} type 1259 */ 1260function createInputPseudo( type ) { 1261 return function( elem ) { 1262 var name = elem.nodeName.toLowerCase(); 1263 return name === "input" && elem.type === type; 1264 }; 1265} 1266 1267/** 1268 * Returns a function to use in pseudos for buttons 1269 * @param {String} type 1270 */ 1271function createButtonPseudo( type ) { 1272 return function( elem ) { 1273 var name = elem.nodeName.toLowerCase(); 1274 return (name === "input" || name === "button") && elem.type === type; 1275 }; 1276} 1277 1278/** 1279 * Returns a function to use in pseudos for :enabled/:disabled 1280 * @param {Boolean} disabled true for :disabled; false for :enabled 1281 */ 1282function createDisabledPseudo( disabled ) { 1283 1284 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 1285 return function( elem ) { 1286 1287 // Only certain elements can match :enabled or :disabled 1288 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 1289 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 1290 if ( "form" in elem ) { 1291 1292 // Check for inherited disabledness on relevant non-disabled elements: 1293 // * listed form-associated elements in a disabled fieldset 1294 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 1295 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 1296 // * option elements in a disabled optgroup 1297 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 1298 // All such elements have a "form" property. 1299 if ( elem.parentNode && elem.disabled === false ) { 1300 1301 // Option elements defer to a parent optgroup if present 1302 if ( "label" in elem ) { 1303 if ( "label" in elem.parentNode ) { 1304 return elem.parentNode.disabled === disabled; 1305 } else { 1306 return elem.disabled === disabled; 1307 } 1308 } 1309 1310 // Support: IE 6 - 11 1311 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 1312 return elem.isDisabled === disabled || 1313 1314 // Where there is no isDisabled, check manually 1315 /* jshint -W018 */ 1316 elem.isDisabled !== !disabled && 1317 disabledAncestor( elem ) === disabled; 1318 } 1319 1320 return elem.disabled === disabled; 1321 1322 // Try to winnow out elements that can't be disabled before trusting the disabled property. 1323 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 1324 // even exist on them, let alone have a boolean value. 1325 } else if ( "label" in elem ) { 1326 return elem.disabled === disabled; 1327 } 1328 1329 // Remaining elements are neither :enabled nor :disabled 1330 return false; 1331 }; 1332} 1333 1334/** 1335 * Returns a function to use in pseudos for positionals 1336 * @param {Function} fn 1337 */ 1338function createPositionalPseudo( fn ) { 1339 return markFunction(function( argument ) { 1340 argument = +argument; 1341 return markFunction(function( seed, matches ) { 1342 var j, 1343 matchIndexes = fn( [], seed.length, argument ), 1344 i = matchIndexes.length; 1345 1346 // Match elements found at the specified indexes 1347 while ( i-- ) { 1348 if ( seed[ (j = matchIndexes[i]) ] ) { 1349 seed[j] = !(matches[j] = seed[j]); 1350 } 1351 } 1352 }); 1353 }); 1354} 1355 1356/** 1357 * Checks a node for validity as a Sizzle context 1358 * @param {Element|Object=} context 1359 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 1360 */ 1361function testContext( context ) { 1362 return context && typeof context.getElementsByTagName !== "undefined" && context; 1363} 1364 1365// Expose support vars for convenience 1366support = Sizzle.support = {}; 1367 1368/** 1369 * Detects XML nodes 1370 * @param {Element|Object} elem An element or a document 1371 * @returns {Boolean} True iff elem is a non-HTML XML node 1372 */ 1373isXML = Sizzle.isXML = function( elem ) { 1374 // documentElement is verified for cases where it doesn't yet exist 1375 // (such as loading iframes in IE - #4833) 1376 var documentElement = elem && (elem.ownerDocument || elem).documentElement; 1377 return documentElement ? documentElement.nodeName !== "HTML" : false; 1378}; 1379 1380/** 1381 * Sets document-related variables once based on the current document 1382 * @param {Element|Object} [doc] An element or document object to use to set the document 1383 * @returns {Object} Returns the current document 1384 */ 1385setDocument = Sizzle.setDocument = function( node ) { 1386 var hasCompare, subWindow, 1387 doc = node ? node.ownerDocument || node : preferredDoc; 1388 1389 // Return early if doc is invalid or already selected 1390 if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { 1391 return document; 1392 } 1393 1394 // Update global variables 1395 document = doc; 1396 docElem = document.documentElement; 1397 documentIsHTML = !isXML( document ); 1398 1399 // Support: IE 9-11, Edge 1400 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 1401 if ( preferredDoc !== document && 1402 (subWindow = document.defaultView) && subWindow.top !== subWindow ) { 1403 1404 // Support: IE 11, Edge 1405 if ( subWindow.addEventListener ) { 1406 subWindow.addEventListener( "unload", unloadHandler, false ); 1407 1408 // Support: IE 9 - 10 only 1409 } else if ( subWindow.attachEvent ) { 1410 subWindow.attachEvent( "onunload", unloadHandler ); 1411 } 1412 } 1413 1414 /* Attributes 1415 ---------------------------------------------------------------------- */ 1416 1417 // Support: IE<8 1418 // Verify that getAttribute really returns attributes and not properties 1419 // (excepting IE8 booleans) 1420 support.attributes = assert(function( el ) { 1421 el.className = "i"; 1422 return !el.getAttribute("className"); 1423 }); 1424 1425 /* getElement(s)By* 1426 ---------------------------------------------------------------------- */ 1427 1428 // Check if getElementsByTagName("*") returns only elements 1429 support.getElementsByTagName = assert(function( el ) { 1430 el.appendChild( document.createComment("") ); 1431 return !el.getElementsByTagName("*").length; 1432 }); 1433 1434 // Support: IE<9 1435 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); 1436 1437 // Support: IE<10 1438 // Check if getElementById returns elements by name 1439 // The broken getElementById methods don't pick up programmatically-set names, 1440 // so use a roundabout getElementsByName test 1441 support.getById = assert(function( el ) { 1442 docElem.appendChild( el ).id = expando; 1443 return !document.getElementsByName || !document.getElementsByName( expando ).length; 1444 }); 1445 1446 // ID filter and find 1447 if ( support.getById ) { 1448 Expr.filter["ID"] = function( id ) { 1449 var attrId = id.replace( runescape, funescape ); 1450 return function( elem ) { 1451 return elem.getAttribute("id") === attrId; 1452 }; 1453 }; 1454 Expr.find["ID"] = function( id, context ) { 1455 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1456 var elem = context.getElementById( id ); 1457 return elem ? [ elem ] : []; 1458 } 1459 }; 1460 } else { 1461 Expr.filter["ID"] = function( id ) { 1462 var attrId = id.replace( runescape, funescape ); 1463 return function( elem ) { 1464 var node = typeof elem.getAttributeNode !== "undefined" && 1465 elem.getAttributeNode("id"); 1466 return node && node.value === attrId; 1467 }; 1468 }; 1469 1470 // Support: IE 6 - 7 only 1471 // getElementById is not reliable as a find shortcut 1472 Expr.find["ID"] = function( id, context ) { 1473 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1474 var node, i, elems, 1475 elem = context.getElementById( id ); 1476 1477 if ( elem ) { 1478 1479 // Verify the id attribute 1480 node = elem.getAttributeNode("id"); 1481 if ( node && node.value === id ) { 1482 return [ elem ]; 1483 } 1484 1485 // Fall back on getElementsByName 1486 elems = context.getElementsByName( id ); 1487 i = 0; 1488 while ( (elem = elems[i++]) ) { 1489 node = elem.getAttributeNode("id"); 1490 if ( node && node.value === id ) { 1491 return [ elem ]; 1492 } 1493 } 1494 } 1495 1496 return []; 1497 } 1498 }; 1499 } 1500 1501 // Tag 1502 Expr.find["TAG"] = support.getElementsByTagName ? 1503 function( tag, context ) { 1504 if ( typeof context.getElementsByTagName !== "undefined" ) { 1505 return context.getElementsByTagName( tag ); 1506 1507 // DocumentFragment nodes don't have gEBTN 1508 } else if ( support.qsa ) { 1509 return context.querySelectorAll( tag ); 1510 } 1511 } : 1512 1513 function( tag, context ) { 1514 var elem, 1515 tmp = [], 1516 i = 0, 1517 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 1518 results = context.getElementsByTagName( tag ); 1519 1520 // Filter out possible comments 1521 if ( tag === "*" ) { 1522 while ( (elem = results[i++]) ) { 1523 if ( elem.nodeType === 1 ) { 1524 tmp.push( elem ); 1525 } 1526 } 1527 1528 return tmp; 1529 } 1530 return results; 1531 }; 1532 1533 // Class 1534 Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { 1535 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 1536 return context.getElementsByClassName( className ); 1537 } 1538 }; 1539 1540 /* QSA/matchesSelector 1541 ---------------------------------------------------------------------- */ 1542 1543 // QSA and matchesSelector support 1544 1545 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 1546 rbuggyMatches = []; 1547 1548 // qSa(:focus) reports false when true (Chrome 21) 1549 // We allow this because of a bug in IE8/9 that throws an error 1550 // whenever `document.activeElement` is accessed on an iframe 1551 // So, we allow :focus to pass through QSA all the time to avoid the IE error 1552 // See https://bugs.jquery.com/ticket/13378 1553 rbuggyQSA = []; 1554 1555 if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { 1556 // Build QSA regex 1557 // Regex strategy adopted from Diego Perini 1558 assert(function( el ) { 1559 // Select is set to empty string on purpose 1560 // This is to test IE's treatment of not explicitly 1561 // setting a boolean content attribute, 1562 // since its presence should be enough 1563 // https://bugs.jquery.com/ticket/12359 1564 docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + 1565 "<select id='" + expando + "-\r\\' msallowcapture=''>" + 1566 "<option selected=''></option></select>"; 1567 1568 // Support: IE8, Opera 11-12.16 1569 // Nothing should be selected when empty strings follow ^= or $= or *= 1570 // The test attribute must be unknown in Opera but "safe" for WinRT 1571 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 1572 if ( el.querySelectorAll("[msallowcapture^='']").length ) { 1573 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); 1574 } 1575 1576 // Support: IE8 1577 // Boolean attributes and "value" are not treated correctly 1578 if ( !el.querySelectorAll("[selected]").length ) { 1579 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 1580 } 1581 1582 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 1583 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 1584 rbuggyQSA.push("~="); 1585 } 1586 1587 // Webkit/Opera - :checked should return selected option elements 1588 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1589 // IE8 throws error here and will not see later tests 1590 if ( !el.querySelectorAll(":checked").length ) { 1591 rbuggyQSA.push(":checked"); 1592 } 1593 1594 // Support: Safari 8+, iOS 8+ 1595 // https://bugs.webkit.org/show_bug.cgi?id=136851 1596 // In-page `selector#id sibling-combinator selector` fails 1597 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 1598 rbuggyQSA.push(".#.+[+~]"); 1599 } 1600 }); 1601 1602 assert(function( el ) { 1603 el.innerHTML = "<a href='' disabled='disabled'></a>" + 1604 "<select disabled='disabled'><option/></select>"; 1605 1606 // Support: Windows 8 Native Apps 1607 // The type and name attributes are restricted during .innerHTML assignment 1608 var input = document.createElement("input"); 1609 input.setAttribute( "type", "hidden" ); 1610 el.appendChild( input ).setAttribute( "name", "D" ); 1611 1612 // Support: IE8 1613 // Enforce case-sensitivity of name attribute 1614 if ( el.querySelectorAll("[name=d]").length ) { 1615 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); 1616 } 1617 1618 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 1619 // IE8 throws error here and will not see later tests 1620 if ( el.querySelectorAll(":enabled").length !== 2 ) { 1621 rbuggyQSA.push( ":enabled", ":disabled" ); 1622 } 1623 1624 // Support: IE9-11+ 1625 // IE's :disabled selector does not pick up the children of disabled fieldsets 1626 docElem.appendChild( el ).disabled = true; 1627 if ( el.querySelectorAll(":disabled").length !== 2 ) { 1628 rbuggyQSA.push( ":enabled", ":disabled" ); 1629 } 1630 1631 // Opera 10-11 does not throw on post-comma invalid pseudos 1632 el.querySelectorAll("*,:x"); 1633 rbuggyQSA.push(",.*:"); 1634 }); 1635 } 1636 1637 if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || 1638 docElem.webkitMatchesSelector || 1639 docElem.mozMatchesSelector || 1640 docElem.oMatchesSelector || 1641 docElem.msMatchesSelector) )) ) { 1642 1643 assert(function( el ) { 1644 // Check to see if it's possible to do matchesSelector 1645 // on a disconnected node (IE 9) 1646 support.disconnectedMatch = matches.call( el, "*" ); 1647 1648 // This should fail with an exception 1649 // Gecko does not error, returns false instead 1650 matches.call( el, "[s!='']:x" ); 1651 rbuggyMatches.push( "!=", pseudos ); 1652 }); 1653 } 1654 1655 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); 1656 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); 1657 1658 /* Contains 1659 ---------------------------------------------------------------------- */ 1660 hasCompare = rnative.test( docElem.compareDocumentPosition ); 1661 1662 // Element contains another 1663 // Purposefully self-exclusive 1664 // As in, an element does not contain itself 1665 contains = hasCompare || rnative.test( docElem.contains ) ? 1666 function( a, b ) { 1667 var adown = a.nodeType === 9 ? a.documentElement : a, 1668 bup = b && b.parentNode; 1669 return a === bup || !!( bup && bup.nodeType === 1 && ( 1670 adown.contains ? 1671 adown.contains( bup ) : 1672 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 1673 )); 1674 } : 1675 function( a, b ) { 1676 if ( b ) { 1677 while ( (b = b.parentNode) ) { 1678 if ( b === a ) { 1679 return true; 1680 } 1681 } 1682 } 1683 return false; 1684 }; 1685 1686 /* Sorting 1687 ---------------------------------------------------------------------- */ 1688 1689 // Document order sorting 1690 sortOrder = hasCompare ? 1691 function( a, b ) { 1692 1693 // Flag for duplicate removal 1694 if ( a === b ) { 1695 hasDuplicate = true; 1696 return 0; 1697 } 1698 1699 // Sort on method existence if only one input has compareDocumentPosition 1700 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 1701 if ( compare ) { 1702 return compare; 1703 } 1704 1705 // Calculate position if both inputs belong to the same document 1706 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? 1707 a.compareDocumentPosition( b ) : 1708 1709 // Otherwise we know they are disconnected 1710 1; 1711 1712 // Disconnected nodes 1713 if ( compare & 1 || 1714 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { 1715 1716 // Choose the first element that is related to our preferred document 1717 if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { 1718 return -1; 1719 } 1720 if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { 1721 return 1; 1722 } 1723 1724 // Maintain original order 1725 return sortInput ? 1726 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1727 0; 1728 } 1729 1730 return compare & 4 ? -1 : 1; 1731 } : 1732 function( a, b ) { 1733 // Exit early if the nodes are identical 1734 if ( a === b ) { 1735 hasDuplicate = true; 1736 return 0; 1737 } 1738 1739 var cur, 1740 i = 0, 1741 aup = a.parentNode, 1742 bup = b.parentNode, 1743 ap = [ a ], 1744 bp = [ b ]; 1745 1746 // Parentless nodes are either documents or disconnected 1747 if ( !aup || !bup ) { 1748 return a === document ? -1 : 1749 b === document ? 1 : 1750 aup ? -1 : 1751 bup ? 1 : 1752 sortInput ? 1753 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1754 0; 1755 1756 // If the nodes are siblings, we can do a quick check 1757 } else if ( aup === bup ) { 1758 return siblingCheck( a, b ); 1759 } 1760 1761 // Otherwise we need full lists of their ancestors for comparison 1762 cur = a; 1763 while ( (cur = cur.parentNode) ) { 1764 ap.unshift( cur ); 1765 } 1766 cur = b; 1767 while ( (cur = cur.parentNode) ) { 1768 bp.unshift( cur ); 1769 } 1770 1771 // Walk down the tree looking for a discrepancy 1772 while ( ap[i] === bp[i] ) { 1773 i++; 1774 } 1775 1776 return i ? 1777 // Do a sibling check if the nodes have a common ancestor 1778 siblingCheck( ap[i], bp[i] ) : 1779 1780 // Otherwise nodes in our document sort first 1781 ap[i] === preferredDoc ? -1 : 1782 bp[i] === preferredDoc ? 1 : 1783 0; 1784 }; 1785 1786 return document; 1787}; 1788 1789Sizzle.matches = function( expr, elements ) { 1790 return Sizzle( expr, null, null, elements ); 1791}; 1792 1793Sizzle.matchesSelector = function( elem, expr ) { 1794 // Set document vars if needed 1795 if ( ( elem.ownerDocument || elem ) !== document ) { 1796 setDocument( elem ); 1797 } 1798 1799 // Make sure that attribute selectors are quoted 1800 expr = expr.replace( rattributeQuotes, "='$1']" ); 1801 1802 if ( support.matchesSelector && documentIsHTML && 1803 !compilerCache[ expr + " " ] && 1804 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 1805 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 1806 1807 try { 1808 var ret = matches.call( elem, expr ); 1809 1810 // IE 9's matchesSelector returns false on disconnected nodes 1811 if ( ret || support.disconnectedMatch || 1812 // As well, disconnected nodes are said to be in a document 1813 // fragment in IE 9 1814 elem.document && elem.document.nodeType !== 11 ) { 1815 return ret; 1816 } 1817 } catch (e) {} 1818 } 1819 1820 return Sizzle( expr, document, null, [ elem ] ).length > 0; 1821}; 1822 1823Sizzle.contains = function( context, elem ) { 1824 // Set document vars if needed 1825 if ( ( context.ownerDocument || context ) !== document ) { 1826 setDocument( context ); 1827 } 1828 return contains( context, elem ); 1829}; 1830 1831Sizzle.attr = function( elem, name ) { 1832 // Set document vars if needed 1833 if ( ( elem.ownerDocument || elem ) !== document ) { 1834 setDocument( elem ); 1835 } 1836 1837 var fn = Expr.attrHandle[ name.toLowerCase() ], 1838 // Don't get fooled by Object.prototype properties (jQuery #13807) 1839 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 1840 fn( elem, name, !documentIsHTML ) : 1841 undefined; 1842 1843 return val !== undefined ? 1844 val : 1845 support.attributes || !documentIsHTML ? 1846 elem.getAttribute( name ) : 1847 (val = elem.getAttributeNode(name)) && val.specified ? 1848 val.value : 1849 null; 1850}; 1851 1852Sizzle.escape = function( sel ) { 1853 return (sel + "").replace( rcssescape, fcssescape ); 1854}; 1855 1856Sizzle.error = function( msg ) { 1857 throw new Error( "Syntax error, unrecognized expression: " + msg ); 1858}; 1859 1860/** 1861 * Document sorting and removing duplicates 1862 * @param {ArrayLike} results 1863 */ 1864Sizzle.uniqueSort = function( results ) { 1865 var elem, 1866 duplicates = [], 1867 j = 0, 1868 i = 0; 1869 1870 // Unless we *know* we can detect duplicates, assume their presence 1871 hasDuplicate = !support.detectDuplicates; 1872 sortInput = !support.sortStable && results.slice( 0 ); 1873 results.sort( sortOrder ); 1874 1875 if ( hasDuplicate ) { 1876 while ( (elem = results[i++]) ) { 1877 if ( elem === results[ i ] ) { 1878 j = duplicates.push( i ); 1879 } 1880 } 1881 while ( j-- ) { 1882 results.splice( duplicates[ j ], 1 ); 1883 } 1884 } 1885 1886 // Clear input after sorting to release objects 1887 // See https://github.com/jquery/sizzle/pull/225 1888 sortInput = null; 1889 1890 return results; 1891}; 1892 1893/** 1894 * Utility function for retrieving the text value of an array of DOM nodes 1895 * @param {Array|Element} elem 1896 */ 1897getText = Sizzle.getText = function( elem ) { 1898 var node, 1899 ret = "", 1900 i = 0, 1901 nodeType = elem.nodeType; 1902 1903 if ( !nodeType ) { 1904 // If no nodeType, this is expected to be an array 1905 while ( (node = elem[i++]) ) {
vendor: 11,976 bytes, lines 1906-2304
1906 // Do not traverse comment nodes 1907 ret += getText( node ); 1908 } 1909 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 1910 // Use textContent for elements 1911 // innerText usage removed for consistency of new lines (jQuery #11153) 1912 if ( typeof elem.textContent === "string" ) { 1913 return elem.textContent; 1914 } else { 1915 // Traverse its children 1916 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 1917 ret += getText( elem ); 1918 } 1919 } 1920 } else if ( nodeType === 3 || nodeType === 4 ) { 1921 return elem.nodeValue; 1922 } 1923 // Do not include comment or processing instruction nodes 1924 1925 return ret; 1926}; 1927 1928Expr = Sizzle.selectors = { 1929 1930 // Can be adjusted by the user 1931 cacheLength: 50, 1932 1933 createPseudo: markFunction, 1934 1935 match: matchExpr, 1936 1937 attrHandle: {}, 1938 1939 find: {}, 1940 1941 relative: { 1942 ">": { dir: "parentNode", first: true }, 1943 " ": { dir: "parentNode" }, 1944 "+": { dir: "previousSibling", first: true }, 1945 "~": { dir: "previousSibling" } 1946 }, 1947 1948 preFilter: { 1949 "ATTR": function( match ) { 1950 match[1] = match[1].replace( runescape, funescape ); 1951 1952 // Move the given value to match[3] whether quoted or unquoted 1953 match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); 1954 1955 if ( match[2] === "~=" ) { 1956 match[3] = " " + match[3] + " "; 1957 } 1958 1959 return match.slice( 0, 4 ); 1960 }, 1961 1962 "CHILD": function( match ) { 1963 /* matches from matchExpr["CHILD"] 1964 1 type (only|nth|...) 1965 2 what (child|of-type) 1966 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 1967 4 xn-component of xn+y argument ([+-]?\d*n|) 1968 5 sign of xn-component 1969 6 x of xn-component 1970 7 sign of y-component 1971 8 y of y-component 1972 */ 1973 match[1] = match[1].toLowerCase(); 1974 1975 if ( match[1].slice( 0, 3 ) === "nth" ) { 1976 // nth-* requires argument 1977 if ( !match[3] ) { 1978 Sizzle.error( match[0] ); 1979 } 1980 1981 // numeric x and y parameters for Expr.filter.CHILD 1982 // remember that false/true cast respectively to 0/1 1983 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); 1984 match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); 1985 1986 // other types prohibit arguments 1987 } else if ( match[3] ) { 1988 Sizzle.error( match[0] ); 1989 } 1990 1991 return match; 1992 }, 1993 1994 "PSEUDO": function( match ) { 1995 var excess, 1996 unquoted = !match[6] && match[2]; 1997 1998 if ( matchExpr["CHILD"].test( match[0] ) ) { 1999 return null; 2000 } 2001 2002 // Accept quoted arguments as-is 2003 if ( match[3] ) { 2004 match[2] = match[4] || match[5] || ""; 2005 2006 // Strip excess characters from unquoted arguments 2007 } else if ( unquoted && rpseudo.test( unquoted ) && 2008 // Get excess from tokenize (recursively) 2009 (excess = tokenize( unquoted, true )) && 2010 // advance to the next closing parenthesis 2011 (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { 2012 2013 // excess is a negative index 2014 match[0] = match[0].slice( 0, excess ); 2015 match[2] = unquoted.slice( 0, excess ); 2016 } 2017 2018 // Return only captures needed by the pseudo filter method (type and argument) 2019 return match.slice( 0, 3 ); 2020 } 2021 }, 2022 2023 filter: { 2024 2025 "TAG": function( nodeNameSelector ) { 2026 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 2027 return nodeNameSelector === "*" ? 2028 function() { return true; } : 2029 function( elem ) { 2030 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 2031 }; 2032 }, 2033 2034 "CLASS": function( className ) { 2035 var pattern = classCache[ className + " " ]; 2036 2037 return pattern || 2038 (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && 2039 classCache( className, function( elem ) { 2040 return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); 2041 }); 2042 }, 2043 2044 "ATTR": function( name, operator, check ) { 2045 return function( elem ) { 2046 var result = Sizzle.attr( elem, name ); 2047 2048 if ( result == null ) { 2049 return operator === "!="; 2050 } 2051 if ( !operator ) { 2052 return true; 2053 } 2054 2055 result += ""; 2056 2057 return operator === "=" ? result === check : 2058 operator === "!=" ? result !== check : 2059 operator === "^=" ? check && result.indexOf( check ) === 0 : 2060 operator === "*=" ? check && result.indexOf( check ) > -1 : 2061 operator === "$=" ? check && result.slice( -check.length ) === check : 2062 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : 2063 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 2064 false; 2065 }; 2066 }, 2067 2068 "CHILD": function( type, what, argument, first, last ) { 2069 var simple = type.slice( 0, 3 ) !== "nth", 2070 forward = type.slice( -4 ) !== "last", 2071 ofType = what === "of-type"; 2072 2073 return first === 1 && last === 0 ? 2074 2075 // Shortcut for :nth-*(n) 2076 function( elem ) { 2077 return !!elem.parentNode; 2078 } : 2079 2080 function( elem, context, xml ) { 2081 var cache, uniqueCache, outerCache, node, nodeIndex, start, 2082 dir = simple !== forward ? "nextSibling" : "previousSibling", 2083 parent = elem.parentNode, 2084 name = ofType && elem.nodeName.toLowerCase(), 2085 useCache = !xml && !ofType, 2086 diff = false; 2087 2088 if ( parent ) { 2089 2090 // :(first|last|only)-(child|of-type) 2091 if ( simple ) { 2092 while ( dir ) { 2093 node = elem; 2094 while ( (node = node[ dir ]) ) { 2095 if ( ofType ? 2096 node.nodeName.toLowerCase() === name : 2097 node.nodeType === 1 ) { 2098 2099 return false; 2100 } 2101 } 2102 // Reverse direction for :only-* (if we haven't yet done so) 2103 start = dir = type === "only" && !start && "nextSibling"; 2104 } 2105 return true; 2106 } 2107 2108 start = [ forward ? parent.firstChild : parent.lastChild ]; 2109 2110 // non-xml :nth-child(...) stores cache data on `parent` 2111 if ( forward && useCache ) { 2112 2113 // Seek `elem` from a previously-cached index 2114 2115 // ...in a gzip-friendly way 2116 node = parent; 2117 outerCache = node[ expando ] || (node[ expando ] = {}); 2118 2119 // Support: IE <9 only 2120 // Defend against cloned attroperties (jQuery gh-1709) 2121 uniqueCache = outerCache[ node.uniqueID ] || 2122 (outerCache[ node.uniqueID ] = {}); 2123 2124 cache = uniqueCache[ type ] || []; 2125 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 2126 diff = nodeIndex && cache[ 2 ]; 2127 node = nodeIndex && parent.childNodes[ nodeIndex ]; 2128 2129 while ( (node = ++nodeIndex && node && node[ dir ] || 2130 2131 // Fallback to seeking `elem` from the start 2132 (diff = nodeIndex = 0) || start.pop()) ) { 2133 2134 // When found, cache indexes on `parent` and break 2135 if ( node.nodeType === 1 && ++diff && node === elem ) { 2136 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; 2137 break; 2138 } 2139 } 2140 2141 } else { 2142 // Use previously-cached element index if available 2143 if ( useCache ) { 2144 // ...in a gzip-friendly way 2145 node = elem; 2146 outerCache = node[ expando ] || (node[ expando ] = {}); 2147 2148 // Support: IE <9 only 2149 // Defend against cloned attroperties (jQuery gh-1709) 2150 uniqueCache = outerCache[ node.uniqueID ] || 2151 (outerCache[ node.uniqueID ] = {}); 2152 2153 cache = uniqueCache[ type ] || []; 2154 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 2155 diff = nodeIndex; 2156 } 2157 2158 // xml :nth-child(...) 2159 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 2160 if ( diff === false ) { 2161 // Use the same loop as above to seek `elem` from the start 2162 while ( (node = ++nodeIndex && node && node[ dir ] || 2163 (diff = nodeIndex = 0) || start.pop()) ) { 2164 2165 if ( ( ofType ? 2166 node.nodeName.toLowerCase() === name : 2167 node.nodeType === 1 ) && 2168 ++diff ) { 2169 2170 // Cache the index of each encountered element 2171 if ( useCache ) { 2172 outerCache = node[ expando ] || (node[ expando ] = {}); 2173 2174 // Support: IE <9 only 2175 // Defend against cloned attroperties (jQuery gh-1709) 2176 uniqueCache = outerCache[ node.uniqueID ] || 2177 (outerCache[ node.uniqueID ] = {}); 2178 2179 uniqueCache[ type ] = [ dirruns, diff ]; 2180 } 2181 2182 if ( node === elem ) { 2183 break; 2184 } 2185 } 2186 } 2187 } 2188 } 2189 2190 // Incorporate the offset, then check against cycle size 2191 diff -= last; 2192 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 2193 } 2194 }; 2195 }, 2196 2197 "PSEUDO": function( pseudo, argument ) { 2198 // pseudo-class names are case-insensitive 2199 // http://www.w3.org/TR/selectors/#pseudo-classes 2200 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 2201 // Remember that setFilters inherits from pseudos 2202 var args, 2203 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 2204 Sizzle.error( "unsupported pseudo: " + pseudo ); 2205 2206 // The user may use createPseudo to indicate that 2207 // arguments are needed to create the filter function 2208 // just as Sizzle does 2209 if ( fn[ expando ] ) { 2210 return fn( argument ); 2211 } 2212 2213 // But maintain support for old signatures 2214 if ( fn.length > 1 ) { 2215 args = [ pseudo, pseudo, "", argument ]; 2216 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 2217 markFunction(function( seed, matches ) { 2218 var idx, 2219 matched = fn( seed, argument ), 2220 i = matched.length; 2221 while ( i-- ) { 2222 idx = indexOf( seed, matched[i] ); 2223 seed[ idx ] = !( matches[ idx ] = matched[i] ); 2224 } 2225 }) : 2226 function( elem ) { 2227 return fn( elem, 0, args ); 2228 }; 2229 } 2230 2231 return fn; 2232 } 2233 }, 2234 2235 pseudos: { 2236 // Potentially complex pseudos 2237 "not": markFunction(function( selector ) { 2238 // Trim the selector passed to compile 2239 // to avoid treating leading and trailing 2240 // spaces as combinators 2241 var input = [], 2242 results = [], 2243 matcher = compile( selector.replace( rtrim, "$1" ) ); 2244 2245 return matcher[ expando ] ? 2246 markFunction(function( seed, matches, context, xml ) { 2247 var elem, 2248 unmatched = matcher( seed, null, xml, [] ), 2249 i = seed.length; 2250 2251 // Match elements unmatched by `matcher` 2252 while ( i-- ) { 2253 if ( (elem = unmatched[i]) ) { 2254 seed[i] = !(matches[i] = elem); 2255 } 2256 } 2257 }) : 2258 function( elem, context, xml ) { 2259 input[0] = elem; 2260 matcher( input, null, xml, results ); 2261 // Don't keep the element (issue #299) 2262 input[0] = null; 2263 return !results.pop(); 2264 }; 2265 }), 2266 2267 "has": markFunction(function( selector ) { 2268 return function( elem ) { 2269 return Sizzle( selector, elem ).length > 0; 2270 }; 2271 }), 2272 2273 "contains": markFunction(function( text ) { 2274 text = text.replace( runescape, funescape ); 2275 return function( elem ) { 2276 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; 2277 }; 2278 }), 2279 2280 // "Whether an element is represented by a :lang() selector 2281 // is based solely on the element's language value 2282 // being equal to the identifier C, 2283 // or beginning with the identifier C immediately followed by "-". 2284 // The matching of C against the element's language value is performed case-insensitively. 2285 // The identifier C does not have to be a valid language name." 2286 // http://www.w3.org/TR/selectors/#lang-pseudo 2287 "lang": markFunction( function( lang ) { 2288 // lang value must be a valid identifier 2289 if ( !ridentifier.test(lang || "") ) { 2290 Sizzle.error( "unsupported lang: " + lang ); 2291 } 2292 lang = lang.replace( runescape, funescape ).toLowerCase(); 2293 return function( elem ) { 2294 var elemLang; 2295 do { 2296 if ( (elemLang = documentIsHTML ? 2297 elem.lang : 2298 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { 2299 2300 elemLang = elemLang.toLowerCase(); 2301 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 2302 } 2303 } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); 2304 return false;
vendor: 22,724 bytes, lines 2305-3127
2305 }; 2306 }), 2307 2308 // Miscellaneous 2309 "target": function( elem ) { 2310 var hash = window.location && window.location.hash; 2311 return hash && hash.slice( 1 ) === elem.id; 2312 }, 2313 2314 "root": function( elem ) { 2315 return elem === docElem; 2316 }, 2317 2318 "focus": function( elem ) { 2319 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); 2320 }, 2321 2322 // Boolean properties 2323 "enabled": createDisabledPseudo( false ), 2324 "disabled": createDisabledPseudo( true ), 2325 2326 "checked": function( elem ) { 2327 // In CSS3, :checked should return both checked and selected elements 2328 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 2329 var nodeName = elem.nodeName.toLowerCase(); 2330 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); 2331 }, 2332 2333 "selected": function( elem ) { 2334 // Accessing this property makes selected-by-default 2335 // options in Safari work properly 2336 if ( elem.parentNode ) { 2337 elem.parentNode.selectedIndex; 2338 } 2339 2340 return elem.selected === true; 2341 }, 2342 2343 // Contents 2344 "empty": function( elem ) { 2345 // http://www.w3.org/TR/selectors/#empty-pseudo 2346 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 2347 // but not by others (comment: 8; processing instruction: 7; etc.) 2348 // nodeType < 6 works because attributes (2) do not appear as children 2349 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 2350 if ( elem.nodeType < 6 ) { 2351 return false; 2352 } 2353 } 2354 return true; 2355 }, 2356 2357 "parent": function( elem ) { 2358 return !Expr.pseudos["empty"]( elem ); 2359 }, 2360 2361 // Element/input types 2362 "header": function( elem ) { 2363 return rheader.test( elem.nodeName ); 2364 }, 2365 2366 "input": function( elem ) { 2367 return rinputs.test( elem.nodeName ); 2368 }, 2369 2370 "button": function( elem ) { 2371 var name = elem.nodeName.toLowerCase(); 2372 return name === "input" && elem.type === "button" || name === "button"; 2373 }, 2374 2375 "text": function( elem ) { 2376 var attr; 2377 return elem.nodeName.toLowerCase() === "input" && 2378 elem.type === "text" && 2379 2380 // Support: IE<8 2381 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 2382 ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); 2383 }, 2384 2385 // Position-in-collection 2386 "first": createPositionalPseudo(function() { 2387 return [ 0 ]; 2388 }), 2389 2390 "last": createPositionalPseudo(function( matchIndexes, length ) { 2391 return [ length - 1 ]; 2392 }), 2393 2394 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { 2395 return [ argument < 0 ? argument + length : argument ]; 2396 }), 2397 2398 "even": createPositionalPseudo(function( matchIndexes, length ) { 2399 var i = 0; 2400 for ( ; i < length; i += 2 ) { 2401 matchIndexes.push( i ); 2402 } 2403 return matchIndexes; 2404 }), 2405 2406 "odd": createPositionalPseudo(function( matchIndexes, length ) { 2407 var i = 1; 2408 for ( ; i < length; i += 2 ) { 2409 matchIndexes.push( i ); 2410 } 2411 return matchIndexes; 2412 }), 2413 2414 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { 2415 var i = argument < 0 ? argument + length : argument; 2416 for ( ; --i >= 0; ) { 2417 matchIndexes.push( i ); 2418 } 2419 return matchIndexes; 2420 }), 2421 2422 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { 2423 var i = argument < 0 ? argument + length : argument; 2424 for ( ; ++i < length; ) { 2425 matchIndexes.push( i ); 2426 } 2427 return matchIndexes; 2428 }) 2429 } 2430}; 2431 2432Expr.pseudos["nth"] = Expr.pseudos["eq"]; 2433 2434// Add button/input type pseudos 2435for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 2436 Expr.pseudos[ i ] = createInputPseudo( i ); 2437} 2438for ( i in { submit: true, reset: true } ) { 2439 Expr.pseudos[ i ] = createButtonPseudo( i ); 2440} 2441 2442// Easy API for creating new setFilters 2443function setFilters() {} 2444setFilters.prototype = Expr.filters = Expr.pseudos; 2445Expr.setFilters = new setFilters(); 2446 2447tokenize = Sizzle.tokenize = function( selector, parseOnly ) { 2448 var matched, match, tokens, type, 2449 soFar, groups, preFilters, 2450 cached = tokenCache[ selector + " " ]; 2451 2452 if ( cached ) { 2453 return parseOnly ? 0 : cached.slice( 0 ); 2454 } 2455 2456 soFar = selector; 2457 groups = []; 2458 preFilters = Expr.preFilter; 2459 2460 while ( soFar ) { 2461 2462 // Comma and first run 2463 if ( !matched || (match = rcomma.exec( soFar )) ) { 2464 if ( match ) { 2465 // Don't consume trailing commas as valid 2466 soFar = soFar.slice( match[0].length ) || soFar; 2467 } 2468 groups.push( (tokens = []) ); 2469 } 2470 2471 matched = false; 2472 2473 // Combinators 2474 if ( (match = rcombinators.exec( soFar )) ) { 2475 matched = match.shift(); 2476 tokens.push({ 2477 value: matched, 2478 // Cast descendant combinators to space 2479 type: match[0].replace( rtrim, " " ) 2480 }); 2481 soFar = soFar.slice( matched.length ); 2482 } 2483 2484 // Filters 2485 for ( type in Expr.filter ) { 2486 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || 2487 (match = preFilters[ type ]( match ))) ) { 2488 matched = match.shift(); 2489 tokens.push({ 2490 value: matched, 2491 type: type, 2492 matches: match 2493 }); 2494 soFar = soFar.slice( matched.length ); 2495 } 2496 } 2497 2498 if ( !matched ) { 2499 break; 2500 } 2501 } 2502 2503 // Return the length of the invalid excess 2504 // if we're just parsing 2505 // Otherwise, throw an error or return tokens 2506 return parseOnly ? 2507 soFar.length : 2508 soFar ? 2509 Sizzle.error( selector ) : 2510 // Cache the tokens 2511 tokenCache( selector, groups ).slice( 0 ); 2512}; 2513 2514function toSelector( tokens ) { 2515 var i = 0, 2516 len = tokens.length, 2517 selector = ""; 2518 for ( ; i < len; i++ ) { 2519 selector += tokens[i].value; 2520 } 2521 return selector; 2522} 2523 2524function addCombinator( matcher, combinator, base ) { 2525 var dir = combinator.dir, 2526 skip = combinator.next, 2527 key = skip || dir, 2528 checkNonElements = base && key === "parentNode", 2529 doneName = done++; 2530 2531 return combinator.first ? 2532 // Check against closest ancestor/preceding element 2533 function( elem, context, xml ) { 2534 while ( (elem = elem[ dir ]) ) { 2535 if ( elem.nodeType === 1 || checkNonElements ) { 2536 return matcher( elem, context, xml ); 2537 } 2538 } 2539 return false; 2540 } : 2541 2542 // Check against all ancestor/preceding elements 2543 function( elem, context, xml ) { 2544 var oldCache, uniqueCache, outerCache, 2545 newCache = [ dirruns, doneName ]; 2546 2547 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 2548 if ( xml ) { 2549 while ( (elem = elem[ dir ]) ) { 2550 if ( elem.nodeType === 1 || checkNonElements ) { 2551 if ( matcher( elem, context, xml ) ) { 2552 return true; 2553 } 2554 } 2555 } 2556 } else { 2557 while ( (elem = elem[ dir ]) ) { 2558 if ( elem.nodeType === 1 || checkNonElements ) { 2559 outerCache = elem[ expando ] || (elem[ expando ] = {}); 2560 2561 // Support: IE <9 only 2562 // Defend against cloned attroperties (jQuery gh-1709) 2563 uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); 2564 2565 if ( skip && skip === elem.nodeName.toLowerCase() ) { 2566 elem = elem[ dir ] || elem; 2567 } else if ( (oldCache = uniqueCache[ key ]) && 2568 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 2569 2570 // Assign to newCache so results back-propagate to previous elements 2571 return (newCache[ 2 ] = oldCache[ 2 ]); 2572 } else { 2573 // Reuse newcache so results back-propagate to previous elements 2574 uniqueCache[ key ] = newCache; 2575 2576 // A match means we're done; a fail means we have to keep checking 2577 if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { 2578 return true; 2579 } 2580 } 2581 } 2582 } 2583 } 2584 return false; 2585 }; 2586} 2587 2588function elementMatcher( matchers ) { 2589 return matchers.length > 1 ? 2590 function( elem, context, xml ) { 2591 var i = matchers.length; 2592 while ( i-- ) { 2593 if ( !matchers[i]( elem, context, xml ) ) { 2594 return false; 2595 } 2596 } 2597 return true; 2598 } : 2599 matchers[0]; 2600} 2601 2602function multipleContexts( selector, contexts, results ) { 2603 var i = 0, 2604 len = contexts.length; 2605 for ( ; i < len; i++ ) { 2606 Sizzle( selector, contexts[i], results ); 2607 } 2608 return results; 2609} 2610 2611function condense( unmatched, map, filter, context, xml ) { 2612 var elem, 2613 newUnmatched = [], 2614 i = 0, 2615 len = unmatched.length, 2616 mapped = map != null; 2617 2618 for ( ; i < len; i++ ) { 2619 if ( (elem = unmatched[i]) ) { 2620 if ( !filter || filter( elem, context, xml ) ) { 2621 newUnmatched.push( elem ); 2622 if ( mapped ) { 2623 map.push( i ); 2624 } 2625 } 2626 } 2627 } 2628 2629 return newUnmatched; 2630} 2631 2632function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 2633 if ( postFilter && !postFilter[ expando ] ) { 2634 postFilter = setMatcher( postFilter ); 2635 } 2636 if ( postFinder && !postFinder[ expando ] ) { 2637 postFinder = setMatcher( postFinder, postSelector ); 2638 } 2639 return markFunction(function( seed, results, context, xml ) { 2640 var temp, i, elem, 2641 preMap = [], 2642 postMap = [], 2643 preexisting = results.length, 2644 2645 // Get initial elements from seed or context 2646 elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), 2647 2648 // Prefilter to get matcher input, preserving a map for seed-results synchronization 2649 matcherIn = preFilter && ( seed || !selector ) ? 2650 condense( elems, preMap, preFilter, context, xml ) : 2651 elems, 2652 2653 matcherOut = matcher ? 2654 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 2655 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 2656 2657 // ...intermediate processing is necessary 2658 [] : 2659 2660 // ...otherwise use results directly 2661 results : 2662 matcherIn; 2663 2664 // Find primary matches 2665 if ( matcher ) { 2666 matcher( matcherIn, matcherOut, context, xml ); 2667 } 2668 2669 // Apply postFilter 2670 if ( postFilter ) { 2671 temp = condense( matcherOut, postMap ); 2672 postFilter( temp, [], context, xml ); 2673 2674 // Un-match failing elements by moving them back to matcherIn 2675 i = temp.length; 2676 while ( i-- ) { 2677 if ( (elem = temp[i]) ) { 2678 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); 2679 } 2680 } 2681 } 2682 2683 if ( seed ) { 2684 if ( postFinder || preFilter ) { 2685 if ( postFinder ) { 2686 // Get the final matcherOut by condensing this intermediate into postFinder contexts 2687 temp = []; 2688 i = matcherOut.length; 2689 while ( i-- ) { 2690 if ( (elem = matcherOut[i]) ) { 2691 // Restore matcherIn since elem is not yet a final match 2692 temp.push( (matcherIn[i] = elem) ); 2693 } 2694 } 2695 postFinder( null, (matcherOut = []), temp, xml ); 2696 } 2697 2698 // Move matched elements from seed to results to keep them synchronized 2699 i = matcherOut.length; 2700 while ( i-- ) { 2701 if ( (elem = matcherOut[i]) && 2702 (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { 2703 2704 seed[temp] = !(results[temp] = elem); 2705 } 2706 } 2707 } 2708 2709 // Add elements to results, through postFinder if defined 2710 } else { 2711 matcherOut = condense( 2712 matcherOut === results ? 2713 matcherOut.splice( preexisting, matcherOut.length ) : 2714 matcherOut 2715 ); 2716 if ( postFinder ) { 2717 postFinder( null, results, matcherOut, xml ); 2718 } else { 2719 push.apply( results, matcherOut ); 2720 } 2721 } 2722 }); 2723} 2724 2725function matcherFromTokens( tokens ) { 2726 var checkContext, matcher, j, 2727 len = tokens.length, 2728 leadingRelative = Expr.relative[ tokens[0].type ], 2729 implicitRelative = leadingRelative || Expr.relative[" "], 2730 i = leadingRelative ? 1 : 0, 2731 2732 // The foundational matcher ensures that elements are reachable from top-level context(s) 2733 matchContext = addCombinator( function( elem ) { 2734 return elem === checkContext; 2735 }, implicitRelative, true ), 2736 matchAnyContext = addCombinator( function( elem ) { 2737 return indexOf( checkContext, elem ) > -1; 2738 }, implicitRelative, true ), 2739 matchers = [ function( elem, context, xml ) { 2740 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 2741 (checkContext = context).nodeType ? 2742 matchContext( elem, context, xml ) : 2743 matchAnyContext( elem, context, xml ) ); 2744 // Avoid hanging onto element (issue #299) 2745 checkContext = null; 2746 return ret; 2747 } ]; 2748 2749 for ( ; i < len; i++ ) { 2750 if ( (matcher = Expr.relative[ tokens[i].type ]) ) { 2751 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; 2752 } else { 2753 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); 2754 2755 // Return special upon seeing a positional matcher 2756 if ( matcher[ expando ] ) { 2757 // Find the next relative operator (if any) for proper handling 2758 j = ++i; 2759 for ( ; j < len; j++ ) { 2760 if ( Expr.relative[ tokens[j].type ] ) { 2761 break; 2762 } 2763 } 2764 return setMatcher( 2765 i > 1 && elementMatcher( matchers ), 2766 i > 1 && toSelector( 2767 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 2768 tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) 2769 ).replace( rtrim, "$1" ), 2770 matcher, 2771 i < j && matcherFromTokens( tokens.slice( i, j ) ), 2772 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), 2773 j < len && toSelector( tokens ) 2774 ); 2775 } 2776 matchers.push( matcher ); 2777 } 2778 } 2779 2780 return elementMatcher( matchers ); 2781} 2782 2783function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 2784 var bySet = setMatchers.length > 0, 2785 byElement = elementMatchers.length > 0, 2786 superMatcher = function( seed, context, xml, results, outermost ) { 2787 var elem, j, matcher, 2788 matchedCount = 0, 2789 i = "0", 2790 unmatched = seed && [], 2791 setMatched = [], 2792 contextBackup = outermostContext, 2793 // We must always have either seed elements or outermost context 2794 elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), 2795 // Use integer dirruns iff this is the outermost matcher 2796 dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), 2797 len = elems.length; 2798 2799 if ( outermost ) { 2800 outermostContext = context === document || context || outermost; 2801 } 2802 2803 // Add elements passing elementMatchers directly to results 2804 // Support: IE<9, Safari 2805 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 2806 for ( ; i !== len && (elem = elems[i]) != null; i++ ) { 2807 if ( byElement && elem ) { 2808 j = 0; 2809 if ( !context && elem.ownerDocument !== document ) { 2810 setDocument( elem ); 2811 xml = !documentIsHTML; 2812 } 2813 while ( (matcher = elementMatchers[j++]) ) { 2814 if ( matcher( elem, context || document, xml) ) { 2815 results.push( elem ); 2816 break; 2817 } 2818 } 2819 if ( outermost ) { 2820 dirruns = dirrunsUnique; 2821 } 2822 } 2823 2824 // Track unmatched elements for set filters 2825 if ( bySet ) { 2826 // They will have gone through all possible matchers 2827 if ( (elem = !matcher && elem) ) { 2828 matchedCount--; 2829 } 2830 2831 // Lengthen the array for every element, matched or not 2832 if ( seed ) { 2833 unmatched.push( elem ); 2834 } 2835 } 2836 } 2837 2838 // `i` is now the count of elements visited above, and adding it to `matchedCount` 2839 // makes the latter nonnegative. 2840 matchedCount += i; 2841 2842 // Apply set filters to unmatched elements 2843 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 2844 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 2845 // no element matchers and no seed. 2846 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 2847 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 2848 // numerically zero. 2849 if ( bySet && i !== matchedCount ) { 2850 j = 0; 2851 while ( (matcher = setMatchers[j++]) ) { 2852 matcher( unmatched, setMatched, context, xml ); 2853 } 2854 2855 if ( seed ) { 2856 // Reintegrate element matches to eliminate the need for sorting 2857 if ( matchedCount > 0 ) { 2858 while ( i-- ) { 2859 if ( !(unmatched[i] || setMatched[i]) ) { 2860 setMatched[i] = pop.call( results ); 2861 } 2862 } 2863 } 2864 2865 // Discard index placeholder values to get only actual matches 2866 setMatched = condense( setMatched ); 2867 } 2868 2869 // Add matches to results 2870 push.apply( results, setMatched ); 2871 2872 // Seedless set matches succeeding multiple successful matchers stipulate sorting 2873 if ( outermost && !seed && setMatched.length > 0 && 2874 ( matchedCount + setMatchers.length ) > 1 ) { 2875 2876 Sizzle.uniqueSort( results ); 2877 } 2878 } 2879 2880 // Override manipulation of globals by nested matchers 2881 if ( outermost ) { 2882 dirruns = dirrunsUnique; 2883 outermostContext = contextBackup; 2884 } 2885 2886 return unmatched; 2887 }; 2888 2889 return bySet ? 2890 markFunction( superMatcher ) : 2891 superMatcher; 2892} 2893 2894compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { 2895 var i, 2896 setMatchers = [], 2897 elementMatchers = [], 2898 cached = compilerCache[ selector + " " ]; 2899 2900 if ( !cached ) { 2901 // Generate a function of recursive functions that can be used to check each element 2902 if ( !match ) { 2903 match = tokenize( selector ); 2904 } 2905 i = match.length; 2906 while ( i-- ) { 2907 cached = matcherFromTokens( match[i] ); 2908 if ( cached[ expando ] ) { 2909 setMatchers.push( cached ); 2910 } else { 2911 elementMatchers.push( cached ); 2912 } 2913 } 2914 2915 // Cache the compiled function 2916 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); 2917 2918 // Save selector and tokenization 2919 cached.selector = selector; 2920 } 2921 return cached; 2922}; 2923 2924/** 2925 * A low-level selection function that works with Sizzle's compiled 2926 * selector functions 2927 * @param {String|Function} selector A selector or a pre-compiled 2928 * selector function built with Sizzle.compile 2929 * @param {Element} context 2930 * @param {Array} [results] 2931 * @param {Array} [seed] A set of elements to match against 2932 */ 2933select = Sizzle.select = function( selector, context, results, seed ) { 2934 var i, tokens, token, type, find, 2935 compiled = typeof selector === "function" && selector, 2936 match = !seed && tokenize( (selector = compiled.selector || selector) ); 2937 2938 results = results || []; 2939 2940 // Try to minimize operations if there is only one selector in the list and no seed 2941 // (the latter of which guarantees us context) 2942 if ( match.length === 1 ) { 2943 2944 // Reduce context if the leading compound selector is an ID 2945 tokens = match[0] = match[0].slice( 0 ); 2946 if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && 2947 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { 2948 2949 context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; 2950 if ( !context ) { 2951 return results; 2952 2953 // Precompiled matchers will still verify ancestry, so step up a level 2954 } else if ( compiled ) { 2955 context = context.parentNode; 2956 } 2957 2958 selector = selector.slice( tokens.shift().value.length ); 2959 } 2960 2961 // Fetch a seed set for right-to-left matching 2962 i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; 2963 while ( i-- ) { 2964 token = tokens[i]; 2965 2966 // Abort if we hit a combinator 2967 if ( Expr.relative[ (type = token.type) ] ) { 2968 break; 2969 } 2970 if ( (find = Expr.find[ type ]) ) { 2971 // Search, expanding context for leading sibling combinators 2972 if ( (seed = find( 2973 token.matches[0].replace( runescape, funescape ), 2974 rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context 2975 )) ) { 2976 2977 // If seed is empty or no tokens remain, we can return early 2978 tokens.splice( i, 1 ); 2979 selector = seed.length && toSelector( tokens ); 2980 if ( !selector ) { 2981 push.apply( results, seed ); 2982 return results; 2983 } 2984 2985 break; 2986 } 2987 } 2988 } 2989 } 2990 2991 // Compile and execute a filtering function if one is not provided 2992 // Provide `match` to avoid retokenization if we modified the selector above 2993 ( compiled || compile( selector, match ) )( 2994 seed, 2995 context, 2996 !documentIsHTML, 2997 results, 2998 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 2999 ); 3000 return results; 3001}; 3002 3003// One-time assignments 3004 3005// Sort stability 3006support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; 3007 3008// Support: Chrome 14-35+ 3009// Always assume duplicates if they aren't passed to the comparison function 3010support.detectDuplicates = !!hasDuplicate; 3011 3012// Initialize against the default document 3013setDocument(); 3014 3015// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 3016// Detached nodes confoundingly follow *each other* 3017support.sortDetached = assert(function( el ) { 3018 // Should return 1, but returns 4 (following) 3019 return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; 3020}); 3021 3022// Support: IE<8 3023// Prevent attribute/property "interpolation" 3024// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 3025if ( !assert(function( el ) { 3026 el.innerHTML = "<a href='#'></a>"; 3027 return el.firstChild.getAttribute("href") === "#" ; 3028}) ) { 3029 addHandle( "type|href|height|width", function( elem, name, isXML ) { 3030 if ( !isXML ) { 3031 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); 3032 } 3033 }); 3034} 3035 3036// Support: IE<9 3037// Use defaultValue in place of getAttribute("value") 3038if ( !support.attributes || !assert(function( el ) { 3039 el.innerHTML = "<input/>"; 3040 el.firstChild.setAttribute( "value", "" ); 3041 return el.firstChild.getAttribute( "value" ) === ""; 3042}) ) { 3043 addHandle( "value", function( elem, name, isXML ) { 3044 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { 3045 return elem.defaultValue; 3046 } 3047 }); 3048} 3049 3050// Support: IE<9 3051// Use getAttributeNode to fetch booleans when getAttribute lies 3052if ( !assert(function( el ) { 3053 return el.getAttribute("disabled") == null; 3054}) ) { 3055 addHandle( booleans, function( elem, name, isXML ) { 3056 var val; 3057 if ( !isXML ) { 3058 return elem[ name ] === true ? name.toLowerCase() : 3059 (val = elem.getAttributeNode( name )) && val.specified ? 3060 val.value : 3061 null; 3062 } 3063 }); 3064} 3065 3066return Sizzle; 3067 3068})( window ); 3069 3070 3071 3072jQuery.find = Sizzle; 3073jQuery.expr = Sizzle.selectors; 3074 3075// Deprecated 3076jQuery.expr[ ":" ] = jQuery.expr.pseudos; 3077jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 3078jQuery.text = Sizzle.getText; 3079jQuery.isXMLDoc = Sizzle.isXML; 3080jQuery.contains = Sizzle.contains; 3081jQuery.escapeSelector = Sizzle.escape; 3082 3083 3084 3085 3086var dir = function( elem, dir, until ) { 3087 var matched = [], 3088 truncate = until !== undefined; 3089 3090 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 3091 if ( elem.nodeType === 1 ) { 3092 if ( truncate && jQuery( elem ).is( until ) ) { 3093 break; 3094 } 3095 matched.push( elem ); 3096 } 3097 } 3098 return matched; 3099}; 3100 3101 3102var siblings = function( n, elem ) { 3103 var matched = []; 3104 3105 for ( ; n; n = n.nextSibling ) { 3106 if ( n.nodeType === 1 && n !== elem ) { 3107 matched.push( n ); 3108 } 3109 } 3110 3111 return matched; 3112}; 3113 3114 3115var rneedsContext = jQuery.expr.match.needsContext; 3116 3117 3118 3119function nodeName( elem, name ) { 3120 3121 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 3122 3123}; 3124var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 3125 3126 3127
3128var risSimple = /^.[^:#\[\.,]*$/; 3129 3130// Implement the identical functionality for filter and not 3131function winnow( elements, qualifier, not ) { 3132 if ( jQuery.isFunction( qualifier ) ) { 3133 return jQuery.grep( elements, function( elem, i ) { 3134 return !!qualifier.call( elem, i, elem ) !== not; 3135 } ); 3136 } 3137 3138 // Single element 3139 if ( qualifier.nodeType ) { 3140 return jQuery.grep( elements, function( elem ) { 3141 return ( elem === qualifier ) !== not; 3142 } ); 3143 } 3144 3145 // Arraylike of elements (jQuery, arguments, Array) 3146 if ( typeof qualifier !== "string" ) { 3147 return jQuery.grep( elements, function( elem ) { 3148 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 3149 } ); 3150 } 3151 3152 // Simple selector that can be filtered directly, removing non-Elements 3153 if ( risSimple.test( qualifier ) ) { 3154 return jQuery.filter( qualifier, elements, not ); 3155 } 3156 3157 // Complex selector, compare the two sets, removing non-Elements 3158 qualifier = jQuery.filter( qualifier, elements ); 3159 return jQuery.grep( elements, function( elem ) { 3160 return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; 3161 } ); 3162} 3163 3164jQuery.filter = function( expr, elems, not ) { 3165 var elem = elems[ 0 ]; 3166 3167 if ( not ) { 3168 expr = ":not(" + expr + ")"; 3169 } 3170 3171 if ( elems.length === 1 && elem.nodeType === 1 ) { 3172 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 3173 } 3174 3175 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 3176 return elem.nodeType === 1;
vendor: 4,831 bytes, lines 3177-3372
3177 } ) ); 3178}; 3179 3180jQuery.fn.extend( { 3181 find: function( selector ) { 3182 var i, ret, 3183 len = this.length, 3184 self = this; 3185 3186 if ( typeof selector !== "string" ) { 3187 return this.pushStack( jQuery( selector ).filter( function() { 3188 for ( i = 0; i < len; i++ ) { 3189 if ( jQuery.contains( self[ i ], this ) ) { 3190 return true; 3191 } 3192 } 3193 } ) ); 3194 } 3195 3196 ret = this.pushStack( [] ); 3197 3198 for ( i = 0; i < len; i++ ) { 3199 jQuery.find( selector, self[ i ], ret ); 3200 } 3201 3202 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 3203 }, 3204 filter: function( selector ) { 3205 return this.pushStack( winnow( this, selector || [], false ) ); 3206 }, 3207 not: function( selector ) { 3208 return this.pushStack( winnow( this, selector || [], true ) ); 3209 }, 3210 is: function( selector ) { 3211 return !!winnow( 3212 this, 3213 3214 // If this is a positional/relative selector, check membership in the returned set 3215 // so $("p:first").is("p:last") won't return true for a doc with two "p". 3216 typeof selector === "string" && rneedsContext.test( selector ) ? 3217 jQuery( selector ) : 3218 selector || [], 3219 false 3220 ).length; 3221 } 3222} ); 3223 3224 3225// Initialize a jQuery object 3226 3227 3228// A central reference to the root jQuery(document) 3229var rootjQuery, 3230 3231 // A simple way to check for HTML strings 3232 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 3233 // Strict HTML recognition (#11290: must start with <) 3234 // Shortcut simple #id case for speed 3235 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 3236 3237 init = jQuery.fn.init = function( selector, context, root ) { 3238 var match, elem; 3239 3240 // HANDLE: $(""), $(null), $(undefined), $(false) 3241 if ( !selector ) { 3242 return this; 3243 } 3244 3245 // Method init() accepts an alternate rootjQuery 3246 // so migrate can support jQuery.sub (gh-2101) 3247 root = root || rootjQuery; 3248 3249 // Handle HTML strings 3250 if ( typeof selector === "string" ) { 3251 if ( selector[ 0 ] === "<" && 3252 selector[ selector.length - 1 ] === ">" && 3253 selector.length >= 3 ) { 3254 3255 // Assume that strings that start and end with <> are HTML and skip the regex check 3256 match = [ null, selector, null ]; 3257 3258 } else { 3259 match = rquickExpr.exec( selector ); 3260 } 3261 3262 // Match html or make sure no context is specified for #id 3263 if ( match && ( match[ 1 ] || !context ) ) { 3264 3265 // HANDLE: $(html) -> $(array) 3266 if ( match[ 1 ] ) { 3267 context = context instanceof jQuery ? context[ 0 ] : context; 3268 3269 // Option to run scripts is true for back-compat 3270 // Intentionally let the error be thrown if parseHTML is not present 3271 jQuery.merge( this, jQuery.parseHTML( 3272 match[ 1 ], 3273 context && context.nodeType ? context.ownerDocument || context : document, 3274 true 3275 ) ); 3276 3277 // HANDLE: $(html, props) 3278 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 3279 for ( match in context ) { 3280 3281 // Properties of context are called as methods if possible 3282 if ( jQuery.isFunction( this[ match ] ) ) { 3283 this[ match ]( context[ match ] ); 3284 3285 // ...and otherwise set as attributes 3286 } else { 3287 this.attr( match, context[ match ] ); 3288 } 3289 } 3290 } 3291 3292 return this; 3293 3294 // HANDLE: $(#id) 3295 } else { 3296 elem = document.getElementById( match[ 2 ] ); 3297 3298 if ( elem ) { 3299 3300 // Inject the element directly into the jQuery object 3301 this[ 0 ] = elem; 3302 this.length = 1; 3303 } 3304 return this; 3305 } 3306 3307 // HANDLE: $(expr, $(...)) 3308 } else if ( !context || context.jquery ) { 3309 return ( context || root ).find( selector ); 3310 3311 // HANDLE: $(expr, context) 3312 // (which is just equivalent to: $(context).find(expr) 3313 } else { 3314 return this.constructor( context ).find( selector ); 3315 } 3316 3317 // HANDLE: $(DOMElement) 3318 } else if ( selector.nodeType ) { 3319 this[ 0 ] = selector; 3320 this.length = 1; 3321 return this; 3322 3323 // HANDLE: $(function) 3324 // Shortcut for document ready 3325 } else if ( jQuery.isFunction( selector ) ) { 3326 return root.ready !== undefined ? 3327 root.ready( selector ) : 3328 3329 // Execute immediately if ready is not present 3330 selector( jQuery ); 3331 } 3332 3333 return jQuery.makeArray( selector, this ); 3334 }; 3335 3336// Give the init function the jQuery prototype for later instantiation 3337init.prototype = jQuery.fn; 3338 3339// Initialize central reference 3340rootjQuery = jQuery( document ); 3341 3342 3343var rparentsprev = /^(?:parents|prev(?:Until|All))/, 3344 3345 // Methods guaranteed to produce a unique set when starting from a unique set 3346 guaranteedUnique = { 3347 children: true, 3348 contents: true, 3349 next: true, 3350 prev: true 3351 }; 3352 3353jQuery.fn.extend( { 3354 has: function( target ) { 3355 var targets = jQuery( target, this ), 3356 l = targets.length; 3357 3358 return this.filter( function() { 3359 var i = 0; 3360 for ( ; i < l; i++ ) { 3361 if ( jQuery.contains( this, targets[ i ] ) ) { 3362 return true; 3363 } 3364 } 3365 } ); 3366 }, 3367 3368 closest: function( selectors, context ) { 3369 var cur, 3370 i = 0, 3371 l = this.length, 3372 matched = [],
vendor: 6,797 bytes, lines 3373-3640
3373 targets = typeof selectors !== "string" && jQuery( selectors ); 3374 3375 // Positional selectors never match, since there's no _selection_ context 3376 if ( !rneedsContext.test( selectors ) ) { 3377 for ( ; i < l; i++ ) { 3378 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 3379 3380 // Always skip document fragments 3381 if ( cur.nodeType < 11 && ( targets ? 3382 targets.index( cur ) > -1 : 3383 3384 // Don't pass non-elements to Sizzle 3385 cur.nodeType === 1 && 3386 jQuery.find.matchesSelector( cur, selectors ) ) ) { 3387 3388 matched.push( cur ); 3389 break; 3390 } 3391 } 3392 } 3393 } 3394 3395 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 3396 }, 3397 3398 // Determine the position of an element within the set 3399 index: function( elem ) { 3400 3401 // No argument, return index in parent 3402 if ( !elem ) { 3403 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 3404 } 3405 3406 // Index in selector 3407 if ( typeof elem === "string" ) { 3408 return indexOf.call( jQuery( elem ), this[ 0 ] ); 3409 } 3410 3411 // Locate the position of the desired element 3412 return indexOf.call( this, 3413 3414 // If it receives a jQuery object, the first element is used 3415 elem.jquery ? elem[ 0 ] : elem 3416 ); 3417 }, 3418 3419 add: function( selector, context ) { 3420 return this.pushStack( 3421 jQuery.uniqueSort( 3422 jQuery.merge( this.get(), jQuery( selector, context ) ) 3423 ) 3424 ); 3425 }, 3426 3427 addBack: function( selector ) { 3428 return this.add( selector == null ? 3429 this.prevObject : this.prevObject.filter( selector ) 3430 ); 3431 } 3432} ); 3433 3434function sibling( cur, dir ) { 3435 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 3436 return cur; 3437} 3438 3439jQuery.each( { 3440 parent: function( elem ) { 3441 var parent = elem.parentNode; 3442 return parent && parent.nodeType !== 11 ? parent : null; 3443 }, 3444 parents: function( elem ) { 3445 return dir( elem, "parentNode" ); 3446 }, 3447 parentsUntil: function( elem, i, until ) { 3448 return dir( elem, "parentNode", until ); 3449 }, 3450 next: function( elem ) { 3451 return sibling( elem, "nextSibling" ); 3452 }, 3453 prev: function( elem ) { 3454 return sibling( elem, "previousSibling" ); 3455 }, 3456 nextAll: function( elem ) { 3457 return dir( elem, "nextSibling" ); 3458 }, 3459 prevAll: function( elem ) { 3460 return dir( elem, "previousSibling" ); 3461 }, 3462 nextUntil: function( elem, i, until ) { 3463 return dir( elem, "nextSibling", until ); 3464 }, 3465 prevUntil: function( elem, i, until ) { 3466 return dir( elem, "previousSibling", until ); 3467 }, 3468 siblings: function( elem ) { 3469 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 3470 }, 3471 children: function( elem ) { 3472 return siblings( elem.firstChild ); 3473 }, 3474 contents: function( elem ) { 3475 if ( nodeName( elem, "iframe" ) ) { 3476 return elem.contentDocument; 3477 } 3478 3479 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 3480 // Treat the template element as a regular one in browsers that 3481 // don't support it. 3482 if ( nodeName( elem, "template" ) ) { 3483 elem = elem.content || elem; 3484 } 3485 3486 return jQuery.merge( [], elem.childNodes ); 3487 } 3488}, function( name, fn ) { 3489 jQuery.fn[ name ] = function( until, selector ) { 3490 var matched = jQuery.map( this, fn, until ); 3491 3492 if ( name.slice( -5 ) !== "Until" ) { 3493 selector = until; 3494 } 3495 3496 if ( selector && typeof selector === "string" ) { 3497 matched = jQuery.filter( selector, matched ); 3498 } 3499 3500 if ( this.length > 1 ) { 3501 3502 // Remove duplicates 3503 if ( !guaranteedUnique[ name ] ) { 3504 jQuery.uniqueSort( matched ); 3505 } 3506 3507 // Reverse order for parents* and prev-derivatives 3508 if ( rparentsprev.test( name ) ) { 3509 matched.reverse(); 3510 } 3511 } 3512 3513 return this.pushStack( matched ); 3514 }; 3515} ); 3516var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 3517 3518 3519 3520// Convert String-formatted options into Object-formatted ones 3521function createOptions( options ) { 3522 var object = {}; 3523 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 3524 object[ flag ] = true; 3525 } ); 3526 return object; 3527} 3528 3529/* 3530 * Create a callback list using the following parameters: 3531 * 3532 * options: an optional list of space-separated options that will change how 3533 * the callback list behaves or a more traditional option object 3534 * 3535 * By default a callback list will act like an event callback list and can be 3536 * "fired" multiple times. 3537 * 3538 * Possible options: 3539 * 3540 * once: will ensure the callback list can only be fired once (like a Deferred) 3541 * 3542 * memory: will keep track of previous values and will call any callback added 3543 * after the list has been fired right away with the latest "memorized" 3544 * values (like a Deferred) 3545 * 3546 * unique: will ensure a callback can only be added once (no duplicate in the list) 3547 * 3548 * stopOnFalse: interrupt callings when a callback returns false 3549 * 3550 */ 3551jQuery.Callbacks = function( options ) { 3552 3553 // Convert options from String-formatted to Object-formatted if needed 3554 // (we check in cache first) 3555 options = typeof options === "string" ? 3556 createOptions( options ) : 3557 jQuery.extend( {}, options ); 3558 3559 var // Flag to know if list is currently firing 3560 firing, 3561 3562 // Last fire value for non-forgettable lists 3563 memory, 3564 3565 // Flag to know if list was already fired 3566 fired, 3567 3568 // Flag to prevent firing 3569 locked, 3570 3571 // Actual callback list 3572 list = [], 3573 3574 // Queue of execution data for repeatable lists 3575 queue = [], 3576 3577 // Index of currently firing callback (modified by add/remove as needed) 3578 firingIndex = -1, 3579 3580 // Fire callbacks 3581 fire = function() { 3582 3583 // Enforce single-firing 3584 locked = locked || options.once; 3585 3586 // Execute callbacks for all pending executions, 3587 // respecting firingIndex overrides and runtime changes 3588 fired = firing = true; 3589 for ( ; queue.length; firingIndex = -1 ) { 3590 memory = queue.shift(); 3591 while ( ++firingIndex < list.length ) { 3592 3593 // Run callback and check for early termination 3594 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 3595 options.stopOnFalse ) { 3596 3597 // Jump to end and forget the data so .add doesn't re-fire 3598 firingIndex = list.length; 3599 memory = false; 3600 } 3601 } 3602 } 3603 3604 // Forget the data if we're done with it 3605 if ( !options.memory ) { 3606 memory = false; 3607 } 3608 3609 firing = false; 3610 3611 // Clean up if we're done firing for good 3612 if ( locked ) { 3613 3614 // Keep an empty list if we have data for future add calls 3615 if ( memory ) { 3616 list = []; 3617 3618 // Otherwise, this object is spent 3619 } else { 3620 list = ""; 3621 } 3622 } 3623 }, 3624 3625 // Actual Callbacks object 3626 self = { 3627 3628 // Add a callback or a collection of callbacks to the list 3629 add: function() { 3630 if ( list ) { 3631 3632 // If we have memory from a past run, we should fire after adding 3633 if ( memory && !firing ) { 3634 firingIndex = list.length - 1; 3635 queue.push( memory ); 3636 } 3637 3638 ( function add( args ) { 3639 jQuery.each( args, function( _, arg ) { 3640 if (
vendor: 3,423 bytes, lines 3640-3782
3640jQuery.isFunction( arg ) ) { 3641 if ( !options.unique || !self.has( arg ) ) { 3642 list.push( arg ); 3643 } 3644 } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { 3645 3646 // Inspect recursively 3647 add( arg ); 3648 } 3649 } ); 3650 } )( arguments ); 3651 3652 if ( memory && !firing ) { 3653 fire(); 3654 } 3655 } 3656 return this; 3657 }, 3658 3659 // Remove a callback from the list 3660 remove: function() { 3661 jQuery.each( arguments, function( _, arg ) { 3662 var index; 3663 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 3664 list.splice( index, 1 ); 3665 3666 // Handle firing indexes 3667 if ( index <= firingIndex ) { 3668 firingIndex--; 3669 } 3670 } 3671 } ); 3672 return this; 3673 }, 3674 3675 // Check if a given callback is in the list. 3676 // If no argument is given, return whether or not list has callbacks attached. 3677 has: function( fn ) { 3678 return fn ? 3679 jQuery.inArray( fn, list ) > -1 : 3680 list.length > 0; 3681 }, 3682 3683 // Remove all callbacks from the list 3684 empty: function() { 3685 if ( list ) { 3686 list = []; 3687 } 3688 return this; 3689 }, 3690 3691 // Disable .fire and .add 3692 // Abort any current/pending executions 3693 // Clear all callbacks and values 3694 disable: function() { 3695 locked = queue = []; 3696 list = memory = ""; 3697 return this; 3698 }, 3699 disabled: function() { 3700 return !list; 3701 }, 3702 3703 // Disable .fire 3704 // Also disable .add unless we have memory (since it would have no effect) 3705 // Abort any pending executions 3706 lock: function() { 3707 locked = queue = []; 3708 if ( !memory && !firing ) { 3709 list = memory = ""; 3710 } 3711 return this; 3712 }, 3713 locked: function() { 3714 return !!locked; 3715 }, 3716 3717 // Call all callbacks with the given context and arguments 3718 fireWith: function( context, args ) { 3719 if ( !locked ) { 3720 args = args || []; 3721 args = [ context, args.slice ? args.slice() : args ]; 3722 queue.push( args ); 3723 if ( !firing ) { 3724 fire(); 3725 } 3726 } 3727 return this; 3728 }, 3729 3730 // Call all the callbacks with the given arguments 3731 fire: function() { 3732 self.fireWith( this, arguments ); 3733 return this; 3734 }, 3735 3736 // To know if the callbacks have already been called at least once 3737 fired: function() { 3738 return !!fired; 3739 } 3740 }; 3741 3742 return self; 3743}; 3744 3745 3746function Identity( v ) { 3747 return v; 3748} 3749function Thrower( ex ) { 3750 throw ex; 3751} 3752 3753function adoptValue( value, resolve, reject, noValue ) { 3754 var method; 3755 3756 try { 3757 3758 // Check for promise aspect first to privilege synchronous behavior 3759 if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { 3760 method.call( value ).done( resolve ).fail( reject ); 3761 3762 // Other thenables 3763 } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { 3764 method.call( value, resolve, reject ); 3765 3766 // Other non-thenables 3767 } else { 3768 3769 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 3770 // * false: [ value ].slice( 0 ) => resolve( value ) 3771 // * true: [ value ].slice( 1 ) => resolve() 3772 resolve.apply( undefined, [ value ].slice( noValue ) ); 3773 } 3774 3775 // For Promises/A+, convert exceptions into rejections 3776 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 3777 // Deferred#then to conditionally suppress rejection. 3778 } catch ( value ) { 3779 3780 // Support: Android 4.0 only 3781 // Strict mode functions invoked without .call/.apply get global-object context 3782 reject.apply( undefined, [ value ]
vendor: 9,153 bytes, lines 3782-4107
3782 ); 3783 } 3784} 3785 3786jQuery.extend( { 3787 3788 Deferred: function( func ) { 3789 var tuples = [ 3790 3791 // action, add listener, callbacks, 3792 // ... .then handlers, argument index, [final state] 3793 [ "notify", "progress", jQuery.Callbacks( "memory" ), 3794 jQuery.Callbacks( "memory" ), 2 ], 3795 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 3796 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 3797 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 3798 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 3799 ], 3800 state = "pending", 3801 promise = { 3802 state: function() { 3803 return state; 3804 }, 3805 always: function() { 3806 deferred.done( arguments ).fail( arguments ); 3807 return this; 3808 }, 3809 "catch": function( fn ) { 3810 return promise.then( null, fn ); 3811 }, 3812 3813 // Keep pipe for back-compat 3814 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 3815 var fns = arguments; 3816 3817 return jQuery.Deferred( function( newDefer ) { 3818 jQuery.each( tuples, function( i, tuple ) { 3819 3820 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 3821 var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 3822 3823 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 3824 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 3825 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 3826 deferred[ tuple[ 1 ] ]( function() { 3827 var returned = fn && fn.apply( this, arguments ); 3828 if ( returned && jQuery.isFunction( returned.promise ) ) { 3829 returned.promise() 3830 .progress( newDefer.notify ) 3831 .done( newDefer.resolve ) 3832 .fail( newDefer.reject ); 3833 } else { 3834 newDefer[ tuple[ 0 ] + "With" ]( 3835 this, 3836 fn ? [ returned ] : arguments 3837 ); 3838 } 3839 } ); 3840 } ); 3841 fns = null; 3842 } ).promise(); 3843 }, 3844 then: function( onFulfilled, onRejected, onProgress ) { 3845 var maxDepth = 0; 3846 function resolve( depth, deferred, handler, special ) { 3847 return function() { 3848 var that = this, 3849 args = arguments, 3850 mightThrow = function() { 3851 var returned, then; 3852 3853 // Support: Promises/A+ section 2.3.3.3.3 3854 // https://promisesaplus.com/#point-59 3855 // Ignore double-resolution attempts 3856 if ( depth < maxDepth ) { 3857 return; 3858 } 3859 3860 returned = handler.apply( that, args ); 3861 3862 // Support: Promises/A+ section 2.3.1 3863 // https://promisesaplus.com/#point-48 3864 if ( returned === deferred.promise() ) { 3865 throw new TypeError( "Thenable self-resolution" ); 3866 } 3867 3868 // Support: Promises/A+ sections 2.3.3.1, 3.5 3869 // https://promisesaplus.com/#point-54 3870 // https://promisesaplus.com/#point-75 3871 // Retrieve `then` only once 3872 then = returned && 3873 3874 // Support: Promises/A+ section 2.3.4 3875 // https://promisesaplus.com/#point-64 3876 // Only check objects and functions for thenability 3877 ( typeof returned === "object" || 3878 typeof returned === "function" ) && 3879 returned.then; 3880 3881 // Handle a returned thenable 3882 if ( jQuery.isFunction( then ) ) { 3883 3884 // Special processors (notify) just wait for resolution 3885 if ( special ) { 3886 then.call( 3887 returned, 3888 resolve( maxDepth, deferred, Identity, special ), 3889 resolve( maxDepth, deferred, Thrower, special ) 3890 ); 3891 3892 // Normal processors (resolve) also hook into progress 3893 } else { 3894 3895 // ...and disregard older resolution values 3896 maxDepth++; 3897 3898 then.call( 3899 returned, 3900 resolve( maxDepth, deferred, Identity, special ), 3901 resolve( maxDepth, deferred, Thrower, special ), 3902 resolve( maxDepth, deferred, Identity, 3903 deferred.notifyWith ) 3904 ); 3905 } 3906 3907 // Handle all other returned values 3908 } else { 3909 3910 // Only substitute handlers pass on context 3911 // and multiple values (non-spec behavior) 3912 if ( handler !== Identity ) { 3913 that = undefined; 3914 args = [ returned ]; 3915 } 3916 3917 // Process the value(s) 3918 // Default process is resolve 3919 ( special || deferred.resolveWith )( that, args ); 3920 } 3921 }, 3922 3923 // Only normal processors (resolve) catch and reject exceptions 3924 process = special ? 3925 mightThrow : 3926 function() { 3927 try { 3928 mightThrow(); 3929 } catch ( e ) { 3930 3931 if ( jQuery.Deferred.exceptionHook ) { 3932 jQuery.Deferred.exceptionHook( e, 3933 process.stackTrace ); 3934 } 3935 3936 // Support: Promises/A+ section 2.3.3.3.4.1 3937 // https://promisesaplus.com/#point-61 3938 // Ignore post-resolution exceptions 3939 if ( depth + 1 >= maxDepth ) { 3940 3941 // Only substitute handlers pass on context 3942 // and multiple values (non-spec behavior) 3943 if ( handler !== Thrower ) { 3944 that = undefined; 3945 args = [ e ]; 3946 } 3947 3948 deferred.rejectWith( that, args ); 3949 } 3950 } 3951 }; 3952 3953 // Support: Promises/A+ section 2.3.3.3.1 3954 // https://promisesaplus.com/#point-57 3955 // Re-resolve promises immediately to dodge false rejection from 3956 // subsequent errors 3957 if ( depth ) { 3958 process(); 3959 } else { 3960 3961 // Call an optional hook to record the stack, in case of exception 3962 // since it's otherwise lost when execution goes async 3963 if ( jQuery.Deferred.getStackHook ) { 3964 process.stackTrace = jQuery.Deferred.getStackHook(); 3965 } 3966 window.setTimeout( process ); 3967 } 3968 }; 3969 } 3970 3971 return jQuery.Deferred( function( newDefer ) { 3972 3973 // progress_handlers.add( ... ) 3974 tuples[ 0 ][ 3 ].add( 3975 resolve( 3976 0, 3977 newDefer, 3978 jQuery.isFunction( onProgress ) ? 3979 onProgress : 3980 Identity, 3981 newDefer.notifyWith 3982 ) 3983 ); 3984 3985 // fulfilled_handlers.add( ... ) 3986 tuples[ 1 ][ 3 ].add( 3987 resolve( 3988 0, 3989 newDefer, 3990 jQuery.isFunction( onFulfilled ) ? 3991 onFulfilled : 3992 Identity 3993 ) 3994 ); 3995 3996 // rejected_handlers.add( ... ) 3997 tuples[ 2 ][ 3 ].add( 3998 resolve( 3999 0, 4000 newDefer, 4001 jQuery.isFunction( onRejected ) ? 4002 onRejected : 4003 Thrower 4004 ) 4005 ); 4006 } ).promise(); 4007 }, 4008 4009 // Get a promise for this deferred 4010 // If obj is provided, the promise aspect is added to the object 4011 promise: function( obj ) { 4012 return obj != null ? jQuery.extend( obj, promise ) : promise; 4013 } 4014 }, 4015 deferred = {}; 4016 4017 // Add list-specific methods 4018 jQuery.each( tuples, function( i, tuple ) { 4019 var list = tuple[ 2 ], 4020 stateString = tuple[ 5 ]; 4021 4022 // promise.progress = list.add 4023 // promise.done = list.add 4024 // promise.fail = list.add 4025 promise[ tuple[ 1 ] ] = list.add; 4026 4027 // Handle state 4028 if ( stateString ) { 4029 list.add( 4030 function() { 4031 4032 // state = "resolved" (i.e., fulfilled) 4033 // state = "rejected" 4034 state = stateString; 4035 }, 4036 4037 // rejected_callbacks.disable 4038 // fulfilled_callbacks.disable 4039 tuples[ 3 - i ][ 2 ].disable, 4040 4041 // progress_callbacks.lock 4042 tuples[ 0 ][ 2 ].lock 4043 ); 4044 } 4045 4046 // progress_handlers.fire 4047 // fulfilled_handlers.fire 4048 // rejected_handlers.fire 4049 list.add( tuple[ 3 ].fire ); 4050 4051 // deferred.notify = function() { deferred.notifyWith(...) } 4052 // deferred.resolve = function() { deferred.resolveWith(...) } 4053 // deferred.reject = function() { deferred.rejectWith(...) } 4054 deferred[ tuple[ 0 ] ] = function() { 4055 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 4056 return this; 4057 }; 4058 4059 // deferred.notifyWith = list.fireWith 4060 // deferred.resolveWith = list.fireWith 4061 // deferred.rejectWith = list.fireWith 4062 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 4063 } ); 4064 4065 // Make the deferred a promise 4066 promise.promise( deferred ); 4067 4068 // Call given func if any 4069 if ( func ) { 4070 func.call( deferred, deferred ); 4071 } 4072 4073 // All done! 4074 return deferred; 4075 }, 4076 4077 // Deferred helper 4078 when: function( singleValue ) { 4079 var 4080 4081 // count of uncompleted subordinates 4082 remaining = arguments.length, 4083 4084 // count of unprocessed arguments 4085 i = remaining, 4086 4087 // subordinate fulfillment data 4088 resolveContexts = Array( i ), 4089 resolveValues = slice.call( arguments ), 4090 4091 // the master Deferred 4092 master = jQuery.Deferred(), 4093 4094 // subordinate callback factory 4095 updateFunc = function( i ) { 4096 return function( value ) { 4097 resolveContexts[ i ] = this; 4098 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 4099 if ( !( --remaining ) ) { 4100 master.resolveWith( resolveContexts, resolveValues ); 4101 } 4102 }; 4103 }; 4104 4105 // Single- and empty arguments are adopted like Promise.resolve 4106 if ( remaining <= 1 ) { 4107 adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject
vendor: 2,079 bytes, lines 4107-4195
4107, 4108 !remaining ); 4109 4110 // Use .then() to unwrap secondary thenables (cf. gh-3000) 4111 if ( master.state() === "pending" || 4112 jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 4113 4114 return master.then(); 4115 } 4116 } 4117 4118 // Multiple arguments are aggregated like Promise.all array elements 4119 while ( i-- ) { 4120 adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); 4121 } 4122 4123 return master.promise(); 4124 } 4125} ); 4126 4127 4128// These usually indicate a programmer mistake during development, 4129// warn about them ASAP rather than swallowing them by default. 4130var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 4131 4132jQuery.Deferred.exceptionHook = function( error, stack ) { 4133 4134 // Support: IE 8 - 9 only 4135 // Console exists when dev tools are open, which can happen at any time 4136 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 4137 window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); 4138 } 4139}; 4140 4141 4142 4143 4144jQuery.readyException = function( error ) { 4145 window.setTimeout( function() { 4146 throw error; 4147 } ); 4148}; 4149 4150 4151 4152 4153// The deferred used on DOM ready 4154var readyList = jQuery.Deferred(); 4155 4156jQuery.fn.ready = function( fn ) { 4157 4158 readyList 4159 .then( fn ) 4160 4161 // Wrap jQuery.readyException in a function so that the lookup 4162 // happens at the time of error handling instead of callback 4163 // registration. 4164 .catch( function( error ) { 4165 jQuery.readyException( error ); 4166 } ); 4167 4168 return this; 4169}; 4170 4171jQuery.extend( { 4172 4173 // Is the DOM ready to be used? Set to true once it occurs. 4174 isReady: false, 4175 4176 // A counter to track how many items to wait for before 4177 // the ready event fires. See #6781 4178 readyWait: 1, 4179 4180 // Handle when the DOM is ready 4181 ready: function( wait ) { 4182 4183 // Abort if there are pending holds or we're already ready 4184 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 4185 return; 4186 } 4187 4188 // Remember that the DOM is ready 4189 jQuery.isReady = true; 4190 4191 // If a normal DOM Ready event fired, decrement, and wait if need be 4192 if ( wait !== true && --jQuery.readyWait > 0 ) { 4193 return; 4194 } 4195
vendor: 4,098 bytes, lines 4196-4377
4196 // If there are functions bound, to execute 4197 readyList.resolveWith( document, [ jQuery ] ); 4198 } 4199} ); 4200 4201jQuery.ready.then = readyList.then; 4202 4203// The ready event handler and self cleanup method 4204function completed() { 4205 document.removeEventListener( "DOMContentLoaded", completed ); 4206 window.removeEventListener( "load", completed ); 4207 jQuery.ready(); 4208} 4209 4210// Catch cases where $(document).ready() is called 4211// after the browser event has already occurred. 4212// Support: IE <=9 - 10 only 4213// Older IE sometimes signals "interactive" too soon 4214if ( document.readyState === "complete" || 4215 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 4216 4217 // Handle it asynchronously to allow scripts the opportunity to delay ready 4218 window.setTimeout( jQuery.ready ); 4219 4220} else { 4221 4222 // Use the handy event callback 4223 document.addEventListener( "DOMContentLoaded", completed ); 4224 4225 // A fallback to window.onload, that will always work 4226 window.addEventListener( "load", completed ); 4227} 4228 4229 4230 4231 4232// Multifunctional method to get and set values of a collection 4233// The value/s can optionally be executed if it's a function 4234var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 4235 var i = 0, 4236 len = elems.length, 4237 bulk = key == null; 4238 4239 // Sets many values 4240 if ( jQuery.type( key ) === "object" ) { 4241 chainable = true; 4242 for ( i in key ) { 4243 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 4244 } 4245 4246 // Sets one value 4247 } else if ( value !== undefined ) { 4248 chainable = true; 4249 4250 if ( !jQuery.isFunction( value ) ) { 4251 raw = true; 4252 } 4253 4254 if ( bulk ) { 4255 4256 // Bulk operations run against the entire set 4257 if ( raw ) { 4258 fn.call( elems, value ); 4259 fn = null; 4260 4261 // ...except when executing function values 4262 } else { 4263 bulk = fn; 4264 fn = function( elem, key, value ) { 4265 return bulk.call( jQuery( elem ), value ); 4266 }; 4267 } 4268 } 4269 4270 if ( fn ) { 4271 for ( ; i < len; i++ ) { 4272 fn( 4273 elems[ i ], key, raw ? 4274 value : 4275 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 4276 ); 4277 } 4278 } 4279 } 4280 4281 if ( chainable ) { 4282 return elems; 4283 } 4284 4285 // Gets 4286 if ( bulk ) { 4287 return fn.call( elems ); 4288 } 4289 4290 return len ? fn( elems[ 0 ], key ) : emptyGet; 4291}; 4292var acceptData = function( owner ) { 4293 4294 // Accepts only: 4295 // - Node 4296 // - Node.ELEMENT_NODE 4297 // - Node.DOCUMENT_NODE 4298 // - Object 4299 // - Any 4300 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 4301}; 4302 4303 4304 4305 4306function Data() { 4307 this.expando = jQuery.expando + Data.uid++; 4308} 4309 4310Data.uid = 1; 4311 4312Data.prototype = { 4313 4314 cache: function( owner ) { 4315 4316 // Check if the owner object already has a cache 4317 var value = owner[ this.expando ]; 4318 4319 // If not, create one 4320 if ( !value ) { 4321 value = {}; 4322 4323 // We can accept data for non-element nodes in modern browsers, 4324 // but we should not, see #8335. 4325 // Always return an empty object. 4326 if ( acceptData( owner ) ) { 4327 4328 // If it is a node unlikely to be stringify-ed or looped over 4329 // use plain assignment 4330 if ( owner.nodeType ) { 4331 owner[ this.expando ] = value; 4332 4333 // Otherwise secure it in a non-enumerable property 4334 // configurable must be true to allow the property to be 4335 // deleted when data is removed 4336 } else { 4337 Object.defineProperty( owner, this.expando, { 4338 value: value, 4339 configurable: true 4340 } ); 4341 } 4342 } 4343 } 4344 4345 return value; 4346 }, 4347 set: function( owner, data, value ) { 4348 var prop, 4349 cache = this.cache( owner ); 4350 4351 // Handle: [ owner, key, value ] args 4352 // Always use camelCase key (gh-2257) 4353 if ( typeof data === "string" ) { 4354 cache[ jQuery.camelCase( data ) ] = value; 4355 4356 // Handle: [ owner, { properties } ] args 4357 } else { 4358 4359 // Copy the properties one-by-one to the cache object 4360 for ( prop in data ) { 4361 cache[ jQuery.camelCase( prop ) ] = data[ prop ]; 4362 } 4363 } 4364 return cache; 4365 }, 4366 get: function( owner, key ) { 4367 return key === undefined ? 4368 this.cache( owner ) : 4369 4370 // Always use camelCase key (gh-2257) 4371 owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; 4372 }, 4373 access: function( owner, key, value ) { 4374 4375 // In cases where either: 4376 // 4377 // 1. No key was specified
vendor: 4,593 bytes, lines 4378-4561
4378 // 2. A string key was specified, but no value provided 4379 // 4380 // Take the "read" path and allow the get method to determine 4381 // which value to return, respectively either: 4382 // 4383 // 1. The entire cache object 4384 // 2. The data stored at the key 4385 // 4386 if ( key === undefined || 4387 ( ( key && typeof key === "string" ) && value === undefined ) ) { 4388 4389 return this.get( owner, key ); 4390 } 4391 4392 // When the key is not a string, or both a key and value 4393 // are specified, set or extend (existing objects) with either: 4394 // 4395 // 1. An object of properties 4396 // 2. A key and value 4397 // 4398 this.set( owner, key, value ); 4399 4400 // Since the "set" path can have two possible entry points 4401 // return the expected data based on which path was taken[*] 4402 return value !== undefined ? value : key; 4403 }, 4404 remove: function( owner, key ) { 4405 var i, 4406 cache = owner[ this.expando ]; 4407 4408 if ( cache === undefined ) { 4409 return; 4410 } 4411 4412 if ( key !== undefined ) { 4413 4414 // Support array or space separated string of keys 4415 if ( Array.isArray( key ) ) { 4416 4417 // If key is an array of keys... 4418 // We always set camelCase keys, so remove that. 4419 key = key.map( jQuery.camelCase ); 4420 } else { 4421 key = jQuery.camelCase( key ); 4422 4423 // If a key with the spaces exists, use it. 4424 // Otherwise, create an array by matching non-whitespace 4425 key = key in cache ? 4426 [ key ] : 4427 ( key.match( rnothtmlwhite ) || [] ); 4428 } 4429 4430 i = key.length; 4431 4432 while ( i-- ) { 4433 delete cache[ key[ i ] ]; 4434 } 4435 } 4436 4437 // Remove the expando if there's no more data 4438 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 4439 4440 // Support: Chrome <=35 - 45 4441 // Webkit & Blink performance suffers when deleting properties 4442 // from DOM nodes, so set to undefined instead 4443 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 4444 if ( owner.nodeType ) { 4445 owner[ this.expando ] = undefined; 4446 } else { 4447 delete owner[ this.expando ]; 4448 } 4449 } 4450 }, 4451 hasData: function( owner ) { 4452 var cache = owner[ this.expando ]; 4453 return cache !== undefined && !jQuery.isEmptyObject( cache ); 4454 } 4455}; 4456var dataPriv = new Data(); 4457 4458var dataUser = new Data(); 4459 4460 4461 4462// Implementation Summary 4463// 4464// 1. Enforce API surface and semantic compatibility with 1.9.x branch 4465// 2. Improve the module's maintainability by reducing the storage 4466// paths to a single mechanism. 4467// 3. Use the same single mechanism to support "private" and "user" data. 4468// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 4469// 5. Avoid exposing implementation details on user objects (eg. expando properties) 4470// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 4471 4472var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 4473 rmultiDash = /[A-Z]/g; 4474 4475function getData( data ) { 4476 if ( data === "true" ) { 4477 return true; 4478 } 4479 4480 if ( data === "false" ) { 4481 return false; 4482 } 4483 4484 if ( data === "null" ) { 4485 return null; 4486 } 4487 4488 // Only convert to a number if it doesn't change the string 4489 if ( data === +data + "" ) { 4490 return +data; 4491 } 4492 4493 if ( rbrace.test( data ) ) { 4494 return JSON.parse( data ); 4495 } 4496 4497 return data; 4498} 4499 4500function dataAttr( elem, key, data ) { 4501 var name; 4502 4503 // If nothing was found internally, try to fetch any 4504 // data from the HTML5 data-* attribute 4505 if ( data === undefined && elem.nodeType === 1 ) { 4506 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 4507 data = elem.getAttribute( name ); 4508 4509 if ( typeof data === "string" ) { 4510 try { 4511 data = getData( data ); 4512 } catch ( e ) {} 4513 4514 // Make sure we set the data so it isn't changed later 4515 dataUser.set( elem, key, data ); 4516 } else { 4517 data = undefined; 4518 } 4519 } 4520 return data; 4521} 4522 4523jQuery.extend( { 4524 hasData: function( elem ) { 4525 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 4526 }, 4527 4528 data: function( elem, name, data ) { 4529 return dataUser.access( elem, name, data ); 4530 }, 4531 4532 removeData: function( elem, name ) { 4533 dataUser.remove( elem, name ); 4534 }, 4535 4536 // TODO: Now that all calls to _data and _removeData have been replaced 4537 // with direct calls to dataPriv methods, these can be deprecated. 4538 _data: function( elem, name, data ) { 4539 return dataPriv.access( elem, name, data ); 4540 }, 4541 4542 _removeData: function( elem, name ) { 4543 dataPriv.remove( elem, name ); 4544 } 4545} ); 4546 4547jQuery.fn.extend( { 4548 data: function( key, value ) { 4549 var i, name, data, 4550 elem = this[ 0 ], 4551 attrs = elem && elem.attributes; 4552 4553 // Gets all values 4554 if ( key === undefined ) { 4555 if ( this.length ) { 4556 data = dataUser.get( elem ); 4557 4558 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 4559 i = attrs.length; 4560 while ( i-- ) { 4561
vendor: 7,789 bytes, lines 4562-4884
4562 // Support: IE 11 only 4563 // The attrs elements can be null (#14894) 4564 if ( attrs[ i ] ) { 4565 name = attrs[ i ].name; 4566 if ( name.indexOf( "data-" ) === 0 ) { 4567 name = jQuery.camelCase( name.slice( 5 ) ); 4568 dataAttr( elem, name, data[ name ] ); 4569 } 4570 } 4571 } 4572 dataPriv.set( elem, "hasDataAttrs", true ); 4573 } 4574 } 4575 4576 return data; 4577 } 4578 4579 // Sets multiple values 4580 if ( typeof key === "object" ) { 4581 return this.each( function() { 4582 dataUser.set( this, key ); 4583 } ); 4584 } 4585 4586 return access( this, function( value ) { 4587 var data; 4588 4589 // The calling jQuery object (element matches) is not empty 4590 // (and therefore has an element appears at this[ 0 ]) and the 4591 // `value` parameter was not undefined. An empty jQuery object 4592 // will result in `undefined` for elem = this[ 0 ] which will 4593 // throw an exception if an attempt to read a data cache is made. 4594 if ( elem && value === undefined ) { 4595 4596 // Attempt to get data from the cache 4597 // The key will always be camelCased in Data 4598 data = dataUser.get( elem, key ); 4599 if ( data !== undefined ) { 4600 return data; 4601 } 4602 4603 // Attempt to "discover" the data in 4604 // HTML5 custom data-* attrs 4605 data = dataAttr( elem, key ); 4606 if ( data !== undefined ) { 4607 return data; 4608 } 4609 4610 // We tried really hard, but the data doesn't exist. 4611 return; 4612 } 4613 4614 // Set the data... 4615 this.each( function() { 4616 4617 // We always store the camelCased key 4618 dataUser.set( this, key, value ); 4619 } ); 4620 }, null, value, arguments.length > 1, null, true ); 4621 }, 4622 4623 removeData: function( key ) { 4624 return this.each( function() { 4625 dataUser.remove( this, key ); 4626 } ); 4627 } 4628} ); 4629 4630 4631jQuery.extend( { 4632 queue: function( elem, type, data ) { 4633 var queue; 4634 4635 if ( elem ) { 4636 type = ( type || "fx" ) + "queue"; 4637 queue = dataPriv.get( elem, type ); 4638 4639 // Speed up dequeue by getting out quickly if this is just a lookup 4640 if ( data ) { 4641 if ( !queue || Array.isArray( data ) ) { 4642 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 4643 } else { 4644 queue.push( data ); 4645 } 4646 } 4647 return queue || []; 4648 } 4649 }, 4650 4651 dequeue: function( elem, type ) { 4652 type = type || "fx"; 4653 4654 var queue = jQuery.queue( elem, type ), 4655 startLength = queue.length, 4656 fn = queue.shift(), 4657 hooks = jQuery._queueHooks( elem, type ), 4658 next = function() { 4659 jQuery.dequeue( elem, type ); 4660 }; 4661 4662 // If the fx queue is dequeued, always remove the progress sentinel 4663 if ( fn === "inprogress" ) { 4664 fn = queue.shift(); 4665 startLength--; 4666 } 4667 4668 if ( fn ) { 4669 4670 // Add a progress sentinel to prevent the fx queue from being 4671 // automatically dequeued 4672 if ( type === "fx" ) { 4673 queue.unshift( "inprogress" ); 4674 } 4675 4676 // Clear up the last queue stop function 4677 delete hooks.stop; 4678 fn.call( elem, next, hooks ); 4679 } 4680 4681 if ( !startLength && hooks ) { 4682 hooks.empty.fire(); 4683 } 4684 }, 4685 4686 // Not public - generate a queueHooks object, or return the current one 4687 _queueHooks: function( elem, type ) { 4688 var key = type + "queueHooks"; 4689 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 4690 empty: jQuery.Callbacks( "once memory" ).add( function() { 4691 dataPriv.remove( elem, [ type + "queue", key ] ); 4692 } ) 4693 } ); 4694 } 4695} ); 4696 4697jQuery.fn.extend( { 4698 queue: function( type, data ) { 4699 var setter = 2; 4700 4701 if ( typeof type !== "string" ) { 4702 data = type; 4703 type = "fx"; 4704 setter--; 4705 } 4706 4707 if ( arguments.length < setter ) { 4708 return jQuery.queue( this[ 0 ], type ); 4709 } 4710 4711 return data === undefined ? 4712 this : 4713 this.each( function() { 4714 var queue = jQuery.queue( this, type, data ); 4715 4716 // Ensure a hooks for this queue 4717 jQuery._queueHooks( this, type ); 4718 4719 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 4720 jQuery.dequeue( this, type ); 4721 } 4722 } ); 4723 }, 4724 dequeue: function( type ) { 4725 return this.each( function() { 4726 jQuery.dequeue( this, type ); 4727 } ); 4728 }, 4729 clearQueue: function( type ) { 4730 return this.queue( type || "fx", [] ); 4731 }, 4732 4733 // Get a promise resolved when queues of a certain type 4734 // are emptied (fx is the type by default) 4735 promise: function( type, obj ) { 4736 var tmp, 4737 count = 1, 4738 defer = jQuery.Deferred(), 4739 elements = this, 4740 i = this.length, 4741 resolve = function() { 4742 if ( !( --count ) ) { 4743 defer.resolveWith( elements, [ elements ] ); 4744 } 4745 }; 4746 4747 if ( typeof type !== "string" ) { 4748 obj = type; 4749 type = undefined; 4750 } 4751 type = type || "fx"; 4752 4753 while ( i-- ) { 4754 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 4755 if ( tmp && tmp.empty ) { 4756 count++; 4757 tmp.empty.add( resolve ); 4758 } 4759 } 4760 resolve(); 4761 return defer.promise( obj ); 4762 } 4763} ); 4764var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 4765 4766var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 4767 4768 4769var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 4770 4771var isHiddenWithinTree = function( elem, el ) { 4772 4773 // isHiddenWithinTree might be called from jQuery#filter function; 4774 // in that case, element will be second argument 4775 elem = el || elem; 4776 4777 // Inline style trumps all 4778 return elem.style.display === "none" || 4779 elem.style.display === "" && 4780 4781 // Otherwise, check computed style 4782 // Support: Firefox <=43 - 45 4783 // Disconnected elements can have computed display: none, so first confirm that elem is 4784 // in the document. 4785 jQuery.contains( elem.ownerDocument, elem ) && 4786 4787 jQuery.css( elem, "display" ) === "none"; 4788 }; 4789 4790var swap = function( elem, options, callback, args ) { 4791 var ret, name, 4792 old = {}; 4793 4794 // Remember the old values, and insert the new ones 4795 for ( name in options ) { 4796 old[ name ] = elem.style[ name ]; 4797 elem.style[ name ] = options[ name ]; 4798 } 4799 4800 ret = callback.apply( elem, args || [] ); 4801 4802 // Revert the old values 4803 for ( name in options ) { 4804 elem.style[ name ] = old[ name ]; 4805 } 4806 4807 return ret; 4808}; 4809 4810 4811 4812 4813function adjustCSS( elem, prop, valueParts, tween ) { 4814 var adjusted, 4815 scale = 1, 4816 maxIterations = 20, 4817 currentValue = tween ? 4818 function() { 4819 return tween.cur(); 4820 } : 4821 function() { 4822 return jQuery.css( elem, prop, "" ); 4823 }, 4824 initial = currentValue(), 4825 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 4826 4827 // Starting value computation is required for potential unit mismatches 4828 initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 4829 rcssNum.exec( jQuery.css( elem, prop ) ); 4830 4831 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 4832 4833 // Trust units reported by jQuery.css 4834 unit = unit || initialInUnit[ 3 ]; 4835 4836 // Make sure we update the tween properties later on 4837 valueParts = valueParts || []; 4838 4839 // Iteratively approximate from a nonzero starting point 4840 initialInUnit = +initial || 1; 4841 4842 do { 4843 4844 // If previous iteration zeroed out, double until we get *something*. 4845 // Use string for doubling so we don't accidentally see scale as unchanged below 4846 scale = scale || ".5"; 4847 4848 // Adjust and apply 4849 initialInUnit = initialInUnit / scale; 4850 jQuery.style( elem, prop, initialInUnit + unit ); 4851 4852 // Update scale, tolerating zero or NaN from tween.cur() 4853 // Break the loop if scale is unchanged or perfect, or if we've just had enough. 4854 } while ( 4855 scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations 4856 ); 4857 } 4858 4859 if ( valueParts ) { 4860 initialInUnit = +initialInUnit || +initial || 0; 4861 4862 // Apply relative offset (+=/-=) if specified 4863 adjusted = valueParts[ 1 ] ? 4864 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 4865 +valueParts[ 2 ]; 4866 if ( tween ) { 4867 tween.unit = unit; 4868 tween.start = initialInUnit; 4869 tween.end = adjusted; 4870 } 4871 } 4872 return adjusted; 4873} 4874 4875 4876var defaultDisplayMap = {}; 4877 4878function getDefaultDisplay( elem ) { 4879 var temp, 4880 doc = elem.ownerDocument, 4881 nodeName = elem.nodeName, 4882 display = defaultDisplayMap[ nodeName ]; 4883 4884 if ( display ) {
vendor: 4,001 bytes, lines 4885-5056
4885 return display; 4886 } 4887 4888 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 4889 display = jQuery.css( temp, "display" ); 4890 4891 temp.parentNode.removeChild( temp ); 4892 4893 if ( display === "none" ) { 4894 display = "block"; 4895 } 4896 defaultDisplayMap[ nodeName ] = display; 4897 4898 return display; 4899} 4900 4901function showHide( elements, show ) { 4902 var display, elem, 4903 values = [], 4904 index = 0, 4905 length = elements.length; 4906 4907 // Determine new display value for elements that need to change 4908 for ( ; index < length; index++ ) { 4909 elem = elements[ index ]; 4910 if ( !elem.style ) { 4911 continue; 4912 } 4913 4914 display = elem.style.display; 4915 if ( show ) { 4916 4917 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 4918 // check is required in this first loop unless we have a nonempty display value (either 4919 // inline or about-to-be-restored) 4920 if ( display === "none" ) { 4921 values[ index ] = dataPriv.get( elem, "display" ) || null; 4922 if ( !values[ index ] ) { 4923 elem.style.display = ""; 4924 } 4925 } 4926 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 4927 values[ index ] = getDefaultDisplay( elem ); 4928 } 4929 } else { 4930 if ( display !== "none" ) { 4931 values[ index ] = "none"; 4932 4933 // Remember what we're overwriting 4934 dataPriv.set( elem, "display", display ); 4935 } 4936 } 4937 } 4938 4939 // Set the display of the elements in a second loop to avoid constant reflow 4940 for ( index = 0; index < length; index++ ) { 4941 if ( values[ index ] != null ) { 4942 elements[ index ].style.display = values[ index ]; 4943 } 4944 } 4945 4946 return elements; 4947} 4948 4949jQuery.fn.extend( { 4950 show: function() { 4951 return showHide( this, true ); 4952 }, 4953 hide: function() { 4954 return showHide( this ); 4955 }, 4956 toggle: function( state ) { 4957 if ( typeof state === "boolean" ) { 4958 return state ? this.show() : this.hide(); 4959 } 4960 4961 return this.each( function() { 4962 if ( isHiddenWithinTree( this ) ) { 4963 jQuery( this ).show(); 4964 } else { 4965 jQuery( this ).hide(); 4966 } 4967 } ); 4968 } 4969} ); 4970var rcheckableType = ( /^(?:checkbox|radio)$/i ); 4971 4972var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); 4973 4974var rscriptType = ( /^$|\/(?:java|ecma)script/i ); 4975 4976 4977 4978// We have to close these tags to support XHTML (#13200) 4979var wrapMap = { 4980 4981 // Support: IE <=9 only 4982 option: [ 1, "<select multiple='multiple'>", "</select>" ], 4983 4984 // XHTML parsers do not magically insert elements in the 4985 // same way that tag soup parsers do. So we cannot shorten 4986 // this by omitting <tbody> or other required elements. 4987 thead: [ 1, "<table>", "</table>" ], 4988 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 4989 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 4990 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 4991 4992 _default: [ 0, "", "" ] 4993}; 4994 4995// Support: IE <=9 only 4996wrapMap.optgroup = wrapMap.option; 4997 4998wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 4999wrapMap.th = wrapMap.td; 5000 5001 5002function getAll( context, tag ) { 5003 5004 // Support: IE <=9 - 11 only 5005 // Use typeof to avoid zero-argument method invocation on host objects (#15151) 5006 var ret; 5007 5008 if ( typeof context.getElementsByTagName !== "undefined" ) { 5009 ret = context.getElementsByTagName( tag || "*" ); 5010 5011 } else if ( typeof context.querySelectorAll !== "undefined" ) { 5012 ret = context.querySelectorAll( tag || "*" ); 5013 5014 } else { 5015 ret = []; 5016 } 5017 5018 if ( tag === undefined || tag && nodeName( context, tag ) ) { 5019 return jQuery.merge( [ context ], ret ); 5020 } 5021 5022 return ret; 5023} 5024 5025 5026// Mark scripts as having already been evaluated 5027function setGlobalEval( elems, refElements ) { 5028 var i = 0, 5029 l = elems.length; 5030 5031 for ( ; i < l; i++ ) { 5032 dataPriv.set( 5033 elems[ i ], 5034 "globalEval", 5035 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 5036 ); 5037 } 5038} 5039 5040 5041var rhtml = /<|&#?\w+;/; 5042 5043function buildFragment( elems, context, scripts, selection, ignored ) { 5044 var elem, tmp, tag, wrap, contains, j, 5045 fragment = context.createDocumentFragment(), 5046 nodes = [], 5047 i = 0, 5048 l = elems.length; 5049 5050 for ( ; i < l; i++ ) { 5051 elem = elems[ i ]; 5052 5053 if ( elem || elem === 0 ) { 5054 5055 // Add nodes directly 5056 if ( jQuery.t
vendor: 14,415 bytes, lines 5056-5566
5056ype( elem ) === "object" ) { 5057 5058 // Support: Android <=4.0 only, PhantomJS 1 only 5059 // push.apply(_, arraylike) throws on ancient WebKit 5060 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 5061 5062 // Convert non-html into a text node 5063 } else if ( !rhtml.test( elem ) ) { 5064 nodes.push( context.createTextNode( elem ) ); 5065 5066 // Convert html into DOM nodes 5067 } else { 5068 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 5069 5070 // Deserialize a standard representation 5071 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 5072 wrap = wrapMap[ tag ] || wrapMap._default; 5073 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 5074 5075 // Descend through wrappers to the right content 5076 j = wrap[ 0 ]; 5077 while ( j-- ) { 5078 tmp = tmp.lastChild; 5079 } 5080 5081 // Support: Android <=4.0 only, PhantomJS 1 only 5082 // push.apply(_, arraylike) throws on ancient WebKit 5083 jQuery.merge( nodes, tmp.childNodes ); 5084 5085 // Remember the top-level container 5086 tmp = fragment.firstChild; 5087 5088 // Ensure the created nodes are orphaned (#12392) 5089 tmp.textContent = ""; 5090 } 5091 } 5092 } 5093 5094 // Remove wrapper from fragment 5095 fragment.textContent = ""; 5096 5097 i = 0; 5098 while ( ( elem = nodes[ i++ ] ) ) { 5099 5100 // Skip elements already in the context collection (trac-4087) 5101 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 5102 if ( ignored ) { 5103 ignored.push( elem ); 5104 } 5105 continue; 5106 } 5107 5108 contains = jQuery.contains( elem.ownerDocument, elem ); 5109 5110 // Append to fragment 5111 tmp = getAll( fragment.appendChild( elem ), "script" ); 5112 5113 // Preserve script evaluation history 5114 if ( contains ) { 5115 setGlobalEval( tmp ); 5116 } 5117 5118 // Capture executables 5119 if ( scripts ) { 5120 j = 0; 5121 while ( ( elem = tmp[ j++ ] ) ) { 5122 if ( rscriptType.test( elem.type || "" ) ) { 5123 scripts.push( elem ); 5124 } 5125 } 5126 } 5127 } 5128 5129 return fragment; 5130} 5131 5132 5133( function() { 5134 var fragment = document.createDocumentFragment(), 5135 div = fragment.appendChild( document.createElement( "div" ) ), 5136 input = document.createElement( "input" ); 5137 5138 // Support: Android 4.0 - 4.3 only 5139 // Check state lost if the name is set (#11217) 5140 // Support: Windows Web Apps (WWA) 5141 // `name` and `type` must use .setAttribute for WWA (#14901) 5142 input.setAttribute( "type", "radio" ); 5143 input.setAttribute( "checked", "checked" ); 5144 input.setAttribute( "name", "t" ); 5145 5146 div.appendChild( input ); 5147 5148 // Support: Android <=4.1 only 5149 // Older WebKit doesn't clone checked state correctly in fragments 5150 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 5151 5152 // Support: IE <=11 only 5153 // Make sure textarea (and checkbox) defaultValue is properly cloned 5154 div.innerHTML = "<textarea>x</textarea>"; 5155 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 5156} )(); 5157var documentElement = document.documentElement; 5158 5159 5160 5161var 5162 rkeyEvent = /^key/, 5163 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, 5164 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 5165 5166function returnTrue() { 5167 return true; 5168} 5169 5170function returnFalse() { 5171 return false; 5172} 5173 5174// Support: IE <=9 only 5175// See #13393 for more info 5176function safeActiveElement() { 5177 try { 5178 return document.activeElement; 5179 } catch ( err ) { } 5180} 5181 5182function on( elem, types, selector, data, fn, one ) { 5183 var origFn, type; 5184 5185 // Types can be a map of types/handlers 5186 if ( typeof types === "object" ) { 5187 5188 // ( types-Object, selector, data ) 5189 if ( typeof selector !== "string" ) { 5190 5191 // ( types-Object, data ) 5192 data = data || selector; 5193 selector = undefined; 5194 } 5195 for ( type in types ) { 5196 on( elem, type, selector, data, types[ type ], one ); 5197 } 5198 return elem; 5199 } 5200 5201 if ( data == null && fn == null ) { 5202 5203 // ( types, fn ) 5204 fn = selector; 5205 data = selector = undefined; 5206 } else if ( fn == null ) { 5207 if ( typeof selector === "string" ) { 5208 5209 // ( types, selector, fn ) 5210 fn = data; 5211 data = undefined; 5212 } else { 5213 5214 // ( types, data, fn ) 5215 fn = data; 5216 data = selector; 5217 selector = undefined; 5218 } 5219 } 5220 if ( fn === false ) { 5221 fn = returnFalse; 5222 } else if ( !fn ) { 5223 return elem; 5224 } 5225 5226 if ( one === 1 ) { 5227 origFn = fn; 5228 fn = function( event ) { 5229 5230 // Can use an empty set, since event contains the info 5231 jQuery().off( event ); 5232 return origFn.apply( this, arguments ); 5233 }; 5234 5235 // Use same guid so caller can remove using origFn 5236 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 5237 } 5238 return elem.each( function() { 5239 jQuery.event.add( this, types, fn, data, selector ); 5240 } ); 5241} 5242 5243/* 5244 * Helper functions for managing events -- not part of the public interface. 5245 * Props to Dean Edwards' addEvent library for many of the ideas. 5246 */ 5247jQuery.event = { 5248 5249 global: {}, 5250 5251 add: function( elem, types, handler, data, selector ) { 5252 5253 var handleObjIn, eventHandle, tmp, 5254 events, t, handleObj, 5255 special, handlers, type, namespaces, origType, 5256 elemData = dataPriv.get( elem ); 5257 5258 // Don't attach events to noData or text/comment nodes (but allow plain objects) 5259 if ( !elemData ) { 5260 return; 5261 } 5262 5263 // Caller can pass in an object of custom data in lieu of the handler 5264 if ( handler.handler ) { 5265 handleObjIn = handler; 5266 handler = handleObjIn.handler; 5267 selector = handleObjIn.selector; 5268 } 5269 5270 // Ensure that invalid selectors throw exceptions at attach time 5271 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 5272 if ( selector ) { 5273 jQuery.find.matchesSelector( documentElement, selector ); 5274 } 5275 5276 // Make sure that the handler has a unique ID, used to find/remove it later 5277 if ( !handler.guid ) { 5278 handler.guid = jQuery.guid++; 5279 } 5280 5281 // Init the element's event structure and main handler, if this is the first 5282 if ( !( events = elemData.events ) ) { 5283 events = elemData.events = {}; 5284 } 5285 if ( !( eventHandle = elemData.handle ) ) { 5286 eventHandle = elemData.handle = function( e ) { 5287 5288 // Discard the second event of a jQuery.event.trigger() and 5289 // when an event is called after a page has unloaded 5290 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 5291 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 5292 }; 5293 } 5294 5295 // Handle multiple events separated by a space 5296 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5297 t = types.length; 5298 while ( t-- ) { 5299 tmp = rtypenamespace.exec( types[ t ] ) || []; 5300 type = origType = tmp[ 1 ]; 5301 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5302 5303 // There *must* be a type, no attaching namespace-only handlers 5304 if ( !type ) { 5305 continue; 5306 } 5307 5308 // If event changes its type, use the special event handlers for the changed type 5309 special = jQuery.event.special[ type ] || {}; 5310 5311 // If selector defined, determine special event api type, otherwise given type 5312 type = ( selector ? special.delegateType : special.bindType ) || type; 5313 5314 // Update special based on newly reset type 5315 special = jQuery.event.special[ type ] || {}; 5316 5317 // handleObj is passed to all event handlers 5318 handleObj = jQuery.extend( { 5319 type: type, 5320 origType: origType, 5321 data: data, 5322 handler: handler, 5323 guid: handler.guid, 5324 selector: selector, 5325 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 5326 namespace: namespaces.join( "." ) 5327 }, handleObjIn ); 5328 5329 // Init the event handler queue if we're the first 5330 if ( !( handlers = events[ type ] ) ) { 5331 handlers = events[ type ] = []; 5332 handlers.delegateCount = 0; 5333 5334 // Only use addEventListener if the special events handler returns false 5335 if ( !special.setup || 5336 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 5337 5338 if ( elem.addEventListener ) { 5339 elem.addEventListener( type, eventHandle ); 5340 } 5341 } 5342 } 5343 5344 if ( special.add ) { 5345 special.add.call( elem, handleObj ); 5346 5347 if ( !handleObj.handler.guid ) { 5348 handleObj.handler.guid = handler.guid; 5349 } 5350 } 5351 5352 // Add to the element's handler list, delegates in front 5353 if ( selector ) { 5354 handlers.splice( handlers.delegateCount++, 0, handleObj ); 5355 } else { 5356 handlers.push( handleObj ); 5357 } 5358 5359 // Keep track of which events have ever been used, for event optimization 5360 jQuery.event.global[ type ] = true; 5361 } 5362 5363 }, 5364 5365 // Detach an event or set of events from an element 5366 remove: function( elem, types, handler, selector, mappedTypes ) { 5367 5368 var j, origCount, tmp, 5369 events, t, handleObj, 5370 special, handlers, type, namespaces, origType, 5371 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 5372 5373 if ( !elemData || !( events = elemData.events ) ) { 5374 return; 5375 } 5376 5377 // Once for each type.namespace in types; type may be omitted 5378 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5379 t = types.length; 5380 while ( t-- ) { 5381 tmp = rtypenamespace.exec( types[ t ] ) || []; 5382 type = origType = tmp[ 1 ]; 5383 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5384 5385 // Unbind all events (on this namespace, if provided) for the element 5386 if ( !type ) { 5387 for ( type in events ) { 5388 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 5389 } 5390 continue; 5391 } 5392 5393 special = jQuery.event.special[ type ] || {}; 5394 type = ( selector ? special.delegateType : special.bindType ) || type; 5395 handlers = events[ type ] || []; 5396 tmp = tmp[ 2 ] && 5397 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 5398 5399 // Remove matching events 5400 origCount = j = handlers.length; 5401 while ( j-- ) { 5402 handleObj = handlers[ j ]; 5403 5404 if ( ( mappedTypes || origType === handleObj.origType ) && 5405 ( !handler || handler.guid === handleObj.guid ) && 5406 ( !tmp || tmp.test( handleObj.namespace ) ) && 5407 ( !selector || selector === handleObj.selector || 5408 selector === "**" && handleObj.selector ) ) { 5409 handlers.splice( j, 1 ); 5410 5411 if ( handleObj.selector ) { 5412 handlers.delegateCount--; 5413 } 5414 if ( special.remove ) { 5415 special.remove.call( elem, handleObj ); 5416 } 5417 } 5418 } 5419 5420 // Remove generic event handler if we removed something and no more handlers exist 5421 // (avoids potential for endless recursion during removal of special event handlers) 5422 if ( origCount && !handlers.length ) { 5423 if ( !special.teardown || 5424 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 5425 5426 jQuery.removeEvent( elem, type, elemData.handle ); 5427 } 5428 5429 delete events[ type ]; 5430 } 5431 } 5432 5433 // Remove data and the expando if it's no longer used 5434 if ( jQuery.isEmptyObject( events ) ) { 5435 dataPriv.remove( elem, "handle events" ); 5436 } 5437 }, 5438 5439 dispatch: function( nativeEvent ) { 5440 5441 // Make a writable jQuery.Event from the native event object 5442 var event = jQuery.event.fix( nativeEvent ); 5443 5444 var i, j, ret, matched, handleObj, handlerQueue, 5445 args = new Array( arguments.length ), 5446 handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], 5447 special = jQuery.event.special[ event.type ] || {}; 5448 5449 // Use the fix-ed jQuery.Event rather than the (read-only) native event 5450 args[ 0 ] = event; 5451 5452 for ( i = 1; i < arguments.length; i++ ) { 5453 args[ i ] = arguments[ i ]; 5454 } 5455 5456 event.delegateTarget = this; 5457 5458 // Call the preDispatch hook for the mapped type, and let it bail if desired 5459 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 5460 return; 5461 } 5462 5463 // Determine handlers 5464 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 5465 5466 // Run delegates first; they may want to stop propagation beneath us 5467 i = 0; 5468 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 5469 event.currentTarget = matched.elem; 5470 5471 j = 0; 5472 while ( ( handleObj = matched.handlers[ j++ ] ) && 5473 !event.isImmediatePropagationStopped() ) { 5474 5475 // Triggered event must either 1) have no namespace, or 2) have namespace(s) 5476 // a subset or equal to those in the bound event (both can have no namespace). 5477 if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { 5478 5479 event.handleObj = handleObj; 5480 event.data = handleObj.data; 5481 5482 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 5483 handleObj.handler ).apply( matched.elem, args ); 5484 5485 if ( ret !== undefined ) { 5486 if ( ( event.result = ret ) === false ) { 5487 event.preventDefault(); 5488 event.stopPropagation(); 5489 } 5490 } 5491 } 5492 } 5493 } 5494 5495 // Call the postDispatch hook for the mapped type 5496 if ( special.postDispatch ) { 5497 special.postDispatch.call( this, event ); 5498 } 5499 5500 return event.result; 5501 }, 5502 5503 handlers: function( event, handlers ) { 5504 var i, handleObj, sel, matchedHandlers, matchedSelectors, 5505 handlerQueue = [], 5506 delegateCount = handlers.delegateCount, 5507 cur = event.target; 5508 5509 // Find delegate handlers 5510 if ( delegateCount && 5511 5512 // Support: IE <=9 5513 // Black-hole SVG <use> instance trees (trac-13180) 5514 cur.nodeType && 5515 5516 // Support: Firefox <=42 5517 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 5518 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 5519 // Support: IE 11 only 5520 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 5521 !( event.type === "click" && event.button >= 1 ) ) { 5522 5523 for ( ; cur !== this; cur = cur.parentNode || this ) { 5524 5525 // Don't check non-elements (#13208) 5526 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 5527 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 5528 matchedHandlers = []; 5529 matchedSelectors = {}; 5530 for ( i = 0; i < delegateCount; i++ ) { 5531 handleObj = handlers[ i ]; 5532 5533 // Don't conflict with Object.prototype properties (#13203) 5534 sel = handleObj.selector + " "; 5535 5536 if ( matchedSelectors[ sel ] === undefined ) { 5537 matchedSelectors[ sel ] = handleObj.needsContext ? 5538 jQuery( sel, this ).index( cur ) > -1 : 5539 jQuery.find( sel, this, null, [ cur ] ).length; 5540 } 5541 if ( matchedSelectors[ sel ] ) { 5542 matchedHandlers.push( handleObj ); 5543 } 5544 } 5545 if ( matchedHandlers.length ) { 5546 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 5547 } 5548 } 5549 } 5550 } 5551 5552 // Add the remaining (directly-bound) handlers 5553 cur = this; 5554 if ( delegateCount < handlers.length ) { 5555 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 5556 } 5557 5558 return handlerQueue; 5559 }, 5560 5561 addProp: function( name, hook ) { 5562 Object.defineProperty( jQuery.Event.prototype, name, { 5563 enumerable: true, 5564 configurable: true, 5565 5566 get:
vendor: 8,400 bytes, lines 5566-5915
5566jQuery.isFunction( hook ) ? 5567 function() { 5568 if ( this.originalEvent ) { 5569 return hook( this.originalEvent ); 5570 } 5571 } : 5572 function() { 5573 if ( this.originalEvent ) { 5574 return this.originalEvent[ name ]; 5575 } 5576 }, 5577 5578 set: function( value ) { 5579 Object.defineProperty( this, name, { 5580 enumerable: true, 5581 configurable: true, 5582 writable: true, 5583 value: value 5584 } ); 5585 } 5586 } ); 5587 }, 5588 5589 fix: function( originalEvent ) { 5590 return originalEvent[ jQuery.expando ] ? 5591 originalEvent : 5592 new jQuery.Event( originalEvent ); 5593 }, 5594 5595 special: { 5596 load: { 5597 5598 // Prevent triggered image.load events from bubbling to window.load 5599 noBubble: true 5600 }, 5601 focus: { 5602 5603 // Fire native event if possible so blur/focus sequence is correct 5604 trigger: function() { 5605 if ( this !== safeActiveElement() && this.focus ) { 5606 this.focus(); 5607 return false; 5608 } 5609 }, 5610 delegateType: "focusin" 5611 }, 5612 blur: { 5613 trigger: function() { 5614 if ( this === safeActiveElement() && this.blur ) { 5615 this.blur(); 5616 return false; 5617 } 5618 }, 5619 delegateType: "focusout" 5620 }, 5621 click: { 5622 5623 // For checkbox, fire native event so checked state will be right 5624 trigger: function() { 5625 if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { 5626 this.click(); 5627 return false; 5628 } 5629 }, 5630 5631 // For cross-browser consistency, don't fire native .click() on links 5632 _default: function( event ) { 5633 return nodeName( event.target, "a" ); 5634 } 5635 }, 5636 5637 beforeunload: { 5638 postDispatch: function( event ) { 5639 5640 // Support: Firefox 20+ 5641 // Firefox doesn't alert if the returnValue field is not set. 5642 if ( event.result !== undefined && event.originalEvent ) { 5643 event.originalEvent.returnValue = event.result; 5644 } 5645 } 5646 } 5647 } 5648}; 5649 5650jQuery.removeEvent = function( elem, type, handle ) { 5651 5652 // This "if" is needed for plain objects 5653 if ( elem.removeEventListener ) { 5654 elem.removeEventListener( type, handle ); 5655 } 5656}; 5657 5658jQuery.Event = function( src, props ) { 5659 5660 // Allow instantiation without the 'new' keyword 5661 if ( !( this instanceof jQuery.Event ) ) { 5662 return new jQuery.Event( src, props ); 5663 } 5664 5665 // Event object 5666 if ( src && src.type ) { 5667 this.originalEvent = src; 5668 this.type = src.type; 5669 5670 // Events bubbling up the document may have been marked as prevented 5671 // by a handler lower down the tree; reflect the correct value. 5672 this.isDefaultPrevented = src.defaultPrevented || 5673 src.defaultPrevented === undefined && 5674 5675 // Support: Android <=2.3 only 5676 src.returnValue === false ? 5677 returnTrue : 5678 returnFalse; 5679 5680 // Create target properties 5681 // Support: Safari <=6 - 7 only 5682 // Target should not be a text node (#504, #13143) 5683 this.target = ( src.target && src.target.nodeType === 3 ) ? 5684 src.target.parentNode : 5685 src.target; 5686 5687 this.currentTarget = src.currentTarget; 5688 this.relatedTarget = src.relatedTarget; 5689 5690 // Event type 5691 } else { 5692 this.type = src; 5693 } 5694 5695 // Put explicitly provided properties onto the event object 5696 if ( props ) { 5697 jQuery.extend( this, props ); 5698 } 5699 5700 // Create a timestamp if incoming event doesn't have one 5701 this.timeStamp = src && src.timeStamp || jQuery.now(); 5702 5703 // Mark it as fixed 5704 this[ jQuery.expando ] = true; 5705}; 5706 5707// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 5708// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 5709jQuery.Event.prototype = { 5710 constructor: jQuery.Event, 5711 isDefaultPrevented: returnFalse, 5712 isPropagationStopped: returnFalse, 5713 isImmediatePropagationStopped: returnFalse, 5714 isSimulated: false, 5715 5716 preventDefault: function() { 5717 var e = this.originalEvent; 5718 5719 this.isDefaultPrevented = returnTrue; 5720 5721 if ( e && !this.isSimulated ) { 5722 e.preventDefault(); 5723 } 5724 }, 5725 stopPropagation: function() { 5726 var e = this.originalEvent; 5727 5728 this.isPropagationStopped = returnTrue; 5729 5730 if ( e && !this.isSimulated ) { 5731 e.stopPropagation(); 5732 } 5733 }, 5734 stopImmediatePropagation: function() { 5735 var e = this.originalEvent; 5736 5737 this.isImmediatePropagationStopped = returnTrue; 5738 5739 if ( e && !this.isSimulated ) { 5740 e.stopImmediatePropagation(); 5741 } 5742 5743 this.stopPropagation(); 5744 } 5745}; 5746 5747// Includes all common event props including KeyEvent and MouseEvent specific props 5748jQuery.each( { 5749 altKey: true, 5750 bubbles: true, 5751 cancelable: true, 5752 changedTouches: true, 5753 ctrlKey: true, 5754 detail: true, 5755 eventPhase: true, 5756 metaKey: true, 5757 pageX: true, 5758 pageY: true, 5759 shiftKey: true, 5760 view: true, 5761 "char": true, 5762 charCode: true, 5763 key: true, 5764 keyCode: true, 5765 button: true, 5766 buttons: true, 5767 clientX: true, 5768 clientY: true, 5769 offsetX: true, 5770 offsetY: true, 5771 pointerId: true, 5772 pointerType: true, 5773 screenX: true, 5774 screenY: true, 5775 targetTouches: true, 5776 toElement: true, 5777 touches: true, 5778 5779 which: function( event ) { 5780 var button = event.button; 5781 5782 // Add which for key events 5783 if ( event.which == null && rkeyEvent.test( event.type ) ) { 5784 return event.charCode != null ? event.charCode : event.keyCode; 5785 } 5786 5787 // Add which for click: 1 === left; 2 === middle; 3 === right 5788 if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { 5789 if ( button & 1 ) { 5790 return 1; 5791 } 5792 5793 if ( button & 2 ) { 5794 return 3; 5795 } 5796 5797 if ( button & 4 ) { 5798 return 2; 5799 } 5800 5801 return 0; 5802 } 5803 5804 return event.which; 5805 } 5806}, jQuery.event.addProp ); 5807 5808// Create mouseenter/leave events using mouseover/out and event-time checks 5809// so that event delegation works in jQuery. 5810// Do the same for pointerenter/pointerleave and pointerover/pointerout 5811// 5812// Support: Safari 7 only 5813// Safari sends mouseenter too often; see: 5814// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 5815// for the description of the bug (it existed in older Chrome versions as well). 5816jQuery.each( { 5817 mouseenter: "mouseover", 5818 mouseleave: "mouseout", 5819 pointerenter: "pointerover", 5820 pointerleave: "pointerout" 5821}, function( orig, fix ) { 5822 jQuery.event.special[ orig ] = { 5823 delegateType: fix, 5824 bindType: fix, 5825 5826 handle: function( event ) { 5827 var ret, 5828 target = this, 5829 related = event.relatedTarget, 5830 handleObj = event.handleObj; 5831 5832 // For mouseenter/leave call the handler if related is outside the target. 5833 // NB: No relatedTarget if the mouse left/entered the browser window 5834 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 5835 event.type = handleObj.origType; 5836 ret = handleObj.handler.apply( this, arguments ); 5837 event.type = fix; 5838 } 5839 return ret; 5840 } 5841 }; 5842} ); 5843 5844jQuery.fn.extend( { 5845 5846 on: function( types, selector, data, fn ) { 5847 return on( this, types, selector, data, fn ); 5848 }, 5849 one: function( types, selector, data, fn ) { 5850 return on( this, types, selector, data, fn, 1 ); 5851 }, 5852 off: function( types, selector, fn ) { 5853 var handleObj, type; 5854 if ( types && types.preventDefault && types.handleObj ) { 5855 5856 // ( event ) dispatched jQuery.Event 5857 handleObj = types.handleObj; 5858 jQuery( types.delegateTarget ).off( 5859 handleObj.namespace ? 5860 handleObj.origType + "." + handleObj.namespace : 5861 handleObj.origType, 5862 handleObj.selector, 5863 handleObj.handler 5864 ); 5865 return this; 5866 } 5867 if ( typeof types === "object" ) { 5868 5869 // ( types-object [, selector] ) 5870 for ( type in types ) { 5871 this.off( type, selector, types[ type ] ); 5872 } 5873 return this; 5874 } 5875 if ( selector === false || typeof selector === "function" ) { 5876 5877 // ( types [, fn] ) 5878 fn = selector; 5879 selector = undefined; 5880 } 5881 if ( fn === false ) { 5882 fn = returnFalse; 5883 } 5884 return this.each( function() { 5885 jQuery.event.remove( this, types, fn, selector ); 5886 } ); 5887 } 5888} ); 5889 5890 5891var 5892 5893 /* eslint-disable max-len */ 5894 5895 // See https://github.com/eslint/eslint/issues/3229 5896 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, 5897 5898 /* eslint-enable */ 5899 5900 // Support: IE <=10 - 11, Edge 12 - 13 5901 // In IE/Edge using regex groups here causes severe slowdowns. 5902 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 5903 rnoInnerhtml = /<script|<style|<link/i, 5904 5905 // checked="checked" or checked 5906 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5907 rscriptTypeMasked = /^true\/(.*)/, 5908 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; 5909 5910// Prefer a tbody over its parent table for containing new rows 5911function manipulationTarget( elem, content ) { 5912 if ( nodeName( elem, "table" ) && 5913 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 5914 5915 return jQuery( ">tbody", elem
vendor: 6,531 bytes, lines 5915-6163
5915 )[ 0 ] || elem; 5916 } 5917 5918 return elem; 5919} 5920 5921// Replace/restore the type attribute of script elements for safe DOM manipulation 5922function disableScript( elem ) { 5923 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 5924 return elem; 5925} 5926function restoreScript( elem ) { 5927 var match = rscriptTypeMasked.exec( elem.type ); 5928 5929 if ( match ) { 5930 elem.type = match[ 1 ]; 5931 } else { 5932 elem.removeAttribute( "type" ); 5933 } 5934 5935 return elem; 5936} 5937 5938function cloneCopyEvent( src, dest ) { 5939 var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; 5940 5941 if ( dest.nodeType !== 1 ) { 5942 return; 5943 } 5944 5945 // 1. Copy private data: events, handlers, etc. 5946 if ( dataPriv.hasData( src ) ) { 5947 pdataOld = dataPriv.access( src ); 5948 pdataCur = dataPriv.set( dest, pdataOld ); 5949 events = pdataOld.events; 5950 5951 if ( events ) { 5952 delete pdataCur.handle; 5953 pdataCur.events = {}; 5954 5955 for ( type in events ) { 5956 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 5957 jQuery.event.add( dest, type, events[ type ][ i ] ); 5958 } 5959 } 5960 } 5961 } 5962 5963 // 2. Copy user data 5964 if ( dataUser.hasData( src ) ) { 5965 udataOld = dataUser.access( src ); 5966 udataCur = jQuery.extend( {}, udataOld ); 5967 5968 dataUser.set( dest, udataCur ); 5969 } 5970} 5971 5972// Fix IE bugs, see support tests 5973function fixInput( src, dest ) { 5974 var nodeName = dest.nodeName.toLowerCase(); 5975 5976 // Fails to persist the checked state of a cloned checkbox or radio button. 5977 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 5978 dest.checked = src.checked; 5979 5980 // Fails to return the selected option to the default selected state when cloning options 5981 } else if ( nodeName === "input" || nodeName === "textarea" ) { 5982 dest.defaultValue = src.defaultValue; 5983 } 5984} 5985 5986function domManip( collection, args, callback, ignored ) { 5987 5988 // Flatten any nested arrays 5989 args = concat.apply( [], args ); 5990 5991 var fragment, first, scripts, hasScripts, node, doc, 5992 i = 0, 5993 l = collection.length, 5994 iNoClone = l - 1, 5995 value = args[ 0 ], 5996 isFunction = jQuery.isFunction( value ); 5997 5998 // We can't cloneNode fragments that contain checked, in WebKit 5999 if ( isFunction || 6000 ( l > 1 && typeof value === "string" && 6001 !support.checkClone && rchecked.test( value ) ) ) { 6002 return collection.each( function( index ) { 6003 var self = collection.eq( index ); 6004 if ( isFunction ) { 6005 args[ 0 ] = value.call( this, index, self.html() ); 6006 } 6007 domManip( self, args, callback, ignored ); 6008 } ); 6009 } 6010 6011 if ( l ) { 6012 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 6013 first = fragment.firstChild; 6014 6015 if ( fragment.childNodes.length === 1 ) { 6016 fragment = first; 6017 } 6018 6019 // Require either new content or an interest in ignored elements to invoke the callback 6020 if ( first || ignored ) { 6021 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 6022 hasScripts = scripts.length; 6023 6024 // Use the original fragment for the last item 6025 // instead of the first because it can end up 6026 // being emptied incorrectly in certain situations (#8070). 6027 for ( ; i < l; i++ ) { 6028 node = fragment; 6029 6030 if ( i !== iNoClone ) { 6031 node = jQuery.clone( node, true, true ); 6032 6033 // Keep references to cloned scripts for later restoration 6034 if ( hasScripts ) { 6035 6036 // Support: Android <=4.0 only, PhantomJS 1 only 6037 // push.apply(_, arraylike) throws on ancient WebKit 6038 jQuery.merge( scripts, getAll( node, "script" ) ); 6039 } 6040 } 6041 6042 callback.call( collection[ i ], node, i ); 6043 } 6044 6045 if ( hasScripts ) { 6046 doc = scripts[ scripts.length - 1 ].ownerDocument; 6047 6048 // Reenable scripts 6049 jQuery.map( scripts, restoreScript ); 6050 6051 // Evaluate executable scripts on first document insertion 6052 for ( i = 0; i < hasScripts; i++ ) { 6053 node = scripts[ i ]; 6054 if ( rscriptType.test( node.type || "" ) && 6055 !dataPriv.access( node, "globalEval" ) && 6056 jQuery.contains( doc, node ) ) { 6057 6058 if ( node.src ) { 6059 6060 // Optional AJAX dependency, but won't run scripts if not present 6061 if ( jQuery._evalUrl ) { 6062 jQuery._evalUrl( node.src ); 6063 } 6064 } else { 6065 DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); 6066 } 6067 } 6068 } 6069 } 6070 } 6071 } 6072 6073 return collection; 6074} 6075 6076function remove( elem, selector, keepData ) { 6077 var node, 6078 nodes = selector ? jQuery.filter( selector, elem ) : elem, 6079 i = 0; 6080 6081 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 6082 if ( !keepData && node.nodeType === 1 ) { 6083 jQuery.cleanData( getAll( node ) ); 6084 } 6085 6086 if ( node.parentNode ) { 6087 if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { 6088 setGlobalEval( getAll( node, "script" ) ); 6089 } 6090 node.parentNode.removeChild( node ); 6091 } 6092 } 6093 6094 return elem; 6095} 6096 6097jQuery.extend( { 6098 htmlPrefilter: function( html ) { 6099 return html.replace( rxhtmlTag, "<$1></$2>" ); 6100 }, 6101 6102 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 6103 var i, l, srcElements, destElements, 6104 clone = elem.cloneNode( true ), 6105 inPage = jQuery.contains( elem.ownerDocument, elem ); 6106 6107 // Fix IE cloning issues 6108 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 6109 !jQuery.isXMLDoc( elem ) ) { 6110 6111 // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 6112 destElements = getAll( clone ); 6113 srcElements = getAll( elem ); 6114 6115 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6116 fixInput( srcElements[ i ], destElements[ i ] ); 6117 } 6118 } 6119 6120 // Copy the events from the original to the clone 6121 if ( dataAndEvents ) { 6122 if ( deepDataAndEvents ) { 6123 srcElements = srcElements || getAll( elem ); 6124 destElements = destElements || getAll( clone ); 6125 6126 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6127 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 6128 } 6129 } else { 6130 cloneCopyEvent( elem, clone ); 6131 } 6132 } 6133 6134 // Preserve script evaluation history 6135 destElements = getAll( clone, "script" ); 6136 if ( destElements.length > 0 ) { 6137 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 6138 } 6139 6140 // Return the cloned set 6141 return clone; 6142 }, 6143 6144 cleanData: function( elems ) { 6145 var data, elem, type, 6146 special = jQuery.event.special, 6147 i = 0; 6148 6149 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 6150 if ( acceptData( elem ) ) { 6151 if ( ( data = elem[ dataPriv.expando ] ) ) { 6152 if ( data.events ) { 6153 for ( type in data.events ) { 6154 if ( special[ type ] ) { 6155 jQuery.event.remove( elem, type ); 6156 6157 // This is a shortcut to avoid jQuery.event.remove's overhead 6158 } else { 6159 jQuery.removeEvent( elem, type, data.handle ); 6160 } 6161 } 6162 } 6163
vendor: 1,119 bytes, lines 6164-6208
6164 // Support: Chrome <=35 - 45+ 6165 // Assign undefined instead of using delete, see Data#remove 6166 elem[ dataPriv.expando ] = undefined; 6167 } 6168 if ( elem[ dataUser.expando ] ) { 6169 6170 // Support: Chrome <=35 - 45+ 6171 // Assign undefined instead of using delete, see Data#remove 6172 elem[ dataUser.expando ] = undefined; 6173 } 6174 } 6175 } 6176 } 6177} ); 6178 6179jQuery.fn.extend( { 6180 detach: function( selector ) { 6181 return remove( this, selector, true ); 6182 }, 6183 6184 remove: function( selector ) { 6185 return remove( this, selector ); 6186 }, 6187 6188 text: function( value ) { 6189 return access( this, function( value ) { 6190 return value === undefined ? 6191 jQuery.text( this ) : 6192 this.empty().each( function() { 6193 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6194 this.textContent = value; 6195 } 6196 } ); 6197 }, null, value, arguments.length ); 6198 }, 6199 6200 append: function() { 6201 return domManip( this, arguments, function( elem ) { 6202 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6203 var target = manipulationTarget( this, elem ); 6204 target.appendChild( elem ); 6205 } 6206 } ); 6207 }, 6208
vendor: 6,076 bytes, lines 6209-6444
6209 prepend: function() { 6210 return domManip( this, arguments, function( elem ) { 6211 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6212 var target = manipulationTarget( this, elem ); 6213 target.insertBefore( elem, target.firstChild ); 6214 } 6215 } ); 6216 }, 6217 6218 before: function() { 6219 return domManip( this, arguments, function( elem ) { 6220 if ( this.parentNode ) { 6221 this.parentNode.insertBefore( elem, this ); 6222 } 6223 } ); 6224 }, 6225 6226 after: function() { 6227 return domManip( this, arguments, function( elem ) { 6228 if ( this.parentNode ) { 6229 this.parentNode.insertBefore( elem, this.nextSibling ); 6230 } 6231 } ); 6232 }, 6233 6234 empty: function() { 6235 var elem, 6236 i = 0; 6237 6238 for ( ; ( elem = this[ i ] ) != null; i++ ) { 6239 if ( elem.nodeType === 1 ) { 6240 6241 // Prevent memory leaks 6242 jQuery.cleanData( getAll( elem, false ) ); 6243 6244 // Remove any remaining nodes 6245 elem.textContent = ""; 6246 } 6247 } 6248 6249 return this; 6250 }, 6251 6252 clone: function( dataAndEvents, deepDataAndEvents ) { 6253 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 6254 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 6255 6256 return this.map( function() { 6257 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 6258 } ); 6259 }, 6260 6261 html: function( value ) { 6262 return access( this, function( value ) { 6263 var elem = this[ 0 ] || {}, 6264 i = 0, 6265 l = this.length; 6266 6267 if ( value === undefined && elem.nodeType === 1 ) { 6268 return elem.innerHTML; 6269 } 6270 6271 // See if we can take a shortcut and just use innerHTML 6272 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 6273 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 6274 6275 value = jQuery.htmlPrefilter( value ); 6276 6277 try { 6278 for ( ; i < l; i++ ) { 6279 elem = this[ i ] || {}; 6280 6281 // Remove element nodes and prevent memory leaks 6282 if ( elem.nodeType === 1 ) { 6283 jQuery.cleanData( getAll( elem, false ) ); 6284 elem.innerHTML = value; 6285 } 6286 } 6287 6288 elem = 0; 6289 6290 // If using innerHTML throws an exception, use the fallback method 6291 } catch ( e ) {} 6292 } 6293 6294 if ( elem ) { 6295 this.empty().append( value ); 6296 } 6297 }, null, value, arguments.length ); 6298 }, 6299 6300 replaceWith: function() { 6301 var ignored = []; 6302 6303 // Make the changes, replacing each non-ignored context element with the new content 6304 return domManip( this, arguments, function( elem ) { 6305 var parent = this.parentNode; 6306 6307 if ( jQuery.inArray( this, ignored ) < 0 ) { 6308 jQuery.cleanData( getAll( this ) ); 6309 if ( parent ) { 6310 parent.replaceChild( elem, this ); 6311 } 6312 } 6313 6314 // Force callback invocation 6315 }, ignored ); 6316 } 6317} ); 6318 6319jQuery.each( { 6320 appendTo: "append", 6321 prependTo: "prepend", 6322 insertBefore: "before", 6323 insertAfter: "after", 6324 replaceAll: "replaceWith" 6325}, function( name, original ) { 6326 jQuery.fn[ name ] = function( selector ) { 6327 var elems, 6328 ret = [], 6329 insert = jQuery( selector ), 6330 last = insert.length - 1, 6331 i = 0; 6332 6333 for ( ; i <= last; i++ ) { 6334 elems = i === last ? this : this.clone( true ); 6335 jQuery( insert[ i ] )[ original ]( elems ); 6336 6337 // Support: Android <=4.0 only, PhantomJS 1 only 6338 // .get() because push.apply(_, arraylike) throws on ancient WebKit 6339 push.apply( ret, elems.get() ); 6340 } 6341 6342 return this.pushStack( ret ); 6343 }; 6344} ); 6345var rmargin = ( /^margin/ ); 6346 6347var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 6348 6349var getStyles = function( elem ) { 6350 6351 // Support: IE <=11 only, Firefox <=30 (#15098, #14150) 6352 // IE throws on elements created in popups 6353 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 6354 var view = elem.ownerDocument.defaultView; 6355 6356 if ( !view || !view.opener ) { 6357 view = window; 6358 } 6359 6360 return view.getComputedStyle( elem ); 6361 }; 6362 6363 6364 6365( function() { 6366 6367 // Executing both pixelPosition & boxSizingReliable tests require only one layout 6368 // so they're executed at the same time to save the second computation. 6369 function computeStyleTests() { 6370 6371 // This is a singleton, we need to execute it only once 6372 if ( !div ) { 6373 return; 6374 } 6375 6376 div.style.cssText = 6377 "box-sizing:border-box;" + 6378 "position:relative;display:block;" + 6379 "margin:auto;border:1px;padding:1px;" + 6380 "top:1%;width:50%"; 6381 div.innerHTML = ""; 6382 documentElement.appendChild( container ); 6383 6384 var divStyle = window.getComputedStyle( div ); 6385 pixelPositionVal = divStyle.top !== "1%"; 6386 6387 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 6388 reliableMarginLeftVal = divStyle.marginLeft === "2px"; 6389 boxSizingReliableVal = divStyle.width === "4px"; 6390 6391 // Support: Android 4.0 - 4.3 only 6392 // Some styles come back with percentage values, even though they shouldn't 6393 div.style.marginRight = "50%"; 6394 pixelMarginRightVal = divStyle.marginRight === "4px"; 6395 6396 documentElement.removeChild( container ); 6397 6398 // Nullify the div so it wouldn't be stored in the memory and 6399 // it will also be a sign that checks already performed 6400 div = null; 6401 } 6402 6403 var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, 6404 container = document.createElement( "div" ), 6405 div = document.createElement( "div" ); 6406 6407 // Finish early in limited (non-browser) environments 6408 if ( !div.style ) { 6409 return; 6410 } 6411 6412 // Support: IE <=9 - 11 only 6413 // Style of cloned element affects source element cloned (#8908) 6414 div.style.backgroundClip = "content-box"; 6415 div.cloneNode( true ).style.backgroundClip = ""; 6416 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 6417 6418 container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + 6419 "padding:0;margin-top:1px;position:absolute"; 6420 container.appendChild( div ); 6421 6422 jQuery.extend( support, { 6423 pixelPosition: function() { 6424 computeStyleTests(); 6425 return pixelPositionVal; 6426 }, 6427 boxSizingReliable: function() { 6428 computeStyleTests(); 6429 return boxSizingReliableVal; 6430 }, 6431 pixelMarginRight: function() { 6432 computeStyleTests(); 6433 return pixelMarginRightVal; 6434 }, 6435 reliableMarginLeft: function() { 6436 computeStyleTests(); 6437 return reliableMarginLeftVal; 6438 } 6439 } ); 6440} )(); 6441 6442 6443function curCSS( elem, name, computed ) { 6444 var width, minWidth, maxWidth, ret,
vendor: 8,366 bytes, lines 6445-6750
6445 6446 // Support: Firefox 51+ 6447 // Retrieving style before computed somehow 6448 // fixes an issue with getting wrong values 6449 // on detached elements 6450 style = elem.style; 6451 6452 computed = computed || getStyles( elem ); 6453 6454 // getPropertyValue is needed for: 6455 // .css('filter') (IE 9 only, #12537) 6456 // .css('--customProperty) (#3144) 6457 if ( computed ) { 6458 ret = computed.getPropertyValue( name ) || computed[ name ]; 6459 6460 if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { 6461 ret = jQuery.style( elem, name ); 6462 } 6463 6464 // A tribute to the "awesome hack by Dean Edwards" 6465 // Android Browser returns percentage for some values, 6466 // but width seems to be reliably pixels. 6467 // This is against the CSSOM draft spec: 6468 // https://drafts.csswg.org/cssom/#resolved-values 6469 if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { 6470 6471 // Remember the original values 6472 width = style.width; 6473 minWidth = style.minWidth; 6474 maxWidth = style.maxWidth; 6475 6476 // Put in the new values to get a computed value out 6477 style.minWidth = style.maxWidth = style.width = ret; 6478 ret = computed.width; 6479 6480 // Revert the changed values 6481 style.width = width; 6482 style.minWidth = minWidth; 6483 style.maxWidth = maxWidth; 6484 } 6485 } 6486 6487 return ret !== undefined ? 6488 6489 // Support: IE <=9 - 11 only 6490 // IE returns zIndex value as an integer. 6491 ret + "" : 6492 ret; 6493} 6494 6495 6496function addGetHookIf( conditionFn, hookFn ) { 6497 6498 // Define the hook, we'll check on the first run if it's really needed. 6499 return { 6500 get: function() { 6501 if ( conditionFn() ) { 6502 6503 // Hook not needed (or it's not possible to use it due 6504 // to missing dependency), remove it. 6505 delete this.get; 6506 return; 6507 } 6508 6509 // Hook needed; redefine it so that the support test is not executed again. 6510 return ( this.get = hookFn ).apply( this, arguments ); 6511 } 6512 }; 6513} 6514 6515 6516var 6517 6518 // Swappable if display is none or starts with table 6519 // except "table", "table-cell", or "table-caption" 6520 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 6521 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 6522 rcustomProp = /^--/, 6523 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6524 cssNormalTransform = { 6525 letterSpacing: "0", 6526 fontWeight: "400" 6527 }, 6528 6529 cssPrefixes = [ "Webkit", "Moz", "ms" ], 6530 emptyStyle = document.createElement( "div" ).style; 6531 6532// Return a css property mapped to a potentially vendor prefixed property 6533function vendorPropName( name ) { 6534 6535 // Shortcut for names that are not vendor prefixed 6536 if ( name in emptyStyle ) { 6537 return name; 6538 } 6539 6540 // Check for vendor prefixed names 6541 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 6542 i = cssPrefixes.length; 6543 6544 while ( i-- ) { 6545 name = cssPrefixes[ i ] + capName; 6546 if ( name in emptyStyle ) { 6547 return name; 6548 } 6549 } 6550} 6551 6552// Return a property mapped along what jQuery.cssProps suggests or to 6553// a vendor prefixed property. 6554function finalPropName( name ) { 6555 var ret = jQuery.cssProps[ name ]; 6556 if ( !ret ) { 6557 ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; 6558 } 6559 return ret; 6560} 6561 6562function setPositiveNumber( elem, value, subtract ) { 6563 6564 // Any relative (+/-) values have already been 6565 // normalized at this point 6566 var matches = rcssNum.exec( value ); 6567 return matches ? 6568 6569 // Guard against undefined "subtract", e.g., when used as in cssHooks 6570 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 6571 value; 6572} 6573 6574function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { 6575 var i, 6576 val = 0; 6577 6578 // If we already have the right measurement, avoid augmentation 6579 if ( extra === ( isBorderBox ? "border" : "content" ) ) { 6580 i = 4; 6581 6582 // Otherwise initialize for horizontal or vertical properties 6583 } else { 6584 i = name === "width" ? 1 : 0; 6585 } 6586 6587 for ( ; i < 4; i += 2 ) { 6588 6589 // Both box models exclude margin, so add it if we want it 6590 if ( extra === "margin" ) { 6591 val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); 6592 } 6593 6594 if ( isBorderBox ) { 6595 6596 // border-box includes padding, so remove it if we want content 6597 if ( extra === "content" ) { 6598 val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6599 } 6600 6601 // At this point, extra isn't border nor margin, so remove border 6602 if ( extra !== "margin" ) { 6603 val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6604 } 6605 } else { 6606 6607 // At this point, extra isn't content, so add padding 6608 val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6609 6610 // At this point, extra isn't content nor padding, so add border 6611 if ( extra !== "padding" ) { 6612 val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6613 } 6614 } 6615 } 6616 6617 return val; 6618} 6619 6620function getWidthOrHeight( elem, name, extra ) { 6621 6622 // Start with computed style 6623 var valueIsBorderBox, 6624 styles = getStyles( elem ), 6625 val = curCSS( elem, name, styles ), 6626 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 6627 6628 // Computed unit is not pixels. Stop here and return. 6629 if ( rnumnonpx.test( val ) ) { 6630 return val; 6631 } 6632 6633 // Check for style in case a browser which returns unreliable values 6634 // for getComputedStyle silently falls back to the reliable elem.style 6635 valueIsBorderBox = isBorderBox && 6636 ( support.boxSizingReliable() || val === elem.style[ name ] ); 6637 6638 // Fall back to offsetWidth/Height when value is "auto" 6639 // This happens for inline elements with no explicit setting (gh-3571) 6640 if ( val === "auto" ) { 6641 val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; 6642 } 6643 6644 // Normalize "", auto, and prepare for extra 6645 val = parseFloat( val ) || 0; 6646 6647 // Use the active box-sizing model to add/subtract irrelevant styles 6648 return ( val + 6649 augmentWidthOrHeight( 6650 elem, 6651 name, 6652 extra || ( isBorderBox ? "border" : "content" ), 6653 valueIsBorderBox, 6654 styles 6655 ) 6656 ) + "px"; 6657} 6658 6659jQuery.extend( { 6660 6661 // Add in style property hooks for overriding the default 6662 // behavior of getting and setting a style property 6663 cssHooks: { 6664 opacity: { 6665 get: function( elem, computed ) { 6666 if ( computed ) { 6667 6668 // We should always get a number back from opacity 6669 var ret = curCSS( elem, "opacity" ); 6670 return ret === "" ? "1" : ret; 6671 } 6672 } 6673 } 6674 }, 6675 6676 // Don't automatically add "px" to these possibly-unitless properties 6677 cssNumber: { 6678 "animationIterationCount": true, 6679 "columnCount": true, 6680 "fillOpacity": true, 6681 "flexGrow": true, 6682 "flexShrink": true, 6683 "fontWeight": true, 6684 "lineHeight": true, 6685 "opacity": true, 6686 "order": true, 6687 "orphans": true, 6688 "widows": true, 6689 "zIndex": true, 6690 "zoom": true 6691 }, 6692 6693 // Add in properties whose names you wish to fix before 6694 // setting or getting the value 6695 cssProps: { 6696 "float": "cssFloat" 6697 }, 6698 6699 // Get and set the style property on a DOM Node 6700 style: function( elem, name, value, extra ) { 6701 6702 // Don't set styles on text and comment nodes 6703 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 6704 return; 6705 } 6706 6707 // Make sure that we're working with the right name 6708 var ret, type, hooks, 6709 origName = jQuery.camelCase( name ), 6710 isCustomProp = rcustomProp.test( name ), 6711 style = elem.style; 6712 6713 // Make sure that we're working with the right name. We don't 6714 // want to query the value if it is a CSS custom property 6715 // since they are user-defined. 6716 if ( !isCustomProp ) { 6717 name = finalPropName( origName ); 6718 } 6719 6720 // Gets hook for the prefixed version, then unprefixed version 6721 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6722 6723 // Check if we're setting a value 6724 if ( value !== undefined ) { 6725 type = typeof value; 6726 6727 // Convert "+=" or "-=" to relative numbers (#7345) 6728 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 6729 value = adjustCSS( elem, name, ret ); 6730 6731 // Fixes bug #9237 6732 type = "number"; 6733 } 6734 6735 // Make sure that null and NaN values aren't set (#7116) 6736 if ( value == null || value !== value ) { 6737 return; 6738 } 6739 6740 // If a number was passed in, add the unit (except for certain CSS properties) 6741 if ( type === "number" ) { 6742 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 6743 } 6744 6745 // background-* props affect original clone's values 6746 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 6747 style[ name ] = "inherit"; 6748 } 6749 6750 // If a hook was provided, use that value, otherwise just set the specified value
vendor: 4,779 bytes, lines 6751-6933
6751 if ( !hooks || !( "set" in hooks ) || 6752 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 6753 6754 if ( isCustomProp ) { 6755 style.setProperty( name, value ); 6756 } else { 6757 style[ name ] = value; 6758 } 6759 } 6760 6761 } else { 6762 6763 // If a hook was provided get the non-computed value from there 6764 if ( hooks && "get" in hooks && 6765 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 6766 6767 return ret; 6768 } 6769 6770 // Otherwise just get the value from the style object 6771 return style[ name ]; 6772 } 6773 }, 6774 6775 css: function( elem, name, extra, styles ) { 6776 var val, num, hooks, 6777 origName = jQuery.camelCase( name ), 6778 isCustomProp = rcustomProp.test( name ); 6779 6780 // Make sure that we're working with the right name. We don't 6781 // want to modify the value if it is a CSS custom property 6782 // since they are user-defined. 6783 if ( !isCustomProp ) { 6784 name = finalPropName( origName ); 6785 } 6786 6787 // Try prefixed name followed by the unprefixed name 6788 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6789 6790 // If a hook was provided get the computed value from there 6791 if ( hooks && "get" in hooks ) { 6792 val = hooks.get( elem, true, extra ); 6793 } 6794 6795 // Otherwise, if a way to get the computed value exists, use that 6796 if ( val === undefined ) { 6797 val = curCSS( elem, name, styles ); 6798 } 6799 6800 // Convert "normal" to computed value 6801 if ( val === "normal" && name in cssNormalTransform ) { 6802 val = cssNormalTransform[ name ]; 6803 } 6804 6805 // Make numeric if forced or a qualifier was provided and val looks numeric 6806 if ( extra === "" || extra ) { 6807 num = parseFloat( val ); 6808 return extra === true || isFinite( num ) ? num || 0 : val; 6809 } 6810 6811 return val; 6812 } 6813} ); 6814 6815jQuery.each( [ "height", "width" ], function( i, name ) { 6816 jQuery.cssHooks[ name ] = { 6817 get: function( elem, computed, extra ) { 6818 if ( computed ) { 6819 6820 // Certain elements can have dimension info if we invisibly show them 6821 // but it must have a current display style that would benefit 6822 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 6823 6824 // Support: Safari 8+ 6825 // Table columns in Safari have non-zero offsetWidth & zero 6826 // getBoundingClientRect().width unless display is changed. 6827 // Support: IE <=11 only 6828 // Running getBoundingClientRect on a disconnected node 6829 // in IE throws an error. 6830 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 6831 swap( elem, cssShow, function() { 6832 return getWidthOrHeight( elem, name, extra ); 6833 } ) : 6834 getWidthOrHeight( elem, name, extra ); 6835 } 6836 }, 6837 6838 set: function( elem, value, extra ) { 6839 var matches, 6840 styles = extra && getStyles( elem ), 6841 subtract = extra && augmentWidthOrHeight( 6842 elem, 6843 name, 6844 extra, 6845 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 6846 styles 6847 ); 6848 6849 // Convert to pixels if value adjustment is needed 6850 if ( subtract && ( matches = rcssNum.exec( value ) ) && 6851 ( matches[ 3 ] || "px" ) !== "px" ) { 6852 6853 elem.style[ name ] = value; 6854 value = jQuery.css( elem, name ); 6855 } 6856 6857 return setPositiveNumber( elem, value, subtract ); 6858 } 6859 }; 6860} ); 6861 6862jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 6863 function( elem, computed ) { 6864 if ( computed ) { 6865 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 6866 elem.getBoundingClientRect().left - 6867 swap( elem, { marginLeft: 0 }, function() { 6868 return elem.getBoundingClientRect().left; 6869 } ) 6870 ) + "px"; 6871 } 6872 } 6873); 6874 6875// These hooks are used by animate to expand properties 6876jQuery.each( { 6877 margin: "", 6878 padding: "", 6879 border: "Width" 6880}, function( prefix, suffix ) { 6881 jQuery.cssHooks[ prefix + suffix ] = { 6882 expand: function( value ) { 6883 var i = 0, 6884 expanded = {}, 6885 6886 // Assumes a single number if not a string 6887 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 6888 6889 for ( ; i < 4; i++ ) { 6890 expanded[ prefix + cssExpand[ i ] + suffix ] = 6891 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 6892 } 6893 6894 return expanded; 6895 } 6896 }; 6897 6898 if ( !rmargin.test( prefix ) ) { 6899 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 6900 } 6901} ); 6902 6903jQuery.fn.extend( { 6904 css: function( name, value ) { 6905 return access( this, function( elem, name, value ) { 6906 var styles, len, 6907 map = {}, 6908 i = 0; 6909 6910 if ( Array.isArray( name ) ) { 6911 styles = getStyles( elem ); 6912 len = name.length; 6913 6914 for ( ; i < len; i++ ) { 6915 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 6916 } 6917 6918 return map; 6919 } 6920 6921 return value !== undefined ? 6922 jQuery.style( elem, name, value ) : 6923 jQuery.css( elem, name ); 6924 }, name, value, arguments.length > 1 ); 6925 } 6926} ); 6927 6928 6929function Tween( elem, options, prop, end, easing ) { 6930 return new Tween.prototype.init( elem, options, prop, end, easing ); 6931} 6932jQuery.Tween = Tween; 6933
vendor: 6,216 bytes, lines 6934-7172
6934Tween.prototype = { 6935 constructor: Tween, 6936 init: function( elem, options, prop, end, easing, unit ) { 6937 this.elem = elem; 6938 this.prop = prop; 6939 this.easing = easing || jQuery.easing._default; 6940 this.options = options; 6941 this.start = this.now = this.cur(); 6942 this.end = end; 6943 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 6944 }, 6945 cur: function() { 6946 var hooks = Tween.propHooks[ this.prop ]; 6947 6948 return hooks && hooks.get ? 6949 hooks.get( this ) : 6950 Tween.propHooks._default.get( this ); 6951 }, 6952 run: function( percent ) { 6953 var eased, 6954 hooks = Tween.propHooks[ this.prop ]; 6955 6956 if ( this.options.duration ) { 6957 this.pos = eased = jQuery.easing[ this.easing ]( 6958 percent, this.options.duration * percent, 0, 1, this.options.duration 6959 ); 6960 } else { 6961 this.pos = eased = percent; 6962 } 6963 this.now = ( this.end - this.start ) * eased + this.start; 6964 6965 if ( this.options.step ) { 6966 this.options.step.call( this.elem, this.now, this ); 6967 } 6968 6969 if ( hooks && hooks.set ) { 6970 hooks.set( this ); 6971 } else { 6972 Tween.propHooks._default.set( this ); 6973 } 6974 return this; 6975 } 6976}; 6977 6978Tween.prototype.init.prototype = Tween.prototype; 6979 6980Tween.propHooks = { 6981 _default: { 6982 get: function( tween ) { 6983 var result; 6984 6985 // Use a property on the element directly when it is not a DOM element, 6986 // or when there is no matching style property that exists. 6987 if ( tween.elem.nodeType !== 1 || 6988 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 6989 return tween.elem[ tween.prop ]; 6990 } 6991 6992 // Passing an empty string as a 3rd parameter to .css will automatically 6993 // attempt a parseFloat and fallback to a string if the parse fails. 6994 // Simple values such as "10px" are parsed to Float; 6995 // complex values such as "rotate(1rad)" are returned as-is. 6996 result = jQuery.css( tween.elem, tween.prop, "" ); 6997 6998 // Empty strings, null, undefined and "auto" are converted to 0. 6999 return !result || result === "auto" ? 0 : result; 7000 }, 7001 set: function( tween ) { 7002 7003 // Use step hook for back compat. 7004 // Use cssHook if its there. 7005 // Use .style if available and use plain properties where available. 7006 if ( jQuery.fx.step[ tween.prop ] ) { 7007 jQuery.fx.step[ tween.prop ]( tween ); 7008 } else if ( tween.elem.nodeType === 1 && 7009 ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || 7010 jQuery.cssHooks[ tween.prop ] ) ) { 7011 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 7012 } else { 7013 tween.elem[ tween.prop ] = tween.now; 7014 } 7015 } 7016 } 7017}; 7018 7019// Support: IE <=9 only 7020// Panic based approach to setting things on disconnected nodes 7021Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 7022 set: function( tween ) { 7023 if ( tween.elem.nodeType && tween.elem.parentNode ) { 7024 tween.elem[ tween.prop ] = tween.now; 7025 } 7026 } 7027}; 7028 7029jQuery.easing = { 7030 linear: function( p ) { 7031 return p; 7032 }, 7033 swing: function( p ) { 7034 return 0.5 - Math.cos( p * Math.PI ) / 2; 7035 }, 7036 _default: "swing" 7037}; 7038 7039jQuery.fx = Tween.prototype.init; 7040 7041// Back compat <1.8 extension point 7042jQuery.fx.step = {}; 7043 7044 7045 7046 7047var 7048 fxNow, inProgress, 7049 rfxtypes = /^(?:toggle|show|hide)$/, 7050 rrun = /queueHooks$/; 7051 7052function schedule() { 7053 if ( inProgress ) { 7054 if ( document.hidden === false && window.requestAnimationFrame ) { 7055 window.requestAnimationFrame( schedule ); 7056 } else { 7057 window.setTimeout( schedule, jQuery.fx.interval ); 7058 } 7059 7060 jQuery.fx.tick(); 7061 } 7062} 7063 7064// Animations created synchronously will run synchronously 7065function createFxNow() { 7066 window.setTimeout( function() { 7067 fxNow = undefined; 7068 } ); 7069 return ( fxNow = jQuery.now() ); 7070} 7071 7072// Generate parameters to create a standard animation 7073function genFx( type, includeWidth ) { 7074 var which, 7075 i = 0, 7076 attrs = { height: type }; 7077 7078 // If we include width, step value is 1 to do all cssExpand values, 7079 // otherwise step value is 2 to skip over Left and Right 7080 includeWidth = includeWidth ? 1 : 0; 7081 for ( ; i < 4; i += 2 - includeWidth ) { 7082 which = cssExpand[ i ]; 7083 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 7084 } 7085 7086 if ( includeWidth ) { 7087 attrs.opacity = attrs.width = type; 7088 } 7089 7090 return attrs; 7091} 7092 7093function createTween( value, prop, animation ) { 7094 var tween, 7095 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 7096 index = 0, 7097 length = collection.length; 7098 for ( ; index < length; index++ ) { 7099 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 7100 7101 // We're done with this property 7102 return tween; 7103 } 7104 } 7105} 7106 7107function defaultPrefilter( elem, props, opts ) { 7108 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 7109 isBox = "width" in props || "height" in props, 7110 anim = this, 7111 orig = {}, 7112 style = elem.style, 7113 hidden = elem.nodeType && isHiddenWithinTree( elem ), 7114 dataShow = dataPriv.get( elem, "fxshow" ); 7115 7116 // Queue-skipping animations hijack the fx hooks 7117 if ( !opts.queue ) { 7118 hooks = jQuery._queueHooks( elem, "fx" ); 7119 if ( hooks.unqueued == null ) { 7120 hooks.unqueued = 0; 7121 oldfire = hooks.empty.fire; 7122 hooks.empty.fire = function() { 7123 if ( !hooks.unqueued ) { 7124 oldfire(); 7125 } 7126 }; 7127 } 7128 hooks.unqueued++; 7129 7130 anim.always( function() { 7131 7132 // Ensure the complete handler is called before this completes 7133 anim.always( function() { 7134 hooks.unqueued--; 7135 if ( !jQuery.queue( elem, "fx" ).length ) { 7136 hooks.empty.fire(); 7137 } 7138 } ); 7139 } ); 7140 } 7141 7142 // Detect show/hide animations 7143 for ( prop in props ) { 7144 value = props[ prop ]; 7145 if ( rfxtypes.test( value ) ) { 7146 delete props[ prop ]; 7147 toggle = toggle || value === "toggle"; 7148 if ( value === ( hidden ? "hide" : "show" ) ) { 7149 7150 // Pretend to be hidden if this is a "show" and 7151 // there is still data from a stopped show/hide 7152 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 7153 hidden = true; 7154 7155 // Ignore all other no-op show/hide data 7156 } else { 7157 continue; 7158 } 7159 } 7160 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 7161 } 7162 } 7163 7164 // Bail out if this is a no-op like .hide().hide() 7165 propTween = !jQuery.isEmptyObject( props ); 7166 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 7167 return; 7168 } 7169 7170 // Restrict "overflow" and "display" styles during box animations 7171 if ( isBox && elem.nodeType === 1 ) { 7172
vendor: 4,173 bytes, lines 7173-7331
7173 // Support: IE <=9 - 11, Edge 12 - 13 7174 // Record all 3 overflow attributes because IE does not infer the shorthand 7175 // from identically-valued overflowX and overflowY 7176 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 7177 7178 // Identify a display type, preferring old show/hide data over the CSS cascade 7179 restoreDisplay = dataShow && dataShow.display; 7180 if ( restoreDisplay == null ) { 7181 restoreDisplay = dataPriv.get( elem, "display" ); 7182 } 7183 display = jQuery.css( elem, "display" ); 7184 if ( display === "none" ) { 7185 if ( restoreDisplay ) { 7186 display = restoreDisplay; 7187 } else { 7188 7189 // Get nonempty value(s) by temporarily forcing visibility 7190 showHide( [ elem ], true ); 7191 restoreDisplay = elem.style.display || restoreDisplay; 7192 display = jQuery.css( elem, "display" ); 7193 showHide( [ elem ] ); 7194 } 7195 } 7196 7197 // Animate inline elements as inline-block 7198 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 7199 if ( jQuery.css( elem, "float" ) === "none" ) { 7200 7201 // Restore the original display value at the end of pure show/hide animations 7202 if ( !propTween ) { 7203 anim.done( function() { 7204 style.display = restoreDisplay; 7205 } ); 7206 if ( restoreDisplay == null ) { 7207 display = style.display; 7208 restoreDisplay = display === "none" ? "" : display; 7209 } 7210 } 7211 style.display = "inline-block"; 7212 } 7213 } 7214 } 7215 7216 if ( opts.overflow ) { 7217 style.overflow = "hidden"; 7218 anim.always( function() { 7219 style.overflow = opts.overflow[ 0 ]; 7220 style.overflowX = opts.overflow[ 1 ]; 7221 style.overflowY = opts.overflow[ 2 ]; 7222 } ); 7223 } 7224 7225 // Implement show/hide animations 7226 propTween = false; 7227 for ( prop in orig ) { 7228 7229 // General show/hide setup for this element animation 7230 if ( !propTween ) { 7231 if ( dataShow ) { 7232 if ( "hidden" in dataShow ) { 7233 hidden = dataShow.hidden; 7234 } 7235 } else { 7236 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 7237 } 7238 7239 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 7240 if ( toggle ) { 7241 dataShow.hidden = !hidden; 7242 } 7243 7244 // Show elements before animating them 7245 if ( hidden ) { 7246 showHide( [ elem ], true ); 7247 } 7248 7249 /* eslint-disable no-loop-func */ 7250 7251 anim.done( function() { 7252 7253 /* eslint-enable no-loop-func */ 7254 7255 // The final step of a "hide" animation is actually hiding the element 7256 if ( !hidden ) { 7257 showHide( [ elem ] ); 7258 } 7259 dataPriv.remove( elem, "fxshow" ); 7260 for ( prop in orig ) { 7261 jQuery.style( elem, prop, orig[ prop ] ); 7262 } 7263 } ); 7264 } 7265 7266 // Per-property setup 7267 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 7268 if ( !( prop in dataShow ) ) { 7269 dataShow[ prop ] = propTween.start; 7270 if ( hidden ) { 7271 propTween.end = propTween.start; 7272 propTween.start = 0; 7273 } 7274 } 7275 } 7276} 7277 7278function propFilter( props, specialEasing ) { 7279 var index, name, easing, value, hooks; 7280 7281 // camelCase, specialEasing and expand cssHook pass 7282 for ( index in props ) { 7283 name = jQuery.camelCase( index ); 7284 easing = specialEasing[ name ]; 7285 value = props[ index ]; 7286 if ( Array.isArray( value ) ) { 7287 easing = value[ 1 ]; 7288 value = props[ index ] = value[ 0 ]; 7289 } 7290 7291 if ( index !== name ) { 7292 props[ name ] = value; 7293 delete props[ index ]; 7294 } 7295 7296 hooks = jQuery.cssHooks[ name ]; 7297 if ( hooks && "expand" in hooks ) { 7298 value = hooks.expand( value ); 7299 delete props[ name ]; 7300 7301 // Not quite $.extend, this won't overwrite existing keys. 7302 // Reusing 'index' because we have the correct "name" 7303 for ( index in value ) { 7304 if ( !( index in props ) ) { 7305 props[ index ] = value[ index ]; 7306 specialEasing[ index ] = easing; 7307 } 7308 } 7309 } else { 7310 specialEasing[ name ] = easing; 7311 } 7312 } 7313} 7314 7315function Animation( elem, properties, options ) { 7316 var result, 7317 stopped, 7318 index = 0, 7319 length = Animation.prefilters.length, 7320 deferred = jQuery.Deferred().always( function() { 7321 7322 // Don't match elem in the :animated selector 7323 delete tick.elem; 7324 } ), 7325 tick = function() { 7326 if ( stopped ) { 7327 return false; 7328 } 7329 var currentTime = fxNow || createFxNow(), 7330 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 7331
vendor: 6,686 bytes, lines 7332-7591
7332 // Support: Android 2.3 only 7333 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) 7334 temp = remaining / animation.duration || 0, 7335 percent = 1 - temp, 7336 index = 0, 7337 length = animation.tweens.length; 7338 7339 for ( ; index < length; index++ ) { 7340 animation.tweens[ index ].run( percent ); 7341 } 7342 7343 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 7344 7345 // If there's more to do, yield 7346 if ( percent < 1 && length ) { 7347 return remaining; 7348 } 7349 7350 // If this was an empty animation, synthesize a final progress notification 7351 if ( !length ) { 7352 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7353 } 7354 7355 // Resolve the animation and report its conclusion 7356 deferred.resolveWith( elem, [ animation ] ); 7357 return false; 7358 }, 7359 animation = deferred.promise( { 7360 elem: elem, 7361 props: jQuery.extend( {}, properties ), 7362 opts: jQuery.extend( true, { 7363 specialEasing: {}, 7364 easing: jQuery.easing._default 7365 }, options ), 7366 originalProperties: properties, 7367 originalOptions: options, 7368 startTime: fxNow || createFxNow(), 7369 duration: options.duration, 7370 tweens: [], 7371 createTween: function( prop, end ) { 7372 var tween = jQuery.Tween( elem, animation.opts, prop, end, 7373 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 7374 animation.tweens.push( tween ); 7375 return tween; 7376 }, 7377 stop: function( gotoEnd ) { 7378 var index = 0, 7379 7380 // If we are going to the end, we want to run all the tweens 7381 // otherwise we skip this part 7382 length = gotoEnd ? animation.tweens.length : 0; 7383 if ( stopped ) { 7384 return this; 7385 } 7386 stopped = true; 7387 for ( ; index < length; index++ ) { 7388 animation.tweens[ index ].run( 1 ); 7389 } 7390 7391 // Resolve when we played the last frame; otherwise, reject 7392 if ( gotoEnd ) { 7393 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7394 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 7395 } else { 7396 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 7397 } 7398 return this; 7399 } 7400 } ), 7401 props = animation.props; 7402 7403 propFilter( props, animation.opts.specialEasing ); 7404 7405 for ( ; index < length; index++ ) { 7406 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 7407 if ( result ) { 7408 if ( jQuery.isFunction( result.stop ) ) { 7409 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 7410 jQuery.proxy( result.stop, result ); 7411 } 7412 return result; 7413 } 7414 } 7415 7416 jQuery.map( props, createTween, animation ); 7417 7418 if ( jQuery.isFunction( animation.opts.start ) ) { 7419 animation.opts.start.call( elem, animation ); 7420 } 7421 7422 // Attach callbacks from options 7423 animation 7424 .progress( animation.opts.progress ) 7425 .done( animation.opts.done, animation.opts.complete ) 7426 .fail( animation.opts.fail ) 7427 .always( animation.opts.always ); 7428 7429 jQuery.fx.timer( 7430 jQuery.extend( tick, { 7431 elem: elem, 7432 anim: animation, 7433 queue: animation.opts.queue 7434 } ) 7435 ); 7436 7437 return animation; 7438} 7439 7440jQuery.Animation = jQuery.extend( Animation, { 7441 7442 tweeners: { 7443 "*": [ function( prop, value ) { 7444 var tween = this.createTween( prop, value ); 7445 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 7446 return tween; 7447 } ] 7448 }, 7449 7450 tweener: function( props, callback ) { 7451 if ( jQuery.isFunction( props ) ) { 7452 callback = props; 7453 props = [ "*" ]; 7454 } else { 7455 props = props.match( rnothtmlwhite ); 7456 } 7457 7458 var prop, 7459 index = 0, 7460 length = props.length; 7461 7462 for ( ; index < length; index++ ) { 7463 prop = props[ index ]; 7464 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 7465 Animation.tweeners[ prop ].unshift( callback ); 7466 } 7467 }, 7468 7469 prefilters: [ defaultPrefilter ], 7470 7471 prefilter: function( callback, prepend ) { 7472 if ( prepend ) { 7473 Animation.prefilters.unshift( callback ); 7474 } else { 7475 Animation.prefilters.push( callback ); 7476 } 7477 } 7478} ); 7479 7480jQuery.speed = function( speed, easing, fn ) { 7481 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 7482 complete: fn || !fn && easing || 7483 jQuery.isFunction( speed ) && speed, 7484 duration: speed, 7485 easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing 7486 }; 7487 7488 // Go to the end state if fx are off 7489 if ( jQuery.fx.off ) { 7490 opt.duration = 0; 7491 7492 } else { 7493 if ( typeof opt.duration !== "number" ) { 7494 if ( opt.duration in jQuery.fx.speeds ) { 7495 opt.duration = jQuery.fx.speeds[ opt.duration ]; 7496 7497 } else { 7498 opt.duration = jQuery.fx.speeds._default; 7499 } 7500 } 7501 } 7502 7503 // Normalize opt.queue - true/undefined/null -> "fx" 7504 if ( opt.queue == null || opt.queue === true ) { 7505 opt.queue = "fx"; 7506 } 7507 7508 // Queueing 7509 opt.old = opt.complete; 7510 7511 opt.complete = function() { 7512 if ( jQuery.isFunction( opt.old ) ) { 7513 opt.old.call( this ); 7514 } 7515 7516 if ( opt.queue ) { 7517 jQuery.dequeue( this, opt.queue ); 7518 } 7519 }; 7520 7521 return opt; 7522}; 7523 7524jQuery.fn.extend( { 7525 fadeTo: function( speed, to, easing, callback ) { 7526 7527 // Show any hidden elements after setting opacity to 0 7528 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 7529 7530 // Animate to the value specified 7531 .end().animate( { opacity: to }, speed, easing, callback ); 7532 }, 7533 animate: function( prop, speed, easing, callback ) { 7534 var empty = jQuery.isEmptyObject( prop ), 7535 optall = jQuery.speed( speed, easing, callback ), 7536 doAnimation = function() { 7537 7538 // Operate on a copy of prop so per-property easing won't be lost 7539 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 7540 7541 // Empty animations, or finishing resolves immediately 7542 if ( empty || dataPriv.get( this, "finish" ) ) { 7543 anim.stop( true ); 7544 } 7545 }; 7546 doAnimation.finish = doAnimation; 7547 7548 return empty || optall.queue === false ? 7549 this.each( doAnimation ) : 7550 this.queue( optall.queue, doAnimation ); 7551 }, 7552 stop: function( type, clearQueue, gotoEnd ) { 7553 var stopQueue = function( hooks ) { 7554 var stop = hooks.stop; 7555 delete hooks.stop; 7556 stop( gotoEnd ); 7557 }; 7558 7559 if ( typeof type !== "string" ) { 7560 gotoEnd = clearQueue; 7561 clearQueue = type; 7562 type = undefined; 7563 } 7564 if ( clearQueue && type !== false ) { 7565 this.queue( type || "fx", [] ); 7566 } 7567 7568 return this.each( function() { 7569 var dequeue = true, 7570 index = type != null && type + "queueHooks", 7571 timers = jQuery.timers, 7572 data = dataPriv.get( this ); 7573 7574 if ( index ) { 7575 if ( data[ index ] && data[ index ].stop ) { 7576 stopQueue( data[ index ] ); 7577 } 7578 } else { 7579 for ( index in data ) { 7580 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 7581 stopQueue( data[ index ] ); 7582 } 7583 } 7584 } 7585 7586 for ( index = timers.length; index--; ) { 7587 if ( timers[ index ].elem === this && 7588 ( type == null || timers[ index ].queue === type ) ) { 7589 7590 timers[ index ].anim.stop( gotoEnd ); 7591 dequeue = false;
vendor: 2,199 bytes, lines 7592-7676
7592 timers.splice( index, 1 ); 7593 } 7594 } 7595 7596 // Start the next in the queue if the last step wasn't forced. 7597 // Timers currently will call their complete callbacks, which 7598 // will dequeue but only if they were gotoEnd. 7599 if ( dequeue || !gotoEnd ) { 7600 jQuery.dequeue( this, type ); 7601 } 7602 } ); 7603 }, 7604 finish: function( type ) { 7605 if ( type !== false ) { 7606 type = type || "fx"; 7607 } 7608 return this.each( function() { 7609 var index, 7610 data = dataPriv.get( this ), 7611 queue = data[ type + "queue" ], 7612 hooks = data[ type + "queueHooks" ], 7613 timers = jQuery.timers, 7614 length = queue ? queue.length : 0; 7615 7616 // Enable finishing flag on private data 7617 data.finish = true; 7618 7619 // Empty the queue first 7620 jQuery.queue( this, type, [] ); 7621 7622 if ( hooks && hooks.stop ) { 7623 hooks.stop.call( this, true ); 7624 } 7625 7626 // Look for any active animations, and finish them 7627 for ( index = timers.length; index--; ) { 7628 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 7629 timers[ index ].anim.stop( true ); 7630 timers.splice( index, 1 ); 7631 } 7632 } 7633 7634 // Look for any animations in the old queue and finish them 7635 for ( index = 0; index < length; index++ ) { 7636 if ( queue[ index ] && queue[ index ].finish ) { 7637 queue[ index ].finish.call( this ); 7638 } 7639 } 7640 7641 // Turn off finishing flag 7642 delete data.finish; 7643 } ); 7644 } 7645} ); 7646 7647jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { 7648 var cssFn = jQuery.fn[ name ]; 7649 jQuery.fn[ name ] = function( speed, easing, callback ) { 7650 return speed == null || typeof speed === "boolean" ? 7651 cssFn.apply( this, arguments ) : 7652 this.animate( genFx( name, true ), speed, easing, callback ); 7653 }; 7654} ); 7655 7656// Generate shortcuts for custom animations 7657jQuery.each( { 7658 slideDown: genFx( "show" ), 7659 slideUp: genFx( "hide" ), 7660 slideToggle: genFx( "toggle" ), 7661 fadeIn: { opacity: "show" }, 7662 fadeOut: { opacity: "hide" }, 7663 fadeToggle: { opacity: "toggle" } 7664}, function( name, props ) { 7665 jQuery.fn[ name ] = function( speed, easing, callback ) { 7666 return this.animate( props, speed, easing, callback ); 7667 }; 7668} ); 7669 7670jQuery.timers = []; 7671jQuery.fx.tick = function() { 7672 var timer, 7673 i = 0, 7674 timers = jQuery.timers; 7675 7676 fxNow = jQuery
vendor: 7,814 bytes, lines 7676-8029
7676.now(); 7677 7678 for ( ; i < timers.length; i++ ) { 7679 timer = timers[ i ]; 7680 7681 // Run the timer and safely remove it when done (allowing for external removal) 7682 if ( !timer() && timers[ i ] === timer ) { 7683 timers.splice( i--, 1 ); 7684 } 7685 } 7686 7687 if ( !timers.length ) { 7688 jQuery.fx.stop(); 7689 } 7690 fxNow = undefined; 7691}; 7692 7693jQuery.fx.timer = function( timer ) { 7694 jQuery.timers.push( timer ); 7695 jQuery.fx.start(); 7696}; 7697 7698jQuery.fx.interval = 13; 7699jQuery.fx.start = function() { 7700 if ( inProgress ) { 7701 return; 7702 } 7703 7704 inProgress = true; 7705 schedule(); 7706}; 7707 7708jQuery.fx.stop = function() { 7709 inProgress = null; 7710}; 7711 7712jQuery.fx.speeds = { 7713 slow: 600, 7714 fast: 200, 7715 7716 // Default speed 7717 _default: 400 7718}; 7719 7720 7721// Based off of the plugin by Clint Helfers, with permission. 7722// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ 7723jQuery.fn.delay = function( time, type ) { 7724 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 7725 type = type || "fx"; 7726 7727 return this.queue( type, function( next, hooks ) { 7728 var timeout = window.setTimeout( next, time ); 7729 hooks.stop = function() { 7730 window.clearTimeout( timeout ); 7731 }; 7732 } ); 7733}; 7734 7735 7736( function() { 7737 var input = document.createElement( "input" ), 7738 select = document.createElement( "select" ), 7739 opt = select.appendChild( document.createElement( "option" ) ); 7740 7741 input.type = "checkbox"; 7742 7743 // Support: Android <=4.3 only 7744 // Default value for a checkbox should be "on" 7745 support.checkOn = input.value !== ""; 7746 7747 // Support: IE <=11 only 7748 // Must access selectedIndex to make default options select 7749 support.optSelected = opt.selected; 7750 7751 // Support: IE <=11 only 7752 // An input loses its value after becoming a radio 7753 input = document.createElement( "input" ); 7754 input.value = "t"; 7755 input.type = "radio"; 7756 support.radioValue = input.value === "t"; 7757} )(); 7758 7759 7760var boolHook, 7761 attrHandle = jQuery.expr.attrHandle; 7762 7763jQuery.fn.extend( { 7764 attr: function( name, value ) { 7765 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 7766 }, 7767 7768 removeAttr: function( name ) { 7769 return this.each( function() { 7770 jQuery.removeAttr( this, name ); 7771 } ); 7772 } 7773} ); 7774 7775jQuery.extend( { 7776 attr: function( elem, name, value ) { 7777 var ret, hooks, 7778 nType = elem.nodeType; 7779 7780 // Don't get/set attributes on text, comment and attribute nodes 7781 if ( nType === 3 || nType === 8 || nType === 2 ) { 7782 return; 7783 } 7784 7785 // Fallback to prop when attributes are not supported 7786 if ( typeof elem.getAttribute === "undefined" ) { 7787 return jQuery.prop( elem, name, value ); 7788 } 7789 7790 // Attribute hooks are determined by the lowercase version 7791 // Grab necessary hook if one is defined 7792 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 7793 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 7794 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 7795 } 7796 7797 if ( value !== undefined ) { 7798 if ( value === null ) { 7799 jQuery.removeAttr( elem, name ); 7800 return; 7801 } 7802 7803 if ( hooks && "set" in hooks && 7804 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 7805 return ret; 7806 } 7807 7808 elem.setAttribute( name, value + "" ); 7809 return value; 7810 } 7811 7812 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 7813 return ret; 7814 } 7815 7816 ret = jQuery.find.attr( elem, name ); 7817 7818 // Non-existent attributes return null, we normalize to undefined 7819 return ret == null ? undefined : ret; 7820 }, 7821 7822 attrHooks: { 7823 type: { 7824 set: function( elem, value ) { 7825 if ( !support.radioValue && value === "radio" && 7826 nodeName( elem, "input" ) ) { 7827 var val = elem.value; 7828 elem.setAttribute( "type", value ); 7829 if ( val ) { 7830 elem.value = val; 7831 } 7832 return value; 7833 } 7834 } 7835 } 7836 }, 7837 7838 removeAttr: function( elem, value ) { 7839 var name, 7840 i = 0, 7841 7842 // Attribute names can contain non-HTML whitespace characters 7843 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 7844 attrNames = value && value.match( rnothtmlwhite ); 7845 7846 if ( attrNames && elem.nodeType === 1 ) { 7847 while ( ( name = attrNames[ i++ ] ) ) { 7848 elem.removeAttribute( name ); 7849 } 7850 } 7851 } 7852} ); 7853 7854// Hooks for boolean attributes 7855boolHook = { 7856 set: function( elem, value, name ) { 7857 if ( value === false ) { 7858 7859 // Remove boolean attributes when set to false 7860 jQuery.removeAttr( elem, name ); 7861 } else { 7862 elem.setAttribute( name, name ); 7863 } 7864 return name; 7865 } 7866}; 7867 7868jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { 7869 var getter = attrHandle[ name ] || jQuery.find.attr; 7870 7871 attrHandle[ name ] = function( elem, name, isXML ) { 7872 var ret, handle, 7873 lowercaseName = name.toLowerCase(); 7874 7875 if ( !isXML ) { 7876 7877 // Avoid an infinite loop by temporarily removing this function from the getter 7878 handle = attrHandle[ lowercaseName ]; 7879 attrHandle[ lowercaseName ] = ret; 7880 ret = getter( elem, name, isXML ) != null ? 7881 lowercaseName : 7882 null; 7883 attrHandle[ lowercaseName ] = handle; 7884 } 7885 return ret; 7886 }; 7887} ); 7888 7889 7890 7891 7892var rfocusable = /^(?:input|select|textarea|button)$/i, 7893 rclickable = /^(?:a|area)$/i; 7894 7895jQuery.fn.extend( { 7896 prop: function( name, value ) { 7897 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 7898 }, 7899 7900 removeProp: function( name ) { 7901 return this.each( function() { 7902 delete this[ jQuery.propFix[ name ] || name ]; 7903 } ); 7904 } 7905} ); 7906 7907jQuery.extend( { 7908 prop: function( elem, name, value ) { 7909 var ret, hooks, 7910 nType = elem.nodeType; 7911 7912 // Don't get/set properties on text, comment and attribute nodes 7913 if ( nType === 3 || nType === 8 || nType === 2 ) { 7914 return; 7915 } 7916 7917 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 7918 7919 // Fix name and attach hooks 7920 name = jQuery.propFix[ name ] || name; 7921 hooks = jQuery.propHooks[ name ]; 7922 } 7923 7924 if ( value !== undefined ) { 7925 if ( hooks && "set" in hooks && 7926 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 7927 return ret; 7928 } 7929 7930 return ( elem[ name ] = value ); 7931 } 7932 7933 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 7934 return ret; 7935 } 7936 7937 return elem[ name ]; 7938 }, 7939 7940 propHooks: { 7941 tabIndex: { 7942 get: function( elem ) { 7943 7944 // Support: IE <=9 - 11 only 7945 // elem.tabIndex doesn't always return the 7946 // correct value when it hasn't been explicitly set 7947 // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 7948 // Use proper attribute retrieval(#12072) 7949 var tabindex = jQuery.find.attr( elem, "tabindex" ); 7950 7951 if ( tabindex ) { 7952 return parseInt( tabindex, 10 ); 7953 } 7954 7955 if ( 7956 rfocusable.test( elem.nodeName ) || 7957 rclickable.test( elem.nodeName ) && 7958 elem.href 7959 ) { 7960 return 0; 7961 } 7962 7963 return -1; 7964 } 7965 } 7966 }, 7967 7968 propFix: { 7969 "for": "htmlFor", 7970 "class": "className" 7971 } 7972} ); 7973 7974// Support: IE <=11 only 7975// Accessing the selectedIndex property 7976// forces the browser to respect setting selected 7977// on the option 7978// The getter ensures a default option is selected 7979// when in an optgroup 7980// eslint rule "no-unused-expressions" is disabled for this code 7981// since it considers such accessions noop 7982if ( !support.optSelected ) { 7983 jQuery.propHooks.selected = { 7984 get: function( elem ) { 7985 7986 /* eslint no-unused-expressions: "off" */ 7987 7988 var parent = elem.parentNode; 7989 if ( parent && parent.parentNode ) { 7990 parent.parentNode.selectedIndex; 7991 } 7992 return null; 7993 }, 7994 set: function( elem ) { 7995 7996 /* eslint no-unused-expressions: "off" */ 7997 7998 var parent = elem.parentNode; 7999 if ( parent ) { 8000 parent.selectedIndex; 8001 8002 if ( parent.parentNode ) { 8003 parent.parentNode.selectedIndex; 8004 } 8005 } 8006 } 8007 }; 8008} 8009 8010jQuery.each( [ 8011 "tabIndex", 8012 "readOnly", 8013 "maxLength", 8014 "cellSpacing", 8015 "cellPadding", 8016 "rowSpan", 8017 "colSpan", 8018 "useMap", 8019 "frameBorder", 8020 "contentEditable" 8021], function() { 8022 jQuery.propFix[ this.toLowerCase() ] = this; 8023} ); 8024 8025 8026 8027 8028 // Strip and collapse whitespace according to HTML spec 8029 // https://
vendor: 4,260 bytes, lines 8029-8195
8029html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace 8030 function stripAndCollapse( value ) { 8031 var tokens = value.match( rnothtmlwhite ) || []; 8032 return tokens.join( " " ); 8033 } 8034 8035 8036function getClass( elem ) { 8037 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 8038} 8039 8040jQuery.fn.extend( { 8041 addClass: function( value ) { 8042 var classes, elem, cur, curValue, clazz, j, finalValue, 8043 i = 0; 8044 8045 if ( jQuery.isFunction( value ) ) { 8046 return this.each( function( j ) { 8047 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 8048 } ); 8049 } 8050 8051 if ( typeof value === "string" && value ) { 8052 classes = value.match( rnothtmlwhite ) || []; 8053 8054 while ( ( elem = this[ i++ ] ) ) { 8055 curValue = getClass( elem ); 8056 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8057 8058 if ( cur ) { 8059 j = 0; 8060 while ( ( clazz = classes[ j++ ] ) ) { 8061 if ( cur.indexOf( " " + clazz + " " ) < 0 ) { 8062 cur += clazz + " "; 8063 } 8064 } 8065 8066 // Only assign if different to avoid unneeded rendering. 8067 finalValue = stripAndCollapse( cur ); 8068 if ( curValue !== finalValue ) { 8069 elem.setAttribute( "class", finalValue ); 8070 } 8071 } 8072 } 8073 } 8074 8075 return this; 8076 }, 8077 8078 removeClass: function( value ) { 8079 var classes, elem, cur, curValue, clazz, j, finalValue, 8080 i = 0; 8081 8082 if ( jQuery.isFunction( value ) ) { 8083 return this.each( function( j ) { 8084 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 8085 } ); 8086 } 8087 8088 if ( !arguments.length ) { 8089 return this.attr( "class", "" ); 8090 } 8091 8092 if ( typeof value === "string" && value ) { 8093 classes = value.match( rnothtmlwhite ) || []; 8094 8095 while ( ( elem = this[ i++ ] ) ) { 8096 curValue = getClass( elem ); 8097 8098 // This expression is here for better compressibility (see addClass) 8099 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8100 8101 if ( cur ) { 8102 j = 0; 8103 while ( ( clazz = classes[ j++ ] ) ) { 8104 8105 // Remove *all* instances 8106 while ( cur.indexOf( " " + clazz + " " ) > -1 ) { 8107 cur = cur.replace( " " + clazz + " ", " " ); 8108 } 8109 } 8110 8111 // Only assign if different to avoid unneeded rendering. 8112 finalValue = stripAndCollapse( cur ); 8113 if ( curValue !== finalValue ) { 8114 elem.setAttribute( "class", finalValue ); 8115 } 8116 } 8117 } 8118 } 8119 8120 return this; 8121 }, 8122 8123 toggleClass: function( value, stateVal ) { 8124 var type = typeof value; 8125 8126 if ( typeof stateVal === "boolean" && type === "string" ) { 8127 return stateVal ? this.addClass( value ) : this.removeClass( value ); 8128 } 8129 8130 if ( jQuery.isFunction( value ) ) { 8131 return this.each( function( i ) { 8132 jQuery( this ).toggleClass( 8133 value.call( this, i, getClass( this ), stateVal ), 8134 stateVal 8135 ); 8136 } ); 8137 } 8138 8139 return this.each( function() { 8140 var className, i, self, classNames; 8141 8142 if ( type === "string" ) { 8143 8144 // Toggle individual class names 8145 i = 0; 8146 self = jQuery( this ); 8147 classNames = value.match( rnothtmlwhite ) || []; 8148 8149 while ( ( className = classNames[ i++ ] ) ) { 8150 8151 // Check each className given, space separated list 8152 if ( self.hasClass( className ) ) { 8153 self.removeClass( className ); 8154 } else { 8155 self.addClass( className ); 8156 } 8157 } 8158 8159 // Toggle whole class name 8160 } else if ( value === undefined || type === "boolean" ) { 8161 className = getClass( this ); 8162 if ( className ) { 8163 8164 // Store className if set 8165 dataPriv.set( this, "__className__", className ); 8166 } 8167 8168 // If the element has a class name or if we're passed `false`, 8169 // then remove the whole classname (if there was one, the above saved it). 8170 // Otherwise bring back whatever was previously saved (if anything), 8171 // falling back to the empty string if nothing was stored. 8172 if ( this.setAttribute ) { 8173 this.setAttribute( "class", 8174 className || value === false ? 8175 "" : 8176 dataPriv.get( this, "__className__" ) || "" 8177 ); 8178 } 8179 } 8180 } ); 8181 }, 8182 8183 hasClass: function( selector ) { 8184 var className, elem, 8185 i = 0; 8186 8187 className = " " + selector + " "; 8188 while ( ( elem = this[ i++ ] ) ) { 8189 if ( elem.nodeType === 1 && 8190 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 8191 return true; 8192 } 8193 } 8194 8195 return false;
vendor: 1,377 bytes, lines 8196-8265
8196 } 8197} ); 8198 8199 8200 8201 8202var rreturn = /\r/g; 8203 8204jQuery.fn.extend( { 8205 val: function( value ) { 8206 var hooks, ret, isFunction, 8207 elem = this[ 0 ]; 8208 8209 if ( !arguments.length ) { 8210 if ( elem ) { 8211 hooks = jQuery.valHooks[ elem.type ] || 8212 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 8213 8214 if ( hooks && 8215 "get" in hooks && 8216 ( ret = hooks.get( elem, "value" ) ) !== undefined 8217 ) { 8218 return ret; 8219 } 8220 8221 ret = elem.value; 8222 8223 // Handle most common string cases 8224 if ( typeof ret === "string" ) { 8225 return ret.replace( rreturn, "" ); 8226 } 8227 8228 // Handle cases where value is null/undef or number 8229 return ret == null ? "" : ret; 8230 } 8231 8232 return; 8233 } 8234 8235 isFunction = jQuery.isFunction( value ); 8236 8237 return this.each( function( i ) { 8238 var val; 8239 8240 if ( this.nodeType !== 1 ) { 8241 return; 8242 } 8243 8244 if ( isFunction ) { 8245 val = value.call( this, i, jQuery( this ).val() ); 8246 } else { 8247 val = value; 8248 } 8249 8250 // Treat null/undefined as ""; convert numbers to string 8251 if ( val == null ) { 8252 val = ""; 8253 8254 } else if ( typeof val === "number" ) { 8255 val += ""; 8256 8257 } else if ( Array.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: 8,160 bytes, lines 8266-8584
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 8278 var val = jQuery.find.attr( elem, "value" ); 8279 return val != null ? 8280 val : 8281 8282 // Support: IE <=10 - 11 only 8283 // option.text throws exceptions (#14686, #14858) 8284 // Strip and collapse whitespace 8285 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 8286 stripAndCollapse( jQuery.text( elem ) ); 8287 } 8288 }, 8289 select: { 8290 get: function( elem ) { 8291 var value, option, i, 8292 options = elem.options, 8293 index = elem.selectedIndex, 8294 one = elem.type === "select-one", 8295 values = one ? null : [], 8296 max = one ? index + 1 : options.length; 8297 8298 if ( index < 0 ) { 8299 i = max; 8300 8301 } else { 8302 i = one ? index : 0; 8303 } 8304 8305 // Loop through all the selected options 8306 for ( ; i < max; i++ ) { 8307 option = options[ i ]; 8308 8309 // Support: IE <=9 only 8310 // IE8-9 doesn't update selected after form reset (#2551) 8311 if ( ( option.selected || i === index ) && 8312 8313 // Don't return options that are disabled or in a disabled optgroup 8314 !option.disabled && 8315 ( !option.parentNode.disabled || 8316 !nodeName( option.parentNode, "optgroup" ) ) ) { 8317 8318 // Get the specific value for the option 8319 value = jQuery( option ).val(); 8320 8321 // We don't need an array for one selects 8322 if ( one ) { 8323 return value; 8324 } 8325 8326 // Multi-Selects return an array 8327 values.push( value ); 8328 } 8329 } 8330 8331 return values; 8332 }, 8333 8334 set: function( elem, value ) { 8335 var optionSet, option, 8336 options = elem.options, 8337 values = jQuery.makeArray( value ), 8338 i = options.length; 8339 8340 while ( i-- ) { 8341 option = options[ i ]; 8342 8343 /* eslint-disable no-cond-assign */ 8344 8345 if ( option.selected = 8346 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 8347 ) { 8348 optionSet = true; 8349 } 8350 8351 /* eslint-enable no-cond-assign */ 8352 } 8353 8354 // Force browsers to behave consistently when non-matching value is set 8355 if ( !optionSet ) { 8356 elem.selectedIndex = -1; 8357 } 8358 return values; 8359 } 8360 } 8361 } 8362} ); 8363 8364// Radios and checkboxes getter/setter 8365jQuery.each( [ "radio", "checkbox" ], function() { 8366 jQuery.valHooks[ this ] = { 8367 set: function( elem, value ) { 8368 if ( Array.isArray( value ) ) { 8369 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 8370 } 8371 } 8372 }; 8373 if ( !support.checkOn ) { 8374 jQuery.valHooks[ this ].get = function( elem ) { 8375 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 8376 }; 8377 } 8378} ); 8379 8380 8381 8382 8383// Return jQuery for attributes-only inclusion 8384 8385 8386var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; 8387 8388jQuery.extend( jQuery.event, { 8389 8390 trigger: function( event, data, elem, onlyHandlers ) { 8391 8392 var i, cur, tmp, bubbleType, ontype, handle, special, 8393 eventPath = [ elem || document ], 8394 type = hasOwn.call( event, "type" ) ? event.type : event, 8395 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 8396 8397 cur = tmp = elem = elem || document; 8398 8399 // Don't do events on text and comment nodes 8400 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 8401 return; 8402 } 8403 8404 // focus/blur morphs to focusin/out; ensure we're not firing them right now 8405 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 8406 return; 8407 } 8408 8409 if ( type.indexOf( "." ) > -1 ) { 8410 8411 // Namespaced trigger; create a regexp to match event type in handle() 8412 namespaces = type.split( "." ); 8413 type = namespaces.shift(); 8414 namespaces.sort(); 8415 } 8416 ontype = type.indexOf( ":" ) < 0 && "on" + type; 8417 8418 // Caller can pass in a jQuery.Event object, Object, or just an event type string 8419 event = event[ jQuery.expando ] ? 8420 event : 8421 new jQuery.Event( type, typeof event === "object" && event ); 8422 8423 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 8424 event.isTrigger = onlyHandlers ? 2 : 3; 8425 event.namespace = namespaces.join( "." ); 8426 event.rnamespace = event.namespace ? 8427 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 8428 null; 8429 8430 // Clean up the event in case it is being reused 8431 event.result = undefined; 8432 if ( !event.target ) { 8433 event.target = elem; 8434 } 8435 8436 // Clone any incoming data and prepend the event, creating the handler arg list 8437 data = data == null ? 8438 [ event ] : 8439 jQuery.makeArray( data, [ event ] ); 8440 8441 // Allow special events to draw outside the lines 8442 special = jQuery.event.special[ type ] || {}; 8443 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 8444 return; 8445 } 8446 8447 // Determine event propagation path in advance, per W3C events spec (#9951) 8448 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 8449 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { 8450 8451 bubbleType = special.delegateType || type; 8452 if ( !rfocusMorph.test( bubbleType + type ) ) { 8453 cur = cur.parentNode; 8454 } 8455 for ( ; cur; cur = cur.parentNode ) { 8456 eventPath.push( cur ); 8457 tmp = cur; 8458 } 8459 8460 // Only add window if we got to document (e.g., not plain obj or detached DOM) 8461 if ( tmp === ( elem.ownerDocument || document ) ) { 8462 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 8463 } 8464 } 8465 8466 // Fire handlers on the event path 8467 i = 0; 8468 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 8469 8470 event.type = i > 1 ? 8471 bubbleType : 8472 special.bindType || type; 8473 8474 // jQuery handler 8475 handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && 8476 dataPriv.get( cur, "handle" ); 8477 if ( handle ) { 8478 handle.apply( cur, data ); 8479 } 8480 8481 // Native handler 8482 handle = ontype && cur[ ontype ]; 8483 if ( handle && handle.apply && acceptData( cur ) ) { 8484 event.result = handle.apply( cur, data ); 8485 if ( event.result === false ) { 8486 event.preventDefault(); 8487 } 8488 } 8489 } 8490 event.type = type; 8491 8492 // If nobody prevented the default action, do it now 8493 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 8494 8495 if ( ( !special._default || 8496 special._default.apply( eventPath.pop(), data ) === false ) && 8497 acceptData( elem ) ) { 8498 8499 // Call a native DOM method on the target with the same name as the event. 8500 // Don't do default actions on window, that's where global variables be (#6170) 8501 if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { 8502 8503 // Don't re-trigger an onFOO event when we call its FOO() method 8504 tmp = elem[ ontype ]; 8505 8506 if ( tmp ) { 8507 elem[ ontype ] = null; 8508 } 8509 8510 // Prevent re-triggering of the same event, since we already bubbled it above 8511 jQuery.event.triggered = type; 8512 elem[ type ](); 8513 jQuery.event.triggered = undefined; 8514 8515 if ( tmp ) { 8516 elem[ ontype ] = tmp; 8517 } 8518 } 8519 } 8520 } 8521 8522 return event.result; 8523 }, 8524 8525 // Piggyback on a donor event to simulate a different one 8526 // Used only for `focus(in | out)` events 8527 simulate: function( type, elem, event ) { 8528 var e = jQuery.extend( 8529 new jQuery.Event(), 8530 event, 8531 { 8532 type: type, 8533 isSimulated: true 8534 } 8535 ); 8536 8537 jQuery.event.trigger( e, null, elem ); 8538 } 8539 8540} ); 8541 8542jQuery.fn.extend( { 8543 8544 trigger: function( type, data ) { 8545 return this.each( function() { 8546 jQuery.event.trigger( type, data, this ); 8547 } ); 8548 }, 8549 triggerHandler: function( type, data ) { 8550 var elem = this[ 0 ]; 8551 if ( elem ) { 8552 return jQuery.event.trigger( type, data, elem, true ); 8553 } 8554 } 8555} ); 8556 8557 8558jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + 8559 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 8560 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 8561 function( i, name ) { 8562 8563 // Handle event binding 8564 jQuery.fn[ name ] = function( data, fn ) { 8565 return arguments.length > 0 ? 8566 this.on( name, null, data, fn ) : 8567 this.trigger( name ); 8568 }; 8569} ); 8570 8571jQuery.fn.extend( { 8572 hover: function( fnOver, fnOut ) { 8573 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 8574 } 8575} ); 8576 8577 8578 8579 8580support.focusin = "onfocusin" in window; 8581 8582 8583// Support: Firefox <=44 8584// Firefox doesn't have focus(in | out) events
vendor: 4,174 bytes, lines 8585-8748
8585// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 8586// 8587// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 8588// focus(in | out) events fire after focus & blur events, 8589// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 8590// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 8591if ( !support.focusin ) { 8592 jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { 8593 8594 // Attach a single capturing handler on the document while someone wants focusin/focusout 8595 var handler = function( event ) { 8596 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); 8597 }; 8598 8599 jQuery.event.special[ fix ] = { 8600 setup: function() { 8601 var doc = this.ownerDocument || this, 8602 attaches = dataPriv.access( doc, fix ); 8603 8604 if ( !attaches ) { 8605 doc.addEventListener( orig, handler, true ); 8606 } 8607 dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); 8608 }, 8609 teardown: function() { 8610 var doc = this.ownerDocument || this, 8611 attaches = dataPriv.access( doc, fix ) - 1; 8612 8613 if ( !attaches ) { 8614 doc.removeEventListener( orig, handler, true ); 8615 dataPriv.remove( doc, fix ); 8616 8617 } else { 8618 dataPriv.access( doc, fix, attaches ); 8619 } 8620 } 8621 }; 8622 } ); 8623} 8624var location = window.location; 8625 8626var nonce = jQuery.now(); 8627 8628var rquery = ( /\?/ ); 8629 8630 8631 8632// Cross-browser xml parsing 8633jQuery.parseXML = function( data ) { 8634 var xml; 8635 if ( !data || typeof data !== "string" ) { 8636 return null; 8637 } 8638 8639 // Support: IE 9 - 11 only 8640 // IE throws on parseFromString with invalid input. 8641 try { 8642 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 8643 } catch ( e ) { 8644 xml = undefined; 8645 } 8646 8647 if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { 8648 jQuery.error( "Invalid XML: " + data ); 8649 } 8650 return xml; 8651}; 8652 8653 8654var 8655 rbracket = /\[\]$/, 8656 rCRLF = /\r?\n/g, 8657 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 8658 rsubmittable = /^(?:input|select|textarea|keygen)/i; 8659 8660function buildParams( prefix, obj, traditional, add ) { 8661 var name; 8662 8663 if ( Array.isArray( obj ) ) { 8664 8665 // Serialize array item. 8666 jQuery.each( obj, function( i, v ) { 8667 if ( traditional || rbracket.test( prefix ) ) { 8668 8669 // Treat each array item as a scalar. 8670 add( prefix, v ); 8671 8672 } else { 8673 8674 // Item is non-scalar (array or object), encode its numeric index. 8675 buildParams( 8676 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 8677 v, 8678 traditional, 8679 add 8680 ); 8681 } 8682 } ); 8683 8684 } else if ( !traditional && jQuery.type( obj ) === "object" ) { 8685 8686 // Serialize object item. 8687 for ( name in obj ) { 8688 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 8689 } 8690 8691 } else { 8692 8693 // Serialize scalar item. 8694 add( prefix, obj ); 8695 } 8696} 8697 8698// Serialize an array of form elements or a set of 8699// key/values into a query string 8700jQuery.param = function( a, traditional ) { 8701 var prefix, 8702 s = [], 8703 add = function( key, valueOrFunction ) { 8704 8705 // If value is a function, invoke it and use its return value 8706 var value = jQuery.isFunction( valueOrFunction ) ? 8707 valueOrFunction() : 8708 valueOrFunction; 8709 8710 s[ s.length ] = encodeURIComponent( key ) + "=" + 8711 encodeURIComponent( value == null ? "" : value ); 8712 }; 8713 8714 // If an array was passed in, assume that it is an array of form elements. 8715 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 8716 8717 // Serialize the form elements 8718 jQuery.each( a, function() { 8719 add( this.name, this.value ); 8720 } ); 8721 8722 } else { 8723 8724 // If traditional, encode the "old" way (the way 1.3.2 or older 8725 // did it), otherwise encode params recursively. 8726 for ( prefix in a ) { 8727 buildParams( prefix, a[ prefix ], traditional, add ); 8728 } 8729 } 8730 8731 // Return the resulting serialization 8732 return s.join( "&" ); 8733}; 8734 8735jQuery.fn.extend( { 8736 serialize: function() { 8737 return jQuery.param( this.serializeArray() ); 8738 }, 8739 serializeArray: function() { 8740 return this.map( function() { 8741 8742 // Can add propHook for "elements" to filter or add form elements 8743 var elements = jQuery.prop( this, "elements" ); 8744 return elements ? jQuery.makeArray( elements ) : this; 8745 } ) 8746 .filter( function() { 8747 var type = this.type; 8748
vendor: 4,939 bytes, lines 8749-8921
8749 // Use .is( ":disabled" ) so that fieldset[disabled] works 8750 return this.name && !jQuery( this ).is( ":disabled" ) && 8751 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 8752 ( this.checked || !rcheckableType.test( type ) ); 8753 } ) 8754 .map( function( i, elem ) { 8755 var val = jQuery( this ).val(); 8756 8757 if ( val == null ) { 8758 return null; 8759 } 8760 8761 if ( Array.isArray( val ) ) { 8762 return jQuery.map( val, function( val ) { 8763 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 8764 } ); 8765 } 8766 8767 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 8768 } ).get(); 8769 } 8770} ); 8771 8772 8773var 8774 r20 = /%20/g, 8775 rhash = /#.*$/, 8776 rantiCache = /([?&])_=[^&]*/, 8777 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 8778 8779 // #7653, #8125, #8152: local protocol detection 8780 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 8781 rnoContent = /^(?:GET|HEAD)$/, 8782 rprotocol = /^\/\//, 8783 8784 /* Prefilters 8785 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 8786 * 2) These are called: 8787 * - BEFORE asking for a transport 8788 * - AFTER param serialization (s.data is a string if s.processData is true) 8789 * 3) key is the dataType 8790 * 4) the catchall symbol "*" can be used 8791 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 8792 */ 8793 prefilters = {}, 8794 8795 /* Transports bindings 8796 * 1) key is the dataType 8797 * 2) the catchall symbol "*" can be used 8798 * 3) selection will start with transport dataType and THEN go to "*" if needed 8799 */ 8800 transports = {}, 8801 8802 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 8803 allTypes = "*/".concat( "*" ), 8804 8805 // Anchor tag for parsing the document origin 8806 originAnchor = document.createElement( "a" ); 8807 originAnchor.href = location.href; 8808 8809// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 8810function addToPrefiltersOrTransports( structure ) { 8811 8812 // dataTypeExpression is optional and defaults to "*" 8813 return function( dataTypeExpression, func ) { 8814 8815 if ( typeof dataTypeExpression !== "string" ) { 8816 func = dataTypeExpression; 8817 dataTypeExpression = "*"; 8818 } 8819 8820 var dataType, 8821 i = 0, 8822 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 8823 8824 if ( jQuery.isFunction( func ) ) { 8825 8826 // For each dataType in the dataTypeExpression 8827 while ( ( dataType = dataTypes[ i++ ] ) ) { 8828 8829 // Prepend if requested 8830 if ( dataType[ 0 ] === "+" ) { 8831 dataType = dataType.slice( 1 ) || "*"; 8832 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 8833 8834 // Otherwise append 8835 } else { 8836 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 8837 } 8838 } 8839 } 8840 }; 8841} 8842 8843// Base inspection function for prefilters and transports 8844function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 8845 8846 var inspected = {}, 8847 seekingTransport = ( structure === transports ); 8848 8849 function inspect( dataType ) { 8850 var selected; 8851 inspected[ dataType ] = true; 8852 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 8853 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 8854 if ( typeof dataTypeOrTransport === "string" && 8855 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 8856 8857 options.dataTypes.unshift( dataTypeOrTransport ); 8858 inspect( dataTypeOrTransport ); 8859 return false; 8860 } else if ( seekingTransport ) { 8861 return !( selected = dataTypeOrTransport ); 8862 } 8863 } ); 8864 return selected; 8865 } 8866 8867 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 8868} 8869 8870// A special extend for ajax options 8871// that takes "flat" options (not to be deep extended) 8872// Fixes #9887 8873function ajaxExtend( target, src ) { 8874 var key, deep, 8875 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 8876 8877 for ( key in src ) { 8878 if ( src[ key ] !== undefined ) { 8879 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 8880 } 8881 } 8882 if ( deep ) { 8883 jQuery.extend( true, target, deep ); 8884 } 8885 8886 return target; 8887} 8888 8889/* Handles responses to an ajax request: 8890 * - finds the right dataType (mediates between content-type and expected dataType) 8891 * - returns the corresponding response 8892 */ 8893function ajaxHandleResponses( s, jqXHR, responses ) { 8894 8895 var ct, type, finalDataType, firstDataType, 8896 contents = s.contents, 8897 dataTypes = s.dataTypes; 8898 8899 // Remove auto dataType and get content-type in the process 8900 while ( dataTypes[ 0 ] === "*" ) { 8901 dataTypes.shift(); 8902 if ( ct === undefined ) { 8903 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 8904 } 8905 } 8906 8907 // Check if we're dealing with a known content-type 8908 if ( ct ) { 8909 for ( type in contents ) { 8910 if ( contents[ type ] && contents[ type ].test( ct ) ) { 8911 dataTypes.unshift( type ); 8912 break; 8913 } 8914 } 8915 } 8916 8917 // Check to see if we have a response for the expected dataType 8918 if ( dataTypes[ 0 ] in responses ) { 8919 finalDataType = dataTypes[ 0 ]; 8920 } else { 8921
vendor: 18,932 bytes, lines 8922-9679
8922 // Try convertible dataTypes 8923 for ( type in responses ) { 8924 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 8925 finalDataType = type; 8926 break; 8927 } 8928 if ( !firstDataType ) { 8929 firstDataType = type; 8930 } 8931 } 8932 8933 // Or just use first one 8934 finalDataType = finalDataType || firstDataType; 8935 } 8936 8937 // If we found a dataType 8938 // We add the dataType to the list if needed 8939 // and return the corresponding response 8940 if ( finalDataType ) { 8941 if ( finalDataType !== dataTypes[ 0 ] ) { 8942 dataTypes.unshift( finalDataType ); 8943 } 8944 return responses[ finalDataType ]; 8945 } 8946} 8947 8948/* Chain conversions given the request and the original response 8949 * Also sets the responseXXX fields on the jqXHR instance 8950 */ 8951function ajaxConvert( s, response, jqXHR, isSuccess ) { 8952 var conv2, current, conv, tmp, prev, 8953 converters = {}, 8954 8955 // Work with a copy of dataTypes in case we need to modify it for conversion 8956 dataTypes = s.dataTypes.slice(); 8957 8958 // Create converters map with lowercased keys 8959 if ( dataTypes[ 1 ] ) { 8960 for ( conv in s.converters ) { 8961 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 8962 } 8963 } 8964 8965 current = dataTypes.shift(); 8966 8967 // Convert to each sequential dataType 8968 while ( current ) { 8969 8970 if ( s.responseFields[ current ] ) { 8971 jqXHR[ s.responseFields[ current ] ] = response; 8972 } 8973 8974 // Apply the dataFilter if provided 8975 if ( !prev && isSuccess && s.dataFilter ) { 8976 response = s.dataFilter( response, s.dataType ); 8977 } 8978 8979 prev = current; 8980 current = dataTypes.shift(); 8981 8982 if ( current ) { 8983 8984 // There's only work to do if current dataType is non-auto 8985 if ( current === "*" ) { 8986 8987 current = prev; 8988 8989 // Convert response if prev dataType is non-auto and differs from current 8990 } else if ( prev !== "*" && prev !== current ) { 8991 8992 // Seek a direct converter 8993 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 8994 8995 // If none found, seek a pair 8996 if ( !conv ) { 8997 for ( conv2 in converters ) { 8998 8999 // If conv2 outputs current 9000 tmp = conv2.split( " " ); 9001 if ( tmp[ 1 ] === current ) { 9002 9003 // If prev can be converted to accepted input 9004 conv = converters[ prev + " " + tmp[ 0 ] ] || 9005 converters[ "* " + tmp[ 0 ] ]; 9006 if ( conv ) { 9007 9008 // Condense equivalence converters 9009 if ( conv === true ) { 9010 conv = converters[ conv2 ]; 9011 9012 // Otherwise, insert the intermediate dataType 9013 } else if ( converters[ conv2 ] !== true ) { 9014 current = tmp[ 0 ]; 9015 dataTypes.unshift( tmp[ 1 ] ); 9016 } 9017 break; 9018 } 9019 } 9020 } 9021 } 9022 9023 // Apply converter (if not an equivalence) 9024 if ( conv !== true ) { 9025 9026 // Unless errors are allowed to bubble, catch and return them 9027 if ( conv && s.throws ) { 9028 response = conv( response ); 9029 } else { 9030 try { 9031 response = conv( response ); 9032 } catch ( e ) { 9033 return { 9034 state: "parsererror", 9035 error: conv ? e : "No conversion from " + prev + " to " + current 9036 }; 9037 } 9038 } 9039 } 9040 } 9041 } 9042 } 9043 9044 return { state: "success", data: response }; 9045} 9046 9047jQuery.extend( { 9048 9049 // Counter for holding the number of active queries 9050 active: 0, 9051 9052 // Last-Modified header cache for next request 9053 lastModified: {}, 9054 etag: {}, 9055 9056 ajaxSettings: { 9057 url: location.href, 9058 type: "GET", 9059 isLocal: rlocalProtocol.test( location.protocol ), 9060 global: true, 9061 processData: true, 9062 async: true, 9063 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 9064 9065 /* 9066 timeout: 0, 9067 data: null, 9068 dataType: null, 9069 username: null, 9070 password: null, 9071 cache: null, 9072 throws: false, 9073 traditional: false, 9074 headers: {}, 9075 */ 9076 9077 accepts: { 9078 "*": allTypes, 9079 text: "text/plain", 9080 html: "text/html", 9081 xml: "application/xml, text/xml", 9082 json: "application/json, text/javascript" 9083 }, 9084 9085 contents: { 9086 xml: /\bxml\b/, 9087 html: /\bhtml/, 9088 json: /\bjson\b/ 9089 }, 9090 9091 responseFields: { 9092 xml: "responseXML", 9093 text: "responseText", 9094 json: "responseJSON" 9095 }, 9096 9097 // Data converters 9098 // Keys separate source (or catchall "*") and destination types with a single space 9099 converters: { 9100 9101 // Convert anything to text 9102 "* text": String, 9103 9104 // Text to html (true = no transformation) 9105 "text html": true, 9106 9107 // Evaluate text as a json expression 9108 "text json": JSON.parse, 9109 9110 // Parse text as xml 9111 "text xml": jQuery.parseXML 9112 }, 9113 9114 // For options that shouldn't be deep extended: 9115 // you can add your own custom options here if 9116 // and when you create one that shouldn't be 9117 // deep extended (see ajaxExtend) 9118 flatOptions: { 9119 url: true, 9120 context: true 9121 } 9122 }, 9123 9124 // Creates a full fledged settings object into target 9125 // with both ajaxSettings and settings fields. 9126 // If target is omitted, writes into ajaxSettings. 9127 ajaxSetup: function( target, settings ) { 9128 return settings ? 9129 9130 // Building a settings object 9131 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 9132 9133 // Extending ajaxSettings 9134 ajaxExtend( jQuery.ajaxSettings, target ); 9135 }, 9136 9137 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 9138 ajaxTransport: addToPrefiltersOrTransports( transports ), 9139 9140 // Main method 9141 ajax: function( url, options ) { 9142 9143 // If url is an object, simulate pre-1.5 signature 9144 if ( typeof url === "object" ) { 9145 options = url; 9146 url = undefined; 9147 } 9148 9149 // Force options to be an object 9150 options = options || {}; 9151 9152 var transport, 9153 9154 // URL without anti-cache param 9155 cacheURL, 9156 9157 // Response headers 9158 responseHeadersString, 9159 responseHeaders, 9160 9161 // timeout handle 9162 timeoutTimer, 9163 9164 // Url cleanup var 9165 urlAnchor, 9166 9167 // Request state (becomes false upon send and true upon completion) 9168 completed, 9169 9170 // To know if global events are to be dispatched 9171 fireGlobals, 9172 9173 // Loop variable 9174 i, 9175 9176 // uncached part of the url 9177 uncached, 9178 9179 // Create the final options object 9180 s = jQuery.ajaxSetup( {}, options ), 9181 9182 // Callbacks context 9183 callbackContext = s.context || s, 9184 9185 // Context for global events is callbackContext if it is a DOM node or jQuery collection 9186 globalEventContext = s.context && 9187 ( callbackContext.nodeType || callbackContext.jquery ) ? 9188 jQuery( callbackContext ) : 9189 jQuery.event, 9190 9191 // Deferreds 9192 deferred = jQuery.Deferred(), 9193 completeDeferred = jQuery.Callbacks( "once memory" ), 9194 9195 // Status-dependent callbacks 9196 statusCode = s.statusCode || {}, 9197 9198 // Headers (they are sent all at once) 9199 requestHeaders = {}, 9200 requestHeadersNames = {}, 9201 9202 // Default abort message 9203 strAbort = "canceled", 9204 9205 // Fake xhr 9206 jqXHR = { 9207 readyState: 0, 9208 9209 // Builds headers hashtable if needed 9210 getResponseHeader: function( key ) { 9211 var match; 9212 if ( completed ) { 9213 if ( !responseHeaders ) { 9214 responseHeaders = {}; 9215 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 9216 responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; 9217 } 9218 } 9219 match = responseHeaders[ key.toLowerCase() ]; 9220 } 9221 return match == null ? null : match; 9222 }, 9223 9224 // Raw string 9225 getAllResponseHeaders: function() { 9226 return completed ? responseHeadersString : null; 9227 }, 9228 9229 // Caches the header 9230 setRequestHeader: function( name, value ) { 9231 if ( completed == null ) { 9232 name = requestHeadersNames[ name.toLowerCase() ] = 9233 requestHeadersNames[ name.toLowerCase() ] || name; 9234 requestHeaders[ name ] = value; 9235 } 9236 return this; 9237 }, 9238 9239 // Overrides response content-type header 9240 overrideMimeType: function( type ) { 9241 if ( completed == null ) { 9242 s.mimeType = type; 9243 } 9244 return this; 9245 }, 9246 9247 // Status-dependent callbacks 9248 statusCode: function( map ) { 9249 var code; 9250 if ( map ) { 9251 if ( completed ) { 9252 9253 // Execute the appropriate callbacks 9254 jqXHR.always( map[ jqXHR.status ] ); 9255 } else { 9256 9257 // Lazy-add the new callbacks in a way that preserves old ones 9258 for ( code in map ) { 9259 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 9260 } 9261 } 9262 } 9263 return this; 9264 }, 9265 9266 // Cancel the request 9267 abort: function( statusText ) { 9268 var finalText = statusText || strAbort; 9269 if ( transport ) { 9270 transport.abort( finalText ); 9271 } 9272 done( 0, finalText ); 9273 return this; 9274 } 9275 }; 9276 9277 // Attach deferreds 9278 deferred.promise( jqXHR ); 9279 9280 // Add protocol if not provided (prefilters might expect it) 9281 // Handle falsy url in the settings object (#10093: consistency with old signature) 9282 // We also use the url parameter if available 9283 s.url = ( ( url || s.url || location.href ) + "" ) 9284 .replace( rprotocol, location.protocol + "//" ); 9285 9286 // Alias method option to type as per ticket #12004 9287 s.type = options.method || options.type || s.method || s.type; 9288 9289 // Extract dataTypes list 9290 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 9291 9292 // A cross-domain request is in order when the origin doesn't match the current origin. 9293 if ( s.crossDomain == null ) { 9294 urlAnchor = document.createElement( "a" ); 9295 9296 // Support: IE <=8 - 11, Edge 12 - 13 9297 // IE throws exception on accessing the href property if url is malformed, 9298 // e.g. http://example.com:80x/ 9299 try { 9300 urlAnchor.href = s.url; 9301 9302 // Support: IE <=8 - 11 only 9303 // Anchor's host property isn't correctly set when s.url is relative 9304 urlAnchor.href = urlAnchor.href; 9305 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 9306 urlAnchor.protocol + "//" + urlAnchor.host; 9307 } catch ( e ) { 9308 9309 // If there is an error parsing the URL, assume it is crossDomain, 9310 // it can be rejected by the transport if it is invalid 9311 s.crossDomain = true; 9312 } 9313 } 9314 9315 // Convert data if not already a string 9316 if ( s.data && s.processData && typeof s.data !== "string" ) { 9317 s.data = jQuery.param( s.data, s.traditional ); 9318 } 9319 9320 // Apply prefilters 9321 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 9322 9323 // If request was aborted inside a prefilter, stop there 9324 if ( completed ) { 9325 return jqXHR; 9326 } 9327 9328 // We can fire global events as of now if asked to 9329 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 9330 fireGlobals = jQuery.event && s.global; 9331 9332 // Watch for a new set of requests 9333 if ( fireGlobals && jQuery.active++ === 0 ) { 9334 jQuery.event.trigger( "ajaxStart" ); 9335 } 9336 9337 // Uppercase the type 9338 s.type = s.type.toUpperCase(); 9339 9340 // Determine if request has content 9341 s.hasContent = !rnoContent.test( s.type ); 9342 9343 // Save the URL in case we're toying with the If-Modified-Since 9344 // and/or If-None-Match header later on 9345 // Remove hash to simplify url manipulation 9346 cacheURL = s.url.replace( rhash, "" ); 9347 9348 // More options handling for requests with no content 9349 if ( !s.hasContent ) { 9350 9351 // Remember the hash so we can put it back 9352 uncached = s.url.slice( cacheURL.length ); 9353 9354 // If data is available, append data to url 9355 if ( s.data ) { 9356 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 9357 9358 // #9682: remove data so that it's not used in an eventual retry 9359 delete s.data; 9360 } 9361 9362 // Add or update anti-cache param if needed 9363 if ( s.cache === false ) { 9364 cacheURL = cacheURL.replace( rantiCache, "$1" ); 9365 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; 9366 } 9367 9368 // Put hash and anti-cache on the URL that will be requested (gh-1732) 9369 s.url = cacheURL + uncached; 9370 9371 // Change '%20' to '+' if this is encoded form body content (gh-2658) 9372 } else if ( s.data && s.processData && 9373 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 9374 s.data = s.data.replace( r20, "+" ); 9375 } 9376 9377 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9378 if ( s.ifModified ) { 9379 if ( jQuery.lastModified[ cacheURL ] ) { 9380 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 9381 } 9382 if ( jQuery.etag[ cacheURL ] ) { 9383 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 9384 } 9385 } 9386 9387 // Set the correct header, if data is being sent 9388 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 9389 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 9390 } 9391 9392 // Set the Accepts header for the server, depending on the dataType 9393 jqXHR.setRequestHeader( 9394 "Accept", 9395 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 9396 s.accepts[ s.dataTypes[ 0 ] ] + 9397 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 9398 s.accepts[ "*" ] 9399 ); 9400 9401 // Check for headers option 9402 for ( i in s.headers ) { 9403 jqXHR.setRequestHeader( i, s.headers[ i ] ); 9404 } 9405 9406 // Allow custom headers/mimetypes and early abort 9407 if ( s.beforeSend && 9408 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 9409 9410 // Abort if not done already and return 9411 return jqXHR.abort(); 9412 } 9413 9414 // Aborting is no longer a cancellation 9415 strAbort = "abort"; 9416 9417 // Install callbacks on deferreds 9418 completeDeferred.add( s.complete ); 9419 jqXHR.done( s.success ); 9420 jqXHR.fail( s.error ); 9421 9422 // Get transport 9423 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 9424 9425 // If no transport, we auto-abort 9426 if ( !transport ) { 9427 done( -1, "No Transport" ); 9428 } else { 9429 jqXHR.readyState = 1; 9430 9431 // Send global event 9432 if ( fireGlobals ) { 9433 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 9434 } 9435 9436 // If request was aborted inside ajaxSend, stop there 9437 if ( completed ) { 9438 return jqXHR; 9439 } 9440 9441 // Timeout 9442 if ( s.async && s.timeout > 0 ) { 9443 timeoutTimer = window.setTimeout( function() { 9444 jqXHR.abort( "timeout" ); 9445 }, s.timeout ); 9446 } 9447 9448 try { 9449 completed = false; 9450 transport.send( requestHeaders, done ); 9451 } catch ( e ) { 9452 9453 // Rethrow post-completion exceptions 9454 if ( completed ) { 9455 throw e; 9456 } 9457 9458 // Propagate others as results 9459 done( -1, e ); 9460 } 9461 } 9462 9463 // Callback for when everything is done 9464 function done( status, nativeStatusText, responses, headers ) { 9465 var isSuccess, success, error, response, modified, 9466 statusText = nativeStatusText; 9467 9468 // Ignore repeat invocations 9469 if ( completed ) { 9470 return; 9471 } 9472 9473 completed = true; 9474 9475 // Clear timeout if it exists 9476 if ( timeoutTimer ) { 9477 window.clearTimeout( timeoutTimer ); 9478 } 9479 9480 // Dereference transport for early garbage collection 9481 // (no matter how long the jqXHR object will be used) 9482 transport = undefined; 9483 9484 // Cache response headers 9485 responseHeadersString = headers || ""; 9486 9487 // Set readyState 9488 jqXHR.readyState = status > 0 ? 4 : 0; 9489 9490 // Determine if successful 9491 isSuccess = status >= 200 && status < 300 || status === 304; 9492 9493 // Get response data 9494 if ( responses ) { 9495 response = ajaxHandleResponses( s, jqXHR, responses ); 9496 } 9497 9498 // Convert no matter what (that way responseXXX fields are always set) 9499 response = ajaxConvert( s, response, jqXHR, isSuccess ); 9500 9501 // If successful, handle type chaining 9502 if ( isSuccess ) { 9503 9504 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9505 if ( s.ifModified ) { 9506 modified = jqXHR.getResponseHeader( "Last-Modified" ); 9507 if ( modified ) { 9508 jQuery.lastModified[ cacheURL ] = modified; 9509 } 9510 modified = jqXHR.getResponseHeader( "etag" ); 9511 if ( modified ) { 9512 jQuery.etag[ cacheURL ] = modified; 9513 } 9514 } 9515 9516 // if no content 9517 if ( status === 204 || s.type === "HEAD" ) { 9518 statusText = "nocontent"; 9519 9520 // if not modified 9521 } else if ( status === 304 ) { 9522 statusText = "notmodified"; 9523 9524 // If we have data, let's convert it 9525 } else { 9526 statusText = response.state; 9527 success = response.data; 9528 error = response.error; 9529 isSuccess = !error; 9530 } 9531 } else { 9532 9533 // Extract error from statusText and normalize for non-aborts 9534 error = statusText; 9535 if ( status || !statusText ) { 9536 statusText = "error"; 9537 if ( status < 0 ) { 9538 status = 0; 9539 } 9540 } 9541 } 9542 9543 // Set data for the fake xhr object 9544 jqXHR.status = status; 9545 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 9546 9547 // Success/Error 9548 if ( isSuccess ) { 9549 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 9550 } else { 9551 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 9552 } 9553 9554 // Status-dependent callbacks 9555 jqXHR.statusCode( statusCode ); 9556 statusCode = undefined; 9557 9558 if ( fireGlobals ) { 9559 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 9560 [ jqXHR, s, isSuccess ? success : error ] ); 9561 } 9562 9563 // Complete 9564 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 9565 9566 if ( fireGlobals ) { 9567 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 9568 9569 // Handle the global AJAX counter 9570 if ( !( --jQuery.active ) ) { 9571 jQuery.event.trigger( "ajaxStop" ); 9572 } 9573 } 9574 } 9575 9576 return jqXHR; 9577 }, 9578 9579 getJSON: function( url, data, callback ) { 9580 return jQuery.get( url, data, callback, "json" ); 9581 }, 9582 9583 getScript: function( url, callback ) { 9584 return jQuery.get( url, undefined, callback, "script" ); 9585 } 9586} ); 9587 9588jQuery.each( [ "get", "post" ], function( i, method ) { 9589 jQuery[ method ] = function( url, data, callback, type ) { 9590 9591 // Shift arguments if data argument was omitted 9592 if ( jQuery.isFunction( data ) ) { 9593 type = type || callback; 9594 callback = data; 9595 data = undefined; 9596 } 9597 9598 // The url can be an options object (which then must have .url) 9599 return jQuery.ajax( jQuery.extend( { 9600 url: url, 9601 type: method, 9602 dataType: type, 9603 data: data, 9604 success: callback 9605 }, jQuery.isPlainObject( url ) && url ) ); 9606 }; 9607} ); 9608 9609 9610jQuery._evalUrl = function( url ) { 9611 return jQuery.ajax( { 9612 url: url, 9613 9614 // Make this explicit, since user can override this through ajaxSetup (#11264) 9615 type: "GET", 9616 dataType: "script", 9617 cache: true, 9618 async: false, 9619 global: false, 9620 "throws": true 9621 } ); 9622}; 9623 9624 9625jQuery.fn.extend( { 9626 wrapAll: function( html ) { 9627 var wrap; 9628 9629 if ( this[ 0 ] ) { 9630 if ( jQuery.isFunction( html ) ) { 9631 html = html.call( this[ 0 ] ); 9632 } 9633 9634 // The elements to wrap the target around 9635 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 9636 9637 if ( this[ 0 ].parentNode ) { 9638 wrap.insertBefore( this[ 0 ] ); 9639 } 9640 9641 wrap.map( function() { 9642 var elem = this; 9643 9644 while ( elem.firstElementChild ) { 9645 elem = elem.firstElementChild; 9646 } 9647 9648 return elem; 9649 } ).append( this ); 9650 } 9651 9652 return this; 9653 }, 9654 9655 wrapInner: function( html ) { 9656 if ( jQuery.isFunction( html ) ) { 9657 return this.each( function( i ) { 9658 jQuery( this ).wrapInner( html.call( this, i ) ); 9659 } ); 9660 } 9661 9662 return this.each( function() { 9663 var self = jQuery( this ), 9664 contents = self.contents(); 9665 9666 if ( contents.length ) { 9667 contents.wrapAll( html ); 9668 9669 } else { 9670 self.append( html ); 9671 } 9672 } ); 9673 }, 9674 9675 wrap: function( html ) { 9676 var isFunction = jQuery.isFunction( html ); 9677 9678 return this.each( function( i ) { 9679 jQuery( this ).wrapAll( i
vendor: 2,399 bytes, lines 9679-9771
9679sFunction ? html.call( this, i ) : html ); 9680 } ); 9681 }, 9682 9683 unwrap: function( selector ) { 9684 this.parent( selector ).not( "body" ).each( function() { 9685 jQuery( this ).replaceWith( this.childNodes ); 9686 } ); 9687 return this; 9688 } 9689} ); 9690 9691 9692jQuery.expr.pseudos.hidden = function( elem ) { 9693 return !jQuery.expr.pseudos.visible( elem ); 9694}; 9695jQuery.expr.pseudos.visible = function( elem ) { 9696 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 9697}; 9698 9699 9700 9701 9702jQuery.ajaxSettings.xhr = function() { 9703 try { 9704 return new window.XMLHttpRequest(); 9705 } catch ( e ) {} 9706}; 9707 9708var xhrSuccessStatus = { 9709 9710 // File protocol always yields status code 0, assume 200 9711 0: 200, 9712 9713 // Support: IE <=9 only 9714 // #1450: sometimes IE returns 1223 when it should be 204 9715 1223: 204 9716 }, 9717 xhrSupported = jQuery.ajaxSettings.xhr(); 9718 9719support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 9720support.ajax = xhrSupported = !!xhrSupported; 9721 9722jQuery.ajaxTransport( function( options ) { 9723 var callback, errorCallback; 9724 9725 // Cross domain only allowed if supported through XMLHttpRequest 9726 if ( support.cors || xhrSupported && !options.crossDomain ) { 9727 return { 9728 send: function( headers, complete ) { 9729 var i, 9730 xhr = options.xhr(); 9731 9732 xhr.open( 9733 options.type, 9734 options.url, 9735 options.async, 9736 options.username, 9737 options.password 9738 ); 9739 9740 // Apply custom fields if provided 9741 if ( options.xhrFields ) { 9742 for ( i in options.xhrFields ) { 9743 xhr[ i ] = options.xhrFields[ i ]; 9744 } 9745 } 9746 9747 // Override mime type if needed 9748 if ( options.mimeType && xhr.overrideMimeType ) { 9749 xhr.overrideMimeType( options.mimeType ); 9750 } 9751 9752 // X-Requested-With header 9753 // For cross-domain requests, seeing as conditions for a preflight are 9754 // akin to a jigsaw puzzle, we simply never set it to be sure. 9755 // (it can always be set on a per-request basis or even using ajaxSetup) 9756 // For same-domain requests, won't change header if already provided. 9757 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 9758 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 9759 } 9760 9761 // Set headers 9762 for ( i in headers ) { 9763 xhr.setRequestHeader( i, headers[ i ] ); 9764 } 9765 9766 // Callback 9767 callback = function( type ) { 9768 return function() { 9769 if ( callback ) { 9770 callback = errorCallback = xhr.onload = 9771 xhr.onerror = xhr.onabort = xhr.on
vendor: 5,102 bytes, lines 9771-9976
9771readystatechange = null; 9772 9773 if ( type === "abort" ) { 9774 xhr.abort(); 9775 } else if ( type === "error" ) { 9776 9777 // Support: IE <=9 only 9778 // On a manual native abort, IE9 throws 9779 // errors on any property access that is not readyState 9780 if ( typeof xhr.status !== "number" ) { 9781 complete( 0, "error" ); 9782 } else { 9783 complete( 9784 9785 // File: protocol always yields status 0; see #8605, #14207 9786 xhr.status, 9787 xhr.statusText 9788 ); 9789 } 9790 } else { 9791 complete( 9792 xhrSuccessStatus[ xhr.status ] || xhr.status, 9793 xhr.statusText, 9794 9795 // Support: IE <=9 only 9796 // IE9 has no XHR2 but throws on binary (trac-11426) 9797 // For XHR2 non-text, let the caller handle it (gh-2498) 9798 ( xhr.responseType || "text" ) !== "text" || 9799 typeof xhr.responseText !== "string" ? 9800 { binary: xhr.response } : 9801 { text: xhr.responseText }, 9802 xhr.getAllResponseHeaders() 9803 ); 9804 } 9805 } 9806 }; 9807 }; 9808 9809 // Listen to events 9810 xhr.onload = callback(); 9811 errorCallback = xhr.onerror = callback( "error" ); 9812 9813 // Support: IE 9 only 9814 // Use onreadystatechange to replace onabort 9815 // to handle uncaught aborts 9816 if ( xhr.onabort !== undefined ) { 9817 xhr.onabort = errorCallback; 9818 } else { 9819 xhr.onreadystatechange = function() { 9820 9821 // Check readyState before timeout as it changes 9822 if ( xhr.readyState === 4 ) { 9823 9824 // Allow onerror to be called first, 9825 // but that will not handle a native abort 9826 // Also, save errorCallback to a variable 9827 // as xhr.onerror cannot be accessed 9828 window.setTimeout( function() { 9829 if ( callback ) { 9830 errorCallback(); 9831 } 9832 } ); 9833 } 9834 }; 9835 } 9836 9837 // Create the abort callback 9838 callback = callback( "abort" ); 9839 9840 try { 9841 9842 // Do send the request (this may raise an exception) 9843 xhr.send( options.hasContent && options.data || null ); 9844 } catch ( e ) { 9845 9846 // #14683: Only rethrow if this hasn't been notified as an error yet 9847 if ( callback ) { 9848 throw e; 9849 } 9850 } 9851 }, 9852 9853 abort: function() { 9854 if ( callback ) { 9855 callback(); 9856 } 9857 } 9858 }; 9859 } 9860} ); 9861 9862 9863 9864 9865// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 9866jQuery.ajaxPrefilter( function( s ) { 9867 if ( s.crossDomain ) { 9868 s.contents.script = false; 9869 } 9870} ); 9871 9872// Install script dataType 9873jQuery.ajaxSetup( { 9874 accepts: { 9875 script: "text/javascript, application/javascript, " + 9876 "application/ecmascript, application/x-ecmascript" 9877 }, 9878 contents: { 9879 script: /\b(?:java|ecma)script\b/ 9880 }, 9881 converters: { 9882 "text script": function( text ) { 9883 jQuery.globalEval( text ); 9884 return text; 9885 } 9886 } 9887} ); 9888 9889// Handle cache's special case and crossDomain 9890jQuery.ajaxPrefilter( "script", function( s ) { 9891 if ( s.cache === undefined ) { 9892 s.cache = false; 9893 } 9894 if ( s.crossDomain ) { 9895 s.type = "GET"; 9896 } 9897} ); 9898 9899// Bind script tag hack transport 9900jQuery.ajaxTransport( "script", function( s ) { 9901 9902 // This transport only deals with cross domain requests 9903 if ( s.crossDomain ) { 9904 var script, callback; 9905 return { 9906 send: function( _, complete ) { 9907 script = jQuery( "<script>" ).prop( { 9908 charset: s.scriptCharset, 9909 src: s.url 9910 } ).on( 9911 "load error", 9912 callback = function( evt ) { 9913 script.remove(); 9914 callback = null; 9915 if ( evt ) { 9916 complete( evt.type === "error" ? 404 : 200, evt.type ); 9917 } 9918 } 9919 ); 9920 9921 // Use native DOM manipulation to avoid our domManip AJAX trickery 9922 document.head.appendChild( script[ 0 ] ); 9923 }, 9924 abort: function() { 9925 if ( callback ) { 9926 callback(); 9927 } 9928 } 9929 }; 9930 } 9931} ); 9932 9933 9934 9935 9936var oldCallbacks = [], 9937 rjsonp = /(=)\?(?=&|$)|\?\?/; 9938 9939// Default jsonp settings 9940jQuery.ajaxSetup( { 9941 jsonp: "callback", 9942 jsonpCallback: function() { 9943 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); 9944 this[ callback ] = true; 9945 return callback; 9946 } 9947} ); 9948 9949// Detect, normalize options and install callbacks for jsonp requests 9950jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 9951 9952 var callbackName, overwritten, responseContainer, 9953 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 9954 "url" : 9955 typeof s.data === "string" && 9956 ( s.contentType || "" ) 9957 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 9958 rjsonp.test( s.data ) && "data" 9959 ); 9960 9961 // Handle iff the expected data type is "jsonp" or we have a parameter to set 9962 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 9963 9964 // Get callback name, remembering preexisting value associated with it 9965 callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ? 9966 s.jsonpCallback() : 9967 s.jsonpCallback; 9968 9969 // Insert callback into url or form data 9970 if ( jsonProp ) { 9971 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 9972 } else if ( s.jsonp !== false ) { 9973 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 9974 } 9975 9976 // Use data converter to retrieve json after script execution
vendor: 2,994 bytes, lines 9977-10086
9977 s.converters[ "script json" ] = function() { 9978 if ( !responseContainer ) { 9979 jQuery.error( callbackName + " was not called" ); 9980 } 9981 return responseContainer[ 0 ]; 9982 }; 9983 9984 // Force json dataType 9985 s.dataTypes[ 0 ] = "json"; 9986 9987 // Install callback 9988 overwritten = window[ callbackName ]; 9989 window[ callbackName ] = function() { 9990 responseContainer = arguments; 9991 }; 9992 9993 // Clean-up function (fires after converters) 9994 jqXHR.always( function() { 9995 9996 // If previous value didn't exist - remove it 9997 if ( overwritten === undefined ) { 9998 jQuery( window ).removeProp( callbackName ); 9999 10000 // Otherwise restore preexisting value 10001 } else { 10002 window[ callbackName ] = overwritten; 10003 } 10004 10005 // Save back as free 10006 if ( s[ callbackName ] ) { 10007 10008 // Make sure that re-using the options doesn't screw things around 10009 s.jsonpCallback = originalSettings.jsonpCallback; 10010 10011 // Save the callback name for future use 10012 oldCallbacks.push( callbackName ); 10013 } 10014 10015 // Call if it was a function and we have a response 10016 if ( responseContainer && jQuery.isFunction( overwritten ) ) { 10017 overwritten( responseContainer[ 0 ] ); 10018 } 10019 10020 responseContainer = overwritten = undefined; 10021 } ); 10022 10023 // Delegate to script 10024 return "script"; 10025 } 10026} ); 10027 10028 10029 10030 10031// Support: Safari 8 only 10032// In Safari 8 documents created via document.implementation.createHTMLDocument 10033// collapse sibling forms: the second one becomes a child of the first one. 10034// Because of that, this security measure has to be disabled in Safari 8. 10035// https://bugs.webkit.org/show_bug.cgi?id=137337 10036support.createHTMLDocument = ( function() { 10037 var body = document.implementation.createHTMLDocument( "" ).body; 10038 body.innerHTML = "<form></form><form></form>"; 10039 return body.childNodes.length === 2; 10040} )(); 10041 10042 10043// Argument "data" should be string of html 10044// context (optional): If specified, the fragment will be created in this context, 10045// defaults to document 10046// keepScripts (optional): If true, will include scripts passed in the html string 10047jQuery.parseHTML = function( data, context, keepScripts ) { 10048 if ( typeof data !== "string" ) { 10049 return []; 10050 } 10051 if ( typeof context === "boolean" ) { 10052 keepScripts = context; 10053 context = false; 10054 } 10055 10056 var base, parsed, scripts; 10057 10058 if ( !context ) { 10059 10060 // Stop scripts or inline event handlers from being executed immediately 10061 // by using document.implementation 10062 if ( support.createHTMLDocument ) { 10063 context = document.implementation.createHTMLDocument( "" ); 10064 10065 // Set the base href for the created document 10066 // so any parsed elements with URLs 10067 // are based on the document's URL (gh-2965) 10068 base = context.createElement( "base" ); 10069 base.href = document.location.href; 10070 context.head.appendChild( base ); 10071 } else { 10072 context = document; 10073 } 10074 } 10075 10076 parsed = rsingleTag.exec( data ); 10077 scripts = !keepScripts && []; 10078 10079 // Single tag 10080 if ( parsed ) { 10081 return [ context.createElement( parsed[ 1 ] ) ]; 10082 } 10083 10084 parsed = buildFragment( [ data ], context, scripts ); 10085 10086 if ( scripts && scripts.length ) {
vendor: 4,095 bytes, lines 10087-10257
10087 jQuery( scripts ).remove(); 10088 } 10089 10090 return jQuery.merge( [], parsed.childNodes ); 10091}; 10092 10093 10094/** 10095 * Load a url into a page 10096 */ 10097jQuery.fn.load = function( url, params, callback ) { 10098 var selector, type, response, 10099 self = this, 10100 off = url.indexOf( " " ); 10101 10102 if ( off > -1 ) { 10103 selector = stripAndCollapse( url.slice( off ) ); 10104 url = url.slice( 0, off ); 10105 } 10106 10107 // If it's a function 10108 if ( jQuery.isFunction( params ) ) { 10109 10110 // We assume that it's the callback 10111 callback = params; 10112 params = undefined; 10113 10114 // Otherwise, build a param string 10115 } else if ( params && typeof params === "object" ) { 10116 type = "POST"; 10117 } 10118 10119 // If we have elements to modify, make the request 10120 if ( self.length > 0 ) { 10121 jQuery.ajax( { 10122 url: url, 10123 10124 // If "type" variable is undefined, then "GET" method will be used. 10125 // Make value of this field explicit since 10126 // user can override it through ajaxSetup method 10127 type: type || "GET", 10128 dataType: "html", 10129 data: params 10130 } ).done( function( responseText ) { 10131 10132 // Save response for use in complete callback 10133 response = arguments; 10134 10135 self.html( selector ? 10136 10137 // If a selector was specified, locate the right elements in a dummy div 10138 // Exclude scripts to avoid IE 'Permission Denied' errors 10139 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 10140 10141 // Otherwise use the full result 10142 responseText ); 10143 10144 // If the request succeeds, this function gets "data", "status", "jqXHR" 10145 // but they are ignored because response was set above. 10146 // If it fails, this function gets "jqXHR", "status", "error" 10147 } ).always( callback && function( jqXHR, status ) { 10148 self.each( function() { 10149 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 10150 } ); 10151 } ); 10152 } 10153 10154 return this; 10155}; 10156 10157 10158 10159 10160// Attach a bunch of functions for handling common AJAX events 10161jQuery.each( [ 10162 "ajaxStart", 10163 "ajaxStop", 10164 "ajaxComplete", 10165 "ajaxError", 10166 "ajaxSuccess", 10167 "ajaxSend" 10168], function( i, type ) { 10169 jQuery.fn[ type ] = function( fn ) { 10170 return this.on( type, fn ); 10171 }; 10172} ); 10173 10174 10175 10176 10177jQuery.expr.pseudos.animated = function( elem ) { 10178 return jQuery.grep( jQuery.timers, function( fn ) { 10179 return elem === fn.elem; 10180 } ).length; 10181}; 10182 10183 10184 10185 10186jQuery.offset = { 10187 setOffset: function( elem, options, i ) { 10188 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 10189 position = jQuery.css( elem, "position" ), 10190 curElem = jQuery( elem ), 10191 props = {}; 10192 10193 // Set position first, in-case top/left are set even on static elem 10194 if ( position === "static" ) { 10195 elem.style.position = "relative"; 10196 } 10197 10198 curOffset = curElem.offset(); 10199 curCSSTop = jQuery.css( elem, "top" ); 10200 curCSSLeft = jQuery.css( elem, "left" ); 10201 calculatePosition = ( position === "absolute" || position === "fixed" ) && 10202 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 10203 10204 // Need to be able to calculate position if either 10205 // top or left is auto and position is either absolute or fixed 10206 if ( calculatePosition ) { 10207 curPosition = curElem.position(); 10208 curTop = curPosition.top; 10209 curLeft = curPosition.left; 10210 10211 } else { 10212 curTop = parseFloat( curCSSTop ) || 0; 10213 curLeft = parseFloat( curCSSLeft ) || 0; 10214 } 10215 10216 if ( jQuery.isFunction( options ) ) { 10217 10218 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 10219 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 10220 } 10221 10222 if ( options.top != null ) { 10223 props.top = ( options.top - curOffset.top ) + curTop; 10224 } 10225 if ( options.left != null ) { 10226 props.left = ( options.left - curOffset.left ) + curLeft; 10227 } 10228 10229 if ( "using" in options ) { 10230 options.using.call( elem, props ); 10231 10232 } else { 10233 curElem.css( props ); 10234 } 10235 } 10236}; 10237 10238jQuery.fn.extend( { 10239 offset: function( options ) { 10240 10241 // Preserve chaining for setter 10242 if ( arguments.length ) { 10243 return options === undefined ? 10244 this : 10245 this.each( function( i ) { 10246 jQuery.offset.setOffset( this, options, i ); 10247 } ); 10248 } 10249 10250 var doc, docElem, rect, win, 10251 elem = this[ 0 ]; 10252 10253 if ( !elem ) { 10254 return; 10255 } 10256 10257 // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
vendor: 4,119 bytes, lines 10258-10396
10258 // Support: IE <=11 only 10259 // Running getBoundingClientRect on a 10260 // disconnected node in IE throws an error 10261 if ( !elem.getClientRects().length ) { 10262 return { top: 0, left: 0 }; 10263 } 10264 10265 rect = elem.getBoundingClientRect(); 10266 10267 doc = elem.ownerDocument; 10268 docElem = doc.documentElement; 10269 win = doc.defaultView; 10270 10271 return { 10272 top: rect.top + win.pageYOffset - docElem.clientTop, 10273 left: rect.left + win.pageXOffset - docElem.clientLeft 10274 }; 10275 }, 10276 10277 position: function() { 10278 if ( !this[ 0 ] ) { 10279 return; 10280 } 10281 10282 var offsetParent, offset, 10283 elem = this[ 0 ], 10284 parentOffset = { top: 0, left: 0 }; 10285 10286 // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, 10287 // because it is its only offset parent 10288 if ( jQuery.css( elem, "position" ) === "fixed" ) { 10289 10290 // Assume getBoundingClientRect is there when computed position is fixed 10291 offset = elem.getBoundingClientRect(); 10292 10293 } else { 10294 10295 // Get *real* offsetParent 10296 offsetParent = this.offsetParent(); 10297 10298 // Get correct offsets 10299 offset = this.offset(); 10300 if ( !nodeName( offsetParent[ 0 ], "html" ) ) { 10301 parentOffset = offsetParent.offset(); 10302 } 10303 10304 // Add offsetParent borders 10305 parentOffset = { 10306 top: parentOffset.top + jQuery.css( offsetParent[ 0 ], "borderTopWidth", true ), 10307 left: parentOffset.left + jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true ) 10308 }; 10309 } 10310 10311 // Subtract parent offsets and element margins 10312 return { 10313 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 10314 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 10315 }; 10316 }, 10317 10318 // This method will return documentElement in the following cases: 10319 // 1) For the element inside the iframe without offsetParent, this method will return 10320 // documentElement of the parent window 10321 // 2) For the hidden or detached element 10322 // 3) For body or html element, i.e. in case of the html node - it will return itself 10323 // 10324 // but those exceptions were never presented as a real life use-cases 10325 // and might be considered as more preferable results. 10326 // 10327 // This logic, however, is not guaranteed and can change at any point in the future 10328 offsetParent: function() { 10329 return this.map( function() { 10330 var offsetParent = this.offsetParent; 10331 10332 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 10333 offsetParent = offsetParent.offsetParent; 10334 } 10335 10336 return offsetParent || documentElement; 10337 } ); 10338 } 10339} ); 10340 10341// Create scrollLeft and scrollTop methods 10342jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 10343 var top = "pageYOffset" === prop; 10344 10345 jQuery.fn[ method ] = function( val ) { 10346 return access( this, function( elem, method, val ) { 10347 10348 // Coalesce documents and windows 10349 var win; 10350 if ( jQuery.isWindow( elem ) ) { 10351 win = elem; 10352 } else if ( elem.nodeType === 9 ) { 10353 win = elem.defaultView; 10354 } 10355 10356 if ( val === undefined ) { 10357 return win ? win[ prop ] : elem[ method ]; 10358 } 10359 10360 if ( win ) { 10361 win.scrollTo( 10362 !top ? val : win.pageXOffset, 10363 top ? val : win.pageYOffset 10364 ); 10365 10366 } else { 10367 elem[ method ] = val; 10368 } 10369 }, method, val, arguments.length ); 10370 }; 10371} ); 10372 10373// Support: Safari <=7 - 9.1, Chrome <=37 - 49 10374// Add the top/left cssHooks using jQuery.fn.position 10375// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 10376// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 10377// getComputedStyle returns percent when specified for top/left/bottom/right; 10378// rather than make the css module depend on the offset module, just check for it here 10379jQuery.each( [ "top", "left" ], function( i, prop ) { 10380 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 10381 function( elem, computed ) { 10382 if ( computed ) { 10383 computed = curCSS( elem, prop ); 10384 10385 // If curCSS returns percentage, fallback to offset 10386 return rnumnonpx.test( computed ) ? 10387 jQuery( elem ).position()[ prop ] + "px" : 10388 computed; 10389 } 10390 } 10391 ); 10392} ); 10393 10394 10395// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 10396jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10397 jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, 10398 function( defaultExtra, funcName ) { 10399 10400 // Margin is only for outerHeight, outerWidth 10401 jQuery.fn[ funcName ] = function( margin, value ) { 10402 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 10403 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 10404 10405 return access( this, function( elem, type, value ) { 10406 var doc; 10407 10408 if ( jQuery.isWindow( elem ) ) { 10409 10410 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 10411 return funcName.indexOf( "outer" ) === 0 ? 10412 elem[ "inner" + name ] : 10413 elem.document.documentElement[ "client" + name ]; 10414 } 10415 10416 // Get document width or height 10417 if ( elem.nodeType === 9 ) { 10418 doc = elem.documentElement; 10419 10420 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 10421 // whichever is greatest 10422 return Math.max( 10423 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 10424 elem.body[ "offset" + name ], doc[ "offset" + name ], 10425 doc[ "client" + name ] 10426 ); 10427 } 10428 10429 return value === undefined ? 10430 10431 // Get width or height on the element, requesting but not forcing parseFloat 10432 jQuery.css( elem, type, extra ) : 10433 10434 // Set width or height on the element 10435 jQuery.style( elem, type, value, extra ); 10436 }, type, chainable ? margin : undefined, chainable ); 10437 }; 10438 } ); 10439} ); 10440 10441 10442jQuery.fn.extend( { 10443 10444 bind: function( types, data, fn ) { 10445 return this.on( types, null, data, fn ); 10446 }, 10447 unbind: function( types, fn ) { 10448 return this.off( types, null, fn ); 10449 }, 10450 10451 delegate: function( selector, types, data, fn ) { 10452 return this.on( types, selector, data, fn ); 10453 }, 10454 undelegate: function( selector, types, fn ) { 10455 10456 // ( namespace ) or ( selector, types [, fn] ) 10457 return arguments.length === 1 ? 10458 this.off( selector, "**" ) : 10459 this.off( types, selector || "**", fn ); 10460 } 10461} ); 10462 10463jQuery.holdReady = function( hold ) { 10464 if ( hold ) { 10465 jQuery.readyWait++; 10466 } else { 10467 jQuery.ready( true ); 10468 } 10469}; 10470jQuery.isArray = Array.isArray; 10471jQuery.parseJSON = JSON.parse; 10472jQuery.nodeName = nodeName; 10473 10474 10475 10476 10477// Register as a named AMD module, since jQuery can be concatenated with other 10478// files that may use define, but not via a proper concatenation script that 10479// understands anonymous AMD modules. A named AMD is safest and most robust 10480// way to register. Lowercase jquery is used because AMD module names are 10481// derived from file names, and jQuery is normally delivered in a lowercase 10482// file name. Do this after creating the global so that if an AMD module wants 10483// to call noConflict to hide this version of jQuery, it will work. 10484 10485// Note that for maximum portability, libraries that are not jQuery should 10486// declare themselves as anonymous modules, and avoid setting a global if an 10487// AMD loader is present. jQuery is a special case. For more information, see 10488// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 10489 10490if ( typeof define === "function" && define.amd ) { 10491 define( "jquery", [], function() { 10492 return jQuery; 10493 } ); 10494} 10495 10496 10497 10498 10499var 10500 10501 // Map over jQuery in case of overwrite 10502 _jQuery = window.jQuery, 10503 10504 // Map over the $ in case of overwrite 10505 _$ = window.$; 10506 10507jQuery.noConflict = function( deep ) { 10508 if ( window.$ === jQuery ) { 10509 window.$ = _$; 10510 } 10511 10512 if ( deep && window.jQuery === jQuery ) { 10513 window.jQuery = _jQuery; 10514 } 10515 10516 return jQuery; 10517}; 10518 10519// Expose jQuery and $ identifiers, even in AMD 10520// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 10521// and CommonJS for browser emulators (#13566) 10522if ( !noGlobal ) { 10523 window.jQuery = window.$ = jQuery; 10524} 10525 10526 10527 10528 10529return jQuery; 10530} ); 10531 10532; browserify_shim__define__module__export__(typeof $ != "undefined" ? $ : window.$); 10533 10534}).call(global, undefined, undefined, undefined, undefined, function defineExport(ex) { module.exports = ex; }); 10535 10536}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 10537},{}],4:[function(require,module,exports){ 10538(function(root, factory) { 10539 10540 if (root === null) { 10541 throw new Error('Google-maps package can be used only in browser'); 10542 } 10543 10544 if (typeof define === 'function' && define.amd) { 10545 define(factory); 10546 } else if (typeof exports === 'object') { 10547 module.exports = factory(); 10548 } else { 10549 root.GoogleMapsLoader = factory(); 10550 } 10551 10552})(typeof window !== 'undefined' ? window : null, function() { 10553 10554 10555 'use strict'; 10556 10557 10558 var googleVersion = '3.18'; 10559 10560 var script = null; 10561 10562 var google = null; 10563 10564 var loading = false;
10565 10566 var callbacks = []; 10567 10568 var onLoadEvents = []; 10569 10570 var originalCreateLoaderMethod = null; 10571 10572 10573 var GoogleMapsLoader = {}; 10574 10575 10576 GoogleMapsLoader.URL = 'https://maps.googleapis.com/maps/api/js'; 10577 10578 GoogleMapsLoader.KEY = null; 10579 10580 GoogleMapsLoader.LIBRARIES = []; 10581 10582 GoogleMapsLoader.CLIENT = null; 10583 10584 GoogleMapsLoader.CHANNEL = null; 10585 10586 GoogleMapsLoader.SENSOR = null; 10587 10588 GoogleMapsLoader.VERSION = googleVersion; 10589 10590 GoogleMapsLoader.WINDOW_CALLBACK_NAME = '__google_maps_api_provider_initializator__'; 10591 10592 10593 GoogleMapsLoader._googleMockApiObject = {}; 10594 10595 10596 GoogleMapsLoader.load = function(fn) { 10597 if (google === null) { 10598 if (loading === true) { 10599 if (fn) { 10600 callbacks.push(fn); 10601 } 10602 } else { 10603 loading = true; 10604 10605 window[GoogleMapsLoader.WINDOW_CALLBACK_NAME] = function() { 10606 ready(fn); 10607 }; 10608 10609 GoogleMapsLoader.createLoader(); 10610 } 10611 } else if (fn) { 10612 fn(google); 10613 } 10614 10615 var promiseError = function() { 10616 throw new Error('Using promises is not supported anymore. Please take a look in new documentation and use callback instead.'); 10617 }; 10618 10619 return { 10620 then: promiseError, 10621 catch: promiseError, 10622 fail: promiseError 10623 }; 10624 }; 10625 10626 10627 GoogleMapsLoader.createLoader = function() { 10628 script = document.createElement('script'); 10629 script.type = 'text/javascript'; 10630 script.src = GoogleMapsLoader.createUrl(); 10631 10632 document.body.appendChild(script); 10633 }; 10634 10635 10636 GoogleMapsLoader.isLoaded = function() { 10637 return google !== null; 10638 }; 10639 10640 10641 GoogleMapsLoader.createUrl = function() { 10642 var url = GoogleMapsLoader.URL; 10643 10644 url += '?callback=' + GoogleMapsLoader.WINDOW_CALLBACK_NAME; 10645 10646 url += '&sensor=' + ((GoogleMapsLoader.SENSOR === true || GoogleMapsLoader.SENSOR === 'true') ? 'true' : 'false'); 10647 10648 if (GoogleMapsLoader.KEY) { 10649 url += '&key=' + GoogleMapsLoader.KEY; 10650 } 10651 10652 if (GoogleMapsLoader.LIBRARIES.length > 0) { 10653 url += '&libraries=' + GoogleMapsLoader.LIBRARIES.join(','); 10654 } 10655 10656 if (GoogleMapsLoader.CLIENT) { 10657 url += '&client=' + GoogleMapsLoader.CLIENT + '&v=' + GoogleMapsLoader.VERSION; 10658 } 10659 10660 if (GoogleMapsLoader.CHANNEL) { 10661 url += '&channel=' + GoogleMapsLoader.CHANNEL; 10662 } 10663 10664 return url; 10665 }; 10666 10667 10668 GoogleMapsLoader.release = function(fn) { 10669 var release = function() { 10670 GoogleMapsLoader.KEY = null; 10671 GoogleMapsLoader.LIBRARIES = []; 10672 GoogleMapsLoader.CLIENT = null; 10673 GoogleMapsLoader.SENSOR = false; 10674 GoogleMapsLoader.VERSION = googleVersion; 10675 10676 google = null; 10677 loading = false; 10678 callbacks = []; 10679 onLoadEvents = []; 10680 10681 if (typeof window.google !== 'undefined') { 10682 delete window.google; 10683 } 10684 10685 if (typeof window[GoogleMapsLoader.WINDOW_CALLBACK_NAME] !== 'undefined') { 10686 delete window[GoogleMapsLoader.WINDOW_CALLBACK_NAME]; 10687 } 10688 10689 if (originalCreateLoaderMethod !== null) { 10690 GoogleMapsLoader.createLoader = originalCreateLoaderMethod; 10691 originalCreateLoaderMethod = null; 10692 } 10693 10694 if (script !== null) { 10695 script.parentElement.removeChild(script); 10696 script = null; 10697 } 10698 10699 fn(); 10700 }; 10701 10702 if (loading) { 10703 GoogleMapsLoader.load(function() { 10704 release(); 10705 }); 10706 } else { 10707 release(); 10708 } 10709 }; 10710 10711 10712 GoogleMapsLoader.onLoad = function(fn) { 10713 onLoadEvents.push(fn); 10714 }; 10715 10716 10717 GoogleMapsLoader.makeMock = function() { 10718 originalCreateLoaderMethod = GoogleMapsLoader.createLoader; 10719 10720 GoogleMapsLoader.createLoader = function() { 10721 window.google = GoogleMapsLoader._googleMockApiObject; 10722 window[GoogleMapsLoader.WINDOW_CALLBACK_NAME](); 10723 }; 10724 }; 10725 10726 10727 var ready = function(fn) { 10728 var i; 10729 10730 loading = false; 10731 10732 if (google === null) { 10733 google = window.google; 10734 } 10735 10736 for (i = 0; i < onLoadEvents.length; i++) { 10737 onLoadEvents[i](google); 10738 } 10739 10740 if (fn) { 10741 fn(google); 10742 } 10743 10744 for (i = 0; i < callbacks.length; i++) { 10745 callbacks[i](google); 10746 } 10747 10748 callbacks = []; 10749 }; 10750 10751 10752 return GoogleMapsLoader; 10753 10754}); 10755 10756},{}],5:[function(require,module,exports){ 10757/*! 10758 * SVGInjector v2.0.36 - Fast, caching, dynamic inline SVG DOM injection library 10759 * https://github.com/flobacher/SVGInjector2 10760 * forked from: 10761 * https://github.com/iconic/SVGInjector 10762 * 10763 * Copyright (c) 2015 flobacher <[email protected]> 10764 * @license MIT 10765 * 10766 * original Copyright (c) 2014 Waybury <[email protected]> 10767 * @license MIT 10768 */ 10769!function(e,t){"use strict";var n=function(){function n(e){n.instanceCounter++,this.init(e)}var r,s,i,l,a,o,c,u,f,p,d,m,g,v,h,y,b,S,A,C,x,N,k,w,j,E,I,T,G,V="http://www.w3.org/2000/svg",F="http://www.w3.org/1999/xlink",O="sprite",L=O+"--",q=[O],M="icon";return i=[],n.instanceCounter=0,n.prototype.init=function(n){n=n||{},r={},o={},o.isLocal="file:"===e.location.protocol,o.hasSvgSupport=t.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1"),s={count:0,elements:[]},l={},a={},a.evalScripts=n.evalScripts||"always",a.pngFallback=n.pngFallback||!1,a.onlyInject
10769VisiblePart=n.onlyInjectVisiblePart||!0,a.keepStylesClass="undefined"==typeof n.keepStylesClass?"":n.keepStylesClass,a.spriteClassName="undefined"==typeof n.spriteClassName?O:n.spriteClassName,a.spriteClassIdName="undefined"==typeof n.spriteClassIdName?L:n.spriteClassIdName,a.removeStylesClass="undefined"==typeof n.removeStylesClass?M:n.removeStylesClass,a.removeAllStyles="undefined"!=typeof n.removeAllStyles&&n.removeAllStyles,a.fallbackClassName="undefined"==typeof n.fallbackClassName?q:n.fallbackClassName,a.prefixStyleTags="undefined"==typeof n.prefixStyleTags||n.prefixStyleTags,a.spritesheetURL="undefined"!=typeof n.spritesheetURL&&""!==n.spritesheetURL&&n.spritesheetURL,a.prefixFragIdClass=a.spriteClassIdName,a.forceFallbacks="undefined"!=typeof n.forceFallbacks&&n.forceFallbacks,a.forceFallbacks&&(o.hasSvgSupport=!1),x(t.querySelector("html"),"no-svg",o.hasSvgSupport),o.hasSvgSupport&&"undefined"==typeof n.removeStylesClass&&C(a.removeStylesClass)},n.prototype.inject=function(e,t,n){if(void 0!==e.length){var r=0,s=this;I.call(e,function(i){s.injectElement(i,function(s){n&&"function"==typeof n&&n(s),t&&e.length===++r&&t(r)})})}else e?this.injectElement(e,function(r){n&&"function"==typeof n&&n(r),t&&t(1),e=null}):t&&t(0)},n.prototype.injectElement=function(e,t){var n,r=e.getAttribute("data-src")||e.getAttribute("src");if(!r){if(!a.spritesheetURL)return;if(n=h(e),""===n)return;r=a.spritesheetURL+"#"+n}e.setAttribute("data-src",r);var i=r.split("#");1===i.length&&i.push("");var l;if(!/\.svg/i.test(r))return void t("Attempted to inject a file with a non-svg extension: "+r);if(!o.hasSvgSupport){var f=e.getAttribute("data-fallback")||e.getAttribute("data-png");return void(f?(e.setAttribute("src",f),t(null)):a.pngFallback?(i.length>1&&i[1]?(l=i[1]+".png",j(a.fallbackClassName)?c(e,i[1],a.fallbackClassName):w(a.fallbackClassName)?a.fallbackClassName(e,i[1]):"string"==typeof a.fallbackClassName?E(e,a.fallbackClassName):e.setAttribute("src",a.pngFallback+"/"+l)):(l=r.split("/").pop().replace(".svg",".png"),e.setAttribute("src",a.pngFallback+"/"+l)),t(null)):t("This browser does not support SVG and no PNG fallback was defined."))}j(a.fallbackClassName)&&u(e,i[1],a.fallbackClassName),s.elements.indexOf(e)===-1&&(s.elements.push(e),A(t,r,e))},n.prototype.getEnv=function(){return o},n.prototype.getConfig=function(){return a},c=function(e,t,n){var r="undefined"==typeof n?q:n.slice(0);I.call(r,function(e,n){r[n]=e.replace("%s",t)}),E(e,r)},u=function(e,t,n){n="undefined"==typeof n?q.slice(0):n.slice(0);var r,s,i=e.getAttribute("class");"undefined"!=typeof i&&null!==i&&(s=i.split(" "),s&&(I.call(n,function(e){e=e.replace("%s",t),r=s.indexOf(e),r>=0&&(s[r]="")}),e.setAttribute("class",k(s.join(" ")))))},p=function(e,t,n,r){var s=0;return e.textContent=e.textContent.replace(/url\(('|")*#.+('|")*(?=\))/g,function(e){return s++,e+"-"+t}),s},f=function(e,t){var n,r,s,i,l,a,o,c,u,f,p,d,m,g,v,h,y=[{def:"linearGradient",attrs:["fill","stroke"]},{def:"radialGradient",attrs:["fill","stroke"]},{def:"clipPath",attrs:["clip-path"]},{def:"mask",attrs:["mask"]},{def:"filter",attrs:["filter"]},{def:"color-profile",attrs:["color-profile"]},{def:"cursor",attrs:["cursor"]},{def:"marker",attrs:["marker","marker-start","marker-mid","marker-end"]}];I.call(y,function(y){for(r=e.querySelectorAll(y.def+"[id]"),i=0,s=r.length;i<s;i++){for(n=r[i].id+"-"+t,c=y.attrs,f=0,u=c.length;f<u;f++)for(l=e.querySelectorAll("["+c[f]+'="url(#'+r[i].id+')"]'),o=0,a=l.length;o<a;o++)l[o].setAttribute(c[f],"url(#"+n+")");for(p=e.querySelectorAll("[*|href]"),g=[],m=0,d=p.length;m<d;m++)p[m].getAttributeNS(F,"href").toString()==="#"+r[i].id&&g.push(p[m]);for(h=0,v=g.length;h<v;h++)g[h].setAttributeNS(F,"href","#"+n);r[i].id=n}})},d=function(e,t,n){var r;"undefined"==typeof n&&(n=["id","viewBox"]);for(var s=0;s<e.attributes.length;s++)r=e.attributes.item(s),n.indexOf(r.name)<0&&t.setAttribute(r.name,r.value)},m=function(e){var n=t.createElementNS(V,"svg");return I.call(e.childNodes,function(e){n.appendChild(e.cloneNode(!0))}),d(e,n),n},g=function(e,t,n){var r,s,i,l,a,o,c=n.getAttribute("data-src").split("#"),u=e.textContent,f="",p=function(e,t,n){n[t]="."+i+" "+e};if(c.length>1)s=c[1],i=s+"-"+t,r=new RegExp("\\."+s+" ","g"),e.textContent=u.replace(r,"."+i+" ");else{for(l=c[0].split("/"),i=l[l.length-1].replace(".svg","")+"-"+t,r=new RegExp("([\\s\\S]*?){([\\s\\S]*?)}","g");null!==(a=r.exec(u));){o=a[1].trim().split(", "),o.forEach(p);var d=o.join(", ")+"{"+a[2]+"}\n";f+=d}e.textContent=f}n.setAttribute("class",n.getAttribute("class")+" "+i)},v=function(e){var t=e.getAttribute("class");return t?t.trim().split(" "):[]},h=function(e){var t=v(e),n="";return I.call(t,function(e){e.indexOf(a.spriteClassIdName)>=0&&(n=e.replace(a.spriteClassIdName,""))}),n},y=function(e,t,n){var r,s,i,l,a,o,c,u=!1,f=null;if(void 0===n)return t.cloneNode(!0);if(r=t.getElementById(n)){if(l=r.getAttribute("viewBox"),i=l.split(" "),r instanceof SVGSymbolElement)s=m(r),u=!0;
10769else if(r instanceof SVGViewElement){if(f=null,e.onlyInjectVisiblePart){var p='*[width="'+i[2]+'"][height="'+i[3]+'"]';a={},0===Math.abs(parseInt(i[0]))?p+=":not([x])":(a.x=i[0],p+='[x="'+i[0]+'"]'),0===Math.abs(parseInt(i[1]))?p+=":not([y])":(a.y=i[1],p+='[y="'+i[1]+'"]'),c=t.querySelectorAll(p),c.length>1,f=c[0]}if(f&&f instanceof SVGSVGElement){s=f.cloneNode(!0);for(var d in a)"width"!==d&&"height"!==d&&s.removeAttribute(d)}else if(f&&f instanceof SVGUseElement){var g=t.getElementById(f.getAttributeNS(F,"href").substr(1));s=m(g),l=g.getAttribute("viewBox"),i=l.split(" "),u=!0}else u=!0,s=t.cloneNode(!0)}u&&(s.setAttribute("viewBox",i.join(" ")),s.setAttribute("width",i[2]+"px"),s.setAttribute("height",i[3]+"px")),s.setAttribute("xmlns",V),s.setAttribute("xmlns:xlink",F),o=v(s);var h=e.prefixFragIdClass+n;return o.indexOf(h)<0&&(o.push(h),s.setAttribute("class",o.join(" "))),s}},b=function(e,t,n,r){i[e]=i[e]||[],i[e].push({callback:n,fragmentId:t,element:r,name:name})},S=function(e){for(var t,n=0,r=i[e].length;n<r;n++)!function(n){setTimeout(function(){t=i[e][n],N(e,t.fragmentId,t.callback,t.element,t.name)},0)}(n)},A=function(t,n,s){var i,l,a,c,u;if(i=n.split("#"),l=i[0],a=2===i.length?i[1]:void 0,"undefined"!=typeof a&&(u=l.split("/"),c=u[u.length-1].replace(".svg","")),void 0!==r[l])r[l]instanceof SVGSVGElement?N(l,a,t,s,c):b(l,a,t,s,c);else{if(!e.XMLHttpRequest)return t("Browser does not support XMLHttpRequest"),!1;r[l]={},b(l,a,t,s,c);var f=new XMLHttpRequest;f.onreadystatechange=function(){if(4===f.readyState){if(404===f.status||null===f.responseXML)return t("Unable to load SVG file: "+l),!1;if(!(200===f.status||o.isLocal&&0===f.status))return t("There was a problem injecting the SVG: "+f.status+" "+f.statusText),!1;if(f.responseXML instanceof Document)r[l]=f.responseXML.documentElement;else if(DOMParser&&DOMParser instanceof Function){var e;try{var s=new DOMParser;e=s.parseFromString(f.responseText,"text/xml")}catch(t){e=void 0}if(!e||e.getElementsByTagName("parsererror").length)return t("Unable to parse SVG file: "+n),!1;r[l]=e.documentElement}S(l)}},f.open("GET",l),f.overrideMimeType&&f.overrideMimeType("text/xml"),f.send()}},C=function(e){var n="svg."+e+" {fill: currentColor;}",r=t.head||t.getElementsByTagName("head")[0],s=t.createElement("style");s.type="text/css",s.styleSheet?s.styleSheet.cssText=n:s.appendChild(t.createTextNode(n)),r.appendChild(s)},x=function(e,t,n){n?e.className.replace(t,""):e.className+=" "+t},N=function(t,n,i,o,c){var u,m,h,b;if(u=y(a,r[t],n),"undefined"==typeof u||"string"==typeof u)return i(u),!1;u.setAttribute("role","img"),I.call(u.children||[],function(e){e instanceof SVGDefsElement||e instanceof SVGTitleElement||e instanceof SVGDescElement||e.setAttribute("role","presentation")}),b=o.getAttribute("aria-hidden")||u.getAttribute("aria-hidden"),h=T("desc",u,o,n,c,!b),m=T("title",u,o,n,c,!b),b?u.setAttribute("aria-hidden","true"):u.setAttribute("aria-labelledby",m+" "+h),d(o,u,["class"]);var S=[].concat(u.getAttribute("class")||[],"injected-svg",o.getAttribute("class")||[]).join(" ");u.setAttribute("class",k(S)),f(u,s.count,c),u.removeAttribute("xmlns:a");for(var A,C,x=u.querySelectorAll("script"),N=[],w=0,j=x.length;w<j;w++)C=x[w].getAttribute("type"),C&&"application/ecmascript"!==C&&"application/javascript"!==C||(A=x[w].innerText||x[w].textContent,N.push(A),u.removeChild(x[w]));if(N.length>0&&("always"===a.evalScripts||"once"===a.evalScripts&&!l[t])){for(var E=0,G=N.length;E<G;E++)new Function(N[E])(e);l[t]=!0}var V=u.querySelectorAll("style");I.call(V,function(e){var t=v(u),n=!0;(t.indexOf(a.removeStylesClass)>=0||a.removeAllStyles)&&t.indexOf(a.keepStylesClass)<0?e.parentNode.removeChild(e):(p(e,s.count,u,c)>0&&(n=!1),a.prefixStyleTags&&(g(e,s.count,u,c),n=!1),n&&(e.textContent+=""))}),o.parentNode.replaceChild(u,o),delete s.elements[s.elements.indexOf(o)],s.count++,i(u)},k=function(e){e=e.split(" ");for(var t={},n=e.length,r=[];n--;)t.hasOwnProperty(e[n])||(t[e[n]]=1,r.unshift(e[n]));return r.join(" ")},w=function(e){return!!(e&&e.constructor&&e.call&&e.apply)},j=function(e){return"[object Array]"===Object.prototype.toString.call(e)},E=function(e,t){var n=e.getAttribute("class");n=n?n:"",j(t)&&(t=t.join(" ")),t=n+" "+t,e.setAttribute("class",k(t))},I=Array.prototype.forEach||function(e,t){if(void 0===this||null===this||"function"!=typeof e)throw new TypeError;var n,r=this.length>>>0;for(n=0;n<r;++n)n in this&&e.call(t,this[n],n,this)},T=function(e,t,n,r,i){var l,a=r?r+"-":"";return a+=e+"-"+s.count,l=n.querySelector(e),l?G(e,t,l.textContent,a,t.firstChild):(l=t.querySelector(e),l?l.setAttribute("id",a):i?G(e,t,r,a,t.firstChild):a=""),a},G=function(e,n,r,s,i){var l,a=n.querySelector(e);return a&&a.parentNode.removeChild(a),l=t.createElementNS(V,e),l.a
10769ppendChild(t.createTextNode(r)),l.setAttribute("id",s),n.insertBefore(l,i),l},n}();"object"==typeof angular?angular.module("svginjector",[]).provider("svgInjectorOptions",function(){var e={};return{set:function(t){e=t},$get:function(){return e}}}).factory("svgInjectorFactory",["svgInjectorOptions",function(e){return new n(e)}]).directive("svg",["svgInjectorFactory",function(e){var t=e.getConfig();return{restrict:"E",link:function(n,r,s){s.class&&s.class.indexOf(t.spriteClassIdName)>=0?s.$observe("class",function(){e.inject(r[0])}):(s.dataSrc||s.src)&&e.inject(r[0])}}}]):"object"==typeof module&&"object"==typeof module.exports?module.exports=n:"function"==typeof define&&define.amd?define(function(){return n}):"object"==typeof e&&(e.SVGInjector=n)}(window,document); 10770//# sourceMappingURL=./dist/svg-injector.map.js 10771},{}],6:[function(require,module,exports){ 10772// Make this the only JS file you include in the body 10773// Include external libs with 'require' calls 10774 10775require('jquery'); 10776var SVGInjector = require('svg-injector-2'); 10777// require('underscore'); 10778 10779// Gives 'console' polyfills to browsers that don't use 'console' 10780require('./lib/console-support.js'); 10781 10782// Tracks outbound-link activity through Google Analytics 10783require('./lib/outbound.js'); 10784 10785var CF = require('./lib/contact_form.js'); 10786 10787require('./lib/menu.js'); 10788 10789require('./lib/maps.js'); 10790 10791require('./lib/django-csrf.js'); 10792 10793require('./lib/favorites.js'); 10794 10795// require('./lib/social-share.js'); 10796 10797require('./lib/facebook-share.js'); 10798 10799require('./lib/request_animation_frame_polyfill.js'); 10800 10801//TODO Get slick working with browserify 10802//var sliders = require("./lib/sliders.js"); 10803//sliders.init(); 10804 10805$(document).ready(function(){ 10806 new SVGInjector().inject($('img[src$=".svg"].svg_replace')); 10807 10808 $('input, textarea').blur(function(e) { 10809 var inpt = $(e.target); 10810 if (e.target.value.trim() === '') { 10811 inpt.removeClass('input--filled'); 10812 } else { 10813 inpt.addClass('input--filled'); 10814 } 10815 }); 10816 CF($('.contact_form')); 10817 10818 var filter_list = $('.category_nav__filter_list'); 10819 var filter_toggle = $('.open-filter-list'); 10820 filter_list.slideUp(); 10821 filter_toggle.click(function() {filter_list.slideToggle(); filter_toggle.toggleClass('button--white--active');}); 10822 10823}); 10824$(function() { 10825 if (location.hash != "") { 10826 $('body,html').animate({ 10827 scrollTop: $(location.hash).offset().top 10828 }, 1000) 10829 } 10830 $('a[href^="#"]').on('click', function(e) { 10831 e.preventDefault(); 10832 var hash = e.target.href.split('#')[1]; 10833 if (hash.length > 1) { 10834 $('body,html').animate({ 10835 scrollTop: $('#' + hash).offset().top 10836 }, 1000) 10837 } 10838 }) 10839}); 10840},{"./lib/console-support.js":7,"./lib/contact_form.js":8,"./lib/django-csrf.js":9,"./lib/facebook-share.js":10,"./lib/favorites.js":11,"./lib/maps.js":12,"./lib/menu.js":13,"./lib/outbound.js":14,"./lib/request_animation_frame_polyfill.js":15,"jquery":3,"svg-injector-2":5}],7:[function(require,module,exports){ 10841// Avoid `console` errors in browsers that lack a console. 10842(function() { 10843 var method; 10844 var noop = function () {}; 10845 var methods = [ 10846 'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 10847 'error', 10848 'exception', 'group', 'groupCollapsed', 10849 'groupEnd', 'info', 'log', 10850 'markTimeline', 'profile', 'profileEnd', 10851 'table', 'time', 'timeEnd', 10852 'timeline', 'timelineEnd', 10853 'timeStamp', 'trace', 'warn' 10854 ]; 10855 var length = methods.length; 10856 var console = (window.console = window.console || {}); 10857 10858 while (length--) { 10859 method = methods[length]; 10860 10861 // Only stub undefined methods. 10862 if (!console[method]) { 10863 console[method] = noop; 10864 } 10865 } 10866}()); 10867 10868},{}],8:[function(require,module,exports){ 10869var CF = function(form) { 10870 CF.form = form; 10871 $('.open-contact-form').click(CF.open_form); 10872 $('.close-contact-form').click(CF.close_form); 10873 var form_elem = CF.form.find('form'); 10874 $('#contactForm').submit(function(ev) { 10875 // Prevent the form from actually submitting 10876 ev.preventDefault(); 10877 10878 // Get the post data 10879 var data = $(this).serialize(); 10880 data['userEmail'] = data['fromEmail']; 10881 // Send it to the server 10882 $.ajax({ 10883 url: '/', 10884 data: data, 10885 type: 'POST', 10886 success: function(response) { 10887 if (response.success) { 10888 form_elem.html('<p>' + "Your message has been sent. If a reply is necessary, we'll be in touch soon." + '</p>') 10889 } else {
10890 // response.error will be an object containing any validation errors that occurred, indexed by field name 10891 // e.g. response.error.fromName => ['From Name is required'] 10892 alert('An error occurred. Please try again.'); 10893 } 10894 } 10895 }); 10896 }); 10897 10898 10899 // form_elem.find(':submit').click(function(e) { 10900 // var buttonvalue = $(e.target).val(); 10901 // var values = form_elem.serialize(); 10902 // values = values + '&contact_submit=' + buttonvalue; 10903 // e.preventDefault(); 10904 // $.post(form_elem.attr('action'), values) 10905 // .done(function(xhr, textStatus) { 10906 // form_elem.html('<p>' + xhr.messages[0] + '</p>') 10907 // }) 10908 // .fail(function(xhr, textStatus) { 10909 // resp = JSON.parse(xhr.responseText); 10910 // $('[id^=errors_]').empty(); 10911 // for(key in resp.messages.errors) { 10912 // var field = $('[for=id_' + key + ']'); 10913 // var errors_list = $('#errors_' + key); 10914 // if (!errors_list.length > 0) { 10915 // errors_list = $('<ul id="errors_' + key + '" />'); 10916 // } 10917 // errors_list.append($('<li>' + resp.messages.errors[key] + '</li>')[0]); 10918 // errors_list.insertAfter(field); 10919 // } 10920 // }); 10921 // }) 10922}; 10923CF.set_focus = function() { 10924 if (arguments.length = 1) { 10925 // a specific target was provided 10926 $(arguments[0]).focus() 10927 } else { 10928 // form has just opened 10929 CF.form.find('input:first-of-type').focus(); 10930 } 10931}; 10932CF.open_form = function(event) { 10933 CF.last_focus = event.target; 10934 CF.form.removeClass('hidden'); 10935 $('html, body').animate({ 10936 scrollTop: $(CF.form).offset().top 10937 }, 500); 10938 CF.form.attr('aria-hidden', 'false'); 10939 CF.set_focus(); 10940}; 10941CF.close_form = function() { 10942 CF.form.addClass('hidden'); 10943 CF.form.attr('aria-hidden', 'true'); 10944 CF.set_focus(CF.last_focus); 10945}; 10946 10947module.exports = CF; 10948 10949 10950},{}],9:[function(require,module,exports){ 10951function getCookie(name) { 10952 var cookieValue = null; 10953 if (document.cookie && document.cookie != '') { 10954 var cookies = document.cookie.split(';'); 10955 for (var i = 0; i < cookies.length; i++) { 10956 var cookie = jQuery.trim(cookies[i]); 10957 // Does this cookie string begin with the name we want? 10958 if (cookie.substring(0, name.length + 1) == (name + '=')) { 10959 cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 10960 break; 10961 } 10962 } 10963 } 10964 return cookieValue; 10965} 10966var csrftoken = getCookie('csrftoken'); 10967 10968function csrfSafeMethod(method) { 10969 // these HTTP methods do not require CSRF protection 10970 return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 10971} 10972$.ajaxSetup({ 10973 beforeSend: function(xhr, settings) { 10974 if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 10975 xhr.setRequestHeader("X-CSRFToken", csrftoken); 10976 } 10977 } 10978}); 10979 10980},{}],10:[function(require,module,exports){ 10981window.fbAsyncInit = function() { 10982 FB.init({ 10983 appId: '245652388911288', 10984 version: 'v2.9' 10985 }); 10986 var url = document.location.href; 10987 $('.facebook_share').click(function (event) { 10988 FB.ui({ 10989 method: 'share', 10990 href: url 10991 }, function (response) {}); 10992 }); 10993}; 10994},{}],11:[function(require,module,exports){ 10995$(document).ready(function() { 10996 var api_url = 'http://api.oklahomaagritourism.com/api'; 10997 $('.favorites_toggle').each(function (i, e) { 10998 $(e).click(function (event) { 10999 var button = $(event.target); 11000 var producer_id = button.closest('.activities__item').data('id'); 11001 var post_url = api_url + '/favorites/'; 11002 if (button.hasClass('favorited')) { 11003 //remove favorite 11004 $.ajax({ 11005 url: post_url, 11006 method: 'DELETE', 11007 data: { 11008 'producer_id': producer_id, 11009 'session_id': window.craftSessionId 11010 } 11011 }).done(function() { 11012 button.removeClass('favorited'); 11013 }) 11014 } else { 11015 $.post(post_url, { 11016 'producer_id': producer_id, 11017 'session_id': window.craftSessionId 11018 }).done(function() { 11019 button.addClass('favorited'); 11020 }) 11021 } 11022 }) 11023 }); 11024 $('.favorites_remove').each(function(i, e) { 11025 $(e).click(function(event) { 11026 var producer_id = $(event.target).closest('.producer_list__item').data('id'); 11027 var post_url = api_url + '/favorites/'; 11028 $.ajax({ 11029 url: post_url, 11030 method: 'DELETE', 11031 data: { 11032 'producer_id': producer_id, 11033 'session_id': window.craftSessionId 11034 } 11035 }).done(function() { 11036 location.reload(); 11037 }) 11038 }) 11039 }); 11040 $('.producer_favorites_toggle').each(function(i, e) { 11041 $(e).click(function(event) { 11042 var button = $(event.target); 11043 var producer_id = $(button).data('id'); 11044 var post_url = api_url + '/favorites/'; 11045 if (button.hasClass('favorited')) { 11046 //remove favorite 11047 $.ajax({ 11048 url: post_url, 11049 method: 'DELETE', 11050 data: { 11051 'producer_id': producer_id, 11052 'session_id': window.craftSessionId 11053 } 11054 }).done(function() { 11055 button.removeClass('favorited'); 11056 button.text('Add to My Favorites'); 11057 }) 11058 } else { 11059 $.post(post_url,{ 11060 'producer_id': producer_id, 11061 'session_id': window.craftSessionId 11062 }).done(function() { 11063 button.addClass('favorited'); 11064 button.text('Remove from My Favorites'); 11065 }) 11066 } 11067 }) 11068 }) 11069}); 11070},{}],12:[function(require,module,exports){ 11071 11072require('FixedFixed'); 11073require('FixedSticky'); 11074FixedSticky.tests.sticky = false;
11075var GoogleMapsLoader = require('google-maps'); 11076function getInfoWindowContent(activity) { 11077 return "<h1>" + activity['name'] + "</h1><a href='/producer/" + activity['url'] + "'>View Producer Details</a>"; 11078} 11079$(document).ready(function() { 11080 if (document.getElementById('map')) { 11081 GoogleMapsLoader.KEY = 'AIzaSyAiiOzVPuSPsMSFMskvDjJiKtrJUKNzD-8'; 11082 GoogleMapsLoader.SENSOR = false; 11083 GoogleMapsLoader.LIBRARIES = []; 11084 GoogleMapsLoader.load(function(google) { 11085 11086 var icon = { 11087 url: '//api.oklahomaagritourism.com/static/producers/images/map_highlight.png', 11088 size: new google.maps.Size(40,49), 11089 origin: new google.maps.Point(0,0), 11090 anchor: new google.maps.Point(20,49) 11091 }; 11092 var activity_items = []; 11093 $.map($('.activities__item').not('.map_hidden'), function(activity__item) { 11094 var act = $(activity__item); 11095 activity_items.push({ 11096 'lat': act.data('lat'), 11097 'lon': act.data('lon'), 11098 'name': act.data('name'), 11099 'url': act.data('url') 11100 }); 11101 }); 11102 var map = new google.maps.Map(document.getElementById('map'), { 11103 'scrollwheel': false, 11104 'streetViewControl': false 11105 //'draggable': false 11106 }); 11107 11108 var infoWindow = new google.maps.InfoWindow(); 11109 var map_bounds = new google.maps.LatLngBounds(); 11110 for (var key in activity_items) { 11111 var position = new google.maps.LatLng(activity_items[key]['lat'], activity_items[key]['lon']); 11112 map_bounds.extend(position); 11113 var marker = new google.maps.Marker({ 11114 'position': position, 11115 'map': map, 11116 'title': activity_items[key]['name'], 11117 'icon': icon 11118 }); 11119 google.maps.event.addListener(marker, 'click', (function (marker, key) { 11120 return function () { 11121 infoWindow.setContent(getInfoWindowContent(activity_items[key])); 11122 infoWindow.open(map, marker); 11123 } 11124 })(marker, key)); 11125 } 11126 map.fitBounds(map_bounds); 11127 google.maps.event.addDomListener(window, 'resize', function () { 11128 map.fitBounds(map_bounds); 11129 }); 11130 }); 11131 } 11132 if (document.getElementById('favorites_map')) { 11133 11134 $('.fixedsticky').each(function(i, e) { 11135 var elem = $(e); 11136 elem.css( 11137 {'width': elem.parent().width()} 11138 ); 11139 }).fixedsticky(); 11140 11141 resize_map = function(previous_width) { 11142 var width = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); 11143 if (typeof previous_width === 'undefined') { 11144 previous_width = width; 11145 } 11146 if (width != previous_width) { 11147 $('.fixedsticky').each(function(i, e) { 11148 var elem = $(e); 11149 var new_value = elem.parent().width(); 11150 elem.css( 11151 {'width': new_value, 'height': new_value} 11152 ); 11153 }) 11154 } 11155 window.requestAnimationFrame(function() { 11156 resize_map(width); 11157 }) 11158 }; 11159 window.requestAnimationFrame(resize_map); 11160 GoogleMapsLoader.KEY = 'AIzaSyAiiOzVPuSPsMSFMskvDjJiKtrJUKNzD-8'; 11161 GoogleMapsLoader.SENSOR = false; 11162 GoogleMapsLoader.LIBRARIES = []; 11163 GoogleMapsLoader.load(function(google) { 11164 var activity_items = []; 11165 $.map($('.producer_list__item').not('.map_hidden'), function(activity__item) { 11166 var act = $(activity__item); 11167 activity_items.push({ 11168 'elem': act, 11169 'lat': act.data('lat'), 11170 'lon': act.data('lon'), 11171 'name': act.data('name'), 11172 'url': '/producer' + act.data('url'), 11173 'hidden': act.hasClass('map_hidden') 11174 }); 11175 }); 11176 if (activity_items.length) { 11177 var map = new google.maps.Map(document.getElementById('favorites_map'), { 11178 'scrollwheel': false, 11179 'streetViewControl': false, 11180 'draggable': false 11181 }); 11182 11183 11184 var standard_icon = { 11185 url: '//api.oklahomaagritourism.com/static/producers/images/map_standard.png', 11186 size: new google.maps.Size(40,49), 11187 origin: new google.maps.Point(0,0), 11188 anchor: new google.maps.Point(20,49) 11189 }; 11190 var highlight_icon = { 11191 url: '//api.oklahomaagritourism.com/static/producers/images/map_highlight.png', 11192 size: new google.maps.Size(40,49), 11193 origin: new google.maps.Point(0,0), 11194 anchor: new google.maps.Point(20,49) 11195 }; 11196 //var infoWindow = new google.maps.InfoWindow(); 11197 var map_bounds = new google.maps.LatLngBounds(); 11198 11199 for (var g=0; g< activity_items.length;g++) { 11200 if (activity_items[g]['lat'] && activity_items[g]['lon']) { 11201 var position = new google.maps.LatLng(activity_items[g]['lat'], activity_items[g]['lon']); 11202 map_bounds.extend(position); 11203 var marker = new google.maps.Marker({ 11204 'position': position, 11205 'map': map, 11206 'title': activity_items[g]['name'], 11207 'icon': standard_icon 11208 }); 11209 activity_items[g]['marker'] = marker; 11210 activity_items[g]['elem'].on('mouseover', {marker: marker}, function (e) { 11211 map.panTo(e.data.marker.position); 11212 e.data.marker.setIcon(highlight_icon); 11213 e.data.marker.setZIndex(google.maps.Marker.MAX_ZINDEX + 1); 11214 }).on('mouseout', {marker: marker}, function (e) { 11215 e.data.marker.setIcon(standard_icon); 11216 e.data.marker.setZIndex(1); 11217 }).on('mouseleave', function (e) { 11218 //map.fitBounds(map_bounds); 11219 map.panTo(map_bounds.getCenter()); 11220 }); 11221 } 11222 } 11223 map.fitBounds(map_bounds); 11224 google.maps.event.addDomListener(window, 'resize', function () { 11225 map.fitBounds(map_bounds); 11226 }); 11227 } 11228 }); 11229 } 11230}); 11231},{"FixedFixed":1,"FixedSticky":2,"google-maps":4}],13:[function(require,module,exports){ 11232$(function() { 11233 var toggle = $('.menu_toggle'); 11234 var menu = toggle.next('.nav_container'); 11235 toggle.on('click', function() { 11236 toggle.toggleClass('open'); 11237 menu.toggleClass('visible'); 11238 }); 11239 $('.nav__nav_item--has_children > a, .nav__nav_item--has_children > .nav__toggle').on('click', function(e) { 11240 $(this).parent().toggleClass('open'); 11241 $(this).next('.nav--secondary').toggleClass('open'); 11242 }) 11243}); 11244},{}],14:[function(require,module,exports){ 11245function _gaLt(event){ 11246 var el = event.srcElement || event.target; 11247 11248 /* Loop up the DOM tree through parent elements if clicked element is not a link (eg: an image inside a link) */ 11249 while(el && (typeof el.tagName == 'undefined' || el.tagName.toLowerCase() != 'a' || !el.href)){ 11250 el = el.parentNode; 11251 } 11252 11253 if(el && el.href){ 11254 if(el.href.indexOf(location.host) == -1){ /* external link */ 11255 /* HitCallback function to either open link in either same or new window */ 11256 var hitBack = function(link, target){ 11257 target ? window.open(link, target) : window.location.href = link; 11258 }; 11259 /* link */ 11260 var link = el.href; 11261 /* Is target set and not _(self|parent|top)? */ 11262 var target = (el.target && !el.target.match(/^_(self|parent|top)$/i)) ? el.target : false;
11263 /* send event with callback */ 11264 ga( 11265 "send", "event", "Outgoing Links", link, 11266 document.location.pathname + document.location.search, 11267 {"hitCallback": hitBack(link, target)} 11268 ); 11269 11270 /* Prevent standard click */ 11271 event.preventDefault ? event.preventDefault() : event.returnValue = !1; 11272 } 11273 11274 } 11275} 11276 11277/* Attach the event to all clicks in the document after page has loaded */ 11278var w = window; 11279w.addEventListener ? w.addEventListener("load",function(){document.body.addEventListener("click",_gaLt,!1)},!1) 11280: w.attachEvent && w.attachEvent("onload",function(){document.body.attachEvent("onclick",_gaLt)}); 11281 11282},{}],15:[function(require,module,exports){ 11283//// http://paulirish.com/2011/requestanimationframe-for-smart-animating/ 11284//// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating 11285// 11286//// requestAnimationFrame polyfill by Erik Möller. fixes from Paul Irish and Tino Zijdel 11287// 11288//// MIT license 11289// 11290//(function() { 11291// var lastTime = 0; 11292// var vendors = ['ms', 'moz', 'webkit', 'o']; 11293// for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) { 11294// window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame']; 11295// window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame'] 11296// || window[vendors[x]+'CancelRequestAnimationFrame']; 11297// } 11298// 11299// if (!window.requestAnimationFrame) 11300// window.requestAnimationFrame = function(callback, element) { 11301// var currTime = new Date().getTime(); 11302// var timeToCall = Math.max(0, 16 - (currTime - lastTime)); 11303// var id = window.setTimeout(function() { callback(currTime + timeToCall); }, 11304// timeToCall); 11305// lastTime = currTime + timeToCall; 11306// return id; 11307// }; 11308// 11309// if (!window.cancelAnimationFrame) 11310// window.cancelAnimationFrame = function(id) { 11311// clearTimeout(id); 11312// }; 11313//}()); 11314},{}]},{},[6]);
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.