vendor: 11,558 bytes, lines 1-470
1/* input(62763,45255-45262): run-time error JS1010: Expected identifier: finally */ 2/*! 3 * jQuery JavaScript Library v3.6.0 4 * https://jquery.com/ 5 * 6 * Includes Sizzle.js 7 * https://sizzlejs.com/ 8 * 9 * Copyright OpenJS Foundation and other contributors 10 * Released under the MIT license 11 * https://jquery.org/license 12 * 13 * Date: 2021-03-02T17:08Z 14 */ 15( function( global, factory ) { 16 17 "use strict"; 18 19 if ( typeof module === "object" && typeof module.exports === "object" ) { 20 21 // For CommonJS and CommonJS-like environments where a proper `window` 22 // is present, execute the factory and get jQuery. 23 // For environments that do not have a `window` with a `document` 24 // (such as Node.js), expose a factory as module.exports. 25 // This accentuates the need for the creation of a real `window`. 26 // e.g. var jQuery = require("jquery")(window); 27 // See ticket #14549 for more info. 28 module.exports = global.document ? 29 factory( global, true ) : 30 function( w ) { 31 if ( !w.document ) { 32 throw new Error( "jQuery requires a window with a document" ); 33 } 34 return factory( w ); 35 }; 36 } else { 37 factory( global ); 38 } 39 40// Pass this if window is not defined yet 41} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 42 43// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 44// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 45// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 46// enough that all such attempts are guarded in a try block. 47"use strict"; 48 49var arr = []; 50 51var getProto = Object.getPrototypeOf; 52 53var slice = arr.slice; 54 55var flat = arr.flat ? function( array ) { 56 return arr.flat.call( array ); 57} : function( array ) { 58 return arr.concat.apply( [], array ); 59}; 60 61 62var push = arr.push; 63 64var indexOf = arr.indexOf; 65 66var class2type = {}; 67 68var toString = class2type.toString; 69 70var hasOwn = class2type.hasOwnProperty; 71 72var fnToString = hasOwn.toString; 73 74var ObjectFunctionString = fnToString.call( Object ); 75 76var support = {}; 77 78var isFunction = function isFunction( obj ) { 79 80 // Support: Chrome <=57, Firefox <=52 81 // In some browsers, typeof returns "function" for HTML <object> elements 82 // (i.e., `typeof document.createElement( "object" ) === "function"`). 83 // We don't want to classify *any* DOM node as a function. 84 // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 85 // Plus for old WebKit, typeof returns "function" for HTML collections 86 // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) 87 return typeof obj === "function" && typeof obj.nodeType !== "number" && 88 typeof obj.item !== "function"; 89 }; 90 91 92var isWindow = function isWindow( obj ) { 93 return obj != null && obj === obj.window; 94 }; 95 96 97var document = window.document; 98 99 100 101 var preservedScriptAttributes = { 102 type: true, 103 src: true, 104 nonce: true, 105 noModule: true 106 }; 107 108 function DOMEval( code, node, doc ) { 109 doc = doc || document; 110 111 var i, val, 112 script = doc.createElement( "script" ); 113 114 script.text = code; 115 if ( node ) { 116 for ( i in preservedScriptAttributes ) { 117 118 // Support: Firefox 64+, Edge 18+ 119 // Some browsers don't support the "nonce" property on scripts. 120 // On the other hand, just using `getAttribute` is not enough as 121 // the `nonce` attribute is reset to an empty string whenever it 122 // becomes browsing-context connected. 123 // See https://github.com/whatwg/html/issues/2369 124 // See https://html.spec.whatwg.org/#nonce-attributes 125 // The `node.getAttribute` check was added for the sake of 126 // `jQuery.globalEval` so that it can fake a nonce-containing node 127 // via an object. 128 val = node[ i ] || node.getAttribute && node.getAttribute( i ); 129 if ( val ) { 130 script.setAttribute( i, val ); 131 } 132 } 133 } 134 doc.head.appendChild( script ).parentNode.removeChild( script ); 135 } 136 137 138function toType( obj ) { 139 if ( obj == null ) { 140 return obj + ""; 141 } 142 143 // Support: Android <=2.3 only (functionish RegExp) 144 return typeof obj === "object" || typeof obj === "function" ? 145 class2type[ toString.call( obj ) ] || "object" : 146 typeof obj; 147} 148/* global Symbol */ 149// Defining this global in .eslintrc.json would create a danger of using the global 150// unguarded in another place, it seems safer to define global only for this module 151 152 153 154var 155 version = "hidden", 156 157 // Define a local copy of jQuery 158 jQuery = function( selector, context ) { 159 160 // The jQuery object is actually just the init constructor 'enhanced' 161 // Need init if jQuery is called (just allow error to be thrown if not included) 162 return new jQuery.fn.init( selector, context ); 163 }; 164 165jQuery.fn = jQuery.prototype = { 166 167 // The current version of jQuery being used 168 jquery: version, 169 170 constructor: jQuery, 171 172 // The default length of a jQuery object is 0 173 length: 0, 174 175 toArray: function() { 176 return slice.call( this ); 177 }, 178 179 // Get the Nth element in the matched element set OR 180 // Get the whole matched element set as a clean array 181 get: function( num ) { 182 183 // Return all the elements in a clean array 184 if ( num == null ) { 185 return slice.call( this ); 186 } 187 188 // Return just the one element from the set 189 return num < 0 ? this[ num + this.length ] : this[ num ]; 190 }, 191 192 // Take an array of elements and push it onto the stack 193 // (returning the new matched element set) 194 pushStack: function( elems ) { 195 196 // Build a new jQuery matched element set 197 var ret = jQuery.merge( this.constructor(), elems ); 198 199 // Add the old object onto the stack (as a reference) 200 ret.prevObject = this; 201 202 // Return the newly-formed element set 203 return ret; 204 }, 205 206 // Execute a callback for every element in the matched set. 207 each: function( callback ) { 208 return jQuery.each( this, callback ); 209 }, 210 211 map: function( callback ) { 212 return this.pushStack( jQuery.map( this, function( elem, i ) { 213 return callback.call( elem, i, elem ); 214 } ) ); 215 }, 216 217 slice: function() { 218 return this.pushStack( slice.apply( this, arguments ) ); 219 }, 220 221 first: function() { 222 return this.eq( 0 ); 223 }, 224 225 last: function() { 226 return this.eq( -1 ); 227 }, 228 229 even: function() { 230 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 231 return ( i + 1 ) % 2; 232 } ) ); 233 }, 234 235 odd: function() { 236 return this.pushStack( jQuery.grep( this, function( _elem, i ) { 237 return i % 2; 238 } ) ); 239 }, 240 241 eq: function( i ) { 242 var len = this.length, 243 j = +i + ( i < 0 ? len : 0 ); 244 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 245 }, 246 247 end: function() { 248 return this.prevObject || this.constructor(); 249 }, 250 251 // For internal use only. 252 // Behaves like an Array's method, not like a jQuery method. 253 push: push, 254 sort: arr.sort, 255 splice: arr.splice 256}; 257 258jQuery.extend = jQuery.fn.extend = function() { 259 var options, name, src, copy, copyIsArray, clone, 260 target = arguments[ 0 ] || {}, 261 i = 1, 262 length = arguments.length, 263 deep = false; 264 265 // Handle a deep copy situation 266 if ( typeof target === "boolean" ) { 267 deep = target; 268 269 // Skip the boolean and the target 270 target = arguments[ i ] || {}; 271 i++; 272 } 273 274 // Handle case when target is a string or something (possible in deep copy) 275 if ( typeof target !== "object" && !isFunction( target ) ) { 276 target = {}; 277 } 278 279 // Extend jQuery itself if only one argument is passed 280 if ( i === length ) { 281 target = this; 282 i--; 283 } 284 285 for ( ; i < length; i++ ) { 286 287 // Only deal with non-null/undefined values 288 if ( ( options = arguments[ i ] ) != null ) { 289 290 // Extend the base object 291 for ( name in options ) { 292 copy = options[ name ]; 293 294 // Prevent Object.prototype pollution 295 // Prevent never-ending loop 296 if ( name === "__proto__" || target === copy ) { 297 continue; 298 } 299 300 // Recurse if we're merging plain objects or arrays 301 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 302 ( copyIsArray = Array.isArray( copy ) ) ) ) { 303 src = target[ name ]; 304 305 // Ensure proper type for the source value 306 if ( copyIsArray && !Array.isArray( src ) ) { 307 clone = []; 308 } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { 309 clone = {}; 310 } else { 311 clone = src; 312 } 313 copyIsArray = false; 314 315 // Never move original objects, clone them 316 target[ name ] = jQuery.extend( deep, clone, copy ); 317 318 // Don't bring in undefined values 319 } else if ( copy !== undefined ) { 320 target[ name ] = copy; 321 } 322 } 323 } 324 } 325 326 // Return the modified object 327 return target; 328}; 329 330jQuery.extend( { 331 332 // Unique for each copy of jQuery on the page 333 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 334 335 // Assume jQuery is ready without the ready module 336 isReady: true, 337 338 error: function( msg ) { 339 throw new Error( msg ); 340 }, 341 342 noop: function() {}, 343 344 isPlainObject: function( obj ) { 345 var proto, Ctor; 346 347 // Detect obvious negatives 348 // Use toString instead of jQuery.type to catch host objects 349 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 350 return false; 351 } 352 353 proto = getProto( obj ); 354 355 // Objects with no prototype (e.g., `Object.create( null )`) are plain 356 if ( !proto ) { 357 return true; 358 } 359 360 // Objects with prototype are plain iff they were constructed by a global Object function 361 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 362 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 363 }, 364 365 isEmptyObject: function( obj ) { 366 var name; 367 368 for ( name in obj ) { 369 return false; 370 } 371 return true; 372 }, 373 374 // Evaluates a script in a provided context; falls back to the global one 375 // if not specified. 376 globalEval: function( code, options, doc ) { 377 DOMEval( code, { nonce: options && options.nonce }, doc ); 378 }, 379 380 each: function( obj, callback ) { 381 var length, i = 0; 382 383 if ( isArrayLike( obj ) ) { 384 length = obj.length; 385 for ( ; i < length; i++ ) { 386 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 387 break; 388 } 389 } 390 } else { 391 for ( i in obj ) { 392 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 393 break; 394 } 395 } 396 } 397 398 return obj; 399 }, 400 401 // results is for internal usage only 402 makeArray: function( arr, results ) { 403 var ret = results || []; 404 405 if ( arr != null ) { 406 if ( isArrayLike( Object( arr ) ) ) { 407 jQuery.merge( ret, 408 typeof arr === "string" ? 409 [ arr ] : arr 410 ); 411 } else { 412 push.call( ret, arr ); 413 } 414 } 415 416 return ret; 417 }, 418 419 inArray: function( elem, arr, i ) { 420 return arr == null ? -1 : indexOf.call( arr, elem, i ); 421 }, 422 423 // Support: Android <=4.0 only, PhantomJS 1 only 424 // push.apply(_, arraylike) throws on ancient WebKit 425 merge: function( first, second ) { 426 var len = +second.length, 427 j = 0, 428 i = first.length; 429 430 for ( ; j < len; j++ ) { 431 first[ i++ ] = second[ j ]; 432 } 433 434 first.length = i; 435 436 return first; 437 }, 438 439 grep: function( elems, callback, invert ) { 440 var callbackInverse, 441 matches = [], 442 i = 0, 443 length = elems.length, 444 callbackExpect = !invert; 445 446 // Go through the array, only saving the items 447 // that pass the validator function 448 for ( ; i < length; i++ ) { 449 callbackInverse = !callback( elems[ i ], i ); 450 if ( callbackInverse !== callbackExpect ) { 451 matches.push( elems[ i ] ); 452 } 453 } 454 455 return matches; 456 }, 457 458 // arg is for internal usage only 459 map: function( elems, callback, arg ) { 460 var length, value, 461 i = 0, 462 ret = []; 463 464 // Go through the array, translating each of the items to their new values 465 if ( isArrayLike( elems ) ) { 466 length = elems.length; 467 for ( ; i < length; i++ ) { 468 value = callback( elems[ i ], i, arg ); 469 470 if ( value != null ) {
vendor: 4,201 bytes, lines 471-638
471 ret.push( value ); 472 } 473 } 474 475 // Go through every key on the object, 476 } else { 477 for ( i in elems ) { 478 value = callback( elems[ i ], i, arg ); 479 480 if ( value != null ) { 481 ret.push( value ); 482 } 483 } 484 } 485 486 // Flatten any nested arrays 487 return flat( ret ); 488 }, 489 490 // A global GUID counter for objects 491 guid: 1, 492 493 // jQuery.support is not used in Core but other projects attach their 494 // properties to it so it needs to exist. 495 support: support 496} ); 497 498if ( typeof Symbol === "function" ) { 499 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 500} 501 502// Populate the class2type map 503jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 504 function( _i, name ) { 505 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 506 } ); 507 508function isArrayLike( obj ) { 509 510 // Support: real iOS 8.2 only (not reproducible in simulator) 511 // `in` check used to prevent JIT error (gh-2145) 512 // hasOwn isn't used here due to false negatives 513 // regarding Nodelist length in IE 514 var length = !!obj && "length" in obj && obj.length, 515 type = toType( obj ); 516 517 if ( isFunction( obj ) || isWindow( obj ) ) { 518 return false; 519 } 520 521 return type === "array" || length === 0 || 522 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 523} 524var Sizzle = 525/*! 526 * Sizzle CSS Selector Engine v2.3.6 527 * https://sizzlejs.com/ 528 * 529 * Copyright JS Foundation and other contributors 530 * Released under the MIT license 531 * https://js.foundation/ 532 * 533 * Date: 2021-02-16 534 */ 535( function( window ) { 536var i, 537 support, 538 Expr, 539 getText, 540 isXML, 541 tokenize, 542 compile, 543 select, 544 outermostContext, 545 sortInput, 546 hasDuplicate, 547 548 // Local document vars 549 setDocument, 550 document, 551 docElem, 552 documentIsHTML, 553 rbuggyQSA, 554 rbuggyMatches, 555 matches, 556 contains, 557 558 // Instance-specific data 559 expando = "sizzle" + 1 * new Date(), 560 preferredDoc = window.document, 561 dirruns = 0, 562 done = 0, 563 classCache = createCache(), 564 tokenCache = createCache(), 565 compilerCache = createCache(), 566 nonnativeSelectorCache = createCache(), 567 sortOrder = function( a, b ) { 568 if ( a === b ) { 569 hasDuplicate = true; 570 } 571 return 0; 572 }, 573 574 // Instance methods 575 hasOwn = ( {} ).hasOwnProperty, 576 arr = [], 577 pop = arr.pop, 578 pushNative = arr.push, 579 push = arr.push, 580 slice = arr.slice, 581 582 // Use a stripped-down indexOf as it's faster than native 583 // https://jsperf.com/thor-indexof-vs-for/5 584 indexOf = function( list, elem ) { 585 var i = 0, 586 len = list.length; 587 for ( ; i < len; i++ ) { 588 if ( list[ i ] === elem ) { 589 return i; 590 } 591 } 592 return -1; 593 }, 594 595 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + 596 "ismap|loop|multiple|open|readonly|required|scoped", 597 598 // Regular expressions 599 600 // http://www.w3.org/TR/css3-selectors/#whitespace 601 whitespace = "[\\x20\\t\\r\\n\\f]", 602 603 // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram 604 identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + 605 "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", 606 607 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 608 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 609 610 // Operator (capture 2) 611 "*([*^$|!~]?=)" + whitespace + 612 613 // "Attribute values must be CSS identifiers [capture 5] 614 // or strings [capture 3 or capture 4]" 615 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + 616 whitespace + "*\\]", 617 618 pseudos = ":(" + identifier + ")(?:\\((" + 619 620 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 621 // 1. quoted (capture 3; capture 4 or capture 5) 622 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 623 624 // 2. simple (capture 6) 625 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 626 627 // 3. anything else (capture 2) 628 ".*" + 629 ")\\)|)", 630 631 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 632 rwhitespace = new RegExp( whitespace + "+", "g" ), 633 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + 634 whitespace + "+$", "g" ), 635 636 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 637 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + 638 "*" ),
vendor: 4,651 bytes, lines 639-793
639 rdescend = new RegExp( whitespace + "|>" ), 640 641 rpseudo = new RegExp( pseudos ), 642 ridentifier = new RegExp( "^" + identifier + "$" ), 643 644 matchExpr = { 645 "ID": new RegExp( "^#(" + identifier + ")" ), 646 "CLASS": new RegExp( "^\\.(" + identifier + ")" ), 647 "TAG": new RegExp( "^(" + identifier + "|[*])" ), 648 "ATTR": new RegExp( "^" + attributes ), 649 "PSEUDO": new RegExp( "^" + pseudos ), 650 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + 651 whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + 652 whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 653 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), 654 655 // For use in libraries implementing .is() 656 // We use this for POS matching in `select` 657 "needsContext": new RegExp( "^" + whitespace + 658 "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + 659 "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 660 }, 661 662 rhtml = /HTML$/i, 663 rinputs = /^(?:input|select|textarea|button)$/i, 664 rheader = /^h\d$/i, 665 666 rnative = /^[^{]+\{\s*\[native \w/, 667 668 // Easily-parseable/retrievable ID or TAG or CLASS selectors 669 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 670 671 rsibling = /[+~]/, 672 673 // CSS escapes 674 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 675 runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), 676 funescape = function( escape, nonHex ) { 677 var high = "0x" + escape.slice( 1 ) - 0x10000; 678 679 return nonHex ? 680 681 // Strip the backslash prefix from a non-hex escape sequence 682 nonHex : 683 684 // Replace a hexadecimal escape sequence with the encoded Unicode code point 685 // Support: IE <=11+ 686 // For values outside the Basic Multilingual Plane (BMP), manually construct a 687 // surrogate pair 688 high < 0 ? 689 String.fromCharCode( high + 0x10000 ) : 690 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 691 }, 692 693 // CSS string/identifier serialization 694 // https://drafts.csswg.org/cssom/#common-serializing-idioms 695 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, 696 fcssescape = function( ch, asCodePoint ) { 697 if ( asCodePoint ) { 698 699 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 700 if ( ch === "\0" ) { 701 return "\uFFFD"; 702 } 703 704 // Control characters and (dependent upon position) numbers get escaped as code points 705 return ch.slice( 0, -1 ) + "\\" + 706 ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 707 } 708 709 // Other potentially-special ASCII characters get backslash-escaped 710 return "\\" + ch; 711 }, 712 713 // Used for iframes 714 // See setDocument() 715 // Removing the function wrapper causes a "Permission Denied" 716 // error in IE 717 unloadHandler = function() { 718 setDocument(); 719 }, 720 721 inDisabledFieldset = addCombinator( 722 function( elem ) { 723 return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; 724 }, 725 { dir: "parentNode", next: "legend" } 726 ); 727 728// Optimize for push.apply( _, NodeList ) 729try { 730 push.apply( 731 ( arr = slice.call( preferredDoc.childNodes ) ), 732 preferredDoc.childNodes 733 ); 734 735 // Support: Android<4.0 736 // Detect silently failing push.apply 737 // eslint-disable-next-line no-unused-expressions 738 arr[ preferredDoc.childNodes.length ].nodeType; 739} catch ( e ) { 740 push = { apply: arr.length ? 741 742 // Leverage slice if possible 743 function( target, els ) { 744 pushNative.apply( target, slice.call( els ) ); 745 } : 746 747 // Support: IE<9 748 // Otherwise append directly 749 function( target, els ) { 750 var j = target.length, 751 i = 0; 752 753 // Can't trust NodeList.length 754 while ( ( target[ j++ ] = els[ i++ ] ) ) {} 755 target.length = j - 1; 756 } 757 }; 758} 759 760function Sizzle( selector, context, results, seed ) { 761 var m, i, elem, nid, match, groups, newSelector, 762 newContext = context && context.ownerDocument, 763 764 // nodeType defaults to 9, since context defaults to document 765 nodeType = context ? context.nodeType : 9; 766 767 results = results || []; 768 769 // Return early from calls with invalid selector or context 770 if ( typeof selector !== "string" || !selector || 771 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 772 773 return results; 774 } 775 776 // Try to shortcut find operations (as opposed to filters) in HTML documents 777 if ( !seed ) { 778 setDocument( context ); 779 context = context || document; 780 781 if ( documentIsHTML ) { 782 783 // If the selector is sufficiently simple, try using a "get*By*" DOM method 784 // (excepting DocumentFragment context, where the methods don't exist) 785 if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { 786 787 // ID selector 788 if ( ( m = match[ 1 ] ) ) { 789 790 // Document context 791 if ( nodeType === 9 ) { 792 if ( ( elem = context.getElementById( m ) ) ) { 793
794 // Support: IE, Opera, Webkit 795 // TODO: identify versions 796 // getElementById can match elements by name instead of ID 797 if ( elem.id === m ) { 798 results.push( elem ); 799 return results; 800 } 801 } else { 802 return results; 803 } 804 805 // Element context 806 } else { 807 808 // Support: IE, Opera, Webkit 809 // TODO: identify versions 810 // getElementById can match elements by name instead of ID 811 if ( newContext && ( elem = newContext.getElementById( m ) ) && 812 contains( context, elem ) && 813 elem.id === m ) { 814 815 results.push( elem ); 816 return results; 817 } 818 } 819 820 // Type selector 821 } else if ( match[ 2 ] ) { 822 push.apply( results, context.getElementsByTagName( selector ) ); 823 return results; 824 825 // Class selector 826 } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && 827 context.getElementsByClassName ) { 828 829 push.apply( results, context.getElementsByClassName( m ) ); 830 return results; 831 } 832 } 833 834 // Take advantage of querySelectorAll 835 if ( support.qsa && 836 !nonnativeSelectorCache[ selector + " " ] && 837 ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && 838 839 // Support: IE 8 only 840 // Exclude object elements 841 ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { 842 843 newSelector = selector; 844 newContext = context; 845 846 // qSA considers elements outside a scoping root when evaluating child or 847 // descendant combinators, which is not what we want. 848 // In such cases, we work around the behavior by prefixing every selector in the 849 // list with an ID selector referencing the scope context. 850 // The technique has to be used as well when a leading combinator is used 851 // as such selectors are not recognized by querySelectorAll. 852 // Thanks to Andrew Dupont for this technique. 853 if ( nodeType === 1 && 854 ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { 855 856 // Expand context for sibling selectors 857 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 858 context; 859 860 // We can use :scope instead of the ID hack if the browser 861 // supports it & if we're not changing the context. 862 if ( newContext !== context || !support.scope ) { 863 864 // Capture the context ID, setting it first if necessary 865 if ( ( nid = context.getAttribute( "id" ) ) ) { 866 nid = nid.replace( rcssescape, fcssescape ); 867 } else { 868 context.setAttribute( "id", ( nid = expando ) ); 869 } 870 } 871 872 // Prefix every selector in the list 873 groups = tokenize( selector ); 874 i = groups.length; 875 while ( i-- ) { 876 groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + 877 toSelector( groups[ i ] ); 878 } 879 newSelector = groups.join( "," ); 880 } 881 882 try { 883 push.apply( results, 884 newContext.querySelectorAll( newSelector ) 885 ); 886 return results; 887 } catch ( qsaError ) { 888 nonnativeSelectorCache( selector, true ); 889 } finally { 890 if ( nid === expando ) { 891 context.removeAttribute( "id" ); 892 } 893 } 894 } 895 } 896 } 897 898 // All others 899 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 900} 901 902/** 903 * Create key-value caches of limited size 904 * @returns {function(string, object)} Returns the Object data after storing it on itself with 905 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 906 * deleting the oldest entry 907 */ 908function createCache() { 909 var keys = []; 910 911 function cache( key, value ) { 912 913 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 914 if ( keys.push( key + " " ) > Expr.cacheLength ) { 915 916 // Only keep the most recent entries 917 delete cache[ keys.shift() ]; 918 } 919 return ( cache[ key + " " ] = value ); 920 } 921 return cache; 922} 923 924/** 925 * Mark a function for special use by Sizzle 926 * @param {Function} fn The function to mark 927 */ 928function markFunction( fn ) { 929 fn[ expando ] = true; 930 return fn; 931} 932 933/** 934 * Support testing using an element 935 * @param {Function} fn Passed the created element and returns a boolean result 936 */ 937function assert( fn ) { 938 var el = document.createElement( "fieldset" ); 939 940 try { 941 return !!fn( el ); 942 } catch ( e ) { 943 return false;
vendor: 4,247 bytes, lines 944-1099
944 } finally { 945 946 // Remove from its parent by default 947 if ( el.parentNode ) { 948 el.parentNode.removeChild( el ); 949 } 950 951 // release memory in IE 952 el = null; 953 } 954} 955 956/** 957 * Adds the same handler for all of the specified attrs 958 * @param {String} attrs Pipe-separated list of attributes 959 * @param {Function} handler The method that will be applied 960 */ 961function addHandle( attrs, handler ) { 962 var arr = attrs.split( "|" ), 963 i = arr.length; 964 965 while ( i-- ) { 966 Expr.attrHandle[ arr[ i ] ] = handler; 967 } 968} 969 970/** 971 * Checks document order of two siblings 972 * @param {Element} a 973 * @param {Element} b 974 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 975 */ 976function siblingCheck( a, b ) { 977 var cur = b && a, 978 diff = cur && a.nodeType === 1 && b.nodeType === 1 && 979 a.sourceIndex - b.sourceIndex; 980 981 // Use IE sourceIndex if available on both nodes 982 if ( diff ) { 983 return diff; 984 } 985 986 // Check if b follows a 987 if ( cur ) { 988 while ( ( cur = cur.nextSibling ) ) { 989 if ( cur === b ) { 990 return -1; 991 } 992 } 993 } 994 995 return a ? 1 : -1; 996} 997 998/** 999 * Returns a function to use in pseudos for input types 1000 * @param {String} type 1001 */ 1002function createInputPseudo( type ) { 1003 return function( elem ) { 1004 var name = elem.nodeName.toLowerCase(); 1005 return name === "input" && elem.type === type; 1006 }; 1007} 1008 1009/** 1010 * Returns a function to use in pseudos for buttons 1011 * @param {String} type 1012 */ 1013function createButtonPseudo( type ) { 1014 return function( elem ) { 1015 var name = elem.nodeName.toLowerCase(); 1016 return ( name === "input" || name === "button" ) && elem.type === type; 1017 }; 1018} 1019 1020/** 1021 * Returns a function to use in pseudos for :enabled/:disabled 1022 * @param {Boolean} disabled true for :disabled; false for :enabled 1023 */ 1024function createDisabledPseudo( disabled ) { 1025 1026 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 1027 return function( elem ) { 1028 1029 // Only certain elements can match :enabled or :disabled 1030 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 1031 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 1032 if ( "form" in elem ) { 1033 1034 // Check for inherited disabledness on relevant non-disabled elements: 1035 // * listed form-associated elements in a disabled fieldset 1036 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 1037 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 1038 // * option elements in a disabled optgroup 1039 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 1040 // All such elements have a "form" property. 1041 if ( elem.parentNode && elem.disabled === false ) { 1042 1043 // Option elements defer to a parent optgroup if present 1044 if ( "label" in elem ) { 1045 if ( "label" in elem.parentNode ) { 1046 return elem.parentNode.disabled === disabled; 1047 } else { 1048 return elem.disabled === disabled; 1049 } 1050 } 1051 1052 // Support: IE 6 - 11 1053 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 1054 return elem.isDisabled === disabled || 1055 1056 // Where there is no isDisabled, check manually 1057 /* jshint -W018 */ 1058 elem.isDisabled !== !disabled && 1059 inDisabledFieldset( elem ) === disabled; 1060 } 1061 1062 return elem.disabled === disabled; 1063 1064 // Try to winnow out elements that can't be disabled before trusting the disabled property. 1065 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 1066 // even exist on them, let alone have a boolean value. 1067 } else if ( "label" in elem ) { 1068 return elem.disabled === disabled; 1069 } 1070 1071 // Remaining elements are neither :enabled nor :disabled 1072 return false; 1073 }; 1074} 1075 1076/** 1077 * Returns a function to use in pseudos for positionals 1078 * @param {Function} fn 1079 */ 1080function createPositionalPseudo( fn ) { 1081 return markFunction( function( argument ) { 1082 argument = +argument; 1083 return markFunction( function( seed, matches ) { 1084 var j, 1085 matchIndexes = fn( [], seed.length, argument ), 1086 i = matchIndexes.length; 1087 1088 // Match elements found at the specified indexes 1089 while ( i-- ) { 1090 if ( seed[ ( j = matchIndexes[ i ] ) ] ) { 1091 seed[ j ] = !( matches[ j ] = seed[ j ] ); 1092 } 1093 } 1094 } ); 1095 } ); 1096} 1097 1098/** 1099 * Checks a node for validity as a Sizzle context
1100 * @param {Element|Object=} context 1101 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 1102 */ 1103function testContext( context ) { 1104 return context && typeof context.getElementsByTagName !== "undefined" && context; 1105} 1106 1107// Expose support vars for convenience 1108support = Sizzle.support = {}; 1109 1110/** 1111 * Detects XML nodes 1112 * @param {Element|Object} elem An element or a document 1113 * @returns {Boolean} True iff elem is a non-HTML XML node 1114 */ 1115isXML = Sizzle.isXML = function( elem ) { 1116 var namespace = elem && elem.namespaceURI, 1117 docElem = elem && ( elem.ownerDocument || elem ).documentElement; 1118 1119 // Support: IE <=8 1120 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes 1121 // https://bugs.jquery.com/ticket/4833 1122 return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); 1123}; 1124 1125/** 1126 * Sets document-related variables once based on the current document 1127 * @param {Element|Object} [doc] An element or document object to use to set the document 1128 * @returns {Object} Returns the current document 1129 */ 1130setDocument = Sizzle.setDocument = function( node ) { 1131 var hasCompare, subWindow, 1132 doc = node ? node.ownerDocument || node : preferredDoc; 1133 1134 // Return early if doc is invalid or already selected 1135 // Support: IE 11+, Edge 17 - 18+ 1136 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1137 // two documents; shallow comparisons work. 1138 // eslint-disable-next-line eqeqeq 1139 if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { 1140 return document; 1141 } 1142 1143 // Update global variables 1144 document = doc; 1145 docElem = document.documentElement; 1146 documentIsHTML = !isXML( document ); 1147 1148 // Support: IE 9 - 11+, Edge 12 - 18+ 1149 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 1150 // Support: IE 11+, Edge 17 - 18+ 1151 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1152 // two documents; shallow comparisons work. 1153 // eslint-disable-next-line eqeqeq 1154 if ( preferredDoc != document && 1155 ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { 1156 1157 // Support: IE 11, Edge 1158 if ( subWindow.addEventListener ) { 1159 subWindow.addEventListener( "unload", unloadHandler, false ); 1160 1161 // Support: IE 9 - 10 only 1162 } else if ( subWindow.attachEvent ) { 1163 subWindow.attachEvent( "onunload", unloadHandler ); 1164 } 1165 } 1166 1167 // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, 1168 // Safari 4 - 5 only, Opera <=11.6 - 12.x only 1169 // IE/Edge & older browsers don't support the :scope pseudo-class. 1170 // Support: Safari 6.0 only 1171 // Safari 6.0 supports :scope but it's an alias of :root there. 1172 support.scope = assert( function( el ) { 1173 docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); 1174 return typeof el.querySelectorAll !== "undefined" && 1175 !el.querySelectorAll( ":scope fieldset div" ).length; 1176 } ); 1177 1178 /* Attributes 1179 ---------------------------------------------------------------------- */ 1180 1181 // Support: IE<8 1182 // Verify that getAttribute really returns attributes and not properties 1183 // (excepting IE8 booleans) 1184 support.attributes = assert( function( el ) { 1185 el.className = "i"; 1186 return !el.getAttribute( "className" ); 1187 } ); 1188 1189 /* getElement(s)By* 1190 ---------------------------------------------------------------------- */ 1191 1192 // Check if getElementsByTagName("*") returns only elements 1193 support.getElementsByTagName = assert( function( el ) { 1194 el.appendChild( document.createComment( "" ) ); 1195 return !el.getElementsByTagName( "*" ).length; 1196 } ); 1197 1198 // Support: IE<9 1199 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); 1200 1201 // Support: IE<10 1202 // Check if getElementById returns elements by name 1203 // The broken getElementById methods don't pick up programmatically-set names, 1204 // so use a roundabout getElementsByName test 1205 support.getById = assert( function( el ) { 1206 docElem.appendChild( el ).id = expando; 1207 return !document.getElementsByName || !document.getElementsByName( expando ).length; 1208 } ); 1209 1210 // ID filter and find 1211 if ( support.getById ) { 1212 Expr.filter[ "ID" ] = function( id ) { 1213 var attrId = id.replace( runescape, funescape ); 1214 return function( elem ) { 1215 return elem.getAttribute( "id" ) === attrId; 1216 }; 1217 }; 1218 Expr.find[ "ID" ] = function( id, context ) { 1219 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1220 var elem = context.getElementById( id ); 1221 return elem ? [ elem ] : []; 1222 } 1223 }; 1224 } else { 1225 Expr.filter[ "ID" ] = function( id ) { 1226 var attrId = id.replace( runescape, funescape ); 1227 return function( elem ) { 1228 var node = typeof elem.getAttributeNode !== "undefined" && 1229 elem.getAttributeNode( "id" ); 1230 return node && node.value === attrId; 1231 }; 1232 }; 1233
vendor: 4,196 bytes, lines 1234-1365
1234 // Support: IE 6 - 7 only 1235 // getElementById is not reliable as a find shortcut 1236 Expr.find[ "ID" ] = function( id, context ) { 1237 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1238 var node, i, elems, 1239 elem = context.getElementById( id ); 1240 1241 if ( elem ) { 1242 1243 // Verify the id attribute 1244 node = elem.getAttributeNode( "id" ); 1245 if ( node && node.value === id ) { 1246 return [ elem ]; 1247 } 1248 1249 // Fall back on getElementsByName 1250 elems = context.getElementsByName( id ); 1251 i = 0; 1252 while ( ( elem = elems[ i++ ] ) ) { 1253 node = elem.getAttributeNode( "id" ); 1254 if ( node && node.value === id ) { 1255 return [ elem ]; 1256 } 1257 } 1258 } 1259 1260 return []; 1261 } 1262 }; 1263 } 1264 1265 // Tag 1266 Expr.find[ "TAG" ] = support.getElementsByTagName ? 1267 function( tag, context ) { 1268 if ( typeof context.getElementsByTagName !== "undefined" ) { 1269 return context.getElementsByTagName( tag ); 1270 1271 // DocumentFragment nodes don't have gEBTN 1272 } else if ( support.qsa ) { 1273 return context.querySelectorAll( tag ); 1274 } 1275 } : 1276 1277 function( tag, context ) { 1278 var elem, 1279 tmp = [], 1280 i = 0, 1281 1282 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 1283 results = context.getElementsByTagName( tag ); 1284 1285 // Filter out possible comments 1286 if ( tag === "*" ) { 1287 while ( ( elem = results[ i++ ] ) ) { 1288 if ( elem.nodeType === 1 ) { 1289 tmp.push( elem ); 1290 } 1291 } 1292 1293 return tmp; 1294 } 1295 return results; 1296 }; 1297 1298 // Class 1299 Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { 1300 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 1301 return context.getElementsByClassName( className ); 1302 } 1303 }; 1304 1305 /* QSA/matchesSelector 1306 ---------------------------------------------------------------------- */ 1307 1308 // QSA and matchesSelector support 1309 1310 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 1311 rbuggyMatches = []; 1312 1313 // qSa(:focus) reports false when true (Chrome 21) 1314 // We allow this because of a bug in IE8/9 that throws an error 1315 // whenever `document.activeElement` is accessed on an iframe 1316 // So, we allow :focus to pass through QSA all the time to avoid the IE error 1317 // See https://bugs.jquery.com/ticket/13378 1318 rbuggyQSA = []; 1319 1320 if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { 1321 1322 // Build QSA regex 1323 // Regex strategy adopted from Diego Perini 1324 assert( function( el ) { 1325 1326 var input; 1327 1328 // Select is set to empty string on purpose 1329 // This is to test IE's treatment of not explicitly 1330 // setting a boolean content attribute, 1331 // since its presence should be enough 1332 // https://bugs.jquery.com/ticket/12359 1333 docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + 1334 "<select id='" + expando + "-\r\\' msallowcapture=''>" + 1335 "<option selected=''></option></select>"; 1336 1337 // Support: IE8, Opera 11-12.16 1338 // Nothing should be selected when empty strings follow ^= or $= or *= 1339 // The test attribute must be unknown in Opera but "safe" for WinRT 1340 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 1341 if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { 1342 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); 1343 } 1344 1345 // Support: IE8 1346 // Boolean attributes and "value" are not treated correctly 1347 if ( !el.querySelectorAll( "[selected]" ).length ) { 1348 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 1349 } 1350 1351 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 1352 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 1353 rbuggyQSA.push( "~=" ); 1354 } 1355 1356 // Support: IE 11+, Edge 15 - 18+ 1357 // IE 11/Edge don't find elements on a `[name='']` query in some cases. 1358 // Adding a temporary attribute to the document before the selection works 1359 // around the issue. 1360 // Interestingly, IE 10 & older don't seem to have the issue. 1361 input = document.createElement( "input" ); 1362 input.setAttribute( "name", "" ); 1363 el.appendChild( input ); 1364 if ( !el.querySelectorAll( "[name='']" ).length ) { 1365 rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*="
vendor: 4,065 bytes, lines 1365-1494
1365+ 1366 whitespace + "*(?:''|\"\")" ); 1367 } 1368 1369 // Webkit/Opera - :checked should return selected option elements 1370 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1371 // IE8 throws error here and will not see later tests 1372 if ( !el.querySelectorAll( ":checked" ).length ) { 1373 rbuggyQSA.push( ":checked" ); 1374 } 1375 1376 // Support: Safari 8+, iOS 8+ 1377 // https://bugs.webkit.org/show_bug.cgi?id=136851 1378 // In-page `selector#id sibling-combinator selector` fails 1379 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 1380 rbuggyQSA.push( ".#.+[+~]" ); 1381 } 1382 1383 // Support: Firefox <=3.6 - 5 only 1384 // Old Firefox doesn't throw on a badly-escaped identifier. 1385 el.querySelectorAll( "\\\f" ); 1386 rbuggyQSA.push( "[\\r\\n\\f]" ); 1387 } ); 1388 1389 assert( function( el ) { 1390 el.innerHTML = "<a href='' disabled='disabled'></a>" + 1391 "<select disabled='disabled'><option/></select>"; 1392 1393 // Support: Windows 8 Native Apps 1394 // The type and name attributes are restricted during .innerHTML assignment 1395 var input = document.createElement( "input" ); 1396 input.setAttribute( "type", "hidden" ); 1397 el.appendChild( input ).setAttribute( "name", "D" ); 1398 1399 // Support: IE8 1400 // Enforce case-sensitivity of name attribute 1401 if ( el.querySelectorAll( "[name=d]" ).length ) { 1402 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); 1403 } 1404 1405 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 1406 // IE8 throws error here and will not see later tests 1407 if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { 1408 rbuggyQSA.push( ":enabled", ":disabled" ); 1409 } 1410 1411 // Support: IE9-11+ 1412 // IE's :disabled selector does not pick up the children of disabled fieldsets 1413 docElem.appendChild( el ).disabled = true; 1414 if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { 1415 rbuggyQSA.push( ":enabled", ":disabled" ); 1416 } 1417 1418 // Support: Opera 10 - 11 only 1419 // Opera 10-11 does not throw on post-comma invalid pseudos 1420 el.querySelectorAll( "*,:x" ); 1421 rbuggyQSA.push( ",.*:" ); 1422 } ); 1423 } 1424 1425 if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || 1426 docElem.webkitMatchesSelector || 1427 docElem.mozMatchesSelector || 1428 docElem.oMatchesSelector || 1429 docElem.msMatchesSelector ) ) ) ) { 1430 1431 assert( function( el ) { 1432 1433 // Check to see if it's possible to do matchesSelector 1434 // on a disconnected node (IE 9) 1435 support.disconnectedMatch = matches.call( el, "*" ); 1436 1437 // This should fail with an exception 1438 // Gecko does not error, returns false instead 1439 matches.call( el, "[s!='']:x" ); 1440 rbuggyMatches.push( "!=", pseudos ); 1441 } ); 1442 } 1443 1444 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); 1445 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); 1446 1447 /* Contains 1448 ---------------------------------------------------------------------- */ 1449 hasCompare = rnative.test( docElem.compareDocumentPosition ); 1450 1451 // Element contains another 1452 // Purposefully self-exclusive 1453 // As in, an element does not contain itself 1454 contains = hasCompare || rnative.test( docElem.contains ) ? 1455 function( a, b ) { 1456 var adown = a.nodeType === 9 ? a.documentElement : a, 1457 bup = b && b.parentNode; 1458 return a === bup || !!( bup && bup.nodeType === 1 && ( 1459 adown.contains ? 1460 adown.contains( bup ) : 1461 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 1462 ) ); 1463 } : 1464 function( a, b ) { 1465 if ( b ) { 1466 while ( ( b = b.parentNode ) ) { 1467 if ( b === a ) { 1468 return true; 1469 } 1470 } 1471 } 1472 return false; 1473 }; 1474 1475 /* Sorting 1476 ---------------------------------------------------------------------- */ 1477 1478 // Document order sorting 1479 sortOrder = hasCompare ? 1480 function( a, b ) { 1481 1482 // Flag for duplicate removal 1483 if ( a === b ) { 1484 hasDuplicate = true; 1485 return 0; 1486 } 1487 1488 // Sort on method existence if only one input has compareDocumentPosition 1489 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 1490 if ( compare ) { 1491 return compare; 1492 } 1493 1494 // Calculate position if both inputs belong to the same document
1495 // Support: IE 11+, Edge 17 - 18+ 1496 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1497 // two documents; shallow comparisons work. 1498 // eslint-disable-next-line eqeqeq 1499 compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? 1500 a.compareDocumentPosition( b ) : 1501 1502 // Otherwise we know they are disconnected 1503 1; 1504 1505 // Disconnected nodes 1506 if ( compare & 1 || 1507 ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { 1508 1509 // Choose the first element that is related to our preferred document 1510 // Support: IE 11+, Edge 17 - 18+ 1511 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1512 // two documents; shallow comparisons work. 1513 // eslint-disable-next-line eqeqeq 1514 if ( a == document || a.ownerDocument == preferredDoc && 1515 contains( preferredDoc, a ) ) { 1516 return -1; 1517 } 1518 1519 // Support: IE 11+, Edge 17 - 18+ 1520 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1521 // two documents; shallow comparisons work. 1522 // eslint-disable-next-line eqeqeq 1523 if ( b == document || b.ownerDocument == preferredDoc && 1524 contains( preferredDoc, b ) ) { 1525 return 1; 1526 } 1527 1528 // Maintain original order 1529 return sortInput ? 1530 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1531 0; 1532 } 1533 1534 return compare & 4 ? -1 : 1; 1535 } : 1536 function( a, b ) { 1537 1538 // Exit early if the nodes are identical 1539 if ( a === b ) { 1540 hasDuplicate = true; 1541 return 0; 1542 } 1543 1544 var cur, 1545 i = 0, 1546 aup = a.parentNode, 1547 bup = b.parentNode, 1548 ap = [ a ], 1549 bp = [ b ]; 1550 1551 // Parentless nodes are either documents or disconnected 1552 if ( !aup || !bup ) { 1553 1554 // Support: IE 11+, Edge 17 - 18+ 1555 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1556 // two documents; shallow comparisons work. 1557 /* eslint-disable eqeqeq */ 1558 return a == document ? -1 : 1559 b == document ? 1 : 1560 /* eslint-enable eqeqeq */ 1561 aup ? -1 : 1562 bup ? 1 : 1563 sortInput ? 1564 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1565 0; 1566 1567 // If the nodes are siblings, we can do a quick check 1568 } else if ( aup === bup ) { 1569 return siblingCheck( a, b ); 1570 } 1571 1572 // Otherwise we need full lists of their ancestors for comparison 1573 cur = a; 1574 while ( ( cur = cur.parentNode ) ) { 1575 ap.unshift( cur ); 1576 } 1577 cur = b; 1578 while ( ( cur = cur.parentNode ) ) { 1579 bp.unshift( cur ); 1580 } 1581 1582 // Walk down the tree looking for a discrepancy 1583 while ( ap[ i ] === bp[ i ] ) { 1584 i++; 1585 } 1586 1587 return i ? 1588 1589 // Do a sibling check if the nodes have a common ancestor 1590 siblingCheck( ap[ i ], bp[ i ] ) : 1591 1592 // Otherwise nodes in our document sort first 1593 // Support: IE 11+, Edge 17 - 18+ 1594 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1595 // two documents; shallow comparisons work. 1596 /* eslint-disable eqeqeq */ 1597 ap[ i ] == preferredDoc ? -1 : 1598 bp[ i ] == preferredDoc ? 1 : 1599 /* eslint-enable eqeqeq */ 1600 0; 1601 }; 1602 1603 return document; 1604}; 1605 1606Sizzle.matches = function( expr, elements ) { 1607 return Sizzle( expr, null, null, elements ); 1608}; 1609 1610Sizzle.matchesSelector = function( elem, expr ) { 1611 setDocument( elem ); 1612 1613 if ( support.matchesSelector && documentIsHTML && 1614 !nonnativeSelectorCache[ expr + " " ] && 1615 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 1616 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 1617 1618 try { 1619 var ret = matches.call( elem, expr ); 1620 1621 // IE 9's matchesSelector returns false on disconnected nodes 1622 if ( ret || support.disconnectedMatch || 1623 1624 // As well, disconnected nodes are said to be in a document 1625 // fragment in IE 9 1626 elem.document && elem.document.nodeType !== 11 ) { 1627 return ret; 1628 } 1629 } catch ( e ) { 1630 nonnativeSelectorCache( expr, true ); 1631 } 1632 } 1633 1634 return Sizzle( expr, document, null, [ elem ] ).length > 0; 1635}; 1636 1637Sizzle.contains = function( context, elem ) { 1638 1639 // Set document vars if needed 1640 // Support: IE 11+, Edge 17 - 18+ 1641 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1642 // two documents; shallow comparisons work. 1643 // eslint-disable-next-line eqeqeq 1644 if ( ( context.ownerDocument || context ) != document ) { 1645 setDocument( context ); 1646 } 1647 return contains( context, elem ); 1648}; 1649 1650Sizzle.attr = function( elem, name ) { 1651 1652 // Set document vars if needed
vendor: 16,419 bytes, lines 1653-2245
1653 // Support: IE 11+, Edge 17 - 18+ 1654 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 1655 // two documents; shallow comparisons work. 1656 // eslint-disable-next-line eqeqeq 1657 if ( ( elem.ownerDocument || elem ) != document ) { 1658 setDocument( elem ); 1659 } 1660 1661 var fn = Expr.attrHandle[ name.toLowerCase() ], 1662 1663 // Don't get fooled by Object.prototype properties (jQuery #13807) 1664 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 1665 fn( elem, name, !documentIsHTML ) : 1666 undefined; 1667 1668 return val !== undefined ? 1669 val : 1670 support.attributes || !documentIsHTML ? 1671 elem.getAttribute( name ) : 1672 ( val = elem.getAttributeNode( name ) ) && val.specified ? 1673 val.value : 1674 null; 1675}; 1676 1677Sizzle.escape = function( sel ) { 1678 return ( sel + "" ).replace( rcssescape, fcssescape ); 1679}; 1680 1681Sizzle.error = function( msg ) { 1682 throw new Error( "Syntax error, unrecognized expression: " + msg ); 1683}; 1684 1685/** 1686 * Document sorting and removing duplicates 1687 * @param {ArrayLike} results 1688 */ 1689Sizzle.uniqueSort = function( results ) { 1690 var elem, 1691 duplicates = [], 1692 j = 0, 1693 i = 0; 1694 1695 // Unless we *know* we can detect duplicates, assume their presence 1696 hasDuplicate = !support.detectDuplicates; 1697 sortInput = !support.sortStable && results.slice( 0 ); 1698 results.sort( sortOrder ); 1699 1700 if ( hasDuplicate ) { 1701 while ( ( elem = results[ i++ ] ) ) { 1702 if ( elem === results[ i ] ) { 1703 j = duplicates.push( i ); 1704 } 1705 } 1706 while ( j-- ) { 1707 results.splice( duplicates[ j ], 1 ); 1708 } 1709 } 1710 1711 // Clear input after sorting to release objects 1712 // See https://github.com/jquery/sizzle/pull/225 1713 sortInput = null; 1714 1715 return results; 1716}; 1717 1718/** 1719 * Utility function for retrieving the text value of an array of DOM nodes 1720 * @param {Array|Element} elem 1721 */ 1722getText = Sizzle.getText = function( elem ) { 1723 var node, 1724 ret = "", 1725 i = 0, 1726 nodeType = elem.nodeType; 1727 1728 if ( !nodeType ) { 1729 1730 // If no nodeType, this is expected to be an array 1731 while ( ( node = elem[ i++ ] ) ) { 1732 1733 // Do not traverse comment nodes 1734 ret += getText( node ); 1735 } 1736 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 1737 1738 // Use textContent for elements 1739 // innerText usage removed for consistency of new lines (jQuery #11153) 1740 if ( typeof elem.textContent === "string" ) { 1741 return elem.textContent; 1742 } else { 1743 1744 // Traverse its children 1745 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 1746 ret += getText( elem ); 1747 } 1748 } 1749 } else if ( nodeType === 3 || nodeType === 4 ) { 1750 return elem.nodeValue; 1751 } 1752 1753 // Do not include comment or processing instruction nodes 1754 1755 return ret; 1756}; 1757 1758Expr = Sizzle.selectors = { 1759 1760 // Can be adjusted by the user 1761 cacheLength: 50, 1762 1763 createPseudo: markFunction, 1764 1765 match: matchExpr, 1766 1767 attrHandle: {}, 1768 1769 find: {}, 1770 1771 relative: { 1772 ">": { dir: "parentNode", first: true }, 1773 " ": { dir: "parentNode" }, 1774 "+": { dir: "previousSibling", first: true }, 1775 "~": { dir: "previousSibling" } 1776 }, 1777 1778 preFilter: { 1779 "ATTR": function( match ) { 1780 match[ 1 ] = match[ 1 ].replace( runescape, funescape ); 1781 1782 // Move the given value to match[3] whether quoted or unquoted 1783 match[ 3 ] = ( match[ 3 ] || match[ 4 ] || 1784 match[ 5 ] || "" ).replace( runescape, funescape ); 1785 1786 if ( match[ 2 ] === "~=" ) { 1787 match[ 3 ] = " " + match[ 3 ] + " "; 1788 } 1789 1790 return match.slice( 0, 4 ); 1791 }, 1792 1793 "CHILD": function( match ) { 1794 1795 /* matches from matchExpr["CHILD"] 1796 1 type (only|nth|...) 1797 2 what (child|of-type) 1798 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 1799 4 xn-component of xn+y argument ([+-]?\d*n|) 1800 5 sign of xn-component 1801 6 x of xn-component 1802 7 sign of y-component 1803 8 y of y-component 1804 */ 1805 match[ 1 ] = match[ 1 ].toLowerCase(); 1806 1807 if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { 1808 1809 // nth-* requires argument 1810 if ( !match[ 3 ] ) { 1811 Sizzle.error( match[ 0 ] ); 1812 } 1813 1814 // numeric x and y parameters for Expr.filter.CHILD 1815 // remember that false/true cast respectively to 0/1 1816 match[ 4 ] = +( match[ 4 ] ? 1817 match[ 5 ] + ( match[ 6 ] || 1 ) : 1818 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); 1819 match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); 1820 1821 // other types prohibit arguments 1822 } else if ( match[ 3 ] ) { 1823 Sizzle.error( match[ 0 ] ); 1824 } 1825 1826 return match; 1827 }, 1828 1829 "PSEUDO": function( match ) { 1830 var excess, 1831 unquoted = !match[ 6 ] && match[ 2 ]; 1832 1833 if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { 1834 return null; 1835 } 1836 1837 // Accept quoted arguments as-is 1838 if ( match[ 3 ] ) { 1839 match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; 1840 1841 // Strip excess characters from unquoted arguments 1842 } else if ( unquoted && rpseudo.test( unquoted ) && 1843 1844 // Get excess from tokenize (recursively) 1845 ( excess = tokenize( unquoted, true ) ) && 1846 1847 // advance to the next closing parenthesis 1848 ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { 1849 1850 // excess is a negative index 1851 match[ 0 ] = match[ 0 ].slice( 0, excess ); 1852 match[ 2 ] = unquoted.slice( 0, excess ); 1853 } 1854 1855 // Return only captures needed by the pseudo filter method (type and argument) 1856 return match.slice( 0, 3 ); 1857 } 1858 }, 1859 1860 filter: { 1861 1862 "TAG": function( nodeNameSelector ) { 1863 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 1864 return nodeNameSelector === "*" ? 1865 function() { 1866 return true; 1867 } : 1868 function( elem ) { 1869 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 1870 }; 1871 }, 1872 1873 "CLASS": function( className ) { 1874 var pattern = classCache[ className + " " ]; 1875 1876 return pattern || 1877 ( pattern = new RegExp( "(^|" + whitespace + 1878 ")" + className + "(" + whitespace + "|$)" ) ) && classCache( 1879 className, function( elem ) { 1880 return pattern.test( 1881 typeof elem.className === "string" && elem.className || 1882 typeof elem.getAttribute !== "undefined" && 1883 elem.getAttribute( "class" ) || 1884 "" 1885 ); 1886 } ); 1887 }, 1888 1889 "ATTR": function( name, operator, check ) { 1890 return function( elem ) { 1891 var result = Sizzle.attr( elem, name ); 1892 1893 if ( result == null ) { 1894 return operator === "!="; 1895 } 1896 if ( !operator ) { 1897 return true; 1898 } 1899 1900 result += ""; 1901 1902 /* eslint-disable max-len */ 1903 1904 return operator === "=" ? result === check : 1905 operator === "!=" ? result !== check : 1906 operator === "^=" ? check && result.indexOf( check ) === 0 : 1907 operator === "*=" ? check && result.indexOf( check ) > -1 : 1908 operator === "$=" ? check && result.slice( -check.length ) === check : 1909 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : 1910 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 1911 false; 1912 /* eslint-enable max-len */ 1913 1914 }; 1915 }, 1916 1917 "CHILD": function( type, what, _argument, first, last ) { 1918 var simple = type.slice( 0, 3 ) !== "nth", 1919 forward = type.slice( -4 ) !== "last", 1920 ofType = what === "of-type"; 1921 1922 return first === 1 && last === 0 ? 1923 1924 // Shortcut for :nth-*(n) 1925 function( elem ) { 1926 return !!elem.parentNode; 1927 } : 1928 1929 function( elem, _context, xml ) { 1930 var cache, uniqueCache, outerCache, node, nodeIndex, start, 1931 dir = simple !== forward ? "nextSibling" : "previousSibling", 1932 parent = elem.parentNode, 1933 name = ofType && elem.nodeName.toLowerCase(), 1934 useCache = !xml && !ofType, 1935 diff = false; 1936 1937 if ( parent ) { 1938 1939 // :(first|last|only)-(child|of-type) 1940 if ( simple ) { 1941 while ( dir ) { 1942 node = elem; 1943 while ( ( node = node[ dir ] ) ) { 1944 if ( ofType ? 1945 node.nodeName.toLowerCase() === name : 1946 node.nodeType === 1 ) { 1947 1948 return false; 1949 } 1950 } 1951 1952 // Reverse direction for :only-* (if we haven't yet done so) 1953 start = dir = type === "only" && !start && "nextSibling"; 1954 } 1955 return true; 1956 } 1957 1958 start = [ forward ? parent.firstChild : parent.lastChild ]; 1959 1960 // non-xml :nth-child(...) stores cache data on `parent` 1961 if ( forward && useCache ) { 1962 1963 // Seek `elem` from a previously-cached index 1964 1965 // ...in a gzip-friendly way 1966 node = parent; 1967 outerCache = node[ expando ] || ( node[ expando ] = {} ); 1968 1969 // Support: IE <9 only 1970 // Defend against cloned attroperties (jQuery gh-1709) 1971 uniqueCache = outerCache[ node.uniqueID ] || 1972 ( outerCache[ node.uniqueID ] = {} ); 1973 1974 cache = uniqueCache[ type ] || []; 1975 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 1976 diff = nodeIndex && cache[ 2 ]; 1977 node = nodeIndex && parent.childNodes[ nodeIndex ]; 1978 1979 while ( ( node = ++nodeIndex && node && node[ dir ] || 1980 1981 // Fallback to seeking `elem` from the start 1982 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 1983 1984 // When found, cache indexes on `parent` and break 1985 if ( node.nodeType === 1 && ++diff && node === elem ) { 1986 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; 1987 break; 1988 } 1989 } 1990 1991 } else { 1992 1993 // Use previously-cached element index if available 1994 if ( useCache ) { 1995 1996 // ...in a gzip-friendly way 1997 node = elem; 1998 outerCache = node[ expando ] || ( node[ expando ] = {} ); 1999 2000 // Support: IE <9 only 2001 // Defend against cloned attroperties (jQuery gh-1709) 2002 uniqueCache = outerCache[ node.uniqueID ] || 2003 ( outerCache[ node.uniqueID ] = {} ); 2004 2005 cache = uniqueCache[ type ] || []; 2006 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 2007 diff = nodeIndex; 2008 } 2009 2010 // xml :nth-child(...) 2011 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 2012 if ( diff === false ) { 2013 2014 // Use the same loop as above to seek `elem` from the start 2015 while ( ( node = ++nodeIndex && node && node[ dir ] || 2016 ( diff = nodeIndex = 0 ) || start.pop() ) ) { 2017 2018 if ( ( ofType ? 2019 node.nodeName.toLowerCase() === name : 2020 node.nodeType === 1 ) && 2021 ++diff ) { 2022 2023 // Cache the index of each encountered element 2024 if ( useCache ) { 2025 outerCache = node[ expando ] || 2026 ( node[ expando ] = {} ); 2027 2028 // Support: IE <9 only 2029 // Defend against cloned attroperties (jQuery gh-1709) 2030 uniqueCache = outerCache[ node.uniqueID ] || 2031 ( outerCache[ node.uniqueID ] = {} ); 2032 2033 uniqueCache[ type ] = [ dirruns, diff ]; 2034 } 2035 2036 if ( node === elem ) { 2037 break; 2038 } 2039 } 2040 } 2041 } 2042 } 2043 2044 // Incorporate the offset, then check against cycle size 2045 diff -= last; 2046 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 2047 } 2048 }; 2049 }, 2050 2051 "PSEUDO": function( pseudo, argument ) { 2052 2053 // pseudo-class names are case-insensitive 2054 // http://www.w3.org/TR/selectors/#pseudo-classes 2055 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 2056 // Remember that setFilters inherits from pseudos 2057 var args, 2058 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 2059 Sizzle.error( "unsupported pseudo: " + pseudo ); 2060 2061 // The user may use createPseudo to indicate that 2062 // arguments are needed to create the filter function 2063 // just as Sizzle does 2064 if ( fn[ expando ] ) { 2065 return fn( argument ); 2066 } 2067 2068 // But maintain support for old signatures 2069 if ( fn.length > 1 ) { 2070 args = [ pseudo, pseudo, "", argument ]; 2071 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 2072 markFunction( function( seed, matches ) { 2073 var idx, 2074 matched = fn( seed, argument ), 2075 i = matched.length; 2076 while ( i-- ) { 2077 idx = indexOf( seed, matched[ i ] ); 2078 seed[ idx ] = !( matches[ idx ] = matched[ i ] ); 2079 } 2080 } ) : 2081 function( elem ) { 2082 return fn( elem, 0, args ); 2083 }; 2084 } 2085 2086 return fn; 2087 } 2088 }, 2089 2090 pseudos: { 2091 2092 // Potentially complex pseudos 2093 "not": markFunction( function( selector ) { 2094 2095 // Trim the selector passed to compile 2096 // to avoid treating leading and trailing 2097 // spaces as combinators 2098 var input = [], 2099 results = [], 2100 matcher = compile( selector.replace( rtrim, "$1" ) ); 2101 2102 return matcher[ expando ] ? 2103 markFunction( function( seed, matches, _context, xml ) { 2104 var elem, 2105 unmatched = matcher( seed, null, xml, [] ), 2106 i = seed.length; 2107 2108 // Match elements unmatched by `matcher` 2109 while ( i-- ) { 2110 if ( ( elem = unmatched[ i ] ) ) { 2111 seed[ i ] = !( matches[ i ] = elem ); 2112 } 2113 } 2114 } ) : 2115 function( elem, _context, xml ) { 2116 input[ 0 ] = elem; 2117 matcher( input, null, xml, results ); 2118 2119 // Don't keep the element (issue #299) 2120 input[ 0 ] = null; 2121 return !results.pop(); 2122 }; 2123 } ), 2124 2125 "has": markFunction( function( selector ) { 2126 return function( elem ) { 2127 return Sizzle( selector, elem ).length > 0; 2128 }; 2129 } ), 2130 2131 "contains": markFunction( function( text ) { 2132 text = text.replace( runescape, funescape ); 2133 return function( elem ) { 2134 return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; 2135 }; 2136 } ), 2137 2138 // "Whether an element is represented by a :lang() selector 2139 // is based solely on the element's language value 2140 // being equal to the identifier C, 2141 // or beginning with the identifier C immediately followed by "-". 2142 // The matching of C against the element's language value is performed case-insensitively. 2143 // The identifier C does not have to be a valid language name." 2144 // http://www.w3.org/TR/selectors/#lang-pseudo 2145 "lang": markFunction( function( lang ) { 2146 2147 // lang value must be a valid identifier 2148 if ( !ridentifier.test( lang || "" ) ) { 2149 Sizzle.error( "unsupported lang: " + lang ); 2150 } 2151 lang = lang.replace( runescape, funescape ).toLowerCase(); 2152 return function( elem ) { 2153 var elemLang; 2154 do { 2155 if ( ( elemLang = documentIsHTML ? 2156 elem.lang : 2157 elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { 2158 2159 elemLang = elemLang.toLowerCase(); 2160 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 2161 } 2162 } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); 2163 return false; 2164 }; 2165 } ), 2166 2167 // Miscellaneous 2168 "target": function( elem ) { 2169 var hash = window.location && window.location.hash; 2170 return hash && hash.slice( 1 ) === elem.id; 2171 }, 2172 2173 "root": function( elem ) { 2174 return elem === docElem; 2175 }, 2176 2177 "focus": function( elem ) { 2178 return elem === document.activeElement && 2179 ( !document.hasFocus || document.hasFocus() ) && 2180 !!( elem.type || elem.href || ~elem.tabIndex ); 2181 }, 2182 2183 // Boolean properties 2184 "enabled": createDisabledPseudo( false ), 2185 "disabled": createDisabledPseudo( true ), 2186 2187 "checked": function( elem ) { 2188 2189 // In CSS3, :checked should return both checked and selected elements 2190 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 2191 var nodeName = elem.nodeName.toLowerCase(); 2192 return ( nodeName === "input" && !!elem.checked ) || 2193 ( nodeName === "option" && !!elem.selected ); 2194 }, 2195 2196 "selected": function( elem ) { 2197 2198 // Accessing this property makes selected-by-default 2199 // options in Safari work properly 2200 if ( elem.parentNode ) { 2201 // eslint-disable-next-line no-unused-expressions 2202 elem.parentNode.selectedIndex; 2203 } 2204 2205 return elem.selected === true; 2206 }, 2207 2208 // Contents 2209 "empty": function( elem ) { 2210 2211 // http://www.w3.org/TR/selectors/#empty-pseudo 2212 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 2213 // but not by others (comment: 8; processing instruction: 7; etc.) 2214 // nodeType < 6 works because attributes (2) do not appear as children 2215 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 2216 if ( elem.nodeType < 6 ) { 2217 return false; 2218 } 2219 } 2220 return true; 2221 }, 2222 2223 "parent": function( elem ) { 2224 return !Expr.pseudos[ "empty" ]( elem ); 2225 }, 2226 2227 // Element/input types 2228 "header": function( elem ) { 2229 return rheader.test( elem.nodeName ); 2230 }, 2231 2232 "input": function( elem ) { 2233 return rinputs.test( elem.nodeName ); 2234 }, 2235 2236 "button": function( elem ) { 2237 var name = elem.nodeName.toLowerCase(); 2238 return name === "input" && elem.type === "button" || name === "button"; 2239 }, 2240 2241 "text": function( elem ) { 2242 var attr; 2243 return elem.nodeName.toLowerCase() === "input" && 2244 elem.type === "text" && 2245
vendor: 21,282 bytes, lines 2246-3034
2246 // Support: IE<8 2247 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 2248 ( ( attr = elem.getAttribute( "type" ) ) == null || 2249 attr.toLowerCase() === "text" ); 2250 }, 2251 2252 // Position-in-collection 2253 "first": createPositionalPseudo( function() { 2254 return [ 0 ]; 2255 } ), 2256 2257 "last": createPositionalPseudo( function( _matchIndexes, length ) { 2258 return [ length - 1 ]; 2259 } ), 2260 2261 "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { 2262 return [ argument < 0 ? argument + length : argument ]; 2263 } ), 2264 2265 "even": createPositionalPseudo( function( matchIndexes, length ) { 2266 var i = 0; 2267 for ( ; i < length; i += 2 ) { 2268 matchIndexes.push( i ); 2269 } 2270 return matchIndexes; 2271 } ), 2272 2273 "odd": createPositionalPseudo( function( matchIndexes, length ) { 2274 var i = 1; 2275 for ( ; i < length; i += 2 ) { 2276 matchIndexes.push( i ); 2277 } 2278 return matchIndexes; 2279 } ), 2280 2281 "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { 2282 var i = argument < 0 ? 2283 argument + length : 2284 argument > length ? 2285 length : 2286 argument; 2287 for ( ; --i >= 0; ) { 2288 matchIndexes.push( i ); 2289 } 2290 return matchIndexes; 2291 } ), 2292 2293 "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { 2294 var i = argument < 0 ? argument + length : argument; 2295 for ( ; ++i < length; ) { 2296 matchIndexes.push( i ); 2297 } 2298 return matchIndexes; 2299 } ) 2300 } 2301}; 2302 2303Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; 2304 2305// Add button/input type pseudos 2306for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 2307 Expr.pseudos[ i ] = createInputPseudo( i ); 2308} 2309for ( i in { submit: true, reset: true } ) { 2310 Expr.pseudos[ i ] = createButtonPseudo( i ); 2311} 2312 2313// Easy API for creating new setFilters 2314function setFilters() {} 2315setFilters.prototype = Expr.filters = Expr.pseudos; 2316Expr.setFilters = new setFilters(); 2317 2318tokenize = Sizzle.tokenize = function( selector, parseOnly ) { 2319 var matched, match, tokens, type, 2320 soFar, groups, preFilters, 2321 cached = tokenCache[ selector + " " ]; 2322 2323 if ( cached ) { 2324 return parseOnly ? 0 : cached.slice( 0 ); 2325 } 2326 2327 soFar = selector; 2328 groups = []; 2329 preFilters = Expr.preFilter; 2330 2331 while ( soFar ) { 2332 2333 // Comma and first run 2334 if ( !matched || ( match = rcomma.exec( soFar ) ) ) { 2335 if ( match ) { 2336 2337 // Don't consume trailing commas as valid 2338 soFar = soFar.slice( match[ 0 ].length ) || soFar; 2339 } 2340 groups.push( ( tokens = [] ) ); 2341 } 2342 2343 matched = false; 2344 2345 // Combinators 2346 if ( ( match = rcombinators.exec( soFar ) ) ) { 2347 matched = match.shift(); 2348 tokens.push( { 2349 value: matched, 2350 2351 // Cast descendant combinators to space 2352 type: match[ 0 ].replace( rtrim, " " ) 2353 } ); 2354 soFar = soFar.slice( matched.length ); 2355 } 2356 2357 // Filters 2358 for ( type in Expr.filter ) { 2359 if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || 2360 ( match = preFilters[ type ]( match ) ) ) ) { 2361 matched = match.shift(); 2362 tokens.push( { 2363 value: matched, 2364 type: type, 2365 matches: match 2366 } ); 2367 soFar = soFar.slice( matched.length ); 2368 } 2369 } 2370 2371 if ( !matched ) { 2372 break; 2373 } 2374 } 2375 2376 // Return the length of the invalid excess 2377 // if we're just parsing 2378 // Otherwise, throw an error or return tokens 2379 return parseOnly ? 2380 soFar.length : 2381 soFar ? 2382 Sizzle.error( selector ) : 2383 2384 // Cache the tokens 2385 tokenCache( selector, groups ).slice( 0 ); 2386}; 2387 2388function toSelector( tokens ) { 2389 var i = 0, 2390 len = tokens.length, 2391 selector = ""; 2392 for ( ; i < len; i++ ) { 2393 selector += tokens[ i ].value; 2394 } 2395 return selector; 2396} 2397 2398function addCombinator( matcher, combinator, base ) { 2399 var dir = combinator.dir, 2400 skip = combinator.next, 2401 key = skip || dir, 2402 checkNonElements = base && key === "parentNode", 2403 doneName = done++; 2404 2405 return combinator.first ? 2406 2407 // Check against closest ancestor/preceding element 2408 function( elem, context, xml ) { 2409 while ( ( elem = elem[ dir ] ) ) { 2410 if ( elem.nodeType === 1 || checkNonElements ) { 2411 return matcher( elem, context, xml ); 2412 } 2413 } 2414 return false; 2415 } : 2416 2417 // Check against all ancestor/preceding elements 2418 function( elem, context, xml ) { 2419 var oldCache, uniqueCache, outerCache, 2420 newCache = [ dirruns, doneName ]; 2421 2422 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 2423 if ( xml ) { 2424 while ( ( elem = elem[ dir ] ) ) { 2425 if ( elem.nodeType === 1 || checkNonElements ) { 2426 if ( matcher( elem, context, xml ) ) { 2427 return true; 2428 } 2429 } 2430 } 2431 } else { 2432 while ( ( elem = elem[ dir ] ) ) { 2433 if ( elem.nodeType === 1 || checkNonElements ) { 2434 outerCache = elem[ expando ] || ( elem[ expando ] = {} ); 2435 2436 // Support: IE <9 only 2437 // Defend against cloned attroperties (jQuery gh-1709) 2438 uniqueCache = outerCache[ elem.uniqueID ] || 2439 ( outerCache[ elem.uniqueID ] = {} ); 2440 2441 if ( skip && skip === elem.nodeName.toLowerCase() ) { 2442 elem = elem[ dir ] || elem; 2443 } else if ( ( oldCache = uniqueCache[ key ] ) && 2444 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 2445 2446 // Assign to newCache so results back-propagate to previous elements 2447 return ( newCache[ 2 ] = oldCache[ 2 ] ); 2448 } else { 2449 2450 // Reuse newcache so results back-propagate to previous elements 2451 uniqueCache[ key ] = newCache; 2452 2453 // A match means we're done; a fail means we have to keep checking 2454 if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { 2455 return true; 2456 } 2457 } 2458 } 2459 } 2460 } 2461 return false; 2462 }; 2463} 2464 2465function elementMatcher( matchers ) { 2466 return matchers.length > 1 ? 2467 function( elem, context, xml ) { 2468 var i = matchers.length; 2469 while ( i-- ) { 2470 if ( !matchers[ i ]( elem, context, xml ) ) { 2471 return false; 2472 } 2473 } 2474 return true; 2475 } : 2476 matchers[ 0 ]; 2477} 2478 2479function multipleContexts( selector, contexts, results ) { 2480 var i = 0, 2481 len = contexts.length; 2482 for ( ; i < len; i++ ) { 2483 Sizzle( selector, contexts[ i ], results ); 2484 } 2485 return results; 2486} 2487 2488function condense( unmatched, map, filter, context, xml ) { 2489 var elem, 2490 newUnmatched = [], 2491 i = 0, 2492 len = unmatched.length, 2493 mapped = map != null; 2494 2495 for ( ; i < len; i++ ) { 2496 if ( ( elem = unmatched[ i ] ) ) { 2497 if ( !filter || filter( elem, context, xml ) ) { 2498 newUnmatched.push( elem ); 2499 if ( mapped ) { 2500 map.push( i ); 2501 } 2502 } 2503 } 2504 } 2505 2506 return newUnmatched; 2507} 2508 2509function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 2510 if ( postFilter && !postFilter[ expando ] ) { 2511 postFilter = setMatcher( postFilter ); 2512 } 2513 if ( postFinder && !postFinder[ expando ] ) { 2514 postFinder = setMatcher( postFinder, postSelector ); 2515 } 2516 return markFunction( function( seed, results, context, xml ) { 2517 var temp, i, elem, 2518 preMap = [], 2519 postMap = [], 2520 preexisting = results.length, 2521 2522 // Get initial elements from seed or context 2523 elems = seed || multipleContexts( 2524 selector || "*", 2525 context.nodeType ? [ context ] : context, 2526 [] 2527 ), 2528 2529 // Prefilter to get matcher input, preserving a map for seed-results synchronization 2530 matcherIn = preFilter && ( seed || !selector ) ? 2531 condense( elems, preMap, preFilter, context, xml ) : 2532 elems, 2533 2534 matcherOut = matcher ? 2535 2536 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 2537 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 2538 2539 // ...intermediate processing is necessary 2540 [] : 2541 2542 // ...otherwise use results directly 2543 results : 2544 matcherIn; 2545 2546 // Find primary matches 2547 if ( matcher ) { 2548 matcher( matcherIn, matcherOut, context, xml ); 2549 } 2550 2551 // Apply postFilter 2552 if ( postFilter ) { 2553 temp = condense( matcherOut, postMap ); 2554 postFilter( temp, [], context, xml ); 2555 2556 // Un-match failing elements by moving them back to matcherIn 2557 i = temp.length; 2558 while ( i-- ) { 2559 if ( ( elem = temp[ i ] ) ) { 2560 matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); 2561 } 2562 } 2563 } 2564 2565 if ( seed ) { 2566 if ( postFinder || preFilter ) { 2567 if ( postFinder ) { 2568 2569 // Get the final matcherOut by condensing this intermediate into postFinder contexts 2570 temp = []; 2571 i = matcherOut.length; 2572 while ( i-- ) { 2573 if ( ( elem = matcherOut[ i ] ) ) { 2574 2575 // Restore matcherIn since elem is not yet a final match 2576 temp.push( ( matcherIn[ i ] = elem ) ); 2577 } 2578 } 2579 postFinder( null, ( matcherOut = [] ), temp, xml ); 2580 } 2581 2582 // Move matched elements from seed to results to keep them synchronized 2583 i = matcherOut.length; 2584 while ( i-- ) { 2585 if ( ( elem = matcherOut[ i ] ) && 2586 ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { 2587 2588 seed[ temp ] = !( results[ temp ] = elem ); 2589 } 2590 } 2591 } 2592 2593 // Add elements to results, through postFinder if defined 2594 } else { 2595 matcherOut = condense( 2596 matcherOut === results ? 2597 matcherOut.splice( preexisting, matcherOut.length ) : 2598 matcherOut 2599 ); 2600 if ( postFinder ) { 2601 postFinder( null, results, matcherOut, xml ); 2602 } else { 2603 push.apply( results, matcherOut ); 2604 } 2605 } 2606 } ); 2607} 2608 2609function matcherFromTokens( tokens ) { 2610 var checkContext, matcher, j, 2611 len = tokens.length, 2612 leadingRelative = Expr.relative[ tokens[ 0 ].type ], 2613 implicitRelative = leadingRelative || Expr.relative[ " " ], 2614 i = leadingRelative ? 1 : 0, 2615 2616 // The foundational matcher ensures that elements are reachable from top-level context(s) 2617 matchContext = addCombinator( function( elem ) { 2618 return elem === checkContext; 2619 }, implicitRelative, true ), 2620 matchAnyContext = addCombinator( function( elem ) { 2621 return indexOf( checkContext, elem ) > -1; 2622 }, implicitRelative, true ), 2623 matchers = [ function( elem, context, xml ) { 2624 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 2625 ( checkContext = context ).nodeType ? 2626 matchContext( elem, context, xml ) : 2627 matchAnyContext( elem, context, xml ) ); 2628 2629 // Avoid hanging onto element (issue #299) 2630 checkContext = null; 2631 return ret; 2632 } ]; 2633 2634 for ( ; i < len; i++ ) { 2635 if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { 2636 matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; 2637 } else { 2638 matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); 2639 2640 // Return special upon seeing a positional matcher 2641 if ( matcher[ expando ] ) { 2642 2643 // Find the next relative operator (if any) for proper handling 2644 j = ++i; 2645 for ( ; j < len; j++ ) { 2646 if ( Expr.relative[ tokens[ j ].type ] ) { 2647 break; 2648 } 2649 } 2650 return setMatcher( 2651 i > 1 && elementMatcher( matchers ), 2652 i > 1 && toSelector( 2653 2654 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 2655 tokens 2656 .slice( 0, i - 1 ) 2657 .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) 2658 ).replace( rtrim, "$1" ), 2659 matcher, 2660 i < j && matcherFromTokens( tokens.slice( i, j ) ), 2661 j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), 2662 j < len && toSelector( tokens ) 2663 ); 2664 } 2665 matchers.push( matcher ); 2666 } 2667 } 2668 2669 return elementMatcher( matchers ); 2670} 2671 2672function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 2673 var bySet = setMatchers.length > 0, 2674 byElement = elementMatchers.length > 0, 2675 superMatcher = function( seed, context, xml, results, outermost ) { 2676 var elem, j, matcher, 2677 matchedCount = 0, 2678 i = "0", 2679 unmatched = seed && [], 2680 setMatched = [], 2681 contextBackup = outermostContext, 2682 2683 // We must always have either seed elements or outermost context 2684 elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), 2685 2686 // Use integer dirruns iff this is the outermost matcher 2687 dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), 2688 len = elems.length; 2689 2690 if ( outermost ) { 2691 2692 // Support: IE 11+, Edge 17 - 18+ 2693 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2694 // two documents; shallow comparisons work. 2695 // eslint-disable-next-line eqeqeq 2696 outermostContext = context == document || context || outermost; 2697 } 2698 2699 // Add elements passing elementMatchers directly to results 2700 // Support: IE<9, Safari 2701 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 2702 for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { 2703 if ( byElement && elem ) { 2704 j = 0; 2705 2706 // Support: IE 11+, Edge 17 - 18+ 2707 // IE/Edge sometimes throw a "Permission denied" error when strict-comparing 2708 // two documents; shallow comparisons work. 2709 // eslint-disable-next-line eqeqeq 2710 if ( !context && elem.ownerDocument != document ) { 2711 setDocument( elem ); 2712 xml = !documentIsHTML; 2713 } 2714 while ( ( matcher = elementMatchers[ j++ ] ) ) { 2715 if ( matcher( elem, context || document, xml ) ) { 2716 results.push( elem ); 2717 break; 2718 } 2719 } 2720 if ( outermost ) { 2721 dirruns = dirrunsUnique; 2722 } 2723 } 2724 2725 // Track unmatched elements for set filters 2726 if ( bySet ) { 2727 2728 // They will have gone through all possible matchers 2729 if ( ( elem = !matcher && elem ) ) { 2730 matchedCount--; 2731 } 2732 2733 // Lengthen the array for every element, matched or not 2734 if ( seed ) { 2735 unmatched.push( elem ); 2736 } 2737 } 2738 } 2739 2740 // `i` is now the count of elements visited above, and adding it to `matchedCount` 2741 // makes the latter nonnegative. 2742 matchedCount += i; 2743 2744 // Apply set filters to unmatched elements 2745 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 2746 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 2747 // no element matchers and no seed. 2748 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 2749 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 2750 // numerically zero. 2751 if ( bySet && i !== matchedCount ) { 2752 j = 0; 2753 while ( ( matcher = setMatchers[ j++ ] ) ) { 2754 matcher( unmatched, setMatched, context, xml ); 2755 } 2756 2757 if ( seed ) { 2758 2759 // Reintegrate element matches to eliminate the need for sorting 2760 if ( matchedCount > 0 ) { 2761 while ( i-- ) { 2762 if ( !( unmatched[ i ] || setMatched[ i ] ) ) { 2763 setMatched[ i ] = pop.call( results ); 2764 } 2765 } 2766 } 2767 2768 // Discard index placeholder values to get only actual matches 2769 setMatched = condense( setMatched ); 2770 } 2771 2772 // Add matches to results 2773 push.apply( results, setMatched ); 2774 2775 // Seedless set matches succeeding multiple successful matchers stipulate sorting 2776 if ( outermost && !seed && setMatched.length > 0 && 2777 ( matchedCount + setMatchers.length ) > 1 ) { 2778 2779 Sizzle.uniqueSort( results ); 2780 } 2781 } 2782 2783 // Override manipulation of globals by nested matchers 2784 if ( outermost ) { 2785 dirruns = dirrunsUnique; 2786 outermostContext = contextBackup; 2787 } 2788 2789 return unmatched; 2790 }; 2791 2792 return bySet ? 2793 markFunction( superMatcher ) : 2794 superMatcher; 2795} 2796 2797compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { 2798 var i, 2799 setMatchers = [], 2800 elementMatchers = [], 2801 cached = compilerCache[ selector + " " ]; 2802 2803 if ( !cached ) { 2804 2805 // Generate a function of recursive functions that can be used to check each element 2806 if ( !match ) { 2807 match = tokenize( selector ); 2808 } 2809 i = match.length; 2810 while ( i-- ) { 2811 cached = matcherFromTokens( match[ i ] ); 2812 if ( cached[ expando ] ) { 2813 setMatchers.push( cached ); 2814 } else { 2815 elementMatchers.push( cached ); 2816 } 2817 } 2818 2819 // Cache the compiled function 2820 cached = compilerCache( 2821 selector, 2822 matcherFromGroupMatchers( elementMatchers, setMatchers ) 2823 ); 2824 2825 // Save selector and tokenization 2826 cached.selector = selector; 2827 } 2828 return cached; 2829}; 2830 2831/** 2832 * A low-level selection function that works with Sizzle's compiled 2833 * selector functions 2834 * @param {String|Function} selector A selector or a pre-compiled 2835 * selector function built with Sizzle.compile 2836 * @param {Element} context 2837 * @param {Array} [results] 2838 * @param {Array} [seed] A set of elements to match against 2839 */ 2840select = Sizzle.select = function( selector, context, results, seed ) { 2841 var i, tokens, token, type, find, 2842 compiled = typeof selector === "function" && selector, 2843 match = !seed && tokenize( ( selector = compiled.selector || selector ) ); 2844 2845 results = results || []; 2846 2847 // Try to minimize operations if there is only one selector in the list and no seed 2848 // (the latter of which guarantees us context) 2849 if ( match.length === 1 ) { 2850 2851 // Reduce context if the leading compound selector is an ID 2852 tokens = match[ 0 ] = match[ 0 ].slice( 0 ); 2853 if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && 2854 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { 2855 2856 context = ( Expr.find[ "ID" ]( token.matches[ 0 ] 2857 .replace( runescape, funescape ), context ) || [] )[ 0 ]; 2858 if ( !context ) { 2859 return results; 2860 2861 // Precompiled matchers will still verify ancestry, so step up a level 2862 } else if ( compiled ) { 2863 context = context.parentNode; 2864 } 2865 2866 selector = selector.slice( tokens.shift().value.length ); 2867 } 2868 2869 // Fetch a seed set for right-to-left matching 2870 i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; 2871 while ( i-- ) { 2872 token = tokens[ i ]; 2873 2874 // Abort if we hit a combinator 2875 if ( Expr.relative[ ( type = token.type ) ] ) { 2876 break; 2877 } 2878 if ( ( find = Expr.find[ type ] ) ) { 2879 2880 // Search, expanding context for leading sibling combinators 2881 if ( ( seed = find( 2882 token.matches[ 0 ].replace( runescape, funescape ), 2883 rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || 2884 context 2885 ) ) ) { 2886 2887 // If seed is empty or no tokens remain, we can return early 2888 tokens.splice( i, 1 ); 2889 selector = seed.length && toSelector( tokens ); 2890 if ( !selector ) { 2891 push.apply( results, seed ); 2892 return results; 2893 } 2894 2895 break; 2896 } 2897 } 2898 } 2899 } 2900 2901 // Compile and execute a filtering function if one is not provided 2902 // Provide `match` to avoid retokenization if we modified the selector above 2903 ( compiled || compile( selector, match ) )( 2904 seed, 2905 context, 2906 !documentIsHTML, 2907 results, 2908 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 2909 ); 2910 return results; 2911}; 2912 2913// One-time assignments 2914 2915// Sort stability 2916support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; 2917 2918// Support: Chrome 14-35+ 2919// Always assume duplicates if they aren't passed to the comparison function 2920support.detectDuplicates = !!hasDuplicate; 2921 2922// Initialize against the default document 2923setDocument(); 2924 2925// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 2926// Detached nodes confoundingly follow *each other* 2927support.sortDetached = assert( function( el ) { 2928 2929 // Should return 1, but returns 4 (following) 2930 return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; 2931} ); 2932 2933// Support: IE<8 2934// Prevent attribute/property "interpolation" 2935// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 2936if ( !assert( function( el ) { 2937 el.innerHTML = "<a href='#'></a>"; 2938 return el.firstChild.getAttribute( "href" ) === "#"; 2939} ) ) { 2940 addHandle( "type|href|height|width", function( elem, name, isXML ) { 2941 if ( !isXML ) { 2942 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); 2943 } 2944 } ); 2945} 2946 2947// Support: IE<9 2948// Use defaultValue in place of getAttribute("value") 2949if ( !support.attributes || !assert( function( el ) { 2950 el.innerHTML = "<input/>"; 2951 el.firstChild.setAttribute( "value", "" ); 2952 return el.firstChild.getAttribute( "value" ) === ""; 2953} ) ) { 2954 addHandle( "value", function( elem, _name, isXML ) { 2955 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { 2956 return elem.defaultValue; 2957 } 2958 } ); 2959} 2960 2961// Support: IE<9 2962// Use getAttributeNode to fetch booleans when getAttribute lies 2963if ( !assert( function( el ) { 2964 return el.getAttribute( "disabled" ) == null; 2965} ) ) { 2966 addHandle( booleans, function( elem, name, isXML ) { 2967 var val; 2968 if ( !isXML ) { 2969 return elem[ name ] === true ? name.toLowerCase() : 2970 ( val = elem.getAttributeNode( name ) ) && val.specified ? 2971 val.value : 2972 null; 2973 } 2974 } ); 2975} 2976 2977return Sizzle; 2978 2979} )( window ); 2980 2981 2982 2983jQuery.find = Sizzle; 2984jQuery.expr = Sizzle.selectors; 2985 2986// Deprecated 2987jQuery.expr[ ":" ] = jQuery.expr.pseudos; 2988jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 2989jQuery.text = Sizzle.getText; 2990jQuery.isXMLDoc = Sizzle.isXML; 2991jQuery.contains = Sizzle.contains; 2992jQuery.escapeSelector = Sizzle.escape; 2993 2994 2995 2996 2997var dir = function( elem, dir, until ) { 2998 var matched = [], 2999 truncate = until !== undefined; 3000 3001 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 3002 if ( elem.nodeType === 1 ) { 3003 if ( truncate && jQuery( elem ).is( until ) ) { 3004 break; 3005 } 3006 matched.push( elem ); 3007 } 3008 } 3009 return matched; 3010}; 3011 3012 3013var siblings = function( n, elem ) { 3014 var matched = []; 3015 3016 for ( ; n; n = n.nextSibling ) { 3017 if ( n.nodeType === 1 && n !== elem ) { 3018 matched.push( n ); 3019 } 3020 } 3021 3022 return matched; 3023}; 3024 3025 3026var rneedsContext = jQuery.expr.match.needsContext; 3027 3028 3029 3030function nodeName( elem, name ) { 3031 3032 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 3033 3034}
vendor: 7,871 bytes, lines 3034-3348
3034 3035var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 3036 3037 3038 3039// Implement the identical functionality for filter and not 3040function winnow( elements, qualifier, not ) { 3041 if ( isFunction( qualifier ) ) { 3042 return jQuery.grep( elements, function( elem, i ) { 3043 return !!qualifier.call( elem, i, elem ) !== not; 3044 } ); 3045 } 3046 3047 // Single element 3048 if ( qualifier.nodeType ) { 3049 return jQuery.grep( elements, function( elem ) { 3050 return ( elem === qualifier ) !== not; 3051 } ); 3052 } 3053 3054 // Arraylike of elements (jQuery, arguments, Array) 3055 if ( typeof qualifier !== "string" ) { 3056 return jQuery.grep( elements, function( elem ) { 3057 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 3058 } ); 3059 } 3060 3061 // Filtered directly for both simple and complex selectors 3062 return jQuery.filter( qualifier, elements, not ); 3063} 3064 3065jQuery.filter = function( expr, elems, not ) { 3066 var elem = elems[ 0 ]; 3067 3068 if ( not ) { 3069 expr = ":not(" + expr + ")"; 3070 } 3071 3072 if ( elems.length === 1 && elem.nodeType === 1 ) { 3073 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 3074 } 3075 3076 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 3077 return elem.nodeType === 1; 3078 } ) ); 3079}; 3080 3081jQuery.fn.extend( { 3082 find: function( selector ) { 3083 var i, ret, 3084 len = this.length, 3085 self = this; 3086 3087 if ( typeof selector !== "string" ) { 3088 return this.pushStack( jQuery( selector ).filter( function() { 3089 for ( i = 0; i < len; i++ ) { 3090 if ( jQuery.contains( self[ i ], this ) ) { 3091 return true; 3092 } 3093 } 3094 } ) ); 3095 } 3096 3097 ret = this.pushStack( [] ); 3098 3099 for ( i = 0; i < len; i++ ) { 3100 jQuery.find( selector, self[ i ], ret ); 3101 } 3102 3103 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 3104 }, 3105 filter: function( selector ) { 3106 return this.pushStack( winnow( this, selector || [], false ) ); 3107 }, 3108 not: function( selector ) { 3109 return this.pushStack( winnow( this, selector || [], true ) ); 3110 }, 3111 is: function( selector ) { 3112 return !!winnow( 3113 this, 3114 3115 // If this is a positional/relative selector, check membership in the returned set 3116 // so $("p:first").is("p:last") won't return true for a doc with two "p". 3117 typeof selector === "string" && rneedsContext.test( selector ) ? 3118 jQuery( selector ) : 3119 selector || [], 3120 false 3121 ).length; 3122 } 3123} ); 3124 3125 3126// Initialize a jQuery object 3127 3128 3129// A central reference to the root jQuery(document) 3130var rootjQuery, 3131 3132 // A simple way to check for HTML strings 3133 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 3134 // Strict HTML recognition (#11290: must start with <) 3135 // Shortcut simple #id case for speed 3136 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 3137 3138 init = jQuery.fn.init = function( selector, context, root ) { 3139 var match, elem; 3140 3141 // HANDLE: $(""), $(null), $(undefined), $(false) 3142 if ( !selector ) { 3143 return this; 3144 } 3145 3146 // Method init() accepts an alternate rootjQuery 3147 // so migrate can support jQuery.sub (gh-2101) 3148 root = root || rootjQuery; 3149 3150 // Handle HTML strings 3151 if ( typeof selector === "string" ) { 3152 if ( selector[ 0 ] === "<" && 3153 selector[ selector.length - 1 ] === ">" && 3154 selector.length >= 3 ) { 3155 3156 // Assume that strings that start and end with <> are HTML and skip the regex check 3157 match = [ null, selector, null ]; 3158 3159 } else { 3160 match = rquickExpr.exec( selector ); 3161 } 3162 3163 // Match html or make sure no context is specified for #id 3164 if ( match && ( match[ 1 ] || !context ) ) { 3165 3166 // HANDLE: $(html) -> $(array) 3167 if ( match[ 1 ] ) { 3168 context = context instanceof jQuery ? context[ 0 ] : context; 3169 3170 // Option to run scripts is true for back-compat 3171 // Intentionally let the error be thrown if parseHTML is not present 3172 jQuery.merge( this, jQuery.parseHTML( 3173 match[ 1 ], 3174 context && context.nodeType ? context.ownerDocument || context : document, 3175 true 3176 ) ); 3177 3178 // HANDLE: $(html, props) 3179 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 3180 for ( match in context ) { 3181 3182 // Properties of context are called as methods if possible 3183 if ( isFunction( this[ match ] ) ) { 3184 this[ match ]( context[ match ] ); 3185 3186 // ...and otherwise set as attributes 3187 } else { 3188 this.attr( match, context[ match ] ); 3189 } 3190 } 3191 } 3192 3193 return this; 3194 3195 // HANDLE: $(#id) 3196 } else { 3197 elem = document.getElementById( match[ 2 ] ); 3198 3199 if ( elem ) { 3200 3201 // Inject the element directly into the jQuery object 3202 this[ 0 ] = elem; 3203 this.length = 1; 3204 } 3205 return this; 3206 } 3207 3208 // HANDLE: $(expr, $(...)) 3209 } else if ( !context || context.jquery ) { 3210 return ( context || root ).find( selector ); 3211 3212 // HANDLE: $(expr, context) 3213 // (which is just equivalent to: $(context).find(expr) 3214 } else { 3215 return this.constructor( context ).find( selector ); 3216 } 3217 3218 // HANDLE: $(DOMElement) 3219 } else if ( selector.nodeType ) { 3220 this[ 0 ] = selector; 3221 this.length = 1; 3222 return this; 3223 3224 // HANDLE: $(function) 3225 // Shortcut for document ready 3226 } else if ( isFunction( selector ) ) { 3227 return root.ready !== undefined ? 3228 root.ready( selector ) : 3229 3230 // Execute immediately if ready is not present 3231 selector( jQuery ); 3232 } 3233 3234 return jQuery.makeArray( selector, this ); 3235 }; 3236 3237// Give the init function the jQuery prototype for later instantiation 3238init.prototype = jQuery.fn; 3239 3240// Initialize central reference 3241rootjQuery = jQuery( document ); 3242 3243 3244var rparentsprev = /^(?:parents|prev(?:Until|All))/, 3245 3246 // Methods guaranteed to produce a unique set when starting from a unique set 3247 guaranteedUnique = { 3248 children: true, 3249 contents: true, 3250 next: true, 3251 prev: true 3252 }; 3253 3254jQuery.fn.extend( { 3255 has: function( target ) { 3256 var targets = jQuery( target, this ), 3257 l = targets.length; 3258 3259 return this.filter( function() { 3260 var i = 0; 3261 for ( ; i < l; i++ ) { 3262 if ( jQuery.contains( this, targets[ i ] ) ) { 3263 return true; 3264 } 3265 } 3266 } ); 3267 }, 3268 3269 closest: function( selectors, context ) { 3270 var cur, 3271 i = 0, 3272 l = this.length, 3273 matched = [], 3274 targets = typeof selectors !== "string" && jQuery( selectors ); 3275 3276 // Positional selectors never match, since there's no _selection_ context 3277 if ( !rneedsContext.test( selectors ) ) { 3278 for ( ; i < l; i++ ) { 3279 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 3280 3281 // Always skip document fragments 3282 if ( cur.nodeType < 11 && ( targets ? 3283 targets.index( cur ) > -1 : 3284 3285 // Don't pass non-elements to Sizzle 3286 cur.nodeType === 1 && 3287 jQuery.find.matchesSelector( cur, selectors ) ) ) { 3288 3289 matched.push( cur ); 3290 break; 3291 } 3292 } 3293 } 3294 } 3295 3296 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 3297 }, 3298 3299 // Determine the position of an element within the set 3300 index: function( elem ) { 3301 3302 // No argument, return index in parent 3303 if ( !elem ) { 3304 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 3305 } 3306 3307 // Index in selector 3308 if ( typeof elem === "string" ) { 3309 return indexOf.call( jQuery( elem ), this[ 0 ] ); 3310 } 3311 3312 // Locate the position of the desired element 3313 return indexOf.call( this, 3314 3315 // If it receives a jQuery object, the first element is used 3316 elem.jquery ? elem[ 0 ] : elem 3317 ); 3318 }, 3319 3320 add: function( selector, context ) { 3321 return this.pushStack( 3322 jQuery.uniqueSort( 3323 jQuery.merge( this.get(), jQuery( selector, context ) ) 3324 ) 3325 ); 3326 }, 3327 3328 addBack: function( selector ) { 3329 return this.add( selector == null ? 3330 this.prevObject : this.prevObject.filter( selector ) 3331 ); 3332 } 3333} ); 3334 3335function sibling( cur, dir ) { 3336 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 3337 return cur; 3338} 3339 3340jQuery.each( { 3341 parent: function( elem ) { 3342 var parent = elem.parentNode; 3343 return parent && parent.nodeType !== 11 ? parent : null; 3344 }, 3345 parents: function( elem ) { 3346 return dir( elem, "parentNode" ); 3347 }, 3348 parentsUntil: function( elem,
vendor: 13,141 bytes, lines 3348-3840
3348_i, until ) { 3349 return dir( elem, "parentNode", until ); 3350 }, 3351 next: function( elem ) { 3352 return sibling( elem, "nextSibling" ); 3353 }, 3354 prev: function( elem ) { 3355 return sibling( elem, "previousSibling" ); 3356 }, 3357 nextAll: function( elem ) { 3358 return dir( elem, "nextSibling" ); 3359 }, 3360 prevAll: function( elem ) { 3361 return dir( elem, "previousSibling" ); 3362 }, 3363 nextUntil: function( elem, _i, until ) { 3364 return dir( elem, "nextSibling", until ); 3365 }, 3366 prevUntil: function( elem, _i, until ) { 3367 return dir( elem, "previousSibling", until ); 3368 }, 3369 siblings: function( elem ) { 3370 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 3371 }, 3372 children: function( elem ) { 3373 return siblings( elem.firstChild ); 3374 }, 3375 contents: function( elem ) { 3376 if ( elem.contentDocument != null && 3377 3378 // Support: IE 11+ 3379 // <object> elements with no `data` attribute has an object 3380 // `contentDocument` with a `null` prototype. 3381 getProto( elem.contentDocument ) ) { 3382 3383 return elem.contentDocument; 3384 } 3385 3386 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 3387 // Treat the template element as a regular one in browsers that 3388 // don't support it. 3389 if ( nodeName( elem, "template" ) ) { 3390 elem = elem.content || elem; 3391 } 3392 3393 return jQuery.merge( [], elem.childNodes ); 3394 } 3395}, function( name, fn ) { 3396 jQuery.fn[ name ] = function( until, selector ) { 3397 var matched = jQuery.map( this, fn, until ); 3398 3399 if ( name.slice( -5 ) !== "Until" ) { 3400 selector = until; 3401 } 3402 3403 if ( selector && typeof selector === "string" ) { 3404 matched = jQuery.filter( selector, matched ); 3405 } 3406 3407 if ( this.length > 1 ) { 3408 3409 // Remove duplicates 3410 if ( !guaranteedUnique[ name ] ) { 3411 jQuery.uniqueSort( matched ); 3412 } 3413 3414 // Reverse order for parents* and prev-derivatives 3415 if ( rparentsprev.test( name ) ) { 3416 matched.reverse(); 3417 } 3418 } 3419 3420 return this.pushStack( matched ); 3421 }; 3422} ); 3423var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 3424 3425 3426 3427// Convert String-formatted options into Object-formatted ones 3428function createOptions( options ) { 3429 var object = {}; 3430 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 3431 object[ flag ] = true; 3432 } ); 3433 return object; 3434} 3435 3436/* 3437 * Create a callback list using the following parameters: 3438 * 3439 * options: an optional list of space-separated options that will change how 3440 * the callback list behaves or a more traditional option object 3441 * 3442 * By default a callback list will act like an event callback list and can be 3443 * "fired" multiple times. 3444 * 3445 * Possible options: 3446 * 3447 * once: will ensure the callback list can only be fired once (like a Deferred) 3448 * 3449 * memory: will keep track of previous values and will call any callback added 3450 * after the list has been fired right away with the latest "memorized" 3451 * values (like a Deferred) 3452 * 3453 * unique: will ensure a callback can only be added once (no duplicate in the list) 3454 * 3455 * stopOnFalse: interrupt callings when a callback returns false 3456 * 3457 */ 3458jQuery.Callbacks = function( options ) { 3459 3460 // Convert options from String-formatted to Object-formatted if needed 3461 // (we check in cache first) 3462 options = typeof options === "string" ? 3463 createOptions( options ) : 3464 jQuery.extend( {}, options ); 3465 3466 var // Flag to know if list is currently firing 3467 firing, 3468 3469 // Last fire value for non-forgettable lists 3470 memory, 3471 3472 // Flag to know if list was already fired 3473 fired, 3474 3475 // Flag to prevent firing 3476 locked, 3477 3478 // Actual callback list 3479 list = [], 3480 3481 // Queue of execution data for repeatable lists 3482 queue = [], 3483 3484 // Index of currently firing callback (modified by add/remove as needed) 3485 firingIndex = -1, 3486 3487 // Fire callbacks 3488 fire = function() { 3489 3490 // Enforce single-firing 3491 locked = locked || options.once; 3492 3493 // Execute callbacks for all pending executions, 3494 // respecting firingIndex overrides and runtime changes 3495 fired = firing = true; 3496 for ( ; queue.length; firingIndex = -1 ) { 3497 memory = queue.shift(); 3498 while ( ++firingIndex < list.length ) { 3499 3500 // Run callback and check for early termination 3501 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 3502 options.stopOnFalse ) { 3503 3504 // Jump to end and forget the data so .add doesn't re-fire 3505 firingIndex = list.length; 3506 memory = false; 3507 } 3508 } 3509 } 3510 3511 // Forget the data if we're done with it 3512 if ( !options.memory ) { 3513 memory = false; 3514 } 3515 3516 firing = false; 3517 3518 // Clean up if we're done firing for good 3519 if ( locked ) { 3520 3521 // Keep an empty list if we have data for future add calls 3522 if ( memory ) { 3523 list = []; 3524 3525 // Otherwise, this object is spent 3526 } else { 3527 list = ""; 3528 } 3529 } 3530 }, 3531 3532 // Actual Callbacks object 3533 self = { 3534 3535 // Add a callback or a collection of callbacks to the list 3536 add: function() { 3537 if ( list ) { 3538 3539 // If we have memory from a past run, we should fire after adding 3540 if ( memory && !firing ) { 3541 firingIndex = list.length - 1; 3542 queue.push( memory ); 3543 } 3544 3545 ( function add( args ) { 3546 jQuery.each( args, function( _, arg ) { 3547 if ( isFunction( arg ) ) { 3548 if ( !options.unique || !self.has( arg ) ) { 3549 list.push( arg ); 3550 } 3551 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 3552 3553 // Inspect recursively 3554 add( arg ); 3555 } 3556 } ); 3557 } )( arguments ); 3558 3559 if ( memory && !firing ) { 3560 fire(); 3561 } 3562 } 3563 return this; 3564 }, 3565 3566 // Remove a callback from the list 3567 remove: function() { 3568 jQuery.each( arguments, function( _, arg ) { 3569 var index; 3570 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 3571 list.splice( index, 1 ); 3572 3573 // Handle firing indexes 3574 if ( index <= firingIndex ) { 3575 firingIndex--; 3576 } 3577 } 3578 } ); 3579 return this; 3580 }, 3581 3582 // Check if a given callback is in the list. 3583 // If no argument is given, return whether or not list has callbacks attached. 3584 has: function( fn ) { 3585 return fn ? 3586 jQuery.inArray( fn, list ) > -1 : 3587 list.length > 0; 3588 }, 3589 3590 // Remove all callbacks from the list 3591 empty: function() { 3592 if ( list ) { 3593 list = []; 3594 } 3595 return this; 3596 }, 3597 3598 // Disable .fire and .add 3599 // Abort any current/pending executions 3600 // Clear all callbacks and values 3601 disable: function() { 3602 locked = queue = []; 3603 list = memory = ""; 3604 return this; 3605 }, 3606 disabled: function() { 3607 return !list; 3608 }, 3609 3610 // Disable .fire 3611 // Also disable .add unless we have memory (since it would have no effect) 3612 // Abort any pending executions 3613 lock: function() { 3614 locked = queue = []; 3615 if ( !memory && !firing ) { 3616 list = memory = ""; 3617 } 3618 return this; 3619 }, 3620 locked: function() { 3621 return !!locked; 3622 }, 3623 3624 // Call all callbacks with the given context and arguments 3625 fireWith: function( context, args ) { 3626 if ( !locked ) { 3627 args = args || []; 3628 args = [ context, args.slice ? args.slice() : args ]; 3629 queue.push( args ); 3630 if ( !firing ) { 3631 fire(); 3632 } 3633 } 3634 return this; 3635 }, 3636 3637 // Call all the callbacks with the given arguments 3638 fire: function() { 3639 self.fireWith( this, arguments ); 3640 return this; 3641 }, 3642 3643 // To know if the callbacks have already been called at least once 3644 fired: function() { 3645 return !!fired; 3646 } 3647 }; 3648 3649 return self; 3650}; 3651 3652 3653function Identity( v ) { 3654 return v; 3655} 3656function Thrower( ex ) { 3657 throw ex; 3658} 3659 3660function adoptValue( value, resolve, reject, noValue ) { 3661 var method; 3662 3663 try { 3664 3665 // Check for promise aspect first to privilege synchronous behavior 3666 if ( value && isFunction( ( method = value.promise ) ) ) { 3667 method.call( value ).done( resolve ).fail( reject ); 3668 3669 // Other thenables 3670 } else if ( value && isFunction( ( method = value.then ) ) ) { 3671 method.call( value, resolve, reject ); 3672 3673 // Other non-thenables 3674 } else { 3675 3676 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 3677 // * false: [ value ].slice( 0 ) => resolve( value ) 3678 // * true: [ value ].slice( 1 ) => resolve() 3679 resolve.apply( undefined, [ value ].slice( noValue ) ); 3680 } 3681 3682 // For Promises/A+, convert exceptions into rejections 3683 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 3684 // Deferred#then to conditionally suppress rejection. 3685 } catch ( value ) { 3686 3687 // Support: Android 4.0 only 3688 // Strict mode functions invoked without .call/.apply get global-object context 3689 reject.apply( undefined, [ value ] ); 3690 } 3691} 3692 3693jQuery.extend( { 3694 3695 Deferred: function( func ) { 3696 var tuples = [ 3697 3698 // action, add listener, callbacks, 3699 // ... .then handlers, argument index, [final state] 3700 [ "notify", "progress", jQuery.Callbacks( "memory" ), 3701 jQuery.Callbacks( "memory" ), 2 ], 3702 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 3703 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 3704 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 3705 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 3706 ], 3707 state = "pending", 3708 promise = { 3709 state: function() { 3710 return state; 3711 }, 3712 always: function() { 3713 deferred.done( arguments ).fail( arguments ); 3714 return this; 3715 }, 3716 "catch": function( fn ) { 3717 return promise.then( null, fn ); 3718 }, 3719 3720 // Keep pipe for back-compat 3721 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 3722 var fns = arguments; 3723 3724 return jQuery.Deferred( function( newDefer ) { 3725 jQuery.each( tuples, function( _i, tuple ) { 3726 3727 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 3728 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 3729 3730 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 3731 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 3732 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 3733 deferred[ tuple[ 1 ] ]( function() { 3734 var returned = fn && fn.apply( this, arguments ); 3735 if ( returned && isFunction( returned.promise ) ) { 3736 returned.promise() 3737 .progress( newDefer.notify ) 3738 .done( newDefer.resolve ) 3739 .fail( newDefer.reject ); 3740 } else { 3741 newDefer[ tuple[ 0 ] + "With" ]( 3742 this, 3743 fn ? [ returned ] : arguments 3744 ); 3745 } 3746 } ); 3747 } ); 3748 fns = null; 3749 } ).promise(); 3750 }, 3751 then: function( onFulfilled, onRejected, onProgress ) { 3752 var maxDepth = 0; 3753 function resolve( depth, deferred, handler, special ) { 3754 return function() { 3755 var that = this, 3756 args = arguments, 3757 mightThrow = function() { 3758 var returned, then; 3759 3760 // Support: Promises/A+ section 2.3.3.3.3 3761 // https://promisesaplus.com/#point-59 3762 // Ignore double-resolution attempts 3763 if ( depth < maxDepth ) { 3764 return; 3765 } 3766 3767 returned = handler.apply( that, args ); 3768 3769 // Support: Promises/A+ section 2.3.1 3770 // https://promisesaplus.com/#point-48 3771 if ( returned === deferred.promise() ) { 3772 throw new TypeError( "Thenable self-resolution" ); 3773 } 3774 3775 // Support: Promises/A+ sections 2.3.3.1, 3.5 3776 // https://promisesaplus.com/#point-54 3777 // https://promisesaplus.com/#point-75 3778 // Retrieve `then` only once 3779 then = returned && 3780 3781 // Support: Promises/A+ section 2.3.4 3782 // https://promisesaplus.com/#point-64 3783 // Only check objects and functions for thenability 3784 ( typeof returned === "object" || 3785 typeof returned === "function" ) && 3786 returned.then; 3787 3788 // Handle a returned thenable 3789 if ( isFunction( then ) ) { 3790 3791 // Special processors (notify) just wait for resolution 3792 if ( special ) { 3793 then.call( 3794 returned, 3795 resolve( maxDepth, deferred, Identity, special ), 3796 resolve( maxDepth, deferred, Thrower, special ) 3797 ); 3798 3799 // Normal processors (resolve) also hook into progress 3800 } else { 3801 3802 // ...and disregard older resolution values 3803 maxDepth++; 3804 3805 then.call( 3806 returned, 3807 resolve( maxDepth, deferred, Identity, special ), 3808 resolve( maxDepth, deferred, Thrower, special ), 3809 resolve( maxDepth, deferred, Identity, 3810 deferred.notifyWith ) 3811 ); 3812 } 3813 3814 // Handle all other returned values 3815 } else { 3816 3817 // Only substitute handlers pass on context 3818 // and multiple values (non-spec behavior) 3819 if ( handler !== Identity ) { 3820 that = undefined; 3821 args = [ returned ]; 3822 } 3823 3824 // Process the value(s) 3825 // Default process is resolve 3826 ( special || deferred.resolveWith )( that, args ); 3827 } 3828 }, 3829 3830 // Only normal processors (resolve) catch and reject exceptions 3831 process = special ? 3832 mightThrow : 3833 function() { 3834 try { 3835 mightThrow(); 3836 } catch ( e ) { 3837 3838 if ( jQuery.Deferred.exceptionHook ) { 3839 jQuery.Deferred.exceptionHook( e, 3840 process.
3840stackTrace ); 3841 } 3842 3843 // Support: Promises/A+ section 2.3.3.3.4.1 3844 // https://promisesaplus.com/#point-61 3845 // Ignore post-resolution exceptions 3846 if ( depth + 1 >= maxDepth ) { 3847 3848 // Only substitute handlers pass on context 3849 // and multiple values (non-spec behavior) 3850 if ( handler !== Thrower ) { 3851 that = undefined; 3852 args = [ e ]; 3853 } 3854 3855 deferred.rejectWith( that, args ); 3856 } 3857 } 3858 }; 3859
vendor: 8,433 bytes, lines 3860-4213
3860 // Support: Promises/A+ section 2.3.3.3.1 3861 // https://promisesaplus.com/#point-57 3862 // Re-resolve promises immediately to dodge false rejection from 3863 // subsequent errors 3864 if ( depth ) { 3865 process(); 3866 } else { 3867 3868 // Call an optional hook to record the stack, in case of exception 3869 // since it's otherwise lost when execution goes async 3870 if ( jQuery.Deferred.getStackHook ) { 3871 process.stackTrace = jQuery.Deferred.getStackHook(); 3872 } 3873 window.setTimeout( process ); 3874 } 3875 }; 3876 } 3877 3878 return jQuery.Deferred( function( newDefer ) { 3879 3880 // progress_handlers.add( ... ) 3881 tuples[ 0 ][ 3 ].add( 3882 resolve( 3883 0, 3884 newDefer, 3885 isFunction( onProgress ) ? 3886 onProgress : 3887 Identity, 3888 newDefer.notifyWith 3889 ) 3890 ); 3891 3892 // fulfilled_handlers.add( ... ) 3893 tuples[ 1 ][ 3 ].add( 3894 resolve( 3895 0, 3896 newDefer, 3897 isFunction( onFulfilled ) ? 3898 onFulfilled : 3899 Identity 3900 ) 3901 ); 3902 3903 // rejected_handlers.add( ... ) 3904 tuples[ 2 ][ 3 ].add( 3905 resolve( 3906 0, 3907 newDefer, 3908 isFunction( onRejected ) ? 3909 onRejected : 3910 Thrower 3911 ) 3912 ); 3913 } ).promise(); 3914 }, 3915 3916 // Get a promise for this deferred 3917 // If obj is provided, the promise aspect is added to the object 3918 promise: function( obj ) { 3919 return obj != null ? jQuery.extend( obj, promise ) : promise; 3920 } 3921 }, 3922 deferred = {}; 3923 3924 // Add list-specific methods 3925 jQuery.each( tuples, function( i, tuple ) { 3926 var list = tuple[ 2 ], 3927 stateString = tuple[ 5 ]; 3928 3929 // promise.progress = list.add 3930 // promise.done = list.add 3931 // promise.fail = list.add 3932 promise[ tuple[ 1 ] ] = list.add; 3933 3934 // Handle state 3935 if ( stateString ) { 3936 list.add( 3937 function() { 3938 3939 // state = "resolved" (i.e., fulfilled) 3940 // state = "rejected" 3941 state = stateString; 3942 }, 3943 3944 // rejected_callbacks.disable 3945 // fulfilled_callbacks.disable 3946 tuples[ 3 - i ][ 2 ].disable, 3947 3948 // rejected_handlers.disable 3949 // fulfilled_handlers.disable 3950 tuples[ 3 - i ][ 3 ].disable, 3951 3952 // progress_callbacks.lock 3953 tuples[ 0 ][ 2 ].lock, 3954 3955 // progress_handlers.lock 3956 tuples[ 0 ][ 3 ].lock 3957 ); 3958 } 3959 3960 // progress_handlers.fire 3961 // fulfilled_handlers.fire 3962 // rejected_handlers.fire 3963 list.add( tuple[ 3 ].fire ); 3964 3965 // deferred.notify = function() { deferred.notifyWith(...) } 3966 // deferred.resolve = function() { deferred.resolveWith(...) } 3967 // deferred.reject = function() { deferred.rejectWith(...) } 3968 deferred[ tuple[ 0 ] ] = function() { 3969 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 3970 return this; 3971 }; 3972 3973 // deferred.notifyWith = list.fireWith 3974 // deferred.resolveWith = list.fireWith 3975 // deferred.rejectWith = list.fireWith 3976 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 3977 } ); 3978 3979 // Make the deferred a promise 3980 promise.promise( deferred ); 3981 3982 // Call given func if any 3983 if ( func ) { 3984 func.call( deferred, deferred ); 3985 } 3986 3987 // All done! 3988 return deferred; 3989 }, 3990 3991 // Deferred helper 3992 when: function( singleValue ) { 3993 var 3994 3995 // count of uncompleted subordinates 3996 remaining = arguments.length, 3997 3998 // count of unprocessed arguments 3999 i = remaining, 4000 4001 // subordinate fulfillment data 4002 resolveContexts = Array( i ), 4003 resolveValues = slice.call( arguments ), 4004 4005 // the primary Deferred 4006 primary = jQuery.Deferred(), 4007 4008 // subordinate callback factory 4009 updateFunc = function( i ) { 4010 return function( value ) { 4011 resolveContexts[ i ] = this; 4012 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 4013 if ( !( --remaining ) ) { 4014 primary.resolveWith( resolveContexts, resolveValues ); 4015 } 4016 }; 4017 }; 4018 4019 // Single- and empty arguments are adopted like Promise.resolve 4020 if ( remaining <= 1 ) { 4021 adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, 4022 !remaining ); 4023 4024 // Use .then() to unwrap secondary thenables (cf. gh-3000) 4025 if ( primary.state() === "pending" || 4026 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 4027 4028 return primary.then(); 4029 } 4030 } 4031 4032 // Multiple arguments are aggregated like Promise.all array elements 4033 while ( i-- ) { 4034 adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); 4035 } 4036 4037 return primary.promise(); 4038 } 4039} ); 4040 4041 4042// These usually indicate a programmer mistake during development, 4043// warn about them ASAP rather than swallowing them by default. 4044var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 4045 4046jQuery.Deferred.exceptionHook = function( error, stack ) { 4047 4048 // Support: IE 8 - 9 only 4049 // Console exists when dev tools are open, which can happen at any time 4050 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 4051 window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); 4052 } 4053}; 4054 4055 4056 4057 4058jQuery.readyException = function( error ) { 4059 window.setTimeout( function() { 4060 throw error; 4061 } ); 4062}; 4063 4064 4065 4066 4067// The deferred used on DOM ready 4068var readyList = jQuery.Deferred(); 4069 4070jQuery.fn.ready = function( fn ) { 4071 4072 readyList 4073 .then( fn ) 4074 4075 // Wrap jQuery.readyException in a function so that the lookup 4076 // happens at the time of error handling instead of callback 4077 // registration. 4078 .catch( function( error ) { 4079 jQuery.readyException( error ); 4080 } ); 4081 4082 return this; 4083}; 4084 4085jQuery.extend( { 4086 4087 // Is the DOM ready to be used? Set to true once it occurs. 4088 isReady: false, 4089 4090 // A counter to track how many items to wait for before 4091 // the ready event fires. See #6781 4092 readyWait: 1, 4093 4094 // Handle when the DOM is ready 4095 ready: function( wait ) { 4096 4097 // Abort if there are pending holds or we're already ready 4098 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 4099 return; 4100 } 4101 4102 // Remember that the DOM is ready 4103 jQuery.isReady = true; 4104 4105 // If a normal DOM Ready event fired, decrement, and wait if need be 4106 if ( wait !== true && --jQuery.readyWait > 0 ) { 4107 return; 4108 } 4109 4110 // If there are functions bound, to execute 4111 readyList.resolveWith( document, [ jQuery ] ); 4112 } 4113} ); 4114 4115jQuery.ready.then = readyList.then; 4116 4117// The ready event handler and self cleanup method 4118function completed() { 4119 document.removeEventListener( "DOMContentLoaded", completed ); 4120 window.removeEventListener( "load", completed ); 4121 jQuery.ready(); 4122} 4123 4124// Catch cases where $(document).ready() is called 4125// after the browser event has already occurred. 4126// Support: IE <=9 - 10 only 4127// Older IE sometimes signals "interactive" too soon 4128if ( document.readyState === "complete" || 4129 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 4130 4131 // Handle it asynchronously to allow scripts the opportunity to delay ready 4132 window.setTimeout( jQuery.ready ); 4133 4134} else { 4135 4136 // Use the handy event callback 4137 document.addEventListener( "DOMContentLoaded", completed ); 4138 4139 // A fallback to window.onload, that will always work 4140 window.addEventListener( "load", completed ); 4141} 4142 4143 4144 4145 4146// Multifunctional method to get and set values of a collection 4147// The value/s can optionally be executed if it's a function 4148var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 4149 var i = 0, 4150 len = elems.length, 4151 bulk = key == null; 4152 4153 // Sets many values 4154 if ( toType( key ) === "object" ) { 4155 chainable = true; 4156 for ( i in key ) { 4157 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 4158 } 4159 4160 // Sets one value 4161 } else if ( value !== undefined ) { 4162 chainable = true; 4163 4164 if ( !isFunction( value ) ) { 4165 raw = true; 4166 } 4167 4168 if ( bulk ) { 4169 4170 // Bulk operations run against the entire set 4171 if ( raw ) { 4172 fn.call( elems, value ); 4173 fn = null; 4174 4175 // ...except when executing function values 4176 } else { 4177 bulk = fn; 4178 fn = function( elem, _key, value ) { 4179 return bulk.call( jQuery( elem ), value ); 4180 }; 4181 } 4182 } 4183 4184 if ( fn ) { 4185 for ( ; i < len; i++ ) { 4186 fn( 4187 elems[ i ], key, raw ? 4188 value : 4189 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 4190 ); 4191 } 4192 } 4193 } 4194 4195 if ( chainable ) { 4196 return elems; 4197 } 4198 4199 // Gets 4200 if ( bulk ) { 4201 return fn.call( elems ); 4202 } 4203 4204 return len ? fn( elems[ 0 ], key ) : emptyGet; 4205}; 4206 4207 4208// Matches dashed string for camelizing 4209var rmsPrefix = /^-ms-/, 4210 rdashAlpha = /-([a-z])/g; 4211 4212// Used by camelCase as callback to replace() 4213function fcamelCase( _
vendor: 11,636 bytes, lines 4213-4702
4213all, letter ) { 4214 return letter.toUpperCase(); 4215} 4216 4217// Convert dashed to camelCase; used by the css and data modules 4218// Support: IE <=9 - 11, Edge 12 - 15 4219// Microsoft forgot to hump their vendor prefix (#9572) 4220function camelCase( string ) { 4221 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 4222} 4223var acceptData = function( owner ) { 4224 4225 // Accepts only: 4226 // - Node 4227 // - Node.ELEMENT_NODE 4228 // - Node.DOCUMENT_NODE 4229 // - Object 4230 // - Any 4231 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 4232}; 4233 4234 4235 4236 4237function Data() { 4238 this.expando = jQuery.expando + Data.uid++; 4239} 4240 4241Data.uid = 1; 4242 4243Data.prototype = { 4244 4245 cache: function( owner ) { 4246 4247 // Check if the owner object already has a cache 4248 var value = owner[ this.expando ]; 4249 4250 // If not, create one 4251 if ( !value ) { 4252 value = {}; 4253 4254 // We can accept data for non-element nodes in modern browsers, 4255 // but we should not, see #8335. 4256 // Always return an empty object. 4257 if ( acceptData( owner ) ) { 4258 4259 // If it is a node unlikely to be stringify-ed or looped over 4260 // use plain assignment 4261 if ( owner.nodeType ) { 4262 owner[ this.expando ] = value; 4263 4264 // Otherwise secure it in a non-enumerable property 4265 // configurable must be true to allow the property to be 4266 // deleted when data is removed 4267 } else { 4268 Object.defineProperty( owner, this.expando, { 4269 value: value, 4270 configurable: true 4271 } ); 4272 } 4273 } 4274 } 4275 4276 return value; 4277 }, 4278 set: function( owner, data, value ) { 4279 var prop, 4280 cache = this.cache( owner ); 4281 4282 // Handle: [ owner, key, value ] args 4283 // Always use camelCase key (gh-2257) 4284 if ( typeof data === "string" ) { 4285 cache[ camelCase( data ) ] = value; 4286 4287 // Handle: [ owner, { properties } ] args 4288 } else { 4289 4290 // Copy the properties one-by-one to the cache object 4291 for ( prop in data ) { 4292 cache[ camelCase( prop ) ] = data[ prop ]; 4293 } 4294 } 4295 return cache; 4296 }, 4297 get: function( owner, key ) { 4298 return key === undefined ? 4299 this.cache( owner ) : 4300 4301 // Always use camelCase key (gh-2257) 4302 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 4303 }, 4304 access: function( owner, key, value ) { 4305 4306 // In cases where either: 4307 // 4308 // 1. No key was specified 4309 // 2. A string key was specified, but no value provided 4310 // 4311 // Take the "read" path and allow the get method to determine 4312 // which value to return, respectively either: 4313 // 4314 // 1. The entire cache object 4315 // 2. The data stored at the key 4316 // 4317 if ( key === undefined || 4318 ( ( key && typeof key === "string" ) && value === undefined ) ) { 4319 4320 return this.get( owner, key ); 4321 } 4322 4323 // When the key is not a string, or both a key and value 4324 // are specified, set or extend (existing objects) with either: 4325 // 4326 // 1. An object of properties 4327 // 2. A key and value 4328 // 4329 this.set( owner, key, value ); 4330 4331 // Since the "set" path can have two possible entry points 4332 // return the expected data based on which path was taken[*] 4333 return value !== undefined ? value : key; 4334 }, 4335 remove: function( owner, key ) { 4336 var i, 4337 cache = owner[ this.expando ]; 4338 4339 if ( cache === undefined ) { 4340 return; 4341 } 4342 4343 if ( key !== undefined ) { 4344 4345 // Support array or space separated string of keys 4346 if ( Array.isArray( key ) ) { 4347 4348 // If key is an array of keys... 4349 // We always set camelCase keys, so remove that. 4350 key = key.map( camelCase ); 4351 } else { 4352 key = camelCase( key ); 4353 4354 // If a key with the spaces exists, use it. 4355 // Otherwise, create an array by matching non-whitespace 4356 key = key in cache ? 4357 [ key ] : 4358 ( key.match( rnothtmlwhite ) || [] ); 4359 } 4360 4361 i = key.length; 4362 4363 while ( i-- ) { 4364 delete cache[ key[ i ] ]; 4365 } 4366 } 4367 4368 // Remove the expando if there's no more data 4369 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 4370 4371 // Support: Chrome <=35 - 45 4372 // Webkit & Blink performance suffers when deleting properties 4373 // from DOM nodes, so set to undefined instead 4374 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 4375 if ( owner.nodeType ) { 4376 owner[ this.expando ] = undefined; 4377 } else { 4378 delete owner[ this.expando ]; 4379 } 4380 } 4381 }, 4382 hasData: function( owner ) { 4383 var cache = owner[ this.expando ]; 4384 return cache !== undefined && !jQuery.isEmptyObject( cache ); 4385 } 4386}; 4387var dataPriv = new Data(); 4388 4389var dataUser = new Data(); 4390 4391 4392 4393// Implementation Summary 4394// 4395// 1. Enforce API surface and semantic compatibility with 1.9.x branch 4396// 2. Improve the module's maintainability by reducing the storage 4397// paths to a single mechanism. 4398// 3. Use the same single mechanism to support "private" and "user" data. 4399// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 4400// 5. Avoid exposing implementation details on user objects (eg. expando properties) 4401// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 4402 4403var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 4404 rmultiDash = /[A-Z]/g; 4405 4406function getData( data ) { 4407 if ( data === "true" ) { 4408 return true; 4409 } 4410 4411 if ( data === "false" ) { 4412 return false; 4413 } 4414 4415 if ( data === "null" ) { 4416 return null; 4417 } 4418 4419 // Only convert to a number if it doesn't change the string 4420 if ( data === +data + "" ) { 4421 return +data; 4422 } 4423 4424 if ( rbrace.test( data ) ) { 4425 return JSON.parse( data ); 4426 } 4427 4428 return data; 4429} 4430 4431function dataAttr( elem, key, data ) { 4432 var name; 4433 4434 // If nothing was found internally, try to fetch any 4435 // data from the HTML5 data-* attribute 4436 if ( data === undefined && elem.nodeType === 1 ) { 4437 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 4438 data = elem.getAttribute( name ); 4439 4440 if ( typeof data === "string" ) { 4441 try { 4442 data = getData( data ); 4443 } catch ( e ) {} 4444 4445 // Make sure we set the data so it isn't changed later 4446 dataUser.set( elem, key, data ); 4447 } else { 4448 data = undefined; 4449 } 4450 } 4451 return data; 4452} 4453 4454jQuery.extend( { 4455 hasData: function( elem ) { 4456 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 4457 }, 4458 4459 data: function( elem, name, data ) { 4460 return dataUser.access( elem, name, data ); 4461 }, 4462 4463 removeData: function( elem, name ) { 4464 dataUser.remove( elem, name ); 4465 }, 4466 4467 // TODO: Now that all calls to _data and _removeData have been replaced 4468 // with direct calls to dataPriv methods, these can be deprecated. 4469 _data: function( elem, name, data ) { 4470 return dataPriv.access( elem, name, data ); 4471 }, 4472 4473 _removeData: function( elem, name ) { 4474 dataPriv.remove( elem, name ); 4475 } 4476} ); 4477 4478jQuery.fn.extend( { 4479 data: function( key, value ) { 4480 var i, name, data, 4481 elem = this[ 0 ], 4482 attrs = elem && elem.attributes; 4483 4484 // Gets all values 4485 if ( key === undefined ) { 4486 if ( this.length ) { 4487 data = dataUser.get( elem ); 4488 4489 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 4490 i = attrs.length; 4491 while ( i-- ) { 4492 4493 // Support: IE 11 only 4494 // The attrs elements can be null (#14894) 4495 if ( attrs[ i ] ) { 4496 name = attrs[ i ].name; 4497 if ( name.indexOf( "data-" ) === 0 ) { 4498 name = camelCase( name.slice( 5 ) ); 4499 dataAttr( elem, name, data[ name ] ); 4500 } 4501 } 4502 } 4503 dataPriv.set( elem, "hasDataAttrs", true ); 4504 } 4505 } 4506 4507 return data; 4508 } 4509 4510 // Sets multiple values 4511 if ( typeof key === "object" ) { 4512 return this.each( function() { 4513 dataUser.set( this, key ); 4514 } ); 4515 } 4516 4517 return access( this, function( value ) { 4518 var data; 4519 4520 // The calling jQuery object (element matches) is not empty 4521 // (and therefore has an element appears at this[ 0 ]) and the 4522 // `value` parameter was not undefined. An empty jQuery object 4523 // will result in `undefined` for elem = this[ 0 ] which will 4524 // throw an exception if an attempt to read a data cache is made. 4525 if ( elem && value === undefined ) { 4526 4527 // Attempt to get data from the cache 4528 // The key will always be camelCased in Data 4529 data = dataUser.get( elem, key ); 4530 if ( data !== undefined ) { 4531 return data; 4532 } 4533 4534 // Attempt to "discover" the data in 4535 // HTML5 custom data-* attrs 4536 data = dataAttr( elem, key ); 4537 if ( data !== undefined ) { 4538 return data; 4539 } 4540 4541 // We tried really hard, but the data doesn't exist. 4542 return; 4543 } 4544 4545 // Set the data... 4546 this.each( function() { 4547 4548 // We always store the camelCased key 4549 dataUser.set( this, key, value ); 4550 } ); 4551 }, null, value, arguments.length > 1, null, true ); 4552 }, 4553 4554 removeData: function( key ) { 4555 return this.each( function() { 4556 dataUser.remove( this, key ); 4557 } ); 4558 } 4559} ); 4560 4561 4562jQuery.extend( { 4563 queue: function( elem, type, data ) { 4564 var queue; 4565 4566 if ( elem ) { 4567 type = ( type || "fx" ) + "queue"; 4568 queue = dataPriv.get( elem, type ); 4569 4570 // Speed up dequeue by getting out quickly if this is just a lookup 4571 if ( data ) { 4572 if ( !queue || Array.isArray( data ) ) { 4573 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 4574 } else { 4575 queue.push( data ); 4576 } 4577 } 4578 return queue || []; 4579 } 4580 }, 4581 4582 dequeue: function( elem, type ) { 4583 type = type || "fx"; 4584 4585 var queue = jQuery.queue( elem, type ), 4586 startLength = queue.length, 4587 fn = queue.shift(), 4588 hooks = jQuery._queueHooks( elem, type ), 4589 next = function() { 4590 jQuery.dequeue( elem, type ); 4591 }; 4592 4593 // If the fx queue is dequeued, always remove the progress sentinel 4594 if ( fn === "inprogress" ) { 4595 fn = queue.shift(); 4596 startLength--; 4597 } 4598 4599 if ( fn ) { 4600 4601 // Add a progress sentinel to prevent the fx queue from being 4602 // automatically dequeued 4603 if ( type === "fx" ) { 4604 queue.unshift( "inprogress" ); 4605 } 4606 4607 // Clear up the last queue stop function 4608 delete hooks.stop; 4609 fn.call( elem, next, hooks ); 4610 } 4611 4612 if ( !startLength && hooks ) { 4613 hooks.empty.fire(); 4614 } 4615 }, 4616 4617 // Not public - generate a queueHooks object, or return the current one 4618 _queueHooks: function( elem, type ) { 4619 var key = type + "queueHooks"; 4620 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 4621 empty: jQuery.Callbacks( "once memory" ).add( function() { 4622 dataPriv.remove( elem, [ type + "queue", key ] ); 4623 } ) 4624 } ); 4625 } 4626} ); 4627 4628jQuery.fn.extend( { 4629 queue: function( type, data ) { 4630 var setter = 2; 4631 4632 if ( typeof type !== "string" ) { 4633 data = type; 4634 type = "fx"; 4635 setter--; 4636 } 4637 4638 if ( arguments.length < setter ) { 4639 return jQuery.queue( this[ 0 ], type ); 4640 } 4641 4642 return data === undefined ? 4643 this : 4644 this.each( function() { 4645 var queue = jQuery.queue( this, type, data ); 4646 4647 // Ensure a hooks for this queue 4648 jQuery._queueHooks( this, type ); 4649 4650 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 4651 jQuery.dequeue( this, type ); 4652 } 4653 } ); 4654 }, 4655 dequeue: function( type ) { 4656 return this.each( function() { 4657 jQuery.dequeue( this, type ); 4658 } ); 4659 }, 4660 clearQueue: function( type ) { 4661 return this.queue( type || "fx", [] ); 4662 }, 4663 4664 // Get a promise resolved when queues of a certain type 4665 // are emptied (fx is the type by default) 4666 promise: function( type, obj ) { 4667 var tmp, 4668 count = 1, 4669 defer = jQuery.Deferred(), 4670 elements = this, 4671 i = this.length, 4672 resolve = function() { 4673 if ( !( --count ) ) { 4674 defer.resolveWith( elements, [ elements ] ); 4675 } 4676 }; 4677 4678 if ( typeof type !== "string" ) { 4679 obj = type; 4680 type = undefined; 4681 } 4682 type = type || "fx"; 4683 4684 while ( i-- ) { 4685 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 4686 if ( tmp && tmp.empty ) { 4687 count++; 4688 tmp.empty.add( resolve ); 4689 } 4690 } 4691 resolve(); 4692 return defer.promise( obj ); 4693 } 4694} ); 4695var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 4696 4697var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 4698 4699 4700var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 4701 4702var
vendor: 5,672 bytes, lines 4702-4917
4702documentElement = document.documentElement; 4703 4704 4705 4706 var isAttached = function( elem ) { 4707 return jQuery.contains( elem.ownerDocument, elem ); 4708 }, 4709 composed = { composed: true }; 4710 4711 // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only 4712 // Check attachment across shadow DOM boundaries when possible (gh-3504) 4713 // Support: iOS 10.0-10.2 only 4714 // Early iOS 10 versions support `attachShadow` but not `getRootNode`, 4715 // leading to errors. We need to check for `getRootNode`. 4716 if ( documentElement.getRootNode ) { 4717 isAttached = function( elem ) { 4718 return jQuery.contains( elem.ownerDocument, elem ) || 4719 elem.getRootNode( composed ) === elem.ownerDocument; 4720 }; 4721 } 4722var isHiddenWithinTree = function( elem, el ) { 4723 4724 // isHiddenWithinTree might be called from jQuery#filter function; 4725 // in that case, element will be second argument 4726 elem = el || elem; 4727 4728 // Inline style trumps all 4729 return elem.style.display === "none" || 4730 elem.style.display === "" && 4731 4732 // Otherwise, check computed style 4733 // Support: Firefox <=43 - 45 4734 // Disconnected elements can have computed display: none, so first confirm that elem is 4735 // in the document. 4736 isAttached( elem ) && 4737 4738 jQuery.css( elem, "display" ) === "none"; 4739 }; 4740 4741 4742 4743function adjustCSS( elem, prop, valueParts, tween ) { 4744 var adjusted, scale, 4745 maxIterations = 20, 4746 currentValue = tween ? 4747 function() { 4748 return tween.cur(); 4749 } : 4750 function() { 4751 return jQuery.css( elem, prop, "" ); 4752 }, 4753 initial = currentValue(), 4754 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 4755 4756 // Starting value computation is required for potential unit mismatches 4757 initialInUnit = elem.nodeType && 4758 ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 4759 rcssNum.exec( jQuery.css( elem, prop ) ); 4760 4761 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 4762 4763 // Support: Firefox <=54 4764 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 4765 initial = initial / 2; 4766 4767 // Trust units reported by jQuery.css 4768 unit = unit || initialInUnit[ 3 ]; 4769 4770 // Iteratively approximate from a nonzero starting point 4771 initialInUnit = +initial || 1; 4772 4773 while ( maxIterations-- ) { 4774 4775 // Evaluate and update our best guess (doubling guesses that zero out). 4776 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 4777 jQuery.style( elem, prop, initialInUnit + unit ); 4778 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 4779 maxIterations = 0; 4780 } 4781 initialInUnit = initialInUnit / scale; 4782 4783 } 4784 4785 initialInUnit = initialInUnit * 2; 4786 jQuery.style( elem, prop, initialInUnit + unit ); 4787 4788 // Make sure we update the tween properties later on 4789 valueParts = valueParts || []; 4790 } 4791 4792 if ( valueParts ) { 4793 initialInUnit = +initialInUnit || +initial || 0; 4794 4795 // Apply relative offset (+=/-=) if specified 4796 adjusted = valueParts[ 1 ] ? 4797 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 4798 +valueParts[ 2 ]; 4799 if ( tween ) { 4800 tween.unit = unit; 4801 tween.start = initialInUnit; 4802 tween.end = adjusted; 4803 } 4804 } 4805 return adjusted; 4806} 4807 4808 4809var defaultDisplayMap = {}; 4810 4811function getDefaultDisplay( elem ) { 4812 var temp, 4813 doc = elem.ownerDocument, 4814 nodeName = elem.nodeName, 4815 display = defaultDisplayMap[ nodeName ]; 4816 4817 if ( display ) { 4818 return display; 4819 } 4820 4821 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 4822 display = jQuery.css( temp, "display" ); 4823 4824 temp.parentNode.removeChild( temp ); 4825 4826 if ( display === "none" ) { 4827 display = "block"; 4828 } 4829 defaultDisplayMap[ nodeName ] = display; 4830 4831 return display; 4832} 4833 4834function showHide( elements, show ) { 4835 var display, elem, 4836 values = [], 4837 index = 0, 4838 length = elements.length; 4839 4840 // Determine new display value for elements that need to change 4841 for ( ; index < length; index++ ) { 4842 elem = elements[ index ]; 4843 if ( !elem.style ) { 4844 continue; 4845 } 4846 4847 display = elem.style.display; 4848 if ( show ) { 4849 4850 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 4851 // check is required in this first loop unless we have a nonempty display value (either 4852 // inline or about-to-be-restored) 4853 if ( display === "none" ) { 4854 values[ index ] = dataPriv.get( elem, "display" ) || null; 4855 if ( !values[ index ] ) { 4856 elem.style.display = ""; 4857 } 4858 } 4859 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 4860 values[ index ] = getDefaultDisplay( elem ); 4861 } 4862 } else { 4863 if ( display !== "none" ) { 4864 values[ index ] = "none"; 4865 4866 // Remember what we're overwriting 4867 dataPriv.set( elem, "display", display ); 4868 } 4869 } 4870 } 4871 4872 // Set the display of the elements in a second loop to avoid constant reflow 4873 for ( index = 0; index < length; index++ ) { 4874 if ( values[ index ] != null ) { 4875 elements[ index ].style.display = values[ index ]; 4876 } 4877 } 4878 4879 return elements; 4880} 4881 4882jQuery.fn.extend( { 4883 show: function() { 4884 return showHide( this, true ); 4885 }, 4886 hide: function() { 4887 return showHide( this ); 4888 }, 4889 toggle: function( state ) { 4890 if ( typeof state === "boolean" ) { 4891 return state ? this.show() : this.hide(); 4892 } 4893 4894 return this.each( function() { 4895 if ( isHiddenWithinTree( this ) ) { 4896 jQuery( this ).show(); 4897 } else { 4898 jQuery( this ).hide(); 4899 } 4900 } ); 4901 } 4902} ); 4903var rcheckableType = ( /^(?:checkbox|radio)$/i ); 4904 4905var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); 4906 4907var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 4908 4909 4910 4911( function() { 4912 var fragment = document.createDocumentFragment(), 4913 div = fragment.appendChild( document.createElement( "div" ) ), 4914 input = document.createElement( "input" ); 4915 4916 // Support: Android 4.0 - 4.3 only 4917 // Check state lost if the name is set (
vendor: 4,735 bytes, lines 4917-5104
4917#11217) 4918 // Support: Windows Web Apps (WWA) 4919 // `name` and `type` must use .setAttribute for WWA (#14901) 4920 input.setAttribute( "type", "radio" ); 4921 input.setAttribute( "checked", "checked" ); 4922 input.setAttribute( "name", "t" ); 4923 4924 div.appendChild( input ); 4925 4926 // Support: Android <=4.1 only 4927 // Older WebKit doesn't clone checked state correctly in fragments 4928 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 4929 4930 // Support: IE <=11 only 4931 // Make sure textarea (and checkbox) defaultValue is properly cloned 4932 div.innerHTML = "<textarea>x</textarea>"; 4933 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 4934 4935 // Support: IE <=9 only 4936 // IE <=9 replaces <option> tags with their contents when inserted outside of 4937 // the select element. 4938 div.innerHTML = "<option></option>"; 4939 support.option = !!div.lastChild; 4940} )(); 4941 4942 4943// We have to close these tags to support XHTML (#13200) 4944var wrapMap = { 4945 4946 // XHTML parsers do not magically insert elements in the 4947 // same way that tag soup parsers do. So we cannot shorten 4948 // this by omitting <tbody> or other required elements. 4949 thead: [ 1, "<table>", "</table>" ], 4950 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 4951 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 4952 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 4953 4954 _default: [ 0, "", "" ] 4955}; 4956 4957wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 4958wrapMap.th = wrapMap.td; 4959 4960// Support: IE <=9 only 4961if ( !support.option ) { 4962 wrapMap.optgroup = wrapMap.option = [ 1, "<select multiple='multiple'>", "</select>" ]; 4963} 4964 4965 4966function getAll( context, tag ) { 4967 4968 // Support: IE <=9 - 11 only 4969 // Use typeof to avoid zero-argument method invocation on host objects (#15151) 4970 var ret; 4971 4972 if ( typeof context.getElementsByTagName !== "undefined" ) { 4973 ret = context.getElementsByTagName( tag || "*" ); 4974 4975 } else if ( typeof context.querySelectorAll !== "undefined" ) { 4976 ret = context.querySelectorAll( tag || "*" ); 4977 4978 } else { 4979 ret = []; 4980 } 4981 4982 if ( tag === undefined || tag && nodeName( context, tag ) ) { 4983 return jQuery.merge( [ context ], ret ); 4984 } 4985 4986 return ret; 4987} 4988 4989 4990// Mark scripts as having already been evaluated 4991function setGlobalEval( elems, refElements ) { 4992 var i = 0, 4993 l = elems.length; 4994 4995 for ( ; i < l; i++ ) { 4996 dataPriv.set( 4997 elems[ i ], 4998 "globalEval", 4999 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 5000 ); 5001 } 5002} 5003 5004 5005var rhtml = /<|&#?\w+;/; 5006 5007function buildFragment( elems, context, scripts, selection, ignored ) { 5008 var elem, tmp, tag, wrap, attached, j, 5009 fragment = context.createDocumentFragment(), 5010 nodes = [], 5011 i = 0, 5012 l = elems.length; 5013 5014 for ( ; i < l; i++ ) { 5015 elem = elems[ i ]; 5016 5017 if ( elem || elem === 0 ) { 5018 5019 // Add nodes directly 5020 if ( toType( elem ) === "object" ) { 5021 5022 // Support: Android <=4.0 only, PhantomJS 1 only 5023 // push.apply(_, arraylike) throws on ancient WebKit 5024 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 5025 5026 // Convert non-html into a text node 5027 } else if ( !rhtml.test( elem ) ) { 5028 nodes.push( context.createTextNode( elem ) ); 5029 5030 // Convert html into DOM nodes 5031 } else { 5032 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 5033 5034 // Deserialize a standard representation 5035 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 5036 wrap = wrapMap[ tag ] || wrapMap._default; 5037 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 5038 5039 // Descend through wrappers to the right content 5040 j = wrap[ 0 ]; 5041 while ( j-- ) { 5042 tmp = tmp.lastChild; 5043 } 5044 5045 // Support: Android <=4.0 only, PhantomJS 1 only 5046 // push.apply(_, arraylike) throws on ancient WebKit 5047 jQuery.merge( nodes, tmp.childNodes ); 5048 5049 // Remember the top-level container 5050 tmp = fragment.firstChild; 5051 5052 // Ensure the created nodes are orphaned (#12392) 5053 tmp.textContent = ""; 5054 } 5055 } 5056 } 5057 5058 // Remove wrapper from fragment 5059 fragment.textContent = ""; 5060 5061 i = 0; 5062 while ( ( elem = nodes[ i++ ] ) ) { 5063 5064 // Skip elements already in the context collection (trac-4087) 5065 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 5066 if ( ignored ) { 5067 ignored.push( elem ); 5068 } 5069 continue; 5070 } 5071 5072 attached = isAttached( elem ); 5073 5074 // Append to fragment 5075 tmp = getAll( fragment.appendChild( elem ), "script" ); 5076 5077 // Preserve script evaluation history 5078 if ( attached ) { 5079 setGlobalEval( tmp ); 5080 } 5081 5082 // Capture executables 5083 if ( scripts ) { 5084 j = 0; 5085 while ( ( elem = tmp[ j++ ] ) ) { 5086 if ( rscriptType.test( elem.type || "" ) ) { 5087 scripts.push( elem ); 5088 } 5089 } 5090 } 5091 } 5092 5093 return fragment; 5094} 5095 5096 5097var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 5098 5099function returnTrue() { 5100 return true; 5101} 5102 5103function returnFalse() { 5104 return false;
5105} 5106 5107// Support: IE <=9 - 11+ 5108// focus() and blur() are asynchronous, except when they are no-op. 5109// So expect focus to be synchronous when the element is already active, 5110// and blur to be synchronous when the element is not already active. 5111// (focus and blur are always synchronous in other supported browsers, 5112// this just defines when we can count on it). 5113function expectSync( elem, type ) { 5114 return ( elem === safeActiveElement() ) === ( type === "focus" ); 5115} 5116 5117// Support: IE <=9 only 5118// Accessing document.activeElement can throw unexpectedly 5119// https://bugs.jquery.com/ticket/13393 5120function safeActiveElement() { 5121 try { 5122 return document.activeElement; 5123 } catch ( err ) { }
vendor: 10,038 bytes, lines 5123-5473
5123 5124} 5125 5126function on( elem, types, selector, data, fn, one ) { 5127 var origFn, type; 5128 5129 // Types can be a map of types/handlers 5130 if ( typeof types === "object" ) { 5131 5132 // ( types-Object, selector, data ) 5133 if ( typeof selector !== "string" ) { 5134 5135 // ( types-Object, data ) 5136 data = data || selector; 5137 selector = undefined; 5138 } 5139 for ( type in types ) { 5140 on( elem, type, selector, data, types[ type ], one ); 5141 } 5142 return elem; 5143 } 5144 5145 if ( data == null && fn == null ) { 5146 5147 // ( types, fn ) 5148 fn = selector; 5149 data = selector = undefined; 5150 } else if ( fn == null ) { 5151 if ( typeof selector === "string" ) { 5152 5153 // ( types, selector, fn ) 5154 fn = data; 5155 data = undefined; 5156 } else { 5157 5158 // ( types, data, fn ) 5159 fn = data; 5160 data = selector; 5161 selector = undefined; 5162 } 5163 } 5164 if ( fn === false ) { 5165 fn = returnFalse; 5166 } else if ( !fn ) { 5167 return elem; 5168 } 5169 5170 if ( one === 1 ) { 5171 origFn = fn; 5172 fn = function( event ) { 5173 5174 // Can use an empty set, since event contains the info 5175 jQuery().off( event ); 5176 return origFn.apply( this, arguments ); 5177 }; 5178 5179 // Use same guid so caller can remove using origFn 5180 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 5181 } 5182 return elem.each( function() { 5183 jQuery.event.add( this, types, fn, data, selector ); 5184 } ); 5185} 5186 5187/* 5188 * Helper functions for managing events -- not part of the public interface. 5189 * Props to Dean Edwards' addEvent library for many of the ideas. 5190 */ 5191jQuery.event = { 5192 5193 global: {}, 5194 5195 add: function( elem, types, handler, data, selector ) { 5196 5197 var handleObjIn, eventHandle, tmp, 5198 events, t, handleObj, 5199 special, handlers, type, namespaces, origType, 5200 elemData = dataPriv.get( elem ); 5201 5202 // Only attach events to objects that accept data 5203 if ( !acceptData( elem ) ) { 5204 return; 5205 } 5206 5207 // Caller can pass in an object of custom data in lieu of the handler 5208 if ( handler.handler ) { 5209 handleObjIn = handler; 5210 handler = handleObjIn.handler; 5211 selector = handleObjIn.selector; 5212 } 5213 5214 // Ensure that invalid selectors throw exceptions at attach time 5215 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 5216 if ( selector ) { 5217 jQuery.find.matchesSelector( documentElement, selector ); 5218 } 5219 5220 // Make sure that the handler has a unique ID, used to find/remove it later 5221 if ( !handler.guid ) { 5222 handler.guid = jQuery.guid++; 5223 } 5224 5225 // Init the element's event structure and main handler, if this is the first 5226 if ( !( events = elemData.events ) ) { 5227 events = elemData.events = Object.create( null ); 5228 } 5229 if ( !( eventHandle = elemData.handle ) ) { 5230 eventHandle = elemData.handle = function( e ) { 5231 5232 // Discard the second event of a jQuery.event.trigger() and 5233 // when an event is called after a page has unloaded 5234 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 5235 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 5236 }; 5237 } 5238 5239 // Handle multiple events separated by a space 5240 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5241 t = types.length; 5242 while ( t-- ) { 5243 tmp = rtypenamespace.exec( types[ t ] ) || []; 5244 type = origType = tmp[ 1 ]; 5245 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5246 5247 // There *must* be a type, no attaching namespace-only handlers 5248 if ( !type ) { 5249 continue; 5250 } 5251 5252 // If event changes its type, use the special event handlers for the changed type 5253 special = jQuery.event.special[ type ] || {}; 5254 5255 // If selector defined, determine special event api type, otherwise given type 5256 type = ( selector ? special.delegateType : special.bindType ) || type; 5257 5258 // Update special based on newly reset type 5259 special = jQuery.event.special[ type ] || {}; 5260 5261 // handleObj is passed to all event handlers 5262 handleObj = jQuery.extend( { 5263 type: type, 5264 origType: origType, 5265 data: data, 5266 handler: handler, 5267 guid: handler.guid, 5268 selector: selector, 5269 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 5270 namespace: namespaces.join( "." ) 5271 }, handleObjIn ); 5272 5273 // Init the event handler queue if we're the first 5274 if ( !( handlers = events[ type ] ) ) { 5275 handlers = events[ type ] = []; 5276 handlers.delegateCount = 0; 5277 5278 // Only use addEventListener if the special events handler returns false 5279 if ( !special.setup || 5280 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 5281 5282 if ( elem.addEventListener ) { 5283 elem.addEventListener( type, eventHandle ); 5284 } 5285 } 5286 } 5287 5288 if ( special.add ) { 5289 special.add.call( elem, handleObj ); 5290 5291 if ( !handleObj.handler.guid ) { 5292 handleObj.handler.guid = handler.guid; 5293 } 5294 } 5295 5296 // Add to the element's handler list, delegates in front 5297 if ( selector ) { 5298 handlers.splice( handlers.delegateCount++, 0, handleObj ); 5299 } else { 5300 handlers.push( handleObj ); 5301 } 5302 5303 // Keep track of which events have ever been used, for event optimization 5304 jQuery.event.global[ type ] = true; 5305 } 5306 5307 }, 5308 5309 // Detach an event or set of events from an element 5310 remove: function( elem, types, handler, selector, mappedTypes ) { 5311 5312 var j, origCount, tmp, 5313 events, t, handleObj, 5314 special, handlers, type, namespaces, origType, 5315 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 5316 5317 if ( !elemData || !( events = elemData.events ) ) { 5318 return; 5319 } 5320 5321 // Once for each type.namespace in types; type may be omitted 5322 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5323 t = types.length; 5324 while ( t-- ) { 5325 tmp = rtypenamespace.exec( types[ t ] ) || []; 5326 type = origType = tmp[ 1 ]; 5327 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5328 5329 // Unbind all events (on this namespace, if provided) for the element 5330 if ( !type ) { 5331 for ( type in events ) { 5332 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 5333 } 5334 continue; 5335 } 5336 5337 special = jQuery.event.special[ type ] || {}; 5338 type = ( selector ? special.delegateType : special.bindType ) || type; 5339 handlers = events[ type ] || []; 5340 tmp = tmp[ 2 ] && 5341 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 5342 5343 // Remove matching events 5344 origCount = j = handlers.length; 5345 while ( j-- ) { 5346 handleObj = handlers[ j ]; 5347 5348 if ( ( mappedTypes || origType === handleObj.origType ) && 5349 ( !handler || handler.guid === handleObj.guid ) && 5350 ( !tmp || tmp.test( handleObj.namespace ) ) && 5351 ( !selector || selector === handleObj.selector || 5352 selector === "**" && handleObj.selector ) ) { 5353 handlers.splice( j, 1 ); 5354 5355 if ( handleObj.selector ) { 5356 handlers.delegateCount--; 5357 } 5358 if ( special.remove ) { 5359 special.remove.call( elem, handleObj ); 5360 } 5361 } 5362 } 5363 5364 // Remove generic event handler if we removed something and no more handlers exist 5365 // (avoids potential for endless recursion during removal of special event handlers) 5366 if ( origCount && !handlers.length ) { 5367 if ( !special.teardown || 5368 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 5369 5370 jQuery.removeEvent( elem, type, elemData.handle ); 5371 } 5372 5373 delete events[ type ]; 5374 } 5375 } 5376 5377 // Remove data and the expando if it's no longer used 5378 if ( jQuery.isEmptyObject( events ) ) { 5379 dataPriv.remove( elem, "handle events" ); 5380 } 5381 }, 5382 5383 dispatch: function( nativeEvent ) { 5384 5385 var i, j, ret, matched, handleObj, handlerQueue, 5386 args = new Array( arguments.length ), 5387 5388 // Make a writable jQuery.Event from the native event object 5389 event = jQuery.event.fix( nativeEvent ), 5390 5391 handlers = ( 5392 dataPriv.get( this, "events" ) || Object.create( null ) 5393 )[ event.type ] || [], 5394 special = jQuery.event.special[ event.type ] || {}; 5395 5396 // Use the fix-ed jQuery.Event rather than the (read-only) native event 5397 args[ 0 ] = event; 5398 5399 for ( i = 1; i < arguments.length; i++ ) { 5400 args[ i ] = arguments[ i ]; 5401 } 5402 5403 event.delegateTarget = this; 5404 5405 // Call the preDispatch hook for the mapped type, and let it bail if desired 5406 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 5407 return; 5408 } 5409 5410 // Determine handlers 5411 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 5412 5413 // Run delegates first; they may want to stop propagation beneath us 5414 i = 0; 5415 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 5416 event.currentTarget = matched.elem; 5417 5418 j = 0; 5419 while ( ( handleObj = matched.handlers[ j++ ] ) && 5420 !event.isImmediatePropagationStopped() ) { 5421 5422 // If the event is namespaced, then each handler is only invoked if it is 5423 // specially universal or its namespaces are a superset of the event's. 5424 if ( !event.rnamespace || handleObj.namespace === false || 5425 event.rnamespace.test( handleObj.namespace ) ) { 5426 5427 event.handleObj = handleObj; 5428 event.data = handleObj.data; 5429 5430 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 5431 handleObj.handler ).apply( matched.elem, args ); 5432 5433 if ( ret !== undefined ) { 5434 if ( ( event.result = ret ) === false ) { 5435 event.preventDefault(); 5436 event.stopPropagation(); 5437 } 5438 } 5439 } 5440 } 5441 } 5442 5443 // Call the postDispatch hook for the mapped type 5444 if ( special.postDispatch ) { 5445 special.postDispatch.call( this, event ); 5446 } 5447 5448 return event.result; 5449 }, 5450 5451 handlers: function( event, handlers ) { 5452 var i, handleObj, sel, matchedHandlers, matchedSelectors, 5453 handlerQueue = [], 5454 delegateCount = handlers.delegateCount, 5455 cur = event.target; 5456 5457 // Find delegate handlers 5458 if ( delegateCount && 5459 5460 // Support: IE <=9 5461 // Black-hole SVG <use> instance trees (trac-13180) 5462 cur.nodeType && 5463 5464 // Support: Firefox <=42 5465 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 5466 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 5467 // Support: IE 11 only 5468 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 5469 !( event.type === "click" && event.button >= 1 ) ) { 5470 5471 for ( ; cur !== this; cur = cur.parentNode || this ) { 5472 5473 // Don't check non-elements (
vendor: 5,172 bytes, lines 5473-5645
5473#13208) 5474 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 5475 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 5476 matchedHandlers = []; 5477 matchedSelectors = {}; 5478 for ( i = 0; i < delegateCount; i++ ) { 5479 handleObj = handlers[ i ]; 5480 5481 // Don't conflict with Object.prototype properties (#13203) 5482 sel = handleObj.selector + " "; 5483 5484 if ( matchedSelectors[ sel ] === undefined ) { 5485 matchedSelectors[ sel ] = handleObj.needsContext ? 5486 jQuery( sel, this ).index( cur ) > -1 : 5487 jQuery.find( sel, this, null, [ cur ] ).length; 5488 } 5489 if ( matchedSelectors[ sel ] ) { 5490 matchedHandlers.push( handleObj ); 5491 } 5492 } 5493 if ( matchedHandlers.length ) { 5494 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 5495 } 5496 } 5497 } 5498 } 5499 5500 // Add the remaining (directly-bound) handlers 5501 cur = this; 5502 if ( delegateCount < handlers.length ) { 5503 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 5504 } 5505 5506 return handlerQueue; 5507 }, 5508 5509 addProp: function( name, hook ) { 5510 Object.defineProperty( jQuery.Event.prototype, name, { 5511 enumerable: true, 5512 configurable: true, 5513 5514 get: isFunction( hook ) ? 5515 function() { 5516 if ( this.originalEvent ) { 5517 return hook( this.originalEvent ); 5518 } 5519 } : 5520 function() { 5521 if ( this.originalEvent ) { 5522 return this.originalEvent[ name ]; 5523 } 5524 }, 5525 5526 set: function( value ) { 5527 Object.defineProperty( this, name, { 5528 enumerable: true, 5529 configurable: true, 5530 writable: true, 5531 value: value 5532 } ); 5533 } 5534 } ); 5535 }, 5536 5537 fix: function( originalEvent ) { 5538 return originalEvent[ jQuery.expando ] ? 5539 originalEvent : 5540 new jQuery.Event( originalEvent ); 5541 }, 5542 5543 special: { 5544 load: { 5545 5546 // Prevent triggered image.load events from bubbling to window.load 5547 noBubble: true 5548 }, 5549 click: { 5550 5551 // Utilize native event to ensure correct state for checkable inputs 5552 setup: function( data ) { 5553 5554 // For mutual compressibility with _default, replace `this` access with a local var. 5555 // `|| data` is dead code meant only to preserve the variable through minification. 5556 var el = this || data; 5557 5558 // Claim the first handler 5559 if ( rcheckableType.test( el.type ) && 5560 el.click && nodeName( el, "input" ) ) { 5561 5562 // dataPriv.set( el, "click", ... ) 5563 leverageNative( el, "click", returnTrue ); 5564 } 5565 5566 // Return false to allow normal processing in the caller 5567 return false; 5568 }, 5569 trigger: function( data ) { 5570 5571 // For mutual compressibility with _default, replace `this` access with a local var. 5572 // `|| data` is dead code meant only to preserve the variable through minification. 5573 var el = this || data; 5574 5575 // Force setup before triggering a click 5576 if ( rcheckableType.test( el.type ) && 5577 el.click && nodeName( el, "input" ) ) { 5578 5579 leverageNative( el, "click" ); 5580 } 5581 5582 // Return non-false to allow normal event-path propagation 5583 return true; 5584 }, 5585 5586 // For cross-browser consistency, suppress native .click() on links 5587 // Also prevent it if we're currently inside a leveraged native-event stack 5588 _default: function( event ) { 5589 var target = event.target; 5590 return rcheckableType.test( target.type ) && 5591 target.click && nodeName( target, "input" ) && 5592 dataPriv.get( target, "click" ) || 5593 nodeName( target, "a" ); 5594 } 5595 }, 5596 5597 beforeunload: { 5598 postDispatch: function( event ) { 5599 5600 // Support: Firefox 20+ 5601 // Firefox doesn't alert if the returnValue field is not set. 5602 if ( event.result !== undefined && event.originalEvent ) { 5603 event.originalEvent.returnValue = event.result; 5604 } 5605 } 5606 } 5607 } 5608}; 5609 5610// Ensure the presence of an event listener that handles manually-triggered 5611// synthetic events by interrupting progress until reinvoked in response to 5612// *native* events that it fires directly, ensuring that state changes have 5613// already occurred before other listeners are invoked. 5614function leverageNative( el, type, expectSync ) { 5615 5616 // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add 5617 if ( !expectSync ) { 5618 if ( dataPriv.get( el, type ) === undefined ) { 5619 jQuery.event.add( el, type, returnTrue ); 5620 } 5621 return; 5622 } 5623 5624 // Register the controller as a special universal handler for all event namespaces 5625 dataPriv.set( el, type, false ); 5626 jQuery.event.add( el, type, { 5627 namespace: false, 5628 handler: function( event ) { 5629 var notAsync, result, 5630 saved = dataPriv.get( this, type ); 5631 5632 if ( ( event.isTrigger & 1 ) && this[ type ] ) { 5633 5634 // Interrupt processing of the outer synthetic .trigger()ed event 5635 // Saved data should be false in such cases, but might be a leftover capture object 5636 // from an async native handler (gh-4350) 5637 if ( !saved.length ) { 5638 5639 // Store arguments for use when handling the inner native event 5640 // There will always be at least one argument (an event object), so this array 5641 // will not be confused with a leftover capture object. 5642 saved = slice.call( arguments ); 5643 dataPriv.set( this, type, saved ); 5644 5645 // Trigger the native event and capture its result
5646 // Support: IE <=9 - 11+ 5647 // focus() and blur() are asynchronous 5648 notAsync = expectSync( this, type ); 5649 this[ type ](); 5650 result = dataPriv.get( this, type ); 5651 if ( saved !== result || notAsync ) { 5652 dataPriv.set( this, type, false ); 5653 } else { 5654 result = {}; 5655 } 5656 if ( saved !== result ) { 5657 5658 // Cancel the outer synthetic event 5659 event.stopImmediatePropagation(); 5660 event.preventDefault(); 5661 5662 // Support: Chrome 86+ 5663 // In Chrome, if an element having a focusout handler is blurred by 5664 // clicking outside of it, it invokes the handler synchronously. If 5665 // that handler calls `.remove()` on the element, the data is cleared, 5666 // leaving `result` undefined. We need to guard against this. 5667 return result && result.value; 5668 } 5669 5670 // If this is an inner synthetic event for an event with a bubbling surrogate 5671 // (focus or blur), assume that the surrogate already propagated from triggering the 5672 // native event and prevent that from happening again here. 5673 // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the 5674 // bubbling surrogate propagates *after* the non-bubbling base), but that seems 5675 // less bad than duplication. 5676 } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { 5677 event.stopPropagation(); 5678 } 5679 5680 // If this is a native event triggered above, everything is now in order 5681 // Fire an inner synthetic event with the original arguments 5682 } else if ( saved.length ) { 5683 5684 // ...and capture the result 5685 dataPriv.set( this, type, { 5686 value: jQuery.event.trigger( 5687 5688 // Support: IE <=9 - 11+ 5689 // Extend with the prototype to reset the above stopImmediatePropagation() 5690 jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), 5691 saved.slice( 1 ), 5692 this 5693 ) 5694 } ); 5695 5696 // Abort handling of the native event 5697 event.stopImmediatePropagation(); 5698 } 5699 } 5700 } ); 5701} 5702 5703jQuery.removeEvent = function( elem, type, handle ) { 5704 5705 // This "if" is needed for plain objects 5706 if ( elem.removeEventListener ) { 5707 elem.removeEventListener( type, handle ); 5708 } 5709}; 5710 5711jQuery.Event = function( src, props ) { 5712 5713 // Allow instantiation without the 'new' keyword 5714 if ( !( this instanceof jQuery.Event ) ) { 5715 return new jQuery.Event( src, props ); 5716 } 5717 5718 // Event object 5719 if ( src && src.type ) { 5720 this.originalEvent = src; 5721 this.type = src.type; 5722 5723 // Events bubbling up the document may have been marked as prevented 5724 // by a handler lower down the tree; reflect the correct value. 5725 this.isDefaultPrevented = src.defaultPrevented || 5726 src.defaultPrevented === undefined && 5727 5728 // Support: Android <=2.3 only 5729 src.returnValue === false ? 5730 returnTrue : 5731 returnFalse; 5732 5733 // Create target properties 5734 // Support: Safari <=6 - 7 only 5735 // Target should not be a text node (#504, #13143) 5736 this.target = ( src.target && src.target.nodeType === 3 ) ? 5737 src.target.parentNode : 5738 src.target; 5739 5740 this.currentTarget = src.currentTarget; 5741 this.relatedTarget = src.relatedTarget; 5742 5743 // Event type 5744 } else { 5745 this.type = src; 5746 } 5747 5748 // Put explicitly provided properties onto the event object 5749 if ( props ) { 5750 jQuery.extend( this, props ); 5751 } 5752 5753 // Create a timestamp if incoming event doesn't have one 5754 this.timeStamp = src && src.timeStamp || Date.now(); 5755 5756 // Mark it as fixed 5757 this[ jQuery.expando ] = true; 5758}; 5759 5760// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 5761// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 5762jQuery.Event.prototype = { 5763 constructor: jQuery.Event, 5764 isDefaultPrevented: returnFalse, 5765 isPropagationStopped: returnFalse, 5766 isImmediatePropagationStopped: returnFalse, 5767 isSimulated: false, 5768 5769 preventDefault: function() { 5770 var e = this.originalEvent; 5771 5772 this.isDefaultPrevented = returnTrue; 5773 5774 if ( e && !this.isSimulated ) { 5775 e.preventDefault(); 5776 } 5777 }, 5778 stopPropagation: function() { 5779 var e = this.originalEvent; 5780 5781 this.isPropagationStopped = returnTrue; 5782 5783 if ( e && !this.isSimulated ) { 5784 e.stopPropagation(); 5785 } 5786 }, 5787 stopImmediatePropagation: function() { 5788 var e = this.originalEvent; 5789 5790 this.isImmediatePropagationStopped = returnTrue; 5791 5792 if ( e && !this.isSimulated ) { 5793 e.stopImmediatePropagation(); 5794 } 5795 5796 this.stopPropagation(); 5797 } 5798}; 5799 5800// Includes all common event props including KeyEvent and MouseEvent specific props 5801jQuery.each( { 5802 altKey: true, 5803 bubbles: true, 5804 cancelable: true, 5805 changedTouches: true, 5806 ctrlKey: true, 5807 detail: true, 5808 eventPhase: true, 5809 metaKey: true, 5810 pageX: true, 5811 pageY: true, 5812 shiftKey: true, 5813 view: true, 5814 "char": true, 5815 code: true, 5816 charCode: true, 5817 key: true, 5818 keyCode: true, 5819 button: true, 5820 buttons: true, 5821 clientX: true, 5822 clientY: true, 5823 offsetX: true, 5824 offsetY: true, 5825 pointerId: true, 5826 pointerType: true, 5827 screenX: true, 5828 screenY: true, 5829 targetTouches: true, 5830 toElement: true, 5831 touches: true, 5832 which: true 5833}, jQuery.event.addProp ); 5834 5835jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { 5836 jQuery.event.special[ type ] = { 5837 5838 // Utilize native event if possible so blur/focus sequence is correct 5839 setup: function() { 5840 5841 // Claim the first handler 5842 // dataPriv.set( this, "focus", ... ) 5843 // dataPriv.set( this, "blur", ... ) 5844 leverageNative( this, type, expectSync ); 5845 5846 // Return false to allow normal processing in the caller 5847 return false;
vendor: 8,358 bytes, lines 5848-6161
5848 }, 5849 trigger: function() { 5850 5851 // Force setup before trigger 5852 leverageNative( this, type ); 5853 5854 // Return non-false to allow normal event-path propagation 5855 return true; 5856 }, 5857 5858 // Suppress native focus or blur as it's already being fired 5859 // in leverageNative. 5860 _default: function() { 5861 return true; 5862 }, 5863 5864 delegateType: delegateType 5865 }; 5866} ); 5867 5868// Create mouseenter/leave events using mouseover/out and event-time checks 5869// so that event delegation works in jQuery. 5870// Do the same for pointerenter/pointerleave and pointerover/pointerout 5871// 5872// Support: Safari 7 only 5873// Safari sends mouseenter too often; see: 5874// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 5875// for the description of the bug (it existed in older Chrome versions as well). 5876jQuery.each( { 5877 mouseenter: "mouseover", 5878 mouseleave: "mouseout", 5879 pointerenter: "pointerover", 5880 pointerleave: "pointerout" 5881}, function( orig, fix ) { 5882 jQuery.event.special[ orig ] = { 5883 delegateType: fix, 5884 bindType: fix, 5885 5886 handle: function( event ) { 5887 var ret, 5888 target = this, 5889 related = event.relatedTarget, 5890 handleObj = event.handleObj; 5891 5892 // For mouseenter/leave call the handler if related is outside the target. 5893 // NB: No relatedTarget if the mouse left/entered the browser window 5894 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 5895 event.type = handleObj.origType; 5896 ret = handleObj.handler.apply( this, arguments ); 5897 event.type = fix; 5898 } 5899 return ret; 5900 } 5901 }; 5902} ); 5903 5904jQuery.fn.extend( { 5905 5906 on: function( types, selector, data, fn ) { 5907 return on( this, types, selector, data, fn ); 5908 }, 5909 one: function( types, selector, data, fn ) { 5910 return on( this, types, selector, data, fn, 1 ); 5911 }, 5912 off: function( types, selector, fn ) { 5913 var handleObj, type; 5914 if ( types && types.preventDefault && types.handleObj ) { 5915 5916 // ( event ) dispatched jQuery.Event 5917 handleObj = types.handleObj; 5918 jQuery( types.delegateTarget ).off( 5919 handleObj.namespace ? 5920 handleObj.origType + "." + handleObj.namespace : 5921 handleObj.origType, 5922 handleObj.selector, 5923 handleObj.handler 5924 ); 5925 return this; 5926 } 5927 if ( typeof types === "object" ) { 5928 5929 // ( types-object [, selector] ) 5930 for ( type in types ) { 5931 this.off( type, selector, types[ type ] ); 5932 } 5933 return this; 5934 } 5935 if ( selector === false || typeof selector === "function" ) { 5936 5937 // ( types [, fn] ) 5938 fn = selector; 5939 selector = undefined; 5940 } 5941 if ( fn === false ) { 5942 fn = returnFalse; 5943 } 5944 return this.each( function() { 5945 jQuery.event.remove( this, types, fn, selector ); 5946 } ); 5947 } 5948} ); 5949 5950 5951var 5952 5953 // Support: IE <=10 - 11, Edge 12 - 13 only 5954 // In IE/Edge using regex groups here causes severe slowdowns. 5955 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 5956 rnoInnerhtml = /<script|<style|<link/i, 5957 5958 // checked="checked" or checked 5959 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5960 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; 5961 5962// Prefer a tbody over its parent table for containing new rows 5963function manipulationTarget( elem, content ) { 5964 if ( nodeName( elem, "table" ) && 5965 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 5966 5967 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 5968 } 5969 5970 return elem; 5971} 5972 5973// Replace/restore the type attribute of script elements for safe DOM manipulation 5974function disableScript( elem ) { 5975 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 5976 return elem; 5977} 5978function restoreScript( elem ) { 5979 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 5980 elem.type = elem.type.slice( 5 ); 5981 } else { 5982 elem.removeAttribute( "type" ); 5983 } 5984 5985 return elem; 5986} 5987 5988function cloneCopyEvent( src, dest ) { 5989 var i, l, type, pdataOld, udataOld, udataCur, events; 5990 5991 if ( dest.nodeType !== 1 ) { 5992 return; 5993 } 5994 5995 // 1. Copy private data: events, handlers, etc. 5996 if ( dataPriv.hasData( src ) ) { 5997 pdataOld = dataPriv.get( src ); 5998 events = pdataOld.events; 5999 6000 if ( events ) { 6001 dataPriv.remove( dest, "handle events" ); 6002 6003 for ( type in events ) { 6004 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 6005 jQuery.event.add( dest, type, events[ type ][ i ] ); 6006 } 6007 } 6008 } 6009 } 6010 6011 // 2. Copy user data 6012 if ( dataUser.hasData( src ) ) { 6013 udataOld = dataUser.access( src ); 6014 udataCur = jQuery.extend( {}, udataOld ); 6015 6016 dataUser.set( dest, udataCur ); 6017 } 6018} 6019 6020// Fix IE bugs, see support tests 6021function fixInput( src, dest ) { 6022 var nodeName = dest.nodeName.toLowerCase(); 6023 6024 // Fails to persist the checked state of a cloned checkbox or radio button. 6025 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 6026 dest.checked = src.checked; 6027 6028 // Fails to return the selected option to the default selected state when cloning options 6029 } else if ( nodeName === "input" || nodeName === "textarea" ) { 6030 dest.defaultValue = src.defaultValue; 6031 } 6032} 6033 6034function domManip( collection, args, callback, ignored ) { 6035 6036 // Flatten any nested arrays 6037 args = flat( args ); 6038 6039 var fragment, first, scripts, hasScripts, node, doc, 6040 i = 0, 6041 l = collection.length, 6042 iNoClone = l - 1, 6043 value = args[ 0 ], 6044 valueIsFunction = isFunction( value ); 6045 6046 // We can't cloneNode fragments that contain checked, in WebKit 6047 if ( valueIsFunction || 6048 ( l > 1 && typeof value === "string" && 6049 !support.checkClone && rchecked.test( value ) ) ) { 6050 return collection.each( function( index ) { 6051 var self = collection.eq( index ); 6052 if ( valueIsFunction ) { 6053 args[ 0 ] = value.call( this, index, self.html() ); 6054 } 6055 domManip( self, args, callback, ignored ); 6056 } ); 6057 } 6058 6059 if ( l ) { 6060 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 6061 first = fragment.firstChild; 6062 6063 if ( fragment.childNodes.length === 1 ) { 6064 fragment = first; 6065 } 6066 6067 // Require either new content or an interest in ignored elements to invoke the callback 6068 if ( first || ignored ) { 6069 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 6070 hasScripts = scripts.length; 6071 6072 // Use the original fragment for the last item 6073 // instead of the first because it can end up 6074 // being emptied incorrectly in certain situations (#8070). 6075 for ( ; i < l; i++ ) { 6076 node = fragment; 6077 6078 if ( i !== iNoClone ) { 6079 node = jQuery.clone( node, true, true ); 6080 6081 // Keep references to cloned scripts for later restoration 6082 if ( hasScripts ) { 6083 6084 // Support: Android <=4.0 only, PhantomJS 1 only 6085 // push.apply(_, arraylike) throws on ancient WebKit 6086 jQuery.merge( scripts, getAll( node, "script" ) ); 6087 } 6088 } 6089 6090 callback.call( collection[ i ], node, i ); 6091 } 6092 6093 if ( hasScripts ) { 6094 doc = scripts[ scripts.length - 1 ].ownerDocument; 6095 6096 // Reenable scripts 6097 jQuery.map( scripts, restoreScript ); 6098 6099 // Evaluate executable scripts on first document insertion 6100 for ( i = 0; i < hasScripts; i++ ) { 6101 node = scripts[ i ]; 6102 if ( rscriptType.test( node.type || "" ) && 6103 !dataPriv.access( node, "globalEval" ) && 6104 jQuery.contains( doc, node ) ) { 6105 6106 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 6107 6108 // Optional AJAX dependency, but won't run scripts if not present 6109 if ( jQuery._evalUrl && !node.noModule ) { 6110 jQuery._evalUrl( node.src, { 6111 nonce: node.nonce || node.getAttribute( "nonce" ) 6112 }, doc ); 6113 } 6114 } else { 6115 DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); 6116 } 6117 } 6118 } 6119 } 6120 } 6121 } 6122 6123 return collection; 6124} 6125 6126function remove( elem, selector, keepData ) { 6127 var node, 6128 nodes = selector ? jQuery.filter( selector, elem ) : elem, 6129 i = 0; 6130 6131 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 6132 if ( !keepData && node.nodeType === 1 ) { 6133 jQuery.cleanData( getAll( node ) ); 6134 } 6135 6136 if ( node.parentNode ) { 6137 if ( keepData && isAttached( node ) ) { 6138 setGlobalEval( getAll( node, "script" ) ); 6139 } 6140 node.parentNode.removeChild( node ); 6141 } 6142 } 6143 6144 return elem; 6145} 6146 6147jQuery.extend( { 6148 htmlPrefilter: function( html ) { 6149 return html; 6150 }, 6151 6152 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 6153 var i, l, srcElements, destElements, 6154 clone = elem.cloneNode( true ), 6155 inPage = isAttached( elem ); 6156 6157 // Fix IE cloning issues 6158 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 6159 !jQuery.isXMLDoc( elem ) ) { 6160 6161 // We eschew Sizzle here for performance reasons:
vendor: 5,848 bytes, lines 6161-6397
6161 https://jsperf.com/getall-vs-sizzle/2 6162 destElements = getAll( clone ); 6163 srcElements = getAll( elem ); 6164 6165 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6166 fixInput( srcElements[ i ], destElements[ i ] ); 6167 } 6168 } 6169 6170 // Copy the events from the original to the clone 6171 if ( dataAndEvents ) { 6172 if ( deepDataAndEvents ) { 6173 srcElements = srcElements || getAll( elem ); 6174 destElements = destElements || getAll( clone ); 6175 6176 for ( i = 0, l = srcElements.length; i < l; i++ ) { 6177 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 6178 } 6179 } else { 6180 cloneCopyEvent( elem, clone ); 6181 } 6182 } 6183 6184 // Preserve script evaluation history 6185 destElements = getAll( clone, "script" ); 6186 if ( destElements.length > 0 ) { 6187 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 6188 } 6189 6190 // Return the cloned set 6191 return clone; 6192 }, 6193 6194 cleanData: function( elems ) { 6195 var data, elem, type, 6196 special = jQuery.event.special, 6197 i = 0; 6198 6199 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 6200 if ( acceptData( elem ) ) { 6201 if ( ( data = elem[ dataPriv.expando ] ) ) { 6202 if ( data.events ) { 6203 for ( type in data.events ) { 6204 if ( special[ type ] ) { 6205 jQuery.event.remove( elem, type ); 6206 6207 // This is a shortcut to avoid jQuery.event.remove's overhead 6208 } else { 6209 jQuery.removeEvent( elem, type, data.handle ); 6210 } 6211 } 6212 } 6213 6214 // Support: Chrome <=35 - 45+ 6215 // Assign undefined instead of using delete, see Data#remove 6216 elem[ dataPriv.expando ] = undefined; 6217 } 6218 if ( elem[ dataUser.expando ] ) { 6219 6220 // Support: Chrome <=35 - 45+ 6221 // Assign undefined instead of using delete, see Data#remove 6222 elem[ dataUser.expando ] = undefined; 6223 } 6224 } 6225 } 6226 } 6227} ); 6228 6229jQuery.fn.extend( { 6230 detach: function( selector ) { 6231 return remove( this, selector, true ); 6232 }, 6233 6234 remove: function( selector ) { 6235 return remove( this, selector ); 6236 }, 6237 6238 text: function( value ) { 6239 return access( this, function( value ) { 6240 return value === undefined ? 6241 jQuery.text( this ) : 6242 this.empty().each( function() { 6243 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6244 this.textContent = value; 6245 } 6246 } ); 6247 }, null, value, arguments.length ); 6248 }, 6249 6250 append: function() { 6251 return domManip( this, arguments, function( elem ) { 6252 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6253 var target = manipulationTarget( this, elem ); 6254 target.appendChild( elem ); 6255 } 6256 } ); 6257 }, 6258 6259 prepend: function() { 6260 return domManip( this, arguments, function( elem ) { 6261 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 6262 var target = manipulationTarget( this, elem ); 6263 target.insertBefore( elem, target.firstChild ); 6264 } 6265 } ); 6266 }, 6267 6268 before: function() { 6269 return domManip( this, arguments, function( elem ) { 6270 if ( this.parentNode ) { 6271 this.parentNode.insertBefore( elem, this ); 6272 } 6273 } ); 6274 }, 6275 6276 after: function() { 6277 return domManip( this, arguments, function( elem ) { 6278 if ( this.parentNode ) { 6279 this.parentNode.insertBefore( elem, this.nextSibling ); 6280 } 6281 } ); 6282 }, 6283 6284 empty: function() { 6285 var elem, 6286 i = 0; 6287 6288 for ( ; ( elem = this[ i ] ) != null; i++ ) { 6289 if ( elem.nodeType === 1 ) { 6290 6291 // Prevent memory leaks 6292 jQuery.cleanData( getAll( elem, false ) ); 6293 6294 // Remove any remaining nodes 6295 elem.textContent = ""; 6296 } 6297 } 6298 6299 return this; 6300 }, 6301 6302 clone: function( dataAndEvents, deepDataAndEvents ) { 6303 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 6304 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 6305 6306 return this.map( function() { 6307 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 6308 } ); 6309 }, 6310 6311 html: function( value ) { 6312 return access( this, function( value ) { 6313 var elem = this[ 0 ] || {}, 6314 i = 0, 6315 l = this.length; 6316 6317 if ( value === undefined && elem.nodeType === 1 ) { 6318 return elem.innerHTML; 6319 } 6320 6321 // See if we can take a shortcut and just use innerHTML 6322 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 6323 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 6324 6325 value = jQuery.htmlPrefilter( value ); 6326 6327 try { 6328 for ( ; i < l; i++ ) { 6329 elem = this[ i ] || {}; 6330 6331 // Remove element nodes and prevent memory leaks 6332 if ( elem.nodeType === 1 ) { 6333 jQuery.cleanData( getAll( elem, false ) ); 6334 elem.innerHTML = value; 6335 } 6336 } 6337 6338 elem = 0; 6339 6340 // If using innerHTML throws an exception, use the fallback method 6341 } catch ( e ) {} 6342 } 6343 6344 if ( elem ) { 6345 this.empty().append( value ); 6346 } 6347 }, null, value, arguments.length ); 6348 }, 6349 6350 replaceWith: function() { 6351 var ignored = []; 6352 6353 // Make the changes, replacing each non-ignored context element with the new content 6354 return domManip( this, arguments, function( elem ) { 6355 var parent = this.parentNode; 6356 6357 if ( jQuery.inArray( this, ignored ) < 0 ) { 6358 jQuery.cleanData( getAll( this ) ); 6359 if ( parent ) { 6360 parent.replaceChild( elem, this ); 6361 } 6362 } 6363 6364 // Force callback invocation 6365 }, ignored ); 6366 } 6367} ); 6368 6369jQuery.each( { 6370 appendTo: "append", 6371 prependTo: "prepend", 6372 insertBefore: "before", 6373 insertAfter: "after", 6374 replaceAll: "replaceWith" 6375}, function( name, original ) { 6376 jQuery.fn[ name ] = function( selector ) { 6377 var elems, 6378 ret = [], 6379 insert = jQuery( selector ), 6380 last = insert.length - 1, 6381 i = 0; 6382 6383 for ( ; i <= last; i++ ) { 6384 elems = i === last ? this : this.clone( true ); 6385 jQuery( insert[ i ] )[ original ]( elems ); 6386 6387 // Support: Android <=4.0 only, PhantomJS 1 only 6388 // .get() because push.apply(_, arraylike) throws on ancient WebKit 6389 push.apply( ret, elems.get() ); 6390 } 6391 6392 return this.pushStack( ret ); 6393 }; 6394} ); 6395var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 6396 6397var
vendor: 15,567 bytes, lines 6397-6933
6397getStyles = function( elem ) { 6398 6399 // Support: IE <=11 only, Firefox <=30 (#15098, #14150) 6400 // IE throws on elements created in popups 6401 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 6402 var view = elem.ownerDocument.defaultView; 6403 6404 if ( !view || !view.opener ) { 6405 view = window; 6406 } 6407 6408 return view.getComputedStyle( elem ); 6409 }; 6410 6411var swap = function( elem, options, callback ) { 6412 var ret, name, 6413 old = {}; 6414 6415 // Remember the old values, and insert the new ones 6416 for ( name in options ) { 6417 old[ name ] = elem.style[ name ]; 6418 elem.style[ name ] = options[ name ]; 6419 } 6420 6421 ret = callback.call( elem ); 6422 6423 // Revert the old values 6424 for ( name in options ) { 6425 elem.style[ name ] = old[ name ]; 6426 } 6427 6428 return ret; 6429}; 6430 6431 6432var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 6433 6434 6435 6436( function() { 6437 6438 // Executing both pixelPosition & boxSizingReliable tests require only one layout 6439 // so they're executed at the same time to save the second computation. 6440 function computeStyleTests() { 6441 6442 // This is a singleton, we need to execute it only once 6443 if ( !div ) { 6444 return; 6445 } 6446 6447 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + 6448 "margin-top:1px;padding:0;border:0"; 6449 div.style.cssText = 6450 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 6451 "margin:auto;border:1px;padding:1px;" + 6452 "width:60%;top:1%"; 6453 documentElement.appendChild( container ).appendChild( div ); 6454 6455 var divStyle = window.getComputedStyle( div ); 6456 pixelPositionVal = divStyle.top !== "1%"; 6457 6458 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 6459 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 6460 6461 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 6462 // Some styles come back with percentage values, even though they shouldn't 6463 div.style.right = "60%"; 6464 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 6465 6466 // Support: IE 9 - 11 only 6467 // Detect misreporting of content dimensions for box-sizing:border-box elements 6468 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 6469 6470 // Support: IE 9 only 6471 // Detect overflow:scroll screwiness (gh-3699) 6472 // Support: Chrome <=64 6473 // Don't get tricked when zoom affects offsetWidth (gh-4029) 6474 div.style.position = "absolute"; 6475 scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; 6476 6477 documentElement.removeChild( container ); 6478 6479 // Nullify the div so it wouldn't be stored in the memory and 6480 // it will also be a sign that checks already performed 6481 div = null; 6482 } 6483 6484 function roundPixelMeasures( measure ) { 6485 return Math.round( parseFloat( measure ) ); 6486 } 6487 6488 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 6489 reliableTrDimensionsVal, reliableMarginLeftVal, 6490 container = document.createElement( "div" ), 6491 div = document.createElement( "div" ); 6492 6493 // Finish early in limited (non-browser) environments 6494 if ( !div.style ) { 6495 return; 6496 } 6497 6498 // Support: IE <=9 - 11 only 6499 // Style of cloned element affects source element cloned (#8908) 6500 div.style.backgroundClip = "content-box"; 6501 div.cloneNode( true ).style.backgroundClip = ""; 6502 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 6503 6504 jQuery.extend( support, { 6505 boxSizingReliable: function() { 6506 computeStyleTests(); 6507 return boxSizingReliableVal; 6508 }, 6509 pixelBoxStyles: function() { 6510 computeStyleTests(); 6511 return pixelBoxStylesVal; 6512 }, 6513 pixelPosition: function() { 6514 computeStyleTests(); 6515 return pixelPositionVal; 6516 }, 6517 reliableMarginLeft: function() { 6518 computeStyleTests(); 6519 return reliableMarginLeftVal; 6520 }, 6521 scrollboxSize: function() { 6522 computeStyleTests(); 6523 return scrollboxSizeVal; 6524 }, 6525 6526 // Support: IE 9 - 11+, Edge 15 - 18+ 6527 // IE/Edge misreport `getComputedStyle` of table rows with width/height 6528 // set in CSS while `offset*` properties report correct values. 6529 // Behavior in IE 9 is more subtle than in newer versions & it passes 6530 // some versions of this test; make sure not to make it pass there! 6531 // 6532 // Support: Firefox 70+ 6533 // Only Firefox includes border widths 6534 // in computed dimensions. (gh-4529) 6535 reliableTrDimensions: function() { 6536 var table, tr, trChild, trStyle; 6537 if ( reliableTrDimensionsVal == null ) { 6538 table = document.createElement( "table" ); 6539 tr = document.createElement( "tr" ); 6540 trChild = document.createElement( "div" ); 6541 6542 table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; 6543 tr.style.cssText = "border:1px solid"; 6544 6545 // Support: Chrome 86+ 6546 // Height set through cssText does not get applied. 6547 // Computed height then comes back as 0. 6548 tr.style.height = "1px"; 6549 trChild.style.height = "9px"; 6550 6551 // Support: Android 8 Chrome 86+ 6552 // In our bodyBackground.html iframe, 6553 // display for all div elements is set to "inline", 6554 // which causes a problem only in Android 8 Chrome 86. 6555 // Ensuring the div is display: block 6556 // gets around this issue. 6557 trChild.style.display = "block"; 6558 6559 documentElement 6560 .appendChild( table ) 6561 .appendChild( tr ) 6562 .appendChild( trChild ); 6563 6564 trStyle = window.getComputedStyle( tr ); 6565 reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + 6566 parseInt( trStyle.borderTopWidth, 10 ) + 6567 parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; 6568 6569 documentElement.removeChild( table ); 6570 } 6571 return reliableTrDimensionsVal; 6572 } 6573 } ); 6574} )(); 6575 6576 6577function curCSS( elem, name, computed ) { 6578 var width, minWidth, maxWidth, ret, 6579 6580 // Support: Firefox 51+ 6581 // Retrieving style before computed somehow 6582 // fixes an issue with getting wrong values 6583 // on detached elements 6584 style = elem.style; 6585 6586 computed = computed || getStyles( elem ); 6587 6588 // getPropertyValue is needed for: 6589 // .css('filter') (IE 9 only, #12537) 6590 // .css('--customProperty) (#3144) 6591 if ( computed ) { 6592 ret = computed.getPropertyValue( name ) || computed[ name ]; 6593 6594 if ( ret === "" && !isAttached( elem ) ) { 6595 ret = jQuery.style( elem, name ); 6596 } 6597 6598 // A tribute to the "awesome hack by Dean Edwards" 6599 // Android Browser returns percentage for some values, 6600 // but width seems to be reliably pixels. 6601 // This is against the CSSOM draft spec: 6602 // https://drafts.csswg.org/cssom/#resolved-values 6603 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 6604 6605 // Remember the original values 6606 width = style.width; 6607 minWidth = style.minWidth; 6608 maxWidth = style.maxWidth; 6609 6610 // Put in the new values to get a computed value out 6611 style.minWidth = style.maxWidth = style.width = ret; 6612 ret = computed.width; 6613 6614 // Revert the changed values 6615 style.width = width; 6616 style.minWidth = minWidth; 6617 style.maxWidth = maxWidth; 6618 } 6619 } 6620 6621 return ret !== undefined ? 6622 6623 // Support: IE <=9 - 11 only 6624 // IE returns zIndex value as an integer. 6625 ret + "" : 6626 ret; 6627} 6628 6629 6630function addGetHookIf( conditionFn, hookFn ) { 6631 6632 // Define the hook, we'll check on the first run if it's really needed. 6633 return { 6634 get: function() { 6635 if ( conditionFn() ) { 6636 6637 // Hook not needed (or it's not possible to use it due 6638 // to missing dependency), remove it. 6639 delete this.get; 6640 return; 6641 } 6642 6643 // Hook needed; redefine it so that the support test is not executed again. 6644 return ( this.get = hookFn ).apply( this, arguments ); 6645 } 6646 }; 6647} 6648 6649 6650var cssPrefixes = [ "Webkit", "Moz", "ms" ], 6651 emptyStyle = document.createElement( "div" ).style, 6652 vendorProps = {}; 6653 6654// Return a vendor-prefixed property or undefined 6655function vendorPropName( name ) { 6656 6657 // Check for vendor prefixed names 6658 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 6659 i = cssPrefixes.length; 6660 6661 while ( i-- ) { 6662 name = cssPrefixes[ i ] + capName; 6663 if ( name in emptyStyle ) { 6664 return name; 6665 } 6666 } 6667} 6668 6669// Return a potentially-mapped jQuery.cssProps or vendor prefixed property 6670function finalPropName( name ) { 6671 var final = jQuery.cssProps[ name ] || vendorProps[ name ]; 6672 6673 if ( final ) { 6674 return final; 6675 } 6676 if ( name in emptyStyle ) { 6677 return name; 6678 } 6679 return vendorProps[ name ] = vendorPropName( name ) || name; 6680} 6681 6682 6683var 6684 6685 // Swappable if display is none or starts with table 6686 // except "table", "table-cell", or "table-caption" 6687 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 6688 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 6689 rcustomProp = /^--/, 6690 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6691 cssNormalTransform = { 6692 letterSpacing: "0", 6693 fontWeight: "400" 6694 }; 6695 6696function setPositiveNumber( _elem, value, subtract ) { 6697 6698 // Any relative (+/-) values have already been 6699 // normalized at this point 6700 var matches = rcssNum.exec( value ); 6701 return matches ? 6702 6703 // Guard against undefined "subtract", e.g., when used as in cssHooks 6704 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 6705 value; 6706} 6707 6708function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 6709 var i = dimension === "width" ? 1 : 0, 6710 extra = 0, 6711 delta = 0; 6712 6713 // Adjustment may not be necessary 6714 if ( box === ( isBorderBox ? "border" : "content" ) ) { 6715 return 0; 6716 } 6717 6718 for ( ; i < 4; i += 2 ) { 6719 6720 // Both box models exclude margin 6721 if ( box === "margin" ) { 6722 delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 6723 } 6724 6725 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 6726 if ( !isBorderBox ) { 6727 6728 // Add padding 6729 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6730 6731 // For "border" or "margin", add border 6732 if ( box !== "padding" ) { 6733 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6734 6735 // But still keep track of it otherwise 6736 } else { 6737 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6738 } 6739 6740 // If we get here with a border-box (content + padding + border), we're seeking "content" or 6741 // "padding" or "margin" 6742 } else { 6743 6744 // For "content", subtract padding 6745 if ( box === "content" ) { 6746 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6747 } 6748 6749 // For "content" or "padding", subtract border 6750 if ( box !== "margin" ) { 6751 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6752 } 6753 } 6754 } 6755 6756 // Account for positive content-box scroll gutter when requested by providing computedVal 6757 if ( !isBorderBox && computedVal >= 0 ) { 6758 6759 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 6760 // Assuming integer scroll gutter, subtract the rest and round down 6761 delta += Math.max( 0, Math.ceil( 6762 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 6763 computedVal - 6764 delta - 6765 extra - 6766 0.5 6767 6768 // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter 6769 // Use an explicit zero to avoid NaN (gh-3964) 6770 ) ) || 0; 6771 } 6772 6773 return delta; 6774} 6775 6776function getWidthOrHeight( elem, dimension, extra ) { 6777 6778 // Start with computed style 6779 var styles = getStyles( elem ), 6780 6781 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). 6782 // Fake content-box until we know it's needed to know the true value. 6783 boxSizingNeeded = !support.boxSizingReliable() || extra, 6784 isBorderBox = boxSizingNeeded && 6785 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 6786 valueIsBorderBox = isBorderBox, 6787 6788 val = curCSS( elem, dimension, styles ), 6789 offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); 6790 6791 // Support: Firefox <=54 6792 // Return a confounding non-pixel value or feign ignorance, as appropriate. 6793 if ( rnumnonpx.test( val ) ) { 6794 if ( !extra ) { 6795 return val; 6796 } 6797 val = "auto"; 6798 } 6799 6800 6801 // Support: IE 9 - 11 only 6802 // Use offsetWidth/offsetHeight for when box sizing is unreliable. 6803 // In those cases, the computed value can be trusted to be border-box. 6804 if ( ( !support.boxSizingReliable() && isBorderBox || 6805 6806 // Support: IE 10 - 11+, Edge 15 - 18+ 6807 // IE/Edge misreport `getComputedStyle` of table rows with width/height 6808 // set in CSS while `offset*` properties report correct values. 6809 // Interestingly, in some cases IE 9 doesn't suffer from this issue. 6810 !support.reliableTrDimensions() && nodeName( elem, "tr" ) || 6811 6812 // Fall back to offsetWidth/offsetHeight when value is "auto" 6813 // This happens for inline elements with no explicit setting (gh-3571) 6814 val === "auto" || 6815 6816 // Support: Android <=4.1 - 4.3 only 6817 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 6818 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && 6819 6820 // Make sure the element is visible & connected 6821 elem.getClientRects().length ) { 6822 6823 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; 6824 6825 // Where available, offsetWidth/offsetHeight approximate border box dimensions. 6826 // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the 6827 // retrieved value as a content box dimension. 6828 valueIsBorderBox = offsetProp in elem; 6829 if ( valueIsBorderBox ) { 6830 val = elem[ offsetProp ]; 6831 } 6832 } 6833 6834 // Normalize "" and auto 6835 val = parseFloat( val ) || 0; 6836 6837 // Adjust for the element's box model 6838 return ( val + 6839 boxModelAdjustment( 6840 elem, 6841 dimension, 6842 extra || ( isBorderBox ? "border" : "content" ), 6843 valueIsBorderBox, 6844 styles, 6845 6846 // Provide the current computed size to request scroll gutter calculation (gh-3589) 6847 val 6848 ) 6849 ) + "px"; 6850} 6851 6852jQuery.extend( { 6853 6854 // Add in style property hooks for overriding the default 6855 // behavior of getting and setting a style property 6856 cssHooks: { 6857 opacity: { 6858 get: function( elem, computed ) { 6859 if ( computed ) { 6860 6861 // We should always get a number back from opacity 6862 var ret = curCSS( elem, "opacity" ); 6863 return ret === "" ? "1" : ret; 6864 } 6865 } 6866 } 6867 }, 6868 6869 // Don't automatically add "px" to these possibly-unitless properties 6870 cssNumber: { 6871 "animationIterationCount": true, 6872 "columnCount": true, 6873 "fillOpacity": true, 6874 "flexGrow": true, 6875 "flexShrink": true, 6876 "fontWeight": true, 6877 "gridArea": true, 6878 "gridColumn": true, 6879 "gridColumnEnd": true, 6880 "gridColumnStart": true, 6881 "gridRow": true, 6882 "gridRowEnd": true, 6883 "gridRowStart": true, 6884 "lineHeight": true, 6885 "opacity": true, 6886 "order": true, 6887 "orphans": true, 6888 "widows": true, 6889 "zIndex": true, 6890 "zoom": true 6891 }, 6892 6893 // Add in properties whose names you wish to fix before 6894 // setting or getting the value 6895 cssProps: {}, 6896 6897 // Get and set the style property on a DOM Node 6898 style: function( elem, name, value, extra ) { 6899 6900 // Don't set styles on text and comment nodes 6901 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 6902 return; 6903 } 6904 6905 // Make sure that we're working with the right name 6906 var ret, type, hooks, 6907 origName = camelCase( name ), 6908 isCustomProp = rcustomProp.test( name ), 6909 style = elem.style; 6910 6911 // Make sure that we're working with the right name. We don't 6912 // want to query the value if it is a CSS custom property 6913 // since they are user-defined. 6914 if ( !isCustomProp ) { 6915 name = finalPropName( origName ); 6916 } 6917 6918 // Gets hook for the prefixed version, then unprefixed version 6919 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6920 6921 // Check if we're setting a value 6922 if ( value !== undefined ) { 6923 type = typeof value; 6924 6925 // Convert "+=" or "-=" to relative numbers (#7345) 6926 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 6927 value = adjustCSS( elem, name, ret ); 6928 6929 // Fixes bug #9237 6930 type = "number"; 6931 } 6932 6933 // Make sure that null and NaN values aren't set (#
vendor: 16,824 bytes, lines 6933-7557
69337116) 6934 if ( value == null || value !== value ) { 6935 return; 6936 } 6937 6938 // If a number was passed in, add the unit (except for certain CSS properties) 6939 // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append 6940 // "px" to a few hardcoded values. 6941 if ( type === "number" && !isCustomProp ) { 6942 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 6943 } 6944 6945 // background-* props affect original clone's values 6946 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 6947 style[ name ] = "inherit"; 6948 } 6949 6950 // If a hook was provided, use that value, otherwise just set the specified value 6951 if ( !hooks || !( "set" in hooks ) || 6952 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 6953 6954 if ( isCustomProp ) { 6955 style.setProperty( name, value ); 6956 } else { 6957 style[ name ] = value; 6958 } 6959 } 6960 6961 } else { 6962 6963 // If a hook was provided get the non-computed value from there 6964 if ( hooks && "get" in hooks && 6965 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 6966 6967 return ret; 6968 } 6969 6970 // Otherwise just get the value from the style object 6971 return style[ name ]; 6972 } 6973 }, 6974 6975 css: function( elem, name, extra, styles ) { 6976 var val, num, hooks, 6977 origName = camelCase( name ), 6978 isCustomProp = rcustomProp.test( name ); 6979 6980 // Make sure that we're working with the right name. We don't 6981 // want to modify the value if it is a CSS custom property 6982 // since they are user-defined. 6983 if ( !isCustomProp ) { 6984 name = finalPropName( origName ); 6985 } 6986 6987 // Try prefixed name followed by the unprefixed name 6988 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6989 6990 // If a hook was provided get the computed value from there 6991 if ( hooks && "get" in hooks ) { 6992 val = hooks.get( elem, true, extra ); 6993 } 6994 6995 // Otherwise, if a way to get the computed value exists, use that 6996 if ( val === undefined ) { 6997 val = curCSS( elem, name, styles ); 6998 } 6999 7000 // Convert "normal" to computed value 7001 if ( val === "normal" && name in cssNormalTransform ) { 7002 val = cssNormalTransform[ name ]; 7003 } 7004 7005 // Make numeric if forced or a qualifier was provided and val looks numeric 7006 if ( extra === "" || extra ) { 7007 num = parseFloat( val ); 7008 return extra === true || isFinite( num ) ? num || 0 : val; 7009 } 7010 7011 return val; 7012 } 7013} ); 7014 7015jQuery.each( [ "height", "width" ], function( _i, dimension ) { 7016 jQuery.cssHooks[ dimension ] = { 7017 get: function( elem, computed, extra ) { 7018 if ( computed ) { 7019 7020 // Certain elements can have dimension info if we invisibly show them 7021 // but it must have a current display style that would benefit 7022 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 7023 7024 // Support: Safari 8+ 7025 // Table columns in Safari have non-zero offsetWidth & zero 7026 // getBoundingClientRect().width unless display is changed. 7027 // Support: IE <=11 only 7028 // Running getBoundingClientRect on a disconnected node 7029 // in IE throws an error. 7030 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 7031 swap( elem, cssShow, function() { 7032 return getWidthOrHeight( elem, dimension, extra ); 7033 } ) : 7034 getWidthOrHeight( elem, dimension, extra ); 7035 } 7036 }, 7037 7038 set: function( elem, value, extra ) { 7039 var matches, 7040 styles = getStyles( elem ), 7041 7042 // Only read styles.position if the test has a chance to fail 7043 // to avoid forcing a reflow. 7044 scrollboxSizeBuggy = !support.scrollboxSize() && 7045 styles.position === "absolute", 7046 7047 // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) 7048 boxSizingNeeded = scrollboxSizeBuggy || extra, 7049 isBorderBox = boxSizingNeeded && 7050 jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 7051 subtract = extra ? 7052 boxModelAdjustment( 7053 elem, 7054 dimension, 7055 extra, 7056 isBorderBox, 7057 styles 7058 ) : 7059 0; 7060 7061 // Account for unreliable border-box dimensions by comparing offset* to computed and 7062 // faking a content-box to get border and padding (gh-3699) 7063 if ( isBorderBox && scrollboxSizeBuggy ) { 7064 subtract -= Math.ceil( 7065 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 7066 parseFloat( styles[ dimension ] ) - 7067 boxModelAdjustment( elem, dimension, "border", false, styles ) - 7068 0.5 7069 ); 7070 } 7071 7072 // Convert to pixels if value adjustment is needed 7073 if ( subtract && ( matches = rcssNum.exec( value ) ) && 7074 ( matches[ 3 ] || "px" ) !== "px" ) { 7075 7076 elem.style[ dimension ] = value; 7077 value = jQuery.css( elem, dimension ); 7078 } 7079 7080 return setPositiveNumber( elem, value, subtract ); 7081 } 7082 }; 7083} ); 7084 7085jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 7086 function( elem, computed ) { 7087 if ( computed ) { 7088 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 7089 elem.getBoundingClientRect().left - 7090 swap( elem, { marginLeft: 0 }, function() { 7091 return elem.getBoundingClientRect().left; 7092 } ) 7093 ) + "px"; 7094 } 7095 } 7096); 7097 7098// These hooks are used by animate to expand properties 7099jQuery.each( { 7100 margin: "", 7101 padding: "", 7102 border: "Width" 7103}, function( prefix, suffix ) { 7104 jQuery.cssHooks[ prefix + suffix ] = { 7105 expand: function( value ) { 7106 var i = 0, 7107 expanded = {}, 7108 7109 // Assumes a single number if not a string 7110 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 7111 7112 for ( ; i < 4; i++ ) { 7113 expanded[ prefix + cssExpand[ i ] + suffix ] = 7114 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 7115 } 7116 7117 return expanded; 7118 } 7119 }; 7120 7121 if ( prefix !== "margin" ) { 7122 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 7123 } 7124} ); 7125 7126jQuery.fn.extend( { 7127 css: function( name, value ) { 7128 return access( this, function( elem, name, value ) { 7129 var styles, len, 7130 map = {}, 7131 i = 0; 7132 7133 if ( Array.isArray( name ) ) { 7134 styles = getStyles( elem ); 7135 len = name.length; 7136 7137 for ( ; i < len; i++ ) { 7138 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 7139 } 7140 7141 return map; 7142 } 7143 7144 return value !== undefined ? 7145 jQuery.style( elem, name, value ) : 7146 jQuery.css( elem, name ); 7147 }, name, value, arguments.length > 1 ); 7148 } 7149} ); 7150 7151 7152function Tween( elem, options, prop, end, easing ) { 7153 return new Tween.prototype.init( elem, options, prop, end, easing ); 7154} 7155jQuery.Tween = Tween; 7156 7157Tween.prototype = { 7158 constructor: Tween, 7159 init: function( elem, options, prop, end, easing, unit ) { 7160 this.elem = elem; 7161 this.prop = prop; 7162 this.easing = easing || jQuery.easing._default; 7163 this.options = options; 7164 this.start = this.now = this.cur(); 7165 this.end = end; 7166 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 7167 }, 7168 cur: function() { 7169 var hooks = Tween.propHooks[ this.prop ]; 7170 7171 return hooks && hooks.get ? 7172 hooks.get( this ) : 7173 Tween.propHooks._default.get( this ); 7174 }, 7175 run: function( percent ) { 7176 var eased, 7177 hooks = Tween.propHooks[ this.prop ]; 7178 7179 if ( this.options.duration ) { 7180 this.pos = eased = jQuery.easing[ this.easing ]( 7181 percent, this.options.duration * percent, 0, 1, this.options.duration 7182 ); 7183 } else { 7184 this.pos = eased = percent; 7185 } 7186 this.now = ( this.end - this.start ) * eased + this.start; 7187 7188 if ( this.options.step ) { 7189 this.options.step.call( this.elem, this.now, this ); 7190 } 7191 7192 if ( hooks && hooks.set ) { 7193 hooks.set( this ); 7194 } else { 7195 Tween.propHooks._default.set( this ); 7196 } 7197 return this; 7198 } 7199}; 7200 7201Tween.prototype.init.prototype = Tween.prototype; 7202 7203Tween.propHooks = { 7204 _default: { 7205 get: function( tween ) { 7206 var result; 7207 7208 // Use a property on the element directly when it is not a DOM element, 7209 // or when there is no matching style property that exists. 7210 if ( tween.elem.nodeType !== 1 || 7211 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 7212 return tween.elem[ tween.prop ]; 7213 } 7214 7215 // Passing an empty string as a 3rd parameter to .css will automatically 7216 // attempt a parseFloat and fallback to a string if the parse fails. 7217 // Simple values such as "10px" are parsed to Float; 7218 // complex values such as "rotate(1rad)" are returned as-is. 7219 result = jQuery.css( tween.elem, tween.prop, "" ); 7220 7221 // Empty strings, null, undefined and "auto" are converted to 0. 7222 return !result || result === "auto" ? 0 : result; 7223 }, 7224 set: function( tween ) { 7225 7226 // Use step hook for back compat. 7227 // Use cssHook if its there. 7228 // Use .style if available and use plain properties where available. 7229 if ( jQuery.fx.step[ tween.prop ] ) { 7230 jQuery.fx.step[ tween.prop ]( tween ); 7231 } else if ( tween.elem.nodeType === 1 && ( 7232 jQuery.cssHooks[ tween.prop ] || 7233 tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { 7234 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 7235 } else { 7236 tween.elem[ tween.prop ] = tween.now; 7237 } 7238 } 7239 } 7240}; 7241 7242// Support: IE <=9 only 7243// Panic based approach to setting things on disconnected nodes 7244Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 7245 set: function( tween ) { 7246 if ( tween.elem.nodeType && tween.elem.parentNode ) { 7247 tween.elem[ tween.prop ] = tween.now; 7248 } 7249 } 7250}; 7251 7252jQuery.easing = { 7253 linear: function( p ) { 7254 return p; 7255 }, 7256 swing: function( p ) { 7257 return 0.5 - Math.cos( p * Math.PI ) / 2; 7258 }, 7259 _default: "swing" 7260}; 7261 7262jQuery.fx = Tween.prototype.init; 7263 7264// Back compat <1.8 extension point 7265jQuery.fx.step = {}; 7266 7267 7268 7269 7270var 7271 fxNow, inProgress, 7272 rfxtypes = /^(?:toggle|show|hide)$/, 7273 rrun = /queueHooks$/; 7274 7275function schedule() { 7276 if ( inProgress ) { 7277 if ( document.hidden === false && window.requestAnimationFrame ) { 7278 window.requestAnimationFrame( schedule ); 7279 } else { 7280 window.setTimeout( schedule, jQuery.fx.interval ); 7281 } 7282 7283 jQuery.fx.tick(); 7284 } 7285} 7286 7287// Animations created synchronously will run synchronously 7288function createFxNow() { 7289 window.setTimeout( function() { 7290 fxNow = undefined; 7291 } ); 7292 return ( fxNow = Date.now() ); 7293} 7294 7295// Generate parameters to create a standard animation 7296function genFx( type, includeWidth ) { 7297 var which, 7298 i = 0, 7299 attrs = { height: type }; 7300 7301 // If we include width, step value is 1 to do all cssExpand values, 7302 // otherwise step value is 2 to skip over Left and Right 7303 includeWidth = includeWidth ? 1 : 0; 7304 for ( ; i < 4; i += 2 - includeWidth ) { 7305 which = cssExpand[ i ]; 7306 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 7307 } 7308 7309 if ( includeWidth ) { 7310 attrs.opacity = attrs.width = type; 7311 } 7312 7313 return attrs; 7314} 7315 7316function createTween( value, prop, animation ) { 7317 var tween, 7318 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 7319 index = 0, 7320 length = collection.length; 7321 for ( ; index < length; index++ ) { 7322 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 7323 7324 // We're done with this property 7325 return tween; 7326 } 7327 } 7328} 7329 7330function defaultPrefilter( elem, props, opts ) { 7331 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 7332 isBox = "width" in props || "height" in props, 7333 anim = this, 7334 orig = {}, 7335 style = elem.style, 7336 hidden = elem.nodeType && isHiddenWithinTree( elem ), 7337 dataShow = dataPriv.get( elem, "fxshow" ); 7338 7339 // Queue-skipping animations hijack the fx hooks 7340 if ( !opts.queue ) { 7341 hooks = jQuery._queueHooks( elem, "fx" ); 7342 if ( hooks.unqueued == null ) { 7343 hooks.unqueued = 0; 7344 oldfire = hooks.empty.fire; 7345 hooks.empty.fire = function() { 7346 if ( !hooks.unqueued ) { 7347 oldfire(); 7348 } 7349 }; 7350 } 7351 hooks.unqueued++; 7352 7353 anim.always( function() { 7354 7355 // Ensure the complete handler is called before this completes 7356 anim.always( function() { 7357 hooks.unqueued--; 7358 if ( !jQuery.queue( elem, "fx" ).length ) { 7359 hooks.empty.fire(); 7360 } 7361 } ); 7362 } ); 7363 } 7364 7365 // Detect show/hide animations 7366 for ( prop in props ) { 7367 value = props[ prop ]; 7368 if ( rfxtypes.test( value ) ) { 7369 delete props[ prop ]; 7370 toggle = toggle || value === "toggle"; 7371 if ( value === ( hidden ? "hide" : "show" ) ) { 7372 7373 // Pretend to be hidden if this is a "show" and 7374 // there is still data from a stopped show/hide 7375 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 7376 hidden = true; 7377 7378 // Ignore all other no-op show/hide data 7379 } else { 7380 continue; 7381 } 7382 } 7383 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 7384 } 7385 } 7386 7387 // Bail out if this is a no-op like .hide().hide() 7388 propTween = !jQuery.isEmptyObject( props ); 7389 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 7390 return; 7391 } 7392 7393 // Restrict "overflow" and "display" styles during box animations 7394 if ( isBox && elem.nodeType === 1 ) { 7395 7396 // Support: IE <=9 - 11, Edge 12 - 15 7397 // Record all 3 overflow attributes because IE does not infer the shorthand 7398 // from identically-valued overflowX and overflowY and Edge just mirrors 7399 // the overflowX value there. 7400 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 7401 7402 // Identify a display type, preferring old show/hide data over the CSS cascade 7403 restoreDisplay = dataShow && dataShow.display; 7404 if ( restoreDisplay == null ) { 7405 restoreDisplay = dataPriv.get( elem, "display" ); 7406 } 7407 display = jQuery.css( elem, "display" ); 7408 if ( display === "none" ) { 7409 if ( restoreDisplay ) { 7410 display = restoreDisplay; 7411 } else { 7412 7413 // Get nonempty value(s) by temporarily forcing visibility 7414 showHide( [ elem ], true ); 7415 restoreDisplay = elem.style.display || restoreDisplay; 7416 display = jQuery.css( elem, "display" ); 7417 showHide( [ elem ] ); 7418 } 7419 } 7420 7421 // Animate inline elements as inline-block 7422 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 7423 if ( jQuery.css( elem, "float" ) === "none" ) { 7424 7425 // Restore the original display value at the end of pure show/hide animations 7426 if ( !propTween ) { 7427 anim.done( function() { 7428 style.display = restoreDisplay; 7429 } ); 7430 if ( restoreDisplay == null ) { 7431 display = style.display; 7432 restoreDisplay = display === "none" ? "" : display; 7433 } 7434 } 7435 style.display = "inline-block"; 7436 } 7437 } 7438 } 7439 7440 if ( opts.overflow ) { 7441 style.overflow = "hidden"; 7442 anim.always( function() { 7443 style.overflow = opts.overflow[ 0 ]; 7444 style.overflowX = opts.overflow[ 1 ]; 7445 style.overflowY = opts.overflow[ 2 ]; 7446 } ); 7447 } 7448 7449 // Implement show/hide animations 7450 propTween = false; 7451 for ( prop in orig ) { 7452 7453 // General show/hide setup for this element animation 7454 if ( !propTween ) { 7455 if ( dataShow ) { 7456 if ( "hidden" in dataShow ) { 7457 hidden = dataShow.hidden; 7458 } 7459 } else { 7460 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 7461 } 7462 7463 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 7464 if ( toggle ) { 7465 dataShow.hidden = !hidden; 7466 } 7467 7468 // Show elements before animating them 7469 if ( hidden ) { 7470 showHide( [ elem ], true ); 7471 } 7472 7473 /* eslint-disable no-loop-func */ 7474 7475 anim.done( function() { 7476 7477 /* eslint-enable no-loop-func */ 7478 7479 // The final step of a "hide" animation is actually hiding the element 7480 if ( !hidden ) { 7481 showHide( [ elem ] ); 7482 } 7483 dataPriv.remove( elem, "fxshow" ); 7484 for ( prop in orig ) { 7485 jQuery.style( elem, prop, orig[ prop ] ); 7486 } 7487 } ); 7488 } 7489 7490 // Per-property setup 7491 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 7492 if ( !( prop in dataShow ) ) { 7493 dataShow[ prop ] = propTween.start; 7494 if ( hidden ) { 7495 propTween.end = propTween.start; 7496 propTween.start = 0; 7497 } 7498 } 7499 } 7500} 7501 7502function propFilter( props, specialEasing ) { 7503 var index, name, easing, value, hooks; 7504 7505 // camelCase, specialEasing and expand cssHook pass 7506 for ( index in props ) { 7507 name = camelCase( index ); 7508 easing = specialEasing[ name ]; 7509 value = props[ index ]; 7510 if ( Array.isArray( value ) ) { 7511 easing = value[ 1 ]; 7512 value = props[ index ] = value[ 0 ]; 7513 } 7514 7515 if ( index !== name ) { 7516 props[ name ] = value; 7517 delete props[ index ]; 7518 } 7519 7520 hooks = jQuery.cssHooks[ name ]; 7521 if ( hooks && "expand" in hooks ) { 7522 value = hooks.expand( value ); 7523 delete props[ name ]; 7524 7525 // Not quite $.extend, this won't overwrite existing keys. 7526 // Reusing 'index' because we have the correct "name" 7527 for ( index in value ) { 7528 if ( !( index in props ) ) { 7529 props[ index ] = value[ index ]; 7530 specialEasing[ index ] = easing; 7531 } 7532 } 7533 } else { 7534 specialEasing[ name ] = easing; 7535 } 7536 } 7537} 7538 7539function Animation( elem, properties, options ) { 7540 var result, 7541 stopped, 7542 index = 0, 7543 length = Animation.prefilters.length, 7544 deferred = jQuery.Deferred().always( function() { 7545 7546 // Don't match elem in the :animated selector 7547 delete tick.elem; 7548 } ), 7549 tick = function() { 7550 if ( stopped ) { 7551 return false; 7552 } 7553 var currentTime = fxNow || createFxNow(), 7554 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 7555 7556 // Support: Android 2.3 only 7557 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (
vendor: 9,539 bytes, lines 7557-7947
7557#12497) 7558 temp = remaining / animation.duration || 0, 7559 percent = 1 - temp, 7560 index = 0, 7561 length = animation.tweens.length; 7562 7563 for ( ; index < length; index++ ) { 7564 animation.tweens[ index ].run( percent ); 7565 } 7566 7567 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 7568 7569 // If there's more to do, yield 7570 if ( percent < 1 && length ) { 7571 return remaining; 7572 } 7573 7574 // If this was an empty animation, synthesize a final progress notification 7575 if ( !length ) { 7576 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7577 } 7578 7579 // Resolve the animation and report its conclusion 7580 deferred.resolveWith( elem, [ animation ] ); 7581 return false; 7582 }, 7583 animation = deferred.promise( { 7584 elem: elem, 7585 props: jQuery.extend( {}, properties ), 7586 opts: jQuery.extend( true, { 7587 specialEasing: {}, 7588 easing: jQuery.easing._default 7589 }, options ), 7590 originalProperties: properties, 7591 originalOptions: options, 7592 startTime: fxNow || createFxNow(), 7593 duration: options.duration, 7594 tweens: [], 7595 createTween: function( prop, end ) { 7596 var tween = jQuery.Tween( elem, animation.opts, prop, end, 7597 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 7598 animation.tweens.push( tween ); 7599 return tween; 7600 }, 7601 stop: function( gotoEnd ) { 7602 var index = 0, 7603 7604 // If we are going to the end, we want to run all the tweens 7605 // otherwise we skip this part 7606 length = gotoEnd ? animation.tweens.length : 0; 7607 if ( stopped ) { 7608 return this; 7609 } 7610 stopped = true; 7611 for ( ; index < length; index++ ) { 7612 animation.tweens[ index ].run( 1 ); 7613 } 7614 7615 // Resolve when we played the last frame; otherwise, reject 7616 if ( gotoEnd ) { 7617 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7618 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 7619 } else { 7620 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 7621 } 7622 return this; 7623 } 7624 } ), 7625 props = animation.props; 7626 7627 propFilter( props, animation.opts.specialEasing ); 7628 7629 for ( ; index < length; index++ ) { 7630 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 7631 if ( result ) { 7632 if ( isFunction( result.stop ) ) { 7633 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 7634 result.stop.bind( result ); 7635 } 7636 return result; 7637 } 7638 } 7639 7640 jQuery.map( props, createTween, animation ); 7641 7642 if ( isFunction( animation.opts.start ) ) { 7643 animation.opts.start.call( elem, animation ); 7644 } 7645 7646 // Attach callbacks from options 7647 animation 7648 .progress( animation.opts.progress ) 7649 .done( animation.opts.done, animation.opts.complete ) 7650 .fail( animation.opts.fail ) 7651 .always( animation.opts.always ); 7652 7653 jQuery.fx.timer( 7654 jQuery.extend( tick, { 7655 elem: elem, 7656 anim: animation, 7657 queue: animation.opts.queue 7658 } ) 7659 ); 7660 7661 return animation; 7662} 7663 7664jQuery.Animation = jQuery.extend( Animation, { 7665 7666 tweeners: { 7667 "*": [ function( prop, value ) { 7668 var tween = this.createTween( prop, value ); 7669 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 7670 return tween; 7671 } ] 7672 }, 7673 7674 tweener: function( props, callback ) { 7675 if ( isFunction( props ) ) { 7676 callback = props; 7677 props = [ "*" ]; 7678 } else { 7679 props = props.match( rnothtmlwhite ); 7680 } 7681 7682 var prop, 7683 index = 0, 7684 length = props.length; 7685 7686 for ( ; index < length; index++ ) { 7687 prop = props[ index ]; 7688 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 7689 Animation.tweeners[ prop ].unshift( callback ); 7690 } 7691 }, 7692 7693 prefilters: [ defaultPrefilter ], 7694 7695 prefilter: function( callback, prepend ) { 7696 if ( prepend ) { 7697 Animation.prefilters.unshift( callback ); 7698 } else { 7699 Animation.prefilters.push( callback ); 7700 } 7701 } 7702} ); 7703 7704jQuery.speed = function( speed, easing, fn ) { 7705 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 7706 complete: fn || !fn && easing || 7707 isFunction( speed ) && speed, 7708 duration: speed, 7709 easing: fn && easing || easing && !isFunction( easing ) && easing 7710 }; 7711 7712 // Go to the end state if fx are off 7713 if ( jQuery.fx.off ) { 7714 opt.duration = 0; 7715 7716 } else { 7717 if ( typeof opt.duration !== "number" ) { 7718 if ( opt.duration in jQuery.fx.speeds ) { 7719 opt.duration = jQuery.fx.speeds[ opt.duration ]; 7720 7721 } else { 7722 opt.duration = jQuery.fx.speeds._default; 7723 } 7724 } 7725 } 7726 7727 // Normalize opt.queue - true/undefined/null -> "fx" 7728 if ( opt.queue == null || opt.queue === true ) { 7729 opt.queue = "fx"; 7730 } 7731 7732 // Queueing 7733 opt.old = opt.complete; 7734 7735 opt.complete = function() { 7736 if ( isFunction( opt.old ) ) { 7737 opt.old.call( this ); 7738 } 7739 7740 if ( opt.queue ) { 7741 jQuery.dequeue( this, opt.queue ); 7742 } 7743 }; 7744 7745 return opt; 7746}; 7747 7748jQuery.fn.extend( { 7749 fadeTo: function( speed, to, easing, callback ) { 7750 7751 // Show any hidden elements after setting opacity to 0 7752 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 7753 7754 // Animate to the value specified 7755 .end().animate( { opacity: to }, speed, easing, callback ); 7756 }, 7757 animate: function( prop, speed, easing, callback ) { 7758 var empty = jQuery.isEmptyObject( prop ), 7759 optall = jQuery.speed( speed, easing, callback ), 7760 doAnimation = function() { 7761 7762 // Operate on a copy of prop so per-property easing won't be lost 7763 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 7764 7765 // Empty animations, or finishing resolves immediately 7766 if ( empty || dataPriv.get( this, "finish" ) ) { 7767 anim.stop( true ); 7768 } 7769 }; 7770 7771 doAnimation.finish = doAnimation; 7772 7773 return empty || optall.queue === false ? 7774 this.each( doAnimation ) : 7775 this.queue( optall.queue, doAnimation ); 7776 }, 7777 stop: function( type, clearQueue, gotoEnd ) { 7778 var stopQueue = function( hooks ) { 7779 var stop = hooks.stop; 7780 delete hooks.stop; 7781 stop( gotoEnd ); 7782 }; 7783 7784 if ( typeof type !== "string" ) { 7785 gotoEnd = clearQueue; 7786 clearQueue = type; 7787 type = undefined; 7788 } 7789 if ( clearQueue ) { 7790 this.queue( type || "fx", [] ); 7791 } 7792 7793 return this.each( function() { 7794 var dequeue = true, 7795 index = type != null && type + "queueHooks", 7796 timers = jQuery.timers, 7797 data = dataPriv.get( this ); 7798 7799 if ( index ) { 7800 if ( data[ index ] && data[ index ].stop ) { 7801 stopQueue( data[ index ] ); 7802 } 7803 } else { 7804 for ( index in data ) { 7805 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 7806 stopQueue( data[ index ] ); 7807 } 7808 } 7809 } 7810 7811 for ( index = timers.length; index--; ) { 7812 if ( timers[ index ].elem === this && 7813 ( type == null || timers[ index ].queue === type ) ) { 7814 7815 timers[ index ].anim.stop( gotoEnd ); 7816 dequeue = false; 7817 timers.splice( index, 1 ); 7818 } 7819 } 7820 7821 // Start the next in the queue if the last step wasn't forced. 7822 // Timers currently will call their complete callbacks, which 7823 // will dequeue but only if they were gotoEnd. 7824 if ( dequeue || !gotoEnd ) { 7825 jQuery.dequeue( this, type ); 7826 } 7827 } ); 7828 }, 7829 finish: function( type ) { 7830 if ( type !== false ) { 7831 type = type || "fx"; 7832 } 7833 return this.each( function() { 7834 var index, 7835 data = dataPriv.get( this ), 7836 queue = data[ type + "queue" ], 7837 hooks = data[ type + "queueHooks" ], 7838 timers = jQuery.timers, 7839 length = queue ? queue.length : 0; 7840 7841 // Enable finishing flag on private data 7842 data.finish = true; 7843 7844 // Empty the queue first 7845 jQuery.queue( this, type, [] ); 7846 7847 if ( hooks && hooks.stop ) { 7848 hooks.stop.call( this, true ); 7849 } 7850 7851 // Look for any active animations, and finish them 7852 for ( index = timers.length; index--; ) { 7853 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 7854 timers[ index ].anim.stop( true ); 7855 timers.splice( index, 1 ); 7856 } 7857 } 7858 7859 // Look for any animations in the old queue and finish them 7860 for ( index = 0; index < length; index++ ) { 7861 if ( queue[ index ] && queue[ index ].finish ) { 7862 queue[ index ].finish.call( this ); 7863 } 7864 } 7865 7866 // Turn off finishing flag 7867 delete data.finish; 7868 } ); 7869 } 7870} ); 7871 7872jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { 7873 var cssFn = jQuery.fn[ name ]; 7874 jQuery.fn[ name ] = function( speed, easing, callback ) { 7875 return speed == null || typeof speed === "boolean" ? 7876 cssFn.apply( this, arguments ) : 7877 this.animate( genFx( name, true ), speed, easing, callback ); 7878 }; 7879} ); 7880 7881// Generate shortcuts for custom animations 7882jQuery.each( { 7883 slideDown: genFx( "show" ), 7884 slideUp: genFx( "hide" ), 7885 slideToggle: genFx( "toggle" ), 7886 fadeIn: { opacity: "show" }, 7887 fadeOut: { opacity: "hide" }, 7888 fadeToggle: { opacity: "toggle" } 7889}, function( name, props ) { 7890 jQuery.fn[ name ] = function( speed, easing, callback ) { 7891 return this.animate( props, speed, easing, callback ); 7892 }; 7893} ); 7894 7895jQuery.timers = []; 7896jQuery.fx.tick = function() { 7897 var timer, 7898 i = 0, 7899 timers = jQuery.timers; 7900 7901 fxNow = Date.now(); 7902 7903 for ( ; i < timers.length; i++ ) { 7904 timer = timers[ i ]; 7905 7906 // Run the timer and safely remove it when done (allowing for external removal) 7907 if ( !timer() && timers[ i ] === timer ) { 7908 timers.splice( i--, 1 ); 7909 } 7910 } 7911 7912 if ( !timers.length ) { 7913 jQuery.fx.stop(); 7914 } 7915 fxNow = undefined; 7916}; 7917 7918jQuery.fx.timer = function( timer ) { 7919 jQuery.timers.push( timer ); 7920 jQuery.fx.start(); 7921}; 7922 7923jQuery.fx.interval = 13; 7924jQuery.fx.start = function() { 7925 if ( inProgress ) { 7926 return; 7927 } 7928 7929 inProgress = true; 7930 schedule(); 7931}; 7932 7933jQuery.fx.stop = function() { 7934 inProgress = null; 7935}; 7936 7937jQuery.fx.speeds = { 7938 slow: 600, 7939 fast: 200, 7940 7941 // Default speed 7942 _default: 400 7943}; 7944 7945 7946// Based off of the plugin by Clint Helfers, with permission. 7947// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
vendor: 5,321 bytes, lines 7947-8172
7947 7948jQuery.fn.delay = function( time, type ) { 7949 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 7950 type = type || "fx"; 7951 7952 return this.queue( type, function( next, hooks ) { 7953 var timeout = window.setTimeout( next, time ); 7954 hooks.stop = function() { 7955 window.clearTimeout( timeout ); 7956 }; 7957 } ); 7958}; 7959 7960 7961( function() { 7962 var input = document.createElement( "input" ), 7963 select = document.createElement( "select" ), 7964 opt = select.appendChild( document.createElement( "option" ) ); 7965 7966 input.type = "checkbox"; 7967 7968 // Support: Android <=4.3 only 7969 // Default value for a checkbox should be "on" 7970 support.checkOn = input.value !== ""; 7971 7972 // Support: IE <=11 only 7973 // Must access selectedIndex to make default options select 7974 support.optSelected = opt.selected; 7975 7976 // Support: IE <=11 only 7977 // An input loses its value after becoming a radio 7978 input = document.createElement( "input" ); 7979 input.value = "t"; 7980 input.type = "radio"; 7981 support.radioValue = input.value === "t"; 7982} )(); 7983 7984 7985var boolHook, 7986 attrHandle = jQuery.expr.attrHandle; 7987 7988jQuery.fn.extend( { 7989 attr: function( name, value ) { 7990 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 7991 }, 7992 7993 removeAttr: function( name ) { 7994 return this.each( function() { 7995 jQuery.removeAttr( this, name ); 7996 } ); 7997 } 7998} ); 7999 8000jQuery.extend( { 8001 attr: function( elem, name, value ) { 8002 var ret, hooks, 8003 nType = elem.nodeType; 8004 8005 // Don't get/set attributes on text, comment and attribute nodes 8006 if ( nType === 3 || nType === 8 || nType === 2 ) { 8007 return; 8008 } 8009 8010 // Fallback to prop when attributes are not supported 8011 if ( typeof elem.getAttribute === "undefined" ) { 8012 return jQuery.prop( elem, name, value ); 8013 } 8014 8015 // Attribute hooks are determined by the lowercase version 8016 // Grab necessary hook if one is defined 8017 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8018 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 8019 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 8020 } 8021 8022 if ( value !== undefined ) { 8023 if ( value === null ) { 8024 jQuery.removeAttr( elem, name ); 8025 return; 8026 } 8027 8028 if ( hooks && "set" in hooks && 8029 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8030 return ret; 8031 } 8032 8033 elem.setAttribute( name, value + "" ); 8034 return value; 8035 } 8036 8037 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8038 return ret; 8039 } 8040 8041 ret = jQuery.find.attr( elem, name ); 8042 8043 // Non-existent attributes return null, we normalize to undefined 8044 return ret == null ? undefined : ret; 8045 }, 8046 8047 attrHooks: { 8048 type: { 8049 set: function( elem, value ) { 8050 if ( !support.radioValue && value === "radio" && 8051 nodeName( elem, "input" ) ) { 8052 var val = elem.value; 8053 elem.setAttribute( "type", value ); 8054 if ( val ) { 8055 elem.value = val; 8056 } 8057 return value; 8058 } 8059 } 8060 } 8061 }, 8062 8063 removeAttr: function( elem, value ) { 8064 var name, 8065 i = 0, 8066 8067 // Attribute names can contain non-HTML whitespace characters 8068 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 8069 attrNames = value && value.match( rnothtmlwhite ); 8070 8071 if ( attrNames && elem.nodeType === 1 ) { 8072 while ( ( name = attrNames[ i++ ] ) ) { 8073 elem.removeAttribute( name ); 8074 } 8075 } 8076 } 8077} ); 8078 8079// Hooks for boolean attributes 8080boolHook = { 8081 set: function( elem, value, name ) { 8082 if ( value === false ) { 8083 8084 // Remove boolean attributes when set to false 8085 jQuery.removeAttr( elem, name ); 8086 } else { 8087 elem.setAttribute( name, name ); 8088 } 8089 return name; 8090 } 8091}; 8092 8093jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { 8094 var getter = attrHandle[ name ] || jQuery.find.attr; 8095 8096 attrHandle[ name ] = function( elem, name, isXML ) { 8097 var ret, handle, 8098 lowercaseName = name.toLowerCase(); 8099 8100 if ( !isXML ) { 8101 8102 // Avoid an infinite loop by temporarily removing this function from the getter 8103 handle = attrHandle[ lowercaseName ]; 8104 attrHandle[ lowercaseName ] = ret; 8105 ret = getter( elem, name, isXML ) != null ? 8106 lowercaseName : 8107 null; 8108 attrHandle[ lowercaseName ] = handle; 8109 } 8110 return ret; 8111 }; 8112} ); 8113 8114 8115 8116 8117var rfocusable = /^(?:input|select|textarea|button)$/i, 8118 rclickable = /^(?:a|area)$/i; 8119 8120jQuery.fn.extend( { 8121 prop: function( name, value ) { 8122 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 8123 }, 8124 8125 removeProp: function( name ) { 8126 return this.each( function() { 8127 delete this[ jQuery.propFix[ name ] || name ]; 8128 } ); 8129 } 8130} ); 8131 8132jQuery.extend( { 8133 prop: function( elem, name, value ) { 8134 var ret, hooks, 8135 nType = elem.nodeType; 8136 8137 // Don't get/set properties on text, comment and attribute nodes 8138 if ( nType === 3 || nType === 8 || nType === 2 ) { 8139 return; 8140 } 8141 8142 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 8143 8144 // Fix name and attach hooks 8145 name = jQuery.propFix[ name ] || name; 8146 hooks = jQuery.propHooks[ name ]; 8147 } 8148 8149 if ( value !== undefined ) { 8150 if ( hooks && "set" in hooks && 8151 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 8152 return ret; 8153 } 8154 8155 return ( elem[ name ] = value ); 8156 } 8157 8158 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 8159 return ret; 8160 } 8161 8162 return elem[ name ]; 8163 }, 8164 8165 propHooks: { 8166 tabIndex: { 8167 get: function( elem ) { 8168 8169 // Support: IE <=9 - 11 only 8170 // elem.tabIndex doesn't always return the 8171 // correct value when it hasn't been explicitly set 8172 //
vendor: 4,831 bytes, lines 8172-8385
8172https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 8173 // Use proper attribute retrieval(#12072) 8174 var tabindex = jQuery.find.attr( elem, "tabindex" ); 8175 8176 if ( tabindex ) { 8177 return parseInt( tabindex, 10 ); 8178 } 8179 8180 if ( 8181 rfocusable.test( elem.nodeName ) || 8182 rclickable.test( elem.nodeName ) && 8183 elem.href 8184 ) { 8185 return 0; 8186 } 8187 8188 return -1; 8189 } 8190 } 8191 }, 8192 8193 propFix: { 8194 "for": "htmlFor", 8195 "class": "className" 8196 } 8197} ); 8198 8199// Support: IE <=11 only 8200// Accessing the selectedIndex property 8201// forces the browser to respect setting selected 8202// on the option 8203// The getter ensures a default option is selected 8204// when in an optgroup 8205// eslint rule "no-unused-expressions" is disabled for this code 8206// since it considers such accessions noop 8207if ( !support.optSelected ) { 8208 jQuery.propHooks.selected = { 8209 get: function( elem ) { 8210 8211 /* eslint no-unused-expressions: "off" */ 8212 8213 var parent = elem.parentNode; 8214 if ( parent && parent.parentNode ) { 8215 parent.parentNode.selectedIndex; 8216 } 8217 return null; 8218 }, 8219 set: function( elem ) { 8220 8221 /* eslint no-unused-expressions: "off" */ 8222 8223 var parent = elem.parentNode; 8224 if ( parent ) { 8225 parent.selectedIndex; 8226 8227 if ( parent.parentNode ) { 8228 parent.parentNode.selectedIndex; 8229 } 8230 } 8231 } 8232 }; 8233} 8234 8235jQuery.each( [ 8236 "tabIndex", 8237 "readOnly", 8238 "maxLength", 8239 "cellSpacing", 8240 "cellPadding", 8241 "rowSpan", 8242 "colSpan", 8243 "useMap", 8244 "frameBorder", 8245 "contentEditable" 8246], function() { 8247 jQuery.propFix[ this.toLowerCase() ] = this; 8248} ); 8249 8250 8251 8252 8253 // Strip and collapse whitespace according to HTML spec 8254 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 8255 function stripAndCollapse( value ) { 8256 var tokens = value.match( rnothtmlwhite ) || []; 8257 return tokens.join( " " ); 8258 } 8259 8260 8261function getClass( elem ) { 8262 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 8263} 8264 8265function classesToArray( value ) { 8266 if ( Array.isArray( value ) ) { 8267 return value; 8268 } 8269 if ( typeof value === "string" ) { 8270 return value.match( rnothtmlwhite ) || []; 8271 } 8272 return []; 8273} 8274 8275jQuery.fn.extend( { 8276 addClass: function( value ) { 8277 var classes, elem, cur, curValue, clazz, j, finalValue, 8278 i = 0; 8279 8280 if ( isFunction( value ) ) { 8281 return this.each( function( j ) { 8282 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 8283 } ); 8284 } 8285 8286 classes = classesToArray( value ); 8287 8288 if ( classes.length ) { 8289 while ( ( elem = this[ i++ ] ) ) { 8290 curValue = getClass( elem ); 8291 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8292 8293 if ( cur ) { 8294 j = 0; 8295 while ( ( clazz = classes[ j++ ] ) ) { 8296 if ( cur.indexOf( " " + clazz + " " ) < 0 ) { 8297 cur += clazz + " "; 8298 } 8299 } 8300 8301 // Only assign if different to avoid unneeded rendering. 8302 finalValue = stripAndCollapse( cur ); 8303 if ( curValue !== finalValue ) { 8304 elem.setAttribute( "class", finalValue ); 8305 } 8306 } 8307 } 8308 } 8309 8310 return this; 8311 }, 8312 8313 removeClass: function( value ) { 8314 var classes, elem, cur, curValue, clazz, j, finalValue, 8315 i = 0; 8316 8317 if ( isFunction( value ) ) { 8318 return this.each( function( j ) { 8319 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 8320 } ); 8321 } 8322 8323 if ( !arguments.length ) { 8324 return this.attr( "class", "" ); 8325 } 8326 8327 classes = classesToArray( value ); 8328 8329 if ( classes.length ) { 8330 while ( ( elem = this[ i++ ] ) ) { 8331 curValue = getClass( elem ); 8332 8333 // This expression is here for better compressibility (see addClass) 8334 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 8335 8336 if ( cur ) { 8337 j = 0; 8338 while ( ( clazz = classes[ j++ ] ) ) { 8339 8340 // Remove *all* instances 8341 while ( cur.indexOf( " " + clazz + " " ) > -1 ) { 8342 cur = cur.replace( " " + clazz + " ", " " ); 8343 } 8344 } 8345 8346 // Only assign if different to avoid unneeded rendering. 8347 finalValue = stripAndCollapse( cur ); 8348 if ( curValue !== finalValue ) { 8349 elem.setAttribute( "class", finalValue ); 8350 } 8351 } 8352 } 8353 } 8354 8355 return this; 8356 }, 8357 8358 toggleClass: function( value, stateVal ) { 8359 var type = typeof value, 8360 isValidValue = type === "string" || Array.isArray( value ); 8361 8362 if ( typeof stateVal === "boolean" && isValidValue ) { 8363 return stateVal ? this.addClass( value ) : this.removeClass( value ); 8364 } 8365 8366 if ( isFunction( value ) ) { 8367 return this.each( function( i ) { 8368 jQuery( this ).toggleClass( 8369 value.call( this, i, getClass( this ), stateVal ), 8370 stateVal 8371 ); 8372 } ); 8373 } 8374 8375 return this.each( function() { 8376 var className, i, self, classNames; 8377 8378 if ( isValidValue ) { 8379 8380 // Toggle individual class names 8381 i = 0; 8382 self = jQuery( this ); 8383 classNames = classesToArray( value ); 8384 8385 while ( ( className = classNames[ i++ ] ) ) {
vendor: 2,605 bytes, lines 8385-8501
8385 8386 8387 // Check each className given, space separated list 8388 if ( self.hasClass( className ) ) { 8389 self.removeClass( className ); 8390 } else { 8391 self.addClass( className ); 8392 } 8393 } 8394 8395 // Toggle whole class name 8396 } else if ( value === undefined || type === "boolean" ) { 8397 className = getClass( this ); 8398 if ( className ) { 8399 8400 // Store className if set 8401 dataPriv.set( this, "__className__", className ); 8402 } 8403 8404 // If the element has a class name or if we're passed `false`, 8405 // then remove the whole classname (if there was one, the above saved it). 8406 // Otherwise bring back whatever was previously saved (if anything), 8407 // falling back to the empty string if nothing was stored. 8408 if ( this.setAttribute ) { 8409 this.setAttribute( "class", 8410 className || value === false ? 8411 "" : 8412 dataPriv.get( this, "__className__" ) || "" 8413 ); 8414 } 8415 } 8416 } ); 8417 }, 8418 8419 hasClass: function( selector ) { 8420 var className, elem, 8421 i = 0; 8422 8423 className = " " + selector + " "; 8424 while ( ( elem = this[ i++ ] ) ) { 8425 if ( elem.nodeType === 1 && 8426 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 8427 return true; 8428 } 8429 } 8430 8431 return false; 8432 } 8433} ); 8434 8435 8436 8437 8438var rreturn = /\r/g; 8439 8440jQuery.fn.extend( { 8441 val: function( value ) { 8442 var hooks, ret, valueIsFunction, 8443 elem = this[ 0 ]; 8444 8445 if ( !arguments.length ) { 8446 if ( elem ) { 8447 hooks = jQuery.valHooks[ elem.type ] || 8448 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 8449 8450 if ( hooks && 8451 "get" in hooks && 8452 ( ret = hooks.get( elem, "value" ) ) !== undefined 8453 ) { 8454 return ret; 8455 } 8456 8457 ret = elem.value; 8458 8459 // Handle most common string cases 8460 if ( typeof ret === "string" ) { 8461 return ret.replace( rreturn, "" ); 8462 } 8463 8464 // Handle cases where value is null/undef or number 8465 return ret == null ? "" : ret; 8466 } 8467 8468 return; 8469 } 8470 8471 valueIsFunction = isFunction( value ); 8472 8473 return this.each( function( i ) { 8474 var val; 8475 8476 if ( this.nodeType !== 1 ) { 8477 return; 8478 } 8479 8480 if ( valueIsFunction ) { 8481 val = value.call( this, i, jQuery( this ).val() ); 8482 } else { 8483 val = value; 8484 } 8485 8486 // Treat null/undefined as ""; convert numbers to string 8487 if ( val == null ) { 8488 val = ""; 8489 8490 } else if ( typeof val === "number" ) { 8491 val += ""; 8492 8493 } else if ( Array.isArray( val ) ) { 8494 val = jQuery.map( val, function( value ) { 8495 return value == null ? "" : value + ""; 8496 } ); 8497 } 8498 8499 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 8500 8501 // If set returns undefined, fall back to normal setting
vendor: 5,740 bytes, lines 8502-8717
8502 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 8503 this.value = val; 8504 } 8505 } ); 8506 } 8507} ); 8508 8509jQuery.extend( { 8510 valHooks: { 8511 option: { 8512 get: function( elem ) { 8513 8514 var val = jQuery.find.attr( elem, "value" ); 8515 return val != null ? 8516 val : 8517 8518 // Support: IE <=10 - 11 only 8519 // option.text throws exceptions (#14686, #14858) 8520 // Strip and collapse whitespace 8521 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 8522 stripAndCollapse( jQuery.text( elem ) ); 8523 } 8524 }, 8525 select: { 8526 get: function( elem ) { 8527 var value, option, i, 8528 options = elem.options, 8529 index = elem.selectedIndex, 8530 one = elem.type === "select-one", 8531 values = one ? null : [], 8532 max = one ? index + 1 : options.length; 8533 8534 if ( index < 0 ) { 8535 i = max; 8536 8537 } else { 8538 i = one ? index : 0; 8539 } 8540 8541 // Loop through all the selected options 8542 for ( ; i < max; i++ ) { 8543 option = options[ i ]; 8544 8545 // Support: IE <=9 only 8546 // IE8-9 doesn't update selected after form reset (#2551) 8547 if ( ( option.selected || i === index ) && 8548 8549 // Don't return options that are disabled or in a disabled optgroup 8550 !option.disabled && 8551 ( !option.parentNode.disabled || 8552 !nodeName( option.parentNode, "optgroup" ) ) ) { 8553 8554 // Get the specific value for the option 8555 value = jQuery( option ).val(); 8556 8557 // We don't need an array for one selects 8558 if ( one ) { 8559 return value; 8560 } 8561 8562 // Multi-Selects return an array 8563 values.push( value ); 8564 } 8565 } 8566 8567 return values; 8568 }, 8569 8570 set: function( elem, value ) { 8571 var optionSet, option, 8572 options = elem.options, 8573 values = jQuery.makeArray( value ), 8574 i = options.length; 8575 8576 while ( i-- ) { 8577 option = options[ i ]; 8578 8579 /* eslint-disable no-cond-assign */ 8580 8581 if ( option.selected = 8582 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 8583 ) { 8584 optionSet = true; 8585 } 8586 8587 /* eslint-enable no-cond-assign */ 8588 } 8589 8590 // Force browsers to behave consistently when non-matching value is set 8591 if ( !optionSet ) { 8592 elem.selectedIndex = -1; 8593 } 8594 return values; 8595 } 8596 } 8597 } 8598} ); 8599 8600// Radios and checkboxes getter/setter 8601jQuery.each( [ "radio", "checkbox" ], function() { 8602 jQuery.valHooks[ this ] = { 8603 set: function( elem, value ) { 8604 if ( Array.isArray( value ) ) { 8605 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 8606 } 8607 } 8608 }; 8609 if ( !support.checkOn ) { 8610 jQuery.valHooks[ this ].get = function( elem ) { 8611 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 8612 }; 8613 } 8614} ); 8615 8616 8617 8618 8619// Return jQuery for attributes-only inclusion 8620 8621 8622support.focusin = "onfocusin" in window; 8623 8624 8625var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 8626 stopPropagationCallback = function( e ) { 8627 e.stopPropagation(); 8628 }; 8629 8630jQuery.extend( jQuery.event, { 8631 8632 trigger: function( event, data, elem, onlyHandlers ) { 8633 8634 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 8635 eventPath = [ elem || document ], 8636 type = hasOwn.call( event, "type" ) ? event.type : event, 8637 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 8638 8639 cur = lastElement = tmp = elem = elem || document; 8640 8641 // Don't do events on text and comment nodes 8642 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 8643 return; 8644 } 8645 8646 // focus/blur morphs to focusin/out; ensure we're not firing them right now 8647 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 8648 return; 8649 } 8650 8651 if ( type.indexOf( "." ) > -1 ) { 8652 8653 // Namespaced trigger; create a regexp to match event type in handle() 8654 namespaces = type.split( "." ); 8655 type = namespaces.shift(); 8656 namespaces.sort(); 8657 } 8658 ontype = type.indexOf( ":" ) < 0 && "on" + type; 8659 8660 // Caller can pass in a jQuery.Event object, Object, or just an event type string 8661 event = event[ jQuery.expando ] ? 8662 event : 8663 new jQuery.Event( type, typeof event === "object" && event ); 8664 8665 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 8666 event.isTrigger = onlyHandlers ? 2 : 3; 8667 event.namespace = namespaces.join( "." ); 8668 event.rnamespace = event.namespace ? 8669 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 8670 null; 8671 8672 // Clean up the event in case it is being reused 8673 event.result = undefined; 8674 if ( !event.target ) { 8675 event.target = elem; 8676 } 8677 8678 // Clone any incoming data and prepend the event, creating the handler arg list 8679 data = data == null ? 8680 [ event ] : 8681 jQuery.makeArray( data, [ event ] ); 8682 8683 // Allow special events to draw outside the lines 8684 special = jQuery.event.special[ type ] || {}; 8685 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 8686 return; 8687 } 8688 8689 // Determine event propagation path in advance, per W3C events spec (#9951) 8690 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 8691 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 8692 8693 bubbleType = special.delegateType || type; 8694 if ( !rfocusMorph.test( bubbleType + type ) ) { 8695 cur = cur.parentNode; 8696 } 8697 for ( ; cur; cur = cur.parentNode ) { 8698 eventPath.push( cur ); 8699 tmp = cur; 8700 } 8701 8702 // Only add window if we got to document (e.g., not plain obj or detached DOM) 8703 if ( tmp === ( elem.ownerDocument || document ) ) { 8704 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 8705 } 8706 } 8707 8708 // Fire handlers on the event path 8709 i = 0; 8710 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 8711 lastElement = cur; 8712 event.type = i > 1 ? 8713 bubbleType : 8714 special.bindType || type; 8715 8716 // jQuery handler 8717 handle = ( dataPriv.get( cur, "events" ) ||
vendor: 11,690 bytes, lines 8717-9159
8717Object.create( null ) )[ event.type ] && 8718 dataPriv.get( cur, "handle" ); 8719 if ( handle ) { 8720 handle.apply( cur, data ); 8721 } 8722 8723 // Native handler 8724 handle = ontype && cur[ ontype ]; 8725 if ( handle && handle.apply && acceptData( cur ) ) { 8726 event.result = handle.apply( cur, data ); 8727 if ( event.result === false ) { 8728 event.preventDefault(); 8729 } 8730 } 8731 } 8732 event.type = type; 8733 8734 // If nobody prevented the default action, do it now 8735 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 8736 8737 if ( ( !special._default || 8738 special._default.apply( eventPath.pop(), data ) === false ) && 8739 acceptData( elem ) ) { 8740 8741 // Call a native DOM method on the target with the same name as the event. 8742 // Don't do default actions on window, that's where global variables be (#6170) 8743 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 8744 8745 // Don't re-trigger an onFOO event when we call its FOO() method 8746 tmp = elem[ ontype ]; 8747 8748 if ( tmp ) { 8749 elem[ ontype ] = null; 8750 } 8751 8752 // Prevent re-triggering of the same event, since we already bubbled it above 8753 jQuery.event.triggered = type; 8754 8755 if ( event.isPropagationStopped() ) { 8756 lastElement.addEventListener( type, stopPropagationCallback ); 8757 } 8758 8759 elem[ type ](); 8760 8761 if ( event.isPropagationStopped() ) { 8762 lastElement.removeEventListener( type, stopPropagationCallback ); 8763 } 8764 8765 jQuery.event.triggered = undefined; 8766 8767 if ( tmp ) { 8768 elem[ ontype ] = tmp; 8769 } 8770 } 8771 } 8772 } 8773 8774 return event.result; 8775 }, 8776 8777 // Piggyback on a donor event to simulate a different one 8778 // Used only for `focus(in | out)` events 8779 simulate: function( type, elem, event ) { 8780 var e = jQuery.extend( 8781 new jQuery.Event(), 8782 event, 8783 { 8784 type: type, 8785 isSimulated: true 8786 } 8787 ); 8788 8789 jQuery.event.trigger( e, null, elem ); 8790 } 8791 8792} ); 8793 8794jQuery.fn.extend( { 8795 8796 trigger: function( type, data ) { 8797 return this.each( function() { 8798 jQuery.event.trigger( type, data, this ); 8799 } ); 8800 }, 8801 triggerHandler: function( type, data ) { 8802 var elem = this[ 0 ]; 8803 if ( elem ) { 8804 return jQuery.event.trigger( type, data, elem, true ); 8805 } 8806 } 8807} ); 8808 8809 8810// Support: Firefox <=44 8811// Firefox doesn't have focus(in | out) events 8812// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 8813// 8814// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 8815// focus(in | out) events fire after focus & blur events, 8816// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 8817// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 8818if ( !support.focusin ) { 8819 jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { 8820 8821 // Attach a single capturing handler on the document while someone wants focusin/focusout 8822 var handler = function( event ) { 8823 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); 8824 }; 8825 8826 jQuery.event.special[ fix ] = { 8827 setup: function() { 8828 8829 // Handle: regular nodes (via `this.ownerDocument`), window 8830 // (via `this.document`) & document (via `this`). 8831 var doc = this.ownerDocument || this.document || this, 8832 attaches = dataPriv.access( doc, fix ); 8833 8834 if ( !attaches ) { 8835 doc.addEventListener( orig, handler, true ); 8836 } 8837 dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); 8838 }, 8839 teardown: function() { 8840 var doc = this.ownerDocument || this.document || this, 8841 attaches = dataPriv.access( doc, fix ) - 1; 8842 8843 if ( !attaches ) { 8844 doc.removeEventListener( orig, handler, true ); 8845 dataPriv.remove( doc, fix ); 8846 8847 } else { 8848 dataPriv.access( doc, fix, attaches ); 8849 } 8850 } 8851 }; 8852 } ); 8853} 8854var location = window.location; 8855 8856var nonce = { guid: Date.now() }; 8857 8858var rquery = ( /\?/ ); 8859 8860 8861 8862// Cross-browser xml parsing 8863jQuery.parseXML = function( data ) { 8864 var xml, parserErrorElem; 8865 if ( !data || typeof data !== "string" ) { 8866 return null; 8867 } 8868 8869 // Support: IE 9 - 11 only 8870 // IE throws on parseFromString with invalid input. 8871 try { 8872 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 8873 } catch ( e ) {} 8874 8875 parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; 8876 if ( !xml || parserErrorElem ) { 8877 jQuery.error( "Invalid XML: " + ( 8878 parserErrorElem ? 8879 jQuery.map( parserErrorElem.childNodes, function( el ) { 8880 return el.textContent; 8881 } ).join( "\n" ) : 8882 data 8883 ) ); 8884 } 8885 return xml; 8886}; 8887 8888 8889var 8890 rbracket = /\[\]$/, 8891 rCRLF = /\r?\n/g, 8892 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 8893 rsubmittable = /^(?:input|select|textarea|keygen)/i; 8894 8895function buildParams( prefix, obj, traditional, add ) { 8896 var name; 8897 8898 if ( Array.isArray( obj ) ) { 8899 8900 // Serialize array item. 8901 jQuery.each( obj, function( i, v ) { 8902 if ( traditional || rbracket.test( prefix ) ) { 8903 8904 // Treat each array item as a scalar. 8905 add( prefix, v ); 8906 8907 } else { 8908 8909 // Item is non-scalar (array or object), encode its numeric index. 8910 buildParams( 8911 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 8912 v, 8913 traditional, 8914 add 8915 ); 8916 } 8917 } ); 8918 8919 } else if ( !traditional && toType( obj ) === "object" ) { 8920 8921 // Serialize object item. 8922 for ( name in obj ) { 8923 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 8924 } 8925 8926 } else { 8927 8928 // Serialize scalar item. 8929 add( prefix, obj ); 8930 } 8931} 8932 8933// Serialize an array of form elements or a set of 8934// key/values into a query string 8935jQuery.param = function( a, traditional ) { 8936 var prefix, 8937 s = [], 8938 add = function( key, valueOrFunction ) { 8939 8940 // If value is a function, invoke it and use its return value 8941 var value = isFunction( valueOrFunction ) ? 8942 valueOrFunction() : 8943 valueOrFunction; 8944 8945 s[ s.length ] = encodeURIComponent( key ) + "=" + 8946 encodeURIComponent( value == null ? "" : value ); 8947 }; 8948 8949 if ( a == null ) { 8950 return ""; 8951 } 8952 8953 // If an array was passed in, assume that it is an array of form elements. 8954 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 8955 8956 // Serialize the form elements 8957 jQuery.each( a, function() { 8958 add( this.name, this.value ); 8959 } ); 8960 8961 } else { 8962 8963 // If traditional, encode the "old" way (the way 1.3.2 or older 8964 // did it), otherwise encode params recursively. 8965 for ( prefix in a ) { 8966 buildParams( prefix, a[ prefix ], traditional, add ); 8967 } 8968 } 8969 8970 // Return the resulting serialization 8971 return s.join( "&" ); 8972}; 8973 8974jQuery.fn.extend( { 8975 serialize: function() { 8976 return jQuery.param( this.serializeArray() ); 8977 }, 8978 serializeArray: function() { 8979 return this.map( function() { 8980 8981 // Can add propHook for "elements" to filter or add form elements 8982 var elements = jQuery.prop( this, "elements" ); 8983 return elements ? jQuery.makeArray( elements ) : this; 8984 } ).filter( function() { 8985 var type = this.type; 8986 8987 // Use .is( ":disabled" ) so that fieldset[disabled] works 8988 return this.name && !jQuery( this ).is( ":disabled" ) && 8989 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 8990 ( this.checked || !rcheckableType.test( type ) ); 8991 } ).map( function( _i, elem ) { 8992 var val = jQuery( this ).val(); 8993 8994 if ( val == null ) { 8995 return null; 8996 } 8997 8998 if ( Array.isArray( val ) ) { 8999 return jQuery.map( val, function( val ) { 9000 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 9001 } ); 9002 } 9003 9004 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 9005 } ).get(); 9006 } 9007} ); 9008 9009 9010var 9011 r20 = /%20/g, 9012 rhash = /#.*$/, 9013 rantiCache = /([?&])_=[^&]*/, 9014 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 9015 9016 // #7653, #8125, #8152: local protocol detection 9017 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 9018 rnoContent = /^(?:GET|HEAD)$/, 9019 rprotocol = /^\/\//, 9020 9021 /* Prefilters 9022 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 9023 * 2) These are called: 9024 * - BEFORE asking for a transport 9025 * - AFTER param serialization (s.data is a string if s.processData is true) 9026 * 3) key is the dataType 9027 * 4) the catchall symbol "*" can be used 9028 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 9029 */ 9030 prefilters = {}, 9031 9032 /* Transports bindings 9033 * 1) key is the dataType 9034 * 2) the catchall symbol "*" can be used 9035 * 3) selection will start with transport dataType and THEN go to "*" if needed 9036 */ 9037 transports = {}, 9038 9039 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 9040 allTypes = "*/".concat( "*" ), 9041 9042 // Anchor tag for parsing the document origin 9043 originAnchor = document.createElement( "a" ); 9044 9045originAnchor.href = location.href; 9046 9047// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 9048function addToPrefiltersOrTransports( structure ) { 9049 9050 // dataTypeExpression is optional and defaults to "*" 9051 return function( dataTypeExpression, func ) { 9052 9053 if ( typeof dataTypeExpression !== "string" ) { 9054 func = dataTypeExpression; 9055 dataTypeExpression = "*"; 9056 } 9057 9058 var dataType, 9059 i = 0, 9060 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 9061 9062 if ( isFunction( func ) ) { 9063 9064 // For each dataType in the dataTypeExpression 9065 while ( ( dataType = dataTypes[ i++ ] ) ) { 9066 9067 // Prepend if requested 9068 if ( dataType[ 0 ] === "+" ) { 9069 dataType = dataType.slice( 1 ) || "*"; 9070 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 9071 9072 // Otherwise append 9073 } else { 9074 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 9075 } 9076 } 9077 } 9078 }; 9079} 9080 9081// Base inspection function for prefilters and transports 9082function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 9083 9084 var inspected = {}, 9085 seekingTransport = ( structure === transports ); 9086 9087 function inspect( dataType ) { 9088 var selected; 9089 inspected[ dataType ] = true; 9090 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 9091 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 9092 if ( typeof dataTypeOrTransport === "string" && 9093 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 9094 9095 options.dataTypes.unshift( dataTypeOrTransport ); 9096 inspect( dataTypeOrTransport ); 9097 return false; 9098 } else if ( seekingTransport ) { 9099 return !( selected = dataTypeOrTransport ); 9100 } 9101 } ); 9102 return selected; 9103 } 9104 9105 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 9106} 9107 9108// A special extend for ajax options 9109// that takes "flat" options (not to be deep extended) 9110// Fixes #9887 9111function ajaxExtend( target, src ) { 9112 var key, deep, 9113 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 9114 9115 for ( key in src ) { 9116 if ( src[ key ] !== undefined ) { 9117 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 9118 } 9119 } 9120 if ( deep ) { 9121 jQuery.extend( true, target, deep ); 9122 } 9123 9124 return target; 9125} 9126 9127/* Handles responses to an ajax request: 9128 * - finds the right dataType (mediates between content-type and expected dataType) 9129 * - returns the corresponding response 9130 */ 9131function ajaxHandleResponses( s, jqXHR, responses ) { 9132 9133 var ct, type, finalDataType, firstDataType, 9134 contents = s.contents, 9135 dataTypes = s.dataTypes; 9136 9137 // Remove auto dataType and get content-type in the process 9138 while ( dataTypes[ 0 ] === "*" ) { 9139 dataTypes.shift(); 9140 if ( ct === undefined ) { 9141 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 9142 } 9143 } 9144 9145 // Check if we're dealing with a known content-type 9146 if ( ct ) { 9147 for ( type in contents ) { 9148 if ( contents[ type ] && contents[ type ].test( ct ) ) { 9149 dataTypes.unshift( type ); 9150 break; 9151 } 9152 } 9153 } 9154 9155 // Check to see if we have a response for the expected dataType 9156 if ( dataTypes[ 0 ] in responses ) { 9157 finalDataType = dataTypes[ 0 ]; 9158 } else { 9159
vendor: 9,143 bytes, lines 9160-9535
9160 // Try convertible dataTypes 9161 for ( type in responses ) { 9162 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 9163 finalDataType = type; 9164 break; 9165 } 9166 if ( !firstDataType ) { 9167 firstDataType = type; 9168 } 9169 } 9170 9171 // Or just use first one 9172 finalDataType = finalDataType || firstDataType; 9173 } 9174 9175 // If we found a dataType 9176 // We add the dataType to the list if needed 9177 // and return the corresponding response 9178 if ( finalDataType ) { 9179 if ( finalDataType !== dataTypes[ 0 ] ) { 9180 dataTypes.unshift( finalDataType ); 9181 } 9182 return responses[ finalDataType ]; 9183 } 9184} 9185 9186/* Chain conversions given the request and the original response 9187 * Also sets the responseXXX fields on the jqXHR instance 9188 */ 9189function ajaxConvert( s, response, jqXHR, isSuccess ) { 9190 var conv2, current, conv, tmp, prev, 9191 converters = {}, 9192 9193 // Work with a copy of dataTypes in case we need to modify it for conversion 9194 dataTypes = s.dataTypes.slice(); 9195 9196 // Create converters map with lowercased keys 9197 if ( dataTypes[ 1 ] ) { 9198 for ( conv in s.converters ) { 9199 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 9200 } 9201 } 9202 9203 current = dataTypes.shift(); 9204 9205 // Convert to each sequential dataType 9206 while ( current ) { 9207 9208 if ( s.responseFields[ current ] ) { 9209 jqXHR[ s.responseFields[ current ] ] = response; 9210 } 9211 9212 // Apply the dataFilter if provided 9213 if ( !prev && isSuccess && s.dataFilter ) { 9214 response = s.dataFilter( response, s.dataType ); 9215 } 9216 9217 prev = current; 9218 current = dataTypes.shift(); 9219 9220 if ( current ) { 9221 9222 // There's only work to do if current dataType is non-auto 9223 if ( current === "*" ) { 9224 9225 current = prev; 9226 9227 // Convert response if prev dataType is non-auto and differs from current 9228 } else if ( prev !== "*" && prev !== current ) { 9229 9230 // Seek a direct converter 9231 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 9232 9233 // If none found, seek a pair 9234 if ( !conv ) { 9235 for ( conv2 in converters ) { 9236 9237 // If conv2 outputs current 9238 tmp = conv2.split( " " ); 9239 if ( tmp[ 1 ] === current ) { 9240 9241 // If prev can be converted to accepted input 9242 conv = converters[ prev + " " + tmp[ 0 ] ] || 9243 converters[ "* " + tmp[ 0 ] ]; 9244 if ( conv ) { 9245 9246 // Condense equivalence converters 9247 if ( conv === true ) { 9248 conv = converters[ conv2 ]; 9249 9250 // Otherwise, insert the intermediate dataType 9251 } else if ( converters[ conv2 ] !== true ) { 9252 current = tmp[ 0 ]; 9253 dataTypes.unshift( tmp[ 1 ] ); 9254 } 9255 break; 9256 } 9257 } 9258 } 9259 } 9260 9261 // Apply converter (if not an equivalence) 9262 if ( conv !== true ) { 9263 9264 // Unless errors are allowed to bubble, catch and return them 9265 if ( conv && s.throws ) { 9266 response = conv( response ); 9267 } else { 9268 try { 9269 response = conv( response ); 9270 } catch ( e ) { 9271 return { 9272 state: "parsererror", 9273 error: conv ? e : "No conversion from " + prev + " to " + current 9274 }; 9275 } 9276 } 9277 } 9278 } 9279 } 9280 } 9281 9282 return { state: "success", data: response }; 9283} 9284 9285jQuery.extend( { 9286 9287 // Counter for holding the number of active queries 9288 active: 0, 9289 9290 // Last-Modified header cache for next request 9291 lastModified: {}, 9292 etag: {}, 9293 9294 ajaxSettings: { 9295 url: location.href, 9296 type: "GET", 9297 isLocal: rlocalProtocol.test( location.protocol ), 9298 global: true, 9299 processData: true, 9300 async: true, 9301 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 9302 9303 /* 9304 timeout: 0, 9305 data: null, 9306 dataType: null, 9307 username: null, 9308 password: null, 9309 cache: null, 9310 throws: false, 9311 traditional: false, 9312 headers: {}, 9313 */ 9314 9315 accepts: { 9316 "*": allTypes, 9317 text: "text/plain", 9318 html: "text/html", 9319 xml: "application/xml, text/xml", 9320 json: "application/json, text/javascript" 9321 }, 9322 9323 contents: { 9324 xml: /\bxml\b/, 9325 html: /\bhtml/, 9326 json: /\bjson\b/ 9327 }, 9328 9329 responseFields: { 9330 xml: "responseXML", 9331 text: "responseText", 9332 json: "responseJSON" 9333 }, 9334 9335 // Data converters 9336 // Keys separate source (or catchall "*") and destination types with a single space 9337 converters: { 9338 9339 // Convert anything to text 9340 "* text": String, 9341 9342 // Text to html (true = no transformation) 9343 "text html": true, 9344 9345 // Evaluate text as a json expression 9346 "text json": JSON.parse, 9347 9348 // Parse text as xml 9349 "text xml": jQuery.parseXML 9350 }, 9351 9352 // For options that shouldn't be deep extended: 9353 // you can add your own custom options here if 9354 // and when you create one that shouldn't be 9355 // deep extended (see ajaxExtend) 9356 flatOptions: { 9357 url: true, 9358 context: true 9359 } 9360 }, 9361 9362 // Creates a full fledged settings object into target 9363 // with both ajaxSettings and settings fields. 9364 // If target is omitted, writes into ajaxSettings. 9365 ajaxSetup: function( target, settings ) { 9366 return settings ? 9367 9368 // Building a settings object 9369 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 9370 9371 // Extending ajaxSettings 9372 ajaxExtend( jQuery.ajaxSettings, target ); 9373 }, 9374 9375 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 9376 ajaxTransport: addToPrefiltersOrTransports( transports ), 9377 9378 // Main method 9379 ajax: function( url, options ) { 9380 9381 // If url is an object, simulate pre-1.5 signature 9382 if ( typeof url === "object" ) { 9383 options = url; 9384 url = undefined; 9385 } 9386 9387 // Force options to be an object 9388 options = options || {}; 9389 9390 var transport, 9391 9392 // URL without anti-cache param 9393 cacheURL, 9394 9395 // Response headers 9396 responseHeadersString, 9397 responseHeaders, 9398 9399 // timeout handle 9400 timeoutTimer, 9401 9402 // Url cleanup var 9403 urlAnchor, 9404 9405 // Request state (becomes false upon send and true upon completion) 9406 completed, 9407 9408 // To know if global events are to be dispatched 9409 fireGlobals, 9410 9411 // Loop variable 9412 i, 9413 9414 // uncached part of the url 9415 uncached, 9416 9417 // Create the final options object 9418 s = jQuery.ajaxSetup( {}, options ), 9419 9420 // Callbacks context 9421 callbackContext = s.context || s, 9422 9423 // Context for global events is callbackContext if it is a DOM node or jQuery collection 9424 globalEventContext = s.context && 9425 ( callbackContext.nodeType || callbackContext.jquery ) ? 9426 jQuery( callbackContext ) : 9427 jQuery.event, 9428 9429 // Deferreds 9430 deferred = jQuery.Deferred(), 9431 completeDeferred = jQuery.Callbacks( "once memory" ), 9432 9433 // Status-dependent callbacks 9434 statusCode = s.statusCode || {}, 9435 9436 // Headers (they are sent all at once) 9437 requestHeaders = {}, 9438 requestHeadersNames = {}, 9439 9440 // Default abort message 9441 strAbort = "canceled", 9442 9443 // Fake xhr 9444 jqXHR = { 9445 readyState: 0, 9446 9447 // Builds headers hashtable if needed 9448 getResponseHeader: function( key ) { 9449 var match; 9450 if ( completed ) { 9451 if ( !responseHeaders ) { 9452 responseHeaders = {}; 9453 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 9454 responseHeaders[ match[ 1 ].toLowerCase() + " " ] = 9455 ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) 9456 .concat( match[ 2 ] ); 9457 } 9458 } 9459 match = responseHeaders[ key.toLowerCase() + " " ]; 9460 } 9461 return match == null ? null : match.join( ", " ); 9462 }, 9463 9464 // Raw string 9465 getAllResponseHeaders: function() { 9466 return completed ? responseHeadersString : null; 9467 }, 9468 9469 // Caches the header 9470 setRequestHeader: function( name, value ) { 9471 if ( completed == null ) { 9472 name = requestHeadersNames[ name.toLowerCase() ] = 9473 requestHeadersNames[ name.toLowerCase() ] || name; 9474 requestHeaders[ name ] = value; 9475 } 9476 return this; 9477 }, 9478 9479 // Overrides response content-type header 9480 overrideMimeType: function( type ) { 9481 if ( completed == null ) { 9482 s.mimeType = type; 9483 } 9484 return this; 9485 }, 9486 9487 // Status-dependent callbacks 9488 statusCode: function( map ) { 9489 var code; 9490 if ( map ) { 9491 if ( completed ) { 9492 9493 // Execute the appropriate callbacks 9494 jqXHR.always( map[ jqXHR.status ] ); 9495 } else { 9496 9497 // Lazy-add the new callbacks in a way that preserves old ones 9498 for ( code in map ) { 9499 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 9500 } 9501 } 9502 } 9503 return this; 9504 }, 9505 9506 // Cancel the request 9507 abort: function( statusText ) { 9508 var finalText = statusText || strAbort; 9509 if ( transport ) { 9510 transport.abort( finalText ); 9511 } 9512 done( 0, finalText ); 9513 return this; 9514 } 9515 }; 9516 9517 // Attach deferreds 9518 deferred.promise( jqXHR ); 9519 9520 // Add protocol if not provided (prefilters might expect it) 9521 // Handle falsy url in the settings object (#10093: consistency with old signature) 9522 // We also use the url parameter if available 9523 s.url = ( ( url || s.url || location.href ) + "" ) 9524 .replace( rprotocol, location.protocol + "//" ); 9525 9526 // Alias method option to type as per ticket #12004 9527 s.type = options.method || options.type || s.method || s.type; 9528 9529 // Extract dataTypes list 9530 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 9531 9532 // A cross-domain request is in order when the origin doesn't match the current origin. 9533 if ( s.crossDomain == null ) { 9534 urlAnchor = document.createElement( "a" ); 9535
vendor: 9,646 bytes, lines 9536-9886
9536 // Support: IE <=8 - 11, Edge 12 - 15 9537 // IE throws exception on accessing the href property if url is malformed, 9538 // e.g. http://example.com:80x/ 9539 try { 9540 urlAnchor.href = s.url; 9541 9542 // Support: IE <=8 - 11 only 9543 // Anchor's host property isn't correctly set when s.url is relative 9544 urlAnchor.href = urlAnchor.href; 9545 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 9546 urlAnchor.protocol + "//" + urlAnchor.host; 9547 } catch ( e ) { 9548 9549 // If there is an error parsing the URL, assume it is crossDomain, 9550 // it can be rejected by the transport if it is invalid 9551 s.crossDomain = true; 9552 } 9553 } 9554 9555 // Convert data if not already a string 9556 if ( s.data && s.processData && typeof s.data !== "string" ) { 9557 s.data = jQuery.param( s.data, s.traditional ); 9558 } 9559 9560 // Apply prefilters 9561 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 9562 9563 // If request was aborted inside a prefilter, stop there 9564 if ( completed ) { 9565 return jqXHR; 9566 } 9567 9568 // We can fire global events as of now if asked to 9569 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 9570 fireGlobals = jQuery.event && s.global; 9571 9572 // Watch for a new set of requests 9573 if ( fireGlobals && jQuery.active++ === 0 ) { 9574 jQuery.event.trigger( "ajaxStart" ); 9575 } 9576 9577 // Uppercase the type 9578 s.type = s.type.toUpperCase(); 9579 9580 // Determine if request has content 9581 s.hasContent = !rnoContent.test( s.type ); 9582 9583 // Save the URL in case we're toying with the If-Modified-Since 9584 // and/or If-None-Match header later on 9585 // Remove hash to simplify url manipulation 9586 cacheURL = s.url.replace( rhash, "" ); 9587 9588 // More options handling for requests with no content 9589 if ( !s.hasContent ) { 9590 9591 // Remember the hash so we can put it back 9592 uncached = s.url.slice( cacheURL.length ); 9593 9594 // If data is available and should be processed, append data to url 9595 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 9596 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 9597 9598 // #9682: remove data so that it's not used in an eventual retry 9599 delete s.data; 9600 } 9601 9602 // Add or update anti-cache param if needed 9603 if ( s.cache === false ) { 9604 cacheURL = cacheURL.replace( rantiCache, "$1" ); 9605 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + 9606 uncached; 9607 } 9608 9609 // Put hash and anti-cache on the URL that will be requested (gh-1732) 9610 s.url = cacheURL + uncached; 9611 9612 // Change '%20' to '+' if this is encoded form body content (gh-2658) 9613 } else if ( s.data && s.processData && 9614 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 9615 s.data = s.data.replace( r20, "+" ); 9616 } 9617 9618 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9619 if ( s.ifModified ) { 9620 if ( jQuery.lastModified[ cacheURL ] ) { 9621 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 9622 } 9623 if ( jQuery.etag[ cacheURL ] ) { 9624 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 9625 } 9626 } 9627 9628 // Set the correct header, if data is being sent 9629 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 9630 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 9631 } 9632 9633 // Set the Accepts header for the server, depending on the dataType 9634 jqXHR.setRequestHeader( 9635 "Accept", 9636 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 9637 s.accepts[ s.dataTypes[ 0 ] ] + 9638 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 9639 s.accepts[ "*" ] 9640 ); 9641 9642 // Check for headers option 9643 for ( i in s.headers ) { 9644 jqXHR.setRequestHeader( i, s.headers[ i ] ); 9645 } 9646 9647 // Allow custom headers/mimetypes and early abort 9648 if ( s.beforeSend && 9649 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 9650 9651 // Abort if not done already and return 9652 return jqXHR.abort(); 9653 } 9654 9655 // Aborting is no longer a cancellation 9656 strAbort = "abort"; 9657 9658 // Install callbacks on deferreds 9659 completeDeferred.add( s.complete ); 9660 jqXHR.done( s.success ); 9661 jqXHR.fail( s.error ); 9662 9663 // Get transport 9664 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 9665 9666 // If no transport, we auto-abort 9667 if ( !transport ) { 9668 done( -1, "No Transport" ); 9669 } else { 9670 jqXHR.readyState = 1; 9671 9672 // Send global event 9673 if ( fireGlobals ) { 9674 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 9675 } 9676 9677 // If request was aborted inside ajaxSend, stop there 9678 if ( completed ) { 9679 return jqXHR; 9680 } 9681 9682 // Timeout 9683 if ( s.async && s.timeout > 0 ) { 9684 timeoutTimer = window.setTimeout( function() { 9685 jqXHR.abort( "timeout" ); 9686 }, s.timeout ); 9687 } 9688 9689 try { 9690 completed = false; 9691 transport.send( requestHeaders, done ); 9692 } catch ( e ) { 9693 9694 // Rethrow post-completion exceptions 9695 if ( completed ) { 9696 throw e; 9697 } 9698 9699 // Propagate others as results 9700 done( -1, e ); 9701 } 9702 } 9703 9704 // Callback for when everything is done 9705 function done( status, nativeStatusText, responses, headers ) { 9706 var isSuccess, success, error, response, modified, 9707 statusText = nativeStatusText; 9708 9709 // Ignore repeat invocations 9710 if ( completed ) { 9711 return; 9712 } 9713 9714 completed = true; 9715 9716 // Clear timeout if it exists 9717 if ( timeoutTimer ) { 9718 window.clearTimeout( timeoutTimer ); 9719 } 9720 9721 // Dereference transport for early garbage collection 9722 // (no matter how long the jqXHR object will be used) 9723 transport = undefined; 9724 9725 // Cache response headers 9726 responseHeadersString = headers || ""; 9727 9728 // Set readyState 9729 jqXHR.readyState = status > 0 ? 4 : 0; 9730 9731 // Determine if successful 9732 isSuccess = status >= 200 && status < 300 || status === 304; 9733 9734 // Get response data 9735 if ( responses ) { 9736 response = ajaxHandleResponses( s, jqXHR, responses ); 9737 } 9738 9739 // Use a noop converter for missing script but not if jsonp 9740 if ( !isSuccess && 9741 jQuery.inArray( "script", s.dataTypes ) > -1 && 9742 jQuery.inArray( "json", s.dataTypes ) < 0 ) { 9743 s.converters[ "text script" ] = function() {}; 9744 } 9745 9746 // Convert no matter what (that way responseXXX fields are always set) 9747 response = ajaxConvert( s, response, jqXHR, isSuccess ); 9748 9749 // If successful, handle type chaining 9750 if ( isSuccess ) { 9751 9752 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9753 if ( s.ifModified ) { 9754 modified = jqXHR.getResponseHeader( "Last-Modified" ); 9755 if ( modified ) { 9756 jQuery.lastModified[ cacheURL ] = modified; 9757 } 9758 modified = jqXHR.getResponseHeader( "etag" ); 9759 if ( modified ) { 9760 jQuery.etag[ cacheURL ] = modified; 9761 } 9762 } 9763 9764 // if no content 9765 if ( status === 204 || s.type === "HEAD" ) { 9766 statusText = "nocontent"; 9767 9768 // if not modified 9769 } else if ( status === 304 ) { 9770 statusText = "notmodified"; 9771 9772 // If we have data, let's convert it 9773 } else { 9774 statusText = response.state; 9775 success = response.data; 9776 error = response.error; 9777 isSuccess = !error; 9778 } 9779 } else { 9780 9781 // Extract error from statusText and normalize for non-aborts 9782 error = statusText; 9783 if ( status || !statusText ) { 9784 statusText = "error"; 9785 if ( status < 0 ) { 9786 status = 0; 9787 } 9788 } 9789 } 9790 9791 // Set data for the fake xhr object 9792 jqXHR.status = status; 9793 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 9794 9795 // Success/Error 9796 if ( isSuccess ) { 9797 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 9798 } else { 9799 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 9800 } 9801 9802 // Status-dependent callbacks 9803 jqXHR.statusCode( statusCode ); 9804 statusCode = undefined; 9805 9806 if ( fireGlobals ) { 9807 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 9808 [ jqXHR, s, isSuccess ? success : error ] ); 9809 } 9810 9811 // Complete 9812 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 9813 9814 if ( fireGlobals ) { 9815 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 9816 9817 // Handle the global AJAX counter 9818 if ( !( --jQuery.active ) ) { 9819 jQuery.event.trigger( "ajaxStop" ); 9820 } 9821 } 9822 } 9823 9824 return jqXHR; 9825 }, 9826 9827 getJSON: function( url, data, callback ) { 9828 return jQuery.get( url, data, callback, "json" ); 9829 }, 9830 9831 getScript: function( url, callback ) { 9832 return jQuery.get( url, undefined, callback, "script" ); 9833 } 9834} ); 9835 9836jQuery.each( [ "get", "post" ], function( _i, method ) { 9837 jQuery[ method ] = function( url, data, callback, type ) { 9838 9839 // Shift arguments if data argument was omitted 9840 if ( isFunction( data ) ) { 9841 type = type || callback; 9842 callback = data; 9843 data = undefined; 9844 } 9845 9846 // The url can be an options object (which then must have .url) 9847 return jQuery.ajax( jQuery.extend( { 9848 url: url, 9849 type: method, 9850 dataType: type, 9851 data: data, 9852 success: callback 9853 }, jQuery.isPlainObject( url ) && url ) ); 9854 }; 9855} ); 9856 9857jQuery.ajaxPrefilter( function( s ) { 9858 var i; 9859 for ( i in s.headers ) { 9860 if ( i.toLowerCase() === "content-type" ) { 9861 s.contentType = s.headers[ i ] || ""; 9862 } 9863 } 9864} ); 9865 9866 9867jQuery._evalUrl = function( url, options, doc ) { 9868 return jQuery.ajax( { 9869 url: url, 9870 9871 // Make this explicit, since user can override this through ajaxSetup (#11264) 9872 type: "GET", 9873 dataType: "script", 9874 cache: true, 9875 async: false, 9876 global: false, 9877 9878 // Only evaluate the response if it is successful (gh-4126) 9879 // dataFilter is not invoked for failure responses, so using it instead 9880 // of the default converter is kludgy but it works. 9881 converters: { 9882 "text script": function() {} 9883 }, 9884 dataFilter: function( response ) { 9885 jQuery.globalEval( response, options, doc ); 9886 }
vendor: 6,627 bytes, lines 9886-10169
9886 9887 } ); 9888}; 9889 9890 9891jQuery.fn.extend( { 9892 wrapAll: function( html ) { 9893 var wrap; 9894 9895 if ( this[ 0 ] ) { 9896 if ( isFunction( html ) ) { 9897 html = html.call( this[ 0 ] ); 9898 } 9899 9900 // The elements to wrap the target around 9901 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 9902 9903 if ( this[ 0 ].parentNode ) { 9904 wrap.insertBefore( this[ 0 ] ); 9905 } 9906 9907 wrap.map( function() { 9908 var elem = this; 9909 9910 while ( elem.firstElementChild ) { 9911 elem = elem.firstElementChild; 9912 } 9913 9914 return elem; 9915 } ).append( this ); 9916 } 9917 9918 return this; 9919 }, 9920 9921 wrapInner: function( html ) { 9922 if ( isFunction( html ) ) { 9923 return this.each( function( i ) { 9924 jQuery( this ).wrapInner( html.call( this, i ) ); 9925 } ); 9926 } 9927 9928 return this.each( function() { 9929 var self = jQuery( this ), 9930 contents = self.contents(); 9931 9932 if ( contents.length ) { 9933 contents.wrapAll( html ); 9934 9935 } else { 9936 self.append( html ); 9937 } 9938 } ); 9939 }, 9940 9941 wrap: function( html ) { 9942 var htmlIsFunction = isFunction( html ); 9943 9944 return this.each( function( i ) { 9945 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 9946 } ); 9947 }, 9948 9949 unwrap: function( selector ) { 9950 this.parent( selector ).not( "body" ).each( function() { 9951 jQuery( this ).replaceWith( this.childNodes ); 9952 } ); 9953 return this; 9954 } 9955} ); 9956 9957 9958jQuery.expr.pseudos.hidden = function( elem ) { 9959 return !jQuery.expr.pseudos.visible( elem ); 9960}; 9961jQuery.expr.pseudos.visible = function( elem ) { 9962 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 9963}; 9964 9965 9966 9967 9968jQuery.ajaxSettings.xhr = function() { 9969 try { 9970 return new window.XMLHttpRequest(); 9971 } catch ( e ) {} 9972}; 9973 9974var xhrSuccessStatus = { 9975 9976 // File protocol always yields status code 0, assume 200 9977 0: 200, 9978 9979 // Support: IE <=9 only 9980 // #1450: sometimes IE returns 1223 when it should be 204 9981 1223: 204 9982 }, 9983 xhrSupported = jQuery.ajaxSettings.xhr(); 9984 9985support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 9986support.ajax = xhrSupported = !!xhrSupported; 9987 9988jQuery.ajaxTransport( function( options ) { 9989 var callback, errorCallback; 9990 9991 // Cross domain only allowed if supported through XMLHttpRequest 9992 if ( support.cors || xhrSupported && !options.crossDomain ) { 9993 return { 9994 send: function( headers, complete ) { 9995 var i, 9996 xhr = options.xhr(); 9997 9998 xhr.open( 9999 options.type, 10000 options.url, 10001 options.async, 10002 options.username, 10003 options.password 10004 ); 10005 10006 // Apply custom fields if provided 10007 if ( options.xhrFields ) { 10008 for ( i in options.xhrFields ) { 10009 xhr[ i ] = options.xhrFields[ i ]; 10010 } 10011 } 10012 10013 // Override mime type if needed 10014 if ( options.mimeType && xhr.overrideMimeType ) { 10015 xhr.overrideMimeType( options.mimeType ); 10016 } 10017 10018 // X-Requested-With header 10019 // For cross-domain requests, seeing as conditions for a preflight are 10020 // akin to a jigsaw puzzle, we simply never set it to be sure. 10021 // (it can always be set on a per-request basis or even using ajaxSetup) 10022 // For same-domain requests, won't change header if already provided. 10023 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 10024 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 10025 } 10026 10027 // Set headers 10028 for ( i in headers ) { 10029 xhr.setRequestHeader( i, headers[ i ] ); 10030 } 10031 10032 // Callback 10033 callback = function( type ) { 10034 return function() { 10035 if ( callback ) { 10036 callback = errorCallback = xhr.onload = 10037 xhr.onerror = xhr.onabort = xhr.ontimeout = 10038 xhr.onreadystatechange = null; 10039 10040 if ( type === "abort" ) { 10041 xhr.abort(); 10042 } else if ( type === "error" ) { 10043 10044 // Support: IE <=9 only 10045 // On a manual native abort, IE9 throws 10046 // errors on any property access that is not readyState 10047 if ( typeof xhr.status !== "number" ) { 10048 complete( 0, "error" ); 10049 } else { 10050 complete( 10051 10052 // File: protocol always yields status 0; see #8605, #14207 10053 xhr.status, 10054 xhr.statusText 10055 ); 10056 } 10057 } else { 10058 complete( 10059 xhrSuccessStatus[ xhr.status ] || xhr.status, 10060 xhr.statusText, 10061 10062 // Support: IE <=9 only 10063 // IE9 has no XHR2 but throws on binary (trac-11426) 10064 // For XHR2 non-text, let the caller handle it (gh-2498) 10065 ( xhr.responseType || "text" ) !== "text" || 10066 typeof xhr.responseText !== "string" ? 10067 { binary: xhr.response } : 10068 { text: xhr.responseText }, 10069 xhr.getAllResponseHeaders() 10070 ); 10071 } 10072 } 10073 }; 10074 }; 10075 10076 // Listen to events 10077 xhr.onload = callback(); 10078 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 10079 10080 // Support: IE 9 only 10081 // Use onreadystatechange to replace onabort 10082 // to handle uncaught aborts 10083 if ( xhr.onabort !== undefined ) { 10084 xhr.onabort = errorCallback; 10085 } else { 10086 xhr.onreadystatechange = function() { 10087 10088 // Check readyState before timeout as it changes 10089 if ( xhr.readyState === 4 ) { 10090 10091 // Allow onerror to be called first, 10092 // but that will not handle a native abort 10093 // Also, save errorCallback to a variable 10094 // as xhr.onerror cannot be accessed 10095 window.setTimeout( function() { 10096 if ( callback ) { 10097 errorCallback(); 10098 } 10099 } ); 10100 } 10101 }; 10102 } 10103 10104 // Create the abort callback 10105 callback = callback( "abort" ); 10106 10107 try { 10108 10109 // Do send the request (this may raise an exception) 10110 xhr.send( options.hasContent && options.data || null ); 10111 } catch ( e ) { 10112 10113 // #14683: Only rethrow if this hasn't been notified as an error yet 10114 if ( callback ) { 10115 throw e; 10116 } 10117 } 10118 }, 10119 10120 abort: function() { 10121 if ( callback ) { 10122 callback(); 10123 } 10124 } 10125 }; 10126 } 10127} ); 10128 10129 10130 10131 10132// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 10133jQuery.ajaxPrefilter( function( s ) { 10134 if ( s.crossDomain ) { 10135 s.contents.script = false; 10136 } 10137} ); 10138 10139// Install script dataType 10140jQuery.ajaxSetup( { 10141 accepts: { 10142 script: "text/javascript, application/javascript, " + 10143 "application/ecmascript, application/x-ecmascript" 10144 }, 10145 contents: { 10146 script: /\b(?:java|ecma)script\b/ 10147 }, 10148 converters: { 10149 "text script": function( text ) { 10150 jQuery.globalEval( text ); 10151 return text; 10152 } 10153 } 10154} ); 10155 10156// Handle cache's special case and crossDomain 10157jQuery.ajaxPrefilter( "script", function( s ) { 10158 if ( s.cache === undefined ) { 10159 s.cache = false; 10160 } 10161 if ( s.crossDomain ) { 10162 s.type = "GET"; 10163 } 10164} ); 10165 10166// Bind script tag hack transport 10167jQuery.ajaxTransport( "script", function( s ) { 10168 10169 // This transport only deals with cross domain
vendor: 15,734 bytes, lines 10169-10733
10169or forced-by-attrs requests 10170 if ( s.crossDomain || s.scriptAttrs ) { 10171 var script, callback; 10172 return { 10173 send: function( _, complete ) { 10174 script = jQuery( "<script>" ) 10175 .attr( s.scriptAttrs || {} ) 10176 .prop( { charset: s.scriptCharset, src: s.url } ) 10177 .on( "load error", callback = function( evt ) { 10178 script.remove(); 10179 callback = null; 10180 if ( evt ) { 10181 complete( evt.type === "error" ? 404 : 200, evt.type ); 10182 } 10183 } ); 10184 10185 // Use native DOM manipulation to avoid our domManip AJAX trickery 10186 document.head.appendChild( script[ 0 ] ); 10187 }, 10188 abort: function() { 10189 if ( callback ) { 10190 callback(); 10191 } 10192 } 10193 }; 10194 } 10195} ); 10196 10197 10198 10199 10200var oldCallbacks = [], 10201 rjsonp = /(=)\?(?=&|$)|\?\?/; 10202 10203// Default jsonp settings 10204jQuery.ajaxSetup( { 10205 jsonp: "callback", 10206 jsonpCallback: function() { 10207 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); 10208 this[ callback ] = true; 10209 return callback; 10210 } 10211} ); 10212 10213// Detect, normalize options and install callbacks for jsonp requests 10214jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 10215 10216 var callbackName, overwritten, responseContainer, 10217 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 10218 "url" : 10219 typeof s.data === "string" && 10220 ( s.contentType || "" ) 10221 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 10222 rjsonp.test( s.data ) && "data" 10223 ); 10224 10225 // Handle iff the expected data type is "jsonp" or we have a parameter to set 10226 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 10227 10228 // Get callback name, remembering preexisting value associated with it 10229 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 10230 s.jsonpCallback() : 10231 s.jsonpCallback; 10232 10233 // Insert callback into url or form data 10234 if ( jsonProp ) { 10235 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 10236 } else if ( s.jsonp !== false ) { 10237 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 10238 } 10239 10240 // Use data converter to retrieve json after script execution 10241 s.converters[ "script json" ] = function() { 10242 if ( !responseContainer ) { 10243 jQuery.error( callbackName + " was not called" ); 10244 } 10245 return responseContainer[ 0 ]; 10246 }; 10247 10248 // Force json dataType 10249 s.dataTypes[ 0 ] = "json"; 10250 10251 // Install callback 10252 overwritten = window[ callbackName ]; 10253 window[ callbackName ] = function() { 10254 responseContainer = arguments; 10255 }; 10256 10257 // Clean-up function (fires after converters) 10258 jqXHR.always( function() { 10259 10260 // If previous value didn't exist - remove it 10261 if ( overwritten === undefined ) { 10262 jQuery( window ).removeProp( callbackName ); 10263 10264 // Otherwise restore preexisting value 10265 } else { 10266 window[ callbackName ] = overwritten; 10267 } 10268 10269 // Save back as free 10270 if ( s[ callbackName ] ) { 10271 10272 // Make sure that re-using the options doesn't screw things around 10273 s.jsonpCallback = originalSettings.jsonpCallback; 10274 10275 // Save the callback name for future use 10276 oldCallbacks.push( callbackName ); 10277 } 10278 10279 // Call if it was a function and we have a response 10280 if ( responseContainer && isFunction( overwritten ) ) { 10281 overwritten( responseContainer[ 0 ] ); 10282 } 10283 10284 responseContainer = overwritten = undefined; 10285 } ); 10286 10287 // Delegate to script 10288 return "script"; 10289 } 10290} ); 10291 10292 10293 10294 10295// Support: Safari 8 only 10296// In Safari 8 documents created via document.implementation.createHTMLDocument 10297// collapse sibling forms: the second one becomes a child of the first one. 10298// Because of that, this security measure has to be disabled in Safari 8. 10299// https://bugs.webkit.org/show_bug.cgi?id=137337 10300support.createHTMLDocument = ( function() { 10301 var body = document.implementation.createHTMLDocument( "" ).body; 10302 body.innerHTML = "<form></form><form></form>"; 10303 return body.childNodes.length === 2; 10304} )(); 10305 10306 10307// Argument "data" should be string of html 10308// context (optional): If specified, the fragment will be created in this context, 10309// defaults to document 10310// keepScripts (optional): If true, will include scripts passed in the html string 10311jQuery.parseHTML = function( data, context, keepScripts ) { 10312 if ( typeof data !== "string" ) { 10313 return []; 10314 } 10315 if ( typeof context === "boolean" ) { 10316 keepScripts = context; 10317 context = false; 10318 } 10319 10320 var base, parsed, scripts; 10321 10322 if ( !context ) { 10323 10324 // Stop scripts or inline event handlers from being executed immediately 10325 // by using document.implementation 10326 if ( support.createHTMLDocument ) { 10327 context = document.implementation.createHTMLDocument( "" ); 10328 10329 // Set the base href for the created document 10330 // so any parsed elements with URLs 10331 // are based on the document's URL (gh-2965) 10332 base = context.createElement( "base" ); 10333 base.href = document.location.href; 10334 context.head.appendChild( base ); 10335 } else { 10336 context = document; 10337 } 10338 } 10339 10340 parsed = rsingleTag.exec( data ); 10341 scripts = !keepScripts && []; 10342 10343 // Single tag 10344 if ( parsed ) { 10345 return [ context.createElement( parsed[ 1 ] ) ]; 10346 } 10347 10348 parsed = buildFragment( [ data ], context, scripts ); 10349 10350 if ( scripts && scripts.length ) { 10351 jQuery( scripts ).remove(); 10352 } 10353 10354 return jQuery.merge( [], parsed.childNodes ); 10355}; 10356 10357 10358/** 10359 * Load a url into a page 10360 */ 10361jQuery.fn.load = function( url, params, callback ) { 10362 var selector, type, response, 10363 self = this, 10364 off = url.indexOf( " " ); 10365 10366 if ( off > -1 ) { 10367 selector = stripAndCollapse( url.slice( off ) ); 10368 url = url.slice( 0, off ); 10369 } 10370 10371 // If it's a function 10372 if ( isFunction( params ) ) { 10373 10374 // We assume that it's the callback 10375 callback = params; 10376 params = undefined; 10377 10378 // Otherwise, build a param string 10379 } else if ( params && typeof params === "object" ) { 10380 type = "POST"; 10381 } 10382 10383 // If we have elements to modify, make the request 10384 if ( self.length > 0 ) { 10385 jQuery.ajax( { 10386 url: url, 10387 10388 // If "type" variable is undefined, then "GET" method will be used. 10389 // Make value of this field explicit since 10390 // user can override it through ajaxSetup method 10391 type: type || "GET", 10392 dataType: "html", 10393 data: params 10394 } ).done( function( responseText ) { 10395 10396 // Save response for use in complete callback 10397 response = arguments; 10398 10399 self.html( selector ? 10400 10401 // If a selector was specified, locate the right elements in a dummy div 10402 // Exclude scripts to avoid IE 'Permission Denied' errors 10403 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 10404 10405 // Otherwise use the full result 10406 responseText ); 10407 10408 // If the request succeeds, this function gets "data", "status", "jqXHR" 10409 // but they are ignored because response was set above. 10410 // If it fails, this function gets "jqXHR", "status", "error" 10411 } ).always( callback && function( jqXHR, status ) { 10412 self.each( function() { 10413 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 10414 } ); 10415 } ); 10416 } 10417 10418 return this; 10419}; 10420 10421 10422 10423 10424jQuery.expr.pseudos.animated = function( elem ) { 10425 return jQuery.grep( jQuery.timers, function( fn ) { 10426 return elem === fn.elem; 10427 } ).length; 10428}; 10429 10430 10431 10432 10433jQuery.offset = { 10434 setOffset: function( elem, options, i ) { 10435 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 10436 position = jQuery.css( elem, "position" ), 10437 curElem = jQuery( elem ), 10438 props = {}; 10439 10440 // Set position first, in-case top/left are set even on static elem 10441 if ( position === "static" ) { 10442 elem.style.position = "relative"; 10443 } 10444 10445 curOffset = curElem.offset(); 10446 curCSSTop = jQuery.css( elem, "top" ); 10447 curCSSLeft = jQuery.css( elem, "left" ); 10448 calculatePosition = ( position === "absolute" || position === "fixed" ) && 10449 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 10450 10451 // Need to be able to calculate position if either 10452 // top or left is auto and position is either absolute or fixed 10453 if ( calculatePosition ) { 10454 curPosition = curElem.position(); 10455 curTop = curPosition.top; 10456 curLeft = curPosition.left; 10457 10458 } else { 10459 curTop = parseFloat( curCSSTop ) || 0; 10460 curLeft = parseFloat( curCSSLeft ) || 0; 10461 } 10462 10463 if ( isFunction( options ) ) { 10464 10465 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 10466 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 10467 } 10468 10469 if ( options.top != null ) { 10470 props.top = ( options.top - curOffset.top ) + curTop; 10471 } 10472 if ( options.left != null ) { 10473 props.left = ( options.left - curOffset.left ) + curLeft; 10474 } 10475 10476 if ( "using" in options ) { 10477 options.using.call( elem, props ); 10478 10479 } else { 10480 curElem.css( props ); 10481 } 10482 } 10483}; 10484 10485jQuery.fn.extend( { 10486 10487 // offset() relates an element's border box to the document origin 10488 offset: function( options ) { 10489 10490 // Preserve chaining for setter 10491 if ( arguments.length ) { 10492 return options === undefined ? 10493 this : 10494 this.each( function( i ) { 10495 jQuery.offset.setOffset( this, options, i ); 10496 } ); 10497 } 10498 10499 var rect, win, 10500 elem = this[ 0 ]; 10501 10502 if ( !elem ) { 10503 return; 10504 } 10505 10506 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 10507 // Support: IE <=11 only 10508 // Running getBoundingClientRect on a 10509 // disconnected node in IE throws an error 10510 if ( !elem.getClientRects().length ) { 10511 return { top: 0, left: 0 }; 10512 } 10513 10514 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 10515 rect = elem.getBoundingClientRect(); 10516 win = elem.ownerDocument.defaultView; 10517 return { 10518 top: rect.top + win.pageYOffset, 10519 left: rect.left + win.pageXOffset 10520 }; 10521 }, 10522 10523 // position() relates an element's margin box to its offset parent's padding box 10524 // This corresponds to the behavior of CSS absolute positioning 10525 position: function() { 10526 if ( !this[ 0 ] ) { 10527 return; 10528 } 10529 10530 var offsetParent, offset, doc, 10531 elem = this[ 0 ], 10532 parentOffset = { top: 0, left: 0 }; 10533 10534 // position:fixed elements are offset from the viewport, which itself always has zero offset 10535 if ( jQuery.css( elem, "position" ) === "fixed" ) { 10536 10537 // Assume position:fixed implies availability of getBoundingClientRect 10538 offset = elem.getBoundingClientRect(); 10539 10540 } else { 10541 offset = this.offset(); 10542 10543 // Account for the *real* offset parent, which can be the document or its root element 10544 // when a statically positioned element is identified 10545 doc = elem.ownerDocument; 10546 offsetParent = elem.offsetParent || doc.documentElement; 10547 while ( offsetParent && 10548 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 10549 jQuery.css( offsetParent, "position" ) === "static" ) { 10550 10551 offsetParent = offsetParent.parentNode; 10552 } 10553 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { 10554 10555 // Incorporate borders into its offset, since they are outside its content origin 10556 parentOffset = jQuery( offsetParent ).offset(); 10557 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 10558 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 10559 } 10560 } 10561 10562 // Subtract parent offsets and element margins 10563 return { 10564 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 10565 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 10566 }; 10567 }, 10568 10569 // This method will return documentElement in the following cases: 10570 // 1) For the element inside the iframe without offsetParent, this method will return 10571 // documentElement of the parent window 10572 // 2) For the hidden or detached element 10573 // 3) For body or html element, i.e. in case of the html node - it will return itself 10574 // 10575 // but those exceptions were never presented as a real life use-cases 10576 // and might be considered as more preferable results. 10577 // 10578 // This logic, however, is not guaranteed and can change at any point in the future 10579 offsetParent: function() { 10580 return this.map( function() { 10581 var offsetParent = this.offsetParent; 10582 10583 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 10584 offsetParent = offsetParent.offsetParent; 10585 } 10586 10587 return offsetParent || documentElement; 10588 } ); 10589 } 10590} ); 10591 10592// Create scrollLeft and scrollTop methods 10593jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 10594 var top = "pageYOffset" === prop; 10595 10596 jQuery.fn[ method ] = function( val ) { 10597 return access( this, function( elem, method, val ) { 10598 10599 // Coalesce documents and windows 10600 var win; 10601 if ( isWindow( elem ) ) { 10602 win = elem; 10603 } else if ( elem.nodeType === 9 ) { 10604 win = elem.defaultView; 10605 } 10606 10607 if ( val === undefined ) { 10608 return win ? win[ prop ] : elem[ method ]; 10609 } 10610 10611 if ( win ) { 10612 win.scrollTo( 10613 !top ? val : win.pageXOffset, 10614 top ? val : win.pageYOffset 10615 ); 10616 10617 } else { 10618 elem[ method ] = val; 10619 } 10620 }, method, val, arguments.length ); 10621 }; 10622} ); 10623 10624// Support: Safari <=7 - 9.1, Chrome <=37 - 49 10625// Add the top/left cssHooks using jQuery.fn.position 10626// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 10627// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 10628// getComputedStyle returns percent when specified for top/left/bottom/right; 10629// rather than make the css module depend on the offset module, just check for it here 10630jQuery.each( [ "top", "left" ], function( _i, prop ) { 10631 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 10632 function( elem, computed ) { 10633 if ( computed ) { 10634 computed = curCSS( elem, prop ); 10635 10636 // If curCSS returns percentage, fallback to offset 10637 return rnumnonpx.test( computed ) ? 10638 jQuery( elem ).position()[ prop ] + "px" : 10639 computed; 10640 } 10641 } 10642 ); 10643} ); 10644 10645 10646// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 10647jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 10648 jQuery.each( { 10649 padding: "inner" + name, 10650 content: type, 10651 "": "outer" + name 10652 }, function( defaultExtra, funcName ) { 10653 10654 // Margin is only for outerHeight, outerWidth 10655 jQuery.fn[ funcName ] = function( margin, value ) { 10656 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 10657 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 10658 10659 return access( this, function( elem, type, value ) { 10660 var doc; 10661 10662 if ( isWindow( elem ) ) { 10663 10664 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 10665 return funcName.indexOf( "outer" ) === 0 ? 10666 elem[ "inner" + name ] : 10667 elem.document.documentElement[ "client" + name ]; 10668 } 10669 10670 // Get document width or height 10671 if ( elem.nodeType === 9 ) { 10672 doc = elem.documentElement; 10673 10674 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 10675 // whichever is greatest 10676 return Math.max( 10677 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 10678 elem.body[ "offset" + name ], doc[ "offset" + name ], 10679 doc[ "client" + name ] 10680 ); 10681 } 10682 10683 return value === undefined ? 10684 10685 // Get width or height on the element, requesting but not forcing parseFloat 10686 jQuery.css( elem, type, extra ) : 10687 10688 // Set width or height on the element 10689 jQuery.style( elem, type, value, extra ); 10690 }, type, chainable ? margin : undefined, chainable ); 10691 }; 10692 } ); 10693} ); 10694 10695 10696jQuery.each( [ 10697 "ajaxStart", 10698 "ajaxStop", 10699 "ajaxComplete", 10700 "ajaxError", 10701 "ajaxSuccess", 10702 "ajaxSend" 10703], function( _i, type ) { 10704 jQuery.fn[ type ] = function( fn ) { 10705 return this.on( type, fn ); 10706 }; 10707} ); 10708 10709 10710 10711 10712jQuery.fn.extend( { 10713 10714 bind: function( types, data, fn ) { 10715 return this.on( types, null, data, fn ); 10716 }, 10717 unbind: function( types, fn ) { 10718 return this.off( types, null, fn ); 10719 }, 10720 10721 delegate: function( selector, types, data, fn ) { 10722 return this.on( types, selector, data, fn ); 10723 }, 10724 undelegate: function( selector, types, fn ) { 10725 10726 // ( namespace ) or ( selector, types [, fn] ) 10727 return arguments.length === 1 ? 10728 this.off( selector, "**" ) : 10729 this.off( types, selector || "**", fn ); 10730 }, 10731 10732 hover: function( fnOver, fnOut ) { 10733 return this
vendor: 2,388 bytes, lines 10733-10823
10733.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 10734 } 10735} ); 10736 10737jQuery.each( 10738 ( "blur focus focusin focusout resize scroll click dblclick " + 10739 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 10740 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 10741 function( _i, name ) { 10742 10743 // Handle event binding 10744 jQuery.fn[ name ] = function( data, fn ) { 10745 return arguments.length > 0 ? 10746 this.on( name, null, data, fn ) : 10747 this.trigger( name ); 10748 }; 10749 } 10750); 10751 10752 10753 10754 10755// Support: Android <=4.0 only 10756// Make sure we trim BOM and NBSP 10757var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 10758 10759// Bind a function to a context, optionally partially applying any 10760// arguments. 10761// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 10762// However, it is not slated for removal any time soon 10763jQuery.proxy = function( fn, context ) { 10764 var tmp, args, proxy; 10765 10766 if ( typeof context === "string" ) { 10767 tmp = fn[ context ]; 10768 context = fn; 10769 fn = tmp; 10770 } 10771 10772 // Quick check to determine if target is callable, in the spec 10773 // this throws a TypeError, but we will just return undefined. 10774 if ( !isFunction( fn ) ) { 10775 return undefined; 10776 } 10777 10778 // Simulated bind 10779 args = slice.call( arguments, 2 ); 10780 proxy = function() { 10781 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 10782 }; 10783 10784 // Set the guid of unique handler to the same of original handler, so it can be removed 10785 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 10786 10787 return proxy; 10788}; 10789 10790jQuery.holdReady = function( hold ) { 10791 if ( hold ) { 10792 jQuery.readyWait++; 10793 } else { 10794 jQuery.ready( true ); 10795 } 10796}; 10797jQuery.isArray = Array.isArray; 10798jQuery.parseJSON = JSON.parse; 10799jQuery.nodeName = nodeName; 10800jQuery.isFunction = isFunction; 10801jQuery.isWindow = isWindow; 10802jQuery.camelCase = camelCase; 10803jQuery.type = toType; 10804 10805jQuery.now = Date.now; 10806 10807jQuery.isNumeric = function( obj ) { 10808 10809 // As of jQuery 3.0, isNumeric is limited to 10810 // strings and numbers (primitives or objects) 10811 // that can be coerced to finite numbers (gh-2662) 10812 var type = jQuery.type( obj ); 10813 return ( type === "number" || type === "string" ) && 10814 10815 // parseFloat NaNs numeric-cast false positives ("") 10816 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 10817 // subtraction forces infinities to NaN 10818 !isNaN( obj - parseFloat( obj ) ); 10819}; 10820 10821jQuery.trim = function( text ) { 10822 return text == null ? 10823 "" :
10824 ( text + "" ).replace( rtrim, "" ); 10825}; 10826 10827 10828 10829// Register as a named AMD module, since jQuery can be concatenated with other 10830// files that may use define, but not via a proper concatenation script that 10831// understands anonymous AMD modules. A named AMD is safest and most robust 10832// way to register. Lowercase jquery is used because AMD module names are 10833// derived from file names, and jQuery is normally delivered in a lowercase 10834// file name. Do this after creating the global so that if an AMD module wants 10835// to call noConflict to hide this version of jQuery, it will work. 10836 10837// Note that for maximum portability, libraries that are not jQuery should 10838// declare themselves as anonymous modules, and avoid setting a global if an 10839// AMD loader is present. jQuery is a special case. For more information, see 10840// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 10841 10842if ( typeof define === "function" && define.amd ) { 10843 define( "jquery", [], function() { 10844 return jQuery; 10845 } ); 10846} 10847 10848 10849 10850 10851var 10852 10853 // Map over jQuery in case of overwrite 10854 _jQuery = window.jQuery, 10855 10856 // Map over the $ in case of overwrite 10857 _$ = window.$; 10858 10859jQuery.noConflict = function( deep ) { 10860 if ( window.$ === jQuery ) { 10861 window.$ = _$; 10862 } 10863 10864 if ( deep && window.jQuery === jQuery ) { 10865 window.jQuery = _jQuery; 10866 } 10867 10868 return jQuery; 10869}; 10870 10871// Expose jQuery and $ identifiers, even in AMD 10872// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 10873// and CommonJS for browser emulators (#13566) 10874if ( typeof noGlobal === "undefined" ) { 10875 window.jQuery = window.$ = jQuery; 10876} 10877 10878 10879 10880 10881return jQuery; 10882} ); 10883 10884/*! 10885 * jQuery Migrate - 2013-05-08 10886 * https://github.com/jquery/jquery-migrate 10887 * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT 10888 */ 10889(function( jQuery, window, undefined ) { 10890// See http://bugs.jquery.com/ticket/13335 10891// "use strict"; 10892 10893 10894var warnedAbout = {}; 10895 10896// List of warnings already given; public read only 10897jQuery.migrateWarnings = []; 10898 10899// Set to true to prevent console output; migrateWarnings still maintained 10900// jQuery.migrateMute = false; 10901 10902// Show a message on the console so devs know we're active 10903if ( !jQuery.migrateMute && window.console && window.console.log ) { 10904 window.console.log("JQMIGRATE: Logging is active"); 10905} 10906 10907// Set to false to disable traces that appear with warnings 10908if ( jQuery.migrateTrace === undefined ) { 10909 jQuery.migrateTrace = true; 10910} 10911 10912// Forget any warnings we've already given; public 10913jQuery.migrateReset = function() { 10914 warnedAbout = {}; 10915 jQuery.migrateWarnings.length = 0; 10916}; 10917 10918function migrateWarn( msg) { 10919 var console = window.console; 10920 if ( !warnedAbout[ msg ] ) { 10921 warnedAbout[ msg ] = true; 10922 jQuery.migrateWarnings.push( msg ); 10923 if ( console && console.warn && !jQuery.migrateMute ) { 10924 console.warn( "JQMIGRATE: " + msg ); 10925 if ( jQuery.migrateTrace && console.trace ) { 10926 console.trace(); 10927 } 10928 } 10929 } 10930} 10931 10932function migrateWarnProp( obj, prop, value, msg ) { 10933 if ( Object.defineProperty ) { 10934 // On ES5 browsers (non-oldIE), warn if the code tries to get prop; 10935 // allow property to be overwritten in case some other plugin wants it 10936 try { 10937 Object.defineProperty( obj, prop, { 10938 configurable: true, 10939 enumerable: true, 10940 get: function() { 10941 migrateWarn( msg ); 10942 return value; 10943 }, 10944 set: function( newValue ) { 10945 migrateWarn( msg ); 10946 value = newValue; 10947 } 10948 }); 10949 return; 10950 } catch( err ) { 10951 // IE8 is a dope about Object.defineProperty, can't warn there 10952 } 10953 } 10954 10955 // Non-ES5 (or broken) browser; just set the property 10956 jQuery._definePropertyBroken = true; 10957 obj[ prop ] = value; 10958} 10959 10960if ( document.compatMode === "BackCompat" ) { 10961 // jQuery has never supported or tested Quirks Mode 10962 migrateWarn( "jQuery is not compatible with Quirks Mode" ); 10963} 10964 10965 10966var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn, 10967 oldAttr = jQuery.attr, 10968 valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get || 10969 function() { return null; }, 10970 valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set || 10971 function() { return undefined; }, 10972 rnoType = /^(?:input|button)$/i, 10973 rnoAttrNodeType = /^[238]$/, 10974 rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, 10975 ruseDefault = /^(?:checked|selected)$/i; 10976 10977// jQuery.attrFn 10978migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" ); 10979 10980jQuery.attr = function( elem, name, value, pass ) { 10981 var lowerName = name.toLowerCase(), 10982 nType = elem && elem.nodeType; 10983 10984 if ( pass ) { 10985 // Since pass is used internally, we only warn for new jQuery 10986 // versions where there isn't a pass arg in the formal params 10987 if ( oldAttr.length < 4 ) { 10988 migrateWarn("jQuery.fn.attr( props, pass ) is deprecated"); 10989 } 10990 if ( elem && !rnoAttrNodeType.test( nType ) && 10991 (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) { 10992 return jQuery( elem )[ name ]( value ); 10993 } 10994 } 10995 10996 // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking 10997 // for disconnected elements we don't warn on $( "<button>", { type: "button" } ). 10998 if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) { 10999 migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8"); 11000 } 11001 11002 // Restore boolHook for boolean property/attribute synchronization 11003 if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) { 11004 jQuery.attrHooks[ lowerName ] = { 11005 get: function( elem, name ) { 11006 // Align boolean attributes with corresponding properties 11007 // Fall back to attribute presence where some booleans are not supported 11008 var attrNode, 11009 property = jQuery.prop( elem, name ); 11010 return property === true || typeof property !== "boolean" && 11011 ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? 11012 11013 name.toLowerCase() : 11014 undefined; 11015 },
11016 set: function( elem, value, name ) { 11017 var propName; 11018 if ( value === false ) { 11019 // Remove boolean attributes when set to false 11020 jQuery.removeAttr( elem, name ); 11021 } else { 11022 // value is true since we know at this point it's type boolean and not false 11023 // Set boolean attributes to the same name and set the DOM property 11024 propName = jQuery.propFix[ name ] || name; 11025 if ( propName in elem ) { 11026 // Only set the IDL specifically if it already exists on the element 11027 elem[ propName ] = true; 11028 } 11029 11030 elem.setAttribute( name, name.toLowerCase() ); 11031 } 11032 return name; 11033 } 11034 }; 11035 11036 // Warn only for attributes that can remain distinct from their properties post-1.9 11037 if ( ruseDefault.test( lowerName ) ) { 11038 migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" ); 11039 } 11040 } 11041 11042 return oldAttr.call( jQuery, elem, name, value ); 11043}; 11044 11045// attrHooks: value 11046jQuery.attrHooks.value = { 11047 get: function( elem, name ) { 11048 var nodeName = ( elem.nodeName || "" ).toLowerCase(); 11049 if ( nodeName === "button" ) { 11050 return valueAttrGet.apply( this, arguments ); 11051 } 11052 if ( nodeName !== "input" && nodeName !== "option" ) { 11053 migrateWarn("jQuery.fn.attr('value') no longer gets properties"); 11054 } 11055 return name in elem ? 11056 elem.value : 11057 null; 11058 }, 11059 set: function( elem, value ) { 11060 var nodeName = ( elem.nodeName || "" ).toLowerCase(); 11061 if ( nodeName === "button" ) { 11062 return valueAttrSet.apply( this, arguments ); 11063 } 11064 if ( nodeName !== "input" && nodeName !== "option" ) { 11065 migrateWarn("jQuery.fn.attr('value', val) no longer sets properties"); 11066 } 11067 // Does not return so that setAttribute is also used 11068 elem.value = value; 11069 } 11070}; 11071 11072 11073var matched, browser, 11074 oldInit = jQuery.fn.init, 11075 oldParseJSON = jQuery.parseJSON, 11076 // Note: XSS check is done below after string is trimmed 11077 rquickExpr = /^([^<]*)(<[\w\W]+>)([^>]*)$/; 11078 11079// $(html) "looks like html" rule change 11080jQuery.fn.init = function( selector, context, rootjQuery ) { 11081 var match; 11082 11083 if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) && 11084 (match = rquickExpr.exec( jQuery.trim( selector ) )) && match[ 0 ] ) { 11085 // This is an HTML string according to the "old" rules; is it still? 11086 if ( selector.charAt( 0 ) !== "<" ) { 11087 migrateWarn("$(html) HTML strings must start with '<' character"); 11088 } 11089 if ( match[ 3 ] ) { 11090 migrateWarn("$(html) HTML text after last tag is ignored"); 11091 } 11092 // Consistently reject any HTML-like string starting with a hash (#9521) 11093 // Note that this may break jQuery 1.6.x code that otherwise would work. 11094 if ( match[ 0 ].charAt( 0 ) === "#" ) { 11095 migrateWarn("HTML string cannot start with a '#' character"); 11096 jQuery.error("JQMIGRATE: Invalid selector string (XSS)"); 11097 } 11098 // Now process using loose rules; let pre-1.8 play too 11099 if ( context && context.context ) { 11100 // jQuery object as context; parseHTML expects a DOM object 11101 context = context.context; 11102 } 11103 if ( jQuery.parseHTML ) { 11104 return oldInit.call( this, jQuery.parseHTML( match[ 2 ], context, true ), 11105 context, rootjQuery ); 11106 } 11107 } 11108 return oldInit.apply( this, arguments ); 11109}; 11110jQuery.fn.init.prototype = jQuery.fn; 11111 11112// Let $.parseJSON(falsy_value) return null 11113jQuery.parseJSON = function( json ) { 11114 if ( !json && json !== null ) { 11115 migrateWarn("jQuery.parseJSON requires a valid JSON string"); 11116 return null; 11117 } 11118 return oldParseJSON.apply( this, arguments ); 11119}; 11120 11121jQuery.uaMatch = function( ua ) { 11122 ua = ua.toLowerCase(); 11123 11124 var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || 11125 /(webkit)[ \/]([\w.]+)/.exec( ua ) || 11126 /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || 11127 /(msie) ([\w.]+)/.exec( ua ) || 11128 ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || 11129 []; 11130 11131 return { 11132 browser: match[ 1 ] || "", 11133 version: match[ 2 ] || "0" 11134 }; 11135}; 11136 11137// Don't clobber any existing jQuery.browser in case it's different 11138if ( !jQuery.browser ) { 11139 matched = jQuery.uaMatch( navigator.userAgent ); 11140 browser = {}; 11141 11142 if ( matched.browser ) { 11143 browser[ matched.browser ] = true; 11144 browser.version = matched.version; 11145 } 11146 11147 // Chrome is Webkit, but Webkit is also Safari. 11148 if ( browser.chrome ) { 11149 browser.webkit = true; 11150 } else if ( browser.webkit ) { 11151 browser.safari = true; 11152 } 11153 11154 jQuery.browser = browser; 11155} 11156 11157// Warn if the code tries to get jQuery.browser 11158migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" ); 11159 11160jQuery.sub = function() { 11161 function jQuerySub( selector, context ) { 11162 return new jQuerySub.fn.init( selector, context ); 11163 } 11164 jQuery.extend( true, jQuerySub, this ); 11165 jQuerySub.superclass = this; 11166 jQuerySub.fn = jQuerySub.prototype = this(); 11167 jQuerySub.fn.constructor = jQuerySub; 11168 jQuerySub.sub = this.sub; 11169 jQuerySub.fn.init = function init( selector, context ) { 11170 if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { 11171 context = jQuerySub( context ); 11172 } 11173 11174 return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); 11175 }; 11176 jQuerySub.fn.init.prototype = jQuerySub.fn; 11177 var rootjQuerySub = jQuerySub(document); 11178 migrateWarn( "jQuery.sub() is deprecated" ); 11179 return jQuerySub; 11180}; 11181 11182 11183// Ensure that $.ajax gets the new parseJSON defined in core.js 11184jQuery.ajaxSetup({ 11185 converters: { 11186 "text json": jQuery.parseJSON 11187 } 11188}); 11189 11190 11191var oldFnData = jQuery.fn.data; 11192 11193jQuery.fn.data = function( name ) { 11194 var ret, evt, 11195 elem = this[0]; 11196 11197 // Handles 1.7 which has this behavior and 1.8 which doesn't 11198 if ( elem && name === "events" && arguments.length === 1 ) { 11199 ret = jQuery.data( elem, name ); 11200 evt = jQuery._data( elem, name ); 11201 if ( ( ret === undefined || ret === evt ) && evt !== undefined ) { 11202 migrateWarn("Use of jQuery.fn.data('events') is deprecated"); 11203 return evt; 11204 } 11205 } 11206 return oldFnData.apply( this, arguments ); 11207}; 11208 11209 11210var rscriptType = /\/(java|ecma)script/i, 11211 oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack; 11212 11213jQuery.fn.andSelf = function() { 11214 migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()"); 11215 return oldSelf.apply( this, arguments ); 11216}; 11217 11218// Since jQuery.clean is used internally on older versions, we only shim if it's missing 11219if ( !jQuery.clean ) { 11220 jQuery.clean = function( elems, context, fragment, scripts ) { 11221 // Set context per 1.8 logic 11222 context = context || document; 11223 context = !context.nodeType && context[0] || context; 11224 context = context.ownerDocument || context; 11225 11226 migrateWarn("jQuery.clean() is deprecated"); 11227 11228 var i, elem, handleScript, jsTags, 11229 ret = []; 11230 11231 jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes ); 11232 11233 // Complex logic lifted directly from jQuery 1.8 11234 if ( fragment ) { 11235 // Special handling of each script element 11236 handleScript = function( elem ) { 11237 // Check if we consider it executable 11238 if ( !elem.type || rscriptType.test( elem.type ) ) { 11239 // Detach the script and store it in the scripts array (if provided) or the fragment 11240 // Return truthy to indicate that it has been handled 11241 return scripts ? 11242 scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) : 11243 fragment.appendChild( elem ); 11244 } 11245 }; 11246 11247 for ( i = 0; (elem = ret[i]) != null; i++ ) { 11248 // Check if we're done after handling an executable script 11249 if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) { 11250 // Append to fragment and handle embedded scripts 11251 fragment.appendChild( elem ); 11252 if ( typeof elem.getElementsByTagName !== "undefined" ) { 11253 // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration 11254 jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript ); 11255 11256 // Splice the scripts into ret after their former ancestor and advance our index beyond them 11257 ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) ); 11258 i += jsTags.length; 11259 } 11260 } 11261 } 11262 } 11263 11264 return ret; 11265 }; 11266} 11267 11268var eventAdd = jQuery.event.add, 11269 eventRemove = jQuery.event.remove, 11270 eventTrigger = jQuery.event.trigger, 11271 oldToggle = jQuery.fn.toggle, 11272 oldLive = jQuery.fn.live, 11273 oldDie = jQuery.fn.die, 11274 ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess", 11275 rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ), 11276 rhoverHack = /(?:^|\s)hover(\.\S+|)\b/, 11277 hoverHack = function( events ) { 11278 if ( typeof( events ) !== "string" || jQuery.event.special.hover ) { 11279 return events; 11280 } 11281 if ( rhoverHack.test( events ) ) { 11282 migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'"); 11283 } 11284 return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); 11285 }; 11286 11287// Event props removed in 1.9, put them back if needed; no practical way to warn them 11288if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) { 11289 jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" ); 11290} 11291 11292// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7 11293if ( jQuery.event.dispatch ) { 11294 migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" ); 11295} 11296 11297// Support for 'hover' pseudo-event and ajax event warnings 11298jQuery.event.add = function( elem, types, handler, data, selector ){ 11299 if ( elem !== document && rajaxEvent.test( types ) ) { 11300 migrateWarn( "AJAX events should be attached to document: " + types ); 11301 } 11302 eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector ); 11303}; 11304jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){ 11305 eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes ); 11306}; 11307 11308jQuery.fn.error = function() { 11309 var args = Array.prototype.slice.call( arguments, 0); 11310 migrateWarn("jQuery.fn.error() is deprecated"); 11311 args.splice( 0, 0, "error" ); 11312 if ( arguments.length ) { 11313 return this.bind.apply( this, args ); 11314 } 11315 // error event should not bubble to window, although it does pre-1.7 11316 this.triggerHandler.apply( this, args ); 11317 return this; 11318}; 11319 11320jQuery.fn.toggle = function( fn, fn2 ) { 11321 11322 // Don't mess with animation or css toggles 11323 if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) { 11324 return oldToggle.apply( this, arguments ); 11325 } 11326 migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated"); 11327 11328 // Save reference to arguments for access in closure 11329 var args = arguments, 11330 guid = fn.guid || jQuery.guid++, 11331 i = 0, 11332 toggler = function( event ) { 11333 // Figure out which function to execute 11334 var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; 11335 jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); 11336 11337 // Make sure that clicks stop 11338 event.preventDefault(); 11339 11340 // and execute the function 11341 return args[ lastToggle ].apply( this, arguments ) || false; 11342 }; 11343 11344 // link all the functions, so any of them can unbind this click handler 11345 toggler.guid = guid; 11346 while ( i < args.length ) { 11347 args[ i++ ].guid = guid; 11348 } 11349 11350 return this.click( toggler ); 11351}; 11352 11353jQuery.fn.live = function( types, data, fn ) { 11354 migrateWarn("jQuery.fn.live() is deprecated"); 11355 if ( oldLive ) { 11356 return oldLive.apply( this, arguments ); 11357 } 11358 jQuery( this.context ).on( types, this.selector, data, fn ); 11359 return this; 11360}; 11361 11362jQuery.fn.die = function( types, fn ) { 11363 migrateWarn("jQuery.fn.die() is deprecated"); 11364 if ( oldDie ) { 11365 return oldDie.apply( this, arguments ); 11366 } 11367 jQuery( this.context ).off( types, this.selector || "**", fn ); 11368 return this; 11369}; 11370 11371// Turn global events into document-triggered events 11372jQuery.event.trigger = function( event, data, elem, onlyHandlers ){ 11373 if ( !elem && !rajaxEvent.test( event ) ) { 11374 migrateWarn( "Global events are undocumented and deprecated" ); 11375 } 11376 return eventTrigger.call( this, event, data, elem || document, onlyHandlers ); 11377}; 11378jQuery.each( ajaxEvents.split("|"), 11379 function( _, name ) { 11380 jQuery.event.special[ name ] = { 11381 setup: function() { 11382 var elem = this; 11383 11384 // The document needs no shimming; must be !== for oldIE 11385 if ( elem !== document ) { 11386 jQuery.event.add( document, name + "." + jQuery.guid, function() { 11387 jQuery.event.trigger( name, null, elem, true ); 11388 }); 11389 jQuery._data( this, name, jQuery.guid++ ); 11390 } 11391 return false;
vendor: 2,882 bytes, lines 11392-11473
11392 }, 11393 teardown: function() { 11394 if ( this !== document ) { 11395 jQuery.event.remove( document, name + "." + jQuery._data( this, name ) ); 11396 } 11397 return false; 11398 } 11399 }; 11400 } 11401); 11402 11403 11404})( jQuery, window ); 11405/*! jQuery UI - v1.13.2 - 2022-07-14 11406* http://jqueryui.com 11407* Includes: widget.js, position.js, data.js, disable-selection.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/draggable.js, widgets/droppable.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/resizable.js, widgets/selectable.js, widgets/selectmenu.js, widgets/slider.js, widgets/sortable.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js 11408* Copyright jQuery Foundation and other contributors; Licensed MIT */ 11409 11410( function( factory ) { 11411 "use strict"; 11412 11413 if ( typeof define === "function" && define.amd ) { 11414 11415 // AMD. Register as an anonymous module. 11416 define( [ "jquery" ], factory ); 11417 } else { 11418 11419 // Browser globals 11420 factory( jQuery ); 11421 } 11422} )( function( $ ) { 11423"use strict"; 11424 11425$.ui = $.ui || {}; 11426 11427var version = $.ui.version = "1.13.2"; 11428 11429 11430/*! 11431 * jQuery UI Widget 1.13.2 11432 * http://jqueryui.com 11433 * 11434 * Copyright jQuery Foundation and other contributors 11435 * Released under the MIT license. 11436 * http://jquery.org/license 11437 */ 11438 11439//>>label: Widget 11440//>>group: Core 11441//>>description: Provides a factory for creating stateful widgets with a common API. 11442//>>docs: http://api.jqueryui.com/jQuery.widget/ 11443//>>demos: http://jqueryui.com/widget/ 11444 11445 11446var widgetUuid = 0; 11447var widgetHasOwnProperty = Array.prototype.hasOwnProperty; 11448var widgetSlice = Array.prototype.slice; 11449 11450$.cleanData = ( function( orig ) { 11451 return function( elems ) { 11452 var events, elem, i; 11453 for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) { 11454 11455 // Only trigger remove when necessary to save time 11456 events = $._data( elem, "events" ); 11457 if ( events && events.remove ) { 11458 $( elem ).triggerHandler( "remove" ); 11459 } 11460 } 11461 orig( elems ); 11462 }; 11463} )( $.cleanData ); 11464 11465$.widget = function( name, base, prototype ) { 11466 var existingConstructor, constructor, basePrototype; 11467 11468 // ProxiedPrototype allows the provided prototype to remain unmodified 11469 // so that it can be used as a mixin for multiple widgets (#8876) 11470 var proxiedPrototype = {}; 11471 11472 var namespace = name.split( "." )[ 0 ]; 11473 name = name.split( "." )[ 1 ];
vendor: 18,823 bytes, lines 11473-12173
11473 11474 var fullName = namespace + "-" + name; 11475 11476 if ( !prototype ) { 11477 prototype = base; 11478 base = $.Widget; 11479 } 11480 11481 if ( Array.isArray( prototype ) ) { 11482 prototype = $.extend.apply( null, [ {} ].concat( prototype ) ); 11483 } 11484 11485 // Create selector for plugin 11486 $.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) { 11487 return !!$.data( elem, fullName ); 11488 }; 11489 11490 $[ namespace ] = $[ namespace ] || {}; 11491 existingConstructor = $[ namespace ][ name ]; 11492 constructor = $[ namespace ][ name ] = function( options, element ) { 11493 11494 // Allow instantiation without "new" keyword 11495 if ( !this || !this._createWidget ) { 11496 return new constructor( options, element ); 11497 } 11498 11499 // Allow instantiation without initializing for simple inheritance 11500 // must use "new" keyword (the code above always passes args) 11501 if ( arguments.length ) { 11502 this._createWidget( options, element ); 11503 } 11504 }; 11505 11506 // Extend with the existing constructor to carry over any static properties 11507 $.extend( constructor, existingConstructor, { 11508 version: prototype.version, 11509 11510 // Copy the object used to create the prototype in case we need to 11511 // redefine the widget later 11512 _proto: $.extend( {}, prototype ), 11513 11514 // Track widgets that inherit from this widget in case this widget is 11515 // redefined after a widget inherits from it 11516 _childConstructors: [] 11517 } ); 11518 11519 basePrototype = new base(); 11520 11521 // We need to make the options hash a property directly on the new instance 11522 // otherwise we'll modify the options hash on the prototype that we're 11523 // inheriting from 11524 basePrototype.options = $.widget.extend( {}, basePrototype.options ); 11525 $.each( prototype, function( prop, value ) { 11526 if ( typeof value !== "function" ) { 11527 proxiedPrototype[ prop ] = value; 11528 return; 11529 } 11530 proxiedPrototype[ prop ] = ( function() { 11531 function _super() { 11532 return base.prototype[ prop ].apply( this, arguments ); 11533 } 11534 11535 function _superApply( args ) { 11536 return base.prototype[ prop ].apply( this, args ); 11537 } 11538 11539 return function() { 11540 var __super = this._super; 11541 var __superApply = this._superApply; 11542 var returnValue; 11543 11544 this._super = _super; 11545 this._superApply = _superApply; 11546 11547 returnValue = value.apply( this, arguments ); 11548 11549 this._super = __super; 11550 this._superApply = __superApply; 11551 11552 return returnValue; 11553 }; 11554 } )(); 11555 } ); 11556 constructor.prototype = $.widget.extend( basePrototype, { 11557 11558 // TODO: remove support for widgetEventPrefix 11559 // always use the name + a colon as the prefix, e.g., draggable:start 11560 // don't prefix for widgets that aren't DOM-based 11561 widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name 11562 }, proxiedPrototype, { 11563 constructor: constructor, 11564 namespace: namespace, 11565 widgetName: name, 11566 widgetFullName: fullName 11567 } ); 11568 11569 // If this widget is being redefined then we need to find all widgets that 11570 // are inheriting from it and redefine all of them so that they inherit from 11571 // the new version of this widget. We're essentially trying to replace one 11572 // level in the prototype chain. 11573 if ( existingConstructor ) { 11574 $.each( existingConstructor._childConstructors, function( i, child ) { 11575 var childPrototype = child.prototype; 11576 11577 // Redefine the child widget using the same prototype that was 11578 // originally used, but inherit from the new version of the base 11579 $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, 11580 child._proto ); 11581 } ); 11582 11583 // Remove the list of existing child constructors from the old constructor 11584 // so the old child constructors can be garbage collected 11585 delete existingConstructor._childConstructors; 11586 } else { 11587 base._childConstructors.push( constructor ); 11588 } 11589 11590 $.widget.bridge( name, constructor ); 11591 11592 return constructor; 11593}; 11594 11595$.widget.extend = function( target ) { 11596 var input = widgetSlice.call( arguments, 1 ); 11597 var inputIndex = 0; 11598 var inputLength = input.length; 11599 var key; 11600 var value; 11601 11602 for ( ; inputIndex < inputLength; inputIndex++ ) { 11603 for ( key in input[ inputIndex ] ) { 11604 value = input[ inputIndex ][ key ]; 11605 if ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) { 11606 11607 // Clone objects 11608 if ( $.isPlainObject( value ) ) { 11609 target[ key ] = $.isPlainObject( target[ key ] ) ? 11610 $.widget.extend( {}, target[ key ], value ) : 11611 11612 // Don't extend strings, arrays, etc. with objects 11613 $.widget.extend( {}, value ); 11614 11615 // Copy everything else by reference 11616 } else { 11617 target[ key ] = value; 11618 } 11619 } 11620 } 11621 } 11622 return target; 11623}; 11624 11625$.widget.bridge = function( name, object ) { 11626 var fullName = object.prototype.widgetFullName || name; 11627 $.fn[ name ] = function( options ) { 11628 var isMethodCall = typeof options === "string"; 11629 var args = widgetSlice.call( arguments, 1 ); 11630 var returnValue = this; 11631 11632 if ( isMethodCall ) { 11633 11634 // If this is an empty collection, we need to have the instance method 11635 // return undefined instead of the jQuery instance 11636 if ( !this.length && options === "instance" ) { 11637 returnValue = undefined; 11638 } else { 11639 this.each( function() { 11640 var methodValue; 11641 var instance = $.data( this, fullName ); 11642 11643 if ( options === "instance" ) { 11644 returnValue = instance; 11645 return false; 11646 } 11647 11648 if ( !instance ) { 11649 return $.error( "cannot call methods on " + name + 11650 " prior to initialization; " + 11651 "attempted to call method '" + options + "'" ); 11652 } 11653 11654 if ( typeof instance[ options ] !== "function" || 11655 options.charAt( 0 ) === "_" ) { 11656 return $.error( "no such method '" + options + "' for " + name + 11657 " widget instance" ); 11658 } 11659 11660 methodValue = instance[ options ].apply( instance, args ); 11661 11662 if ( methodValue !== instance && methodValue !== undefined ) { 11663 returnValue = methodValue && methodValue.jquery ? 11664 returnValue.pushStack( methodValue.get() ) : 11665 methodValue; 11666 return false; 11667 } 11668 } ); 11669 } 11670 } else { 11671 11672 // Allow multiple hashes to be passed on init 11673 if ( args.length ) { 11674 options = $.widget.extend.apply( null, [ options ].concat( args ) ); 11675 } 11676 11677 this.each( function() { 11678 var instance = $.data( this, fullName ); 11679 if ( instance ) { 11680 instance.option( options || {} ); 11681 if ( instance._init ) { 11682 instance._init(); 11683 } 11684 } else { 11685 $.data( this, fullName, new object( options, this ) ); 11686 } 11687 } ); 11688 } 11689 11690 return returnValue; 11691 }; 11692}; 11693 11694$.Widget = function( /* options, element */ ) {}; 11695$.Widget._childConstructors = []; 11696 11697$.Widget.prototype = { 11698 widgetName: "widget", 11699 widgetEventPrefix: "", 11700 defaultElement: "<div>", 11701 11702 options: { 11703 classes: {}, 11704 disabled: false, 11705 11706 // Callbacks 11707 create: null 11708 }, 11709 11710 _createWidget: function( options, element ) { 11711 element = $( element || this.defaultElement || this )[ 0 ]; 11712 this.element = $( element ); 11713 this.uuid = widgetUuid++; 11714 this.eventNamespace = "." + this.widgetName + this.uuid; 11715 11716 this.bindings = $(); 11717 this.hoverable = $(); 11718 this.focusable = $(); 11719 this.classesElementLookup = {}; 11720 11721 if ( element !== this ) { 11722 $.data( element, this.widgetFullName, this ); 11723 this._on( true, this.element, { 11724 remove: function( event ) { 11725 if ( event.target === element ) { 11726 this.destroy(); 11727 } 11728 } 11729 } ); 11730 this.document = $( element.style ? 11731 11732 // Element within the document 11733 element.ownerDocument : 11734 11735 // Element is window or document 11736 element.document || element ); 11737 this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow ); 11738 } 11739 11740 this.options = $.widget.extend( {}, 11741 this.options, 11742 this._getCreateOptions(), 11743 options ); 11744 11745 this._create(); 11746 11747 if ( this.options.disabled ) { 11748 this._setOptionDisabled( this.options.disabled ); 11749 } 11750 11751 this._trigger( "create", null, this._getCreateEventData() ); 11752 this._init(); 11753 }, 11754 11755 _getCreateOptions: function() { 11756 return {}; 11757 }, 11758 11759 _getCreateEventData: $.noop, 11760 11761 _create: $.noop, 11762 11763 _init: $.noop, 11764 11765 destroy: function() { 11766 var that = this; 11767 11768 this._destroy(); 11769 $.each( this.classesElementLookup, function( key, value ) { 11770 that._removeClass( value, key ); 11771 } ); 11772 11773 // We can probably remove the unbind calls in 2.0 11774 // all event bindings should go through this._on() 11775 this.element 11776 .off( this.eventNamespace ) 11777 .removeData( this.widgetFullName ); 11778 this.widget() 11779 .off( this.eventNamespace ) 11780 .removeAttr( "aria-disabled" ); 11781 11782 // Clean up events and states 11783 this.bindings.off( this.eventNamespace ); 11784 }, 11785 11786 _destroy: $.noop, 11787 11788 widget: function() { 11789 return this.element; 11790 }, 11791 11792 option: function( key, value ) { 11793 var options = key; 11794 var parts; 11795 var curOption; 11796 var i; 11797 11798 if ( arguments.length === 0 ) { 11799 11800 // Don't return a reference to the internal hash 11801 return $.widget.extend( {}, this.options ); 11802 } 11803 11804 if ( typeof key === "string" ) { 11805 11806 // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } 11807 options = {}; 11808 parts = key.split( "." ); 11809 key = parts.shift(); 11810 if ( parts.length ) { 11811 curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); 11812 for ( i = 0; i < parts.length - 1; i++ ) { 11813 curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; 11814 curOption = curOption[ parts[ i ] ]; 11815 } 11816 key = parts.pop(); 11817 if ( arguments.length === 1 ) { 11818 return curOption[ key ] === undefined ? null : curOption[ key ]; 11819 } 11820 curOption[ key ] = value; 11821 } else { 11822 if ( arguments.length === 1 ) { 11823 return this.options[ key ] === undefined ? null : this.options[ key ]; 11824 } 11825 options[ key ] = value; 11826 } 11827 } 11828 11829 this._setOptions( options ); 11830 11831 return this; 11832 }, 11833 11834 _setOptions: function( options ) { 11835 var key; 11836 11837 for ( key in options ) { 11838 this._setOption( key, options[ key ] ); 11839 } 11840 11841 return this; 11842 }, 11843 11844 _setOption: function( key, value ) { 11845 if ( key === "classes" ) { 11846 this._setOptionClasses( value ); 11847 } 11848 11849 this.options[ key ] = value; 11850 11851 if ( key === "disabled" ) { 11852 this._setOptionDisabled( value ); 11853 } 11854 11855 return this; 11856 }, 11857 11858 _setOptionClasses: function( value ) { 11859 var classKey, elements, currentElements; 11860 11861 for ( classKey in value ) { 11862 currentElements = this.classesElementLookup[ classKey ]; 11863 if ( value[ classKey ] === this.options.classes[ classKey ] || 11864 !currentElements || 11865 !currentElements.length ) { 11866 continue; 11867 } 11868 11869 // We are doing this to create a new jQuery object because the _removeClass() call 11870 // on the next line is going to destroy the reference to the current elements being 11871 // tracked. We need to save a copy of this collection so that we can add the new classes 11872 // below. 11873 elements = $( currentElements.get() ); 11874 this._removeClass( currentElements, classKey ); 11875 11876 // We don't use _addClass() here, because that uses this.options.classes 11877 // for generating the string of classes. We want to use the value passed in from 11878 // _setOption(), this is the new value of the classes option which was passed to 11879 // _setOption(). We pass this value directly to _classes(). 11880 elements.addClass( this._classes( { 11881 element: elements, 11882 keys: classKey, 11883 classes: value, 11884 add: true 11885 } ) ); 11886 } 11887 }, 11888 11889 _setOptionDisabled: function( value ) { 11890 this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value ); 11891 11892 // If the widget is becoming disabled, then nothing is interactive 11893 if ( value ) { 11894 this._removeClass( this.hoverable, null, "ui-state-hover" ); 11895 this._removeClass( this.focusable, null, "ui-state-focus" ); 11896 } 11897 }, 11898 11899 enable: function() { 11900 return this._setOptions( { disabled: false } ); 11901 }, 11902 11903 disable: function() { 11904 return this._setOptions( { disabled: true } ); 11905 }, 11906 11907 _classes: function( options ) { 11908 var full = []; 11909 var that = this; 11910 11911 options = $.extend( { 11912 element: this.element, 11913 classes: this.options.classes || {} 11914 }, options ); 11915 11916 function bindRemoveEvent() { 11917 var nodesToBind = []; 11918 11919 options.element.each( function( _, element ) { 11920 var isTracked = $.map( that.classesElementLookup, function( elements ) { 11921 return elements; 11922 } ) 11923 .some( function( elements ) { 11924 return elements.is( element ); 11925 } ); 11926 11927 if ( !isTracked ) { 11928 nodesToBind.push( element ); 11929 } 11930 } ); 11931 11932 that._on( $( nodesToBind ), { 11933 remove: "_untrackClassesElement" 11934 } ); 11935 } 11936 11937 function processClassString( classes, checkOption ) { 11938 var current, i; 11939 for ( i = 0; i < classes.length; i++ ) { 11940 current = that.classesElementLookup[ classes[ i ] ] || $(); 11941 if ( options.add ) { 11942 bindRemoveEvent(); 11943 current = $( $.uniqueSort( current.get().concat( options.element.get() ) ) ); 11944 } else { 11945 current = $( current.not( options.element ).get() ); 11946 } 11947 that.classesElementLookup[ classes[ i ] ] = current; 11948 full.push( classes[ i ] ); 11949 if ( checkOption && options.classes[ classes[ i ] ] ) { 11950 full.push( options.classes[ classes[ i ] ] ); 11951 } 11952 } 11953 } 11954 11955 if ( options.keys ) { 11956 processClassString( options.keys.match( /\S+/g ) || [], true ); 11957 } 11958 if ( options.extra ) { 11959 processClassString( options.extra.match( /\S+/g ) || [] ); 11960 } 11961 11962 return full.join( " " ); 11963 }, 11964 11965 _untrackClassesElement: function( event ) { 11966 var that = this; 11967 $.each( that.classesElementLookup, function( key, value ) { 11968 if ( $.inArray( event.target, value ) !== -1 ) { 11969 that.classesElementLookup[ key ] = $( value.not( event.target ).get() ); 11970 } 11971 } ); 11972 11973 this._off( $( event.target ) ); 11974 }, 11975 11976 _removeClass: function( element, keys, extra ) { 11977 return this._toggleClass( element, keys, extra, false ); 11978 }, 11979 11980 _addClass: function( element, keys, extra ) { 11981 return this._toggleClass( element, keys, extra, true ); 11982 }, 11983 11984 _toggleClass: function( element, keys, extra, add ) { 11985 add = ( typeof add === "boolean" ) ? add : extra; 11986 var shift = ( typeof element === "string" || element === null ), 11987 options = { 11988 extra: shift ? keys : extra, 11989 keys: shift ? element : keys, 11990 element: shift ? this.element : element, 11991 add: add 11992 }; 11993 options.element.toggleClass( this._classes( options ), add ); 11994 return this; 11995 }, 11996 11997 _on: function( suppressDisabledCheck, element, handlers ) { 11998 var delegateElement; 11999 var instance = this; 12000 12001 // No suppressDisabledCheck flag, shuffle arguments 12002 if ( typeof suppressDisabledCheck !== "boolean" ) { 12003 handlers = element; 12004 element = suppressDisabledCheck; 12005 suppressDisabledCheck = false; 12006 } 12007 12008 // No element argument, shuffle and use this.element 12009 if ( !handlers ) { 12010 handlers = element; 12011 element = this.element; 12012 delegateElement = this.widget(); 12013 } else { 12014 element = delegateElement = $( element ); 12015 this.bindings = this.bindings.add( element ); 12016 } 12017 12018 $.each( handlers, function( event, handler ) { 12019 function handlerProxy() { 12020 12021 // Allow widgets to customize the disabled handling 12022 // - disabled as an array instead of boolean 12023 // - disabled class as method for disabling individual parts 12024 if ( !suppressDisabledCheck && 12025 ( instance.options.disabled === true || 12026 $( this ).hasClass( "ui-state-disabled" ) ) ) { 12027 return; 12028 } 12029 return ( typeof handler === "string" ? instance[ handler ] : handler ) 12030 .apply( instance, arguments ); 12031 } 12032 12033 // Copy the guid so direct unbinding works 12034 if ( typeof handler !== "string" ) { 12035 handlerProxy.guid = handler.guid = 12036 handler.guid || handlerProxy.guid || $.guid++; 12037 } 12038 12039 var match = event.match( /^([\w:-]*)\s*(.*)$/ ); 12040 var eventName = match[ 1 ] + instance.eventNamespace; 12041 var selector = match[ 2 ]; 12042 12043 if ( selector ) { 12044 delegateElement.on( eventName, selector, handlerProxy ); 12045 } else { 12046 element.on( eventName, handlerProxy ); 12047 } 12048 } ); 12049 }, 12050 12051 _off: function( element, eventName ) { 12052 eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) + 12053 this.eventNamespace; 12054 element.off( eventName ); 12055 12056 // Clear the stack to avoid memory leaks (#10056) 12057 this.bindings = $( this.bindings.not( element ).get() ); 12058 this.focusable = $( this.focusable.not( element ).get() ); 12059 this.hoverable = $( this.hoverable.not( element ).get() ); 12060 }, 12061 12062 _delay: function( handler, delay ) { 12063 function handlerProxy() { 12064 return ( typeof handler === "string" ? instance[ handler ] : handler ) 12065 .apply( instance, arguments ); 12066 } 12067 var instance = this; 12068 return setTimeout( handlerProxy, delay || 0 ); 12069 }, 12070 12071 _hoverable: function( element ) { 12072 this.hoverable = this.hoverable.add( element ); 12073 this._on( element, { 12074 mouseenter: function( event ) { 12075 this._addClass( $( event.currentTarget ), null, "ui-state-hover" ); 12076 }, 12077 mouseleave: function( event ) { 12078 this._removeClass( $( event.currentTarget ), null, "ui-state-hover" ); 12079 } 12080 } ); 12081 }, 12082 12083 _focusable: function( element ) { 12084 this.focusable = this.focusable.add( element ); 12085 this._on( element, { 12086 focusin: function( event ) { 12087 this._addClass( $( event.currentTarget ), null, "ui-state-focus" ); 12088 }, 12089 focusout: function( event ) { 12090 this._removeClass( $( event.currentTarget ), null, "ui-state-focus" ); 12091 } 12092 } ); 12093 }, 12094 12095 _trigger: function( type, event, data ) { 12096 var prop, orig; 12097 var callback = this.options[ type ]; 12098 12099 data = data || {}; 12100 event = $.Event( event ); 12101 event.type = ( type === this.widgetEventPrefix ? 12102 type : 12103 this.widgetEventPrefix + type ).toLowerCase(); 12104 12105 // The original event may come from any element 12106 // so we need to reset the target on the new event 12107 event.target = this.element[ 0 ]; 12108 12109 // Copy original event properties over to the new event 12110 orig = event.originalEvent; 12111 if ( orig ) { 12112 for ( prop in orig ) { 12113 if ( !( prop in event ) ) { 12114 event[ prop ] = orig[ prop ]; 12115 } 12116 } 12117 } 12118 12119 this.element.trigger( event, data ); 12120 return !( typeof callback === "function" && 12121 callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false || 12122 event.isDefaultPrevented() ); 12123 } 12124}; 12125 12126$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { 12127 $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { 12128 if ( typeof options === "string" ) { 12129 options = { effect: options }; 12130 } 12131 12132 var hasOptions; 12133 var effectName = !options ? 12134 method : 12135 options === true || typeof options === "number" ? 12136 defaultEffect : 12137 options.effect || defaultEffect; 12138 12139 options = options || {}; 12140 if ( typeof options === "number" ) { 12141 options = { duration: options }; 12142 } else if ( options === true ) { 12143 options = {}; 12144 } 12145 12146 hasOptions = !$.isEmptyObject( options ); 12147 options.complete = callback; 12148 12149 if ( options.delay ) { 12150 element.delay( options.delay ); 12151 } 12152 12153 if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { 12154 element[ method ]( options ); 12155 } else if ( effectName !== method && element[ effectName ] ) { 12156 element[ effectName ]( options.duration, options.easing, callback ); 12157 } else { 12158 element.queue( function( next ) { 12159 $( this )[ method ](); 12160 if ( callback ) { 12161 callback.call( element[ 0 ] ); 12162 } 12163 next(); 12164 } ); 12165 } 12166 }; 12167} ); 12168 12169var widget = $.widget; 12170 12171 12172/*! 12173 * jQuery UI Position 1.1
vendor: 1,610 bytes, lines 12173-12246
121733.2 12174 * http://jqueryui.com 12175 * 12176 * Copyright jQuery Foundation and other contributors 12177 * Released under the MIT license. 12178 * http://jquery.org/license 12179 * 12180 * http://api.jqueryui.com/position/ 12181 */ 12182 12183//>>label: Position 12184//>>group: Core 12185//>>description: Positions elements relative to other elements. 12186//>>docs: http://api.jqueryui.com/position/ 12187//>>demos: http://jqueryui.com/position/ 12188 12189 12190( function() { 12191var cachedScrollbarWidth, 12192 max = Math.max, 12193 abs = Math.abs, 12194 rhorizontal = /left|center|right/, 12195 rvertical = /top|center|bottom/, 12196 roffset = /[\+\-]\d+(\.[\d]+)?%?/, 12197 rposition = /^\w+/, 12198 rpercent = /%$/, 12199 _position = $.fn.position; 12200 12201function getOffsets( offsets, width, height ) { 12202 return [ 12203 parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), 12204 parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) 12205 ]; 12206} 12207 12208function parseCss( element, property ) { 12209 return parseInt( $.css( element, property ), 10 ) || 0; 12210} 12211 12212function isWindow( obj ) { 12213 return obj != null && obj === obj.window; 12214} 12215 12216function getDimensions( elem ) { 12217 var raw = elem[ 0 ]; 12218 if ( raw.nodeType === 9 ) { 12219 return { 12220 width: elem.width(), 12221 height: elem.height(), 12222 offset: { top: 0, left: 0 } 12223 }; 12224 } 12225 if ( isWindow( raw ) ) { 12226 return { 12227 width: elem.width(), 12228 height: elem.height(), 12229 offset: { top: elem.scrollTop(), left: elem.scrollLeft() } 12230 }; 12231 } 12232 if ( raw.preventDefault ) { 12233 return { 12234 width: 0, 12235 height: 0, 12236 offset: { top: raw.pageY, left: raw.pageX } 12237 }; 12238 } 12239 return { 12240 width: elem.outerWidth(), 12241 height: elem.outerHeight(), 12242 offset: elem.offset() 12243 }; 12244} 12245 12246$.position =
vendor: 13,231 bytes, lines 12246-12670
12246 { 12247 scrollbarWidth: function() { 12248 if ( cachedScrollbarWidth !== undefined ) { 12249 return cachedScrollbarWidth; 12250 } 12251 var w1, w2, 12252 div = $( "<div style=" + 12253 "'display:block;position:absolute;width:200px;height:200px;overflow:hidden;'>" + 12254 "<div style='height:300px;width:auto;'></div></div>" ), 12255 innerDiv = div.children()[ 0 ]; 12256 12257 $( "body" ).append( div ); 12258 w1 = innerDiv.offsetWidth; 12259 div.css( "overflow", "scroll" ); 12260 12261 w2 = innerDiv.offsetWidth; 12262 12263 if ( w1 === w2 ) { 12264 w2 = div[ 0 ].clientWidth; 12265 } 12266 12267 div.remove(); 12268 12269 return ( cachedScrollbarWidth = w1 - w2 ); 12270 }, 12271 getScrollInfo: function( within ) { 12272 var overflowX = within.isWindow || within.isDocument ? "" : 12273 within.element.css( "overflow-x" ), 12274 overflowY = within.isWindow || within.isDocument ? "" : 12275 within.element.css( "overflow-y" ), 12276 hasOverflowX = overflowX === "scroll" || 12277 ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ), 12278 hasOverflowY = overflowY === "scroll" || 12279 ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight ); 12280 return { 12281 width: hasOverflowY ? $.position.scrollbarWidth() : 0, 12282 height: hasOverflowX ? $.position.scrollbarWidth() : 0 12283 }; 12284 }, 12285 getWithinInfo: function( element ) { 12286 var withinElement = $( element || window ), 12287 isElemWindow = isWindow( withinElement[ 0 ] ), 12288 isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9, 12289 hasOffset = !isElemWindow && !isDocument; 12290 return { 12291 element: withinElement, 12292 isWindow: isElemWindow, 12293 isDocument: isDocument, 12294 offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 }, 12295 scrollLeft: withinElement.scrollLeft(), 12296 scrollTop: withinElement.scrollTop(), 12297 width: withinElement.outerWidth(), 12298 height: withinElement.outerHeight() 12299 }; 12300 } 12301}; 12302 12303$.fn.position = function( options ) { 12304 if ( !options || !options.of ) { 12305 return _position.apply( this, arguments ); 12306 } 12307 12308 // Make a copy, we don't want to modify arguments 12309 options = $.extend( {}, options ); 12310 12311 var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, 12312 12313 // Make sure string options are treated as CSS selectors 12314 target = typeof options.of === "string" ? 12315 $( document ).find( options.of ) : 12316 $( options.of ), 12317 12318 within = $.position.getWithinInfo( options.within ), 12319 scrollInfo = $.position.getScrollInfo( within ), 12320 collision = ( options.collision || "flip" ).split( " " ), 12321 offsets = {}; 12322 12323 dimensions = getDimensions( target ); 12324 if ( target[ 0 ].preventDefault ) { 12325 12326 // Force left top to allow flipping 12327 options.at = "left top"; 12328 } 12329 targetWidth = dimensions.width; 12330 targetHeight = dimensions.height; 12331 targetOffset = dimensions.offset; 12332 12333 // Clone to reuse original targetOffset later 12334 basePosition = $.extend( {}, targetOffset ); 12335 12336 // Force my and at to have valid horizontal and vertical positions 12337 // if a value is missing or invalid, it will be converted to center 12338 $.each( [ "my", "at" ], function() { 12339 var pos = ( options[ this ] || "" ).split( " " ), 12340 horizontalOffset, 12341 verticalOffset; 12342 12343 if ( pos.length === 1 ) { 12344 pos = rhorizontal.test( pos[ 0 ] ) ? 12345 pos.concat( [ "center" ] ) : 12346 rvertical.test( pos[ 0 ] ) ? 12347 [ "center" ].concat( pos ) : 12348 [ "center", "center" ]; 12349 } 12350 pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; 12351 pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; 12352 12353 // Calculate offsets 12354 horizontalOffset = roffset.exec( pos[ 0 ] ); 12355 verticalOffset = roffset.exec( pos[ 1 ] ); 12356 offsets[ this ] = [ 12357 horizontalOffset ? horizontalOffset[ 0 ] : 0, 12358 verticalOffset ? verticalOffset[ 0 ] : 0 12359 ]; 12360 12361 // Reduce to just the positions without the offsets 12362 options[ this ] = [ 12363 rposition.exec( pos[ 0 ] )[ 0 ], 12364 rposition.exec( pos[ 1 ] )[ 0 ] 12365 ]; 12366 } ); 12367 12368 // Normalize collision option 12369 if ( collision.length === 1 ) { 12370 collision[ 1 ] = collision[ 0 ]; 12371 } 12372 12373 if ( options.at[ 0 ] === "right" ) { 12374 basePosition.left += targetWidth; 12375 } else if ( options.at[ 0 ] === "center" ) { 12376 basePosition.left += targetWidth / 2; 12377 } 12378 12379 if ( options.at[ 1 ] === "bottom" ) { 12380 basePosition.top += targetHeight; 12381 } else if ( options.at[ 1 ] === "center" ) { 12382 basePosition.top += targetHeight / 2; 12383 } 12384 12385 atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); 12386 basePosition.left += atOffset[ 0 ]; 12387 basePosition.top += atOffset[ 1 ]; 12388 12389 return this.each( function() { 12390 var collisionPosition, using, 12391 elem = $( this ), 12392 elemWidth = elem.outerWidth(), 12393 elemHeight = elem.outerHeight(), 12394 marginLeft = parseCss( this, "marginLeft" ), 12395 marginTop = parseCss( this, "marginTop" ), 12396 collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + 12397 scrollInfo.width, 12398 collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + 12399 scrollInfo.height, 12400 position = $.extend( {}, basePosition ), 12401 myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); 12402 12403 if ( options.my[ 0 ] === "right" ) { 12404 position.left -= elemWidth; 12405 } else if ( options.my[ 0 ] === "center" ) { 12406 position.left -= elemWidth / 2; 12407 } 12408 12409 if ( options.my[ 1 ] === "bottom" ) { 12410 position.top -= elemHeight; 12411 } else if ( options.my[ 1 ] === "center" ) { 12412 position.top -= elemHeight / 2; 12413 } 12414 12415 position.left += myOffset[ 0 ]; 12416 position.top += myOffset[ 1 ]; 12417 12418 collisionPosition = { 12419 marginLeft: marginLeft, 12420 marginTop: marginTop 12421 }; 12422 12423 $.each( [ "left", "top" ], function( i, dir ) { 12424 if ( $.ui.position[ collision[ i ] ] ) { 12425 $.ui.position[ collision[ i ] ][ dir ]( position, { 12426 targetWidth: targetWidth, 12427 targetHeight: targetHeight, 12428 elemWidth: elemWidth, 12429 elemHeight: elemHeight, 12430 collisionPosition: collisionPosition, 12431 collisionWidth: collisionWidth, 12432 collisionHeight: collisionHeight, 12433 offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], 12434 my: options.my, 12435 at: options.at, 12436 within: within, 12437 elem: elem 12438 } ); 12439 } 12440 } ); 12441 12442 if ( options.using ) { 12443 12444 // Adds feedback as second argument to using callback, if present 12445 using = function( props ) { 12446 var left = targetOffset.left - position.left, 12447 right = left + targetWidth - elemWidth, 12448 top = targetOffset.top - position.top, 12449 bottom = top + targetHeight - elemHeight, 12450 feedback = { 12451 target: { 12452 element: target, 12453 left: targetOffset.left, 12454 top: targetOffset.top, 12455 width: targetWidth, 12456 height: targetHeight 12457 }, 12458 element: { 12459 element: elem, 12460 left: position.left, 12461 top: position.top, 12462 width: elemWidth, 12463 height: elemHeight 12464 }, 12465 horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", 12466 vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" 12467 }; 12468 if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { 12469 feedback.horizontal = "center"; 12470 } 12471 if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { 12472 feedback.vertical = "middle"; 12473 } 12474 if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { 12475 feedback.important = "horizontal"; 12476 } else { 12477 feedback.important = "vertical"; 12478 } 12479 options.using.call( this, props, feedback ); 12480 }; 12481 } 12482 12483 elem.offset( $.extend( position, { using: using } ) ); 12484 } ); 12485}; 12486 12487$.ui.position = { 12488 fit: { 12489 left: function( position, data ) { 12490 var within = data.within, 12491 withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, 12492 outerWidth = within.width, 12493 collisionPosLeft = position.left - data.collisionPosition.marginLeft, 12494 overLeft = withinOffset - collisionPosLeft, 12495 overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, 12496 newOverRight; 12497 12498 // Element is wider than within 12499 if ( data.collisionWidth > outerWidth ) { 12500 12501 // Element is initially over the left side of within 12502 if ( overLeft > 0 && overRight <= 0 ) { 12503 newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - 12504 withinOffset; 12505 position.left += overLeft - newOverRight; 12506 12507 // Element is initially over right side of within 12508 } else if ( overRight > 0 && overLeft <= 0 ) { 12509 position.left = withinOffset; 12510 12511 // Element is initially over both left and right sides of within 12512 } else { 12513 if ( overLeft > overRight ) { 12514 position.left = withinOffset + outerWidth - data.collisionWidth; 12515 } else { 12516 position.left = withinOffset; 12517 } 12518 } 12519 12520 // Too far left -> align with left edge 12521 } else if ( overLeft > 0 ) { 12522 position.left += overLeft; 12523 12524 // Too far right -> align with right edge 12525 } else if ( overRight > 0 ) { 12526 position.left -= overRight; 12527 12528 // Adjust based on position and margin 12529 } else { 12530 position.left = max( position.left - collisionPosLeft, position.left ); 12531 } 12532 }, 12533 top: function( position, data ) { 12534 var within = data.within, 12535 withinOffset = within.isWindow ? within.scrollTop : within.offset.top, 12536 outerHeight = data.within.height, 12537 collisionPosTop = position.top - data.collisionPosition.marginTop, 12538 overTop = withinOffset - collisionPosTop, 12539 overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, 12540 newOverBottom; 12541 12542 // Element is taller than within 12543 if ( data.collisionHeight > outerHeight ) { 12544 12545 // Element is initially over the top of within 12546 if ( overTop > 0 && overBottom <= 0 ) { 12547 newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - 12548 withinOffset; 12549 position.top += overTop - newOverBottom; 12550 12551 // Element is initially over bottom of within 12552 } else if ( overBottom > 0 && overTop <= 0 ) { 12553 position.top = withinOffset; 12554 12555 // Element is initially over both top and bottom of within 12556 } else { 12557 if ( overTop > overBottom ) { 12558 position.top = withinOffset + outerHeight - data.collisionHeight; 12559 } else { 12560 position.top = withinOffset; 12561 } 12562 } 12563 12564 // Too far up -> align with top 12565 } else if ( overTop > 0 ) { 12566 position.top += overTop; 12567 12568 // Too far down -> align with bottom edge 12569 } else if ( overBottom > 0 ) { 12570 position.top -= overBottom; 12571 12572 // Adjust based on position and margin 12573 } else { 12574 position.top = max( position.top - collisionPosTop, position.top ); 12575 } 12576 } 12577 }, 12578 flip: { 12579 left: function( position, data ) { 12580 var within = data.within, 12581 withinOffset = within.offset.left + within.scrollLeft, 12582 outerWidth = within.width, 12583 offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, 12584 collisionPosLeft = position.left - data.collisionPosition.marginLeft, 12585 overLeft = collisionPosLeft - offsetLeft, 12586 overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, 12587 myOffset = data.my[ 0 ] === "left" ? 12588 -data.elemWidth : 12589 data.my[ 0 ] === "right" ? 12590 data.elemWidth : 12591 0, 12592 atOffset = data.at[ 0 ] === "left" ? 12593 data.targetWidth : 12594 data.at[ 0 ] === "right" ? 12595 -data.targetWidth : 12596 0, 12597 offset = -2 * data.offset[ 0 ], 12598 newOverRight, 12599 newOverLeft; 12600 12601 if ( overLeft < 0 ) { 12602 newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - 12603 outerWidth - withinOffset; 12604 if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { 12605 position.left += myOffset + atOffset + offset; 12606 } 12607 } else if ( overRight > 0 ) { 12608 newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + 12609 atOffset + offset - offsetLeft; 12610 if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { 12611 position.left += myOffset + atOffset + offset; 12612 } 12613 } 12614 }, 12615 top: function( position, data ) { 12616 var within = data.within, 12617 withinOffset = within.offset.top + within.scrollTop, 12618 outerHeight = within.height, 12619 offsetTop = within.isWindow ? within.scrollTop : within.offset.top, 12620 collisionPosTop = position.top - data.collisionPosition.marginTop, 12621 overTop = collisionPosTop - offsetTop, 12622 overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, 12623 top = data.my[ 1 ] === "top", 12624 myOffset = top ? 12625 -data.elemHeight : 12626 data.my[ 1 ] === "bottom" ? 12627 data.elemHeight : 12628 0, 12629 atOffset = data.at[ 1 ] === "top" ? 12630 data.targetHeight : 12631 data.at[ 1 ] === "bottom" ? 12632 -data.targetHeight : 12633 0, 12634 offset = -2 * data.offset[ 1 ], 12635 newOverTop, 12636 newOverBottom; 12637 if ( overTop < 0 ) { 12638 newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - 12639 outerHeight - withinOffset; 12640 if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { 12641 position.top += myOffset + atOffset + offset; 12642 } 12643 } else if ( overBottom > 0 ) { 12644 newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + 12645 offset - offsetTop; 12646 if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { 12647 position.top += myOffset + atOffset + offset; 12648 } 12649 } 12650 } 12651 }, 12652 flipfit: { 12653 left: function() { 12654 $.ui.position.flip.left.apply( this, arguments ); 12655 $.ui.position.fit.left.apply( this, arguments ); 12656 }, 12657 top: function() { 12658 $.ui.position.flip.top.apply( this, arguments ); 12659 $.ui.position.fit.top.apply( this, arguments ); 12660 } 12661 } 12662}; 12663 12664} )(); 12665 12666var position = $.ui.position; 12667 12668 12669/*! 12670 * jQuery UI
12670:data 1.13.2 12671 * http://jqueryui.com 12672 * 12673 * Copyright jQuery Foundation and other contributors 12674 * Released under the MIT license. 12675 * http://jquery.org/license 12676 */ 12677 12678//>>label: :data Selector
vendor: 1,696 bytes, lines 12679-12747
12679//>>group: Core 12680//>>description: Selects elements which have data stored under the specified key. 12681//>>docs: http://api.jqueryui.com/data-selector/ 12682 12683 12684var data = $.extend( $.expr.pseudos, { 12685 data: $.expr.createPseudo ? 12686 $.expr.createPseudo( function( dataName ) { 12687 return function( elem ) { 12688 return !!$.data( elem, dataName ); 12689 }; 12690 } ) : 12691 12692 // Support: jQuery <1.8 12693 function( elem, i, match ) { 12694 return !!$.data( elem, match[ 3 ] ); 12695 } 12696} ); 12697 12698/*! 12699 * jQuery UI Disable Selection 1.13.2 12700 * http://jqueryui.com 12701 * 12702 * Copyright jQuery Foundation and other contributors 12703 * Released under the MIT license. 12704 * http://jquery.org/license 12705 */ 12706 12707//>>label: disableSelection 12708//>>group: Core 12709//>>description: Disable selection of text content within the set of matched elements. 12710//>>docs: http://api.jqueryui.com/disableSelection/ 12711 12712// This file is deprecated 12713 12714var disableSelection = $.fn.extend( { 12715 disableSelection: ( function() { 12716 var eventType = "onselectstart" in document.createElement( "div" ) ? 12717 "selectstart" : 12718 "mousedown"; 12719 12720 return function() { 12721 return this.on( eventType + ".ui-disableSelection", function( event ) { 12722 event.preventDefault(); 12723 } ); 12724 }; 12725 } )(), 12726 12727 enableSelection: function() { 12728 return this.off( ".ui-disableSelection" ); 12729 } 12730} ); 12731 12732 12733 12734// Create a local jQuery because jQuery Color relies on it and the 12735// global may not exist with AMD and a custom build (#10199). 12736// This module is a noop if used as a regular AMD module. 12737// eslint-disable-next-line no-unused-vars 12738var jQuery = $; 12739 12740 12741/*! 12742 * jQuery Color Animations v2.2.0 12743 * https://github.com/jquery/jquery-color 12744 * 12745 * Copyright OpenJS Foundation and other contributors 12746 * Released under the MIT license. 12747 * http
vendor: 16,926 bytes, lines 12747-13454
12747://jquery.org/license 12748 * 12749 * Date: Sun May 10 09:02:36 2020 +0200 12750 */ 12751 12752 12753 12754 var stepHooks = "backgroundColor borderBottomColor borderLeftColor borderRightColor " + 12755 "borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor", 12756 12757 class2type = {}, 12758 toString = class2type.toString, 12759 12760 // plusequals test for += 100 -= 100 12761 rplusequals = /^([\-+])=\s*(\d+\.?\d*)/, 12762 12763 // a set of RE's that can match strings and generate color tuples. 12764 stringParsers = [ { 12765 re: /rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, 12766 parse: function( execResult ) { 12767 return [ 12768 execResult[ 1 ], 12769 execResult[ 2 ], 12770 execResult[ 3 ], 12771 execResult[ 4 ] 12772 ]; 12773 } 12774 }, { 12775 re: /rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, 12776 parse: function( execResult ) { 12777 return [ 12778 execResult[ 1 ] * 2.55, 12779 execResult[ 2 ] * 2.55, 12780 execResult[ 3 ] * 2.55, 12781 execResult[ 4 ] 12782 ]; 12783 } 12784 }, { 12785 12786 // this regex ignores A-F because it's compared against an already lowercased string 12787 re: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})?/, 12788 parse: function( execResult ) { 12789 return [ 12790 parseInt( execResult[ 1 ], 16 ), 12791 parseInt( execResult[ 2 ], 16 ), 12792 parseInt( execResult[ 3 ], 16 ), 12793 execResult[ 4 ] ? 12794 ( parseInt( execResult[ 4 ], 16 ) / 255 ).toFixed( 2 ) : 12795 1 12796 ]; 12797 } 12798 }, { 12799 12800 // this regex ignores A-F because it's compared against an already lowercased string 12801 re: /#([a-f0-9])([a-f0-9])([a-f0-9])([a-f0-9])?/, 12802 parse: function( execResult ) { 12803 return [ 12804 parseInt( execResult[ 1 ] + execResult[ 1 ], 16 ), 12805 parseInt( execResult[ 2 ] + execResult[ 2 ], 16 ), 12806 parseInt( execResult[ 3 ] + execResult[ 3 ], 16 ), 12807 execResult[ 4 ] ? 12808 ( parseInt( execResult[ 4 ] + execResult[ 4 ], 16 ) / 255 ) 12809 .toFixed( 2 ) : 12810 1 12811 ]; 12812 } 12813 }, { 12814 re: /hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/, 12815 space: "hsla", 12816 parse: function( execResult ) { 12817 return [ 12818 execResult[ 1 ], 12819 execResult[ 2 ] / 100, 12820 execResult[ 3 ] / 100, 12821 execResult[ 4 ] 12822 ]; 12823 } 12824 } ], 12825 12826 // jQuery.Color( ) 12827 color = jQuery.Color = function( color, green, blue, alpha ) { 12828 return new jQuery.Color.fn.parse( color, green, blue, alpha ); 12829 }, 12830 spaces = { 12831 rgba: { 12832 props: { 12833 red: { 12834 idx: 0, 12835 type: "byte" 12836 }, 12837 green: { 12838 idx: 1, 12839 type: "byte" 12840 }, 12841 blue: { 12842 idx: 2, 12843 type: "byte" 12844 } 12845 } 12846 }, 12847 12848 hsla: { 12849 props: { 12850 hue: { 12851 idx: 0, 12852 type: "degrees" 12853 }, 12854 saturation: { 12855 idx: 1, 12856 type: "percent" 12857 }, 12858 lightness: { 12859 idx: 2, 12860 type: "percent" 12861 } 12862 } 12863 } 12864 }, 12865 propTypes = { 12866 "byte": { 12867 floor: true, 12868 max: 255 12869 }, 12870 "percent": { 12871 max: 1 12872 }, 12873 "degrees": { 12874 mod: 360, 12875 floor: true 12876 } 12877 }, 12878 support = color.support = {}, 12879 12880 // element for support tests 12881 supportElem = jQuery( "<p>" )[ 0 ], 12882 12883 // colors = jQuery.Color.names 12884 colors, 12885 12886 // local aliases of functions called often 12887 each = jQuery.each; 12888 12889// determine rgba support immediately 12890supportElem.style.cssText = "background-color:rgba(1,1,1,.5)"; 12891support.rgba = supportElem.style.backgroundColor.indexOf( "rgba" ) > -1; 12892 12893// define cache name and alpha properties 12894// for rgba and hsla spaces 12895each( spaces, function( spaceName, space ) { 12896 space.cache = "_" + spaceName; 12897 space.props.alpha = { 12898 idx: 3, 12899 type: "percent", 12900 def: 1 12901 }; 12902} ); 12903 12904// Populate the class2type map 12905jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 12906 function( _i, name ) { 12907 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 12908 } ); 12909 12910function getType( obj ) { 12911 if ( obj == null ) { 12912 return obj + ""; 12913 } 12914 12915 return typeof obj === "object" ? 12916 class2type[ toString.call( obj ) ] || "object" : 12917 typeof obj; 12918} 12919 12920function clamp( value, prop, allowEmpty ) { 12921 var type = propTypes[ prop.type ] || {}; 12922 12923 if ( value == null ) { 12924 return ( allowEmpty || !prop.def ) ? null : prop.def; 12925 } 12926 12927 // ~~ is an short way of doing floor for positive numbers 12928 value = type.floor ? ~~value : parseFloat( value ); 12929 12930 // IE will pass in empty strings as value for alpha, 12931 // which will hit this case 12932 if ( isNaN( value ) ) { 12933 return prop.def; 12934 } 12935 12936 if ( type.mod ) { 12937 12938 // we add mod before modding to make sure that negatives values 12939 // get converted properly: -10 -> 350 12940 return ( value + type.mod ) % type.mod; 12941 } 12942 12943 // for now all property types without mod have min and max 12944 return Math.min( type.max, Math.max( 0, value ) ); 12945} 12946 12947function stringParse( string ) { 12948 var inst = color(), 12949 rgba = inst._rgba = []; 12950 12951 string = string.toLowerCase(); 12952 12953 each( stringParsers, function( _i, parser ) { 12954 var parsed, 12955 match = parser.re.exec( string ), 12956 values = match && parser.parse( match ), 12957 spaceName = parser.space || "rgba"; 12958 12959 if ( values ) { 12960 parsed = inst[ spaceName ]( values ); 12961 12962 // if this was an rgba parse the assignment might happen twice 12963 // oh well.... 12964 inst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ]; 12965 rgba = inst._rgba = parsed._rgba; 12966 12967 // exit each( stringParsers ) here because we matched 12968 return false; 12969 } 12970 } ); 12971 12972 // Found a stringParser that handled it 12973 if ( rgba.length ) { 12974 12975 // if this came from a parsed string, force "transparent" when alpha is 0 12976 // chrome, (and maybe others) return "transparent" as rgba(0,0,0,0) 12977 if ( rgba.join() === "0,0,0,0" ) { 12978 jQuery.extend( rgba, colors.transparent ); 12979 } 12980 return inst; 12981 } 12982 12983 // named colors 12984 return colors[ string ]; 12985} 12986 12987color.fn = jQuery.extend( color.prototype, { 12988 parse: function( red, green, blue, alpha ) { 12989 if ( red === undefined ) { 12990 this._rgba = [ null, null, null, null ]; 12991 return this; 12992 } 12993 if ( red.jquery || red.nodeType ) { 12994 red = jQuery( red ).css( green ); 12995 green = undefined; 12996 } 12997 12998 var inst = this, 12999 type = getType( red ), 13000 rgba = this._rgba = []; 13001 13002 // more than 1 argument specified - assume ( red, green, blue, alpha ) 13003 if ( green !== undefined ) { 13004 red = [ red, green, blue, alpha ]; 13005 type = "array"; 13006 } 13007 13008 if ( type === "string" ) { 13009 return this.parse( stringParse( red ) || colors._default ); 13010 } 13011 13012 if ( type === "array" ) { 13013 each( spaces.rgba.props, function( _key, prop ) { 13014 rgba[ prop.idx ] = clamp( red[ prop.idx ], prop ); 13015 } ); 13016 return this; 13017 } 13018 13019 if ( type === "object" ) { 13020 if ( red instanceof color ) { 13021 each( spaces, function( _spaceName, space ) { 13022 if ( red[ space.cache ] ) { 13023 inst[ space.cache ] = red[ space.cache ].slice(); 13024 } 13025 } ); 13026 } else { 13027 each( spaces, function( _spaceName, space ) { 13028 var cache = space.cache; 13029 each( space.props, function( key, prop ) { 13030 13031 // if the cache doesn't exist, and we know how to convert 13032 if ( !inst[ cache ] && space.to ) { 13033 13034 // if the value was null, we don't need to copy it 13035 // if the key was alpha, we don't need to copy it either 13036 if ( key === "alpha" || red[ key ] == null ) { 13037 return; 13038 } 13039 inst[ cache ] = space.to( inst._rgba ); 13040 } 13041 13042 // this is the only case where we allow nulls for ALL properties. 13043 // call clamp with alwaysAllowEmpty 13044 inst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true ); 13045 } ); 13046 13047 // everything defined but alpha? 13048 if ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) { 13049 13050 // use the default of 1 13051 if ( inst[ cache ][ 3 ] == null ) { 13052 inst[ cache ][ 3 ] = 1; 13053 } 13054 13055 if ( space.from ) { 13056 inst._rgba = space.from( inst[ cache ] ); 13057 } 13058 } 13059 } ); 13060 } 13061 return this; 13062 } 13063 }, 13064 is: function( compare ) { 13065 var is = color( compare ), 13066 same = true, 13067 inst = this; 13068 13069 each( spaces, function( _, space ) { 13070 var localCache, 13071 isCache = is[ space.cache ]; 13072 if ( isCache ) { 13073 localCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || []; 13074 each( space.props, function( _, prop ) { 13075 if ( isCache[ prop.idx ] != null ) { 13076 same = ( isCache[ prop.idx ] === localCache[ prop.idx ] ); 13077 return same; 13078 } 13079 } ); 13080 } 13081 return same; 13082 } ); 13083 return same; 13084 }, 13085 _space: function() { 13086 var used = [], 13087 inst = this; 13088 each( spaces, function( spaceName, space ) { 13089 if ( inst[ space.cache ] ) { 13090 used.push( spaceName ); 13091 } 13092 } ); 13093 return used.pop(); 13094 }, 13095 transition: function( other, distance ) { 13096 var end = color( other ), 13097 spaceName = end._space(), 13098 space = spaces[ spaceName ], 13099 startColor = this.alpha() === 0 ? color( "transparent" ) : this, 13100 start = startColor[ space.cache ] || space.to( startColor._rgba ), 13101 result = start.slice(); 13102 13103 end = end[ space.cache ]; 13104 each( space.props, function( _key, prop ) { 13105 var index = prop.idx, 13106 startValue = start[ index ], 13107 endValue = end[ index ], 13108 type = propTypes[ prop.type ] || {}; 13109 13110 // if null, don't override start value 13111 if ( endValue === null ) { 13112 return; 13113 } 13114 13115 // if null - use end 13116 if ( startValue === null ) { 13117 result[ index ] = endValue; 13118 } else { 13119 if ( type.mod ) { 13120 if ( endValue - startValue > type.mod / 2 ) { 13121 startValue += type.mod; 13122 } else if ( startValue - endValue > type.mod / 2 ) { 13123 startValue -= type.mod; 13124 } 13125 } 13126 result[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop ); 13127 } 13128 } ); 13129 return this[ spaceName ]( result ); 13130 }, 13131 blend: function( opaque ) { 13132 13133 // if we are already opaque - return ourself 13134 if ( this._rgba[ 3 ] === 1 ) { 13135 return this; 13136 } 13137 13138 var rgb = this._rgba.slice(), 13139 a = rgb.pop(), 13140 blend = color( opaque )._rgba; 13141 13142 return color( jQuery.map( rgb, function( v, i ) { 13143 return ( 1 - a ) * blend[ i ] + a * v; 13144 } ) ); 13145 }, 13146 toRgbaString: function() { 13147 var prefix = "rgba(", 13148 rgba = jQuery.map( this._rgba, function( v, i ) { 13149 if ( v != null ) { 13150 return v; 13151 } 13152 return i > 2 ? 1 : 0; 13153 } ); 13154 13155 if ( rgba[ 3 ] === 1 ) { 13156 rgba.pop(); 13157 prefix = "rgb("; 13158 } 13159 13160 return prefix + rgba.join() + ")"; 13161 }, 13162 toHslaString: function() { 13163 var prefix = "hsla(", 13164 hsla = jQuery.map( this.hsla(), function( v, i ) { 13165 if ( v == null ) { 13166 v = i > 2 ? 1 : 0; 13167 } 13168 13169 // catch 1 and 2 13170 if ( i && i < 3 ) { 13171 v = Math.round( v * 100 ) + "%"; 13172 } 13173 return v; 13174 } ); 13175 13176 if ( hsla[ 3 ] === 1 ) { 13177 hsla.pop(); 13178 prefix = "hsl("; 13179 } 13180 return prefix + hsla.join() + ")"; 13181 }, 13182 toHexString: function( includeAlpha ) { 13183 var rgba = this._rgba.slice(), 13184 alpha = rgba.pop(); 13185 13186 if ( includeAlpha ) { 13187 rgba.push( ~~( alpha * 255 ) ); 13188 } 13189 13190 return "#" + jQuery.map( rgba, function( v ) { 13191 13192 // default to 0 when nulls exist 13193 v = ( v || 0 ).toString( 16 ); 13194 return v.length === 1 ? "0" + v : v; 13195 } ).join( "" ); 13196 }, 13197 toString: function() { 13198 return this._rgba[ 3 ] === 0 ? "transparent" : this.toRgbaString(); 13199 } 13200} ); 13201color.fn.parse.prototype = color.fn; 13202 13203// hsla conversions adapted from: 13204// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021 13205 13206function hue2rgb( p, q, h ) { 13207 h = ( h + 1 ) % 1; 13208 if ( h * 6 < 1 ) { 13209 return p + ( q - p ) * h * 6; 13210 } 13211 if ( h * 2 < 1 ) { 13212 return q; 13213 } 13214 if ( h * 3 < 2 ) { 13215 return p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6; 13216 } 13217 return p; 13218} 13219 13220spaces.hsla.to = function( rgba ) { 13221 if ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) { 13222 return [ null, null, null, rgba[ 3 ] ]; 13223 } 13224 var r = rgba[ 0 ] / 255, 13225 g = rgba[ 1 ] / 255, 13226 b = rgba[ 2 ] / 255, 13227 a = rgba[ 3 ], 13228 max = Math.max( r, g, b ), 13229 min = Math.min( r, g, b ), 13230 diff = max - min, 13231 add = max + min, 13232 l = add * 0.5, 13233 h, s; 13234 13235 if ( min === max ) { 13236 h = 0; 13237 } else if ( r === max ) { 13238 h = ( 60 * ( g - b ) / diff ) + 360; 13239 } else if ( g === max ) { 13240 h = ( 60 * ( b - r ) / diff ) + 120; 13241 } else { 13242 h = ( 60 * ( r - g ) / diff ) + 240; 13243 } 13244 13245 // chroma (diff) == 0 means greyscale which, by definition, saturation = 0% 13246 // otherwise, saturation is based on the ratio of chroma (diff) to lightness (add) 13247 if ( diff === 0 ) { 13248 s = 0; 13249 } else if ( l <= 0.5 ) { 13250 s = diff / add; 13251 } else { 13252 s = diff / ( 2 - add ); 13253 } 13254 return [ Math.round( h ) % 360, s, l, a == null ? 1 : a ]; 13255}; 13256 13257spaces.hsla.from = function( hsla ) { 13258 if ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) { 13259 return [ null, null, null, hsla[ 3 ] ]; 13260 } 13261 var h = hsla[ 0 ] / 360, 13262 s = hsla[ 1 ], 13263 l = hsla[ 2 ], 13264 a = hsla[ 3 ], 13265 q = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s, 13266 p = 2 * l - q; 13267 13268 return [ 13269 Math.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ), 13270 Math.round( hue2rgb( p, q, h ) * 255 ), 13271 Math.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ), 13272 a 13273 ]; 13274}; 13275 13276 13277each( spaces, function( spaceName, space ) { 13278 var props = space.props, 13279 cache = space.cache, 13280 to = space.to, 13281 from = space.from; 13282 13283 // makes rgba() and hsla() 13284 color.fn[ spaceName ] = function( value ) { 13285 13286 // generate a cache for this space if it doesn't exist 13287 if ( to && !this[ cache ] ) { 13288 this[ cache ] = to( this._rgba ); 13289 } 13290 if ( value === undefined ) { 13291 return this[ cache ].slice(); 13292 } 13293 13294 var ret, 13295 type = getType( value ), 13296 arr = ( type === "array" || type === "object" ) ? value : arguments, 13297 local = this[ cache ].slice(); 13298 13299 each( props, function( key, prop ) { 13300 var val = arr[ type === "object" ? key : prop.idx ]; 13301 if ( val == null ) { 13302 val = local[ prop.idx ]; 13303 } 13304 local[ prop.idx ] = clamp( val, prop ); 13305 } ); 13306 13307 if ( from ) { 13308 ret = color( from( local ) ); 13309 ret[ cache ] = local; 13310 return ret; 13311 } else { 13312 return color( local ); 13313 } 13314 }; 13315 13316 // makes red() green() blue() alpha() hue() saturation() lightness() 13317 each( props, function( key, prop ) { 13318 13319 // alpha is included in more than one space 13320 if ( color.fn[ key ] ) { 13321 return; 13322 } 13323 color.fn[ key ] = function( value ) { 13324 var local, cur, match, fn, 13325 vtype = getType( value ); 13326 13327 if ( key === "alpha" ) { 13328 fn = this._hsla ? "hsla" : "rgba"; 13329 } else { 13330 fn = spaceName; 13331 } 13332 local = this[ fn ](); 13333 cur = local[ prop.idx ]; 13334 13335 if ( vtype === "undefined" ) { 13336 return cur; 13337 } 13338 13339 if ( vtype === "function" ) { 13340 value = value.call( this, cur ); 13341 vtype = getType( value ); 13342 } 13343 if ( value == null && prop.empty ) { 13344 return this; 13345 } 13346 if ( vtype === "string" ) { 13347 match = rplusequals.exec( value ); 13348 if ( match ) { 13349 value = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === "+" ? 1 : -1 ); 13350 } 13351 } 13352 local[ prop.idx ] = value; 13353 return this[ fn ]( local ); 13354 }; 13355 } ); 13356} ); 13357 13358// add cssHook and .fx.step function for each named hook. 13359// accept a space separated string of properties 13360color.hook = function( hook ) { 13361 var hooks = hook.split( " " ); 13362 each( hooks, function( _i, hook ) { 13363 jQuery.cssHooks[ hook ] = { 13364 set: function( elem, value ) { 13365 var parsed, curElem, 13366 backgroundColor = ""; 13367 13368 if ( value !== "transparent" && ( getType( value ) !== "string" || ( parsed = stringParse( value ) ) ) ) { 13369 value = color( parsed || value ); 13370 if ( !support.rgba && value._rgba[ 3 ] !== 1 ) { 13371 curElem = hook === "backgroundColor" ? elem.parentNode : elem; 13372 while ( 13373 ( backgroundColor === "" || backgroundColor === "transparent" ) && 13374 curElem && curElem.style 13375 ) { 13376 try { 13377 backgroundColor = jQuery.css( curElem, "backgroundColor" ); 13378 curElem = curElem.parentNode; 13379 } catch ( e ) { 13380 } 13381 } 13382 13383 value = value.blend( backgroundColor && backgroundColor !== "transparent" ? 13384 backgroundColor : 13385 "_default" ); 13386 } 13387 13388 value = value.toRgbaString(); 13389 } 13390 try { 13391 elem.style[ hook ] = value; 13392 } catch ( e ) { 13393 13394 // wrapped to prevent IE from throwing errors on "invalid" values like 'auto' or 'inherit' 13395 } 13396 } 13397 }; 13398 jQuery.fx.step[ hook ] = function( fx ) { 13399 if ( !fx.colorInit ) { 13400 fx.start = color( fx.elem, hook ); 13401 fx.end = color( fx.end ); 13402 fx.colorInit = true; 13403 } 13404 jQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) ); 13405 }; 13406 } ); 13407 13408}; 13409 13410color.hook( stepHooks ); 13411 13412jQuery.cssHooks.borderColor = { 13413 expand: function( value ) { 13414 var expanded = {}; 13415 13416 each( [ "Top", "Right", "Bottom", "Left" ], function( _i, part ) { 13417 expanded[ "border" + part + "Color" ] = value; 13418 } ); 13419 return expanded; 13420 } 13421}; 13422 13423// Basic color names only. 13424// Usage of any of the other color names requires adding yourself or including 13425// jquery.color.svg-names.js. 13426colors = jQuery.Color.names = { 13427 13428 // 4.1. Basic color keywords 13429 aqua: "#00ffff", 13430 black: "#000000", 13431 blue: "#0000ff", 13432 fuchsia: "#ff00ff", 13433 gray: "#808080", 13434 green: "#008000", 13435 lime: "#00ff00", 13436 maroon: "#800000", 13437 navy: "#000080", 13438 olive: "#808000", 13439 purple: "#800080", 13440 red: "#ff0000", 13441 silver: "#c0c0c0", 13442 teal: "#008080", 13443 white: "#ffffff", 13444 yellow: "#ffff00", 13445 13446 // 4.2.3. "transparent" color keyword 13447 transparent: [ null, null, null, 0 ], 13448 13449 _default: "#ffffff" 13450}; 13451 13452 13453/*! 13454 * jQuery UI Effects 1.13.
134542 13455 * http://jqueryui.com 13456 * 13457 * Copyright jQuery Foundation and other contributors 13458 * Released under the MIT license. 13459 * http://jquery.org/license 13460 */ 13461 13462//>>label: Effects Core 13463//>>group: Effects 13464/* eslint-disable max-len */ 13465//>>description: Extends the internal jQuery effects. Includes morphing and easing. Required by all other effects. 13466/* eslint-enable max-len */ 13467//>>docs: http://api.jqueryui.com/category/effects-core/ 13468//>>demos: http
vendor: 9,484 bytes, lines 13468-13838
13468://jqueryui.com/effect/ 13469 13470 13471var dataSpace = "ui-effects-", 13472 dataSpaceStyle = "ui-effects-style", 13473 dataSpaceAnimated = "ui-effects-animated"; 13474 13475$.effects = { 13476 effect: {} 13477}; 13478 13479/******************************************************************************/ 13480/****************************** CLASS ANIMATIONS ******************************/ 13481/******************************************************************************/ 13482( function() { 13483 13484var classAnimationActions = [ "add", "remove", "toggle" ], 13485 shorthandStyles = { 13486 border: 1, 13487 borderBottom: 1, 13488 borderColor: 1, 13489 borderLeft: 1, 13490 borderRight: 1, 13491 borderTop: 1, 13492 borderWidth: 1, 13493 margin: 1, 13494 padding: 1 13495 }; 13496 13497$.each( 13498 [ "borderLeftStyle", "borderRightStyle", "borderBottomStyle", "borderTopStyle" ], 13499 function( _, prop ) { 13500 $.fx.step[ prop ] = function( fx ) { 13501 if ( fx.end !== "none" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) { 13502 jQuery.style( fx.elem, prop, fx.end ); 13503 fx.setAttr = true; 13504 } 13505 }; 13506 } 13507); 13508 13509function camelCase( string ) { 13510 return string.replace( /-([\da-z])/gi, function( all, letter ) { 13511 return letter.toUpperCase(); 13512 } ); 13513} 13514 13515function getElementStyles( elem ) { 13516 var key, len, 13517 style = elem.ownerDocument.defaultView ? 13518 elem.ownerDocument.defaultView.getComputedStyle( elem, null ) : 13519 elem.currentStyle, 13520 styles = {}; 13521 13522 if ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) { 13523 len = style.length; 13524 while ( len-- ) { 13525 key = style[ len ]; 13526 if ( typeof style[ key ] === "string" ) { 13527 styles[ camelCase( key ) ] = style[ key ]; 13528 } 13529 } 13530 13531 // Support: Opera, IE <9 13532 } else { 13533 for ( key in style ) { 13534 if ( typeof style[ key ] === "string" ) { 13535 styles[ key ] = style[ key ]; 13536 } 13537 } 13538 } 13539 13540 return styles; 13541} 13542 13543function styleDifference( oldStyle, newStyle ) { 13544 var diff = {}, 13545 name, value; 13546 13547 for ( name in newStyle ) { 13548 value = newStyle[ name ]; 13549 if ( oldStyle[ name ] !== value ) { 13550 if ( !shorthandStyles[ name ] ) { 13551 if ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) { 13552 diff[ name ] = value; 13553 } 13554 } 13555 } 13556 } 13557 13558 return diff; 13559} 13560 13561// Support: jQuery <1.8 13562if ( !$.fn.addBack ) { 13563 $.fn.addBack = function( selector ) { 13564 return this.add( selector == null ? 13565 this.prevObject : this.prevObject.filter( selector ) 13566 ); 13567 }; 13568} 13569 13570$.effects.animateClass = function( value, duration, easing, callback ) { 13571 var o = $.speed( duration, easing, callback ); 13572 13573 return this.queue( function() { 13574 var animated = $( this ), 13575 baseClass = animated.attr( "class" ) || "", 13576 applyClassChange, 13577 allAnimations = o.children ? animated.find( "*" ).addBack() : animated; 13578 13579 // Map the animated objects to store the original styles. 13580 allAnimations = allAnimations.map( function() { 13581 var el = $( this ); 13582 return { 13583 el: el, 13584 start: getElementStyles( this ) 13585 }; 13586 } ); 13587 13588 // Apply class change 13589 applyClassChange = function() { 13590 $.each( classAnimationActions, function( i, action ) { 13591 if ( value[ action ] ) { 13592 animated[ action + "Class" ]( value[ action ] ); 13593 } 13594 } ); 13595 }; 13596 applyClassChange(); 13597 13598 // Map all animated objects again - calculate new styles and diff 13599 allAnimations = allAnimations.map( function() { 13600 this.end = getElementStyles( this.el[ 0 ] ); 13601 this.diff = styleDifference( this.start, this.end ); 13602 return this; 13603 } ); 13604 13605 // Apply original class 13606 animated.attr( "class", baseClass ); 13607 13608 // Map all animated objects again - this time collecting a promise 13609 allAnimations = allAnimations.map( function() { 13610 var styleInfo = this, 13611 dfd = $.Deferred(), 13612 opts = $.extend( {}, o, { 13613 queue: false, 13614 complete: function() { 13615 dfd.resolve( styleInfo ); 13616 } 13617 } ); 13618 13619 this.el.animate( this.diff, opts ); 13620 return dfd.promise(); 13621 } ); 13622 13623 // Once all animations have completed: 13624 $.when.apply( $, allAnimations.get() ).done( function() { 13625 13626 // Set the final class 13627 applyClassChange(); 13628 13629 // For each animated element, 13630 // clear all css properties that were animated 13631 $.each( arguments, function() { 13632 var el = this.el; 13633 $.each( this.diff, function( key ) { 13634 el.css( key, "" ); 13635 } ); 13636 } ); 13637 13638 // This is guarnteed to be there if you use jQuery.speed() 13639 // it also handles dequeuing the next anim... 13640 o.complete.call( animated[ 0 ] ); 13641 } ); 13642 } ); 13643}; 13644 13645$.fn.extend( { 13646 addClass: ( function( orig ) { 13647 return function( classNames, speed, easing, callback ) { 13648 return speed ? 13649 $.effects.animateClass.call( this, 13650 { add: classNames }, speed, easing, callback ) : 13651 orig.apply( this, arguments ); 13652 }; 13653 } )( $.fn.addClass ), 13654 13655 removeClass: ( function( orig ) { 13656 return function( classNames, speed, easing, callback ) { 13657 return arguments.length > 1 ? 13658 $.effects.animateClass.call( this, 13659 { remove: classNames }, speed, easing, callback ) : 13660 orig.apply( this, arguments ); 13661 }; 13662 } )( $.fn.removeClass ), 13663 13664 toggleClass: ( function( orig ) { 13665 return function( classNames, force, speed, easing, callback ) { 13666 if ( typeof force === "boolean" || force === undefined ) { 13667 if ( !speed ) { 13668 13669 // Without speed parameter 13670 return orig.apply( this, arguments ); 13671 } else { 13672 return $.effects.animateClass.call( this, 13673 ( force ? { add: classNames } : { remove: classNames } ), 13674 speed, easing, callback ); 13675 } 13676 } else { 13677 13678 // Without force parameter 13679 return $.effects.animateClass.call( this, 13680 { toggle: classNames }, force, speed, easing ); 13681 } 13682 }; 13683 } )( $.fn.toggleClass ), 13684 13685 switchClass: function( remove, add, speed, easing, callback ) { 13686 return $.effects.animateClass.call( this, { 13687 add: add, 13688 remove: remove 13689 }, speed, easing, callback ); 13690 } 13691} ); 13692 13693} )(); 13694 13695/******************************************************************************/ 13696/*********************************** EFFECTS **********************************/ 13697/******************************************************************************/ 13698 13699( function() { 13700 13701if ( $.expr && $.expr.pseudos && $.expr.pseudos.animated ) { 13702 $.expr.pseudos.animated = ( function( orig ) { 13703 return function( elem ) { 13704 return !!$( elem ).data( dataSpaceAnimated ) || orig( elem ); 13705 }; 13706 } )( $.expr.pseudos.animated ); 13707} 13708 13709if ( $.uiBackCompat !== false ) { 13710 $.extend( $.effects, { 13711 13712 // Saves a set of properties in a data storage 13713 save: function( element, set ) { 13714 var i = 0, length = set.length; 13715 for ( ; i < length; i++ ) { 13716 if ( set[ i ] !== null ) { 13717 element.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] ); 13718 } 13719 } 13720 }, 13721 13722 // Restores a set of previously saved properties from a data storage 13723 restore: function( element, set ) { 13724 var val, i = 0, length = set.length; 13725 for ( ; i < length; i++ ) { 13726 if ( set[ i ] !== null ) { 13727 val = element.data( dataSpace + set[ i ] ); 13728 element.css( set[ i ], val ); 13729 } 13730 } 13731 }, 13732 13733 setMode: function( el, mode ) { 13734 if ( mode === "toggle" ) { 13735 mode = el.is( ":hidden" ) ? "show" : "hide"; 13736 } 13737 return mode; 13738 }, 13739 13740 // Wraps the element around a wrapper that copies position properties 13741 createWrapper: function( element ) { 13742 13743 // If the element is already wrapped, return it 13744 if ( element.parent().is( ".ui-effects-wrapper" ) ) { 13745 return element.parent(); 13746 } 13747 13748 // Wrap the element 13749 var props = { 13750 width: element.outerWidth( true ), 13751 height: element.outerHeight( true ), 13752 "float": element.css( "float" ) 13753 }, 13754 wrapper = $( "<div></div>" ) 13755 .addClass( "ui-effects-wrapper" ) 13756 .css( { 13757 fontSize: "100%", 13758 background: "transparent", 13759 border: "none", 13760 margin: 0, 13761 padding: 0 13762 } ), 13763 13764 // Store the size in case width/height are defined in % - Fixes #5245 13765 size = { 13766 width: element.width(), 13767 height: element.height() 13768 }, 13769 active = document.activeElement; 13770 13771 // Support: Firefox 13772 // Firefox incorrectly exposes anonymous content 13773 // https://bugzilla.mozilla.org/show_bug.cgi?id=561664 13774 try { 13775 // eslint-disable-next-line no-unused-expressions 13776 active.id; 13777 } catch ( e ) { 13778 active = document.body; 13779 } 13780 13781 element.wrap( wrapper ); 13782 13783 // Fixes #7595 - Elements lose focus when wrapped. 13784 if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { 13785 $( active ).trigger( "focus" ); 13786 } 13787 13788 // Hotfix for jQuery 1.4 since some change in wrap() seems to actually 13789 // lose the reference to the wrapped element 13790 wrapper = element.parent(); 13791 13792 // Transfer positioning properties to the wrapper 13793 if ( element.css( "position" ) === "static" ) { 13794 wrapper.css( { position: "relative" } ); 13795 element.css( { position: "relative" } ); 13796 } else { 13797 $.extend( props, { 13798 position: element.css( "position" ), 13799 zIndex: element.css( "z-index" ) 13800 } ); 13801 $.each( [ "top", "left", "bottom", "right" ], function( i, pos ) { 13802 props[ pos ] = element.css( pos ); 13803 if ( isNaN( parseInt( props[ pos ], 10 ) ) ) { 13804 props[ pos ] = "auto"; 13805 } 13806 } ); 13807 element.css( { 13808 position: "relative", 13809 top: 0, 13810 left: 0, 13811 right: "auto", 13812 bottom: "auto" 13813 } ); 13814 } 13815 element.css( size ); 13816 13817 return wrapper.css( props ).show(); 13818 }, 13819 13820 removeWrapper: function( element ) { 13821 var active = document.activeElement; 13822 13823 if ( element.parent().is( ".ui-effects-wrapper" ) ) { 13824 element.parent().replaceWith( element ); 13825 13826 // Fixes #7595 - Elements lose focus when wrapped. 13827 if ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) { 13828 $( active ).trigger( "focus" ); 13829 } 13830 } 13831 13832 return element; 13833 } 13834 } ); 13835} 13836 13837$.extend( $.effects, { 13838 version: "1.13.
vendor: 2,055 bytes, lines 13838-13933
138382", 13839 13840 define: function( name, mode, effect ) { 13841 if ( !effect ) { 13842 effect = mode; 13843 mode = "effect"; 13844 } 13845 13846 $.effects.effect[ name ] = effect; 13847 $.effects.effect[ name ].mode = mode; 13848 13849 return effect; 13850 }, 13851 13852 scaledDimensions: function( element, percent, direction ) { 13853 if ( percent === 0 ) { 13854 return { 13855 height: 0, 13856 width: 0, 13857 outerHeight: 0, 13858 outerWidth: 0 13859 }; 13860 } 13861 13862 var x = direction !== "horizontal" ? ( ( percent || 100 ) / 100 ) : 1, 13863 y = direction !== "vertical" ? ( ( percent || 100 ) / 100 ) : 1; 13864 13865 return { 13866 height: element.height() * y, 13867 width: element.width() * x, 13868 outerHeight: element.outerHeight() * y, 13869 outerWidth: element.outerWidth() * x 13870 }; 13871 13872 }, 13873 13874 clipToBox: function( animation ) { 13875 return { 13876 width: animation.clip.right - animation.clip.left, 13877 height: animation.clip.bottom - animation.clip.top, 13878 left: animation.clip.left, 13879 top: animation.clip.top 13880 }; 13881 }, 13882 13883 // Injects recently queued functions to be first in line (after "inprogress") 13884 unshift: function( element, queueLength, count ) { 13885 var queue = element.queue(); 13886 13887 if ( queueLength > 1 ) { 13888 queue.splice.apply( queue, 13889 [ 1, 0 ].concat( queue.splice( queueLength, count ) ) ); 13890 } 13891 element.dequeue(); 13892 }, 13893 13894 saveStyle: function( element ) { 13895 element.data( dataSpaceStyle, element[ 0 ].style.cssText ); 13896 }, 13897 13898 restoreStyle: function( element ) { 13899 element[ 0 ].style.cssText = element.data( dataSpaceStyle ) || ""; 13900 element.removeData( dataSpaceStyle ); 13901 }, 13902 13903 mode: function( element, mode ) { 13904 var hidden = element.is( ":hidden" ); 13905 13906 if ( mode === "toggle" ) { 13907 mode = hidden ? "show" : "hide"; 13908 } 13909 if ( hidden ? mode === "hide" : mode === "show" ) { 13910 mode = "none"; 13911 } 13912 return mode; 13913 }, 13914 13915 // Translates a [top,left] array into a baseline value 13916 getBaseline: function( origin, original ) { 13917 var y, x; 13918 13919 switch ( origin[ 0 ] ) { 13920 case "top": 13921 y = 0; 13922 break; 13923 case "middle": 13924 y = 0.5; 13925 break; 13926 case "bottom": 13927 y = 1; 13928 break; 13929 default: 13930 y = origin[ 0 ] / original.height; 13931 } 13932 13933 switch ( origin[ 1 ] ) {
13934 case "left": 13935 x = 0; 13936 break; 13937 case "center": 13938 x = 0.5; 13939 break; 13940 case "right": 13941 x = 1; 13942 break; 13943 default: 13944 x = origin[ 1 ] / original.width; 13945 } 13946 13947 return { 13948 x: x, 13949 y: y 13950 }; 13951 }, 13952 13953 // Creates a placeholder element so that the original element can be made absolute 13954 createPlaceholder: function( element ) { 13955 var placeholder, 13956 cssPosition = element.css( "position" ), 13957 position = element.position(); 13958 13959 // Lock in margins first to account for form elements, which 13960 // will change margin if you explicitly set height 13961 // see: http
vendor: 10,558 bytes, lines 13961-14355
13961://jsfiddle.net/JZSMt/3/ https://bugs.webkit.org/show_bug.cgi?id=107380 13962 // Support: Safari 13963 element.css( { 13964 marginTop: element.css( "marginTop" ), 13965 marginBottom: element.css( "marginBottom" ), 13966 marginLeft: element.css( "marginLeft" ), 13967 marginRight: element.css( "marginRight" ) 13968 } ) 13969 .outerWidth( element.outerWidth() ) 13970 .outerHeight( element.outerHeight() ); 13971 13972 if ( /^(static|relative)/.test( cssPosition ) ) { 13973 cssPosition = "absolute"; 13974 13975 placeholder = $( "<" + element[ 0 ].nodeName + ">" ).insertAfter( element ).css( { 13976 13977 // Convert inline to inline block to account for inline elements 13978 // that turn to inline block based on content (like img) 13979 display: /^(inline|ruby)/.test( element.css( "display" ) ) ? 13980 "inline-block" : 13981 "block", 13982 visibility: "hidden", 13983 13984 // Margins need to be set to account for margin collapse 13985 marginTop: element.css( "marginTop" ), 13986 marginBottom: element.css( "marginBottom" ), 13987 marginLeft: element.css( "marginLeft" ), 13988 marginRight: element.css( "marginRight" ), 13989 "float": element.css( "float" ) 13990 } ) 13991 .outerWidth( element.outerWidth() ) 13992 .outerHeight( element.outerHeight() ) 13993 .addClass( "ui-effects-placeholder" ); 13994 13995 element.data( dataSpace + "placeholder", placeholder ); 13996 } 13997 13998 element.css( { 13999 position: cssPosition, 14000 left: position.left, 14001 top: position.top 14002 } ); 14003 14004 return placeholder; 14005 }, 14006 14007 removePlaceholder: function( element ) { 14008 var dataKey = dataSpace + "placeholder", 14009 placeholder = element.data( dataKey ); 14010 14011 if ( placeholder ) { 14012 placeholder.remove(); 14013 element.removeData( dataKey ); 14014 } 14015 }, 14016 14017 // Removes a placeholder if it exists and restores 14018 // properties that were modified during placeholder creation 14019 cleanUp: function( element ) { 14020 $.effects.restoreStyle( element ); 14021 $.effects.removePlaceholder( element ); 14022 }, 14023 14024 setTransition: function( element, list, factor, value ) { 14025 value = value || {}; 14026 $.each( list, function( i, x ) { 14027 var unit = element.cssUnit( x ); 14028 if ( unit[ 0 ] > 0 ) { 14029 value[ x ] = unit[ 0 ] * factor + unit[ 1 ]; 14030 } 14031 } ); 14032 return value; 14033 } 14034} ); 14035 14036// Return an effect options object for the given parameters: 14037function _normalizeArguments( effect, options, speed, callback ) { 14038 14039 // Allow passing all options as the first parameter 14040 if ( $.isPlainObject( effect ) ) { 14041 options = effect; 14042 effect = effect.effect; 14043 } 14044 14045 // Convert to an object 14046 effect = { effect: effect }; 14047 14048 // Catch (effect, null, ...) 14049 if ( options == null ) { 14050 options = {}; 14051 } 14052 14053 // Catch (effect, callback) 14054 if ( typeof options === "function" ) { 14055 callback = options; 14056 speed = null; 14057 options = {}; 14058 } 14059 14060 // Catch (effect, speed, ?) 14061 if ( typeof options === "number" || $.fx.speeds[ options ] ) { 14062 callback = speed; 14063 speed = options; 14064 options = {}; 14065 } 14066 14067 // Catch (effect, options, callback) 14068 if ( typeof speed === "function" ) { 14069 callback = speed; 14070 speed = null; 14071 } 14072 14073 // Add options to effect 14074 if ( options ) { 14075 $.extend( effect, options ); 14076 } 14077 14078 speed = speed || options.duration; 14079 effect.duration = $.fx.off ? 0 : 14080 typeof speed === "number" ? speed : 14081 speed in $.fx.speeds ? $.fx.speeds[ speed ] : 14082 $.fx.speeds._default; 14083 14084 effect.complete = callback || options.complete; 14085 14086 return effect; 14087} 14088 14089function standardAnimationOption( option ) { 14090 14091 // Valid standard speeds (nothing, number, named speed) 14092 if ( !option || typeof option === "number" || $.fx.speeds[ option ] ) { 14093 return true; 14094 } 14095 14096 // Invalid strings - treat as "normal" speed 14097 if ( typeof option === "string" && !$.effects.effect[ option ] ) { 14098 return true; 14099 } 14100 14101 // Complete callback 14102 if ( typeof option === "function" ) { 14103 return true; 14104 } 14105 14106 // Options hash (but not naming an effect) 14107 if ( typeof option === "object" && !option.effect ) { 14108 return true; 14109 } 14110 14111 // Didn't match any standard API 14112 return false; 14113} 14114 14115$.fn.extend( { 14116 effect: function( /* effect, options, speed, callback */ ) { 14117 var args = _normalizeArguments.apply( this, arguments ), 14118 effectMethod = $.effects.effect[ args.effect ], 14119 defaultMode = effectMethod.mode, 14120 queue = args.queue, 14121 queueName = queue || "fx", 14122 complete = args.complete, 14123 mode = args.mode, 14124 modes = [], 14125 prefilter = function( next ) { 14126 var el = $( this ), 14127 normalizedMode = $.effects.mode( el, mode ) || defaultMode; 14128 14129 // Sentinel for duck-punching the :animated pseudo-selector 14130 el.data( dataSpaceAnimated, true ); 14131 14132 // Save effect mode for later use, 14133 // we can't just call $.effects.mode again later, 14134 // as the .show() below destroys the initial state 14135 modes.push( normalizedMode ); 14136 14137 // See $.uiBackCompat inside of run() for removal of defaultMode in 1.14 14138 if ( defaultMode && ( normalizedMode === "show" || 14139 ( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) { 14140 el.show(); 14141 } 14142 14143 if ( !defaultMode || normalizedMode !== "none" ) { 14144 $.effects.saveStyle( el ); 14145 } 14146 14147 if ( typeof next === "function" ) { 14148 next(); 14149 } 14150 }; 14151 14152 if ( $.fx.off || !effectMethod ) { 14153 14154 // Delegate to the original method (e.g., .show()) if possible 14155 if ( mode ) { 14156 return this[ mode ]( args.duration, complete ); 14157 } else { 14158 return this.each( function() { 14159 if ( complete ) { 14160 complete.call( this ); 14161 } 14162 } ); 14163 } 14164 } 14165 14166 function run( next ) { 14167 var elem = $( this ); 14168 14169 function cleanup() { 14170 elem.removeData( dataSpaceAnimated ); 14171 14172 $.effects.cleanUp( elem ); 14173 14174 if ( args.mode === "hide" ) { 14175 elem.hide(); 14176 } 14177 14178 done(); 14179 } 14180 14181 function done() { 14182 if ( typeof complete === "function" ) { 14183 complete.call( elem[ 0 ] ); 14184 } 14185 14186 if ( typeof next === "function" ) { 14187 next(); 14188 } 14189 } 14190 14191 // Override mode option on a per element basis, 14192 // as toggle can be either show or hide depending on element state 14193 args.mode = modes.shift(); 14194 14195 if ( $.uiBackCompat !== false && !defaultMode ) { 14196 if ( elem.is( ":hidden" ) ? mode === "hide" : mode === "show" ) { 14197 14198 // Call the core method to track "olddisplay" properly 14199 elem[ mode ](); 14200 done(); 14201 } else { 14202 effectMethod.call( elem[ 0 ], args, done ); 14203 } 14204 } else { 14205 if ( args.mode === "none" ) { 14206 14207 // Call the core method to track "olddisplay" properly 14208 elem[ mode ](); 14209 done(); 14210 } else { 14211 effectMethod.call( elem[ 0 ], args, cleanup ); 14212 } 14213 } 14214 } 14215 14216 // Run prefilter on all elements first to ensure that 14217 // any showing or hiding happens before placeholder creation, 14218 // which ensures that any layout changes are correctly captured. 14219 return queue === false ? 14220 this.each( prefilter ).each( run ) : 14221 this.queue( queueName, prefilter ).queue( queueName, run ); 14222 }, 14223 14224 show: ( function( orig ) { 14225 return function( option ) { 14226 if ( standardAnimationOption( option ) ) { 14227 return orig.apply( this, arguments ); 14228 } else { 14229 var args = _normalizeArguments.apply( this, arguments ); 14230 args.mode = "show"; 14231 return this.effect.call( this, args ); 14232 } 14233 }; 14234 } )( $.fn.show ), 14235 14236 hide: ( function( orig ) { 14237 return function( option ) { 14238 if ( standardAnimationOption( option ) ) { 14239 return orig.apply( this, arguments ); 14240 } else { 14241 var args = _normalizeArguments.apply( this, arguments ); 14242 args.mode = "hide"; 14243 return this.effect.call( this, args ); 14244 } 14245 }; 14246 } )( $.fn.hide ), 14247 14248 toggle: ( function( orig ) { 14249 return function( option ) { 14250 if ( standardAnimationOption( option ) || typeof option === "boolean" ) { 14251 return orig.apply( this, arguments ); 14252 } else { 14253 var args = _normalizeArguments.apply( this, arguments ); 14254 args.mode = "toggle"; 14255 return this.effect.call( this, args ); 14256 } 14257 }; 14258 } )( $.fn.toggle ), 14259 14260 cssUnit: function( key ) { 14261 var style = this.css( key ), 14262 val = []; 14263 14264 $.each( [ "em", "px", "%", "pt" ], function( i, unit ) { 14265 if ( style.indexOf( unit ) > 0 ) { 14266 val = [ parseFloat( style ), unit ]; 14267 } 14268 } ); 14269 return val; 14270 }, 14271 14272 cssClip: function( clipObj ) { 14273 if ( clipObj ) { 14274 return this.css( "clip", "rect(" + clipObj.top + "px " + clipObj.right + "px " + 14275 clipObj.bottom + "px " + clipObj.left + "px)" ); 14276 } 14277 return parseClip( this.css( "clip" ), this ); 14278 }, 14279 14280 transfer: function( options, done ) { 14281 var element = $( this ), 14282 target = $( options.to ), 14283 targetFixed = target.css( "position" ) === "fixed", 14284 body = $( "body" ), 14285 fixTop = targetFixed ? body.scrollTop() : 0, 14286 fixLeft = targetFixed ? body.scrollLeft() : 0, 14287 endPosition = target.offset(), 14288 animation = { 14289 top: endPosition.top - fixTop, 14290 left: endPosition.left - fixLeft, 14291 height: target.innerHeight(), 14292 width: target.innerWidth() 14293 }, 14294 startPosition = element.offset(), 14295 transfer = $( "<div class='ui-effects-transfer'></div>" ); 14296 14297 transfer 14298 .appendTo( "body" ) 14299 .addClass( options.className ) 14300 .css( { 14301 top: startPosition.top - fixTop, 14302 left: startPosition.left - fixLeft, 14303 height: element.innerHeight(), 14304 width: element.innerWidth(), 14305 position: targetFixed ? "fixed" : "absolute" 14306 } ) 14307 .animate( animation, options.duration, options.easing, function() { 14308 transfer.remove(); 14309 if ( typeof done === "function" ) { 14310 done(); 14311 } 14312 } ); 14313 } 14314} ); 14315 14316function parseClip( str, element ) { 14317 var outerWidth = element.outerWidth(), 14318 outerHeight = element.outerHeight(), 14319 clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/, 14320 values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ]; 14321 14322 return { 14323 top: parseFloat( values[ 1 ] ) || 0, 14324 right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ), 14325 bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ), 14326 left: parseFloat( values[ 4 ] ) || 0 14327 }; 14328} 14329 14330$.fx.step.clip = function( fx ) { 14331 if ( !fx.clipInit ) { 14332 fx.start = $( fx.elem ).cssClip(); 14333 if ( typeof fx.end === "string" ) { 14334 fx.end = parseClip( fx.end, fx.elem ); 14335 } 14336 fx.clipInit = true; 14337 } 14338 14339 $( fx.elem ).cssClip( { 14340 top: fx.pos * ( fx.end.top - fx.start.top ) + fx.start.top, 14341 right: fx.pos * ( fx.end.right - fx.start.right ) + fx.start.right, 14342 bottom: fx.pos * ( fx.end.bottom - fx.start.bottom ) + fx.start.bottom, 14343 left: fx.pos * ( fx.end.left - fx.start.left ) + fx.start.left 14344 } ); 14345}; 14346 14347} )(); 14348 14349/******************************************************************************/ 14350/*********************************** EASING ***********************************/ 14351/******************************************************************************/ 14352 14353( function() { 14354 14355// Based on easing equations from Robert Penner (http://
vendor: 24,998 bytes, lines 14355-15310
14355www.robertpenner.com/easing) 14356 14357var baseEasings = {}; 14358 14359$.each( [ "Quad", "Cubic", "Quart", "Quint", "Expo" ], function( i, name ) { 14360 baseEasings[ name ] = function( p ) { 14361 return Math.pow( p, i + 2 ); 14362 }; 14363} ); 14364 14365$.extend( baseEasings, { 14366 Sine: function( p ) { 14367 return 1 - Math.cos( p * Math.PI / 2 ); 14368 }, 14369 Circ: function( p ) { 14370 return 1 - Math.sqrt( 1 - p * p ); 14371 }, 14372 Elastic: function( p ) { 14373 return p === 0 || p === 1 ? p : 14374 -Math.pow( 2, 8 * ( p - 1 ) ) * Math.sin( ( ( p - 1 ) * 80 - 7.5 ) * Math.PI / 15 ); 14375 }, 14376 Back: function( p ) { 14377 return p * p * ( 3 * p - 2 ); 14378 }, 14379 Bounce: function( p ) { 14380 var pow2, 14381 bounce = 4; 14382 14383 while ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {} 14384 return 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 ); 14385 } 14386} ); 14387 14388$.each( baseEasings, function( name, easeIn ) { 14389 $.easing[ "easeIn" + name ] = easeIn; 14390 $.easing[ "easeOut" + name ] = function( p ) { 14391 return 1 - easeIn( 1 - p ); 14392 }; 14393 $.easing[ "easeInOut" + name ] = function( p ) { 14394 return p < 0.5 ? 14395 easeIn( p * 2 ) / 2 : 14396 1 - easeIn( p * -2 + 2 ) / 2; 14397 }; 14398} ); 14399 14400} )(); 14401 14402var effect = $.effects; 14403 14404 14405/*! 14406 * jQuery UI Effects Blind 1.13.2 14407 * http://jqueryui.com 14408 * 14409 * Copyright jQuery Foundation and other contributors 14410 * Released under the MIT license. 14411 * http://jquery.org/license 14412 */ 14413 14414//>>label: Blind Effect 14415//>>group: Effects 14416//>>description: Blinds the element. 14417//>>docs: http://api.jqueryui.com/blind-effect/ 14418//>>demos: http://jqueryui.com/effect/ 14419 14420 14421var effectsEffectBlind = $.effects.define( "blind", "hide", function( options, done ) { 14422 var map = { 14423 up: [ "bottom", "top" ], 14424 vertical: [ "bottom", "top" ], 14425 down: [ "top", "bottom" ], 14426 left: [ "right", "left" ], 14427 horizontal: [ "right", "left" ], 14428 right: [ "left", "right" ] 14429 }, 14430 element = $( this ), 14431 direction = options.direction || "up", 14432 start = element.cssClip(), 14433 animate = { clip: $.extend( {}, start ) }, 14434 placeholder = $.effects.createPlaceholder( element ); 14435 14436 animate.clip[ map[ direction ][ 0 ] ] = animate.clip[ map[ direction ][ 1 ] ]; 14437 14438 if ( options.mode === "show" ) { 14439 element.cssClip( animate.clip ); 14440 if ( placeholder ) { 14441 placeholder.css( $.effects.clipToBox( animate ) ); 14442 } 14443 14444 animate.clip = start; 14445 } 14446 14447 if ( placeholder ) { 14448 placeholder.animate( $.effects.clipToBox( animate ), options.duration, options.easing ); 14449 } 14450 14451 element.animate( animate, { 14452 queue: false, 14453 duration: options.duration, 14454 easing: options.easing, 14455 complete: done 14456 } ); 14457} ); 14458 14459 14460/*! 14461 * jQuery UI Effects Bounce 1.13.2 14462 * http://jqueryui.com 14463 * 14464 * Copyright jQuery Foundation and other contributors 14465 * Released under the MIT license. 14466 * http://jquery.org/license 14467 */ 14468 14469//>>label: Bounce Effect 14470//>>group: Effects 14471//>>description: Bounces an element horizontally or vertically n times. 14472//>>docs: http://api.jqueryui.com/bounce-effect/ 14473//>>demos: http://jqueryui.com/effect/ 14474 14475 14476var effectsEffectBounce = $.effects.define( "bounce", function( options, done ) { 14477 var upAnim, downAnim, refValue, 14478 element = $( this ), 14479 14480 // Defaults: 14481 mode = options.mode, 14482 hide = mode === "hide", 14483 show = mode === "show", 14484 direction = options.direction || "up", 14485 distance = options.distance, 14486 times = options.times || 5, 14487 14488 // Number of internal animations 14489 anims = times * 2 + ( show || hide ? 1 : 0 ), 14490 speed = options.duration / anims, 14491 easing = options.easing, 14492 14493 // Utility: 14494 ref = ( direction === "up" || direction === "down" ) ? "top" : "left", 14495 motion = ( direction === "up" || direction === "left" ), 14496 i = 0, 14497 14498 queuelen = element.queue().length; 14499 14500 $.effects.createPlaceholder( element ); 14501 14502 refValue = element.css( ref ); 14503 14504 // Default distance for the BIGGEST bounce is the outer Distance / 3 14505 if ( !distance ) { 14506 distance = element[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3; 14507 } 14508 14509 if ( show ) { 14510 downAnim = { opacity: 1 }; 14511 downAnim[ ref ] = refValue; 14512 14513 // If we are showing, force opacity 0 and set the initial position 14514 // then do the "first" animation 14515 element 14516 .css( "opacity", 0 ) 14517 .css( ref, motion ? -distance * 2 : distance * 2 ) 14518 .animate( downAnim, speed, easing ); 14519 } 14520 14521 // Start at the smallest distance if we are hiding 14522 if ( hide ) { 14523 distance = distance / Math.pow( 2, times - 1 ); 14524 } 14525 14526 downAnim = {}; 14527 downAnim[ ref ] = refValue; 14528 14529 // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here 14530 for ( ; i < times; i++ ) { 14531 upAnim = {}; 14532 upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; 14533 14534 element 14535 .animate( upAnim, speed, easing ) 14536 .animate( downAnim, speed, easing ); 14537 14538 distance = hide ? distance * 2 : distance / 2; 14539 } 14540 14541 // Last Bounce when Hiding 14542 if ( hide ) { 14543 upAnim = { opacity: 0 }; 14544 upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; 14545 14546 element.animate( upAnim, speed, easing ); 14547 } 14548 14549 element.queue( done ); 14550 14551 $.effects.unshift( element, queuelen, anims + 1 ); 14552} ); 14553 14554 14555/*! 14556 * jQuery UI Effects Clip 1.13.2 14557 * http://jqueryui.com 14558 * 14559 * Copyright jQuery Foundation and other contributors 14560 * Released under the MIT license. 14561 * http://jquery.org/license 14562 */ 14563 14564//>>label: Clip Effect 14565//>>group: Effects 14566//>>description: Clips the element on and off like an old TV. 14567//>>docs: http://api.jqueryui.com/clip-effect/ 14568//>>demos: http://jqueryui.com/effect/ 14569 14570 14571var effectsEffectClip = $.effects.define( "clip", "hide", function( options, done ) { 14572 var start, 14573 animate = {}, 14574 element = $( this ), 14575 direction = options.direction || "vertical", 14576 both = direction === "both", 14577 horizontal = both || direction === "horizontal", 14578 vertical = both || direction === "vertical"; 14579 14580 start = element.cssClip(); 14581 animate.clip = { 14582 top: vertical ? ( start.bottom - start.top ) / 2 : start.top, 14583 right: horizontal ? ( start.right - start.left ) / 2 : start.right, 14584 bottom: vertical ? ( start.bottom - start.top ) / 2 : start.bottom, 14585 left: horizontal ? ( start.right - start.left ) / 2 : start.left 14586 }; 14587 14588 $.effects.createPlaceholder( element ); 14589 14590 if ( options.mode === "show" ) { 14591 element.cssClip( animate.clip ); 14592 animate.clip = start; 14593 } 14594 14595 element.animate( animate, { 14596 queue: false, 14597 duration: options.duration, 14598 easing: options.easing, 14599 complete: done 14600 } ); 14601 14602} ); 14603 14604 14605/*! 14606 * jQuery UI Effects Drop 1.13.2 14607 * http://jqueryui.com 14608 * 14609 * Copyright jQuery Foundation and other contributors 14610 * Released under the MIT license. 14611 * http://jquery.org/license 14612 */ 14613 14614//>>label: Drop Effect 14615//>>group: Effects 14616//>>description: Moves an element in one direction and hides it at the same time. 14617//>>docs: http://api.jqueryui.com/drop-effect/ 14618//>>demos: http://jqueryui.com/effect/ 14619 14620 14621var effectsEffectDrop = $.effects.define( "drop", "hide", function( options, done ) { 14622 14623 var distance, 14624 element = $( this ), 14625 mode = options.mode, 14626 show = mode === "show", 14627 direction = options.direction || "left", 14628 ref = ( direction === "up" || direction === "down" ) ? "top" : "left", 14629 motion = ( direction === "up" || direction === "left" ) ? "-=" : "+=", 14630 oppositeMotion = ( motion === "+=" ) ? "-=" : "+=", 14631 animation = { 14632 opacity: 0 14633 }; 14634 14635 $.effects.createPlaceholder( element ); 14636 14637 distance = options.distance || 14638 element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ) / 2; 14639 14640 animation[ ref ] = motion + distance; 14641 14642 if ( show ) { 14643 element.css( animation ); 14644 14645 animation[ ref ] = oppositeMotion + distance; 14646 animation.opacity = 1; 14647 } 14648 14649 // Animate 14650 element.animate( animation, { 14651 queue: false, 14652 duration: options.duration, 14653 easing: options.easing, 14654 complete: done 14655 } ); 14656} ); 14657 14658 14659/*! 14660 * jQuery UI Effects Explode 1.13.2 14661 * http://jqueryui.com 14662 * 14663 * Copyright jQuery Foundation and other contributors 14664 * Released under the MIT license. 14665 * http://jquery.org/license 14666 */ 14667 14668//>>label: Explode Effect 14669//>>group: Effects 14670/* eslint-disable max-len */ 14671//>>description: Explodes an element in all directions into n pieces. Implodes an element to its original wholeness. 14672/* eslint-enable max-len */ 14673//>>docs: http://api.jqueryui.com/explode-effect/ 14674//>>demos: http://jqueryui.com/effect/ 14675 14676 14677var effectsEffectExplode = $.effects.define( "explode", "hide", function( options, done ) { 14678 14679 var i, j, left, top, mx, my, 14680 rows = options.pieces ? Math.round( Math.sqrt( options.pieces ) ) : 3, 14681 cells = rows, 14682 element = $( this ), 14683 mode = options.mode, 14684 show = mode === "show", 14685 14686 // Show and then visibility:hidden the element before calculating offset 14687 offset = element.show().css( "visibility", "hidden" ).offset(), 14688 14689 // Width and height of a piece 14690 width = Math.ceil( element.outerWidth() / cells ), 14691 height = Math.ceil( element.outerHeight() / rows ), 14692 pieces = []; 14693 14694 // Children animate complete: 14695 function childComplete() { 14696 pieces.push( this ); 14697 if ( pieces.length === rows * cells ) { 14698 animComplete(); 14699 } 14700 } 14701 14702 // Clone the element for each row and cell. 14703 for ( i = 0; i < rows; i++ ) { // ===> 14704 top = offset.top + i * height; 14705 my = i - ( rows - 1 ) / 2; 14706 14707 for ( j = 0; j < cells; j++ ) { // ||| 14708 left = offset.left + j * width; 14709 mx = j - ( cells - 1 ) / 2; 14710 14711 // Create a clone of the now hidden main element that will be absolute positioned 14712 // within a wrapper div off the -left and -top equal to size of our pieces 14713 element 14714 .clone() 14715 .appendTo( "body" ) 14716 .wrap( "<div></div>" ) 14717 .css( { 14718 position: "absolute", 14719 visibility: "visible", 14720 left: -j * width, 14721 top: -i * height 14722 } ) 14723 14724 // Select the wrapper - make it overflow: hidden and absolute positioned based on 14725 // where the original was located +left and +top equal to the size of pieces 14726 .parent() 14727 .addClass( "ui-effects-explode" ) 14728 .css( { 14729 position: "absolute", 14730 overflow: "hidden", 14731 width: width, 14732 height: height, 14733 left: left + ( show ? mx * width : 0 ), 14734 top: top + ( show ? my * height : 0 ), 14735 opacity: show ? 0 : 1 14736 } ) 14737 .animate( { 14738 left: left + ( show ? 0 : mx * width ), 14739 top: top + ( show ? 0 : my * height ), 14740 opacity: show ? 1 : 0 14741 }, options.duration || 500, options.easing, childComplete ); 14742 } 14743 } 14744 14745 function animComplete() { 14746 element.css( { 14747 visibility: "visible" 14748 } ); 14749 $( pieces ).remove(); 14750 done(); 14751 } 14752} ); 14753 14754 14755/*! 14756 * jQuery UI Effects Fade 1.13.2 14757 * http://jqueryui.com 14758 * 14759 * Copyright jQuery Foundation and other contributors 14760 * Released under the MIT license. 14761 * http://jquery.org/license 14762 */ 14763 14764//>>label: Fade Effect 14765//>>group: Effects 14766//>>description: Fades the element. 14767//>>docs: http://api.jqueryui.com/fade-effect/ 14768//>>demos: http://jqueryui.com/effect/ 14769 14770 14771var effectsEffectFade = $.effects.define( "fade", "toggle", function( options, done ) { 14772 var show = options.mode === "show"; 14773 14774 $( this ) 14775 .css( "opacity", show ? 0 : 1 ) 14776 .animate( { 14777 opacity: show ? 1 : 0 14778 }, { 14779 queue: false, 14780 duration: options.duration, 14781 easing: options.easing, 14782 complete: done 14783 } ); 14784} ); 14785 14786 14787/*! 14788 * jQuery UI Effects Fold 1.13.2 14789 * http://jqueryui.com 14790 * 14791 * Copyright jQuery Foundation and other contributors 14792 * Released under the MIT license. 14793 * http://jquery.org/license 14794 */ 14795 14796//>>label: Fold Effect 14797//>>group: Effects 14798//>>description: Folds an element first horizontally and then vertically. 14799//>>docs: http://api.jqueryui.com/fold-effect/ 14800//>>demos: http://jqueryui.com/effect/ 14801 14802 14803var effectsEffectFold = $.effects.define( "fold", "hide", function( options, done ) { 14804 14805 // Create element 14806 var element = $( this ), 14807 mode = options.mode, 14808 show = mode === "show", 14809 hide = mode === "hide", 14810 size = options.size || 15, 14811 percent = /([0-9]+)%/.exec( size ), 14812 horizFirst = !!options.horizFirst, 14813 ref = horizFirst ? [ "right", "bottom" ] : [ "bottom", "right" ], 14814 duration = options.duration / 2, 14815 14816 placeholder = $.effects.createPlaceholder( element ), 14817 14818 start = element.cssClip(), 14819 animation1 = { clip: $.extend( {}, start ) }, 14820 animation2 = { clip: $.extend( {}, start ) }, 14821 14822 distance = [ start[ ref[ 0 ] ], start[ ref[ 1 ] ] ], 14823 14824 queuelen = element.queue().length; 14825 14826 if ( percent ) { 14827 size = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ]; 14828 } 14829 animation1.clip[ ref[ 0 ] ] = size; 14830 animation2.clip[ ref[ 0 ] ] = size; 14831 animation2.clip[ ref[ 1 ] ] = 0; 14832 14833 if ( show ) { 14834 element.cssClip( animation2.clip ); 14835 if ( placeholder ) { 14836 placeholder.css( $.effects.clipToBox( animation2 ) ); 14837 } 14838 14839 animation2.clip = start; 14840 } 14841 14842 // Animate 14843 element 14844 .queue( function( next ) { 14845 if ( placeholder ) { 14846 placeholder 14847 .animate( $.effects.clipToBox( animation1 ), duration, options.easing ) 14848 .animate( $.effects.clipToBox( animation2 ), duration, options.easing ); 14849 } 14850 14851 next(); 14852 } ) 14853 .animate( animation1, duration, options.easing ) 14854 .animate( animation2, duration, options.easing ) 14855 .queue( done ); 14856 14857 $.effects.unshift( element, queuelen, 4 ); 14858} ); 14859 14860 14861/*! 14862 * jQuery UI Effects Highlight 1.13.2 14863 * http://jqueryui.com 14864 * 14865 * Copyright jQuery Foundation and other contributors 14866 * Released under the MIT license. 14867 * http://jquery.org/license 14868 */ 14869 14870//>>label: Highlight Effect 14871//>>group: Effects 14872//>>description: Highlights the background of an element in a defined color for a custom duration. 14873//>>docs: http://api.jqueryui.com/highlight-effect/ 14874//>>demos: http://jqueryui.com/effect/ 14875 14876 14877var effectsEffectHighlight = $.effects.define( "highlight", "show", function( options, done ) { 14878 var element = $( this ), 14879 animation = { 14880 backgroundColor: element.css( "backgroundColor" ) 14881 }; 14882 14883 if ( options.mode === "hide" ) { 14884 animation.opacity = 0; 14885 } 14886 14887 $.effects.saveStyle( element ); 14888 14889 element 14890 .css( { 14891 backgroundImage: "none", 14892 backgroundColor: options.color || "#ffff99" 14893 } ) 14894 .animate( animation, { 14895 queue: false, 14896 duration: options.duration, 14897 easing: options.easing, 14898 complete: done 14899 } ); 14900} ); 14901 14902 14903/*! 14904 * jQuery UI Effects Size 1.13.2 14905 * http://jqueryui.com 14906 * 14907 * Copyright jQuery Foundation and other contributors 14908 * Released under the MIT license. 14909 * http://jquery.org/license 14910 */ 14911 14912//>>label: Size Effect 14913//>>group: Effects 14914//>>description: Resize an element to a specified width and height. 14915//>>docs: http://api.jqueryui.com/size-effect/ 14916//>>demos: http://jqueryui.com/effect/ 14917 14918 14919var effectsEffectSize = $.effects.define( "size", function( options, done ) { 14920 14921 // Create element 14922 var baseline, factor, temp, 14923 element = $( this ), 14924 14925 // Copy for children 14926 cProps = [ "fontSize" ], 14927 vProps = [ "borderTopWidth", "borderBottomWidth", "paddingTop", "paddingBottom" ], 14928 hProps = [ "borderLeftWidth", "borderRightWidth", "paddingLeft", "paddingRight" ], 14929 14930 // Set options 14931 mode = options.mode, 14932 restore = mode !== "effect", 14933 scale = options.scale || "both", 14934 origin = options.origin || [ "middle", "center" ], 14935 position = element.css( "position" ), 14936 pos = element.position(), 14937 original = $.effects.scaledDimensions( element ), 14938 from = options.from || original, 14939 to = options.to || $.effects.scaledDimensions( element, 0 ); 14940 14941 $.effects.createPlaceholder( element ); 14942 14943 if ( mode === "show" ) { 14944 temp = from; 14945 from = to; 14946 to = temp; 14947 } 14948 14949 // Set scaling factor 14950 factor = { 14951 from: { 14952 y: from.height / original.height, 14953 x: from.width / original.width 14954 }, 14955 to: { 14956 y: to.height / original.height, 14957 x: to.width / original.width 14958 } 14959 }; 14960 14961 // Scale the css box 14962 if ( scale === "box" || scale === "both" ) { 14963 14964 // Vertical props scaling 14965 if ( factor.from.y !== factor.to.y ) { 14966 from = $.effects.setTransition( element, vProps, factor.from.y, from ); 14967 to = $.effects.setTransition( element, vProps, factor.to.y, to ); 14968 } 14969 14970 // Horizontal props scaling 14971 if ( factor.from.x !== factor.to.x ) { 14972 from = $.effects.setTransition( element, hProps, factor.from.x, from ); 14973 to = $.effects.setTransition( element, hProps, factor.to.x, to ); 14974 } 14975 } 14976 14977 // Scale the content 14978 if ( scale === "content" || scale === "both" ) { 14979 14980 // Vertical props scaling 14981 if ( factor.from.y !== factor.to.y ) { 14982 from = $.effects.setTransition( element, cProps, factor.from.y, from ); 14983 to = $.effects.setTransition( element, cProps, factor.to.y, to ); 14984 } 14985 } 14986 14987 // Adjust the position properties based on the provided origin points 14988 if ( origin ) { 14989 baseline = $.effects.getBaseline( origin, original ); 14990 from.top = ( original.outerHeight - from.outerHeight ) * baseline.y + pos.top; 14991 from.left = ( original.outerWidth - from.outerWidth ) * baseline.x + pos.left; 14992 to.top = ( original.outerHeight - to.outerHeight ) * baseline.y + pos.top; 14993 to.left = ( original.outerWidth - to.outerWidth ) * baseline.x + pos.left; 14994 } 14995 delete from.outerHeight; 14996 delete from.outerWidth; 14997 element.css( from ); 14998 14999 // Animate the children if desired 15000 if ( scale === "content" || scale === "both" ) { 15001 15002 vProps = vProps.concat( [ "marginTop", "marginBottom" ] ).concat( cProps ); 15003 hProps = hProps.concat( [ "marginLeft", "marginRight" ] ); 15004 15005 // Only animate children with width attributes specified 15006 // TODO: is this right? should we include anything with css width specified as well 15007 element.find( "*[width]" ).each( function() { 15008 var child = $( this ), 15009 childOriginal = $.effects.scaledDimensions( child ), 15010 childFrom = { 15011 height: childOriginal.height * factor.from.y, 15012 width: childOriginal.width * factor.from.x, 15013 outerHeight: childOriginal.outerHeight * factor.from.y, 15014 outerWidth: childOriginal.outerWidth * factor.from.x 15015 }, 15016 childTo = { 15017 height: childOriginal.height * factor.to.y, 15018 width: childOriginal.width * factor.to.x, 15019 outerHeight: childOriginal.height * factor.to.y, 15020 outerWidth: childOriginal.width * factor.to.x 15021 }; 15022 15023 // Vertical props scaling 15024 if ( factor.from.y !== factor.to.y ) { 15025 childFrom = $.effects.setTransition( child, vProps, factor.from.y, childFrom ); 15026 childTo = $.effects.setTransition( child, vProps, factor.to.y, childTo ); 15027 } 15028 15029 // Horizontal props scaling 15030 if ( factor.from.x !== factor.to.x ) { 15031 childFrom = $.effects.setTransition( child, hProps, factor.from.x, childFrom ); 15032 childTo = $.effects.setTransition( child, hProps, factor.to.x, childTo ); 15033 } 15034 15035 if ( restore ) { 15036 $.effects.saveStyle( child ); 15037 } 15038 15039 // Animate children 15040 child.css( childFrom ); 15041 child.animate( childTo, options.duration, options.easing, function() { 15042 15043 // Restore children 15044 if ( restore ) { 15045 $.effects.restoreStyle( child ); 15046 } 15047 } ); 15048 } ); 15049 } 15050 15051 // Animate 15052 element.animate( to, { 15053 queue: false, 15054 duration: options.duration, 15055 easing: options.easing, 15056 complete: function() { 15057 15058 var offset = element.offset(); 15059 15060 if ( to.opacity === 0 ) { 15061 element.css( "opacity", from.opacity ); 15062 } 15063 15064 if ( !restore ) { 15065 element 15066 .css( "position", position === "static" ? "relative" : position ) 15067 .offset( offset ); 15068 15069 // Need to save style here so that automatic style restoration 15070 // doesn't restore to the original styles from before the animation. 15071 $.effects.saveStyle( element ); 15072 } 15073 15074 done(); 15075 } 15076 } ); 15077 15078} ); 15079 15080 15081/*! 15082 * jQuery UI Effects Scale 1.13.2 15083 * http://jqueryui.com 15084 * 15085 * Copyright jQuery Foundation and other contributors 15086 * Released under the MIT license. 15087 * http://jquery.org/license 15088 */ 15089 15090//>>label: Scale Effect 15091//>>group: Effects 15092//>>description: Grows or shrinks an element and its content. 15093//>>docs: http://api.jqueryui.com/scale-effect/ 15094//>>demos: http://jqueryui.com/effect/ 15095 15096 15097var effectsEffectScale = $.effects.define( "scale", function( options, done ) { 15098 15099 // Create element 15100 var el = $( this ), 15101 mode = options.mode, 15102 percent = parseInt( options.percent, 10 ) || 15103 ( parseInt( options.percent, 10 ) === 0 ? 0 : ( mode !== "effect" ? 0 : 100 ) ), 15104 15105 newOptions = $.extend( true, { 15106 from: $.effects.scaledDimensions( el ), 15107 to: $.effects.scaledDimensions( el, percent, options.direction || "both" ), 15108 origin: options.origin || [ "middle", "center" ] 15109 }, options ); 15110 15111 // Fade option to support puff 15112 if ( options.fade ) { 15113 newOptions.from.opacity = 1; 15114 newOptions.to.opacity = 0; 15115 } 15116 15117 $.effects.effect.size.call( this, newOptions, done ); 15118} ); 15119 15120 15121/*! 15122 * jQuery UI Effects Puff 1.13.2 15123 * http://jqueryui.com 15124 * 15125 * Copyright jQuery Foundation and other contributors 15126 * Released under the MIT license. 15127 * http://jquery.org/license 15128 */ 15129 15130//>>label: Puff Effect 15131//>>group: Effects 15132//>>description: Creates a puff effect by scaling the element up and hiding it at the same time. 15133//>>docs: http://api.jqueryui.com/puff-effect/ 15134//>>demos: http://jqueryui.com/effect/ 15135 15136 15137var effectsEffectPuff = $.effects.define( "puff", "hide", function( options, done ) { 15138 var newOptions = $.extend( true, {}, options, { 15139 fade: true, 15140 percent: parseInt( options.percent, 10 ) || 150 15141 } ); 15142 15143 $.effects.effect.scale.call( this, newOptions, done ); 15144} ); 15145 15146 15147/*! 15148 * jQuery UI Effects Pulsate 1.13.2 15149 * http://jqueryui.com 15150 * 15151 * Copyright jQuery Foundation and other contributors 15152 * Released under the MIT license. 15153 * http://jquery.org/license 15154 */ 15155 15156//>>label: Pulsate Effect 15157//>>group: Effects 15158//>>description: Pulsates an element n times by changing the opacity to zero and back. 15159//>>docs: http://api.jqueryui.com/pulsate-effect/ 15160//>>demos: http://jqueryui.com/effect/ 15161 15162 15163var effectsEffectPulsate = $.effects.define( "pulsate", "show", function( options, done ) { 15164 var element = $( this ), 15165 mode = options.mode, 15166 show = mode === "show", 15167 hide = mode === "hide", 15168 showhide = show || hide, 15169 15170 // Showing or hiding leaves off the "last" animation 15171 anims = ( ( options.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ), 15172 duration = options.duration / anims, 15173 animateTo = 0, 15174 i = 1, 15175 queuelen = element.queue().length; 15176 15177 if ( show || !element.is( ":visible" ) ) { 15178 element.css( "opacity", 0 ).show(); 15179 animateTo = 1; 15180 } 15181 15182 // Anims - 1 opacity "toggles" 15183 for ( ; i < anims; i++ ) { 15184 element.animate( { opacity: animateTo }, duration, options.easing ); 15185 animateTo = 1 - animateTo; 15186 } 15187 15188 element.animate( { opacity: animateTo }, duration, options.easing ); 15189 15190 element.queue( done ); 15191 15192 $.effects.unshift( element, queuelen, anims + 1 ); 15193} ); 15194 15195 15196/*! 15197 * jQuery UI Effects Shake 1.13.2 15198 * http://jqueryui.com 15199 * 15200 * Copyright jQuery Foundation and other contributors 15201 * Released under the MIT license. 15202 * http://jquery.org/license 15203 */ 15204 15205//>>label: Shake Effect 15206//>>group: Effects 15207//>>description: Shakes an element horizontally or vertically n times. 15208//>>docs: http://api.jqueryui.com/shake-effect/ 15209//>>demos: http://jqueryui.com/effect/ 15210 15211 15212var effectsEffectShake = $.effects.define( "shake", function( options, done ) { 15213 15214 var i = 1, 15215 element = $( this ), 15216 direction = options.direction || "left", 15217 distance = options.distance || 20, 15218 times = options.times || 3, 15219 anims = times * 2 + 1, 15220 speed = Math.round( options.duration / anims ), 15221 ref = ( direction === "up" || direction === "down" ) ? "top" : "left", 15222 positiveMotion = ( direction === "up" || direction === "left" ), 15223 animation = {}, 15224 animation1 = {}, 15225 animation2 = {}, 15226 15227 queuelen = element.queue().length; 15228 15229 $.effects.createPlaceholder( element ); 15230 15231 // Animation 15232 animation[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance; 15233 animation1[ ref ] = ( positiveMotion ? "+=" : "-=" ) + distance * 2; 15234 animation2[ ref ] = ( positiveMotion ? "-=" : "+=" ) + distance * 2; 15235 15236 // Animate 15237 element.animate( animation, speed, options.easing ); 15238 15239 // Shakes 15240 for ( ; i < times; i++ ) { 15241 element 15242 .animate( animation1, speed, options.easing ) 15243 .animate( animation2, speed, options.easing ); 15244 } 15245 15246 element 15247 .animate( animation1, speed, options.easing ) 15248 .animate( animation, speed / 2, options.easing ) 15249 .queue( done ); 15250 15251 $.effects.unshift( element, queuelen, anims + 1 ); 15252} ); 15253 15254 15255/*! 15256 * jQuery UI Effects Slide 1.13.2 15257 * http://jqueryui.com 15258 * 15259 * Copyright jQuery Foundation and other contributors 15260 * Released under the MIT license. 15261 * http://jquery.org/license 15262 */ 15263 15264//>>label: Slide Effect 15265//>>group: Effects 15266//>>description: Slides an element in and out of the viewport. 15267//>>docs: http://api.jqueryui.com/slide-effect/ 15268//>>demos: http://jqueryui.com/effect/ 15269 15270 15271var effectsEffectSlide = $.effects.define( "slide", "show", function( options, done ) { 15272 var startClip, startRef, 15273 element = $( this ), 15274 map = { 15275 up: [ "bottom", "top" ], 15276 down: [ "top", "bottom" ], 15277 left: [ "right", "left" ], 15278 right: [ "left", "right" ] 15279 }, 15280 mode = options.mode, 15281 direction = options.direction || "left", 15282 ref = ( direction === "up" || direction === "down" ) ? "top" : "left", 15283 positiveMotion = ( direction === "up" || direction === "left" ), 15284 distance = options.distance || 15285 element[ ref === "top" ? "outerHeight" : "outerWidth" ]( true ), 15286 animation = {}; 15287 15288 $.effects.createPlaceholder( element ); 15289 15290 startClip = element.cssClip(); 15291 startRef = element.position()[ ref ]; 15292 15293 // Define hide animation 15294 animation[ ref ] = ( positiveMotion ? -1 : 1 ) * distance + startRef; 15295 animation.clip = element.cssClip(); 15296 animation.clip[ map[ direction ][ 1 ] ] = animation.clip[ map[ direction ][ 0 ] ]; 15297 15298 // Reverse the animation if we're showing 15299 if ( mode === "show" ) { 15300 element.cssClip( animation.clip ); 15301 element.css( ref, animation[ ref ] ); 15302 animation.clip = startClip; 15303 animation[ ref ] = startRef; 15304 } 15305 15306 // Actually animate 15307 element.animate( animation, { 15308 queue: false, 15309 duration: options.duration, 15310 easing: options.easing,
vendor: 9,661 bytes, lines 15311-15693
15311 complete: done 15312 } ); 15313} ); 15314 15315 15316/*! 15317 * jQuery UI Effects Transfer 1.13.2 15318 * http://jqueryui.com 15319 * 15320 * Copyright jQuery Foundation and other contributors 15321 * Released under the MIT license. 15322 * http://jquery.org/license 15323 */ 15324 15325//>>label: Transfer Effect 15326//>>group: Effects 15327//>>description: Displays a transfer effect from one element to another. 15328//>>docs: http://api.jqueryui.com/transfer-effect/ 15329//>>demos: http://jqueryui.com/effect/ 15330 15331 15332var effect; 15333if ( $.uiBackCompat !== false ) { 15334 effect = $.effects.define( "transfer", function( options, done ) { 15335 $( this ).transfer( options, done ); 15336 } ); 15337} 15338var effectsEffectTransfer = effect; 15339 15340 15341/*! 15342 * jQuery UI Focusable 1.13.2 15343 * http://jqueryui.com 15344 * 15345 * Copyright jQuery Foundation and other contributors 15346 * Released under the MIT license. 15347 * http://jquery.org/license 15348 */ 15349 15350//>>label: :focusable Selector 15351//>>group: Core 15352//>>description: Selects elements which can be focused. 15353//>>docs: http://api.jqueryui.com/focusable-selector/ 15354 15355 15356// Selectors 15357$.ui.focusable = function( element, hasTabindex ) { 15358 var map, mapName, img, focusableIfVisible, fieldset, 15359 nodeName = element.nodeName.toLowerCase(); 15360 15361 if ( "area" === nodeName ) { 15362 map = element.parentNode; 15363 mapName = map.name; 15364 if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { 15365 return false; 15366 } 15367 img = $( "img[usemap='#" + mapName + "']" ); 15368 return img.length > 0 && img.is( ":visible" ); 15369 } 15370 15371 if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) { 15372 focusableIfVisible = !element.disabled; 15373 15374 if ( focusableIfVisible ) { 15375 15376 // Form controls within a disabled fieldset are disabled. 15377 // However, controls within the fieldset's legend do not get disabled. 15378 // Since controls generally aren't placed inside legends, we skip 15379 // this portion of the check. 15380 fieldset = $( element ).closest( "fieldset" )[ 0 ]; 15381 if ( fieldset ) { 15382 focusableIfVisible = !fieldset.disabled; 15383 } 15384 } 15385 } else if ( "a" === nodeName ) { 15386 focusableIfVisible = element.href || hasTabindex; 15387 } else { 15388 focusableIfVisible = hasTabindex; 15389 } 15390 15391 return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) ); 15392}; 15393 15394// Support: IE 8 only 15395// IE 8 doesn't resolve inherit to visible/hidden for computed values 15396function visible( element ) { 15397 var visibility = element.css( "visibility" ); 15398 while ( visibility === "inherit" ) { 15399 element = element.parent(); 15400 visibility = element.css( "visibility" ); 15401 } 15402 return visibility === "visible"; 15403} 15404 15405$.extend( $.expr.pseudos, { 15406 focusable: function( element ) { 15407 return $.ui.focusable( element, $.attr( element, "tabindex" ) != null ); 15408 } 15409} ); 15410 15411var focusable = $.ui.focusable; 15412 15413 15414 15415// Support: IE8 Only 15416// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop 15417// with a string, so we need to find the proper form. 15418var form = $.fn._form = function() { 15419 return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form ); 15420}; 15421 15422 15423/*! 15424 * jQuery UI Form Reset Mixin 1.13.2 15425 * http://jqueryui.com 15426 * 15427 * Copyright jQuery Foundation and other contributors 15428 * Released under the MIT license. 15429 * http://jquery.org/license 15430 */ 15431 15432//>>label: Form Reset Mixin 15433//>>group: Core 15434//>>description: Refresh input widgets when their form is reset 15435//>>docs: http://api.jqueryui.com/form-reset-mixin/ 15436 15437 15438var formResetMixin = $.ui.formResetMixin = { 15439 _formResetHandler: function() { 15440 var form = $( this ); 15441 15442 // Wait for the form reset to actually happen before refreshing 15443 setTimeout( function() { 15444 var instances = form.data( "ui-form-reset-instances" ); 15445 $.each( instances, function() { 15446 this.refresh(); 15447 } ); 15448 } ); 15449 }, 15450 15451 _bindFormResetHandler: function() { 15452 this.form = this.element._form(); 15453 if ( !this.form.length ) { 15454 return; 15455 } 15456 15457 var instances = this.form.data( "ui-form-reset-instances" ) || []; 15458 if ( !instances.length ) { 15459 15460 // We don't use _on() here because we use a single event handler per form 15461 this.form.on( "reset.ui-form-reset", this._formResetHandler ); 15462 } 15463 instances.push( this ); 15464 this.form.data( "ui-form-reset-instances", instances ); 15465 }, 15466 15467 _unbindFormResetHandler: function() { 15468 if ( !this.form.length ) { 15469 return; 15470 } 15471 15472 var instances = this.form.data( "ui-form-reset-instances" ); 15473 instances.splice( $.inArray( this, instances ), 1 ); 15474 if ( instances.length ) { 15475 this.form.data( "ui-form-reset-instances", instances ); 15476 } else { 15477 this.form 15478 .removeData( "ui-form-reset-instances" ) 15479 .off( "reset.ui-form-reset" ); 15480 } 15481 } 15482}; 15483 15484 15485/*! 15486 * jQuery UI Support for jQuery core 1.8.x and newer 1.13.2 15487 * http://jqueryui.com 15488 * 15489 * Copyright jQuery Foundation and other contributors 15490 * Released under the MIT license. 15491 * http://jquery.org/license 15492 * 15493 */ 15494 15495//>>label: jQuery 1.8+ Support 15496//>>group: Core 15497//>>description: Support version 1.8.x and newer of jQuery core 15498 15499 15500// Support: jQuery 1.9.x or older 15501// $.expr[ ":" ] is deprecated. 15502if ( !$.expr.pseudos ) { 15503 $.expr.pseudos = $.expr[ ":" ]; 15504} 15505 15506// Support: jQuery 1.11.x or older 15507// $.unique has been renamed to $.uniqueSort 15508if ( !$.uniqueSort ) { 15509 $.uniqueSort = $.unique; 15510} 15511 15512// Support: jQuery 2.2.x or older. 15513// This method has been defined in jQuery 3.0.0. 15514// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js 15515if ( !$.escapeSelector ) { 15516 15517 // CSS string/identifier serialization 15518 // https://drafts.csswg.org/cssom/#common-serializing-idioms 15519 var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; 15520 15521 var fcssescape = function( ch, asCodePoint ) { 15522 if ( asCodePoint ) { 15523 15524 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 15525 if ( ch === "\0" ) { 15526 return "\uFFFD"; 15527 } 15528 15529 // Control characters and (dependent upon position) numbers get escaped as code points 15530 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 15531 } 15532 15533 // Other potentially-special ASCII characters get backslash-escaped 15534 return "\\" + ch; 15535 }; 15536 15537 $.escapeSelector = function( sel ) { 15538 return ( sel + "" ).replace( rcssescape, fcssescape ); 15539 }; 15540} 15541 15542// Support: jQuery 3.4.x or older 15543// These methods have been defined in jQuery 3.5.0. 15544if ( !$.fn.even || !$.fn.odd ) { 15545 $.fn.extend( { 15546 even: function() { 15547 return this.filter( function( i ) { 15548 return i % 2 === 0; 15549 } ); 15550 }, 15551 odd: function() { 15552 return this.filter( function( i ) { 15553 return i % 2 === 1; 15554 } ); 15555 } 15556 } ); 15557} 15558 15559; 15560/*! 15561 * jQuery UI Keycode 1.13.2 15562 * http://jqueryui.com 15563 * 15564 * Copyright jQuery Foundation and other contributors 15565 * Released under the MIT license. 15566 * http://jquery.org/license 15567 */ 15568 15569//>>label: Keycode 15570//>>group: Core 15571//>>description: Provide keycodes as keynames 15572//>>docs: http://api.jqueryui.com/jQuery.ui.keyCode/ 15573 15574 15575var keycode = $.ui.keyCode = { 15576 BACKSPACE: 8, 15577 COMMA: 188, 15578 DELETE: 46, 15579 DOWN: 40, 15580 END: 35, 15581 ENTER: 13, 15582 ESCAPE: 27, 15583 HOME: 36, 15584 LEFT: 37, 15585 PAGE_DOWN: 34, 15586 PAGE_UP: 33, 15587 PERIOD: 190, 15588 RIGHT: 39, 15589 SPACE: 32, 15590 TAB: 9, 15591 UP: 38 15592}; 15593 15594 15595/*! 15596 * jQuery UI Labels 1.13.2 15597 * http://jqueryui.com 15598 * 15599 * Copyright jQuery Foundation and other contributors 15600 * Released under the MIT license. 15601 * http://jquery.org/license 15602 */ 15603 15604//>>label: labels 15605//>>group: Core 15606//>>description: Find all the labels associated with a given input 15607//>>docs: http://api.jqueryui.com/labels/ 15608 15609 15610var labels = $.fn.labels = function() { 15611 var ancestor, selector, id, labels, ancestors; 15612 15613 if ( !this.length ) { 15614 return this.pushStack( [] ); 15615 } 15616 15617 // Check control.labels first 15618 if ( this[ 0 ].labels && this[ 0 ].labels.length ) { 15619 return this.pushStack( this[ 0 ].labels ); 15620 } 15621 15622 // Support: IE <= 11, FF <= 37, Android <= 2.3 only 15623 // Above browsers do not support control.labels. Everything below is to support them 15624 // as well as document fragments. control.labels does not work on document fragments 15625 labels = this.eq( 0 ).parents( "label" ); 15626 15627 // Look for the label based on the id 15628 id = this.attr( "id" ); 15629 if ( id ) { 15630 15631 // We don't search against the document in case the element 15632 // is disconnected from the DOM 15633 ancestor = this.eq( 0 ).parents().last(); 15634 15635 // Get a full set of top level ancestors 15636 ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() ); 15637 15638 // Create a selector for the label based on the id 15639 selector = "label[for='" + $.escapeSelector( id ) + "']"; 15640 15641 labels = labels.add( ancestors.find( selector ).addBack( selector ) ); 15642 15643 } 15644 15645 // Return whatever we have found for labels 15646 return this.pushStack( labels ); 15647}; 15648 15649 15650/*! 15651 * jQuery UI Scroll Parent 1.13.2 15652 * http://jqueryui.com 15653 * 15654 * Copyright jQuery Foundation and other contributors 15655 * Released under the MIT license. 15656 * http://jquery.org/license 15657 */ 15658 15659//>>label: scrollParent 15660//>>group: Core 15661//>>description: Get the closest ancestor element that is scrollable. 15662//>>docs: http://api.jqueryui.com/scrollParent/ 15663 15664 15665var scrollParent = $.fn.scrollParent = function( includeHidden ) { 15666 var position = this.css( "position" ), 15667 excludeStaticParent = position === "absolute", 15668 overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, 15669 scrollParent = this.parents().filter( function() { 15670 var parent = $( this ); 15671 if ( excludeStaticParent && parent.css( "position" ) === "static" ) { 15672 return false; 15673 } 15674 return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + 15675 parent.css( "overflow-x" ) ); 15676 } ).eq( 0 ); 15677 15678 return position === "fixed" || !scrollParent.length ? 15679 $( this[ 0 ].ownerDocument || document ) : 15680 scrollParent; 15681}; 15682 15683 15684/*! 15685 * jQuery UI Tabbable 1.13.2 15686 * http://jqueryui.com 15687 * 15688 * Copyright jQuery Foundation and other contributors 15689 * Released under the MIT license. 15690 * http://jquery.org/license 15691 */ 15692 15693//>>label: :tabbable Selector
vendor: 1,775 bytes, lines 15694-15768
15694//>>group: Core 15695//>>description: Selects elements which can be tabbed to. 15696//>>docs: http://api.jqueryui.com/tabbable-selector/ 15697 15698 15699var tabbable = $.extend( $.expr.pseudos, { 15700 tabbable: function( element ) { 15701 var tabIndex = $.attr( element, "tabindex" ), 15702 hasTabindex = tabIndex != null; 15703 return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex ); 15704 } 15705} ); 15706 15707 15708/*! 15709 * jQuery UI Unique ID 1.13.2 15710 * http://jqueryui.com 15711 * 15712 * Copyright jQuery Foundation and other contributors 15713 * Released under the MIT license. 15714 * http://jquery.org/license 15715 */ 15716 15717//>>label: uniqueId 15718//>>group: Core 15719//>>description: Functions to generate and remove uniqueId's 15720//>>docs: http://api.jqueryui.com/uniqueId/ 15721 15722 15723var uniqueId = $.fn.extend( { 15724 uniqueId: ( function() { 15725 var uuid = 0; 15726 15727 return function() { 15728 return this.each( function() { 15729 if ( !this.id ) { 15730 this.id = "ui-id-" + ( ++uuid ); 15731 } 15732 } ); 15733 }; 15734 } )(), 15735 15736 removeUniqueId: function() { 15737 return this.each( function() { 15738 if ( /^ui-id-\d+$/.test( this.id ) ) { 15739 $( this ).removeAttr( "id" ); 15740 } 15741 } ); 15742 } 15743} ); 15744 15745 15746/*! 15747 * jQuery UI Accordion 1.13.2 15748 * http://jqueryui.com 15749 * 15750 * Copyright jQuery Foundation and other contributors 15751 * Released under the MIT license. 15752 * http://jquery.org/license 15753 */ 15754 15755//>>label: Accordion 15756//>>group: Widgets 15757/* eslint-disable max-len */ 15758//>>description: Displays collapsible content panels for presenting information in a limited amount of space. 15759/* eslint-enable max-len */ 15760//>>docs: http://api.jqueryui.com/accordion/ 15761//>>demos: http://jqueryui.com/accordion/ 15762//>>css.structure: ../../themes/base/core.css 15763//>>css.structure: ../../themes/base/accordion.css 15764//>>css.theme: ../../themes/base/theme.css 15765 15766 15767var widgetsAccordion = $.widget( "ui.accordion", { 15768 version: "1.13.2
vendor: 15,900 bytes, lines 15768-16379
15768", 15769 options: { 15770 active: 0, 15771 animate: {}, 15772 classes: { 15773 "ui-accordion-header": "ui-corner-top", 15774 "ui-accordion-header-collapsed": "ui-corner-all", 15775 "ui-accordion-content": "ui-corner-bottom" 15776 }, 15777 collapsible: false, 15778 event: "click", 15779 header: function( elem ) { 15780 return elem.find( "> li > :first-child" ).add( elem.find( "> :not(li)" ).even() ); 15781 }, 15782 heightStyle: "auto", 15783 icons: { 15784 activeHeader: "ui-icon-triangle-1-s", 15785 header: "ui-icon-triangle-1-e" 15786 }, 15787 15788 // Callbacks 15789 activate: null, 15790 beforeActivate: null 15791 }, 15792 15793 hideProps: { 15794 borderTopWidth: "hide", 15795 borderBottomWidth: "hide", 15796 paddingTop: "hide", 15797 paddingBottom: "hide", 15798 height: "hide" 15799 }, 15800 15801 showProps: { 15802 borderTopWidth: "show", 15803 borderBottomWidth: "show", 15804 paddingTop: "show", 15805 paddingBottom: "show", 15806 height: "show" 15807 }, 15808 15809 _create: function() { 15810 var options = this.options; 15811 15812 this.prevShow = this.prevHide = $(); 15813 this._addClass( "ui-accordion", "ui-widget ui-helper-reset" ); 15814 this.element.attr( "role", "tablist" ); 15815 15816 // Don't allow collapsible: false and active: false / null 15817 if ( !options.collapsible && ( options.active === false || options.active == null ) ) { 15818 options.active = 0; 15819 } 15820 15821 this._processPanels(); 15822 15823 // handle negative values 15824 if ( options.active < 0 ) { 15825 options.active += this.headers.length; 15826 } 15827 this._refresh(); 15828 }, 15829 15830 _getCreateEventData: function() { 15831 return { 15832 header: this.active, 15833 panel: !this.active.length ? $() : this.active.next() 15834 }; 15835 }, 15836 15837 _createIcons: function() { 15838 var icon, children, 15839 icons = this.options.icons; 15840 15841 if ( icons ) { 15842 icon = $( "<span>" ); 15843 this._addClass( icon, "ui-accordion-header-icon", "ui-icon " + icons.header ); 15844 icon.prependTo( this.headers ); 15845 children = this.active.children( ".ui-accordion-header-icon" ); 15846 this._removeClass( children, icons.header ) 15847 ._addClass( children, null, icons.activeHeader ) 15848 ._addClass( this.headers, "ui-accordion-icons" ); 15849 } 15850 }, 15851 15852 _destroyIcons: function() { 15853 this._removeClass( this.headers, "ui-accordion-icons" ); 15854 this.headers.children( ".ui-accordion-header-icon" ).remove(); 15855 }, 15856 15857 _destroy: function() { 15858 var contents; 15859 15860 // Clean up main element 15861 this.element.removeAttr( "role" ); 15862 15863 // Clean up headers 15864 this.headers 15865 .removeAttr( "role aria-expanded aria-selected aria-controls tabIndex" ) 15866 .removeUniqueId(); 15867 15868 this._destroyIcons(); 15869 15870 // Clean up content panels 15871 contents = this.headers.next() 15872 .css( "display", "" ) 15873 .removeAttr( "role aria-hidden aria-labelledby" ) 15874 .removeUniqueId(); 15875 15876 if ( this.options.heightStyle !== "content" ) { 15877 contents.css( "height", "" ); 15878 } 15879 }, 15880 15881 _setOption: function( key, value ) { 15882 if ( key === "active" ) { 15883 15884 // _activate() will handle invalid values and update this.options 15885 this._activate( value ); 15886 return; 15887 } 15888 15889 if ( key === "event" ) { 15890 if ( this.options.event ) { 15891 this._off( this.headers, this.options.event ); 15892 } 15893 this._setupEvents( value ); 15894 } 15895 15896 this._super( key, value ); 15897 15898 // Setting collapsible: false while collapsed; open first panel 15899 if ( key === "collapsible" && !value && this.options.active === false ) { 15900 this._activate( 0 ); 15901 } 15902 15903 if ( key === "icons" ) { 15904 this._destroyIcons(); 15905 if ( value ) { 15906 this._createIcons(); 15907 } 15908 } 15909 }, 15910 15911 _setOptionDisabled: function( value ) { 15912 this._super( value ); 15913 15914 this.element.attr( "aria-disabled", value ); 15915 15916 // Support: IE8 Only 15917 // #5332 / #6059 - opacity doesn't cascade to positioned elements in IE 15918 // so we need to add the disabled class to the headers and panels 15919 this._toggleClass( null, "ui-state-disabled", !!value ); 15920 this._toggleClass( this.headers.add( this.headers.next() ), null, "ui-state-disabled", 15921 !!value ); 15922 }, 15923 15924 _keydown: function( event ) { 15925 if ( event.altKey || event.ctrlKey ) { 15926 return; 15927 } 15928 15929 var keyCode = $.ui.keyCode, 15930 length = this.headers.length, 15931 currentIndex = this.headers.index( event.target ), 15932 toFocus = false; 15933 15934 switch ( event.keyCode ) { 15935 case keyCode.RIGHT: 15936 case keyCode.DOWN: 15937 toFocus = this.headers[ ( currentIndex + 1 ) % length ]; 15938 break; 15939 case keyCode.LEFT: 15940 case keyCode.UP: 15941 toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; 15942 break; 15943 case keyCode.SPACE: 15944 case keyCode.ENTER: 15945 this._eventHandler( event ); 15946 break; 15947 case keyCode.HOME: 15948 toFocus = this.headers[ 0 ]; 15949 break; 15950 case keyCode.END: 15951 toFocus = this.headers[ length - 1 ]; 15952 break; 15953 } 15954 15955 if ( toFocus ) { 15956 $( event.target ).attr( "tabIndex", -1 ); 15957 $( toFocus ).attr( "tabIndex", 0 ); 15958 $( toFocus ).trigger( "focus" ); 15959 event.preventDefault(); 15960 } 15961 }, 15962 15963 _panelKeyDown: function( event ) { 15964 if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { 15965 $( event.currentTarget ).prev().trigger( "focus" ); 15966 } 15967 }, 15968 15969 refresh: function() { 15970 var options = this.options; 15971 this._processPanels(); 15972 15973 // Was collapsed or no panel 15974 if ( ( options.active === false && options.collapsible === true ) || 15975 !this.headers.length ) { 15976 options.active = false; 15977 this.active = $(); 15978 15979 // active false only when collapsible is true 15980 } else if ( options.active === false ) { 15981 this._activate( 0 ); 15982 15983 // was active, but active panel is gone 15984 } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { 15985 15986 // all remaining panel are disabled 15987 if ( this.headers.length === this.headers.find( ".ui-state-disabled" ).length ) { 15988 options.active = false; 15989 this.active = $(); 15990 15991 // activate previous panel 15992 } else { 15993 this._activate( Math.max( 0, options.active - 1 ) ); 15994 } 15995 15996 // was active, active panel still exists 15997 } else { 15998 15999 // make sure active index is correct 16000 options.active = this.headers.index( this.active ); 16001 } 16002 16003 this._destroyIcons(); 16004 16005 this._refresh(); 16006 }, 16007 16008 _processPanels: function() { 16009 var prevHeaders = this.headers, 16010 prevPanels = this.panels; 16011 16012 if ( typeof this.options.header === "function" ) { 16013 this.headers = this.options.header( this.element ); 16014 } else { 16015 this.headers = this.element.find( this.options.header ); 16016 } 16017 this._addClass( this.headers, "ui-accordion-header ui-accordion-header-collapsed", 16018 "ui-state-default" ); 16019 16020 this.panels = this.headers.next().filter( ":not(.ui-accordion-content-active)" ).hide(); 16021 this._addClass( this.panels, "ui-accordion-content", "ui-helper-reset ui-widget-content" ); 16022 16023 // Avoid memory leaks (#10056) 16024 if ( prevPanels ) { 16025 this._off( prevHeaders.not( this.headers ) ); 16026 this._off( prevPanels.not( this.panels ) ); 16027 } 16028 }, 16029 16030 _refresh: function() { 16031 var maxHeight, 16032 options = this.options, 16033 heightStyle = options.heightStyle, 16034 parent = this.element.parent(); 16035 16036 this.active = this._findActive( options.active ); 16037 this._addClass( this.active, "ui-accordion-header-active", "ui-state-active" ) 16038 ._removeClass( this.active, "ui-accordion-header-collapsed" ); 16039 this._addClass( this.active.next(), "ui-accordion-content-active" ); 16040 this.active.next().show(); 16041 16042 this.headers 16043 .attr( "role", "tab" ) 16044 .each( function() { 16045 var header = $( this ), 16046 headerId = header.uniqueId().attr( "id" ), 16047 panel = header.next(), 16048 panelId = panel.uniqueId().attr( "id" ); 16049 header.attr( "aria-controls", panelId ); 16050 panel.attr( "aria-labelledby", headerId ); 16051 } ) 16052 .next() 16053 .attr( "role", "tabpanel" ); 16054 16055 this.headers 16056 .not( this.active ) 16057 .attr( { 16058 "aria-selected": "false", 16059 "aria-expanded": "false", 16060 tabIndex: -1 16061 } ) 16062 .next() 16063 .attr( { 16064 "aria-hidden": "true" 16065 } ) 16066 .hide(); 16067 16068 // Make sure at least one header is in the tab order 16069 if ( !this.active.length ) { 16070 this.headers.eq( 0 ).attr( "tabIndex", 0 ); 16071 } else { 16072 this.active.attr( { 16073 "aria-selected": "true", 16074 "aria-expanded": "true", 16075 tabIndex: 0 16076 } ) 16077 .next() 16078 .attr( { 16079 "aria-hidden": "false" 16080 } ); 16081 } 16082 16083 this._createIcons(); 16084 16085 this._setupEvents( options.event ); 16086 16087 if ( heightStyle === "fill" ) { 16088 maxHeight = parent.height(); 16089 this.element.siblings( ":visible" ).each( function() { 16090 var elem = $( this ), 16091 position = elem.css( "position" ); 16092 16093 if ( position === "absolute" || position === "fixed" ) { 16094 return; 16095 } 16096 maxHeight -= elem.outerHeight( true ); 16097 } ); 16098 16099 this.headers.each( function() { 16100 maxHeight -= $( this ).outerHeight( true ); 16101 } ); 16102 16103 this.headers.next() 16104 .each( function() { 16105 $( this ).height( Math.max( 0, maxHeight - 16106 $( this ).innerHeight() + $( this ).height() ) ); 16107 } ) 16108 .css( "overflow", "auto" ); 16109 } else if ( heightStyle === "auto" ) { 16110 maxHeight = 0; 16111 this.headers.next() 16112 .each( function() { 16113 var isVisible = $( this ).is( ":visible" ); 16114 if ( !isVisible ) { 16115 $( this ).show(); 16116 } 16117 maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); 16118 if ( !isVisible ) { 16119 $( this ).hide(); 16120 } 16121 } ) 16122 .height( maxHeight ); 16123 } 16124 }, 16125 16126 _activate: function( index ) { 16127 var active = this._findActive( index )[ 0 ]; 16128 16129 // Trying to activate the already active panel 16130 if ( active === this.active[ 0 ] ) { 16131 return; 16132 } 16133 16134 // Trying to collapse, simulate a click on the currently active header 16135 active = active || this.active[ 0 ]; 16136 16137 this._eventHandler( { 16138 target: active, 16139 currentTarget: active, 16140 preventDefault: $.noop 16141 } ); 16142 }, 16143 16144 _findActive: function( selector ) { 16145 return typeof selector === "number" ? this.headers.eq( selector ) : $(); 16146 }, 16147 16148 _setupEvents: function( event ) { 16149 var events = { 16150 keydown: "_keydown" 16151 }; 16152 if ( event ) { 16153 $.each( event.split( " " ), function( index, eventName ) { 16154 events[ eventName ] = "_eventHandler"; 16155 } ); 16156 } 16157 16158 this._off( this.headers.add( this.headers.next() ) ); 16159 this._on( this.headers, events ); 16160 this._on( this.headers.next(), { keydown: "_panelKeyDown" } ); 16161 this._hoverable( this.headers ); 16162 this._focusable( this.headers ); 16163 }, 16164 16165 _eventHandler: function( event ) { 16166 var activeChildren, clickedChildren, 16167 options = this.options, 16168 active = this.active, 16169 clicked = $( event.currentTarget ), 16170 clickedIsActive = clicked[ 0 ] === active[ 0 ], 16171 collapsing = clickedIsActive && options.collapsible, 16172 toShow = collapsing ? $() : clicked.next(), 16173 toHide = active.next(), 16174 eventData = { 16175 oldHeader: active, 16176 oldPanel: toHide, 16177 newHeader: collapsing ? $() : clicked, 16178 newPanel: toShow 16179 }; 16180 16181 event.preventDefault(); 16182 16183 if ( 16184 16185 // click on active header, but not collapsible 16186 ( clickedIsActive && !options.collapsible ) || 16187 16188 // allow canceling activation 16189 ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { 16190 return; 16191 } 16192 16193 options.active = collapsing ? false : this.headers.index( clicked ); 16194 16195 // When the call to ._toggle() comes after the class changes 16196 // it causes a very odd bug in IE 8 (see #6720) 16197 this.active = clickedIsActive ? $() : clicked; 16198 this._toggle( eventData ); 16199 16200 // Switch classes 16201 // corner classes on the previously active header stay after the animation 16202 this._removeClass( active, "ui-accordion-header-active", "ui-state-active" ); 16203 if ( options.icons ) { 16204 activeChildren = active.children( ".ui-accordion-header-icon" ); 16205 this._removeClass( activeChildren, null, options.icons.activeHeader ) 16206 ._addClass( activeChildren, null, options.icons.header ); 16207 } 16208 16209 if ( !clickedIsActive ) { 16210 this._removeClass( clicked, "ui-accordion-header-collapsed" ) 16211 ._addClass( clicked, "ui-accordion-header-active", "ui-state-active" ); 16212 if ( options.icons ) { 16213 clickedChildren = clicked.children( ".ui-accordion-header-icon" ); 16214 this._removeClass( clickedChildren, null, options.icons.header ) 16215 ._addClass( clickedChildren, null, options.icons.activeHeader ); 16216 } 16217 16218 this._addClass( clicked.next(), "ui-accordion-content-active" ); 16219 } 16220 }, 16221 16222 _toggle: function( data ) { 16223 var toShow = data.newPanel, 16224 toHide = this.prevShow.length ? this.prevShow : data.oldPanel; 16225 16226 // Handle activating a panel during the animation for another activation 16227 this.prevShow.add( this.prevHide ).stop( true, true ); 16228 this.prevShow = toShow; 16229 this.prevHide = toHide; 16230 16231 if ( this.options.animate ) { 16232 this._animate( toShow, toHide, data ); 16233 } else { 16234 toHide.hide(); 16235 toShow.show(); 16236 this._toggleComplete( data ); 16237 } 16238 16239 toHide.attr( { 16240 "aria-hidden": "true" 16241 } ); 16242 toHide.prev().attr( { 16243 "aria-selected": "false", 16244 "aria-expanded": "false" 16245 } ); 16246 16247 // if we're switching panels, remove the old header from the tab order 16248 // if we're opening from collapsed state, remove the previous header from the tab order 16249 // if we're collapsing, then keep the collapsing header in the tab order 16250 if ( toShow.length && toHide.length ) { 16251 toHide.prev().attr( { 16252 "tabIndex": -1, 16253 "aria-expanded": "false" 16254 } ); 16255 } else if ( toShow.length ) { 16256 this.headers.filter( function() { 16257 return parseInt( $( this ).attr( "tabIndex" ), 10 ) === 0; 16258 } ) 16259 .attr( "tabIndex", -1 ); 16260 } 16261 16262 toShow 16263 .attr( "aria-hidden", "false" ) 16264 .prev() 16265 .attr( { 16266 "aria-selected": "true", 16267 "aria-expanded": "true", 16268 tabIndex: 0 16269 } ); 16270 }, 16271 16272 _animate: function( toShow, toHide, data ) { 16273 var total, easing, duration, 16274 that = this, 16275 adjust = 0, 16276 boxSizing = toShow.css( "box-sizing" ), 16277 down = toShow.length && 16278 ( !toHide.length || ( toShow.index() < toHide.index() ) ), 16279 animate = this.options.animate || {}, 16280 options = down && animate.down || animate, 16281 complete = function() { 16282 that._toggleComplete( data ); 16283 }; 16284 16285 if ( typeof options === "number" ) { 16286 duration = options; 16287 } 16288 if ( typeof options === "string" ) { 16289 easing = options; 16290 } 16291 16292 // fall back from options to animation in case of partial down settings 16293 easing = easing || options.easing || animate.easing; 16294 duration = duration || options.duration || animate.duration; 16295 16296 if ( !toHide.length ) { 16297 return toShow.animate( this.showProps, duration, easing, complete ); 16298 } 16299 if ( !toShow.length ) { 16300 return toHide.animate( this.hideProps, duration, easing, complete ); 16301 } 16302 16303 total = toShow.show().outerHeight(); 16304 toHide.animate( this.hideProps, { 16305 duration: duration, 16306 easing: easing, 16307 step: function( now, fx ) { 16308 fx.now = Math.round( now ); 16309 } 16310 } ); 16311 toShow 16312 .hide() 16313 .animate( this.showProps, { 16314 duration: duration, 16315 easing: easing, 16316 complete: complete, 16317 step: function( now, fx ) { 16318 fx.now = Math.round( now ); 16319 if ( fx.prop !== "height" ) { 16320 if ( boxSizing === "content-box" ) { 16321 adjust += fx.now; 16322 } 16323 } else if ( that.options.heightStyle !== "content" ) { 16324 fx.now = Math.round( total - toHide.outerHeight() - adjust ); 16325 adjust = 0; 16326 } 16327 } 16328 } ); 16329 }, 16330 16331 _toggleComplete: function( data ) { 16332 var toHide = data.oldPanel, 16333 prev = toHide.prev(); 16334 16335 this._removeClass( toHide, "ui-accordion-content-active" ); 16336 this._removeClass( prev, "ui-accordion-header-active" ) 16337 ._addClass( prev, "ui-accordion-header-collapsed" ); 16338 16339 // Work around for rendering bug in IE (#5421) 16340 if ( toHide.length ) { 16341 toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className; 16342 } 16343 this._trigger( "activate", null, data ); 16344 } 16345} ); 16346 16347 16348 16349var safeActiveElement = $.ui.safeActiveElement = function( document ) { 16350 var activeElement; 16351 16352 // Support: IE 9 only 16353 // IE9 throws an "Unspecified error" accessing document.activeElement from an <iframe> 16354 try { 16355 activeElement = document.activeElement; 16356 } catch ( error ) { 16357 activeElement = document.body; 16358 } 16359 16360 // Support: IE 9 - 11 only 16361 // IE may return null instead of an element 16362 // Interestingly, this only seems to occur when NOT in an iframe 16363 if ( !activeElement ) { 16364 activeElement = document.body; 16365 } 16366 16367 // Support: IE 11 only 16368 // IE11 returns a seemingly empty object in some cases when accessing 16369 // document.activeElement from an <iframe> 16370 if ( !activeElement.nodeName ) { 16371 activeElement = document.body; 16372 } 16373 16374 return activeElement; 16375}; 16376 16377 16378/*! 16379 * jQuery UI Menu 1.13.
163792 16380 * http://jqueryui.com 16381 * 16382 * Copyright jQuery Foundation and other contributors 16383 * Released under the MIT license. 16384 * http://jquery.org/license 16385 */ 16386 16387//>>label: Menu 16388//>>group: Widgets 16389//>>description: Creates nestable menus. 16390//>>docs: http://api.jqueryui.com/menu/ 16391//>>demos: http://jqueryui.com/menu/ 16392//>>css.structure: ../../themes/base/core.css 16393//>>css.structure: ../../themes/base/menu.css 16394//>>css.theme: ../../themes/base/theme.css 16395 16396 16397var widgetsMenu = $.widget( "ui.menu", { 16398 version: "1.13.2
vendor: 2,668 bytes, lines 16398-16500
16398", 16399 defaultElement: "<ul>", 16400 delay: 300, 16401 options: { 16402 icons: { 16403 submenu: "ui-icon-caret-1-e" 16404 }, 16405 items: "> *", 16406 menus: "ul", 16407 position: { 16408 my: "left top", 16409 at: "right top" 16410 }, 16411 role: "menu", 16412 16413 // Callbacks 16414 blur: null, 16415 focus: null, 16416 select: null 16417 }, 16418 16419 _create: function() { 16420 this.activeMenu = this.element; 16421 16422 // Flag used to prevent firing of the click handler 16423 // as the event bubbles up through nested menus 16424 this.mouseHandled = false; 16425 this.lastMousePosition = { x: null, y: null }; 16426 this.element 16427 .uniqueId() 16428 .attr( { 16429 role: this.options.role, 16430 tabIndex: 0 16431 } ); 16432 16433 this._addClass( "ui-menu", "ui-widget ui-widget-content" ); 16434 this._on( { 16435 16436 // Prevent focus from sticking to links inside menu after clicking 16437 // them (focus should always stay on UL during navigation). 16438 "mousedown .ui-menu-item": function( event ) { 16439 event.preventDefault(); 16440 16441 this._activateItem( event ); 16442 }, 16443 "click .ui-menu-item": function( event ) { 16444 var target = $( event.target ); 16445 var active = $( $.ui.safeActiveElement( this.document[ 0 ] ) ); 16446 if ( !this.mouseHandled && target.not( ".ui-state-disabled" ).length ) { 16447 this.select( event ); 16448 16449 // Only set the mouseHandled flag if the event will bubble, see #9469. 16450 if ( !event.isPropagationStopped() ) { 16451 this.mouseHandled = true; 16452 } 16453 16454 // Open submenu on click 16455 if ( target.has( ".ui-menu" ).length ) { 16456 this.expand( event ); 16457 } else if ( !this.element.is( ":focus" ) && 16458 active.closest( ".ui-menu" ).length ) { 16459 16460 // Redirect focus to the menu 16461 this.element.trigger( "focus", [ true ] ); 16462 16463 // If the active item is on the top level, let it stay active. 16464 // Otherwise, blur the active item since it is no longer visible. 16465 if ( this.active && this.active.parents( ".ui-menu" ).length === 1 ) { 16466 clearTimeout( this.timer ); 16467 } 16468 } 16469 } 16470 }, 16471 "mouseenter .ui-menu-item": "_activateItem", 16472 "mousemove .ui-menu-item": "_activateItem", 16473 mouseleave: "collapseAll", 16474 "mouseleave .ui-menu": "collapseAll", 16475 focus: function( event, keepActiveItem ) { 16476 16477 // If there's already an active item, keep it active 16478 // If not, activate the first item 16479 var item = this.active || this._menuItems().first(); 16480 16481 if ( !keepActiveItem ) { 16482 this.focus( event, item ); 16483 } 16484 }, 16485 blur: function( event ) { 16486 this._delay( function() { 16487 var notContained = !$.contains( 16488 this.element[ 0 ], 16489 $.ui.safeActiveElement( this.document[ 0 ] ) 16490 ); 16491 if ( notContained ) { 16492 this.collapseAll( event ); 16493 } 16494 } ); 16495 }, 16496 keydown: "_keydown" 16497 } ); 16498 16499 this.refresh(); 16500
vendor: 3,056 bytes, lines 16501-16617
16501 // Clicks outside of a menu collapse any open menus 16502 this._on( this.document, { 16503 click: function( event ) { 16504 if ( this._closeOnDocumentClick( event ) ) { 16505 this.collapseAll( event, true ); 16506 } 16507 16508 // Reset the mouseHandled flag 16509 this.mouseHandled = false; 16510 } 16511 } ); 16512 }, 16513 16514 _activateItem: function( event ) { 16515 16516 // Ignore mouse events while typeahead is active, see #10458. 16517 // Prevents focusing the wrong item when typeahead causes a scroll while the mouse 16518 // is over an item in the menu 16519 if ( this.previousFilter ) { 16520 return; 16521 } 16522 16523 // If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356) 16524 if ( event.clientX === this.lastMousePosition.x && 16525 event.clientY === this.lastMousePosition.y ) { 16526 return; 16527 } 16528 16529 this.lastMousePosition = { 16530 x: event.clientX, 16531 y: event.clientY 16532 }; 16533 16534 var actualTarget = $( event.target ).closest( ".ui-menu-item" ), 16535 target = $( event.currentTarget ); 16536 16537 // Ignore bubbled events on parent items, see #11641 16538 if ( actualTarget[ 0 ] !== target[ 0 ] ) { 16539 return; 16540 } 16541 16542 // If the item is already active, there's nothing to do 16543 if ( target.is( ".ui-state-active" ) ) { 16544 return; 16545 } 16546 16547 // Remove ui-state-active class from siblings of the newly focused menu item 16548 // to avoid a jump caused by adjacent elements both having a class with a border 16549 this._removeClass( target.siblings().children( ".ui-state-active" ), 16550 null, "ui-state-active" ); 16551 this.focus( event, target ); 16552 }, 16553 16554 _destroy: function() { 16555 var items = this.element.find( ".ui-menu-item" ) 16556 .removeAttr( "role aria-disabled" ), 16557 submenus = items.children( ".ui-menu-item-wrapper" ) 16558 .removeUniqueId() 16559 .removeAttr( "tabIndex role aria-haspopup" ); 16560 16561 // Destroy (sub)menus 16562 this.element 16563 .removeAttr( "aria-activedescendant" ) 16564 .find( ".ui-menu" ).addBack() 16565 .removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " + 16566 "tabIndex" ) 16567 .removeUniqueId() 16568 .show(); 16569 16570 submenus.children().each( function() { 16571 var elem = $( this ); 16572 if ( elem.data( "ui-menu-submenu-caret" ) ) { 16573 elem.remove(); 16574 } 16575 } ); 16576 }, 16577 16578 _keydown: function( event ) { 16579 var match, prev, character, skip, 16580 preventDefault = true; 16581 16582 switch ( event.keyCode ) { 16583 case $.ui.keyCode.PAGE_UP: 16584 this.previousPage( event ); 16585 break; 16586 case $.ui.keyCode.PAGE_DOWN: 16587 this.nextPage( event ); 16588 break; 16589 case $.ui.keyCode.HOME: 16590 this._move( "first", "first", event ); 16591 break; 16592 case $.ui.keyCode.END: 16593 this._move( "last", "last", event ); 16594 break; 16595 case $.ui.keyCode.UP: 16596 this.previous( event ); 16597 break; 16598 case $.ui.keyCode.DOWN: 16599 this.next( event ); 16600 break; 16601 case $.ui.keyCode.LEFT: 16602 this.collapse( event ); 16603 break; 16604 case $.ui.keyCode.RIGHT: 16605 if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { 16606 this.expand( event ); 16607 } 16608 break; 16609 case $.ui.keyCode.ENTER: 16610 case $.ui.keyCode.SPACE: 16611 this._activate( event ); 16612 break; 16613 case $.ui.keyCode.ESCAPE: 16614 this.collapse( event ); 16615 break; 16616 default: 16617 preventDefault = false;
vendor: 2,378 bytes, lines 16618-16703
16618 prev = this.previousFilter || ""; 16619 skip = false; 16620 16621 // Support number pad values 16622 character = event.keyCode >= 96 && event.keyCode <= 105 ? 16623 ( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode ); 16624 16625 clearTimeout( this.filterTimer ); 16626 16627 if ( character === prev ) { 16628 skip = true; 16629 } else { 16630 character = prev + character; 16631 } 16632 16633 match = this._filterMenuItems( character ); 16634 match = skip && match.index( this.active.next() ) !== -1 ? 16635 this.active.nextAll( ".ui-menu-item" ) : 16636 match; 16637 16638 // If no matches on the current filter, reset to the last character pressed 16639 // to move down the menu to the first item that starts with that character 16640 if ( !match.length ) { 16641 character = String.fromCharCode( event.keyCode ); 16642 match = this._filterMenuItems( character ); 16643 } 16644 16645 if ( match.length ) { 16646 this.focus( event, match ); 16647 this.previousFilter = character; 16648 this.filterTimer = this._delay( function() { 16649 delete this.previousFilter; 16650 }, 1000 ); 16651 } else { 16652 delete this.previousFilter; 16653 } 16654 } 16655 16656 if ( preventDefault ) { 16657 event.preventDefault(); 16658 } 16659 }, 16660 16661 _activate: function( event ) { 16662 if ( this.active && !this.active.is( ".ui-state-disabled" ) ) { 16663 if ( this.active.children( "[aria-haspopup='true']" ).length ) { 16664 this.expand( event ); 16665 } else { 16666 this.select( event ); 16667 } 16668 } 16669 }, 16670 16671 refresh: function() { 16672 var menus, items, newSubmenus, newItems, newWrappers, 16673 that = this, 16674 icon = this.options.icons.submenu, 16675 submenus = this.element.find( this.options.menus ); 16676 16677 this._toggleClass( "ui-menu-icons", null, !!this.element.find( ".ui-icon" ).length ); 16678 16679 // Initialize nested menus 16680 newSubmenus = submenus.filter( ":not(.ui-menu)" ) 16681 .hide() 16682 .attr( { 16683 role: this.options.role, 16684 "aria-hidden": "true", 16685 "aria-expanded": "false" 16686 } ) 16687 .each( function() { 16688 var menu = $( this ), 16689 item = menu.prev(), 16690 submenuCaret = $( "<span>" ).data( "ui-menu-submenu-caret", true ); 16691 16692 that._addClass( submenuCaret, "ui-menu-icon", "ui-icon " + icon ); 16693 item 16694 .attr( "aria-haspopup", "true" ) 16695 .prepend( submenuCaret ); 16696 menu.attr( "aria-labelledby", item.attr( "id" ) ); 16697 } ); 16698 16699 this._addClass( newSubmenus, "ui-menu", "ui-widget ui-widget-content ui-front" ); 16700 16701 menus = submenus.add( this.element ); 16702 items = menus.find( this.options.items ); 16703
vendor: 4,552 bytes, lines 16704-16866
16704 // Initialize menu-items containing spaces and/or dashes only as dividers 16705 items.not( ".ui-menu-item" ).each( function() { 16706 var item = $( this ); 16707 if ( that._isDivider( item ) ) { 16708 that._addClass( item, "ui-menu-divider", "ui-widget-content" ); 16709 } 16710 } ); 16711 16712 // Don't refresh list items that are already adapted 16713 newItems = items.not( ".ui-menu-item, .ui-menu-divider" ); 16714 newWrappers = newItems.children() 16715 .not( ".ui-menu" ) 16716 .uniqueId() 16717 .attr( { 16718 tabIndex: -1, 16719 role: this._itemRole() 16720 } ); 16721 this._addClass( newItems, "ui-menu-item" ) 16722 ._addClass( newWrappers, "ui-menu-item-wrapper" ); 16723 16724 // Add aria-disabled attribute to any disabled menu item 16725 items.filter( ".ui-state-disabled" ).attr( "aria-disabled", "true" ); 16726 16727 // If the active item has been removed, blur the menu 16728 if ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { 16729 this.blur(); 16730 } 16731 }, 16732 16733 _itemRole: function() { 16734 return { 16735 menu: "menuitem", 16736 listbox: "option" 16737 }[ this.options.role ]; 16738 }, 16739 16740 _setOption: function( key, value ) { 16741 if ( key === "icons" ) { 16742 var icons = this.element.find( ".ui-menu-icon" ); 16743 this._removeClass( icons, null, this.options.icons.submenu ) 16744 ._addClass( icons, null, value.submenu ); 16745 } 16746 this._super( key, value ); 16747 }, 16748 16749 _setOptionDisabled: function( value ) { 16750 this._super( value ); 16751 16752 this.element.attr( "aria-disabled", String( value ) ); 16753 this._toggleClass( null, "ui-state-disabled", !!value ); 16754 }, 16755 16756 focus: function( event, item ) { 16757 var nested, focused, activeParent; 16758 this.blur( event, event && event.type === "focus" ); 16759 16760 this._scrollIntoView( item ); 16761 16762 this.active = item.first(); 16763 16764 focused = this.active.children( ".ui-menu-item-wrapper" ); 16765 this._addClass( focused, null, "ui-state-active" ); 16766 16767 // Only update aria-activedescendant if there's a role 16768 // otherwise we assume focus is managed elsewhere 16769 if ( this.options.role ) { 16770 this.element.attr( "aria-activedescendant", focused.attr( "id" ) ); 16771 } 16772 16773 // Highlight active parent menu item, if any 16774 activeParent = this.active 16775 .parent() 16776 .closest( ".ui-menu-item" ) 16777 .children( ".ui-menu-item-wrapper" ); 16778 this._addClass( activeParent, null, "ui-state-active" ); 16779 16780 if ( event && event.type === "keydown" ) { 16781 this._close(); 16782 } else { 16783 this.timer = this._delay( function() { 16784 this._close(); 16785 }, this.delay ); 16786 } 16787 16788 nested = item.children( ".ui-menu" ); 16789 if ( nested.length && event && ( /^mouse/.test( event.type ) ) ) { 16790 this._startOpening( nested ); 16791 } 16792 this.activeMenu = item.parent(); 16793 16794 this._trigger( "focus", event, { item: item } ); 16795 }, 16796 16797 _scrollIntoView: function( item ) { 16798 var borderTop, paddingTop, offset, scroll, elementHeight, itemHeight; 16799 if ( this._hasScroll() ) { 16800 borderTop = parseFloat( $.css( this.activeMenu[ 0 ], "borderTopWidth" ) ) || 0; 16801 paddingTop = parseFloat( $.css( this.activeMenu[ 0 ], "paddingTop" ) ) || 0; 16802 offset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop; 16803 scroll = this.activeMenu.scrollTop(); 16804 elementHeight = this.activeMenu.height(); 16805 itemHeight = item.outerHeight(); 16806 16807 if ( offset < 0 ) { 16808 this.activeMenu.scrollTop( scroll + offset ); 16809 } else if ( offset + itemHeight > elementHeight ) { 16810 this.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight ); 16811 } 16812 } 16813 }, 16814 16815 blur: function( event, fromFocus ) { 16816 if ( !fromFocus ) { 16817 clearTimeout( this.timer ); 16818 } 16819 16820 if ( !this.active ) { 16821 return; 16822 } 16823 16824 this._removeClass( this.active.children( ".ui-menu-item-wrapper" ), 16825 null, "ui-state-active" ); 16826 16827 this._trigger( "blur", event, { item: this.active } ); 16828 this.active = null; 16829 }, 16830 16831 _startOpening: function( submenu ) { 16832 clearTimeout( this.timer ); 16833 16834 // Don't open if already open fixes a Firefox bug that caused a .5 pixel 16835 // shift in the submenu position when mousing over the caret icon 16836 if ( submenu.attr( "aria-hidden" ) !== "true" ) { 16837 return; 16838 } 16839 16840 this.timer = this._delay( function() { 16841 this._close(); 16842 this._open( submenu ); 16843 }, this.delay ); 16844 }, 16845 16846 _open: function( submenu ) { 16847 var position = $.extend( { 16848 of: this.active 16849 }, this.options.position ); 16850 16851 clearTimeout( this.timer ); 16852 this.element.find( ".ui-menu" ).not( submenu.parents( ".ui-menu" ) ) 16853 .hide() 16854 .attr( "aria-hidden", "true" ); 16855 16856 submenu 16857 .show() 16858 .removeAttr( "aria-hidden" ) 16859 .attr( "aria-expanded", "true" ) 16860 .position( position ); 16861 }, 16862 16863 collapseAll: function( event, all ) { 16864 clearTimeout( this.timer ); 16865 this.timer = this._delay( function() { 16866
vendor: 5,432 bytes, lines 16867-17070
16867 // If we were passed an event, look for the submenu that contains the event 16868 var currentMenu = all ? this.element : 16869 $( event && event.target ).closest( this.element.find( ".ui-menu" ) ); 16870 16871 // If we found no valid submenu ancestor, use the main menu to close all 16872 // sub menus anyway 16873 if ( !currentMenu.length ) { 16874 currentMenu = this.element; 16875 } 16876 16877 this._close( currentMenu ); 16878 16879 this.blur( event ); 16880 16881 // Work around active item staying active after menu is blurred 16882 this._removeClass( currentMenu.find( ".ui-state-active" ), null, "ui-state-active" ); 16883 16884 this.activeMenu = currentMenu; 16885 }, all ? 0 : this.delay ); 16886 }, 16887 16888 // With no arguments, closes the currently active menu - if nothing is active 16889 // it closes all menus. If passed an argument, it will search for menus BELOW 16890 _close: function( startMenu ) { 16891 if ( !startMenu ) { 16892 startMenu = this.active ? this.active.parent() : this.element; 16893 } 16894 16895 startMenu.find( ".ui-menu" ) 16896 .hide() 16897 .attr( "aria-hidden", "true" ) 16898 .attr( "aria-expanded", "false" ); 16899 }, 16900 16901 _closeOnDocumentClick: function( event ) { 16902 return !$( event.target ).closest( ".ui-menu" ).length; 16903 }, 16904 16905 _isDivider: function( item ) { 16906 16907 // Match hyphen, em dash, en dash 16908 return !/[^\-\u2014\u2013\s]/.test( item.text() ); 16909 }, 16910 16911 collapse: function( event ) { 16912 var newItem = this.active && 16913 this.active.parent().closest( ".ui-menu-item", this.element ); 16914 if ( newItem && newItem.length ) { 16915 this._close(); 16916 this.focus( event, newItem ); 16917 } 16918 }, 16919 16920 expand: function( event ) { 16921 var newItem = this.active && this._menuItems( this.active.children( ".ui-menu" ) ).first(); 16922 16923 if ( newItem && newItem.length ) { 16924 this._open( newItem.parent() ); 16925 16926 // Delay so Firefox will not hide activedescendant change in expanding submenu from AT 16927 this._delay( function() { 16928 this.focus( event, newItem ); 16929 } ); 16930 } 16931 }, 16932 16933 next: function( event ) { 16934 this._move( "next", "first", event ); 16935 }, 16936 16937 previous: function( event ) { 16938 this._move( "prev", "last", event ); 16939 }, 16940 16941 isFirstItem: function() { 16942 return this.active && !this.active.prevAll( ".ui-menu-item" ).length; 16943 }, 16944 16945 isLastItem: function() { 16946 return this.active && !this.active.nextAll( ".ui-menu-item" ).length; 16947 }, 16948 16949 _menuItems: function( menu ) { 16950 return ( menu || this.element ) 16951 .find( this.options.items ) 16952 .filter( ".ui-menu-item" ); 16953 }, 16954 16955 _move: function( direction, filter, event ) { 16956 var next; 16957 if ( this.active ) { 16958 if ( direction === "first" || direction === "last" ) { 16959 next = this.active 16960 [ direction === "first" ? "prevAll" : "nextAll" ]( ".ui-menu-item" ) 16961 .last(); 16962 } else { 16963 next = this.active 16964 [ direction + "All" ]( ".ui-menu-item" ) 16965 .first(); 16966 } 16967 } 16968 if ( !next || !next.length || !this.active ) { 16969 next = this._menuItems( this.activeMenu )[ filter ](); 16970 } 16971 16972 this.focus( event, next ); 16973 }, 16974 16975 nextPage: function( event ) { 16976 var item, base, height; 16977 16978 if ( !this.active ) { 16979 this.next( event ); 16980 return; 16981 } 16982 if ( this.isLastItem() ) { 16983 return; 16984 } 16985 if ( this._hasScroll() ) { 16986 base = this.active.offset().top; 16987 height = this.element.innerHeight(); 16988 16989 // jQuery 3.2 doesn't include scrollbars in innerHeight, add it back. 16990 if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) { 16991 height += this.element[ 0 ].offsetHeight - this.element.outerHeight(); 16992 } 16993 16994 this.active.nextAll( ".ui-menu-item" ).each( function() { 16995 item = $( this ); 16996 return item.offset().top - base - height < 0; 16997 } ); 16998 16999 this.focus( event, item ); 17000 } else { 17001 this.focus( event, this._menuItems( this.activeMenu ) 17002 [ !this.active ? "first" : "last" ]() ); 17003 } 17004 }, 17005 17006 previousPage: function( event ) { 17007 var item, base, height; 17008 if ( !this.active ) { 17009 this.next( event ); 17010 return; 17011 } 17012 if ( this.isFirstItem() ) { 17013 return; 17014 } 17015 if ( this._hasScroll() ) { 17016 base = this.active.offset().top; 17017 height = this.element.innerHeight(); 17018 17019 // jQuery 3.2 doesn't include scrollbars in innerHeight, add it back. 17020 if ( $.fn.jquery.indexOf( "3.2." ) === 0 ) { 17021 height += this.element[ 0 ].offsetHeight - this.element.outerHeight(); 17022 } 17023 17024 this.active.prevAll( ".ui-menu-item" ).each( function() { 17025 item = $( this ); 17026 return item.offset().top - base + height > 0; 17027 } ); 17028 17029 this.focus( event, item ); 17030 } else { 17031 this.focus( event, this._menuItems( this.activeMenu ).first() ); 17032 } 17033 }, 17034 17035 _hasScroll: function() { 17036 return this.element.outerHeight() < this.element.prop( "scrollHeight" ); 17037 }, 17038 17039 select: function( event ) { 17040 17041 // TODO: It should never be possible to not have an active item at this 17042 // point, but the tests don't trigger mouseenter before click. 17043 this.active = this.active || $( event.target ).closest( ".ui-menu-item" ); 17044 var ui = { item: this.active }; 17045 if ( !this.active.has( ".ui-menu" ).length ) { 17046 this.collapseAll( event, true ); 17047 } 17048 this._trigger( "select", event, ui ); 17049 }, 17050 17051 _filterMenuItems: function( character ) { 17052 var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ), 17053 regex = new RegExp( "^" + escapedCharacter, "i" ); 17054 17055 return this.activeMenu 17056 .find( this.options.items ) 17057 17058 // Only match on items, not dividers or other content (#10571) 17059 .filter( ".ui-menu-item" ) 17060 .filter( function() { 17061 return regex.test( 17062 String.prototype.trim.call( 17063 $( this ).children( ".ui-menu-item-wrapper" ).text() ) ); 17064 } ); 17065 } 17066} ); 17067 17068 17069/*! 17070 * jQuery UI Autocomplete 1.1
170703.2 17071 * http://jqueryui.com 17072 * 17073 * Copyright jQuery Foundation and other contributors 17074 * Released under the MIT license. 17075 * http://jquery.org/license 17076 */ 17077 17078//>>label: Autocomplete 17079//>>group: Widgets 17080//>>description: Lists suggested words as the user is typing. 17081//>>docs: http://api.jqueryui.com/autocomplete/ 17082//>>demos: http://jqueryui.com/autocomplete/ 17083//>>css.structure: ../../themes/base/core.css 17084//>>css.structure: ../../themes/base/autocomplete.css 17085//>>css.theme: ../../themes/base/theme.css 17086 17087 17088$.widget( "ui.autocomplete", { 17089 version: "1.13.2
vendor: 16,621 bytes, lines 17089-17726
17089", 17090 defaultElement: "<input>", 17091 options: { 17092 appendTo: null, 17093 autoFocus: false, 17094 delay: 300, 17095 minLength: 1, 17096 position: { 17097 my: "left top", 17098 at: "left bottom", 17099 collision: "none" 17100 }, 17101 source: null, 17102 17103 // Callbacks 17104 change: null, 17105 close: null, 17106 focus: null, 17107 open: null, 17108 response: null, 17109 search: null, 17110 select: null 17111 }, 17112 17113 requestIndex: 0, 17114 pending: 0, 17115 liveRegionTimer: null, 17116 17117 _create: function() { 17118 17119 // Some browsers only repeat keydown events, not keypress events, 17120 // so we use the suppressKeyPress flag to determine if we've already 17121 // handled the keydown event. #7269 17122 // Unfortunately the code for & in keypress is the same as the up arrow, 17123 // so we use the suppressKeyPressRepeat flag to avoid handling keypress 17124 // events when we know the keydown event was used to modify the 17125 // search term. #7799 17126 var suppressKeyPress, suppressKeyPressRepeat, suppressInput, 17127 nodeName = this.element[ 0 ].nodeName.toLowerCase(), 17128 isTextarea = nodeName === "textarea", 17129 isInput = nodeName === "input"; 17130 17131 // Textareas are always multi-line 17132 // Inputs are always single-line, even if inside a contentEditable element 17133 // IE also treats inputs as contentEditable 17134 // All other element types are determined by whether or not they're contentEditable 17135 this.isMultiLine = isTextarea || !isInput && this._isContentEditable( this.element ); 17136 17137 this.valueMethod = this.element[ isTextarea || isInput ? "val" : "text" ]; 17138 this.isNewMenu = true; 17139 17140 this._addClass( "ui-autocomplete-input" ); 17141 this.element.attr( "autocomplete", "off" ); 17142 17143 this._on( this.element, { 17144 keydown: function( event ) { 17145 if ( this.element.prop( "readOnly" ) ) { 17146 suppressKeyPress = true; 17147 suppressInput = true; 17148 suppressKeyPressRepeat = true; 17149 return; 17150 } 17151 17152 suppressKeyPress = false; 17153 suppressInput = false; 17154 suppressKeyPressRepeat = false; 17155 var keyCode = $.ui.keyCode; 17156 switch ( event.keyCode ) { 17157 case keyCode.PAGE_UP: 17158 suppressKeyPress = true; 17159 this._move( "previousPage", event ); 17160 break; 17161 case keyCode.PAGE_DOWN: 17162 suppressKeyPress = true; 17163 this._move( "nextPage", event ); 17164 break; 17165 case keyCode.UP: 17166 suppressKeyPress = true; 17167 this._keyEvent( "previous", event ); 17168 break; 17169 case keyCode.DOWN: 17170 suppressKeyPress = true; 17171 this._keyEvent( "next", event ); 17172 break; 17173 case keyCode.ENTER: 17174 17175 // when menu is open and has focus 17176 if ( this.menu.active ) { 17177 17178 // #6055 - Opera still allows the keypress to occur 17179 // which causes forms to submit 17180 suppressKeyPress = true; 17181 event.preventDefault(); 17182 this.menu.select( event ); 17183 } 17184 break; 17185 case keyCode.TAB: 17186 if ( this.menu.active ) { 17187 this.menu.select( event ); 17188 } 17189 break; 17190 case keyCode.ESCAPE: 17191 if ( this.menu.element.is( ":visible" ) ) { 17192 if ( !this.isMultiLine ) { 17193 this._value( this.term ); 17194 } 17195 this.close( event ); 17196 17197 // Different browsers have different default behavior for escape 17198 // Single press can mean undo or clear 17199 // Double press in IE means clear the whole form 17200 event.preventDefault(); 17201 } 17202 break; 17203 default: 17204 suppressKeyPressRepeat = true; 17205 17206 // search timeout should be triggered before the input value is changed 17207 this._searchTimeout( event ); 17208 break; 17209 } 17210 }, 17211 keypress: function( event ) { 17212 if ( suppressKeyPress ) { 17213 suppressKeyPress = false; 17214 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { 17215 event.preventDefault(); 17216 } 17217 return; 17218 } 17219 if ( suppressKeyPressRepeat ) { 17220 return; 17221 } 17222 17223 // Replicate some key handlers to allow them to repeat in Firefox and Opera 17224 var keyCode = $.ui.keyCode; 17225 switch ( event.keyCode ) { 17226 case keyCode.PAGE_UP: 17227 this._move( "previousPage", event ); 17228 break; 17229 case keyCode.PAGE_DOWN: 17230 this._move( "nextPage", event ); 17231 break; 17232 case keyCode.UP: 17233 this._keyEvent( "previous", event ); 17234 break; 17235 case keyCode.DOWN: 17236 this._keyEvent( "next", event ); 17237 break; 17238 } 17239 }, 17240 input: function( event ) { 17241 if ( suppressInput ) { 17242 suppressInput = false; 17243 event.preventDefault(); 17244 return; 17245 } 17246 this._searchTimeout( event ); 17247 }, 17248 focus: function() { 17249 this.selectedItem = null; 17250 this.previous = this._value(); 17251 }, 17252 blur: function( event ) { 17253 clearTimeout( this.searching ); 17254 this.close( event ); 17255 this._change( event ); 17256 } 17257 } ); 17258 17259 this._initSource(); 17260 this.menu = $( "<ul>" ) 17261 .appendTo( this._appendTo() ) 17262 .menu( { 17263 17264 // disable ARIA support, the live region takes care of that 17265 role: null 17266 } ) 17267 .hide() 17268 17269 // Support: IE 11 only, Edge <= 14 17270 // For other browsers, we preventDefault() on the mousedown event 17271 // to keep the dropdown from taking focus from the input. This doesn't 17272 // work for IE/Edge, causing problems with selection and scrolling (#9638) 17273 // Happily, IE and Edge support an "unselectable" attribute that 17274 // prevents an element from receiving focus, exactly what we want here. 17275 .attr( { 17276 "unselectable": "on" 17277 } ) 17278 .menu( "instance" ); 17279 17280 this._addClass( this.menu.element, "ui-autocomplete", "ui-front" ); 17281 this._on( this.menu.element, { 17282 mousedown: function( event ) { 17283 17284 // Prevent moving focus out of the text field 17285 event.preventDefault(); 17286 }, 17287 menufocus: function( event, ui ) { 17288 var label, item; 17289 17290 // support: Firefox 17291 // Prevent accidental activation of menu items in Firefox (#7024 #9118) 17292 if ( this.isNewMenu ) { 17293 this.isNewMenu = false; 17294 if ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) { 17295 this.menu.blur(); 17296 17297 this.document.one( "mousemove", function() { 17298 $( event.target ).trigger( event.originalEvent ); 17299 } ); 17300 17301 return; 17302 } 17303 } 17304 17305 item = ui.item.data( "ui-autocomplete-item" ); 17306 if ( false !== this._trigger( "focus", event, { item: item } ) ) { 17307 17308 // use value to match what will end up in the input, if it was a key event 17309 if ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) { 17310 this._value( item.value ); 17311 } 17312 } 17313 17314 // Announce the value in the liveRegion 17315 label = ui.item.attr( "aria-label" ) || item.value; 17316 if ( label && String.prototype.trim.call( label ).length ) { 17317 clearTimeout( this.liveRegionTimer ); 17318 this.liveRegionTimer = this._delay( function() { 17319 this.liveRegion.html( $( "<div>" ).text( label ) ); 17320 }, 100 ); 17321 } 17322 }, 17323 menuselect: function( event, ui ) { 17324 var item = ui.item.data( "ui-autocomplete-item" ), 17325 previous = this.previous; 17326 17327 // Only trigger when focus was lost (click on menu) 17328 if ( this.element[ 0 ] !== $.ui.safeActiveElement( this.document[ 0 ] ) ) { 17329 this.element.trigger( "focus" ); 17330 this.previous = previous; 17331 17332 // #6109 - IE triggers two focus events and the second 17333 // is asynchronous, so we need to reset the previous 17334 // term synchronously and asynchronously :-( 17335 this._delay( function() { 17336 this.previous = previous; 17337 this.selectedItem = item; 17338 } ); 17339 } 17340 17341 if ( false !== this._trigger( "select", event, { item: item } ) ) { 17342 this._value( item.value ); 17343 } 17344 17345 // reset the term after the select event 17346 // this allows custom select handling to work properly 17347 this.term = this._value(); 17348 17349 this.close( event ); 17350 this.selectedItem = item; 17351 } 17352 } ); 17353 17354 this.liveRegion = $( "<div>", { 17355 role: "status", 17356 "aria-live": "assertive", 17357 "aria-relevant": "additions" 17358 } ) 17359 .appendTo( this.document[ 0 ].body ); 17360 17361 this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" ); 17362 17363 // Turning off autocomplete prevents the browser from remembering the 17364 // value when navigating through history, so we re-enable autocomplete 17365 // if the page is unloaded before the widget is destroyed. #7790 17366 this._on( this.window, { 17367 beforeunload: function() { 17368 this.element.removeAttr( "autocomplete" ); 17369 } 17370 } ); 17371 }, 17372 17373 _destroy: function() { 17374 clearTimeout( this.searching ); 17375 this.element.removeAttr( "autocomplete" ); 17376 this.menu.element.remove(); 17377 this.liveRegion.remove(); 17378 }, 17379 17380 _setOption: function( key, value ) { 17381 this._super( key, value ); 17382 if ( key === "source" ) { 17383 this._initSource(); 17384 } 17385 if ( key === "appendTo" ) { 17386 this.menu.element.appendTo( this._appendTo() ); 17387 } 17388 if ( key === "disabled" && value && this.xhr ) { 17389 this.xhr.abort(); 17390 } 17391 }, 17392 17393 _isEventTargetInWidget: function( event ) { 17394 var menuElement = this.menu.element[ 0 ]; 17395 17396 return event.target === this.element[ 0 ] || 17397 event.target === menuElement || 17398 $.contains( menuElement, event.target ); 17399 }, 17400 17401 _closeOnClickOutside: function( event ) { 17402 if ( !this._isEventTargetInWidget( event ) ) { 17403 this.close(); 17404 } 17405 }, 17406 17407 _appendTo: function() { 17408 var element = this.options.appendTo; 17409 17410 if ( element ) { 17411 element = element.jquery || element.nodeType ? 17412 $( element ) : 17413 this.document.find( element ).eq( 0 ); 17414 } 17415 17416 if ( !element || !element[ 0 ] ) { 17417 element = this.element.closest( ".ui-front, dialog" ); 17418 } 17419 17420 if ( !element.length ) { 17421 element = this.document[ 0 ].body; 17422 } 17423 17424 return element; 17425 }, 17426 17427 _initSource: function() { 17428 var array, url, 17429 that = this; 17430 if ( Array.isArray( this.options.source ) ) { 17431 array = this.options.source; 17432 this.source = function( request, response ) { 17433 response( $.ui.autocomplete.filter( array, request.term ) ); 17434 }; 17435 } else if ( typeof this.options.source === "string" ) { 17436 url = this.options.source; 17437 this.source = function( request, response ) { 17438 if ( that.xhr ) { 17439 that.xhr.abort(); 17440 } 17441 that.xhr = $.ajax( { 17442 url: url, 17443 data: request, 17444 dataType: "json", 17445 success: function( data ) { 17446 response( data ); 17447 }, 17448 error: function() { 17449 response( [] ); 17450 } 17451 } ); 17452 }; 17453 } else { 17454 this.source = this.options.source; 17455 } 17456 }, 17457 17458 _searchTimeout: function( event ) { 17459 clearTimeout( this.searching ); 17460 this.searching = this._delay( function() { 17461 17462 // Search if the value has changed, or if the user retypes the same value (see #7434) 17463 var equalValues = this.term === this._value(), 17464 menuVisible = this.menu.element.is( ":visible" ), 17465 modifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey; 17466 17467 if ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) { 17468 this.selectedItem = null; 17469 this.search( null, event ); 17470 } 17471 }, this.options.delay ); 17472 }, 17473 17474 search: function( value, event ) { 17475 value = value != null ? value : this._value(); 17476 17477 // Always save the actual value, not the one passed as an argument 17478 this.term = this._value(); 17479 17480 if ( value.length < this.options.minLength ) { 17481 return this.close( event ); 17482 } 17483 17484 if ( this._trigger( "search", event ) === false ) { 17485 return; 17486 } 17487 17488 return this._search( value ); 17489 }, 17490 17491 _search: function( value ) { 17492 this.pending++; 17493 this._addClass( "ui-autocomplete-loading" ); 17494 this.cancelSearch = false; 17495 17496 this.source( { term: value }, this._response() ); 17497 }, 17498 17499 _response: function() { 17500 var index = ++this.requestIndex; 17501 17502 return function( content ) { 17503 if ( index === this.requestIndex ) { 17504 this.__response( content ); 17505 } 17506 17507 this.pending--; 17508 if ( !this.pending ) { 17509 this._removeClass( "ui-autocomplete-loading" ); 17510 } 17511 }.bind( this ); 17512 }, 17513 17514 __response: function( content ) { 17515 if ( content ) { 17516 content = this._normalize( content ); 17517 } 17518 this._trigger( "response", null, { content: content } ); 17519 if ( !this.options.disabled && content && content.length && !this.cancelSearch ) { 17520 this._suggest( content ); 17521 this._trigger( "open" ); 17522 } else { 17523 17524 // use ._close() instead of .close() so we don't cancel future searches 17525 this._close(); 17526 } 17527 }, 17528 17529 close: function( event ) { 17530 this.cancelSearch = true; 17531 this._close( event ); 17532 }, 17533 17534 _close: function( event ) { 17535 17536 // Remove the handler that closes the menu on outside clicks 17537 this._off( this.document, "mousedown" ); 17538 17539 if ( this.menu.element.is( ":visible" ) ) { 17540 this.menu.element.hide(); 17541 this.menu.blur(); 17542 this.isNewMenu = true; 17543 this._trigger( "close", event ); 17544 } 17545 }, 17546 17547 _change: function( event ) { 17548 if ( this.previous !== this._value() ) { 17549 this._trigger( "change", event, { item: this.selectedItem } ); 17550 } 17551 }, 17552 17553 _normalize: function( items ) { 17554 17555 // assume all items have the right format when the first item is complete 17556 if ( items.length && items[ 0 ].label && items[ 0 ].value ) { 17557 return items; 17558 } 17559 return $.map( items, function( item ) { 17560 if ( typeof item === "string" ) { 17561 return { 17562 label: item, 17563 value: item 17564 }; 17565 } 17566 return $.extend( {}, item, { 17567 label: item.label || item.value, 17568 value: item.value || item.label 17569 } ); 17570 } ); 17571 }, 17572 17573 _suggest: function( items ) { 17574 var ul = this.menu.element.empty(); 17575 this._renderMenu( ul, items ); 17576 this.isNewMenu = true; 17577 this.menu.refresh(); 17578 17579 // Size and position menu 17580 ul.show(); 17581 this._resizeMenu(); 17582 ul.position( $.extend( { 17583 of: this.element 17584 }, this.options.position ) ); 17585 17586 if ( this.options.autoFocus ) { 17587 this.menu.next(); 17588 } 17589 17590 // Listen for interactions outside of the widget (#6642) 17591 this._on( this.document, { 17592 mousedown: "_closeOnClickOutside" 17593 } ); 17594 }, 17595 17596 _resizeMenu: function() { 17597 var ul = this.menu.element; 17598 ul.outerWidth( Math.max( 17599 17600 // Firefox wraps long text (possibly a rounding bug) 17601 // so we add 1px to avoid the wrapping (#7513) 17602 ul.width( "" ).outerWidth() + 1, 17603 this.element.outerWidth() 17604 ) ); 17605 }, 17606 17607 _renderMenu: function( ul, items ) { 17608 var that = this; 17609 $.each( items, function( index, item ) { 17610 that._renderItemData( ul, item ); 17611 } ); 17612 }, 17613 17614 _renderItemData: function( ul, item ) { 17615 return this._renderItem( ul, item ).data( "ui-autocomplete-item", item ); 17616 }, 17617 17618 _renderItem: function( ul, item ) { 17619 return $( "<li>" ) 17620 .append( $( "<div>" ).text( item.label ) ) 17621 .appendTo( ul ); 17622 }, 17623 17624 _move: function( direction, event ) { 17625 if ( !this.menu.element.is( ":visible" ) ) { 17626 this.search( null, event ); 17627 return; 17628 } 17629 if ( this.menu.isFirstItem() && /^previous/.test( direction ) || 17630 this.menu.isLastItem() && /^next/.test( direction ) ) { 17631 17632 if ( !this.isMultiLine ) { 17633 this._value( this.term ); 17634 } 17635 17636 this.menu.blur(); 17637 return; 17638 } 17639 this.menu[ direction ]( event ); 17640 }, 17641 17642 widget: function() { 17643 return this.menu.element; 17644 }, 17645 17646 _value: function() { 17647 return this.valueMethod.apply( this.element, arguments ); 17648 }, 17649 17650 _keyEvent: function( keyEvent, event ) { 17651 if ( !this.isMultiLine || this.menu.element.is( ":visible" ) ) { 17652 this._move( keyEvent, event ); 17653 17654 // Prevents moving cursor to beginning/end of the text field in some browsers 17655 event.preventDefault(); 17656 } 17657 }, 17658 17659 // Support: Chrome <=50 17660 // We should be able to just use this.element.prop( "isContentEditable" ) 17661 // but hidden elements always report false in Chrome. 17662 // https://code.google.com/p/chromium/issues/detail?id=313082 17663 _isContentEditable: function( element ) { 17664 if ( !element.length ) { 17665 return false; 17666 } 17667 17668 var editable = element.prop( "contentEditable" ); 17669 17670 if ( editable === "inherit" ) { 17671 return this._isContentEditable( element.parent() ); 17672 } 17673 17674 return editable === "true"; 17675 } 17676} ); 17677 17678$.extend( $.ui.autocomplete, { 17679 escapeRegex: function( value ) { 17680 return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); 17681 }, 17682 filter: function( array, term ) { 17683 var matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), "i" ); 17684 return $.grep( array, function( value ) { 17685 return matcher.test( value.label || value.value || value ); 17686 } ); 17687 } 17688} ); 17689 17690// Live region extension, adding a `messages` option 17691// NOTE: This is an experimental API. We are still investigating 17692// a full solution for string manipulation and internationalization. 17693$.widget( "ui.autocomplete", $.ui.autocomplete, { 17694 options: { 17695 messages: { 17696 noResults: "No search results.", 17697 results: function( amount ) { 17698 return amount + ( amount > 1 ? " results are" : " result is" ) + 17699 " available, use up and down arrow keys to navigate."; 17700 } 17701 } 17702 }, 17703 17704 __response: function( content ) { 17705 var message; 17706 this._superApply( arguments ); 17707 if ( this.options.disabled || this.cancelSearch ) { 17708 return; 17709 } 17710 if ( content && content.length ) { 17711 message = this.options.messages.results( content.length ); 17712 } else { 17713 message = this.options.messages.noResults; 17714 } 17715 clearTimeout( this.liveRegionTimer ); 17716 this.liveRegionTimer = this._delay( function() { 17717 this.liveRegion.html( $( "<div>" ).text( message ) ); 17718 }, 100 ); 17719 } 17720} ); 17721 17722var widgetsAutocomplete = $.ui.autocomplete; 17723 17724 17725/*! 17726 * jQuery UI Controlgroup 1.13.
177262 17727 * http://jqueryui.com 17728 * 17729 * Copyright jQuery Foundation and other contributors 17730 * Released under the MIT license. 17731 * http://jquery.org/license 17732 */ 17733 17734//>>label: Controlgroup 17735//>>group: Widgets 17736//>>description: Visually groups form control widgets 17737//>>docs: http://api.jqueryui.com/controlgroup/ 17738//>>demos: http://jqueryui.com/controlgroup/ 17739//>>css.structure: ../../themes/base/core.css 17740//>>css.structure: ../../themes/base/controlgroup.css 17741//>>css.theme: ../../themes/base/theme.css 17742 17743 17744var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g; 17745 17746var widgetsControlgroup = $.widget( "ui.controlgroup", { 17747 version: "1.13
vendor: 7,736 bytes, lines 17747-18011
17747.2", 17748 defaultElement: "<div>", 17749 options: { 17750 direction: "horizontal", 17751 disabled: null, 17752 onlyVisible: true, 17753 items: { 17754 "button": "input[type=button], input[type=submit], input[type=reset], button, a", 17755 "controlgroupLabel": ".ui-controlgroup-label", 17756 "checkboxradio": "input[type='checkbox'], input[type='radio']", 17757 "selectmenu": "select", 17758 "spinner": ".ui-spinner-input" 17759 } 17760 }, 17761 17762 _create: function() { 17763 this._enhance(); 17764 }, 17765 17766 // To support the enhanced option in jQuery Mobile, we isolate DOM manipulation 17767 _enhance: function() { 17768 this.element.attr( "role", "toolbar" ); 17769 this.refresh(); 17770 }, 17771 17772 _destroy: function() { 17773 this._callChildMethod( "destroy" ); 17774 this.childWidgets.removeData( "ui-controlgroup-data" ); 17775 this.element.removeAttr( "role" ); 17776 if ( this.options.items.controlgroupLabel ) { 17777 this.element 17778 .find( this.options.items.controlgroupLabel ) 17779 .find( ".ui-controlgroup-label-contents" ) 17780 .contents().unwrap(); 17781 } 17782 }, 17783 17784 _initWidgets: function() { 17785 var that = this, 17786 childWidgets = []; 17787 17788 // First we iterate over each of the items options 17789 $.each( this.options.items, function( widget, selector ) { 17790 var labels; 17791 var options = {}; 17792 17793 // Make sure the widget has a selector set 17794 if ( !selector ) { 17795 return; 17796 } 17797 17798 if ( widget === "controlgroupLabel" ) { 17799 labels = that.element.find( selector ); 17800 labels.each( function() { 17801 var element = $( this ); 17802 17803 if ( element.children( ".ui-controlgroup-label-contents" ).length ) { 17804 return; 17805 } 17806 element.contents() 17807 .wrapAll( "<span class='ui-controlgroup-label-contents'></span>" ); 17808 } ); 17809 that._addClass( labels, null, "ui-widget ui-widget-content ui-state-default" ); 17810 childWidgets = childWidgets.concat( labels.get() ); 17811 return; 17812 } 17813 17814 // Make sure the widget actually exists 17815 if ( !$.fn[ widget ] ) { 17816 return; 17817 } 17818 17819 // We assume everything is in the middle to start because we can't determine 17820 // first / last elements until all enhancments are done. 17821 if ( that[ "_" + widget + "Options" ] ) { 17822 options = that[ "_" + widget + "Options" ]( "middle" ); 17823 } else { 17824 options = { classes: {} }; 17825 } 17826 17827 // Find instances of this widget inside controlgroup and init them 17828 that.element 17829 .find( selector ) 17830 .each( function() { 17831 var element = $( this ); 17832 var instance = element[ widget ]( "instance" ); 17833 17834 // We need to clone the default options for this type of widget to avoid 17835 // polluting the variable options which has a wider scope than a single widget. 17836 var instanceOptions = $.widget.extend( {}, options ); 17837 17838 // If the button is the child of a spinner ignore it 17839 // TODO: Find a more generic solution 17840 if ( widget === "button" && element.parent( ".ui-spinner" ).length ) { 17841 return; 17842 } 17843 17844 // Create the widget if it doesn't exist 17845 if ( !instance ) { 17846 instance = element[ widget ]()[ widget ]( "instance" ); 17847 } 17848 if ( instance ) { 17849 instanceOptions.classes = 17850 that._resolveClassesValues( instanceOptions.classes, instance ); 17851 } 17852 element[ widget ]( instanceOptions ); 17853 17854 // Store an instance of the controlgroup to be able to reference 17855 // from the outermost element for changing options and refresh 17856 var widgetElement = element[ widget ]( "widget" ); 17857 $.data( widgetElement[ 0 ], "ui-controlgroup-data", 17858 instance ? instance : element[ widget ]( "instance" ) ); 17859 17860 childWidgets.push( widgetElement[ 0 ] ); 17861 } ); 17862 } ); 17863 17864 this.childWidgets = $( $.uniqueSort( childWidgets ) ); 17865 this._addClass( this.childWidgets, "ui-controlgroup-item" ); 17866 }, 17867 17868 _callChildMethod: function( method ) { 17869 this.childWidgets.each( function() { 17870 var element = $( this ), 17871 data = element.data( "ui-controlgroup-data" ); 17872 if ( data && data[ method ] ) { 17873 data[ method ](); 17874 } 17875 } ); 17876 }, 17877 17878 _updateCornerClass: function( element, position ) { 17879 var remove = "ui-corner-top ui-corner-bottom ui-corner-left ui-corner-right ui-corner-all"; 17880 var add = this._buildSimpleOptions( position, "label" ).classes.label; 17881 17882 this._removeClass( element, null, remove ); 17883 this._addClass( element, null, add ); 17884 }, 17885 17886 _buildSimpleOptions: function( position, key ) { 17887 var direction = this.options.direction === "vertical"; 17888 var result = { 17889 classes: {} 17890 }; 17891 result.classes[ key ] = { 17892 "middle": "", 17893 "first": "ui-corner-" + ( direction ? "top" : "left" ), 17894 "last": "ui-corner-" + ( direction ? "bottom" : "right" ), 17895 "only": "ui-corner-all" 17896 }[ position ]; 17897 17898 return result; 17899 }, 17900 17901 _spinnerOptions: function( position ) { 17902 var options = this._buildSimpleOptions( position, "ui-spinner" ); 17903 17904 options.classes[ "ui-spinner-up" ] = ""; 17905 options.classes[ "ui-spinner-down" ] = ""; 17906 17907 return options; 17908 }, 17909 17910 _buttonOptions: function( position ) { 17911 return this._buildSimpleOptions( position, "ui-button" ); 17912 }, 17913 17914 _checkboxradioOptions: function( position ) { 17915 return this._buildSimpleOptions( position, "ui-checkboxradio-label" ); 17916 }, 17917 17918 _selectmenuOptions: function( position ) { 17919 var direction = this.options.direction === "vertical"; 17920 return { 17921 width: direction ? "auto" : false, 17922 classes: { 17923 middle: { 17924 "ui-selectmenu-button-open": "", 17925 "ui-selectmenu-button-closed": "" 17926 }, 17927 first: { 17928 "ui-selectmenu-button-open": "ui-corner-" + ( direction ? "top" : "tl" ), 17929 "ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "top" : "left" ) 17930 }, 17931 last: { 17932 "ui-selectmenu-button-open": direction ? "" : "ui-corner-tr", 17933 "ui-selectmenu-button-closed": "ui-corner-" + ( direction ? "bottom" : "right" ) 17934 }, 17935 only: { 17936 "ui-selectmenu-button-open": "ui-corner-top", 17937 "ui-selectmenu-button-closed": "ui-corner-all" 17938 } 17939 17940 }[ position ] 17941 }; 17942 }, 17943 17944 _resolveClassesValues: function( classes, instance ) { 17945 var result = {}; 17946 $.each( classes, function( key ) { 17947 var current = instance.options.classes[ key ] || ""; 17948 current = String.prototype.trim.call( current.replace( controlgroupCornerRegex, "" ) ); 17949 result[ key ] = ( current + " " + classes[ key ] ).replace( /\s+/g, " " ); 17950 } ); 17951 return result; 17952 }, 17953 17954 _setOption: function( key, value ) { 17955 if ( key === "direction" ) { 17956 this._removeClass( "ui-controlgroup-" + this.options.direction ); 17957 } 17958 17959 this._super( key, value ); 17960 if ( key === "disabled" ) { 17961 this._callChildMethod( value ? "disable" : "enable" ); 17962 return; 17963 } 17964 17965 this.refresh(); 17966 }, 17967 17968 refresh: function() { 17969 var children, 17970 that = this; 17971 17972 this._addClass( "ui-controlgroup ui-controlgroup-" + this.options.direction ); 17973 17974 if ( this.options.direction === "horizontal" ) { 17975 this._addClass( null, "ui-helper-clearfix" ); 17976 } 17977 this._initWidgets(); 17978 17979 children = this.childWidgets; 17980 17981 // We filter here because we need to track all childWidgets not just the visible ones 17982 if ( this.options.onlyVisible ) { 17983 children = children.filter( ":visible" ); 17984 } 17985 17986 if ( children.length ) { 17987 17988 // We do this last because we need to make sure all enhancment is done 17989 // before determining first and last 17990 $.each( [ "first", "last" ], function( index, value ) { 17991 var instance = children[ value ]().data( "ui-controlgroup-data" ); 17992 17993 if ( instance && that[ "_" + instance.widgetName + "Options" ] ) { 17994 var options = that[ "_" + instance.widgetName + "Options" ]( 17995 children.length === 1 ? "only" : value 17996 ); 17997 options.classes = that._resolveClassesValues( options.classes, instance ); 17998 instance.element[ instance.widgetName ]( options ); 17999 } else { 18000 that._updateCornerClass( children[ value ](), value ); 18001 } 18002 } ); 18003 18004 // Finally call the refresh method on each of the child widgets. 18005 this._callChildMethod( "refresh" ); 18006 } 18007 } 18008} ); 18009 18010/*! 18011 * jQuery UI Checkboxradio 1.1
vendor: 5,069 bytes, lines 18011-18194
180113.2 18012 * http://jqueryui.com 18013 * 18014 * Copyright jQuery Foundation and other contributors 18015 * Released under the MIT license. 18016 * http://jquery.org/license 18017 */ 18018 18019//>>label: Checkboxradio 18020//>>group: Widgets 18021//>>description: Enhances a form with multiple themeable checkboxes or radio buttons. 18022//>>docs: http://api.jqueryui.com/checkboxradio/ 18023//>>demos: http://jqueryui.com/checkboxradio/ 18024//>>css.structure: ../../themes/base/core.css 18025//>>css.structure: ../../themes/base/button.css 18026//>>css.structure: ../../themes/base/checkboxradio.css 18027//>>css.theme: ../../themes/base/theme.css 18028 18029 18030$.widget( "ui.checkboxradio", [ $.ui.formResetMixin, { 18031 version: "1.13.2", 18032 options: { 18033 disabled: null, 18034 label: null, 18035 icon: true, 18036 classes: { 18037 "ui-checkboxradio-label": "ui-corner-all", 18038 "ui-checkboxradio-icon": "ui-corner-all" 18039 } 18040 }, 18041 18042 _getCreateOptions: function() { 18043 var disabled, labels, labelContents; 18044 var options = this._super() || {}; 18045 18046 // We read the type here, because it makes more sense to throw a element type error first, 18047 // rather then the error for lack of a label. Often if its the wrong type, it 18048 // won't have a label (e.g. calling on a div, btn, etc) 18049 this._readType(); 18050 18051 labels = this.element.labels(); 18052 18053 // If there are multiple labels, use the last one 18054 this.label = $( labels[ labels.length - 1 ] ); 18055 if ( !this.label.length ) { 18056 $.error( "No label found for checkboxradio widget" ); 18057 } 18058 18059 this.originalLabel = ""; 18060 18061 // We need to get the label text but this may also need to make sure it does not contain the 18062 // input itself. 18063 // The label contents could be text, html, or a mix. We wrap all elements 18064 // and read the wrapper's `innerHTML` to get a string representation of 18065 // the label, without the input as part of it. 18066 labelContents = this.label.contents().not( this.element[ 0 ] ); 18067 18068 if ( labelContents.length ) { 18069 this.originalLabel += labelContents 18070 .clone() 18071 .wrapAll( "<div></div>" ) 18072 .parent() 18073 .html(); 18074 } 18075 18076 // Set the label option if we found label text 18077 if ( this.originalLabel ) { 18078 options.label = this.originalLabel; 18079 } 18080 18081 disabled = this.element[ 0 ].disabled; 18082 if ( disabled != null ) { 18083 options.disabled = disabled; 18084 } 18085 return options; 18086 }, 18087 18088 _create: function() { 18089 var checked = this.element[ 0 ].checked; 18090 18091 this._bindFormResetHandler(); 18092 18093 if ( this.options.disabled == null ) { 18094 this.options.disabled = this.element[ 0 ].disabled; 18095 } 18096 18097 this._setOption( "disabled", this.options.disabled ); 18098 this._addClass( "ui-checkboxradio", "ui-helper-hidden-accessible" ); 18099 this._addClass( this.label, "ui-checkboxradio-label", "ui-button ui-widget" ); 18100 18101 if ( this.type === "radio" ) { 18102 this._addClass( this.label, "ui-checkboxradio-radio-label" ); 18103 } 18104 18105 if ( this.options.label && this.options.label !== this.originalLabel ) { 18106 this._updateLabel(); 18107 } else if ( this.originalLabel ) { 18108 this.options.label = this.originalLabel; 18109 } 18110 18111 this._enhance(); 18112 18113 if ( checked ) { 18114 this._addClass( this.label, "ui-checkboxradio-checked", "ui-state-active" ); 18115 } 18116 18117 this._on( { 18118 change: "_toggleClasses", 18119 focus: function() { 18120 this._addClass( this.label, null, "ui-state-focus ui-visual-focus" ); 18121 }, 18122 blur: function() { 18123 this._removeClass( this.label, null, "ui-state-focus ui-visual-focus" ); 18124 } 18125 } ); 18126 }, 18127 18128 _readType: function() { 18129 var nodeName = this.element[ 0 ].nodeName.toLowerCase(); 18130 this.type = this.element[ 0 ].type; 18131 if ( nodeName !== "input" || !/radio|checkbox/.test( this.type ) ) { 18132 $.error( "Can't create checkboxradio on element.nodeName=" + nodeName + 18133 " and element.type=" + this.type ); 18134 } 18135 }, 18136 18137 // Support jQuery Mobile enhanced option 18138 _enhance: function() { 18139 this._updateIcon( this.element[ 0 ].checked ); 18140 }, 18141 18142 widget: function() { 18143 return this.label; 18144 }, 18145 18146 _getRadioGroup: function() { 18147 var group; 18148 var name = this.element[ 0 ].name; 18149 var nameSelector = "input[name='" + $.escapeSelector( name ) + "']"; 18150 18151 if ( !name ) { 18152 return $( [] ); 18153 } 18154 18155 if ( this.form.length ) { 18156 group = $( this.form[ 0 ].elements ).filter( nameSelector ); 18157 } else { 18158 18159 // Not inside a form, check all inputs that also are not inside a form 18160 group = $( nameSelector ).filter( function() { 18161 return $( this )._form().length === 0; 18162 } ); 18163 } 18164 18165 return group.not( this.element ); 18166 }, 18167 18168 _toggleClasses: function() { 18169 var checked = this.element[ 0 ].checked; 18170 this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked ); 18171 18172 if ( this.options.icon && this.type === "checkbox" ) { 18173 this._toggleClass( this.icon, null, "ui-icon-check ui-state-checked", checked ) 18174 ._toggleClass( this.icon, null, "ui-icon-blank", !checked ); 18175 } 18176 18177 if ( this.type === "radio" ) { 18178 this._getRadioGroup() 18179 .each( function() { 18180 var instance = $( this ).checkboxradio( "instance" ); 18181 18182 if ( instance ) { 18183 instance._removeClass( instance.label, 18184 "ui-checkboxradio-checked", "ui-state-active" ); 18185 } 18186 } ); 18187 } 18188 }, 18189 18190 _destroy: function() { 18191 this._unbindFormResetHandler(); 18192 18193 if ( this.icon ) { 18194 this.icon.remove();
vendor: 2,708 bytes, lines 18195-18301
18195 this.iconSpace.remove(); 18196 } 18197 }, 18198 18199 _setOption: function( key, value ) { 18200 18201 // We don't allow the value to be set to nothing 18202 if ( key === "label" && !value ) { 18203 return; 18204 } 18205 18206 this._super( key, value ); 18207 18208 if ( key === "disabled" ) { 18209 this._toggleClass( this.label, null, "ui-state-disabled", value ); 18210 this.element[ 0 ].disabled = value; 18211 18212 // Don't refresh when setting disabled 18213 return; 18214 } 18215 this.refresh(); 18216 }, 18217 18218 _updateIcon: function( checked ) { 18219 var toAdd = "ui-icon ui-icon-background "; 18220 18221 if ( this.options.icon ) { 18222 if ( !this.icon ) { 18223 this.icon = $( "<span>" ); 18224 this.iconSpace = $( "<span> </span>" ); 18225 this._addClass( this.iconSpace, "ui-checkboxradio-icon-space" ); 18226 } 18227 18228 if ( this.type === "checkbox" ) { 18229 toAdd += checked ? "ui-icon-check ui-state-checked" : "ui-icon-blank"; 18230 this._removeClass( this.icon, null, checked ? "ui-icon-blank" : "ui-icon-check" ); 18231 } else { 18232 toAdd += "ui-icon-blank"; 18233 } 18234 this._addClass( this.icon, "ui-checkboxradio-icon", toAdd ); 18235 if ( !checked ) { 18236 this._removeClass( this.icon, null, "ui-icon-check ui-state-checked" ); 18237 } 18238 this.icon.prependTo( this.label ).after( this.iconSpace ); 18239 } else if ( this.icon !== undefined ) { 18240 this.icon.remove(); 18241 this.iconSpace.remove(); 18242 delete this.icon; 18243 } 18244 }, 18245 18246 _updateLabel: function() { 18247 18248 // Remove the contents of the label ( minus the icon, icon space, and input ) 18249 var contents = this.label.contents().not( this.element[ 0 ] ); 18250 if ( this.icon ) { 18251 contents = contents.not( this.icon[ 0 ] ); 18252 } 18253 if ( this.iconSpace ) { 18254 contents = contents.not( this.iconSpace[ 0 ] ); 18255 } 18256 contents.remove(); 18257 18258 this.label.append( this.options.label ); 18259 }, 18260 18261 refresh: function() { 18262 var checked = this.element[ 0 ].checked, 18263 isDisabled = this.element[ 0 ].disabled; 18264 18265 this._updateIcon( checked ); 18266 this._toggleClass( this.label, "ui-checkboxradio-checked", "ui-state-active", checked ); 18267 if ( this.options.label !== null ) { 18268 this._updateLabel(); 18269 } 18270 18271 if ( isDisabled !== this.options.disabled ) { 18272 this._setOptions( { "disabled": isDisabled } ); 18273 } 18274 } 18275 18276} ] ); 18277 18278var widgetsCheckboxradio = $.ui.checkboxradio; 18279 18280 18281/*! 18282 * jQuery UI Button 1.13.2 18283 * http://jqueryui.com 18284 * 18285 * Copyright jQuery Foundation and other contributors 18286 * Released under the MIT license. 18287 * http://jquery.org/license 18288 */ 18289 18290//>>label: Button 18291//>>group: Widgets 18292//>>description: Enhances a form with themeable buttons. 18293//>>docs: http://api.jqueryui.com/button/ 18294//>>demos: http://jqueryui.com/button/ 18295//>>css.structure: ../../themes/base/core.css 18296//>>css.structure: ../../themes/base/button.css 18297//>>css.theme: ../../themes/base/theme.css 18298 18299 18300$.widget( "ui.button", { 18301 version: "1.13.2
vendor: 10,836 bytes, lines 18301-18708
18301", 18302 defaultElement: "<button>", 18303 options: { 18304 classes: { 18305 "ui-button": "ui-corner-all" 18306 }, 18307 disabled: null, 18308 icon: null, 18309 iconPosition: "beginning", 18310 label: null, 18311 showLabel: true 18312 }, 18313 18314 _getCreateOptions: function() { 18315 var disabled, 18316 18317 // This is to support cases like in jQuery Mobile where the base widget does have 18318 // an implementation of _getCreateOptions 18319 options = this._super() || {}; 18320 18321 this.isInput = this.element.is( "input" ); 18322 18323 disabled = this.element[ 0 ].disabled; 18324 if ( disabled != null ) { 18325 options.disabled = disabled; 18326 } 18327 18328 this.originalLabel = this.isInput ? this.element.val() : this.element.html(); 18329 if ( this.originalLabel ) { 18330 options.label = this.originalLabel; 18331 } 18332 18333 return options; 18334 }, 18335 18336 _create: function() { 18337 if ( !this.option.showLabel & !this.options.icon ) { 18338 this.options.showLabel = true; 18339 } 18340 18341 // We have to check the option again here even though we did in _getCreateOptions, 18342 // because null may have been passed on init which would override what was set in 18343 // _getCreateOptions 18344 if ( this.options.disabled == null ) { 18345 this.options.disabled = this.element[ 0 ].disabled || false; 18346 } 18347 18348 this.hasTitle = !!this.element.attr( "title" ); 18349 18350 // Check to see if the label needs to be set or if its already correct 18351 if ( this.options.label && this.options.label !== this.originalLabel ) { 18352 if ( this.isInput ) { 18353 this.element.val( this.options.label ); 18354 } else { 18355 this.element.html( this.options.label ); 18356 } 18357 } 18358 this._addClass( "ui-button", "ui-widget" ); 18359 this._setOption( "disabled", this.options.disabled ); 18360 this._enhance(); 18361 18362 if ( this.element.is( "a" ) ) { 18363 this._on( { 18364 "keyup": function( event ) { 18365 if ( event.keyCode === $.ui.keyCode.SPACE ) { 18366 event.preventDefault(); 18367 18368 // Support: PhantomJS <= 1.9, IE 8 Only 18369 // If a native click is available use it so we actually cause navigation 18370 // otherwise just trigger a click event 18371 if ( this.element[ 0 ].click ) { 18372 this.element[ 0 ].click(); 18373 } else { 18374 this.element.trigger( "click" ); 18375 } 18376 } 18377 } 18378 } ); 18379 } 18380 }, 18381 18382 _enhance: function() { 18383 if ( !this.element.is( "button" ) ) { 18384 this.element.attr( "role", "button" ); 18385 } 18386 18387 if ( this.options.icon ) { 18388 this._updateIcon( "icon", this.options.icon ); 18389 this._updateTooltip(); 18390 } 18391 }, 18392 18393 _updateTooltip: function() { 18394 this.title = this.element.attr( "title" ); 18395 18396 if ( !this.options.showLabel && !this.title ) { 18397 this.element.attr( "title", this.options.label ); 18398 } 18399 }, 18400 18401 _updateIcon: function( option, value ) { 18402 var icon = option !== "iconPosition", 18403 position = icon ? this.options.iconPosition : value, 18404 displayBlock = position === "top" || position === "bottom"; 18405 18406 // Create icon 18407 if ( !this.icon ) { 18408 this.icon = $( "<span>" ); 18409 18410 this._addClass( this.icon, "ui-button-icon", "ui-icon" ); 18411 18412 if ( !this.options.showLabel ) { 18413 this._addClass( "ui-button-icon-only" ); 18414 } 18415 } else if ( icon ) { 18416 18417 // If we are updating the icon remove the old icon class 18418 this._removeClass( this.icon, null, this.options.icon ); 18419 } 18420 18421 // If we are updating the icon add the new icon class 18422 if ( icon ) { 18423 this._addClass( this.icon, null, value ); 18424 } 18425 18426 this._attachIcon( position ); 18427 18428 // If the icon is on top or bottom we need to add the ui-widget-icon-block class and remove 18429 // the iconSpace if there is one. 18430 if ( displayBlock ) { 18431 this._addClass( this.icon, null, "ui-widget-icon-block" ); 18432 if ( this.iconSpace ) { 18433 this.iconSpace.remove(); 18434 } 18435 } else { 18436 18437 // Position is beginning or end so remove the ui-widget-icon-block class and add the 18438 // space if it does not exist 18439 if ( !this.iconSpace ) { 18440 this.iconSpace = $( "<span> </span>" ); 18441 this._addClass( this.iconSpace, "ui-button-icon-space" ); 18442 } 18443 this._removeClass( this.icon, null, "ui-wiget-icon-block" ); 18444 this._attachIconSpace( position ); 18445 } 18446 }, 18447 18448 _destroy: function() { 18449 this.element.removeAttr( "role" ); 18450 18451 if ( this.icon ) { 18452 this.icon.remove(); 18453 } 18454 if ( this.iconSpace ) { 18455 this.iconSpace.remove(); 18456 } 18457 if ( !this.hasTitle ) { 18458 this.element.removeAttr( "title" ); 18459 } 18460 }, 18461 18462 _attachIconSpace: function( iconPosition ) { 18463 this.icon[ /^(?:end|bottom)/.test( iconPosition ) ? "before" : "after" ]( this.iconSpace ); 18464 }, 18465 18466 _attachIcon: function( iconPosition ) { 18467 this.element[ /^(?:end|bottom)/.test( iconPosition ) ? "append" : "prepend" ]( this.icon ); 18468 }, 18469 18470 _setOptions: function( options ) { 18471 var newShowLabel = options.showLabel === undefined ? 18472 this.options.showLabel : 18473 options.showLabel, 18474 newIcon = options.icon === undefined ? this.options.icon : options.icon; 18475 18476 if ( !newShowLabel && !newIcon ) { 18477 options.showLabel = true; 18478 } 18479 this._super( options ); 18480 }, 18481 18482 _setOption: function( key, value ) { 18483 if ( key === "icon" ) { 18484 if ( value ) { 18485 this._updateIcon( key, value ); 18486 } else if ( this.icon ) { 18487 this.icon.remove(); 18488 if ( this.iconSpace ) { 18489 this.iconSpace.remove(); 18490 } 18491 } 18492 } 18493 18494 if ( key === "iconPosition" ) { 18495 this._updateIcon( key, value ); 18496 } 18497 18498 // Make sure we can't end up with a button that has neither text nor icon 18499 if ( key === "showLabel" ) { 18500 this._toggleClass( "ui-button-icon-only", null, !value ); 18501 this._updateTooltip(); 18502 } 18503 18504 if ( key === "label" ) { 18505 if ( this.isInput ) { 18506 this.element.val( value ); 18507 } else { 18508 18509 // If there is an icon, append it, else nothing then append the value 18510 // this avoids removal of the icon when setting label text 18511 this.element.html( value ); 18512 if ( this.icon ) { 18513 this._attachIcon( this.options.iconPosition ); 18514 this._attachIconSpace( this.options.iconPosition ); 18515 } 18516 } 18517 } 18518 18519 this._super( key, value ); 18520 18521 if ( key === "disabled" ) { 18522 this._toggleClass( null, "ui-state-disabled", value ); 18523 this.element[ 0 ].disabled = value; 18524 if ( value ) { 18525 this.element.trigger( "blur" ); 18526 } 18527 } 18528 }, 18529 18530 refresh: function() { 18531 18532 // Make sure to only check disabled if its an element that supports this otherwise 18533 // check for the disabled class to determine state 18534 var isDisabled = this.element.is( "input, button" ) ? 18535 this.element[ 0 ].disabled : this.element.hasClass( "ui-button-disabled" ); 18536 18537 if ( isDisabled !== this.options.disabled ) { 18538 this._setOptions( { disabled: isDisabled } ); 18539 } 18540 18541 this._updateTooltip(); 18542 } 18543} ); 18544 18545// DEPRECATED 18546if ( $.uiBackCompat !== false ) { 18547 18548 // Text and Icons options 18549 $.widget( "ui.button", $.ui.button, { 18550 options: { 18551 text: true, 18552 icons: { 18553 primary: null, 18554 secondary: null 18555 } 18556 }, 18557 18558 _create: function() { 18559 if ( this.options.showLabel && !this.options.text ) { 18560 this.options.showLabel = this.options.text; 18561 } 18562 if ( !this.options.showLabel && this.options.text ) { 18563 this.options.text = this.options.showLabel; 18564 } 18565 if ( !this.options.icon && ( this.options.icons.primary || 18566 this.options.icons.secondary ) ) { 18567 if ( this.options.icons.primary ) { 18568 this.options.icon = this.options.icons.primary; 18569 } else { 18570 this.options.icon = this.options.icons.secondary; 18571 this.options.iconPosition = "end"; 18572 } 18573 } else if ( this.options.icon ) { 18574 this.options.icons.primary = this.options.icon; 18575 } 18576 this._super(); 18577 }, 18578 18579 _setOption: function( key, value ) { 18580 if ( key === "text" ) { 18581 this._super( "showLabel", value ); 18582 return; 18583 } 18584 if ( key === "showLabel" ) { 18585 this.options.text = value; 18586 } 18587 if ( key === "icon" ) { 18588 this.options.icons.primary = value; 18589 } 18590 if ( key === "icons" ) { 18591 if ( value.primary ) { 18592 this._super( "icon", value.primary ); 18593 this._super( "iconPosition", "beginning" ); 18594 } else if ( value.secondary ) { 18595 this._super( "icon", value.secondary ); 18596 this._super( "iconPosition", "end" ); 18597 } 18598 } 18599 this._superApply( arguments ); 18600 } 18601 } ); 18602 18603 $.fn.button = ( function( orig ) { 18604 return function( options ) { 18605 var isMethodCall = typeof options === "string"; 18606 var args = Array.prototype.slice.call( arguments, 1 ); 18607 var returnValue = this; 18608 18609 if ( isMethodCall ) { 18610 18611 // If this is an empty collection, we need to have the instance method 18612 // return undefined instead of the jQuery instance 18613 if ( !this.length && options === "instance" ) { 18614 returnValue = undefined; 18615 } else { 18616 this.each( function() { 18617 var methodValue; 18618 var type = $( this ).attr( "type" ); 18619 var name = type !== "checkbox" && type !== "radio" ? 18620 "button" : 18621 "checkboxradio"; 18622 var instance = $.data( this, "ui-" + name ); 18623 18624 if ( options === "instance" ) { 18625 returnValue = instance; 18626 return false; 18627 } 18628 18629 if ( !instance ) { 18630 return $.error( "cannot call methods on button" + 18631 " prior to initialization; " + 18632 "attempted to call method '" + options + "'" ); 18633 } 18634 18635 if ( typeof instance[ options ] !== "function" || 18636 options.charAt( 0 ) === "_" ) { 18637 return $.error( "no such method '" + options + "' for button" + 18638 " widget instance" ); 18639 } 18640 18641 methodValue = instance[ options ].apply( instance, args ); 18642 18643 if ( methodValue !== instance && methodValue !== undefined ) { 18644 returnValue = methodValue && methodValue.jquery ? 18645 returnValue.pushStack( methodValue.get() ) : 18646 methodValue; 18647 return false; 18648 } 18649 } ); 18650 } 18651 } else { 18652 18653 // Allow multiple hashes to be passed on init 18654 if ( args.length ) { 18655 options = $.widget.extend.apply( null, [ options ].concat( args ) ); 18656 } 18657 18658 this.each( function() { 18659 var type = $( this ).attr( "type" ); 18660 var name = type !== "checkbox" && type !== "radio" ? "button" : "checkboxradio"; 18661 var instance = $.data( this, "ui-" + name ); 18662 18663 if ( instance ) { 18664 instance.option( options || {} ); 18665 if ( instance._init ) { 18666 instance._init(); 18667 } 18668 } else { 18669 if ( name === "button" ) { 18670 orig.call( $( this ), options ); 18671 return; 18672 } 18673 18674 $( this ).checkboxradio( $.extend( { icon: false }, options ) ); 18675 } 18676 } ); 18677 } 18678 18679 return returnValue; 18680 }; 18681 } )( $.fn.button ); 18682 18683 $.fn.buttonset = function() { 18684 if ( !$.ui.controlgroup ) { 18685 $.error( "Controlgroup widget missing" ); 18686 } 18687 if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" && arguments[ 2 ] ) { 18688 return this.controlgroup.apply( this, 18689 [ arguments[ 0 ], "items.button", arguments[ 2 ] ] ); 18690 } 18691 if ( arguments[ 0 ] === "option" && arguments[ 1 ] === "items" ) { 18692 return this.controlgroup.apply( this, [ arguments[ 0 ], "items.button" ] ); 18693 } 18694 if ( typeof arguments[ 0 ] === "object" && arguments[ 0 ].items ) { 18695 arguments[ 0 ].items = { 18696 button: arguments[ 0 ].items 18697 }; 18698 } 18699 return this.controlgroup.apply( this, arguments ); 18700 }; 18701} 18702 18703var widgetsButton = $.ui.button; 18704 18705 18706/* eslint-disable max-len, camelcase */ 18707/*! 18708 * jQuery UI Datepicker 1.13.
187082 18709 * http://jqueryui.com 18710 * 18711 * Copyright jQuery Foundation and other contributors 18712 * Released under the MIT license. 18713 * http://jquery.org/license 18714 */ 18715 18716//>>label: Datepicker 18717//>>group: Widgets 18718//>>description: Displays a calendar from an input or inline for selecting dates. 18719//>>docs: http://api.jqueryui.com/datepicker/ 18720//>>demos: http://jqueryui.com/datepicker/ 18721//>>css.structure: ../../themes/base/core.css 18722//>>css.structure: ../../themes/base/datepicker.css 18723//>>css.theme: ../../themes/base/theme.css 18724 18725 18726$.extend( $.ui, { datepicker: { version: "1.13
vendor: 14,164 bytes, lines 18726-19043
18726.2" } } ); 18727 18728var datepicker_instActive; 18729 18730function datepicker_getZindex( elem ) { 18731 var position, value; 18732 while ( elem.length && elem[ 0 ] !== document ) { 18733 18734 // Ignore z-index if position is set to a value where z-index is ignored by the browser 18735 // This makes behavior of this function consistent across browsers 18736 // WebKit always returns auto if the element is positioned 18737 position = elem.css( "position" ); 18738 if ( position === "absolute" || position === "relative" || position === "fixed" ) { 18739 18740 // IE returns 0 when zIndex is not specified 18741 // other browsers return a string 18742 // we ignore the case of nested elements with an explicit value of 0 18743 // <div style="z-index: -10;"><div style="z-index: 0;"></div></div> 18744 value = parseInt( elem.css( "zIndex" ), 10 ); 18745 if ( !isNaN( value ) && value !== 0 ) { 18746 return value; 18747 } 18748 } 18749 elem = elem.parent(); 18750 } 18751 18752 return 0; 18753} 18754 18755/* Date picker manager. 18756 Use the singleton instance of this class, $.datepicker, to interact with the date picker. 18757 Settings for (groups of) date pickers are maintained in an instance object, 18758 allowing multiple different settings on the same page. */ 18759 18760function Datepicker() { 18761 this._curInst = null; // The current instance in use 18762 this._keyEvent = false; // If the last event was a key event 18763 this._disabledInputs = []; // List of date picker inputs that have been disabled 18764 this._datepickerShowing = false; // True if the popup picker is showing , false if not 18765 this._inDialog = false; // True if showing within a "dialog", false if not 18766 this._mainDivId = "ui-datepicker-div"; // The ID of the main datepicker division 18767 this._inlineClass = "ui-datepicker-inline"; // The name of the inline marker class 18768 this._appendClass = "ui-datepicker-append"; // The name of the append marker class 18769 this._triggerClass = "ui-datepicker-trigger"; // The name of the trigger marker class 18770 this._dialogClass = "ui-datepicker-dialog"; // The name of the dialog marker class 18771 this._disableClass = "ui-datepicker-disabled"; // The name of the disabled covering marker class 18772 this._unselectableClass = "ui-datepicker-unselectable"; // The name of the unselectable cell marker class 18773 this._currentClass = "ui-datepicker-current-day"; // The name of the current day marker class 18774 this._dayOverClass = "ui-datepicker-days-cell-over"; // The name of the day hover marker class 18775 this.regional = []; // Available regional settings, indexed by language code 18776 this.regional[ "" ] = { // Default regional settings 18777 closeText: "Done", // Display text for close link 18778 prevText: "Prev", // Display text for previous month link 18779 nextText: "Next", // Display text for next month link 18780 currentText: "Today", // Display text for current month link 18781 monthNames: [ "January", "February", "March", "April", "May", "June", 18782 "July", "August", "September", "October", "November", "December" ], // Names of months for drop-down and formatting 18783 monthNamesShort: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ], // For formatting 18784 dayNames: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ], // For formatting 18785 dayNamesShort: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ], // For formatting 18786 dayNamesMin: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ], // Column headings for days starting at Sunday 18787 weekHeader: "Wk", // Column header for week of the year 18788 dateFormat: "mm/dd/yy", // See format options on parseDate 18789 firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... 18790 isRTL: false, // True if right-to-left language, false if left-to-right 18791 showMonthAfterYear: false, // True if the year select precedes month, false for month then year 18792 yearSuffix: "", // Additional text to append to the year in the month headers, 18793 selectMonthLabel: "Select month", // Invisible label for month selector 18794 selectYearLabel: "Select year" // Invisible label for year selector 18795 }; 18796 this._defaults = { // Global defaults for all the date picker instances 18797 showOn: "focus", // "focus" for popup on focus, 18798 // "button" for trigger button, or "both" for either 18799 showAnim: "fadeIn", // Name of jQuery animation for popup 18800 showOptions: {}, // Options for enhanced animations 18801 defaultDate: null, // Used when field is blank: actual date, 18802 // +/-number for offset from today, null for today 18803 appendText: "", // Display text following the input box, e.g. showing the format 18804 buttonText: "...", // Text for trigger button 18805 buttonImage: "", // URL for trigger button image 18806 buttonImageOnly: false, // True if the image appears alone, false if it appears on a button 18807 hideIfNoPrevNext: false, // True to hide next/previous month links 18808 // if not applicable, false to just disable them 18809 navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links 18810 gotoCurrent: false, // True if today link goes back to current selection instead 18811 changeMonth: false, // True if month can be selected directly, false if only prev/next 18812 changeYear: false, // True if year can be selected directly, false if only prev/next 18813 yearRange: "c-10:c+10", // Range of years to display in drop-down, 18814 // either relative to today's year (-nn:+nn), relative to currently displayed year 18815 // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) 18816 showOtherMonths: false, // True to show dates in other months, false to leave blank 18817 selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable 18818 showWeek: false, // True to show week of the year, false to not show it 18819 calculateWeek: this.iso8601Week, // How to calculate the week of the year, 18820 // takes a Date and returns the number of the week for it 18821 shortYearCutoff: "+10", // Short year values < this are in the current century, 18822 // > this are in the previous century, 18823 // string value starting with "+" for current year + value 18824 minDate: null, // The earliest selectable date, or null for no limit 18825 maxDate: null, // The latest selectable date, or null for no limit 18826 duration: "fast", // Duration of display/closure 18827 beforeShowDay: null, // Function that takes a date and returns an array with 18828 // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "", 18829 // [2] = cell title (optional), e.g. $.datepicker.noWeekends 18830 beforeShow: null, // Function that takes an input field and 18831 // returns a set of custom settings for the date picker 18832 onSelect: null, // Define a callback function when a date is selected 18833 onChangeMonthYear: null, // Define a callback function when the month or year is changed 18834 onClose: null, // Define a callback function when the datepicker is closed 18835 onUpdateDatepicker: null, // Define a callback function when the datepicker is updated 18836 numberOfMonths: 1, // Number of months to show at a time 18837 showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) 18838 stepMonths: 1, // Number of months to step back/forward 18839 stepBigMonths: 12, // Number of months to step back/forward for the big links 18840 altField: "", // Selector for an alternate field to store selected dates into 18841 altFormat: "", // The date format to use for the alternate field 18842 constrainInput: true, // The input is constrained by the current date format 18843 showButtonPanel: false, // True to show button panel, false to not show it 18844 autoSize: false, // True to size the input for the date format, false to leave as is 18845 disabled: false // The initial disabled state 18846 }; 18847 $.extend( this._defaults, this.regional[ "" ] ); 18848 this.regional.en = $.extend( true, {}, this.regional[ "" ] ); 18849 this.regional[ "en-US" ] = $.extend( true, {}, this.regional.en ); 18850 this.dpDiv = datepicker_bindHover( $( "<div id='" + this._mainDivId + "' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ); 18851} 18852 18853$.extend( Datepicker.prototype, { 18854 18855 /* Class name added to elements to indicate already configured with a date picker. */ 18856 markerClassName: "hasDatepicker", 18857 18858 //Keep track of the maximum number of rows displayed (see #7043) 18859 maxRows: 4, 18860 18861 // TODO rename to "widget" when switching to widget factory 18862 _widgetDatepicker: function() { 18863 return this.dpDiv; 18864 }, 18865 18866 /* Override the default settings for all instances of the date picker. 18867 * @param settings object - the new settings to use as defaults (anonymous object) 18868 * @return the manager object 18869 */ 18870 setDefaults: function( settings ) { 18871 datepicker_extendRemove( this._defaults, settings || {} ); 18872 return this; 18873 }, 18874 18875 /* Attach the date picker to a jQuery selection. 18876 * @param target element - the target input field or division or span 18877 * @param settings object - the new settings to use for this date picker instance (anonymous) 18878 */ 18879 _attachDatepicker: function( target, settings ) { 18880 var nodeName, inline, inst; 18881 nodeName = target.nodeName.toLowerCase(); 18882 inline = ( nodeName === "div" || nodeName === "span" ); 18883 if ( !target.id ) { 18884 this.uuid += 1; 18885 target.id = "dp" + this.uuid; 18886 } 18887 inst = this._newInst( $( target ), inline ); 18888 inst.settings = $.extend( {}, settings || {} ); 18889 if ( nodeName === "input" ) { 18890 this._connectDatepicker( target, inst ); 18891 } else if ( inline ) { 18892 this._inlineDatepicker( target, inst ); 18893 } 18894 }, 18895 18896 /* Create a new instance object. */ 18897 _newInst: function( target, inline ) { 18898 var id = target[ 0 ].id.replace( /([^A-Za-z0-9_\-])/g, "\\\\$1" ); // escape jQuery meta chars 18899 return { id: id, input: target, // associated target 18900 selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection 18901 drawMonth: 0, drawYear: 0, // month being drawn 18902 inline: inline, // is datepicker inline or not 18903 dpDiv: ( !inline ? this.dpDiv : // presentation div 18904 datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) }; 18905 }, 18906 18907 /* Attach the date picker to an input field. */ 18908 _connectDatepicker: function( target, inst ) { 18909 var input = $( target ); 18910 inst.append = $( [] ); 18911 inst.trigger = $( [] ); 18912 if ( input.hasClass( this.markerClassName ) ) { 18913 return; 18914 } 18915 this._attachments( input, inst ); 18916 input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ). 18917 on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp ); 18918 this._autoSize( inst ); 18919 $.data( target, "datepicker", inst ); 18920 18921 //If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665) 18922 if ( inst.settings.disabled ) { 18923 this._disableDatepicker( target ); 18924 } 18925 }, 18926 18927 /* Make attachments based on settings. */ 18928 _attachments: function( input, inst ) { 18929 var showOn, buttonText, buttonImage, 18930 appendText = this._get( inst, "appendText" ), 18931 isRTL = this._get( inst, "isRTL" ); 18932 18933 if ( inst.append ) { 18934 inst.append.remove(); 18935 } 18936 if ( appendText ) { 18937 inst.append = $( "<span>" ) 18938 .addClass( this._appendClass ) 18939 .text( appendText ); 18940 input[ isRTL ? "before" : "after" ]( inst.append ); 18941 } 18942 18943 input.off( "focus", this._showDatepicker ); 18944 18945 if ( inst.trigger ) { 18946 inst.trigger.remove(); 18947 } 18948 18949 showOn = this._get( inst, "showOn" ); 18950 if ( showOn === "focus" || showOn === "both" ) { // pop-up date picker when in the marked field 18951 input.on( "focus", this._showDatepicker ); 18952 } 18953 if ( showOn === "button" || showOn === "both" ) { // pop-up date picker when button clicked 18954 buttonText = this._get( inst, "buttonText" ); 18955 buttonImage = this._get( inst, "buttonImage" ); 18956 18957 if ( this._get( inst, "buttonImageOnly" ) ) { 18958 inst.trigger = $( "<img>" ) 18959 .addClass( this._triggerClass ) 18960 .attr( { 18961 src: buttonImage, 18962 alt: buttonText, 18963 title: buttonText 18964 } ); 18965 } else { 18966 inst.trigger = $( "<button type='button'>" ) 18967 .addClass( this._triggerClass ); 18968 if ( buttonImage ) { 18969 inst.trigger.html( 18970 $( "<img>" ) 18971 .attr( { 18972 src: buttonImage, 18973 alt: buttonText, 18974 title: buttonText 18975 } ) 18976 ); 18977 } else { 18978 inst.trigger.text( buttonText ); 18979 } 18980 } 18981 18982 input[ isRTL ? "before" : "after" ]( inst.trigger ); 18983 inst.trigger.on( "click", function() { 18984 if ( $.datepicker._datepickerShowing && $.datepicker._lastInput === input[ 0 ] ) { 18985 $.datepicker._hideDatepicker(); 18986 } else if ( $.datepicker._datepickerShowing && $.datepicker._lastInput !== input[ 0 ] ) { 18987 $.datepicker._hideDatepicker(); 18988 $.datepicker._showDatepicker( input[ 0 ] ); 18989 } else { 18990 $.datepicker._showDatepicker( input[ 0 ] ); 18991 } 18992 return false; 18993 } ); 18994 } 18995 }, 18996 18997 /* Apply the maximum length for the date format. */ 18998 _autoSize: function( inst ) { 18999 if ( this._get( inst, "autoSize" ) && !inst.inline ) { 19000 var findMax, max, maxI, i, 19001 date = new Date( 2009, 12 - 1, 20 ), // Ensure double digits 19002 dateFormat = this._get( inst, "dateFormat" ); 19003 19004 if ( dateFormat.match( /[DM]/ ) ) { 19005 findMax = function( names ) { 19006 max = 0; 19007 maxI = 0; 19008 for ( i = 0; i < names.length; i++ ) { 19009 if ( names[ i ].length > max ) { 19010 max = names[ i ].length; 19011 maxI = i; 19012 } 19013 } 19014 return maxI; 19015 }; 19016 date.setMonth( findMax( this._get( inst, ( dateFormat.match( /MM/ ) ? 19017 "monthNames" : "monthNamesShort" ) ) ) ); 19018 date.setDate( findMax( this._get( inst, ( dateFormat.match( /DD/ ) ? 19019 "dayNames" : "dayNamesShort" ) ) ) + 20 - date.getDay() ); 19020 } 19021 inst.input.attr( "size", this._formatDate( inst, date ).length ); 19022 } 19023 }, 19024 19025 /* Attach an inline date picker to a div. */ 19026 _inlineDatepicker: function( target, inst ) { 19027 var divSpan = $( target ); 19028 if ( divSpan.hasClass( this.markerClassName ) ) { 19029 return; 19030 } 19031 divSpan.addClass( this.markerClassName ).append( inst.dpDiv ); 19032 $.data( target, "datepicker", inst ); 19033 this._setDate( inst, this._getDefaultDate( inst ), true ); 19034 this._updateDatepicker( inst ); 19035 this._updateAlternate( inst ); 19036 19037 //If disabled option is true, disable the datepicker before showing it (see ticket #5665) 19038 if ( inst.settings.disabled ) { 19039 this._disableDatepicker( target ); 19040 } 19041 19042 // Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements 19043 // http
vendor: 14,693 bytes, lines 19043-19465
19043://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height 19044 inst.dpDiv.css( "display", "block" ); 19045 }, 19046 19047 /* Pop-up the date picker in a "dialog" box. 19048 * @param input element - ignored 19049 * @param date string or Date - the initial date to display 19050 * @param onSelect function - the function to call when a date is selected 19051 * @param settings object - update the dialog date picker instance's settings (anonymous object) 19052 * @param pos int[2] - coordinates for the dialog's position within the screen or 19053 * event - with x/y coordinates or 19054 * leave empty for default (screen centre) 19055 * @return the manager object 19056 */ 19057 _dialogDatepicker: function( input, date, onSelect, settings, pos ) { 19058 var id, browserWidth, browserHeight, scrollX, scrollY, 19059 inst = this._dialogInst; // internal instance 19060 19061 if ( !inst ) { 19062 this.uuid += 1; 19063 id = "dp" + this.uuid; 19064 this._dialogInput = $( "<input type='text' id='" + id + 19065 "' style='position: absolute; top: -100px; width: 0px;'/>" ); 19066 this._dialogInput.on( "keydown", this._doKeyDown ); 19067 $( "body" ).append( this._dialogInput ); 19068 inst = this._dialogInst = this._newInst( this._dialogInput, false ); 19069 inst.settings = {}; 19070 $.data( this._dialogInput[ 0 ], "datepicker", inst ); 19071 } 19072 datepicker_extendRemove( inst.settings, settings || {} ); 19073 date = ( date && date.constructor === Date ? this._formatDate( inst, date ) : date ); 19074 this._dialogInput.val( date ); 19075 19076 this._pos = ( pos ? ( pos.length ? pos : [ pos.pageX, pos.pageY ] ) : null ); 19077 if ( !this._pos ) { 19078 browserWidth = document.documentElement.clientWidth; 19079 browserHeight = document.documentElement.clientHeight; 19080 scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; 19081 scrollY = document.documentElement.scrollTop || document.body.scrollTop; 19082 this._pos = // should use actual width/height below 19083 [ ( browserWidth / 2 ) - 100 + scrollX, ( browserHeight / 2 ) - 150 + scrollY ]; 19084 } 19085 19086 // Move input on screen for focus, but hidden behind dialog 19087 this._dialogInput.css( "left", ( this._pos[ 0 ] + 20 ) + "px" ).css( "top", this._pos[ 1 ] + "px" ); 19088 inst.settings.onSelect = onSelect; 19089 this._inDialog = true; 19090 this.dpDiv.addClass( this._dialogClass ); 19091 this._showDatepicker( this._dialogInput[ 0 ] ); 19092 if ( $.blockUI ) { 19093 $.blockUI( this.dpDiv ); 19094 } 19095 $.data( this._dialogInput[ 0 ], "datepicker", inst ); 19096 return this; 19097 }, 19098 19099 /* Detach a datepicker from its control. 19100 * @param target element - the target input field or division or span 19101 */ 19102 _destroyDatepicker: function( target ) { 19103 var nodeName, 19104 $target = $( target ), 19105 inst = $.data( target, "datepicker" ); 19106 19107 if ( !$target.hasClass( this.markerClassName ) ) { 19108 return; 19109 } 19110 19111 nodeName = target.nodeName.toLowerCase(); 19112 $.removeData( target, "datepicker" ); 19113 if ( nodeName === "input" ) { 19114 inst.append.remove(); 19115 inst.trigger.remove(); 19116 $target.removeClass( this.markerClassName ). 19117 off( "focus", this._showDatepicker ). 19118 off( "keydown", this._doKeyDown ). 19119 off( "keypress", this._doKeyPress ). 19120 off( "keyup", this._doKeyUp ); 19121 } else if ( nodeName === "div" || nodeName === "span" ) { 19122 $target.removeClass( this.markerClassName ).empty(); 19123 } 19124 19125 if ( datepicker_instActive === inst ) { 19126 datepicker_instActive = null; 19127 this._curInst = null; 19128 } 19129 }, 19130 19131 /* Enable the date picker to a jQuery selection. 19132 * @param target element - the target input field or division or span 19133 */ 19134 _enableDatepicker: function( target ) { 19135 var nodeName, inline, 19136 $target = $( target ), 19137 inst = $.data( target, "datepicker" ); 19138 19139 if ( !$target.hasClass( this.markerClassName ) ) { 19140 return; 19141 } 19142 19143 nodeName = target.nodeName.toLowerCase(); 19144 if ( nodeName === "input" ) { 19145 target.disabled = false; 19146 inst.trigger.filter( "button" ). 19147 each( function() { 19148 this.disabled = false; 19149 } ).end(). 19150 filter( "img" ).css( { opacity: "1.0", cursor: "" } ); 19151 } else if ( nodeName === "div" || nodeName === "span" ) { 19152 inline = $target.children( "." + this._inlineClass ); 19153 inline.children().removeClass( "ui-state-disabled" ); 19154 inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ). 19155 prop( "disabled", false ); 19156 } 19157 this._disabledInputs = $.map( this._disabledInputs, 19158 19159 // Delete entry 19160 function( value ) { 19161 return ( value === target ? null : value ); 19162 } ); 19163 }, 19164 19165 /* Disable the date picker to a jQuery selection. 19166 * @param target element - the target input field or division or span 19167 */ 19168 _disableDatepicker: function( target ) { 19169 var nodeName, inline, 19170 $target = $( target ), 19171 inst = $.data( target, "datepicker" ); 19172 19173 if ( !$target.hasClass( this.markerClassName ) ) { 19174 return; 19175 } 19176 19177 nodeName = target.nodeName.toLowerCase(); 19178 if ( nodeName === "input" ) { 19179 target.disabled = true; 19180 inst.trigger.filter( "button" ). 19181 each( function() { 19182 this.disabled = true; 19183 } ).end(). 19184 filter( "img" ).css( { opacity: "0.5", cursor: "default" } ); 19185 } else if ( nodeName === "div" || nodeName === "span" ) { 19186 inline = $target.children( "." + this._inlineClass ); 19187 inline.children().addClass( "ui-state-disabled" ); 19188 inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ). 19189 prop( "disabled", true ); 19190 } 19191 this._disabledInputs = $.map( this._disabledInputs, 19192 19193 // Delete entry 19194 function( value ) { 19195 return ( value === target ? null : value ); 19196 } ); 19197 this._disabledInputs[ this._disabledInputs.length ] = target; 19198 }, 19199 19200 /* Is the first field in a jQuery collection disabled as a datepicker? 19201 * @param target element - the target input field or division or span 19202 * @return boolean - true if disabled, false if enabled 19203 */ 19204 _isDisabledDatepicker: function( target ) { 19205 if ( !target ) { 19206 return false; 19207 } 19208 for ( var i = 0; i < this._disabledInputs.length; i++ ) { 19209 if ( this._disabledInputs[ i ] === target ) { 19210 return true; 19211 } 19212 } 19213 return false; 19214 }, 19215 19216 /* Retrieve the instance data for the target control. 19217 * @param target element - the target input field or division or span 19218 * @return object - the associated instance data 19219 * @throws error if a jQuery problem getting data 19220 */ 19221 _getInst: function( target ) { 19222 try { 19223 return $.data( target, "datepicker" ); 19224 } catch ( err ) { 19225 throw "Missing instance data for this datepicker"; 19226 } 19227 }, 19228 19229 /* Update or retrieve the settings for a date picker attached to an input field or division. 19230 * @param target element - the target input field or division or span 19231 * @param name object - the new settings to update or 19232 * string - the name of the setting to change or retrieve, 19233 * when retrieving also "all" for all instance settings or 19234 * "defaults" for all global defaults 19235 * @param value any - the new value for the setting 19236 * (omit if above is an object or to retrieve a value) 19237 */ 19238 _optionDatepicker: function( target, name, value ) { 19239 var settings, date, minDate, maxDate, 19240 inst = this._getInst( target ); 19241 19242 if ( arguments.length === 2 && typeof name === "string" ) { 19243 return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) : 19244 ( inst ? ( name === "all" ? $.extend( {}, inst.settings ) : 19245 this._get( inst, name ) ) : null ) ); 19246 } 19247 19248 settings = name || {}; 19249 if ( typeof name === "string" ) { 19250 settings = {}; 19251 settings[ name ] = value; 19252 } 19253 19254 if ( inst ) { 19255 if ( this._curInst === inst ) { 19256 this._hideDatepicker(); 19257 } 19258 19259 date = this._getDateDatepicker( target, true ); 19260 minDate = this._getMinMaxDate( inst, "min" ); 19261 maxDate = this._getMinMaxDate( inst, "max" ); 19262 datepicker_extendRemove( inst.settings, settings ); 19263 19264 // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided 19265 if ( minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined ) { 19266 inst.settings.minDate = this._formatDate( inst, minDate ); 19267 } 19268 if ( maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined ) { 19269 inst.settings.maxDate = this._formatDate( inst, maxDate ); 19270 } 19271 if ( "disabled" in settings ) { 19272 if ( settings.disabled ) { 19273 this._disableDatepicker( target ); 19274 } else { 19275 this._enableDatepicker( target ); 19276 } 19277 } 19278 this._attachments( $( target ), inst ); 19279 this._autoSize( inst ); 19280 this._setDate( inst, date ); 19281 this._updateAlternate( inst ); 19282 this._updateDatepicker( inst ); 19283 } 19284 }, 19285 19286 // Change method deprecated 19287 _changeDatepicker: function( target, name, value ) { 19288 this._optionDatepicker( target, name, value ); 19289 }, 19290 19291 /* Redraw the date picker attached to an input field or division. 19292 * @param target element - the target input field or division or span 19293 */ 19294 _refreshDatepicker: function( target ) { 19295 var inst = this._getInst( target ); 19296 if ( inst ) { 19297 this._updateDatepicker( inst ); 19298 } 19299 }, 19300 19301 /* Set the dates for a jQuery selection. 19302 * @param target element - the target input field or division or span 19303 * @param date Date - the new date 19304 */ 19305 _setDateDatepicker: function( target, date ) { 19306 var inst = this._getInst( target ); 19307 if ( inst ) { 19308 this._setDate( inst, date ); 19309 this._updateDatepicker( inst ); 19310 this._updateAlternate( inst ); 19311 } 19312 }, 19313 19314 /* Get the date(s) for the first entry in a jQuery selection. 19315 * @param target element - the target input field or division or span 19316 * @param noDefault boolean - true if no default date is to be used 19317 * @return Date - the current date 19318 */ 19319 _getDateDatepicker: function( target, noDefault ) { 19320 var inst = this._getInst( target ); 19321 if ( inst && !inst.inline ) { 19322 this._setDateFromField( inst, noDefault ); 19323 } 19324 return ( inst ? this._getDate( inst ) : null ); 19325 }, 19326 19327 /* Handle keystrokes. */ 19328 _doKeyDown: function( event ) { 19329 var onSelect, dateStr, sel, 19330 inst = $.datepicker._getInst( event.target ), 19331 handled = true, 19332 isRTL = inst.dpDiv.is( ".ui-datepicker-rtl" ); 19333 19334 inst._keyEvent = true; 19335 if ( $.datepicker._datepickerShowing ) { 19336 switch ( event.keyCode ) { 19337 case 9: $.datepicker._hideDatepicker(); 19338 handled = false; 19339 break; // hide on tab out 19340 case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." + 19341 $.datepicker._currentClass + ")", inst.dpDiv ); 19342 if ( sel[ 0 ] ) { 19343 $.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] ); 19344 } 19345 19346 onSelect = $.datepicker._get( inst, "onSelect" ); 19347 if ( onSelect ) { 19348 dateStr = $.datepicker._formatDate( inst ); 19349 19350 // Trigger custom callback 19351 onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] ); 19352 } else { 19353 $.datepicker._hideDatepicker(); 19354 } 19355 19356 return false; // don't submit the form 19357 case 27: $.datepicker._hideDatepicker(); 19358 break; // hide on escape 19359 case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ? 19360 -$.datepicker._get( inst, "stepBigMonths" ) : 19361 -$.datepicker._get( inst, "stepMonths" ) ), "M" ); 19362 break; // previous month/year on page up/+ ctrl 19363 case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ? 19364 +$.datepicker._get( inst, "stepBigMonths" ) : 19365 +$.datepicker._get( inst, "stepMonths" ) ), "M" ); 19366 break; // next month/year on page down/+ ctrl 19367 case 35: if ( event.ctrlKey || event.metaKey ) { 19368 $.datepicker._clearDate( event.target ); 19369 } 19370 handled = event.ctrlKey || event.metaKey; 19371 break; // clear on ctrl or command +end 19372 case 36: if ( event.ctrlKey || event.metaKey ) { 19373 $.datepicker._gotoToday( event.target ); 19374 } 19375 handled = event.ctrlKey || event.metaKey; 19376 break; // current on ctrl or command +home 19377 case 37: if ( event.ctrlKey || event.metaKey ) { 19378 $.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" ); 19379 } 19380 handled = event.ctrlKey || event.metaKey; 19381 19382 // -1 day on ctrl or command +left 19383 if ( event.originalEvent.altKey ) { 19384 $.datepicker._adjustDate( event.target, ( event.ctrlKey ? 19385 -$.datepicker._get( inst, "stepBigMonths" ) : 19386 -$.datepicker._get( inst, "stepMonths" ) ), "M" ); 19387 } 19388 19389 // next month/year on alt +left on Mac 19390 break; 19391 case 38: if ( event.ctrlKey || event.metaKey ) { 19392 $.datepicker._adjustDate( event.target, -7, "D" ); 19393 } 19394 handled = event.ctrlKey || event.metaKey; 19395 break; // -1 week on ctrl or command +up 19396 case 39: if ( event.ctrlKey || event.metaKey ) { 19397 $.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" ); 19398 } 19399 handled = event.ctrlKey || event.metaKey; 19400 19401 // +1 day on ctrl or command +right 19402 if ( event.originalEvent.altKey ) { 19403 $.datepicker._adjustDate( event.target, ( event.ctrlKey ? 19404 +$.datepicker._get( inst, "stepBigMonths" ) : 19405 +$.datepicker._get( inst, "stepMonths" ) ), "M" ); 19406 } 19407 19408 // next month/year on alt +right 19409 break; 19410 case 40: if ( event.ctrlKey || event.metaKey ) { 19411 $.datepicker._adjustDate( event.target, +7, "D" ); 19412 } 19413 handled = event.ctrlKey || event.metaKey; 19414 break; // +1 week on ctrl or command +down 19415 default: handled = false; 19416 } 19417 } else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home 19418 $.datepicker._showDatepicker( this ); 19419 } else { 19420 handled = false; 19421 } 19422 19423 if ( handled ) { 19424 event.preventDefault(); 19425 event.stopPropagation(); 19426 } 19427 }, 19428 19429 /* Filter entered characters - based on date format. */ 19430 _doKeyPress: function( event ) { 19431 var chars, chr, 19432 inst = $.datepicker._getInst( event.target ); 19433 19434 if ( $.datepicker._get( inst, "constrainInput" ) ) { 19435 chars = $.datepicker._possibleChars( $.datepicker._get( inst, "dateFormat" ) ); 19436 chr = String.fromCharCode( event.charCode == null ? event.keyCode : event.charCode ); 19437 return event.ctrlKey || event.metaKey || ( chr < " " || !chars || chars.indexOf( chr ) > -1 ); 19438 } 19439 }, 19440 19441 /* Synchronise manual entry and field/alternate field. */ 19442 _doKeyUp: function( event ) { 19443 var date, 19444 inst = $.datepicker._getInst( event.target ); 19445 19446 if ( inst.input.val() !== inst.lastVal ) { 19447 try { 19448 date = $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ), 19449 ( inst.input ? inst.input.val() : null ), 19450 $.datepicker._getFormatConfig( inst ) ); 19451 19452 if ( date ) { // only if valid 19453 $.datepicker._setDateFromField( inst ); 19454 $.datepicker._updateAlternate( inst ); 19455 $.datepicker._updateDatepicker( inst ); 19456 } 19457 } catch ( err ) { 19458 } 19459 } 19460 return true; 19461 }, 19462 19463 /* Pop-up the date picker for a given input field. 19464 * If false returned from beforeShow event handler do not show. 19465 * @param input element - the input field attached to the date picker or
vendor: 4,332 bytes, lines 19466-19588
19466 * event - if triggered by focus 19467 */ 19468 _showDatepicker: function( input ) { 19469 input = input.target || input; 19470 if ( input.nodeName.toLowerCase() !== "input" ) { // find from button/image trigger 19471 input = $( "input", input.parentNode )[ 0 ]; 19472 } 19473 19474 if ( $.datepicker._isDisabledDatepicker( input ) || $.datepicker._lastInput === input ) { // already here 19475 return; 19476 } 19477 19478 var inst, beforeShow, beforeShowSettings, isFixed, 19479 offset, showAnim, duration; 19480 19481 inst = $.datepicker._getInst( input ); 19482 if ( $.datepicker._curInst && $.datepicker._curInst !== inst ) { 19483 $.datepicker._curInst.dpDiv.stop( true, true ); 19484 if ( inst && $.datepicker._datepickerShowing ) { 19485 $.datepicker._hideDatepicker( $.datepicker._curInst.input[ 0 ] ); 19486 } 19487 } 19488 19489 beforeShow = $.datepicker._get( inst, "beforeShow" ); 19490 beforeShowSettings = beforeShow ? beforeShow.apply( input, [ input, inst ] ) : {}; 19491 if ( beforeShowSettings === false ) { 19492 return; 19493 } 19494 datepicker_extendRemove( inst.settings, beforeShowSettings ); 19495 19496 inst.lastVal = null; 19497 $.datepicker._lastInput = input; 19498 $.datepicker._setDateFromField( inst ); 19499 19500 if ( $.datepicker._inDialog ) { // hide cursor 19501 input.value = ""; 19502 } 19503 if ( !$.datepicker._pos ) { // position below input 19504 $.datepicker._pos = $.datepicker._findPos( input ); 19505 $.datepicker._pos[ 1 ] += input.offsetHeight; // add the height 19506 } 19507 19508 isFixed = false; 19509 $( input ).parents().each( function() { 19510 isFixed |= $( this ).css( "position" ) === "fixed"; 19511 return !isFixed; 19512 } ); 19513 19514 offset = { left: $.datepicker._pos[ 0 ], top: $.datepicker._pos[ 1 ] }; 19515 $.datepicker._pos = null; 19516 19517 //to avoid flashes on Firefox 19518 inst.dpDiv.empty(); 19519 19520 // determine sizing offscreen 19521 inst.dpDiv.css( { position: "absolute", display: "block", top: "-1000px" } ); 19522 $.datepicker._updateDatepicker( inst ); 19523 19524 // fix width for dynamic number of date pickers 19525 // and adjust position before showing 19526 offset = $.datepicker._checkOffset( inst, offset, isFixed ); 19527 inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ? 19528 "static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none", 19529 left: offset.left + "px", top: offset.top + "px" } ); 19530 19531 if ( !inst.inline ) { 19532 showAnim = $.datepicker._get( inst, "showAnim" ); 19533 duration = $.datepicker._get( inst, "duration" ); 19534 inst.dpDiv.css( "z-index", datepicker_getZindex( $( input ) ) + 1 ); 19535 $.datepicker._datepickerShowing = true; 19536 19537 if ( $.effects && $.effects.effect[ showAnim ] ) { 19538 inst.dpDiv.show( showAnim, $.datepicker._get( inst, "showOptions" ), duration ); 19539 } else { 19540 inst.dpDiv[ showAnim || "show" ]( showAnim ? duration : null ); 19541 } 19542 19543 if ( $.datepicker._shouldFocusInput( inst ) ) { 19544 inst.input.trigger( "focus" ); 19545 } 19546 19547 $.datepicker._curInst = inst; 19548 } 19549 }, 19550 19551 /* Generate the date picker content. */ 19552 _updateDatepicker: function( inst ) { 19553 this.maxRows = 4; //Reset the max number of rows being displayed (see #7043) 19554 datepicker_instActive = inst; // for delegate hover events 19555 inst.dpDiv.empty().append( this._generateHTML( inst ) ); 19556 this._attachHandlers( inst ); 19557 19558 var origyearshtml, 19559 numMonths = this._getNumberOfMonths( inst ), 19560 cols = numMonths[ 1 ], 19561 width = 17, 19562 activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" ), 19563 onUpdateDatepicker = $.datepicker._get( inst, "onUpdateDatepicker" ); 19564 19565 if ( activeCell.length > 0 ) { 19566 datepicker_handleMouseover.apply( activeCell.get( 0 ) ); 19567 } 19568 19569 inst.dpDiv.removeClass( "ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4" ).width( "" ); 19570 if ( cols > 1 ) { 19571 inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" ); 19572 } 19573 inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) + 19574 "Class" ]( "ui-datepicker-multi" ); 19575 inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) + 19576 "Class" ]( "ui-datepicker-rtl" ); 19577 19578 if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) { 19579 inst.input.trigger( "focus" ); 19580 } 19581 19582 // Deffered render of the years select (to avoid flashes on Firefox) 19583 if ( inst.yearshtml ) { 19584 origyearshtml = inst.yearshtml; 19585 setTimeout( function() { 19586 19587 //assure that inst.yearshtml didn't change. 19588 if ( origyearshtml === inst.yearshtml && inst.yearshtml ) {
vendor: 5,508 bytes, lines 19589-19747
19589 inst.dpDiv.find( "select.ui-datepicker-year" ).first().replaceWith( inst.yearshtml ); 19590 } 19591 origyearshtml = inst.yearshtml = null; 19592 }, 0 ); 19593 } 19594 19595 if ( onUpdateDatepicker ) { 19596 onUpdateDatepicker.apply( ( inst.input ? inst.input[ 0 ] : null ), [ inst ] ); 19597 } 19598 }, 19599 19600 // #6694 - don't focus the input if it's already focused 19601 // this breaks the change event in IE 19602 // Support: IE and jQuery <1.9 19603 _shouldFocusInput: function( inst ) { 19604 return inst.input && inst.input.is( ":visible" ) && !inst.input.is( ":disabled" ) && !inst.input.is( ":focus" ); 19605 }, 19606 19607 /* Check positioning to remain on screen. */ 19608 _checkOffset: function( inst, offset, isFixed ) { 19609 var dpWidth = inst.dpDiv.outerWidth(), 19610 dpHeight = inst.dpDiv.outerHeight(), 19611 inputWidth = inst.input ? inst.input.outerWidth() : 0, 19612 inputHeight = inst.input ? inst.input.outerHeight() : 0, 19613 viewWidth = document.documentElement.clientWidth + ( isFixed ? 0 : $( document ).scrollLeft() ), 19614 viewHeight = document.documentElement.clientHeight + ( isFixed ? 0 : $( document ).scrollTop() ); 19615 19616 offset.left -= ( this._get( inst, "isRTL" ) ? ( dpWidth - inputWidth ) : 0 ); 19617 offset.left -= ( isFixed && offset.left === inst.input.offset().left ) ? $( document ).scrollLeft() : 0; 19618 offset.top -= ( isFixed && offset.top === ( inst.input.offset().top + inputHeight ) ) ? $( document ).scrollTop() : 0; 19619 19620 // Now check if datepicker is showing outside window viewport - move to a better place if so. 19621 offset.left -= Math.min( offset.left, ( offset.left + dpWidth > viewWidth && viewWidth > dpWidth ) ? 19622 Math.abs( offset.left + dpWidth - viewWidth ) : 0 ); 19623 offset.top -= Math.min( offset.top, ( offset.top + dpHeight > viewHeight && viewHeight > dpHeight ) ? 19624 Math.abs( dpHeight + inputHeight ) : 0 ); 19625 19626 return offset; 19627 }, 19628 19629 /* Find an object's position on the screen. */ 19630 _findPos: function( obj ) { 19631 var position, 19632 inst = this._getInst( obj ), 19633 isRTL = this._get( inst, "isRTL" ); 19634 19635 while ( obj && ( obj.type === "hidden" || obj.nodeType !== 1 || $.expr.pseudos.hidden( obj ) ) ) { 19636 obj = obj[ isRTL ? "previousSibling" : "nextSibling" ]; 19637 } 19638 19639 position = $( obj ).offset(); 19640 return [ position.left, position.top ]; 19641 }, 19642 19643 /* Hide the date picker from view. 19644 * @param input element - the input field attached to the date picker 19645 */ 19646 _hideDatepicker: function( input ) { 19647 var showAnim, duration, postProcess, onClose, 19648 inst = this._curInst; 19649 19650 if ( !inst || ( input && inst !== $.data( input, "datepicker" ) ) ) { 19651 return; 19652 } 19653 19654 if ( this._datepickerShowing ) { 19655 showAnim = this._get( inst, "showAnim" ); 19656 duration = this._get( inst, "duration" ); 19657 postProcess = function() { 19658 $.datepicker._tidyDialog( inst ); 19659 }; 19660 19661 // DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed 19662 if ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) { 19663 inst.dpDiv.hide( showAnim, $.datepicker._get( inst, "showOptions" ), duration, postProcess ); 19664 } else { 19665 inst.dpDiv[ ( showAnim === "slideDown" ? "slideUp" : 19666 ( showAnim === "fadeIn" ? "fadeOut" : "hide" ) ) ]( ( showAnim ? duration : null ), postProcess ); 19667 } 19668 19669 if ( !showAnim ) { 19670 postProcess(); 19671 } 19672 this._datepickerShowing = false; 19673 19674 onClose = this._get( inst, "onClose" ); 19675 if ( onClose ) { 19676 onClose.apply( ( inst.input ? inst.input[ 0 ] : null ), [ ( inst.input ? inst.input.val() : "" ), inst ] ); 19677 } 19678 19679 this._lastInput = null; 19680 if ( this._inDialog ) { 19681 this._dialogInput.css( { position: "absolute", left: "0", top: "-100px" } ); 19682 if ( $.blockUI ) { 19683 $.unblockUI(); 19684 $( "body" ).append( this.dpDiv ); 19685 } 19686 } 19687 this._inDialog = false; 19688 } 19689 }, 19690 19691 /* Tidy up after a dialog display. */ 19692 _tidyDialog: function( inst ) { 19693 inst.dpDiv.removeClass( this._dialogClass ).off( ".ui-datepicker-calendar" ); 19694 }, 19695 19696 /* Close date picker if clicked elsewhere. */ 19697 _checkExternalClick: function( event ) { 19698 if ( !$.datepicker._curInst ) { 19699 return; 19700 } 19701 19702 var $target = $( event.target ), 19703 inst = $.datepicker._getInst( $target[ 0 ] ); 19704 19705 if ( ( ( $target[ 0 ].id !== $.datepicker._mainDivId && 19706 $target.parents( "#" + $.datepicker._mainDivId ).length === 0 && 19707 !$target.hasClass( $.datepicker.markerClassName ) && 19708 !$target.closest( "." + $.datepicker._triggerClass ).length && 19709 $.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) || 19710 ( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) { 19711 $.datepicker._hideDatepicker(); 19712 } 19713 }, 19714 19715 /* Adjust one of the date sub-fields. */ 19716 _adjustDate: function( id, offset, period ) { 19717 var target = $( id ), 19718 inst = this._getInst( target[ 0 ] ); 19719 19720 if ( this._isDisabledDatepicker( target[ 0 ] ) ) { 19721 return; 19722 } 19723 this._adjustInstDate( inst, offset, period ); 19724 this._updateDatepicker( inst ); 19725 }, 19726 19727 /* Action for current link. */ 19728 _gotoToday: function( id ) { 19729 var date, 19730 target = $( id ), 19731 inst = this._getInst( target[ 0 ] ); 19732 19733 if ( this._get( inst, "gotoCurrent" ) && inst.currentDay ) { 19734 inst.selectedDay = inst.currentDay; 19735 inst.drawMonth = inst.selectedMonth = inst.currentMonth; 19736 inst.drawYear = inst.selectedYear = inst.currentYear; 19737 } else { 19738 date = new Date(); 19739 inst.selectedDay = date.getDate(); 19740 inst.drawMonth = inst.selectedMonth = date.getMonth(); 19741 inst.drawYear = inst.selectedYear = date.getFullYear(); 19742 } 19743 this._notifyChange( inst ); 19744 this._adjustDate( target ); 19745 }, 19746 19747 /* Action for selecting a new month/year. */
vendor: 10,046 bytes, lines 19748-20069
19748 _selectMonthYear: function( id, select, period ) { 19749 var target = $( id ), 19750 inst = this._getInst( target[ 0 ] ); 19751 19752 inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] = 19753 inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] = 19754 parseInt( select.options[ select.selectedIndex ].value, 10 ); 19755 19756 this._notifyChange( inst ); 19757 this._adjustDate( target ); 19758 }, 19759 19760 /* Action for selecting a day. */ 19761 _selectDay: function( id, month, year, td ) { 19762 var inst, 19763 target = $( id ); 19764 19765 if ( $( td ).hasClass( this._unselectableClass ) || this._isDisabledDatepicker( target[ 0 ] ) ) { 19766 return; 19767 } 19768 19769 inst = this._getInst( target[ 0 ] ); 19770 inst.selectedDay = inst.currentDay = parseInt( $( "a", td ).attr( "data-date" ) ); 19771 inst.selectedMonth = inst.currentMonth = month; 19772 inst.selectedYear = inst.currentYear = year; 19773 this._selectDate( id, this._formatDate( inst, 19774 inst.currentDay, inst.currentMonth, inst.currentYear ) ); 19775 }, 19776 19777 /* Erase the input field and hide the date picker. */ 19778 _clearDate: function( id ) { 19779 var target = $( id ); 19780 this._selectDate( target, "" ); 19781 }, 19782 19783 /* Update the input field with the selected date. */ 19784 _selectDate: function( id, dateStr ) { 19785 var onSelect, 19786 target = $( id ), 19787 inst = this._getInst( target[ 0 ] ); 19788 19789 dateStr = ( dateStr != null ? dateStr : this._formatDate( inst ) ); 19790 if ( inst.input ) { 19791 inst.input.val( dateStr ); 19792 } 19793 this._updateAlternate( inst ); 19794 19795 onSelect = this._get( inst, "onSelect" ); 19796 if ( onSelect ) { 19797 onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] ); // trigger custom callback 19798 } else if ( inst.input ) { 19799 inst.input.trigger( "change" ); // fire the change event 19800 } 19801 19802 if ( inst.inline ) { 19803 this._updateDatepicker( inst ); 19804 } else { 19805 this._hideDatepicker(); 19806 this._lastInput = inst.input[ 0 ]; 19807 if ( typeof( inst.input[ 0 ] ) !== "object" ) { 19808 inst.input.trigger( "focus" ); // restore focus 19809 } 19810 this._lastInput = null; 19811 } 19812 }, 19813 19814 /* Update any alternate field to synchronise with the main field. */ 19815 _updateAlternate: function( inst ) { 19816 var altFormat, date, dateStr, 19817 altField = this._get( inst, "altField" ); 19818 19819 if ( altField ) { // update alternate field too 19820 altFormat = this._get( inst, "altFormat" ) || this._get( inst, "dateFormat" ); 19821 date = this._getDate( inst ); 19822 dateStr = this.formatDate( altFormat, date, this._getFormatConfig( inst ) ); 19823 $( document ).find( altField ).val( dateStr ); 19824 } 19825 }, 19826 19827 /* Set as beforeShowDay function to prevent selection of weekends. 19828 * @param date Date - the date to customise 19829 * @return [boolean, string] - is this date selectable?, what is its CSS class? 19830 */ 19831 noWeekends: function( date ) { 19832 var day = date.getDay(); 19833 return [ ( day > 0 && day < 6 ), "" ]; 19834 }, 19835 19836 /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. 19837 * @param date Date - the date to get the week for 19838 * @return number - the number of the week within the year that contains this date 19839 */ 19840 iso8601Week: function( date ) { 19841 var time, 19842 checkDate = new Date( date.getTime() ); 19843 19844 // Find Thursday of this week starting on Monday 19845 checkDate.setDate( checkDate.getDate() + 4 - ( checkDate.getDay() || 7 ) ); 19846 19847 time = checkDate.getTime(); 19848 checkDate.setMonth( 0 ); // Compare with Jan 1 19849 checkDate.setDate( 1 ); 19850 return Math.floor( Math.round( ( time - checkDate ) / 86400000 ) / 7 ) + 1; 19851 }, 19852 19853 /* Parse a string value into a date object. 19854 * See formatDate below for the possible formats. 19855 * 19856 * @param format string - the expected format of the date 19857 * @param value string - the date in the above format 19858 * @param settings Object - attributes include: 19859 * shortYearCutoff number - the cutoff year for determining the century (optional) 19860 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) 19861 * dayNames string[7] - names of the days from Sunday (optional) 19862 * monthNamesShort string[12] - abbreviated names of the months (optional) 19863 * monthNames string[12] - names of the months (optional) 19864 * @return Date - the extracted date value or null if value is blank 19865 */ 19866 parseDate: function( format, value, settings ) { 19867 if ( format == null || value == null ) { 19868 throw "Invalid arguments"; 19869 } 19870 19871 value = ( typeof value === "object" ? value.toString() : value + "" ); 19872 if ( value === "" ) { 19873 return null; 19874 } 19875 19876 var iFormat, dim, extra, 19877 iValue = 0, 19878 shortYearCutoffTemp = ( settings ? settings.shortYearCutoff : null ) || this._defaults.shortYearCutoff, 19879 shortYearCutoff = ( typeof shortYearCutoffTemp !== "string" ? shortYearCutoffTemp : 19880 new Date().getFullYear() % 100 + parseInt( shortYearCutoffTemp, 10 ) ), 19881 dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort, 19882 dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames, 19883 monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort, 19884 monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames, 19885 year = -1, 19886 month = -1, 19887 day = -1, 19888 doy = -1, 19889 literal = false, 19890 date, 19891 19892 // Check whether a format character is doubled 19893 lookAhead = function( match ) { 19894 var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match ); 19895 if ( matches ) { 19896 iFormat++; 19897 } 19898 return matches; 19899 }, 19900 19901 // Extract a number from the string value 19902 getNumber = function( match ) { 19903 var isDoubled = lookAhead( match ), 19904 size = ( match === "@" ? 14 : ( match === "!" ? 20 : 19905 ( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ), 19906 minSize = ( match === "y" ? size : 1 ), 19907 digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ), 19908 num = value.substring( iValue ).match( digits ); 19909 if ( !num ) { 19910 throw "Missing number at position " + iValue; 19911 } 19912 iValue += num[ 0 ].length; 19913 return parseInt( num[ 0 ], 10 ); 19914 }, 19915 19916 // Extract a name from the string value and convert to an index 19917 getName = function( match, shortNames, longNames ) { 19918 var index = -1, 19919 names = $.map( lookAhead( match ) ? longNames : shortNames, function( v, k ) { 19920 return [ [ k, v ] ]; 19921 } ).sort( function( a, b ) { 19922 return -( a[ 1 ].length - b[ 1 ].length ); 19923 } ); 19924 19925 $.each( names, function( i, pair ) { 19926 var name = pair[ 1 ]; 19927 if ( value.substr( iValue, name.length ).toLowerCase() === name.toLowerCase() ) { 19928 index = pair[ 0 ]; 19929 iValue += name.length; 19930 return false; 19931 } 19932 } ); 19933 if ( index !== -1 ) { 19934 return index + 1; 19935 } else { 19936 throw "Unknown name at position " + iValue; 19937 } 19938 }, 19939 19940 // Confirm that a literal character matches the string value 19941 checkLiteral = function() { 19942 if ( value.charAt( iValue ) !== format.charAt( iFormat ) ) { 19943 throw "Unexpected literal at position " + iValue; 19944 } 19945 iValue++; 19946 }; 19947 19948 for ( iFormat = 0; iFormat < format.length; iFormat++ ) { 19949 if ( literal ) { 19950 if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) { 19951 literal = false; 19952 } else { 19953 checkLiteral(); 19954 } 19955 } else { 19956 switch ( format.charAt( iFormat ) ) { 19957 case "d": 19958 day = getNumber( "d" ); 19959 break; 19960 case "D": 19961 getName( "D", dayNamesShort, dayNames ); 19962 break; 19963 case "o": 19964 doy = getNumber( "o" ); 19965 break; 19966 case "m": 19967 month = getNumber( "m" ); 19968 break; 19969 case "M": 19970 month = getName( "M", monthNamesShort, monthNames ); 19971 break; 19972 case "y": 19973 year = getNumber( "y" ); 19974 break; 19975 case "@": 19976 date = new Date( getNumber( "@" ) ); 19977 year = date.getFullYear(); 19978 month = date.getMonth() + 1; 19979 day = date.getDate(); 19980 break; 19981 case "!": 19982 date = new Date( ( getNumber( "!" ) - this._ticksTo1970 ) / 10000 ); 19983 year = date.getFullYear(); 19984 month = date.getMonth() + 1; 19985 day = date.getDate(); 19986 break; 19987 case "'": 19988 if ( lookAhead( "'" ) ) { 19989 checkLiteral(); 19990 } else { 19991 literal = true; 19992 } 19993 break; 19994 default: 19995 checkLiteral(); 19996 } 19997 } 19998 } 19999 20000 if ( iValue < value.length ) { 20001 extra = value.substr( iValue ); 20002 if ( !/^\s+/.test( extra ) ) { 20003 throw "Extra/unparsed characters found in date: " + extra; 20004 } 20005 } 20006 20007 if ( year === -1 ) { 20008 year = new Date().getFullYear(); 20009 } else if ( year < 100 ) { 20010 year += new Date().getFullYear() - new Date().getFullYear() % 100 + 20011 ( year <= shortYearCutoff ? 0 : -100 ); 20012 } 20013 20014 if ( doy > -1 ) { 20015 month = 1; 20016 day = doy; 20017 do { 20018 dim = this._getDaysInMonth( year, month - 1 ); 20019 if ( day <= dim ) { 20020 break; 20021 } 20022 month++; 20023 day -= dim; 20024 } while ( true ); 20025 } 20026 20027 date = this._daylightSavingAdjust( new Date( year, month - 1, day ) ); 20028 if ( date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day ) { 20029 throw "Invalid date"; // E.g. 31/02/00 20030 } 20031 return date; 20032 }, 20033 20034 /* Standard date formats. */ 20035 ATOM: "yy-mm-dd", // RFC 3339 (ISO 8601) 20036 COOKIE: "D, dd M yy", 20037 ISO_8601: "yy-mm-dd", 20038 RFC_822: "D, d M y", 20039 RFC_850: "DD, dd-M-y", 20040 RFC_1036: "D, d M y", 20041 RFC_1123: "D, d M yy", 20042 RFC_2822: "D, d M yy", 20043 RSS: "D, d M y", // RFC 822 20044 TICKS: "!", 20045 TIMESTAMP: "@", 20046 W3C: "yy-mm-dd", // ISO 8601 20047 20048 _ticksTo1970: ( ( ( 1970 - 1 ) * 365 + Math.floor( 1970 / 4 ) - Math.floor( 1970 / 100 ) + 20049 Math.floor( 1970 / 400 ) ) * 24 * 60 * 60 * 10000000 ), 20050 20051 /* Format a date object into a string value. 20052 * The format can be combinations of the following: 20053 * d - day of month (no leading zero) 20054 * dd - day of month (two digit) 20055 * o - day of year (no leading zeros) 20056 * oo - day of year (three digit) 20057 * D - day name short 20058 * DD - day name long 20059 * m - month of year (no leading zero) 20060 * mm - month of year (two digit) 20061 * M - month name short 20062 * MM - month name long 20063 * y - year (two digit) 20064 * yy - year (four digit) 20065 * @ - Unix timestamp (ms since 01/01/1970) 20066 * ! - Windows ticks (100ns since 01/01/0001) 20067 * "..." - literal text 20068 * '' - single quote 20069 *
vendor: 6,198 bytes, lines 20070-20269
20070 * @param format string - the desired format of the date 20071 * @param date Date - the date value to format 20072 * @param settings Object - attributes include: 20073 * dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) 20074 * dayNames string[7] - names of the days from Sunday (optional) 20075 * monthNamesShort string[12] - abbreviated names of the months (optional) 20076 * monthNames string[12] - names of the months (optional) 20077 * @return string - the date in the above format 20078 */ 20079 formatDate: function( format, date, settings ) { 20080 if ( !date ) { 20081 return ""; 20082 } 20083 20084 var iFormat, 20085 dayNamesShort = ( settings ? settings.dayNamesShort : null ) || this._defaults.dayNamesShort, 20086 dayNames = ( settings ? settings.dayNames : null ) || this._defaults.dayNames, 20087 monthNamesShort = ( settings ? settings.monthNamesShort : null ) || this._defaults.monthNamesShort, 20088 monthNames = ( settings ? settings.monthNames : null ) || this._defaults.monthNames, 20089 20090 // Check whether a format character is doubled 20091 lookAhead = function( match ) { 20092 var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match ); 20093 if ( matches ) { 20094 iFormat++; 20095 } 20096 return matches; 20097 }, 20098 20099 // Format a number, with leading zero if necessary 20100 formatNumber = function( match, value, len ) { 20101 var num = "" + value; 20102 if ( lookAhead( match ) ) { 20103 while ( num.length < len ) { 20104 num = "0" + num; 20105 } 20106 } 20107 return num; 20108 }, 20109 20110 // Format a name, short or long as requested 20111 formatName = function( match, value, shortNames, longNames ) { 20112 return ( lookAhead( match ) ? longNames[ value ] : shortNames[ value ] ); 20113 }, 20114 output = "", 20115 literal = false; 20116 20117 if ( date ) { 20118 for ( iFormat = 0; iFormat < format.length; iFormat++ ) { 20119 if ( literal ) { 20120 if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) { 20121 literal = false; 20122 } else { 20123 output += format.charAt( iFormat ); 20124 } 20125 } else { 20126 switch ( format.charAt( iFormat ) ) { 20127 case "d": 20128 output += formatNumber( "d", date.getDate(), 2 ); 20129 break; 20130 case "D": 20131 output += formatName( "D", date.getDay(), dayNamesShort, dayNames ); 20132 break; 20133 case "o": 20134 output += formatNumber( "o", 20135 Math.round( ( new Date( date.getFullYear(), date.getMonth(), date.getDate() ).getTime() - new Date( date.getFullYear(), 0, 0 ).getTime() ) / 86400000 ), 3 ); 20136 break; 20137 case "m": 20138 output += formatNumber( "m", date.getMonth() + 1, 2 ); 20139 break; 20140 case "M": 20141 output += formatName( "M", date.getMonth(), monthNamesShort, monthNames ); 20142 break; 20143 case "y": 20144 output += ( lookAhead( "y" ) ? date.getFullYear() : 20145 ( date.getFullYear() % 100 < 10 ? "0" : "" ) + date.getFullYear() % 100 ); 20146 break; 20147 case "@": 20148 output += date.getTime(); 20149 break; 20150 case "!": 20151 output += date.getTime() * 10000 + this._ticksTo1970; 20152 break; 20153 case "'": 20154 if ( lookAhead( "'" ) ) { 20155 output += "'"; 20156 } else { 20157 literal = true; 20158 } 20159 break; 20160 default: 20161 output += format.charAt( iFormat ); 20162 } 20163 } 20164 } 20165 } 20166 return output; 20167 }, 20168 20169 /* Extract all possible characters from the date format. */ 20170 _possibleChars: function( format ) { 20171 var iFormat, 20172 chars = "", 20173 literal = false, 20174 20175 // Check whether a format character is doubled 20176 lookAhead = function( match ) { 20177 var matches = ( iFormat + 1 < format.length && format.charAt( iFormat + 1 ) === match ); 20178 if ( matches ) { 20179 iFormat++; 20180 } 20181 return matches; 20182 }; 20183 20184 for ( iFormat = 0; iFormat < format.length; iFormat++ ) { 20185 if ( literal ) { 20186 if ( format.charAt( iFormat ) === "'" && !lookAhead( "'" ) ) { 20187 literal = false; 20188 } else { 20189 chars += format.charAt( iFormat ); 20190 } 20191 } else { 20192 switch ( format.charAt( iFormat ) ) { 20193 case "d": case "m": case "y": case "@": 20194 chars += "0123456789"; 20195 break; 20196 case "D": case "M": 20197 return null; // Accept anything 20198 case "'": 20199 if ( lookAhead( "'" ) ) { 20200 chars += "'"; 20201 } else { 20202 literal = true; 20203 } 20204 break; 20205 default: 20206 chars += format.charAt( iFormat ); 20207 } 20208 } 20209 } 20210 return chars; 20211 }, 20212 20213 /* Get a setting value, defaulting if necessary. */ 20214 _get: function( inst, name ) { 20215 return inst.settings[ name ] !== undefined ? 20216 inst.settings[ name ] : this._defaults[ name ]; 20217 }, 20218 20219 /* Parse existing date and initialise date picker. */ 20220 _setDateFromField: function( inst, noDefault ) { 20221 if ( inst.input.val() === inst.lastVal ) { 20222 return; 20223 } 20224 20225 var dateFormat = this._get( inst, "dateFormat" ), 20226 dates = inst.lastVal = inst.input ? inst.input.val() : null, 20227 defaultDate = this._getDefaultDate( inst ), 20228 date = defaultDate, 20229 settings = this._getFormatConfig( inst ); 20230 20231 try { 20232 date = this.parseDate( dateFormat, dates, settings ) || defaultDate; 20233 } catch ( event ) { 20234 dates = ( noDefault ? "" : dates ); 20235 } 20236 inst.selectedDay = date.getDate(); 20237 inst.drawMonth = inst.selectedMonth = date.getMonth(); 20238 inst.drawYear = inst.selectedYear = date.getFullYear(); 20239 inst.currentDay = ( dates ? date.getDate() : 0 ); 20240 inst.currentMonth = ( dates ? date.getMonth() : 0 ); 20241 inst.currentYear = ( dates ? date.getFullYear() : 0 ); 20242 this._adjustInstDate( inst ); 20243 }, 20244 20245 /* Retrieve the default date shown on opening. */ 20246 _getDefaultDate: function( inst ) { 20247 return this._restrictMinMax( inst, 20248 this._determineDate( inst, this._get( inst, "defaultDate" ), new Date() ) ); 20249 }, 20250 20251 /* A date may be specified as an exact value or a relative one. */ 20252 _determineDate: function( inst, date, defaultDate ) { 20253 var offsetNumeric = function( offset ) { 20254 var date = new Date(); 20255 date.setDate( date.getDate() + offset ); 20256 return date; 20257 }, 20258 offsetString = function( offset ) { 20259 try { 20260 return $.datepicker.parseDate( $.datepicker._get( inst, "dateFormat" ), 20261 offset, $.datepicker._getFormatConfig( inst ) ); 20262 } catch ( e ) { 20263 20264 // Ignore 20265 } 20266 20267 var date = ( offset.toLowerCase().match( /^c/ ) ? 20268 $.datepicker._getDate( inst ) : null ) || new Date(), 20269 year = date.getFullYear(),
vendor: 26,616 bytes, lines 20270-20923
20270 month = date.getMonth(), 20271 day = date.getDate(), 20272 pattern = /([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g, 20273 matches = pattern.exec( offset ); 20274 20275 while ( matches ) { 20276 switch ( matches[ 2 ] || "d" ) { 20277 case "d" : case "D" : 20278 day += parseInt( matches[ 1 ], 10 ); break; 20279 case "w" : case "W" : 20280 day += parseInt( matches[ 1 ], 10 ) * 7; break; 20281 case "m" : case "M" : 20282 month += parseInt( matches[ 1 ], 10 ); 20283 day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) ); 20284 break; 20285 case "y": case "Y" : 20286 year += parseInt( matches[ 1 ], 10 ); 20287 day = Math.min( day, $.datepicker._getDaysInMonth( year, month ) ); 20288 break; 20289 } 20290 matches = pattern.exec( offset ); 20291 } 20292 return new Date( year, month, day ); 20293 }, 20294 newDate = ( date == null || date === "" ? defaultDate : ( typeof date === "string" ? offsetString( date ) : 20295 ( typeof date === "number" ? ( isNaN( date ) ? defaultDate : offsetNumeric( date ) ) : new Date( date.getTime() ) ) ) ); 20296 20297 newDate = ( newDate && newDate.toString() === "Invalid Date" ? defaultDate : newDate ); 20298 if ( newDate ) { 20299 newDate.setHours( 0 ); 20300 newDate.setMinutes( 0 ); 20301 newDate.setSeconds( 0 ); 20302 newDate.setMilliseconds( 0 ); 20303 } 20304 return this._daylightSavingAdjust( newDate ); 20305 }, 20306 20307 /* Handle switch to/from daylight saving. 20308 * Hours may be non-zero on daylight saving cut-over: 20309 * > 12 when midnight changeover, but then cannot generate 20310 * midnight datetime, so jump to 1AM, otherwise reset. 20311 * @param date (Date) the date to check 20312 * @return (Date) the corrected date 20313 */ 20314 _daylightSavingAdjust: function( date ) { 20315 if ( !date ) { 20316 return null; 20317 } 20318 date.setHours( date.getHours() > 12 ? date.getHours() + 2 : 0 ); 20319 return date; 20320 }, 20321 20322 /* Set the date(s) directly. */ 20323 _setDate: function( inst, date, noChange ) { 20324 var clear = !date, 20325 origMonth = inst.selectedMonth, 20326 origYear = inst.selectedYear, 20327 newDate = this._restrictMinMax( inst, this._determineDate( inst, date, new Date() ) ); 20328 20329 inst.selectedDay = inst.currentDay = newDate.getDate(); 20330 inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); 20331 inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); 20332 if ( ( origMonth !== inst.selectedMonth || origYear !== inst.selectedYear ) && !noChange ) { 20333 this._notifyChange( inst ); 20334 } 20335 this._adjustInstDate( inst ); 20336 if ( inst.input ) { 20337 inst.input.val( clear ? "" : this._formatDate( inst ) ); 20338 } 20339 }, 20340 20341 /* Retrieve the date(s) directly. */ 20342 _getDate: function( inst ) { 20343 var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null : 20344 this._daylightSavingAdjust( new Date( 20345 inst.currentYear, inst.currentMonth, inst.currentDay ) ) ); 20346 return startDate; 20347 }, 20348 20349 /* Attach the onxxx handlers. These are declared statically so 20350 * they work with static code transformers like Caja. 20351 */ 20352 _attachHandlers: function( inst ) { 20353 var stepMonths = this._get( inst, "stepMonths" ), 20354 id = "#" + inst.id.replace( /\\\\/g, "\\" ); 20355 inst.dpDiv.find( "[data-handler]" ).map( function() { 20356 var handler = { 20357 prev: function() { 20358 $.datepicker._adjustDate( id, -stepMonths, "M" ); 20359 }, 20360 next: function() { 20361 $.datepicker._adjustDate( id, +stepMonths, "M" ); 20362 }, 20363 hide: function() { 20364 $.datepicker._hideDatepicker(); 20365 }, 20366 today: function() { 20367 $.datepicker._gotoToday( id ); 20368 }, 20369 selectDay: function() { 20370 $.datepicker._selectDay( id, +this.getAttribute( "data-month" ), +this.getAttribute( "data-year" ), this ); 20371 return false; 20372 }, 20373 selectMonth: function() { 20374 $.datepicker._selectMonthYear( id, this, "M" ); 20375 return false; 20376 }, 20377 selectYear: function() { 20378 $.datepicker._selectMonthYear( id, this, "Y" ); 20379 return false; 20380 } 20381 }; 20382 $( this ).on( this.getAttribute( "data-event" ), handler[ this.getAttribute( "data-handler" ) ] ); 20383 } ); 20384 }, 20385 20386 /* Generate the HTML for the current state of the date picker. */ 20387 _generateHTML: function( inst ) { 20388 var maxDraw, prevText, prev, nextText, next, currentText, gotoDate, 20389 controls, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin, 20390 monthNames, monthNamesShort, beforeShowDay, showOtherMonths, 20391 selectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate, 20392 cornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows, 20393 printDate, dRow, tbody, daySettings, otherMonth, unselectable, 20394 tempDate = new Date(), 20395 today = this._daylightSavingAdjust( 20396 new Date( tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate() ) ), // clear time 20397 isRTL = this._get( inst, "isRTL" ), 20398 showButtonPanel = this._get( inst, "showButtonPanel" ), 20399 hideIfNoPrevNext = this._get( inst, "hideIfNoPrevNext" ), 20400 navigationAsDateFormat = this._get( inst, "navigationAsDateFormat" ), 20401 numMonths = this._getNumberOfMonths( inst ), 20402 showCurrentAtPos = this._get( inst, "showCurrentAtPos" ), 20403 stepMonths = this._get( inst, "stepMonths" ), 20404 isMultiMonth = ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ), 20405 currentDate = this._daylightSavingAdjust( ( !inst.currentDay ? new Date( 9999, 9, 9 ) : 20406 new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ), 20407 minDate = this._getMinMaxDate( inst, "min" ), 20408 maxDate = this._getMinMaxDate( inst, "max" ), 20409 drawMonth = inst.drawMonth - showCurrentAtPos, 20410 drawYear = inst.drawYear; 20411 20412 if ( drawMonth < 0 ) { 20413 drawMonth += 12; 20414 drawYear--; 20415 } 20416 if ( maxDate ) { 20417 maxDraw = this._daylightSavingAdjust( new Date( maxDate.getFullYear(), 20418 maxDate.getMonth() - ( numMonths[ 0 ] * numMonths[ 1 ] ) + 1, maxDate.getDate() ) ); 20419 maxDraw = ( minDate && maxDraw < minDate ? minDate : maxDraw ); 20420 while ( this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 ) ) > maxDraw ) { 20421 drawMonth--; 20422 if ( drawMonth < 0 ) { 20423 drawMonth = 11; 20424 drawYear--; 20425 } 20426 } 20427 } 20428 inst.drawMonth = drawMonth; 20429 inst.drawYear = drawYear; 20430 20431 prevText = this._get( inst, "prevText" ); 20432 prevText = ( !navigationAsDateFormat ? prevText : this.formatDate( prevText, 20433 this._daylightSavingAdjust( new Date( drawYear, drawMonth - stepMonths, 1 ) ), 20434 this._getFormatConfig( inst ) ) ); 20435 20436 if ( this._canAdjustMonth( inst, -1, drawYear, drawMonth ) ) { 20437 prev = $( "<a>" ) 20438 .attr( { 20439 "class": "ui-datepicker-prev ui-corner-all", 20440 "data-handler": "prev", 20441 "data-event": "click", 20442 title: prevText 20443 } ) 20444 .append( 20445 $( "<span>" ) 20446 .addClass( "ui-icon ui-icon-circle-triangle-" + 20447 ( isRTL ? "e" : "w" ) ) 20448 .text( prevText ) 20449 )[ 0 ].outerHTML; 20450 } else if ( hideIfNoPrevNext ) { 20451 prev = ""; 20452 } else { 20453 prev = $( "<a>" ) 20454 .attr( { 20455 "class": "ui-datepicker-prev ui-corner-all ui-state-disabled", 20456 title: prevText 20457 } ) 20458 .append( 20459 $( "<span>" ) 20460 .addClass( "ui-icon ui-icon-circle-triangle-" + 20461 ( isRTL ? "e" : "w" ) ) 20462 .text( prevText ) 20463 )[ 0 ].outerHTML; 20464 } 20465 20466 nextText = this._get( inst, "nextText" ); 20467 nextText = ( !navigationAsDateFormat ? nextText : this.formatDate( nextText, 20468 this._daylightSavingAdjust( new Date( drawYear, drawMonth + stepMonths, 1 ) ), 20469 this._getFormatConfig( inst ) ) ); 20470 20471 if ( this._canAdjustMonth( inst, +1, drawYear, drawMonth ) ) { 20472 next = $( "<a>" ) 20473 .attr( { 20474 "class": "ui-datepicker-next ui-corner-all", 20475 "data-handler": "next", 20476 "data-event": "click", 20477 title: nextText 20478 } ) 20479 .append( 20480 $( "<span>" ) 20481 .addClass( "ui-icon ui-icon-circle-triangle-" + 20482 ( isRTL ? "w" : "e" ) ) 20483 .text( nextText ) 20484 )[ 0 ].outerHTML; 20485 } else if ( hideIfNoPrevNext ) { 20486 next = ""; 20487 } else { 20488 next = $( "<a>" ) 20489 .attr( { 20490 "class": "ui-datepicker-next ui-corner-all ui-state-disabled", 20491 title: nextText 20492 } ) 20493 .append( 20494 $( "<span>" ) 20495 .attr( "class", "ui-icon ui-icon-circle-triangle-" + 20496 ( isRTL ? "w" : "e" ) ) 20497 .text( nextText ) 20498 )[ 0 ].outerHTML; 20499 } 20500 20501 currentText = this._get( inst, "currentText" ); 20502 gotoDate = ( this._get( inst, "gotoCurrent" ) && inst.currentDay ? currentDate : today ); 20503 currentText = ( !navigationAsDateFormat ? currentText : 20504 this.formatDate( currentText, gotoDate, this._getFormatConfig( inst ) ) ); 20505 20506 controls = ""; 20507 if ( !inst.inline ) { 20508 controls = $( "<button>" ) 20509 .attr( { 20510 type: "button", 20511 "class": "ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all", 20512 "data-handler": "hide", 20513 "data-event": "click" 20514 } ) 20515 .text( this._get( inst, "closeText" ) )[ 0 ].outerHTML; 20516 } 20517 20518 buttonPanel = ""; 20519 if ( showButtonPanel ) { 20520 buttonPanel = $( "<div class='ui-datepicker-buttonpane ui-widget-content'>" ) 20521 .append( isRTL ? controls : "" ) 20522 .append( this._isInRange( inst, gotoDate ) ? 20523 $( "<button>" ) 20524 .attr( { 20525 type: "button", 20526 "class": "ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all", 20527 "data-handler": "today", 20528 "data-event": "click" 20529 } ) 20530 .text( currentText ) : 20531 "" ) 20532 .append( isRTL ? "" : controls )[ 0 ].outerHTML; 20533 } 20534 20535 firstDay = parseInt( this._get( inst, "firstDay" ), 10 ); 20536 firstDay = ( isNaN( firstDay ) ? 0 : firstDay ); 20537 20538 showWeek = this._get( inst, "showWeek" ); 20539 dayNames = this._get( inst, "dayNames" ); 20540 dayNamesMin = this._get( inst, "dayNamesMin" ); 20541 monthNames = this._get( inst, "monthNames" ); 20542 monthNamesShort = this._get( inst, "monthNamesShort" ); 20543 beforeShowDay = this._get( inst, "beforeShowDay" ); 20544 showOtherMonths = this._get( inst, "showOtherMonths" ); 20545 selectOtherMonths = this._get( inst, "selectOtherMonths" ); 20546 defaultDate = this._getDefaultDate( inst ); 20547 html = ""; 20548 20549 for ( row = 0; row < numMonths[ 0 ]; row++ ) { 20550 group = ""; 20551 this.maxRows = 4; 20552 for ( col = 0; col < numMonths[ 1 ]; col++ ) { 20553 selectedDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, inst.selectedDay ) ); 20554 cornerClass = " ui-corner-all"; 20555 calender = ""; 20556 if ( isMultiMonth ) { 20557 calender += "<div class='ui-datepicker-group"; 20558 if ( numMonths[ 1 ] > 1 ) { 20559 switch ( col ) { 20560 case 0: calender += " ui-datepicker-group-first"; 20561 cornerClass = " ui-corner-" + ( isRTL ? "right" : "left" ); break; 20562 case numMonths[ 1 ] - 1: calender += " ui-datepicker-group-last"; 20563 cornerClass = " ui-corner-" + ( isRTL ? "left" : "right" ); break; 20564 default: calender += " ui-datepicker-group-middle"; cornerClass = ""; break; 20565 } 20566 } 20567 calender += "'>"; 20568 } 20569 calender += "<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix" + cornerClass + "'>" + 20570 ( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) + 20571 ( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) + 20572 this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate, 20573 row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers 20574 "</div><table class='ui-datepicker-calendar'><thead>" + 20575 "<tr>"; 20576 thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" ); 20577 for ( dow = 0; dow < 7; dow++ ) { // days of the week 20578 day = ( dow + firstDay ) % 7; 20579 thead += "<th scope='col'" + ( ( dow + firstDay + 6 ) % 7 >= 5 ? " class='ui-datepicker-week-end'" : "" ) + ">" + 20580 "<span title='" + dayNames[ day ] + "'>" + dayNamesMin[ day ] + "</span></th>"; 20581 } 20582 calender += thead + "</tr></thead><tbody>"; 20583 daysInMonth = this._getDaysInMonth( drawYear, drawMonth ); 20584 if ( drawYear === inst.selectedYear && drawMonth === inst.selectedMonth ) { 20585 inst.selectedDay = Math.min( inst.selectedDay, daysInMonth ); 20586 } 20587 leadDays = ( this._getFirstDayOfMonth( drawYear, drawMonth ) - firstDay + 7 ) % 7; 20588 curRows = Math.ceil( ( leadDays + daysInMonth ) / 7 ); // calculate the number of rows to generate 20589 numRows = ( isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows ); //If multiple months, use the higher number of rows (see #7043) 20590 this.maxRows = numRows; 20591 printDate = this._daylightSavingAdjust( new Date( drawYear, drawMonth, 1 - leadDays ) ); 20592 for ( dRow = 0; dRow < numRows; dRow++ ) { // create date picker rows 20593 calender += "<tr>"; 20594 tbody = ( !showWeek ? "" : "<td class='ui-datepicker-week-col'>" + 20595 this._get( inst, "calculateWeek" )( printDate ) + "</td>" ); 20596 for ( dow = 0; dow < 7; dow++ ) { // create date picker days 20597 daySettings = ( beforeShowDay ? 20598 beforeShowDay.apply( ( inst.input ? inst.input[ 0 ] : null ), [ printDate ] ) : [ true, "" ] ); 20599 otherMonth = ( printDate.getMonth() !== drawMonth ); 20600 unselectable = ( otherMonth && !selectOtherMonths ) || !daySettings[ 0 ] || 20601 ( minDate && printDate < minDate ) || ( maxDate && printDate > maxDate ); 20602 tbody += "<td class='" + 20603 ( ( dow + firstDay + 6 ) % 7 >= 5 ? " ui-datepicker-week-end" : "" ) + // highlight weekends 20604 ( otherMonth ? " ui-datepicker-other-month" : "" ) + // highlight days from other months 20605 ( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key 20606 ( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ? 20607 20608 // or defaultDate is current printedDate and defaultDate is selectedDate 20609 " " + this._dayOverClass : "" ) + // highlight selected day 20610 ( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) + // highlight unselectable days 20611 ( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates 20612 ( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day 20613 ( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different) 20614 ( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "'" ) + "'" : "" ) + // cell title 20615 ( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions 20616 ( otherMonth && !showOtherMonths ? " " : // display for other months 20617 ( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" + 20618 ( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) + 20619 ( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day 20620 ( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months 20621 "' href='#' aria-current='" + ( printDate.getTime() === currentDate.getTime() ? "true" : "false" ) + // mark date as selected for screen reader 20622 "' data-date='" + printDate.getDate() + // store date as data 20623 "'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date 20624 printDate.setDate( printDate.getDate() + 1 ); 20625 printDate = this._daylightSavingAdjust( printDate ); 20626 } 20627 calender += tbody + "</tr>"; 20628 } 20629 drawMonth++; 20630 if ( drawMonth > 11 ) { 20631 drawMonth = 0; 20632 drawYear++; 20633 } 20634 calender += "</tbody></table>" + ( isMultiMonth ? "</div>" + 20635 ( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" ); 20636 group += calender; 20637 } 20638 html += group; 20639 } 20640 html += buttonPanel; 20641 inst._keyEvent = false; 20642 return html; 20643 }, 20644 20645 /* Generate the month and year header. */ 20646 _generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate, 20647 secondary, monthNames, monthNamesShort ) { 20648 20649 var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear, 20650 changeMonth = this._get( inst, "changeMonth" ), 20651 changeYear = this._get( inst, "changeYear" ), 20652 showMonthAfterYear = this._get( inst, "showMonthAfterYear" ), 20653 selectMonthLabel = this._get( inst, "selectMonthLabel" ), 20654 selectYearLabel = this._get( inst, "selectYearLabel" ), 20655 html = "<div class='ui-datepicker-title'>", 20656 monthHtml = ""; 20657 20658 // Month selection 20659 if ( secondary || !changeMonth ) { 20660 monthHtml += "<span class='ui-datepicker-month'>" + monthNames[ drawMonth ] + "</span>"; 20661 } else { 20662 inMinYear = ( minDate && minDate.getFullYear() === drawYear ); 20663 inMaxYear = ( maxDate && maxDate.getFullYear() === drawYear ); 20664 monthHtml += "<select class='ui-datepicker-month' aria-label='" + selectMonthLabel + "' data-handler='selectMonth' data-event='change'>"; 20665 for ( month = 0; month < 12; month++ ) { 20666 if ( ( !inMinYear || month >= minDate.getMonth() ) && ( !inMaxYear || month <= maxDate.getMonth() ) ) { 20667 monthHtml += "<option value='" + month + "'" + 20668 ( month === drawMonth ? " selected='selected'" : "" ) + 20669 ">" + monthNamesShort[ month ] + "</option>"; 20670 } 20671 } 20672 monthHtml += "</select>"; 20673 } 20674 20675 if ( !showMonthAfterYear ) { 20676 html += monthHtml + ( secondary || !( changeMonth && changeYear ) ? " " : "" ); 20677 } 20678 20679 // Year selection 20680 if ( !inst.yearshtml ) { 20681 inst.yearshtml = ""; 20682 if ( secondary || !changeYear ) { 20683 html += "<span class='ui-datepicker-year'>" + drawYear + "</span>"; 20684 } else { 20685 20686 // determine range of years to display 20687 years = this._get( inst, "yearRange" ).split( ":" ); 20688 thisYear = new Date().getFullYear(); 20689 determineYear = function( value ) { 20690 var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) : 20691 ( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) : 20692 parseInt( value, 10 ) ) ); 20693 return ( isNaN( year ) ? thisYear : year ); 20694 }; 20695 year = determineYear( years[ 0 ] ); 20696 endYear = Math.max( year, determineYear( years[ 1 ] || "" ) ); 20697 year = ( minDate ? Math.max( year, minDate.getFullYear() ) : year ); 20698 endYear = ( maxDate ? Math.min( endYear, maxDate.getFullYear() ) : endYear ); 20699 inst.yearshtml += "<select class='ui-datepicker-year' aria-label='" + selectYearLabel + "' data-handler='selectYear' data-event='change'>"; 20700 for ( ; year <= endYear; year++ ) { 20701 inst.yearshtml += "<option value='" + year + "'" + 20702 ( year === drawYear ? " selected='selected'" : "" ) + 20703 ">" + year + "</option>"; 20704 } 20705 inst.yearshtml += "</select>"; 20706 20707 html += inst.yearshtml; 20708 inst.yearshtml = null; 20709 } 20710 } 20711 20712 html += this._get( inst, "yearSuffix" ); 20713 if ( showMonthAfterYear ) { 20714 html += ( secondary || !( changeMonth && changeYear ) ? " " : "" ) + monthHtml; 20715 } 20716 html += "</div>"; // Close datepicker_header 20717 return html; 20718 }, 20719 20720 /* Adjust one of the date sub-fields. */ 20721 _adjustInstDate: function( inst, offset, period ) { 20722 var year = inst.selectedYear + ( period === "Y" ? offset : 0 ), 20723 month = inst.selectedMonth + ( period === "M" ? offset : 0 ), 20724 day = Math.min( inst.selectedDay, this._getDaysInMonth( year, month ) ) + ( period === "D" ? offset : 0 ), 20725 date = this._restrictMinMax( inst, this._daylightSavingAdjust( new Date( year, month, day ) ) ); 20726 20727 inst.selectedDay = date.getDate(); 20728 inst.drawMonth = inst.selectedMonth = date.getMonth(); 20729 inst.drawYear = inst.selectedYear = date.getFullYear(); 20730 if ( period === "M" || period === "Y" ) { 20731 this._notifyChange( inst ); 20732 } 20733 }, 20734 20735 /* Ensure a date is within any min/max bounds. */ 20736 _restrictMinMax: function( inst, date ) { 20737 var minDate = this._getMinMaxDate( inst, "min" ), 20738 maxDate = this._getMinMaxDate( inst, "max" ), 20739 newDate = ( minDate && date < minDate ? minDate : date ); 20740 return ( maxDate && newDate > maxDate ? maxDate : newDate ); 20741 }, 20742 20743 /* Notify change of month/year. */ 20744 _notifyChange: function( inst ) { 20745 var onChange = this._get( inst, "onChangeMonthYear" ); 20746 if ( onChange ) { 20747 onChange.apply( ( inst.input ? inst.input[ 0 ] : null ), 20748 [ inst.selectedYear, inst.selectedMonth + 1, inst ] ); 20749 } 20750 }, 20751 20752 /* Determine the number of months to show. */ 20753 _getNumberOfMonths: function( inst ) { 20754 var numMonths = this._get( inst, "numberOfMonths" ); 20755 return ( numMonths == null ? [ 1, 1 ] : ( typeof numMonths === "number" ? [ 1, numMonths ] : numMonths ) ); 20756 }, 20757 20758 /* Determine the current maximum date - ensure no time components are set. */ 20759 _getMinMaxDate: function( inst, minMax ) { 20760 return this._determineDate( inst, this._get( inst, minMax + "Date" ), null ); 20761 }, 20762 20763 /* Find the number of days in a given month. */ 20764 _getDaysInMonth: function( year, month ) { 20765 return 32 - this._daylightSavingAdjust( new Date( year, month, 32 ) ).getDate(); 20766 }, 20767 20768 /* Find the day of the week of the first of a month. */ 20769 _getFirstDayOfMonth: function( year, month ) { 20770 return new Date( year, month, 1 ).getDay(); 20771 }, 20772 20773 /* Determines if we should allow a "next/prev" month display change. */ 20774 _canAdjustMonth: function( inst, offset, curYear, curMonth ) { 20775 var numMonths = this._getNumberOfMonths( inst ), 20776 date = this._daylightSavingAdjust( new Date( curYear, 20777 curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) ); 20778 20779 if ( offset < 0 ) { 20780 date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) ); 20781 } 20782 return this._isInRange( inst, date ); 20783 }, 20784 20785 /* Is the given date in the accepted range? */ 20786 _isInRange: function( inst, date ) { 20787 var yearSplit, currentYear, 20788 minDate = this._getMinMaxDate( inst, "min" ), 20789 maxDate = this._getMinMaxDate( inst, "max" ), 20790 minYear = null, 20791 maxYear = null, 20792 years = this._get( inst, "yearRange" ); 20793 if ( years ) { 20794 yearSplit = years.split( ":" ); 20795 currentYear = new Date().getFullYear(); 20796 minYear = parseInt( yearSplit[ 0 ], 10 ); 20797 maxYear = parseInt( yearSplit[ 1 ], 10 ); 20798 if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) { 20799 minYear += currentYear; 20800 } 20801 if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) { 20802 maxYear += currentYear; 20803 } 20804 } 20805 20806 return ( ( !minDate || date.getTime() >= minDate.getTime() ) && 20807 ( !maxDate || date.getTime() <= maxDate.getTime() ) && 20808 ( !minYear || date.getFullYear() >= minYear ) && 20809 ( !maxYear || date.getFullYear() <= maxYear ) ); 20810 }, 20811 20812 /* Provide the configuration settings for formatting/parsing. */ 20813 _getFormatConfig: function( inst ) { 20814 var shortYearCutoff = this._get( inst, "shortYearCutoff" ); 20815 shortYearCutoff = ( typeof shortYearCutoff !== "string" ? shortYearCutoff : 20816 new Date().getFullYear() % 100 + parseInt( shortYearCutoff, 10 ) ); 20817 return { shortYearCutoff: shortYearCutoff, 20818 dayNamesShort: this._get( inst, "dayNamesShort" ), dayNames: this._get( inst, "dayNames" ), 20819 monthNamesShort: this._get( inst, "monthNamesShort" ), monthNames: this._get( inst, "monthNames" ) }; 20820 }, 20821 20822 /* Format the given date for display. */ 20823 _formatDate: function( inst, day, month, year ) { 20824 if ( !day ) { 20825 inst.currentDay = inst.selectedDay; 20826 inst.currentMonth = inst.selectedMonth; 20827 inst.currentYear = inst.selectedYear; 20828 } 20829 var date = ( day ? ( typeof day === "object" ? day : 20830 this._daylightSavingAdjust( new Date( year, month, day ) ) ) : 20831 this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) ); 20832 return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) ); 20833 } 20834} ); 20835 20836/* 20837 * Bind hover events for datepicker elements. 20838 * Done via delegate so the binding only occurs once in the lifetime of the parent div. 20839 * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker. 20840 */ 20841function datepicker_bindHover( dpDiv ) { 20842 var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a"; 20843 return dpDiv.on( "mouseout", selector, function() { 20844 $( this ).removeClass( "ui-state-hover" ); 20845 if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) { 20846 $( this ).removeClass( "ui-datepicker-prev-hover" ); 20847 } 20848 if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) { 20849 $( this ).removeClass( "ui-datepicker-next-hover" ); 20850 } 20851 } ) 20852 .on( "mouseover", selector, datepicker_handleMouseover ); 20853} 20854 20855function datepicker_handleMouseover() { 20856 if ( !$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? datepicker_instActive.dpDiv.parent()[ 0 ] : datepicker_instActive.input[ 0 ] ) ) { 20857 $( this ).parents( ".ui-datepicker-calendar" ).find( "a" ).removeClass( "ui-state-hover" ); 20858 $( this ).addClass( "ui-state-hover" ); 20859 if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) { 20860 $( this ).addClass( "ui-datepicker-prev-hover" ); 20861 } 20862 if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) { 20863 $( this ).addClass( "ui-datepicker-next-hover" ); 20864 } 20865 } 20866} 20867 20868/* jQuery extend now ignores nulls! */ 20869function datepicker_extendRemove( target, props ) { 20870 $.extend( target, props ); 20871 for ( var name in props ) { 20872 if ( props[ name ] == null ) { 20873 target[ name ] = props[ name ]; 20874 } 20875 } 20876 return target; 20877} 20878 20879/* Invoke the datepicker functionality. 20880 @param options string - a command, optionally followed by additional parameters or 20881 Object - settings for attaching new datepicker functionality 20882 @return jQuery object */ 20883$.fn.datepicker = function( options ) { 20884 20885 /* Verify an empty collection wasn't passed - Fixes #6976 */ 20886 if ( !this.length ) { 20887 return this; 20888 } 20889 20890 /* Initialise the date picker. */ 20891 if ( !$.datepicker.initialized ) { 20892 $( document ).on( "mousedown", $.datepicker._checkExternalClick ); 20893 $.datepicker.initialized = true; 20894 } 20895 20896 /* Append datepicker main container to body if not exist. */ 20897 if ( $( "#" + $.datepicker._mainDivId ).length === 0 ) { 20898 $( "body" ).append( $.datepicker.dpDiv ); 20899 } 20900 20901 var otherArgs = Array.prototype.slice.call( arguments, 1 ); 20902 if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) { 20903 return $.datepicker[ "_" + options + "Datepicker" ]. 20904 apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) ); 20905 } 20906 if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) { 20907 return $.datepicker[ "_" + options + "Datepicker" ]. 20908 apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) ); 20909 } 20910 return this.each( function() { 20911 if ( typeof options === "string" ) { 20912 $.datepicker[ "_" + options + "Datepicker" ] 20913 .apply( $.datepicker, [ this ].concat( otherArgs ) ); 20914 } else { 20915 $.datepicker._attachDatepicker( this, options ); 20916 } 20917 } ); 20918}; 20919 20920$.datepicker = new Datepicker(); // singleton instance 20921$.datepicker.initialized = false; 20922$.datepicker.uuid = new Date().getTime(); 20923$.datepicker.version = "1.1
vendor: 7,560 bytes, lines 20923-21212
209233.2"; 20924 20925var widgetsDatepicker = $.datepicker; 20926 20927 20928 20929// This file is deprecated 20930var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); 20931 20932/*! 20933 * jQuery UI Mouse 1.13.2 20934 * http://jqueryui.com 20935 * 20936 * Copyright jQuery Foundation and other contributors 20937 * Released under the MIT license. 20938 * http://jquery.org/license 20939 */ 20940 20941//>>label: Mouse 20942//>>group: Widgets 20943//>>description: Abstracts mouse-based interactions to assist in creating certain widgets. 20944//>>docs: http://api.jqueryui.com/mouse/ 20945 20946 20947var mouseHandled = false; 20948$( document ).on( "mouseup", function() { 20949 mouseHandled = false; 20950} ); 20951 20952var widgetsMouse = $.widget( "ui.mouse", { 20953 version: "1.13.2", 20954 options: { 20955 cancel: "input, textarea, button, select, option", 20956 distance: 1, 20957 delay: 0 20958 }, 20959 _mouseInit: function() { 20960 var that = this; 20961 20962 this.element 20963 .on( "mousedown." + this.widgetName, function( event ) { 20964 return that._mouseDown( event ); 20965 } ) 20966 .on( "click." + this.widgetName, function( event ) { 20967 if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) { 20968 $.removeData( event.target, that.widgetName + ".preventClickEvent" ); 20969 event.stopImmediatePropagation(); 20970 return false; 20971 } 20972 } ); 20973 20974 this.started = false; 20975 }, 20976 20977 // TODO: make sure destroying one instance of mouse doesn't mess with 20978 // other instances of mouse 20979 _mouseDestroy: function() { 20980 this.element.off( "." + this.widgetName ); 20981 if ( this._mouseMoveDelegate ) { 20982 this.document 20983 .off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) 20984 .off( "mouseup." + this.widgetName, this._mouseUpDelegate ); 20985 } 20986 }, 20987 20988 _mouseDown: function( event ) { 20989 20990 // don't let more than one widget handle mouseStart 20991 if ( mouseHandled ) { 20992 return; 20993 } 20994 20995 this._mouseMoved = false; 20996 20997 // We may have missed mouseup (out of window) 20998 if ( this._mouseStarted ) { 20999 this._mouseUp( event ); 21000 } 21001 21002 this._mouseDownEvent = event; 21003 21004 var that = this, 21005 btnIsLeft = ( event.which === 1 ), 21006 21007 // event.target.nodeName works around a bug in IE 8 with 21008 // disabled inputs (#7620) 21009 elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ? 21010 $( event.target ).closest( this.options.cancel ).length : false ); 21011 if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) { 21012 return true; 21013 } 21014 21015 this.mouseDelayMet = !this.options.delay; 21016 if ( !this.mouseDelayMet ) { 21017 this._mouseDelayTimer = setTimeout( function() { 21018 that.mouseDelayMet = true; 21019 }, this.options.delay ); 21020 } 21021 21022 if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { 21023 this._mouseStarted = ( this._mouseStart( event ) !== false ); 21024 if ( !this._mouseStarted ) { 21025 event.preventDefault(); 21026 return true; 21027 } 21028 } 21029 21030 // Click event may never have fired (Gecko & Opera) 21031 if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) { 21032 $.removeData( event.target, this.widgetName + ".preventClickEvent" ); 21033 } 21034 21035 // These delegates are required to keep context 21036 this._mouseMoveDelegate = function( event ) { 21037 return that._mouseMove( event ); 21038 }; 21039 this._mouseUpDelegate = function( event ) { 21040 return that._mouseUp( event ); 21041 }; 21042 21043 this.document 21044 .on( "mousemove." + this.widgetName, this._mouseMoveDelegate ) 21045 .on( "mouseup." + this.widgetName, this._mouseUpDelegate ); 21046 21047 event.preventDefault(); 21048 21049 mouseHandled = true; 21050 return true; 21051 }, 21052 21053 _mouseMove: function( event ) { 21054 21055 // Only check for mouseups outside the document if you've moved inside the document 21056 // at least once. This prevents the firing of mouseup in the case of IE<9, which will 21057 // fire a mousemove event if content is placed under the cursor. See #7778 21058 // Support: IE <9 21059 if ( this._mouseMoved ) { 21060 21061 // IE mouseup check - mouseup happened when mouse was out of window 21062 if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && 21063 !event.button ) { 21064 return this._mouseUp( event ); 21065 21066 // Iframe mouseup check - mouseup occurred in another document 21067 } else if ( !event.which ) { 21068 21069 // Support: Safari <=8 - 9 21070 // Safari sets which to 0 if you press any of the following keys 21071 // during a drag (#14461) 21072 if ( event.originalEvent.altKey || event.originalEvent.ctrlKey || 21073 event.originalEvent.metaKey || event.originalEvent.shiftKey ) { 21074 this.ignoreMissingWhich = true; 21075 } else if ( !this.ignoreMissingWhich ) { 21076 return this._mouseUp( event ); 21077 } 21078 } 21079 } 21080 21081 if ( event.which || event.button ) { 21082 this._mouseMoved = true; 21083 } 21084 21085 if ( this._mouseStarted ) { 21086 this._mouseDrag( event ); 21087 return event.preventDefault(); 21088 } 21089 21090 if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { 21091 this._mouseStarted = 21092 ( this._mouseStart( this._mouseDownEvent, event ) !== false ); 21093 if ( this._mouseStarted ) { 21094 this._mouseDrag( event ); 21095 } else { 21096 this._mouseUp( event ); 21097 } 21098 } 21099 21100 return !this._mouseStarted; 21101 }, 21102 21103 _mouseUp: function( event ) { 21104 this.document 21105 .off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) 21106 .off( "mouseup." + this.widgetName, this._mouseUpDelegate ); 21107 21108 if ( this._mouseStarted ) { 21109 this._mouseStarted = false; 21110 21111 if ( event.target === this._mouseDownEvent.target ) { 21112 $.data( event.target, this.widgetName + ".preventClickEvent", true ); 21113 } 21114 21115 this._mouseStop( event ); 21116 } 21117 21118 if ( this._mouseDelayTimer ) { 21119 clearTimeout( this._mouseDelayTimer ); 21120 delete this._mouseDelayTimer; 21121 } 21122 21123 this.ignoreMissingWhich = false; 21124 mouseHandled = false; 21125 event.preventDefault(); 21126 }, 21127 21128 _mouseDistanceMet: function( event ) { 21129 return ( Math.max( 21130 Math.abs( this._mouseDownEvent.pageX - event.pageX ), 21131 Math.abs( this._mouseDownEvent.pageY - event.pageY ) 21132 ) >= this.options.distance 21133 ); 21134 }, 21135 21136 _mouseDelayMet: function( /* event */ ) { 21137 return this.mouseDelayMet; 21138 }, 21139 21140 // These are placeholder methods, to be overriden by extending plugin 21141 _mouseStart: function( /* event */ ) {}, 21142 _mouseDrag: function( /* event */ ) {}, 21143 _mouseStop: function( /* event */ ) {}, 21144 _mouseCapture: function( /* event */ ) { 21145 return true; 21146 } 21147} ); 21148 21149 21150 21151// $.ui.plugin is deprecated. Use $.widget() extensions instead. 21152var plugin = $.ui.plugin = { 21153 add: function( module, option, set ) { 21154 var i, 21155 proto = $.ui[ module ].prototype; 21156 for ( i in set ) { 21157 proto.plugins[ i ] = proto.plugins[ i ] || []; 21158 proto.plugins[ i ].push( [ option, set[ i ] ] ); 21159 } 21160 }, 21161 call: function( instance, name, args, allowDisconnected ) { 21162 var i, 21163 set = instance.plugins[ name ]; 21164 21165 if ( !set ) { 21166 return; 21167 } 21168 21169 if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || 21170 instance.element[ 0 ].parentNode.nodeType === 11 ) ) { 21171 return; 21172 } 21173 21174 for ( i = 0; i < set.length; i++ ) { 21175 if ( instance.options[ set[ i ][ 0 ] ] ) { 21176 set[ i ][ 1 ].apply( instance.element, args ); 21177 } 21178 } 21179 } 21180}; 21181 21182 21183 21184var safeBlur = $.ui.safeBlur = function( element ) { 21185 21186 // Support: IE9 - 10 only 21187 // If the <body> is blurred, IE will switch windows, see #9420 21188 if ( element && element.nodeName.toLowerCase() !== "body" ) { 21189 $( element ).trigger( "blur" ); 21190 } 21191}; 21192 21193 21194/*! 21195 * jQuery UI Draggable 1.13.2 21196 * http://jqueryui.com 21197 * 21198 * Copyright jQuery Foundation and other contributors 21199 * Released under the MIT license. 21200 * http://jquery.org/license 21201 */ 21202 21203//>>label: Draggable 21204//>>group: Interactions 21205//>>description: Enables dragging functionality for any element. 21206//>>docs: http://api.jqueryui.com/draggable/ 21207//>>demos: http://jqueryui.com/draggable/ 21208//>>css.structure: ../../themes/base/draggable.css 21209 21210 21211$.widget( "ui.draggable", $.ui.mouse, { 21212 version: "1.13.2
vendor: 8,684 bytes, lines 21212-21558
21212", 21213 widgetEventPrefix: "drag", 21214 options: { 21215 addClasses: true, 21216 appendTo: "parent", 21217 axis: false, 21218 connectToSortable: false, 21219 containment: false, 21220 cursor: "auto", 21221 cursorAt: false, 21222 grid: false, 21223 handle: false, 21224 helper: "original", 21225 iframeFix: false, 21226 opacity: false, 21227 refreshPositions: false, 21228 revert: false, 21229 revertDuration: 500, 21230 scope: "default", 21231 scroll: true, 21232 scrollSensitivity: 20, 21233 scrollSpeed: 20, 21234 snap: false, 21235 snapMode: "both", 21236 snapTolerance: 20, 21237 stack: false, 21238 zIndex: false, 21239 21240 // Callbacks 21241 drag: null, 21242 start: null, 21243 stop: null 21244 }, 21245 _create: function() { 21246 21247 if ( this.options.helper === "original" ) { 21248 this._setPositionRelative(); 21249 } 21250 if ( this.options.addClasses ) { 21251 this._addClass( "ui-draggable" ); 21252 } 21253 this._setHandleClassName(); 21254 21255 this._mouseInit(); 21256 }, 21257 21258 _setOption: function( key, value ) { 21259 this._super( key, value ); 21260 if ( key === "handle" ) { 21261 this._removeHandleClassName(); 21262 this._setHandleClassName(); 21263 } 21264 }, 21265 21266 _destroy: function() { 21267 if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { 21268 this.destroyOnClear = true; 21269 return; 21270 } 21271 this._removeHandleClassName(); 21272 this._mouseDestroy(); 21273 }, 21274 21275 _mouseCapture: function( event ) { 21276 var o = this.options; 21277 21278 // Among others, prevent a drag on a resizable-handle 21279 if ( this.helper || o.disabled || 21280 $( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) { 21281 return false; 21282 } 21283 21284 //Quit if we're not on a valid handle 21285 this.handle = this._getHandle( event ); 21286 if ( !this.handle ) { 21287 return false; 21288 } 21289 21290 this._blurActiveElement( event ); 21291 21292 this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); 21293 21294 return true; 21295 21296 }, 21297 21298 _blockFrames: function( selector ) { 21299 this.iframeBlocks = this.document.find( selector ).map( function() { 21300 var iframe = $( this ); 21301 21302 return $( "<div>" ) 21303 .css( "position", "absolute" ) 21304 .appendTo( iframe.parent() ) 21305 .outerWidth( iframe.outerWidth() ) 21306 .outerHeight( iframe.outerHeight() ) 21307 .offset( iframe.offset() )[ 0 ]; 21308 } ); 21309 }, 21310 21311 _unblockFrames: function() { 21312 if ( this.iframeBlocks ) { 21313 this.iframeBlocks.remove(); 21314 delete this.iframeBlocks; 21315 } 21316 }, 21317 21318 _blurActiveElement: function( event ) { 21319 var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ), 21320 target = $( event.target ); 21321 21322 // Don't blur if the event occurred on an element that is within 21323 // the currently focused element 21324 // See #10527, #12472 21325 if ( target.closest( activeElement ).length ) { 21326 return; 21327 } 21328 21329 // Blur any element that currently has focus, see #4261 21330 $.ui.safeBlur( activeElement ); 21331 }, 21332 21333 _mouseStart: function( event ) { 21334 21335 var o = this.options; 21336 21337 //Create and append the visible helper 21338 this.helper = this._createHelper( event ); 21339 21340 this._addClass( this.helper, "ui-draggable-dragging" ); 21341 21342 //Cache the helper size 21343 this._cacheHelperProportions(); 21344 21345 //If ddmanager is used for droppables, set the global draggable 21346 if ( $.ui.ddmanager ) { 21347 $.ui.ddmanager.current = this; 21348 } 21349 21350 /* 21351 * - Position generation - 21352 * This block generates everything position related - it's the core of draggables. 21353 */ 21354 21355 //Cache the margins of the original element 21356 this._cacheMargins(); 21357 21358 //Store the helper's css position 21359 this.cssPosition = this.helper.css( "position" ); 21360 this.scrollParent = this.helper.scrollParent( true ); 21361 this.offsetParent = this.helper.offsetParent(); 21362 this.hasFixedAncestor = this.helper.parents().filter( function() { 21363 return $( this ).css( "position" ) === "fixed"; 21364 } ).length > 0; 21365 21366 //The element's absolute position on the page minus margins 21367 this.positionAbs = this.element.offset(); 21368 this._refreshOffsets( event ); 21369 21370 //Generate the original position 21371 this.originalPosition = this.position = this._generatePosition( event, false ); 21372 this.originalPageX = event.pageX; 21373 this.originalPageY = event.pageY; 21374 21375 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied 21376 if ( o.cursorAt ) { 21377 this._adjustOffsetFromHelper( o.cursorAt ); 21378 } 21379 21380 //Set a containment if given in the options 21381 this._setContainment(); 21382 21383 //Trigger event + callbacks 21384 if ( this._trigger( "start", event ) === false ) { 21385 this._clear(); 21386 return false; 21387 } 21388 21389 //Recache the helper size 21390 this._cacheHelperProportions(); 21391 21392 //Prepare the droppable offsets 21393 if ( $.ui.ddmanager && !o.dropBehaviour ) { 21394 $.ui.ddmanager.prepareOffsets( this, event ); 21395 } 21396 21397 // Execute the drag once - this causes the helper not to be visible before getting its 21398 // correct position 21399 this._mouseDrag( event, true ); 21400 21401 // If the ddmanager is used for droppables, inform the manager that dragging has started 21402 // (see #5003) 21403 if ( $.ui.ddmanager ) { 21404 $.ui.ddmanager.dragStart( this, event ); 21405 } 21406 21407 return true; 21408 }, 21409 21410 _refreshOffsets: function( event ) { 21411 this.offset = { 21412 top: this.positionAbs.top - this.margins.top, 21413 left: this.positionAbs.left - this.margins.left, 21414 scroll: false, 21415 parent: this._getParentOffset(), 21416 relative: this._getRelativeOffset() 21417 }; 21418 21419 this.offset.click = { 21420 left: event.pageX - this.offset.left, 21421 top: event.pageY - this.offset.top 21422 }; 21423 }, 21424 21425 _mouseDrag: function( event, noPropagation ) { 21426 21427 // reset any necessary cached properties (see #5009) 21428 if ( this.hasFixedAncestor ) { 21429 this.offset.parent = this._getParentOffset(); 21430 } 21431 21432 //Compute the helpers position 21433 this.position = this._generatePosition( event, true ); 21434 this.positionAbs = this._convertPositionTo( "absolute" ); 21435 21436 //Call plugins and callbacks and use the resulting position if something is returned 21437 if ( !noPropagation ) { 21438 var ui = this._uiHash(); 21439 if ( this._trigger( "drag", event, ui ) === false ) { 21440 this._mouseUp( new $.Event( "mouseup", event ) ); 21441 return false; 21442 } 21443 this.position = ui.position; 21444 } 21445 21446 this.helper[ 0 ].style.left = this.position.left + "px"; 21447 this.helper[ 0 ].style.top = this.position.top + "px"; 21448 21449 if ( $.ui.ddmanager ) { 21450 $.ui.ddmanager.drag( this, event ); 21451 } 21452 21453 return false; 21454 }, 21455 21456 _mouseStop: function( event ) { 21457 21458 //If we are using droppables, inform the manager about the drop 21459 var that = this, 21460 dropped = false; 21461 if ( $.ui.ddmanager && !this.options.dropBehaviour ) { 21462 dropped = $.ui.ddmanager.drop( this, event ); 21463 } 21464 21465 //if a drop comes from outside (a sortable) 21466 if ( this.dropped ) { 21467 dropped = this.dropped; 21468 this.dropped = false; 21469 } 21470 21471 if ( ( this.options.revert === "invalid" && !dropped ) || 21472 ( this.options.revert === "valid" && dropped ) || 21473 this.options.revert === true || ( typeof this.options.revert === "function" && 21474 this.options.revert.call( this.element, dropped ) ) 21475 ) { 21476 $( this.helper ).animate( 21477 this.originalPosition, 21478 parseInt( this.options.revertDuration, 10 ), 21479 function() { 21480 if ( that._trigger( "stop", event ) !== false ) { 21481 that._clear(); 21482 } 21483 } 21484 ); 21485 } else { 21486 if ( this._trigger( "stop", event ) !== false ) { 21487 this._clear(); 21488 } 21489 } 21490 21491 return false; 21492 }, 21493 21494 _mouseUp: function( event ) { 21495 this._unblockFrames(); 21496 21497 // If the ddmanager is used for droppables, inform the manager that dragging has stopped 21498 // (see #5003) 21499 if ( $.ui.ddmanager ) { 21500 $.ui.ddmanager.dragStop( this, event ); 21501 } 21502 21503 // Only need to focus if the event occurred on the draggable itself, see #10527 21504 if ( this.handleElement.is( event.target ) ) { 21505 21506 // The interaction is over; whether or not the click resulted in a drag, 21507 // focus the element 21508 this.element.trigger( "focus" ); 21509 } 21510 21511 return $.ui.mouse.prototype._mouseUp.call( this, event ); 21512 }, 21513 21514 cancel: function() { 21515 21516 if ( this.helper.is( ".ui-draggable-dragging" ) ) { 21517 this._mouseUp( new $.Event( "mouseup", { target: this.element[ 0 ] } ) ); 21518 } else { 21519 this._clear(); 21520 } 21521 21522 return this; 21523 21524 }, 21525 21526 _getHandle: function( event ) { 21527 return this.options.handle ? 21528 !!$( event.target ).closest( this.element.find( this.options.handle ) ).length : 21529 true; 21530 }, 21531 21532 _setHandleClassName: function() { 21533 this.handleElement = this.options.handle ? 21534 this.element.find( this.options.handle ) : this.element; 21535 this._addClass( this.handleElement, "ui-draggable-handle" ); 21536 }, 21537 21538 _removeHandleClassName: function() { 21539 this._removeClass( this.handleElement, "ui-draggable-handle" ); 21540 }, 21541 21542 _createHelper: function( event ) { 21543 21544 var o = this.options, 21545 helperIsFunction = typeof o.helper === "function", 21546 helper = helperIsFunction ? 21547 $( o.helper.apply( this.element[ 0 ], [ event ] ) ) : 21548 ( o.helper === "clone" ? 21549 this.element.clone().removeAttr( "id" ) : 21550 this.element ); 21551 21552 if ( !helper.parents( "body" ).length ) { 21553 helper.appendTo( ( o.appendTo === "parent" ? 21554 this.element[ 0 ].parentNode : 21555 o.appendTo ) ); 21556 } 21557 21558 //
21558Http
vendor: 25,991 bytes, lines 21558-22430
21558://bugs.jqueryui.com/ticket/9446 21559 // a helper function can return the original element 21560 // which wouldn't have been set to relative in _create 21561 if ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) { 21562 this._setPositionRelative(); 21563 } 21564 21565 if ( helper[ 0 ] !== this.element[ 0 ] && 21566 !( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) { 21567 helper.css( "position", "absolute" ); 21568 } 21569 21570 return helper; 21571 21572 }, 21573 21574 _setPositionRelative: function() { 21575 if ( !( /^(?:r|a|f)/ ).test( this.element.css( "position" ) ) ) { 21576 this.element[ 0 ].style.position = "relative"; 21577 } 21578 }, 21579 21580 _adjustOffsetFromHelper: function( obj ) { 21581 if ( typeof obj === "string" ) { 21582 obj = obj.split( " " ); 21583 } 21584 if ( Array.isArray( obj ) ) { 21585 obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 }; 21586 } 21587 if ( "left" in obj ) { 21588 this.offset.click.left = obj.left + this.margins.left; 21589 } 21590 if ( "right" in obj ) { 21591 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; 21592 } 21593 if ( "top" in obj ) { 21594 this.offset.click.top = obj.top + this.margins.top; 21595 } 21596 if ( "bottom" in obj ) { 21597 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; 21598 } 21599 }, 21600 21601 _isRootNode: function( element ) { 21602 return ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ]; 21603 }, 21604 21605 _getParentOffset: function() { 21606 21607 //Get the offsetParent and cache its position 21608 var po = this.offsetParent.offset(), 21609 document = this.document[ 0 ]; 21610 21611 // This is a special case where we need to modify a offset calculated on start, since the 21612 // following happened: 21613 // 1. The position of the helper is absolute, so it's position is calculated based on the 21614 // next positioned parent 21615 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't 21616 // the document, which means that the scroll is included in the initial calculation of the 21617 // offset of the parent, and never recalculated upon drag 21618 if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document && 21619 $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) { 21620 po.left += this.scrollParent.scrollLeft(); 21621 po.top += this.scrollParent.scrollTop(); 21622 } 21623 21624 if ( this._isRootNode( this.offsetParent[ 0 ] ) ) { 21625 po = { top: 0, left: 0 }; 21626 } 21627 21628 return { 21629 top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ), 21630 left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 ) 21631 }; 21632 21633 }, 21634 21635 _getRelativeOffset: function() { 21636 if ( this.cssPosition !== "relative" ) { 21637 return { top: 0, left: 0 }; 21638 } 21639 21640 var p = this.element.position(), 21641 scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ); 21642 21643 return { 21644 top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) + 21645 ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ), 21646 left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) + 21647 ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 ) 21648 }; 21649 21650 }, 21651 21652 _cacheMargins: function() { 21653 this.margins = { 21654 left: ( parseInt( this.element.css( "marginLeft" ), 10 ) || 0 ), 21655 top: ( parseInt( this.element.css( "marginTop" ), 10 ) || 0 ), 21656 right: ( parseInt( this.element.css( "marginRight" ), 10 ) || 0 ), 21657 bottom: ( parseInt( this.element.css( "marginBottom" ), 10 ) || 0 ) 21658 }; 21659 }, 21660 21661 _cacheHelperProportions: function() { 21662 this.helperProportions = { 21663 width: this.helper.outerWidth(), 21664 height: this.helper.outerHeight() 21665 }; 21666 }, 21667 21668 _setContainment: function() { 21669 21670 var isUserScrollable, c, ce, 21671 o = this.options, 21672 document = this.document[ 0 ]; 21673 21674 this.relativeContainer = null; 21675 21676 if ( !o.containment ) { 21677 this.containment = null; 21678 return; 21679 } 21680 21681 if ( o.containment === "window" ) { 21682 this.containment = [ 21683 $( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left, 21684 $( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top, 21685 $( window ).scrollLeft() + $( window ).width() - 21686 this.helperProportions.width - this.margins.left, 21687 $( window ).scrollTop() + 21688 ( $( window ).height() || document.body.parentNode.scrollHeight ) - 21689 this.helperProportions.height - this.margins.top 21690 ]; 21691 return; 21692 } 21693 21694 if ( o.containment === "document" ) { 21695 this.containment = [ 21696 0, 21697 0, 21698 $( document ).width() - this.helperProportions.width - this.margins.left, 21699 ( $( document ).height() || document.body.parentNode.scrollHeight ) - 21700 this.helperProportions.height - this.margins.top 21701 ]; 21702 return; 21703 } 21704 21705 if ( o.containment.constructor === Array ) { 21706 this.containment = o.containment; 21707 return; 21708 } 21709 21710 if ( o.containment === "parent" ) { 21711 o.containment = this.helper[ 0 ].parentNode; 21712 } 21713 21714 c = $( o.containment ); 21715 ce = c[ 0 ]; 21716 21717 if ( !ce ) { 21718 return; 21719 } 21720 21721 isUserScrollable = /(scroll|auto)/.test( c.css( "overflow" ) ); 21722 21723 this.containment = [ 21724 ( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) + 21725 ( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ), 21726 ( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) + 21727 ( parseInt( c.css( "paddingTop" ), 10 ) || 0 ), 21728 ( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) - 21729 ( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) - 21730 ( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) - 21731 this.helperProportions.width - 21732 this.margins.left - 21733 this.margins.right, 21734 ( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - 21735 ( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) - 21736 ( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) - 21737 this.helperProportions.height - 21738 this.margins.top - 21739 this.margins.bottom 21740 ]; 21741 this.relativeContainer = c; 21742 }, 21743 21744 _convertPositionTo: function( d, pos ) { 21745 21746 if ( !pos ) { 21747 pos = this.position; 21748 } 21749 21750 var mod = d === "absolute" ? 1 : -1, 21751 scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ); 21752 21753 return { 21754 top: ( 21755 21756 // The absolute mouse position 21757 pos.top + 21758 21759 // Only for relative positioned nodes: Relative offset from element to offset parent 21760 this.offset.relative.top * mod + 21761 21762 // The offsetParent's offset without borders (offset + border) 21763 this.offset.parent.top * mod - 21764 ( ( this.cssPosition === "fixed" ? 21765 -this.offset.scroll.top : 21766 ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod ) 21767 ), 21768 left: ( 21769 21770 // The absolute mouse position 21771 pos.left + 21772 21773 // Only for relative positioned nodes: Relative offset from element to offset parent 21774 this.offset.relative.left * mod + 21775 21776 // The offsetParent's offset without borders (offset + border) 21777 this.offset.parent.left * mod - 21778 ( ( this.cssPosition === "fixed" ? 21779 -this.offset.scroll.left : 21780 ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod ) 21781 ) 21782 }; 21783 21784 }, 21785 21786 _generatePosition: function( event, constrainPosition ) { 21787 21788 var containment, co, top, left, 21789 o = this.options, 21790 scrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ), 21791 pageX = event.pageX, 21792 pageY = event.pageY; 21793 21794 // Cache the scroll 21795 if ( !scrollIsRootNode || !this.offset.scroll ) { 21796 this.offset.scroll = { 21797 top: this.scrollParent.scrollTop(), 21798 left: this.scrollParent.scrollLeft() 21799 }; 21800 } 21801 21802 /* 21803 * - Position constraining - 21804 * Constrain the position to a mix of grid, containment. 21805 */ 21806 21807 // If we are not dragging yet, we won't check for options 21808 if ( constrainPosition ) { 21809 if ( this.containment ) { 21810 if ( this.relativeContainer ) { 21811 co = this.relativeContainer.offset(); 21812 containment = [ 21813 this.containment[ 0 ] + co.left, 21814 this.containment[ 1 ] + co.top, 21815 this.containment[ 2 ] + co.left, 21816 this.containment[ 3 ] + co.top 21817 ]; 21818 } else { 21819 containment = this.containment; 21820 } 21821 21822 if ( event.pageX - this.offset.click.left < containment[ 0 ] ) { 21823 pageX = containment[ 0 ] + this.offset.click.left; 21824 } 21825 if ( event.pageY - this.offset.click.top < containment[ 1 ] ) { 21826 pageY = containment[ 1 ] + this.offset.click.top; 21827 } 21828 if ( event.pageX - this.offset.click.left > containment[ 2 ] ) { 21829 pageX = containment[ 2 ] + this.offset.click.left; 21830 } 21831 if ( event.pageY - this.offset.click.top > containment[ 3 ] ) { 21832 pageY = containment[ 3 ] + this.offset.click.top; 21833 } 21834 } 21835 21836 if ( o.grid ) { 21837 21838 //Check for grid elements set to 0 to prevent divide by 0 error causing invalid 21839 // argument errors in IE (see ticket #6950) 21840 top = o.grid[ 1 ] ? this.originalPageY + Math.round( ( pageY - 21841 this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY; 21842 pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] || 21843 top - this.offset.click.top > containment[ 3 ] ) ? 21844 top : 21845 ( ( top - this.offset.click.top >= containment[ 1 ] ) ? 21846 top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top; 21847 21848 left = o.grid[ 0 ] ? this.originalPageX + 21849 Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] : 21850 this.originalPageX; 21851 pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] || 21852 left - this.offset.click.left > containment[ 2 ] ) ? 21853 left : 21854 ( ( left - this.offset.click.left >= containment[ 0 ] ) ? 21855 left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left; 21856 } 21857 21858 if ( o.axis === "y" ) { 21859 pageX = this.originalPageX; 21860 } 21861 21862 if ( o.axis === "x" ) { 21863 pageY = this.originalPageY; 21864 } 21865 } 21866 21867 return { 21868 top: ( 21869 21870 // The absolute mouse position 21871 pageY - 21872 21873 // Click offset (relative to the element) 21874 this.offset.click.top - 21875 21876 // Only for relative positioned nodes: Relative offset from element to offset parent 21877 this.offset.relative.top - 21878 21879 // The offsetParent's offset without borders (offset + border) 21880 this.offset.parent.top + 21881 ( this.cssPosition === "fixed" ? 21882 -this.offset.scroll.top : 21883 ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) 21884 ), 21885 left: ( 21886 21887 // The absolute mouse position 21888 pageX - 21889 21890 // Click offset (relative to the element) 21891 this.offset.click.left - 21892 21893 // Only for relative positioned nodes: Relative offset from element to offset parent 21894 this.offset.relative.left - 21895 21896 // The offsetParent's offset without borders (offset + border) 21897 this.offset.parent.left + 21898 ( this.cssPosition === "fixed" ? 21899 -this.offset.scroll.left : 21900 ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) 21901 ) 21902 }; 21903 21904 }, 21905 21906 _clear: function() { 21907 this._removeClass( this.helper, "ui-draggable-dragging" ); 21908 if ( this.helper[ 0 ] !== this.element[ 0 ] && !this.cancelHelperRemoval ) { 21909 this.helper.remove(); 21910 } 21911 this.helper = null; 21912 this.cancelHelperRemoval = false; 21913 if ( this.destroyOnClear ) { 21914 this.destroy(); 21915 } 21916 }, 21917 21918 // From now on bulk stuff - mainly helpers 21919 21920 _trigger: function( type, event, ui ) { 21921 ui = ui || this._uiHash(); 21922 $.ui.plugin.call( this, type, [ event, ui, this ], true ); 21923 21924 // Absolute position and offset (see #6884 ) have to be recalculated after plugins 21925 if ( /^(drag|start|stop)/.test( type ) ) { 21926 this.positionAbs = this._convertPositionTo( "absolute" ); 21927 ui.offset = this.positionAbs; 21928 } 21929 return $.Widget.prototype._trigger.call( this, type, event, ui ); 21930 }, 21931 21932 plugins: {}, 21933 21934 _uiHash: function() { 21935 return { 21936 helper: this.helper, 21937 position: this.position, 21938 originalPosition: this.originalPosition, 21939 offset: this.positionAbs 21940 }; 21941 } 21942 21943} ); 21944 21945$.ui.plugin.add( "draggable", "connectToSortable", { 21946 start: function( event, ui, draggable ) { 21947 var uiSortable = $.extend( {}, ui, { 21948 item: draggable.element 21949 } ); 21950 21951 draggable.sortables = []; 21952 $( draggable.options.connectToSortable ).each( function() { 21953 var sortable = $( this ).sortable( "instance" ); 21954 21955 if ( sortable && !sortable.options.disabled ) { 21956 draggable.sortables.push( sortable ); 21957 21958 // RefreshPositions is called at drag start to refresh the containerCache 21959 // which is used in drag. This ensures it's initialized and synchronized 21960 // with any changes that might have happened on the page since initialization. 21961 sortable.refreshPositions(); 21962 sortable._trigger( "activate", event, uiSortable ); 21963 } 21964 } ); 21965 }, 21966 stop: function( event, ui, draggable ) { 21967 var uiSortable = $.extend( {}, ui, { 21968 item: draggable.element 21969 } ); 21970 21971 draggable.cancelHelperRemoval = false; 21972 21973 $.each( draggable.sortables, function() { 21974 var sortable = this; 21975 21976 if ( sortable.isOver ) { 21977 sortable.isOver = 0; 21978 21979 // Allow this sortable to handle removing the helper 21980 draggable.cancelHelperRemoval = true; 21981 sortable.cancelHelperRemoval = false; 21982 21983 // Use _storedCSS To restore properties in the sortable, 21984 // as this also handles revert (#9675) since the draggable 21985 // may have modified them in unexpected ways (#8809) 21986 sortable._storedCSS = { 21987 position: sortable.placeholder.css( "position" ), 21988 top: sortable.placeholder.css( "top" ), 21989 left: sortable.placeholder.css( "left" ) 21990 }; 21991 21992 sortable._mouseStop( event ); 21993 21994 // Once drag has ended, the sortable should return to using 21995 // its original helper, not the shared helper from draggable 21996 sortable.options.helper = sortable.options._helper; 21997 } else { 21998 21999 // Prevent this Sortable from removing the helper. 22000 // However, don't set the draggable to remove the helper 22001 // either as another connected Sortable may yet handle the removal. 22002 sortable.cancelHelperRemoval = true; 22003 22004 sortable._trigger( "deactivate", event, uiSortable ); 22005 } 22006 } ); 22007 }, 22008 drag: function( event, ui, draggable ) { 22009 $.each( draggable.sortables, function() { 22010 var innermostIntersecting = false, 22011 sortable = this; 22012 22013 // Copy over variables that sortable's _intersectsWith uses 22014 sortable.positionAbs = draggable.positionAbs; 22015 sortable.helperProportions = draggable.helperProportions; 22016 sortable.offset.click = draggable.offset.click; 22017 22018 if ( sortable._intersectsWith( sortable.containerCache ) ) { 22019 innermostIntersecting = true; 22020 22021 $.each( draggable.sortables, function() { 22022 22023 // Copy over variables that sortable's _intersectsWith uses 22024 this.positionAbs = draggable.positionAbs; 22025 this.helperProportions = draggable.helperProportions; 22026 this.offset.click = draggable.offset.click; 22027 22028 if ( this !== sortable && 22029 this._intersectsWith( this.containerCache ) && 22030 $.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) { 22031 innermostIntersecting = false; 22032 } 22033 22034 return innermostIntersecting; 22035 } ); 22036 } 22037 22038 if ( innermostIntersecting ) { 22039 22040 // If it intersects, we use a little isOver variable and set it once, 22041 // so that the move-in stuff gets fired only once. 22042 if ( !sortable.isOver ) { 22043 sortable.isOver = 1; 22044 22045 // Store draggable's parent in case we need to reappend to it later. 22046 draggable._parent = ui.helper.parent(); 22047 22048 sortable.currentItem = ui.helper 22049 .appendTo( sortable.element ) 22050 .data( "ui-sortable-item", true ); 22051 22052 // Store helper option to later restore it 22053 sortable.options._helper = sortable.options.helper; 22054 22055 sortable.options.helper = function() { 22056 return ui.helper[ 0 ]; 22057 }; 22058 22059 // Fire the start events of the sortable with our passed browser event, 22060 // and our own helper (so it doesn't create a new one) 22061 event.target = sortable.currentItem[ 0 ]; 22062 sortable._mouseCapture( event, true ); 22063 sortable._mouseStart( event, true, true ); 22064 22065 // Because the browser event is way off the new appended portlet, 22066 // modify necessary variables to reflect the changes 22067 sortable.offset.click.top = draggable.offset.click.top; 22068 sortable.offset.click.left = draggable.offset.click.left; 22069 sortable.offset.parent.left -= draggable.offset.parent.left - 22070 sortable.offset.parent.left; 22071 sortable.offset.parent.top -= draggable.offset.parent.top - 22072 sortable.offset.parent.top; 22073 22074 draggable._trigger( "toSortable", event ); 22075 22076 // Inform draggable that the helper is in a valid drop zone, 22077 // used solely in the revert option to handle "valid/invalid". 22078 draggable.dropped = sortable.element; 22079 22080 // Need to refreshPositions of all sortables in the case that 22081 // adding to one sortable changes the location of the other sortables (#9675) 22082 $.each( draggable.sortables, function() { 22083 this.refreshPositions(); 22084 } ); 22085 22086 // Hack so receive/update callbacks work (mostly) 22087 draggable.currentItem = draggable.element; 22088 sortable.fromOutside = draggable; 22089 } 22090 22091 if ( sortable.currentItem ) { 22092 sortable._mouseDrag( event ); 22093 22094 // Copy the sortable's position because the draggable's can potentially reflect 22095 // a relative position, while sortable is always absolute, which the dragged 22096 // element has now become. (#8809) 22097 ui.position = sortable.position; 22098 } 22099 } else { 22100 22101 // If it doesn't intersect with the sortable, and it intersected before, 22102 // we fake the drag stop of the sortable, but make sure it doesn't remove 22103 // the helper by using cancelHelperRemoval. 22104 if ( sortable.isOver ) { 22105 22106 sortable.isOver = 0; 22107 sortable.cancelHelperRemoval = true; 22108 22109 // Calling sortable's mouseStop would trigger a revert, 22110 // so revert must be temporarily false until after mouseStop is called. 22111 sortable.options._revert = sortable.options.revert; 22112 sortable.options.revert = false; 22113 22114 sortable._trigger( "out", event, sortable._uiHash( sortable ) ); 22115 sortable._mouseStop( event, true ); 22116 22117 // Restore sortable behaviors that were modfied 22118 // when the draggable entered the sortable area (#9481) 22119 sortable.options.revert = sortable.options._revert; 22120 sortable.options.helper = sortable.options._helper; 22121 22122 if ( sortable.placeholder ) { 22123 sortable.placeholder.remove(); 22124 } 22125 22126 // Restore and recalculate the draggable's offset considering the sortable 22127 // may have modified them in unexpected ways. (#8809, #10669) 22128 ui.helper.appendTo( draggable._parent ); 22129 draggable._refreshOffsets( event ); 22130 ui.position = draggable._generatePosition( event, true ); 22131 22132 draggable._trigger( "fromSortable", event ); 22133 22134 // Inform draggable that the helper is no longer in a valid drop zone 22135 draggable.dropped = false; 22136 22137 // Need to refreshPositions of all sortables just in case removing 22138 // from one sortable changes the location of other sortables (#9675) 22139 $.each( draggable.sortables, function() { 22140 this.refreshPositions(); 22141 } ); 22142 } 22143 } 22144 } ); 22145 } 22146} ); 22147 22148$.ui.plugin.add( "draggable", "cursor", { 22149 start: function( event, ui, instance ) { 22150 var t = $( "body" ), 22151 o = instance.options; 22152 22153 if ( t.css( "cursor" ) ) { 22154 o._cursor = t.css( "cursor" ); 22155 } 22156 t.css( "cursor", o.cursor ); 22157 }, 22158 stop: function( event, ui, instance ) { 22159 var o = instance.options; 22160 if ( o._cursor ) { 22161 $( "body" ).css( "cursor", o._cursor ); 22162 } 22163 } 22164} ); 22165 22166$.ui.plugin.add( "draggable", "opacity", { 22167 start: function( event, ui, instance ) { 22168 var t = $( ui.helper ), 22169 o = instance.options; 22170 if ( t.css( "opacity" ) ) { 22171 o._opacity = t.css( "opacity" ); 22172 } 22173 t.css( "opacity", o.opacity ); 22174 }, 22175 stop: function( event, ui, instance ) { 22176 var o = instance.options; 22177 if ( o._opacity ) { 22178 $( ui.helper ).css( "opacity", o._opacity ); 22179 } 22180 } 22181} ); 22182 22183$.ui.plugin.add( "draggable", "scroll", { 22184 start: function( event, ui, i ) { 22185 if ( !i.scrollParentNotHidden ) { 22186 i.scrollParentNotHidden = i.helper.scrollParent( false ); 22187 } 22188 22189 if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && 22190 i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) { 22191 i.overflowOffset = i.scrollParentNotHidden.offset(); 22192 } 22193 }, 22194 drag: function( event, ui, i ) { 22195 22196 var o = i.options, 22197 scrolled = false, 22198 scrollParent = i.scrollParentNotHidden[ 0 ], 22199 document = i.document[ 0 ]; 22200 22201 if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) { 22202 if ( !o.axis || o.axis !== "x" ) { 22203 if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < 22204 o.scrollSensitivity ) { 22205 scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed; 22206 } else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) { 22207 scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed; 22208 } 22209 } 22210 22211 if ( !o.axis || o.axis !== "y" ) { 22212 if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < 22213 o.scrollSensitivity ) { 22214 scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed; 22215 } else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) { 22216 scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed; 22217 } 22218 } 22219 22220 } else { 22221 22222 if ( !o.axis || o.axis !== "x" ) { 22223 if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) { 22224 scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed ); 22225 } else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) < 22226 o.scrollSensitivity ) { 22227 scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed ); 22228 } 22229 } 22230 22231 if ( !o.axis || o.axis !== "y" ) { 22232 if ( event.pageX - $( document ).scrollLeft() < o.scrollSensitivity ) { 22233 scrolled = $( document ).scrollLeft( 22234 $( document ).scrollLeft() - o.scrollSpeed 22235 ); 22236 } else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) < 22237 o.scrollSensitivity ) { 22238 scrolled = $( document ).scrollLeft( 22239 $( document ).scrollLeft() + o.scrollSpeed 22240 ); 22241 } 22242 } 22243 22244 } 22245 22246 if ( scrolled !== false && $.ui.ddmanager && !o.dropBehaviour ) { 22247 $.ui.ddmanager.prepareOffsets( i, event ); 22248 } 22249 22250 } 22251} ); 22252 22253$.ui.plugin.add( "draggable", "snap", { 22254 start: function( event, ui, i ) { 22255 22256 var o = i.options; 22257 22258 i.snapElements = []; 22259 22260 $( o.snap.constructor !== String ? ( o.snap.items || ":data(ui-draggable)" ) : o.snap ) 22261 .each( function() { 22262 var $t = $( this ), 22263 $o = $t.offset(); 22264 if ( this !== i.element[ 0 ] ) { 22265 i.snapElements.push( { 22266 item: this, 22267 width: $t.outerWidth(), height: $t.outerHeight(), 22268 top: $o.top, left: $o.left 22269 } ); 22270 } 22271 } ); 22272 22273 }, 22274 drag: function( event, ui, inst ) { 22275 22276 var ts, bs, ls, rs, l, r, t, b, i, first, 22277 o = inst.options, 22278 d = o.snapTolerance, 22279 x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, 22280 y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; 22281 22282 for ( i = inst.snapElements.length - 1; i >= 0; i-- ) { 22283 22284 l = inst.snapElements[ i ].left - inst.margins.left; 22285 r = l + inst.snapElements[ i ].width; 22286 t = inst.snapElements[ i ].top - inst.margins.top; 22287 b = t + inst.snapElements[ i ].height; 22288 22289 if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || 22290 !$.contains( inst.snapElements[ i ].item.ownerDocument, 22291 inst.snapElements[ i ].item ) ) { 22292 if ( inst.snapElements[ i ].snapping ) { 22293 if ( inst.options.snap.release ) { 22294 inst.options.snap.release.call( 22295 inst.element, 22296 event, 22297 $.extend( inst._uiHash(), { snapItem: inst.snapElements[ i ].item } ) 22298 ); 22299 } 22300 } 22301 inst.snapElements[ i ].snapping = false; 22302 continue; 22303 } 22304 22305 if ( o.snapMode !== "inner" ) { 22306 ts = Math.abs( t - y2 ) <= d; 22307 bs = Math.abs( b - y1 ) <= d; 22308 ls = Math.abs( l - x2 ) <= d; 22309 rs = Math.abs( r - x1 ) <= d; 22310 if ( ts ) { 22311 ui.position.top = inst._convertPositionTo( "relative", { 22312 top: t - inst.helperProportions.height, 22313 left: 0 22314 } ).top; 22315 } 22316 if ( bs ) { 22317 ui.position.top = inst._convertPositionTo( "relative", { 22318 top: b, 22319 left: 0 22320 } ).top; 22321 } 22322 if ( ls ) { 22323 ui.position.left = inst._convertPositionTo( "relative", { 22324 top: 0, 22325 left: l - inst.helperProportions.width 22326 } ).left; 22327 } 22328 if ( rs ) { 22329 ui.position.left = inst._convertPositionTo( "relative", { 22330 top: 0, 22331 left: r 22332 } ).left; 22333 } 22334 } 22335 22336 first = ( ts || bs || ls || rs ); 22337 22338 if ( o.snapMode !== "outer" ) { 22339 ts = Math.abs( t - y1 ) <= d; 22340 bs = Math.abs( b - y2 ) <= d; 22341 ls = Math.abs( l - x1 ) <= d; 22342 rs = Math.abs( r - x2 ) <= d; 22343 if ( ts ) { 22344 ui.position.top = inst._convertPositionTo( "relative", { 22345 top: t, 22346 left: 0 22347 } ).top; 22348 } 22349 if ( bs ) { 22350 ui.position.top = inst._convertPositionTo( "relative", { 22351 top: b - inst.helperProportions.height, 22352 left: 0 22353 } ).top; 22354 } 22355 if ( ls ) { 22356 ui.position.left = inst._convertPositionTo( "relative", { 22357 top: 0, 22358 left: l 22359 } ).left; 22360 } 22361 if ( rs ) { 22362 ui.position.left = inst._convertPositionTo( "relative", { 22363 top: 0, 22364 left: r - inst.helperProportions.width 22365 } ).left; 22366 } 22367 } 22368 22369 if ( !inst.snapElements[ i ].snapping && ( ts || bs || ls || rs || first ) ) { 22370 if ( inst.options.snap.snap ) { 22371 inst.options.snap.snap.call( 22372 inst.element, 22373 event, 22374 $.extend( inst._uiHash(), { 22375 snapItem: inst.snapElements[ i ].item 22376 } ) ); 22377 } 22378 } 22379 inst.snapElements[ i ].snapping = ( ts || bs || ls || rs || first ); 22380 22381 } 22382 22383 } 22384} ); 22385 22386$.ui.plugin.add( "draggable", "stack", { 22387 start: function( event, ui, instance ) { 22388 var min, 22389 o = instance.options, 22390 group = $.makeArray( $( o.stack ) ).sort( function( a, b ) { 22391 return ( parseInt( $( a ).css( "zIndex" ), 10 ) || 0 ) - 22392 ( parseInt( $( b ).css( "zIndex" ), 10 ) || 0 ); 22393 } ); 22394 22395 if ( !group.length ) { 22396 return; 22397 } 22398 22399 min = parseInt( $( group[ 0 ] ).css( "zIndex" ), 10 ) || 0; 22400 $( group ).each( function( i ) { 22401 $( this ).css( "zIndex", min + i ); 22402 } ); 22403 this.css( "zIndex", ( min + group.length ) ); 22404 } 22405} ); 22406 22407$.ui.plugin.add( "draggable", "zIndex", { 22408 start: function( event, ui, instance ) { 22409 var t = $( ui.helper ), 22410 o = instance.options; 22411 22412 if ( t.css( "zIndex" ) ) { 22413 o._zIndex = t.css( "zIndex" ); 22414 } 22415 t.css( "zIndex", o.zIndex ); 22416 }, 22417 stop: function( event, ui, instance ) { 22418 var o = instance.options; 22419 22420 if ( o._zIndex ) { 22421 $( ui.helper ).css( "zIndex", o._zIndex ); 22422 } 22423 } 22424} ); 22425 22426var widgetsDraggable = $.ui.draggable; 22427 22428 22429/*! 22430 * jQuery UI Resizable 1.13.
224302 22431 * http://jqueryui.com 22432 * 22433 * Copyright jQuery Foundation and other contributors 22434 * Released under the MIT license. 22435 * http://jquery.org/license 22436 */ 22437 22438//>>label: Resizable 22439//>>group: Interactions 22440//>>description: Enables resize functionality for any element. 22441//>>docs: http://api.jqueryui.com/resizable/ 22442//>>demos: http://jqueryui.com/resizable/ 22443//>>css.structure: ../../themes/base/core.css 22444//>>css.structure: ../../themes/base/resizable.css 22445//>>css.theme: ../../themes/base/theme.css 22446 22447 22448$.widget( "ui.resizable", $.ui.mouse, { 22449 version: "1.13.2
vendor: 11,739 bytes, lines 22449-22942
22449", 22450 widgetEventPrefix: "resize", 22451 options: { 22452 alsoResize: false, 22453 animate: false, 22454 animateDuration: "slow", 22455 animateEasing: "swing", 22456 aspectRatio: false, 22457 autoHide: false, 22458 classes: { 22459 "ui-resizable-se": "ui-icon ui-icon-gripsmall-diagonal-se" 22460 }, 22461 containment: false, 22462 ghost: false, 22463 grid: false, 22464 handles: "e,s,se", 22465 helper: false, 22466 maxHeight: null, 22467 maxWidth: null, 22468 minHeight: 10, 22469 minWidth: 10, 22470 22471 // See #7960 22472 zIndex: 90, 22473 22474 // Callbacks 22475 resize: null, 22476 start: null, 22477 stop: null 22478 }, 22479 22480 _num: function( value ) { 22481 return parseFloat( value ) || 0; 22482 }, 22483 22484 _isNumber: function( value ) { 22485 return !isNaN( parseFloat( value ) ); 22486 }, 22487 22488 _hasScroll: function( el, a ) { 22489 22490 if ( $( el ).css( "overflow" ) === "hidden" ) { 22491 return false; 22492 } 22493 22494 var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", 22495 has = false; 22496 22497 if ( el[ scroll ] > 0 ) { 22498 return true; 22499 } 22500 22501 // TODO: determine which cases actually cause this to happen 22502 // if the element doesn't have the scroll set, see if it's possible to 22503 // set the scroll 22504 try { 22505 el[ scroll ] = 1; 22506 has = ( el[ scroll ] > 0 ); 22507 el[ scroll ] = 0; 22508 } catch ( e ) { 22509 22510 // `el` might be a string, then setting `scroll` will throw 22511 // an error in strict mode; ignore it. 22512 } 22513 return has; 22514 }, 22515 22516 _create: function() { 22517 22518 var margins, 22519 o = this.options, 22520 that = this; 22521 this._addClass( "ui-resizable" ); 22522 22523 $.extend( this, { 22524 _aspectRatio: !!( o.aspectRatio ), 22525 aspectRatio: o.aspectRatio, 22526 originalElement: this.element, 22527 _proportionallyResizeElements: [], 22528 _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null 22529 } ); 22530 22531 // Wrap the element if it cannot hold child nodes 22532 if ( this.element[ 0 ].nodeName.match( /^(canvas|textarea|input|select|button|img)$/i ) ) { 22533 22534 this.element.wrap( 22535 $( "<div class='ui-wrapper'></div>" ).css( { 22536 overflow: "hidden", 22537 position: this.element.css( "position" ), 22538 width: this.element.outerWidth(), 22539 height: this.element.outerHeight(), 22540 top: this.element.css( "top" ), 22541 left: this.element.css( "left" ) 22542 } ) 22543 ); 22544 22545 this.element = this.element.parent().data( 22546 "ui-resizable", this.element.resizable( "instance" ) 22547 ); 22548 22549 this.elementIsWrapper = true; 22550 22551 margins = { 22552 marginTop: this.originalElement.css( "marginTop" ), 22553 marginRight: this.originalElement.css( "marginRight" ), 22554 marginBottom: this.originalElement.css( "marginBottom" ), 22555 marginLeft: this.originalElement.css( "marginLeft" ) 22556 }; 22557 22558 this.element.css( margins ); 22559 this.originalElement.css( "margin", 0 ); 22560 22561 // support: Safari 22562 // Prevent Safari textarea resize 22563 this.originalResizeStyle = this.originalElement.css( "resize" ); 22564 this.originalElement.css( "resize", "none" ); 22565 22566 this._proportionallyResizeElements.push( this.originalElement.css( { 22567 position: "static", 22568 zoom: 1, 22569 display: "block" 22570 } ) ); 22571 22572 // Support: IE9 22573 // avoid IE jump (hard set the margin) 22574 this.originalElement.css( margins ); 22575 22576 this._proportionallyResize(); 22577 } 22578 22579 this._setupHandles(); 22580 22581 if ( o.autoHide ) { 22582 $( this.element ) 22583 .on( "mouseenter", function() { 22584 if ( o.disabled ) { 22585 return; 22586 } 22587 that._removeClass( "ui-resizable-autohide" ); 22588 that._handles.show(); 22589 } ) 22590 .on( "mouseleave", function() { 22591 if ( o.disabled ) { 22592 return; 22593 } 22594 if ( !that.resizing ) { 22595 that._addClass( "ui-resizable-autohide" ); 22596 that._handles.hide(); 22597 } 22598 } ); 22599 } 22600 22601 this._mouseInit(); 22602 }, 22603 22604 _destroy: function() { 22605 22606 this._mouseDestroy(); 22607 this._addedHandles.remove(); 22608 22609 var wrapper, 22610 _destroy = function( exp ) { 22611 $( exp ) 22612 .removeData( "resizable" ) 22613 .removeData( "ui-resizable" ) 22614 .off( ".resizable" ); 22615 }; 22616 22617 // TODO: Unwrap at same DOM position 22618 if ( this.elementIsWrapper ) { 22619 _destroy( this.element ); 22620 wrapper = this.element; 22621 this.originalElement.css( { 22622 position: wrapper.css( "position" ), 22623 width: wrapper.outerWidth(), 22624 height: wrapper.outerHeight(), 22625 top: wrapper.css( "top" ), 22626 left: wrapper.css( "left" ) 22627 } ).insertAfter( wrapper ); 22628 wrapper.remove(); 22629 } 22630 22631 this.originalElement.css( "resize", this.originalResizeStyle ); 22632 _destroy( this.originalElement ); 22633 22634 return this; 22635 }, 22636 22637 _setOption: function( key, value ) { 22638 this._super( key, value ); 22639 22640 switch ( key ) { 22641 case "handles": 22642 this._removeHandles(); 22643 this._setupHandles(); 22644 break; 22645 case "aspectRatio": 22646 this._aspectRatio = !!value; 22647 break; 22648 default: 22649 break; 22650 } 22651 }, 22652 22653 _setupHandles: function() { 22654 var o = this.options, handle, i, n, hname, axis, that = this; 22655 this.handles = o.handles || 22656 ( !$( ".ui-resizable-handle", this.element ).length ? 22657 "e,s,se" : { 22658 n: ".ui-resizable-n", 22659 e: ".ui-resizable-e", 22660 s: ".ui-resizable-s", 22661 w: ".ui-resizable-w", 22662 se: ".ui-resizable-se", 22663 sw: ".ui-resizable-sw", 22664 ne: ".ui-resizable-ne", 22665 nw: ".ui-resizable-nw" 22666 } ); 22667 22668 this._handles = $(); 22669 this._addedHandles = $(); 22670 if ( this.handles.constructor === String ) { 22671 22672 if ( this.handles === "all" ) { 22673 this.handles = "n,e,s,w,se,sw,ne,nw"; 22674 } 22675 22676 n = this.handles.split( "," ); 22677 this.handles = {}; 22678 22679 for ( i = 0; i < n.length; i++ ) { 22680 22681 handle = String.prototype.trim.call( n[ i ] ); 22682 hname = "ui-resizable-" + handle; 22683 axis = $( "<div>" ); 22684 this._addClass( axis, "ui-resizable-handle " + hname ); 22685 22686 axis.css( { zIndex: o.zIndex } ); 22687 22688 this.handles[ handle ] = ".ui-resizable-" + handle; 22689 if ( !this.element.children( this.handles[ handle ] ).length ) { 22690 this.element.append( axis ); 22691 this._addedHandles = this._addedHandles.add( axis ); 22692 } 22693 } 22694 22695 } 22696 22697 this._renderAxis = function( target ) { 22698 22699 var i, axis, padPos, padWrapper; 22700 22701 target = target || this.element; 22702 22703 for ( i in this.handles ) { 22704 22705 if ( this.handles[ i ].constructor === String ) { 22706 this.handles[ i ] = this.element.children( this.handles[ i ] ).first().show(); 22707 } else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) { 22708 this.handles[ i ] = $( this.handles[ i ] ); 22709 this._on( this.handles[ i ], { "mousedown": that._mouseDown } ); 22710 } 22711 22712 if ( this.elementIsWrapper && 22713 this.originalElement[ 0 ] 22714 .nodeName 22715 .match( /^(textarea|input|select|button)$/i ) ) { 22716 axis = $( this.handles[ i ], this.element ); 22717 22718 padWrapper = /sw|ne|nw|se|n|s/.test( i ) ? 22719 axis.outerHeight() : 22720 axis.outerWidth(); 22721 22722 padPos = [ "padding", 22723 /ne|nw|n/.test( i ) ? "Top" : 22724 /se|sw|s/.test( i ) ? "Bottom" : 22725 /^e$/.test( i ) ? "Right" : "Left" ].join( "" ); 22726 22727 target.css( padPos, padWrapper ); 22728 22729 this._proportionallyResize(); 22730 } 22731 22732 this._handles = this._handles.add( this.handles[ i ] ); 22733 } 22734 }; 22735 22736 // TODO: make renderAxis a prototype function 22737 this._renderAxis( this.element ); 22738 22739 this._handles = this._handles.add( this.element.find( ".ui-resizable-handle" ) ); 22740 this._handles.disableSelection(); 22741 22742 this._handles.on( "mouseover", function() { 22743 if ( !that.resizing ) { 22744 if ( this.className ) { 22745 axis = this.className.match( /ui-resizable-(se|sw|ne|nw|n|e|s|w)/i ); 22746 } 22747 that.axis = axis && axis[ 1 ] ? axis[ 1 ] : "se"; 22748 } 22749 } ); 22750 22751 if ( o.autoHide ) { 22752 this._handles.hide(); 22753 this._addClass( "ui-resizable-autohide" ); 22754 } 22755 }, 22756 22757 _removeHandles: function() { 22758 this._addedHandles.remove(); 22759 }, 22760 22761 _mouseCapture: function( event ) { 22762 var i, handle, 22763 capture = false; 22764 22765 for ( i in this.handles ) { 22766 handle = $( this.handles[ i ] )[ 0 ]; 22767 if ( handle === event.target || $.contains( handle, event.target ) ) { 22768 capture = true; 22769 } 22770 } 22771 22772 return !this.options.disabled && capture; 22773 }, 22774 22775 _mouseStart: function( event ) { 22776 22777 var curleft, curtop, cursor, 22778 o = this.options, 22779 el = this.element; 22780 22781 this.resizing = true; 22782 22783 this._renderProxy(); 22784 22785 curleft = this._num( this.helper.css( "left" ) ); 22786 curtop = this._num( this.helper.css( "top" ) ); 22787 22788 if ( o.containment ) { 22789 curleft += $( o.containment ).scrollLeft() || 0; 22790 curtop += $( o.containment ).scrollTop() || 0; 22791 } 22792 22793 this.offset = this.helper.offset(); 22794 this.position = { left: curleft, top: curtop }; 22795 22796 this.size = this._helper ? { 22797 width: this.helper.width(), 22798 height: this.helper.height() 22799 } : { 22800 width: el.width(), 22801 height: el.height() 22802 }; 22803 22804 this.originalSize = this._helper ? { 22805 width: el.outerWidth(), 22806 height: el.outerHeight() 22807 } : { 22808 width: el.width(), 22809 height: el.height() 22810 }; 22811 22812 this.sizeDiff = { 22813 width: el.outerWidth() - el.width(), 22814 height: el.outerHeight() - el.height() 22815 }; 22816 22817 this.originalPosition = { left: curleft, top: curtop }; 22818 this.originalMousePosition = { left: event.pageX, top: event.pageY }; 22819 22820 this.aspectRatio = ( typeof o.aspectRatio === "number" ) ? 22821 o.aspectRatio : 22822 ( ( this.originalSize.width / this.originalSize.height ) || 1 ); 22823 22824 cursor = $( ".ui-resizable-" + this.axis ).css( "cursor" ); 22825 $( "body" ).css( "cursor", cursor === "auto" ? this.axis + "-resize" : cursor ); 22826 22827 this._addClass( "ui-resizable-resizing" ); 22828 this._propagate( "start", event ); 22829 return true; 22830 }, 22831 22832 _mouseDrag: function( event ) { 22833 22834 var data, props, 22835 smp = this.originalMousePosition, 22836 a = this.axis, 22837 dx = ( event.pageX - smp.left ) || 0, 22838 dy = ( event.pageY - smp.top ) || 0, 22839 trigger = this._change[ a ]; 22840 22841 this._updatePrevProperties(); 22842 22843 if ( !trigger ) { 22844 return false; 22845 } 22846 22847 data = trigger.apply( this, [ event, dx, dy ] ); 22848 22849 this._updateVirtualBoundaries( event.shiftKey ); 22850 if ( this._aspectRatio || event.shiftKey ) { 22851 data = this._updateRatio( data, event ); 22852 } 22853 22854 data = this._respectSize( data, event ); 22855 22856 this._updateCache( data ); 22857 22858 this._propagate( "resize", event ); 22859 22860 props = this._applyChanges(); 22861 22862 if ( !this._helper && this._proportionallyResizeElements.length ) { 22863 this._proportionallyResize(); 22864 } 22865 22866 if ( !$.isEmptyObject( props ) ) { 22867 this._updatePrevProperties(); 22868 this._trigger( "resize", event, this.ui() ); 22869 this._applyChanges(); 22870 } 22871 22872 return false; 22873 }, 22874 22875 _mouseStop: function( event ) { 22876 22877 this.resizing = false; 22878 var pr, ista, soffseth, soffsetw, s, left, top, 22879 o = this.options, that = this; 22880 22881 if ( this._helper ) { 22882 22883 pr = this._proportionallyResizeElements; 22884 ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ); 22885 soffseth = ista && this._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height; 22886 soffsetw = ista ? 0 : that.sizeDiff.width; 22887 22888 s = { 22889 width: ( that.helper.width() - soffsetw ), 22890 height: ( that.helper.height() - soffseth ) 22891 }; 22892 left = ( parseFloat( that.element.css( "left" ) ) + 22893 ( that.position.left - that.originalPosition.left ) ) || null; 22894 top = ( parseFloat( that.element.css( "top" ) ) + 22895 ( that.position.top - that.originalPosition.top ) ) || null; 22896 22897 if ( !o.animate ) { 22898 this.element.css( $.extend( s, { top: top, left: left } ) ); 22899 } 22900 22901 that.helper.height( that.size.height ); 22902 that.helper.width( that.size.width ); 22903 22904 if ( this._helper && !o.animate ) { 22905 this._proportionallyResize(); 22906 } 22907 } 22908 22909 $( "body" ).css( "cursor", "auto" ); 22910 22911 this._removeClass( "ui-resizable-resizing" ); 22912 22913 this._propagate( "stop", event ); 22914 22915 if ( this._helper ) { 22916 this.helper.remove(); 22917 } 22918 22919 return false; 22920 22921 }, 22922 22923 _updatePrevProperties: function() { 22924 this.prevPosition = { 22925 top: this.position.top, 22926 left: this.position.left 22927 }; 22928 this.prevSize = { 22929 width: this.size.width, 22930 height: this.size.height 22931 }; 22932 }, 22933 22934 _applyChanges: function() { 22935 var props = {}; 22936 22937 if ( this.position.top !== this.prevPosition.top ) { 22938 props.top = this.position.top + "px"; 22939 } 22940 if ( this.position.left !== this.prevPosition.left ) { 22941 props.left = this.position.left + "px"; 22942 }
vendor: 9,533 bytes, lines 22943-23310
22943 if ( this.size.width !== this.prevSize.width ) { 22944 props.width = this.size.width + "px"; 22945 } 22946 if ( this.size.height !== this.prevSize.height ) { 22947 props.height = this.size.height + "px"; 22948 } 22949 22950 this.helper.css( props ); 22951 22952 return props; 22953 }, 22954 22955 _updateVirtualBoundaries: function( forceAspectRatio ) { 22956 var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b, 22957 o = this.options; 22958 22959 b = { 22960 minWidth: this._isNumber( o.minWidth ) ? o.minWidth : 0, 22961 maxWidth: this._isNumber( o.maxWidth ) ? o.maxWidth : Infinity, 22962 minHeight: this._isNumber( o.minHeight ) ? o.minHeight : 0, 22963 maxHeight: this._isNumber( o.maxHeight ) ? o.maxHeight : Infinity 22964 }; 22965 22966 if ( this._aspectRatio || forceAspectRatio ) { 22967 pMinWidth = b.minHeight * this.aspectRatio; 22968 pMinHeight = b.minWidth / this.aspectRatio; 22969 pMaxWidth = b.maxHeight * this.aspectRatio; 22970 pMaxHeight = b.maxWidth / this.aspectRatio; 22971 22972 if ( pMinWidth > b.minWidth ) { 22973 b.minWidth = pMinWidth; 22974 } 22975 if ( pMinHeight > b.minHeight ) { 22976 b.minHeight = pMinHeight; 22977 } 22978 if ( pMaxWidth < b.maxWidth ) { 22979 b.maxWidth = pMaxWidth; 22980 } 22981 if ( pMaxHeight < b.maxHeight ) { 22982 b.maxHeight = pMaxHeight; 22983 } 22984 } 22985 this._vBoundaries = b; 22986 }, 22987 22988 _updateCache: function( data ) { 22989 this.offset = this.helper.offset(); 22990 if ( this._isNumber( data.left ) ) { 22991 this.position.left = data.left; 22992 } 22993 if ( this._isNumber( data.top ) ) { 22994 this.position.top = data.top; 22995 } 22996 if ( this._isNumber( data.height ) ) { 22997 this.size.height = data.height; 22998 } 22999 if ( this._isNumber( data.width ) ) { 23000 this.size.width = data.width; 23001 } 23002 }, 23003 23004 _updateRatio: function( data ) { 23005 23006 var cpos = this.position, 23007 csize = this.size, 23008 a = this.axis; 23009 23010 if ( this._isNumber( data.height ) ) { 23011 data.width = ( data.height * this.aspectRatio ); 23012 } else if ( this._isNumber( data.width ) ) { 23013 data.height = ( data.width / this.aspectRatio ); 23014 } 23015 23016 if ( a === "sw" ) { 23017 data.left = cpos.left + ( csize.width - data.width ); 23018 data.top = null; 23019 } 23020 if ( a === "nw" ) { 23021 data.top = cpos.top + ( csize.height - data.height ); 23022 data.left = cpos.left + ( csize.width - data.width ); 23023 } 23024 23025 return data; 23026 }, 23027 23028 _respectSize: function( data ) { 23029 23030 var o = this._vBoundaries, 23031 a = this.axis, 23032 ismaxw = this._isNumber( data.width ) && o.maxWidth && ( o.maxWidth < data.width ), 23033 ismaxh = this._isNumber( data.height ) && o.maxHeight && ( o.maxHeight < data.height ), 23034 isminw = this._isNumber( data.width ) && o.minWidth && ( o.minWidth > data.width ), 23035 isminh = this._isNumber( data.height ) && o.minHeight && ( o.minHeight > data.height ), 23036 dw = this.originalPosition.left + this.originalSize.width, 23037 dh = this.originalPosition.top + this.originalSize.height, 23038 cw = /sw|nw|w/.test( a ), ch = /nw|ne|n/.test( a ); 23039 if ( isminw ) { 23040 data.width = o.minWidth; 23041 } 23042 if ( isminh ) { 23043 data.height = o.minHeight; 23044 } 23045 if ( ismaxw ) { 23046 data.width = o.maxWidth; 23047 } 23048 if ( ismaxh ) { 23049 data.height = o.maxHeight; 23050 } 23051 23052 if ( isminw && cw ) { 23053 data.left = dw - o.minWidth; 23054 } 23055 if ( ismaxw && cw ) { 23056 data.left = dw - o.maxWidth; 23057 } 23058 if ( isminh && ch ) { 23059 data.top = dh - o.minHeight; 23060 } 23061 if ( ismaxh && ch ) { 23062 data.top = dh - o.maxHeight; 23063 } 23064 23065 // Fixing jump error on top/left - bug #2330 23066 if ( !data.width && !data.height && !data.left && data.top ) { 23067 data.top = null; 23068 } else if ( !data.width && !data.height && !data.top && data.left ) { 23069 data.left = null; 23070 } 23071 23072 return data; 23073 }, 23074 23075 _getPaddingPlusBorderDimensions: function( element ) { 23076 var i = 0, 23077 widths = [], 23078 borders = [ 23079 element.css( "borderTopWidth" ), 23080 element.css( "borderRightWidth" ), 23081 element.css( "borderBottomWidth" ), 23082 element.css( "borderLeftWidth" ) 23083 ], 23084 paddings = [ 23085 element.css( "paddingTop" ), 23086 element.css( "paddingRight" ), 23087 element.css( "paddingBottom" ), 23088 element.css( "paddingLeft" ) 23089 ]; 23090 23091 for ( ; i < 4; i++ ) { 23092 widths[ i ] = ( parseFloat( borders[ i ] ) || 0 ); 23093 widths[ i ] += ( parseFloat( paddings[ i ] ) || 0 ); 23094 } 23095 23096 return { 23097 height: widths[ 0 ] + widths[ 2 ], 23098 width: widths[ 1 ] + widths[ 3 ] 23099 }; 23100 }, 23101 23102 _proportionallyResize: function() { 23103 23104 if ( !this._proportionallyResizeElements.length ) { 23105 return; 23106 } 23107 23108 var prel, 23109 i = 0, 23110 element = this.helper || this.element; 23111 23112 for ( ; i < this._proportionallyResizeElements.length; i++ ) { 23113 23114 prel = this._proportionallyResizeElements[ i ]; 23115 23116 // TODO: Seems like a bug to cache this.outerDimensions 23117 // considering that we are in a loop. 23118 if ( !this.outerDimensions ) { 23119 this.outerDimensions = this._getPaddingPlusBorderDimensions( prel ); 23120 } 23121 23122 prel.css( { 23123 height: ( element.height() - this.outerDimensions.height ) || 0, 23124 width: ( element.width() - this.outerDimensions.width ) || 0 23125 } ); 23126 23127 } 23128 23129 }, 23130 23131 _renderProxy: function() { 23132 23133 var el = this.element, o = this.options; 23134 this.elementOffset = el.offset(); 23135 23136 if ( this._helper ) { 23137 23138 this.helper = this.helper || $( "<div></div>" ).css( { overflow: "hidden" } ); 23139 23140 this._addClass( this.helper, this._helper ); 23141 this.helper.css( { 23142 width: this.element.outerWidth(), 23143 height: this.element.outerHeight(), 23144 position: "absolute", 23145 left: this.elementOffset.left + "px", 23146 top: this.elementOffset.top + "px", 23147 zIndex: ++o.zIndex //TODO: Don't modify option 23148 } ); 23149 23150 this.helper 23151 .appendTo( "body" ) 23152 .disableSelection(); 23153 23154 } else { 23155 this.helper = this.element; 23156 } 23157 23158 }, 23159 23160 _change: { 23161 e: function( event, dx ) { 23162 return { width: this.originalSize.width + dx }; 23163 }, 23164 w: function( event, dx ) { 23165 var cs = this.originalSize, sp = this.originalPosition; 23166 return { left: sp.left + dx, width: cs.width - dx }; 23167 }, 23168 n: function( event, dx, dy ) { 23169 var cs = this.originalSize, sp = this.originalPosition; 23170 return { top: sp.top + dy, height: cs.height - dy }; 23171 }, 23172 s: function( event, dx, dy ) { 23173 return { height: this.originalSize.height + dy }; 23174 }, 23175 se: function( event, dx, dy ) { 23176 return $.extend( this._change.s.apply( this, arguments ), 23177 this._change.e.apply( this, [ event, dx, dy ] ) ); 23178 }, 23179 sw: function( event, dx, dy ) { 23180 return $.extend( this._change.s.apply( this, arguments ), 23181 this._change.w.apply( this, [ event, dx, dy ] ) ); 23182 }, 23183 ne: function( event, dx, dy ) { 23184 return $.extend( this._change.n.apply( this, arguments ), 23185 this._change.e.apply( this, [ event, dx, dy ] ) ); 23186 }, 23187 nw: function( event, dx, dy ) { 23188 return $.extend( this._change.n.apply( this, arguments ), 23189 this._change.w.apply( this, [ event, dx, dy ] ) ); 23190 } 23191 }, 23192 23193 _propagate: function( n, event ) { 23194 $.ui.plugin.call( this, n, [ event, this.ui() ] ); 23195 if ( n !== "resize" ) { 23196 this._trigger( n, event, this.ui() ); 23197 } 23198 }, 23199 23200 plugins: {}, 23201 23202 ui: function() { 23203 return { 23204 originalElement: this.originalElement, 23205 element: this.element, 23206 helper: this.helper, 23207 position: this.position, 23208 size: this.size, 23209 originalSize: this.originalSize, 23210 originalPosition: this.originalPosition 23211 }; 23212 } 23213 23214} ); 23215 23216/* 23217 * Resizable Extensions 23218 */ 23219 23220$.ui.plugin.add( "resizable", "animate", { 23221 23222 stop: function( event ) { 23223 var that = $( this ).resizable( "instance" ), 23224 o = that.options, 23225 pr = that._proportionallyResizeElements, 23226 ista = pr.length && ( /textarea/i ).test( pr[ 0 ].nodeName ), 23227 soffseth = ista && that._hasScroll( pr[ 0 ], "left" ) ? 0 : that.sizeDiff.height, 23228 soffsetw = ista ? 0 : that.sizeDiff.width, 23229 style = { 23230 width: ( that.size.width - soffsetw ), 23231 height: ( that.size.height - soffseth ) 23232 }, 23233 left = ( parseFloat( that.element.css( "left" ) ) + 23234 ( that.position.left - that.originalPosition.left ) ) || null, 23235 top = ( parseFloat( that.element.css( "top" ) ) + 23236 ( that.position.top - that.originalPosition.top ) ) || null; 23237 23238 that.element.animate( 23239 $.extend( style, top && left ? { top: top, left: left } : {} ), { 23240 duration: o.animateDuration, 23241 easing: o.animateEasing, 23242 step: function() { 23243 23244 var data = { 23245 width: parseFloat( that.element.css( "width" ) ), 23246 height: parseFloat( that.element.css( "height" ) ), 23247 top: parseFloat( that.element.css( "top" ) ), 23248 left: parseFloat( that.element.css( "left" ) ) 23249 }; 23250 23251 if ( pr && pr.length ) { 23252 $( pr[ 0 ] ).css( { width: data.width, height: data.height } ); 23253 } 23254 23255 // Propagating resize, and updating values for each animation step 23256 that._updateCache( data ); 23257 that._propagate( "resize", event ); 23258 23259 } 23260 } 23261 ); 23262 } 23263 23264} ); 23265 23266$.ui.plugin.add( "resizable", "containment", { 23267 23268 start: function() { 23269 var element, p, co, ch, cw, width, height, 23270 that = $( this ).resizable( "instance" ), 23271 o = that.options, 23272 el = that.element, 23273 oc = o.containment, 23274 ce = ( oc instanceof $ ) ? 23275 oc.get( 0 ) : 23276 ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc; 23277 23278 if ( !ce ) { 23279 return; 23280 } 23281 23282 that.containerElement = $( ce ); 23283 23284 if ( /document/.test( oc ) || oc === document ) { 23285 that.containerOffset = { 23286 left: 0, 23287 top: 0 23288 }; 23289 that.containerPosition = { 23290 left: 0, 23291 top: 0 23292 }; 23293 23294 that.parentData = { 23295 element: $( document ), 23296 left: 0, 23297 top: 0, 23298 width: $( document ).width(), 23299 height: $( document ).height() || document.body.parentNode.scrollHeight 23300 }; 23301 } else { 23302 element = $( ce ); 23303 p = []; 23304 $( [ "Top", "Right", "Left", "Bottom" ] ).each( function( i, name ) { 23305 p[ i ] = that._num( element.css( "padding" + name ) ); 23306 } ); 23307 23308 that.containerOffset = element.offset(); 23309 that.containerPosition = element.position(); 23310 that.containerSize = {
vendor: 5,871 bytes, lines 23311-23535
23311 height: ( element.innerHeight() - p[ 3 ] ), 23312 width: ( element.innerWidth() - p[ 1 ] ) 23313 }; 23314 23315 co = that.containerOffset; 23316 ch = that.containerSize.height; 23317 cw = that.containerSize.width; 23318 width = ( that._hasScroll( ce, "left" ) ? ce.scrollWidth : cw ); 23319 height = ( that._hasScroll( ce ) ? ce.scrollHeight : ch ); 23320 23321 that.parentData = { 23322 element: ce, 23323 left: co.left, 23324 top: co.top, 23325 width: width, 23326 height: height 23327 }; 23328 } 23329 }, 23330 23331 resize: function( event ) { 23332 var woset, hoset, isParent, isOffsetRelative, 23333 that = $( this ).resizable( "instance" ), 23334 o = that.options, 23335 co = that.containerOffset, 23336 cp = that.position, 23337 pRatio = that._aspectRatio || event.shiftKey, 23338 cop = { 23339 top: 0, 23340 left: 0 23341 }, 23342 ce = that.containerElement, 23343 continueResize = true; 23344 23345 if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) { 23346 cop = co; 23347 } 23348 23349 if ( cp.left < ( that._helper ? co.left : 0 ) ) { 23350 that.size.width = that.size.width + 23351 ( that._helper ? 23352 ( that.position.left - co.left ) : 23353 ( that.position.left - cop.left ) ); 23354 23355 if ( pRatio ) { 23356 that.size.height = that.size.width / that.aspectRatio; 23357 continueResize = false; 23358 } 23359 that.position.left = o.helper ? co.left : 0; 23360 } 23361 23362 if ( cp.top < ( that._helper ? co.top : 0 ) ) { 23363 that.size.height = that.size.height + 23364 ( that._helper ? 23365 ( that.position.top - co.top ) : 23366 that.position.top ); 23367 23368 if ( pRatio ) { 23369 that.size.width = that.size.height * that.aspectRatio; 23370 continueResize = false; 23371 } 23372 that.position.top = that._helper ? co.top : 0; 23373 } 23374 23375 isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 ); 23376 isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) ); 23377 23378 if ( isParent && isOffsetRelative ) { 23379 that.offset.left = that.parentData.left + that.position.left; 23380 that.offset.top = that.parentData.top + that.position.top; 23381 } else { 23382 that.offset.left = that.element.offset().left; 23383 that.offset.top = that.element.offset().top; 23384 } 23385 23386 woset = Math.abs( that.sizeDiff.width + 23387 ( that._helper ? 23388 that.offset.left - cop.left : 23389 ( that.offset.left - co.left ) ) ); 23390 23391 hoset = Math.abs( that.sizeDiff.height + 23392 ( that._helper ? 23393 that.offset.top - cop.top : 23394 ( that.offset.top - co.top ) ) ); 23395 23396 if ( woset + that.size.width >= that.parentData.width ) { 23397 that.size.width = that.parentData.width - woset; 23398 if ( pRatio ) { 23399 that.size.height = that.size.width / that.aspectRatio; 23400 continueResize = false; 23401 } 23402 } 23403 23404 if ( hoset + that.size.height >= that.parentData.height ) { 23405 that.size.height = that.parentData.height - hoset; 23406 if ( pRatio ) { 23407 that.size.width = that.size.height * that.aspectRatio; 23408 continueResize = false; 23409 } 23410 } 23411 23412 if ( !continueResize ) { 23413 that.position.left = that.prevPosition.left; 23414 that.position.top = that.prevPosition.top; 23415 that.size.width = that.prevSize.width; 23416 that.size.height = that.prevSize.height; 23417 } 23418 }, 23419 23420 stop: function() { 23421 var that = $( this ).resizable( "instance" ), 23422 o = that.options, 23423 co = that.containerOffset, 23424 cop = that.containerPosition, 23425 ce = that.containerElement, 23426 helper = $( that.helper ), 23427 ho = helper.offset(), 23428 w = helper.outerWidth() - that.sizeDiff.width, 23429 h = helper.outerHeight() - that.sizeDiff.height; 23430 23431 if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) { 23432 $( this ).css( { 23433 left: ho.left - cop.left - co.left, 23434 width: w, 23435 height: h 23436 } ); 23437 } 23438 23439 if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) { 23440 $( this ).css( { 23441 left: ho.left - cop.left - co.left, 23442 width: w, 23443 height: h 23444 } ); 23445 } 23446 } 23447} ); 23448 23449$.ui.plugin.add( "resizable", "alsoResize", { 23450 23451 start: function() { 23452 var that = $( this ).resizable( "instance" ), 23453 o = that.options; 23454 23455 $( o.alsoResize ).each( function() { 23456 var el = $( this ); 23457 el.data( "ui-resizable-alsoresize", { 23458 width: parseFloat( el.width() ), height: parseFloat( el.height() ), 23459 left: parseFloat( el.css( "left" ) ), top: parseFloat( el.css( "top" ) ) 23460 } ); 23461 } ); 23462 }, 23463 23464 resize: function( event, ui ) { 23465 var that = $( this ).resizable( "instance" ), 23466 o = that.options, 23467 os = that.originalSize, 23468 op = that.originalPosition, 23469 delta = { 23470 height: ( that.size.height - os.height ) || 0, 23471 width: ( that.size.width - os.width ) || 0, 23472 top: ( that.position.top - op.top ) || 0, 23473 left: ( that.position.left - op.left ) || 0 23474 }; 23475 23476 $( o.alsoResize ).each( function() { 23477 var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {}, 23478 css = el.parents( ui.originalElement[ 0 ] ).length ? 23479 [ "width", "height" ] : 23480 [ "width", "height", "top", "left" ]; 23481 23482 $.each( css, function( i, prop ) { 23483 var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 ); 23484 if ( sum && sum >= 0 ) { 23485 style[ prop ] = sum || null; 23486 } 23487 } ); 23488 23489 el.css( style ); 23490 } ); 23491 }, 23492 23493 stop: function() { 23494 $( this ).removeData( "ui-resizable-alsoresize" ); 23495 } 23496} ); 23497 23498$.ui.plugin.add( "resizable", "ghost", { 23499 23500 start: function() { 23501 23502 var that = $( this ).resizable( "instance" ), cs = that.size; 23503 23504 that.ghost = that.originalElement.clone(); 23505 that.ghost.css( { 23506 opacity: 0.25, 23507 display: "block", 23508 position: "relative", 23509 height: cs.height, 23510 width: cs.width, 23511 margin: 0, 23512 left: 0, 23513 top: 0 23514 } ); 23515 23516 that._addClass( that.ghost, "ui-resizable-ghost" ); 23517 23518 // DEPRECATED 23519 // TODO: remove after 1.12 23520 if ( $.uiBackCompat !== false && typeof that.options.ghost === "string" ) { 23521 23522 // Ghost option 23523 that.ghost.addClass( this.options.ghost ); 23524 } 23525 23526 that.ghost.appendTo( that.helper ); 23527 23528 }, 23529 23530 resize: function() { 23531 var that = $( this ).resizable( "instance" ); 23532 if ( that.ghost ) { 23533 that.ghost.css( { 23534 position: "relative", 23535 height: that.size.height,
vendor: 2,863 bytes, lines 23536-23647
23536 width: that.size.width 23537 } ); 23538 } 23539 }, 23540 23541 stop: function() { 23542 var that = $( this ).resizable( "instance" ); 23543 if ( that.ghost && that.helper ) { 23544 that.helper.get( 0 ).removeChild( that.ghost.get( 0 ) ); 23545 } 23546 } 23547 23548} ); 23549 23550$.ui.plugin.add( "resizable", "grid", { 23551 23552 resize: function() { 23553 var outerDimensions, 23554 that = $( this ).resizable( "instance" ), 23555 o = that.options, 23556 cs = that.size, 23557 os = that.originalSize, 23558 op = that.originalPosition, 23559 a = that.axis, 23560 grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid, 23561 gridX = ( grid[ 0 ] || 1 ), 23562 gridY = ( grid[ 1 ] || 1 ), 23563 ox = Math.round( ( cs.width - os.width ) / gridX ) * gridX, 23564 oy = Math.round( ( cs.height - os.height ) / gridY ) * gridY, 23565 newWidth = os.width + ox, 23566 newHeight = os.height + oy, 23567 isMaxWidth = o.maxWidth && ( o.maxWidth < newWidth ), 23568 isMaxHeight = o.maxHeight && ( o.maxHeight < newHeight ), 23569 isMinWidth = o.minWidth && ( o.minWidth > newWidth ), 23570 isMinHeight = o.minHeight && ( o.minHeight > newHeight ); 23571 23572 o.grid = grid; 23573 23574 if ( isMinWidth ) { 23575 newWidth += gridX; 23576 } 23577 if ( isMinHeight ) { 23578 newHeight += gridY; 23579 } 23580 if ( isMaxWidth ) { 23581 newWidth -= gridX; 23582 } 23583 if ( isMaxHeight ) { 23584 newHeight -= gridY; 23585 } 23586 23587 if ( /^(se|s|e)$/.test( a ) ) { 23588 that.size.width = newWidth; 23589 that.size.height = newHeight; 23590 } else if ( /^(ne)$/.test( a ) ) { 23591 that.size.width = newWidth; 23592 that.size.height = newHeight; 23593 that.position.top = op.top - oy; 23594 } else if ( /^(sw)$/.test( a ) ) { 23595 that.size.width = newWidth; 23596 that.size.height = newHeight; 23597 that.position.left = op.left - ox; 23598 } else { 23599 if ( newHeight - gridY <= 0 || newWidth - gridX <= 0 ) { 23600 outerDimensions = that._getPaddingPlusBorderDimensions( this ); 23601 } 23602 23603 if ( newHeight - gridY > 0 ) { 23604 that.size.height = newHeight; 23605 that.position.top = op.top - oy; 23606 } else { 23607 newHeight = gridY - outerDimensions.height; 23608 that.size.height = newHeight; 23609 that.position.top = op.top + os.height - newHeight; 23610 } 23611 if ( newWidth - gridX > 0 ) { 23612 that.size.width = newWidth; 23613 that.position.left = op.left - ox; 23614 } else { 23615 newWidth = gridX - outerDimensions.width; 23616 that.size.width = newWidth; 23617 that.position.left = op.left + os.width - newWidth; 23618 } 23619 } 23620 } 23621 23622} ); 23623 23624var widgetsResizable = $.ui.resizable; 23625 23626 23627/*! 23628 * jQuery UI Dialog 1.13.2 23629 * http://jqueryui.com 23630 * 23631 * Copyright jQuery Foundation and other contributors 23632 * Released under the MIT license. 23633 * http://jquery.org/license 23634 */ 23635 23636//>>label: Dialog 23637//>>group: Widgets 23638//>>description: Displays customizable dialog windows. 23639//>>docs: http://api.jqueryui.com/dialog/ 23640//>>demos: http://jqueryui.com/dialog/ 23641//>>css.structure: ../../themes/base/core.css 23642//>>css.structure: ../../themes/base/dialog.css 23643//>>css.theme: ../../themes/base/theme.css 23644 23645 23646$.widget( "ui.dialog", { 23647 version: "1.13.2
vendor: 20,928 bytes, lines 23647-24481
23647", 23648 options: { 23649 appendTo: "body", 23650 autoOpen: true, 23651 buttons: [], 23652 classes: { 23653 "ui-dialog": "ui-corner-all", 23654 "ui-dialog-titlebar": "ui-corner-all" 23655 }, 23656 closeOnEscape: true, 23657 closeText: "Close", 23658 draggable: true, 23659 hide: null, 23660 height: "auto", 23661 maxHeight: null, 23662 maxWidth: null, 23663 minHeight: 150, 23664 minWidth: 150, 23665 modal: false, 23666 position: { 23667 my: "center", 23668 at: "center", 23669 of: window, 23670 collision: "fit", 23671 23672 // Ensure the titlebar is always visible 23673 using: function( pos ) { 23674 var topOffset = $( this ).css( pos ).offset().top; 23675 if ( topOffset < 0 ) { 23676 $( this ).css( "top", pos.top - topOffset ); 23677 } 23678 } 23679 }, 23680 resizable: true, 23681 show: null, 23682 title: null, 23683 width: 300, 23684 23685 // Callbacks 23686 beforeClose: null, 23687 close: null, 23688 drag: null, 23689 dragStart: null, 23690 dragStop: null, 23691 focus: null, 23692 open: null, 23693 resize: null, 23694 resizeStart: null, 23695 resizeStop: null 23696 }, 23697 23698 sizeRelatedOptions: { 23699 buttons: true, 23700 height: true, 23701 maxHeight: true, 23702 maxWidth: true, 23703 minHeight: true, 23704 minWidth: true, 23705 width: true 23706 }, 23707 23708 resizableRelatedOptions: { 23709 maxHeight: true, 23710 maxWidth: true, 23711 minHeight: true, 23712 minWidth: true 23713 }, 23714 23715 _create: function() { 23716 this.originalCss = { 23717 display: this.element[ 0 ].style.display, 23718 width: this.element[ 0 ].style.width, 23719 minHeight: this.element[ 0 ].style.minHeight, 23720 maxHeight: this.element[ 0 ].style.maxHeight, 23721 height: this.element[ 0 ].style.height 23722 }; 23723 this.originalPosition = { 23724 parent: this.element.parent(), 23725 index: this.element.parent().children().index( this.element ) 23726 }; 23727 this.originalTitle = this.element.attr( "title" ); 23728 if ( this.options.title == null && this.originalTitle != null ) { 23729 this.options.title = this.originalTitle; 23730 } 23731 23732 // Dialogs can't be disabled 23733 if ( this.options.disabled ) { 23734 this.options.disabled = false; 23735 } 23736 23737 this._createWrapper(); 23738 23739 this.element 23740 .show() 23741 .removeAttr( "title" ) 23742 .appendTo( this.uiDialog ); 23743 23744 this._addClass( "ui-dialog-content", "ui-widget-content" ); 23745 23746 this._createTitlebar(); 23747 this._createButtonPane(); 23748 23749 if ( this.options.draggable && $.fn.draggable ) { 23750 this._makeDraggable(); 23751 } 23752 if ( this.options.resizable && $.fn.resizable ) { 23753 this._makeResizable(); 23754 } 23755 23756 this._isOpen = false; 23757 23758 this._trackFocus(); 23759 }, 23760 23761 _init: function() { 23762 if ( this.options.autoOpen ) { 23763 this.open(); 23764 } 23765 }, 23766 23767 _appendTo: function() { 23768 var element = this.options.appendTo; 23769 if ( element && ( element.jquery || element.nodeType ) ) { 23770 return $( element ); 23771 } 23772 return this.document.find( element || "body" ).eq( 0 ); 23773 }, 23774 23775 _destroy: function() { 23776 var next, 23777 originalPosition = this.originalPosition; 23778 23779 this._untrackInstance(); 23780 this._destroyOverlay(); 23781 23782 this.element 23783 .removeUniqueId() 23784 .css( this.originalCss ) 23785 23786 // Without detaching first, the following becomes really slow 23787 .detach(); 23788 23789 this.uiDialog.remove(); 23790 23791 if ( this.originalTitle ) { 23792 this.element.attr( "title", this.originalTitle ); 23793 } 23794 23795 next = originalPosition.parent.children().eq( originalPosition.index ); 23796 23797 // Don't try to place the dialog next to itself (#8613) 23798 if ( next.length && next[ 0 ] !== this.element[ 0 ] ) { 23799 next.before( this.element ); 23800 } else { 23801 originalPosition.parent.append( this.element ); 23802 } 23803 }, 23804 23805 widget: function() { 23806 return this.uiDialog; 23807 }, 23808 23809 disable: $.noop, 23810 enable: $.noop, 23811 23812 close: function( event ) { 23813 var that = this; 23814 23815 if ( !this._isOpen || this._trigger( "beforeClose", event ) === false ) { 23816 return; 23817 } 23818 23819 this._isOpen = false; 23820 this._focusedElement = null; 23821 this._destroyOverlay(); 23822 this._untrackInstance(); 23823 23824 if ( !this.opener.filter( ":focusable" ).trigger( "focus" ).length ) { 23825 23826 // Hiding a focused element doesn't trigger blur in WebKit 23827 // so in case we have nothing to focus on, explicitly blur the active element 23828 // https://bugs.webkit.org/show_bug.cgi?id=47182 23829 $.ui.safeBlur( $.ui.safeActiveElement( this.document[ 0 ] ) ); 23830 } 23831 23832 this._hide( this.uiDialog, this.options.hide, function() { 23833 that._trigger( "close", event ); 23834 } ); 23835 }, 23836 23837 isOpen: function() { 23838 return this._isOpen; 23839 }, 23840 23841 moveToTop: function() { 23842 this._moveToTop(); 23843 }, 23844 23845 _moveToTop: function( event, silent ) { 23846 var moved = false, 23847 zIndices = this.uiDialog.siblings( ".ui-front:visible" ).map( function() { 23848 return +$( this ).css( "z-index" ); 23849 } ).get(), 23850 zIndexMax = Math.max.apply( null, zIndices ); 23851 23852 if ( zIndexMax >= +this.uiDialog.css( "z-index" ) ) { 23853 this.uiDialog.css( "z-index", zIndexMax + 1 ); 23854 moved = true; 23855 } 23856 23857 if ( moved && !silent ) { 23858 this._trigger( "focus", event ); 23859 } 23860 return moved; 23861 }, 23862 23863 open: function() { 23864 var that = this; 23865 if ( this._isOpen ) { 23866 if ( this._moveToTop() ) { 23867 this._focusTabbable(); 23868 } 23869 return; 23870 } 23871 23872 this._isOpen = true; 23873 this.opener = $( $.ui.safeActiveElement( this.document[ 0 ] ) ); 23874 23875 this._size(); 23876 this._position(); 23877 this._createOverlay(); 23878 this._moveToTop( null, true ); 23879 23880 // Ensure the overlay is moved to the top with the dialog, but only when 23881 // opening. The overlay shouldn't move after the dialog is open so that 23882 // modeless dialogs opened after the modal dialog stack properly. 23883 if ( this.overlay ) { 23884 this.overlay.css( "z-index", this.uiDialog.css( "z-index" ) - 1 ); 23885 } 23886 23887 this._show( this.uiDialog, this.options.show, function() { 23888 that._focusTabbable(); 23889 that._trigger( "focus" ); 23890 } ); 23891 23892 // Track the dialog immediately upon opening in case a focus event 23893 // somehow occurs outside of the dialog before an element inside the 23894 // dialog is focused (#10152) 23895 this._makeFocusTarget(); 23896 23897 this._trigger( "open" ); 23898 }, 23899 23900 _focusTabbable: function() { 23901 23902 // Set focus to the first match: 23903 // 1. An element that was focused previously 23904 // 2. First element inside the dialog matching [autofocus] 23905 // 3. Tabbable element inside the content element 23906 // 4. Tabbable element inside the buttonpane 23907 // 5. The close button 23908 // 6. The dialog itself 23909 var hasFocus = this._focusedElement; 23910 if ( !hasFocus ) { 23911 hasFocus = this.element.find( "[autofocus]" ); 23912 } 23913 if ( !hasFocus.length ) { 23914 hasFocus = this.element.find( ":tabbable" ); 23915 } 23916 if ( !hasFocus.length ) { 23917 hasFocus = this.uiDialogButtonPane.find( ":tabbable" ); 23918 } 23919 if ( !hasFocus.length ) { 23920 hasFocus = this.uiDialogTitlebarClose.filter( ":tabbable" ); 23921 } 23922 if ( !hasFocus.length ) { 23923 hasFocus = this.uiDialog; 23924 } 23925 hasFocus.eq( 0 ).trigger( "focus" ); 23926 }, 23927 23928 _restoreTabbableFocus: function() { 23929 var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ), 23930 isActive = this.uiDialog[ 0 ] === activeElement || 23931 $.contains( this.uiDialog[ 0 ], activeElement ); 23932 if ( !isActive ) { 23933 this._focusTabbable(); 23934 } 23935 }, 23936 23937 _keepFocus: function( event ) { 23938 event.preventDefault(); 23939 this._restoreTabbableFocus(); 23940 23941 // support: IE 23942 // IE <= 8 doesn't prevent moving focus even with event.preventDefault() 23943 // so we check again later 23944 this._delay( this._restoreTabbableFocus ); 23945 }, 23946 23947 _createWrapper: function() { 23948 this.uiDialog = $( "<div>" ) 23949 .hide() 23950 .attr( { 23951 23952 // Setting tabIndex makes the div focusable 23953 tabIndex: -1, 23954 role: "dialog" 23955 } ) 23956 .appendTo( this._appendTo() ); 23957 23958 this._addClass( this.uiDialog, "ui-dialog", "ui-widget ui-widget-content ui-front" ); 23959 this._on( this.uiDialog, { 23960 keydown: function( event ) { 23961 if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode && 23962 event.keyCode === $.ui.keyCode.ESCAPE ) { 23963 event.preventDefault(); 23964 this.close( event ); 23965 return; 23966 } 23967 23968 // Prevent tabbing out of dialogs 23969 if ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) { 23970 return; 23971 } 23972 var tabbables = this.uiDialog.find( ":tabbable" ), 23973 first = tabbables.first(), 23974 last = tabbables.last(); 23975 23976 if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) && 23977 !event.shiftKey ) { 23978 this._delay( function() { 23979 first.trigger( "focus" ); 23980 } ); 23981 event.preventDefault(); 23982 } else if ( ( event.target === first[ 0 ] || 23983 event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) { 23984 this._delay( function() { 23985 last.trigger( "focus" ); 23986 } ); 23987 event.preventDefault(); 23988 } 23989 }, 23990 mousedown: function( event ) { 23991 if ( this._moveToTop( event ) ) { 23992 this._focusTabbable(); 23993 } 23994 } 23995 } ); 23996 23997 // We assume that any existing aria-describedby attribute means 23998 // that the dialog content is marked up properly 23999 // otherwise we brute force the content as the description 24000 if ( !this.element.find( "[aria-describedby]" ).length ) { 24001 this.uiDialog.attr( { 24002 "aria-describedby": this.element.uniqueId().attr( "id" ) 24003 } ); 24004 } 24005 }, 24006 24007 _createTitlebar: function() { 24008 var uiDialogTitle; 24009 24010 this.uiDialogTitlebar = $( "<div>" ); 24011 this._addClass( this.uiDialogTitlebar, 24012 "ui-dialog-titlebar", "ui-widget-header ui-helper-clearfix" ); 24013 this._on( this.uiDialogTitlebar, { 24014 mousedown: function( event ) { 24015 24016 // Don't prevent click on close button (#8838) 24017 // Focusing a dialog that is partially scrolled out of view 24018 // causes the browser to scroll it into view, preventing the click event 24019 if ( !$( event.target ).closest( ".ui-dialog-titlebar-close" ) ) { 24020 24021 // Dialog isn't getting focus when dragging (#8063) 24022 this.uiDialog.trigger( "focus" ); 24023 } 24024 } 24025 } ); 24026 24027 // Support: IE 24028 // Use type="button" to prevent enter keypresses in textboxes from closing the 24029 // dialog in IE (#9312) 24030 this.uiDialogTitlebarClose = $( "<button type='button'></button>" ) 24031 .button( { 24032 label: $( "<a>" ).text( this.options.closeText ).html(), 24033 icon: "ui-icon-closethick", 24034 showLabel: false 24035 } ) 24036 .appendTo( this.uiDialogTitlebar ); 24037 24038 this._addClass( this.uiDialogTitlebarClose, "ui-dialog-titlebar-close" ); 24039 this._on( this.uiDialogTitlebarClose, { 24040 click: function( event ) { 24041 event.preventDefault(); 24042 this.close( event ); 24043 } 24044 } ); 24045 24046 uiDialogTitle = $( "<span>" ).uniqueId().prependTo( this.uiDialogTitlebar ); 24047 this._addClass( uiDialogTitle, "ui-dialog-title" ); 24048 this._title( uiDialogTitle ); 24049 24050 this.uiDialogTitlebar.prependTo( this.uiDialog ); 24051 24052 this.uiDialog.attr( { 24053 "aria-labelledby": uiDialogTitle.attr( "id" ) 24054 } ); 24055 }, 24056 24057 _title: function( title ) { 24058 if ( this.options.title ) { 24059 title.text( this.options.title ); 24060 } else { 24061 title.html( " " ); 24062 } 24063 }, 24064 24065 _createButtonPane: function() { 24066 this.uiDialogButtonPane = $( "<div>" ); 24067 this._addClass( this.uiDialogButtonPane, "ui-dialog-buttonpane", 24068 "ui-widget-content ui-helper-clearfix" ); 24069 24070 this.uiButtonSet = $( "<div>" ) 24071 .appendTo( this.uiDialogButtonPane ); 24072 this._addClass( this.uiButtonSet, "ui-dialog-buttonset" ); 24073 24074 this._createButtons(); 24075 }, 24076 24077 _createButtons: function() { 24078 var that = this, 24079 buttons = this.options.buttons; 24080 24081 // If we already have a button pane, remove it 24082 this.uiDialogButtonPane.remove(); 24083 this.uiButtonSet.empty(); 24084 24085 if ( $.isEmptyObject( buttons ) || ( Array.isArray( buttons ) && !buttons.length ) ) { 24086 this._removeClass( this.uiDialog, "ui-dialog-buttons" ); 24087 return; 24088 } 24089 24090 $.each( buttons, function( name, props ) { 24091 var click, buttonOptions; 24092 props = typeof props === "function" ? 24093 { click: props, text: name } : 24094 props; 24095 24096 // Default to a non-submitting button 24097 props = $.extend( { type: "button" }, props ); 24098 24099 // Change the context for the click callback to be the main element 24100 click = props.click; 24101 buttonOptions = { 24102 icon: props.icon, 24103 iconPosition: props.iconPosition, 24104 showLabel: props.showLabel, 24105 24106 // Deprecated options 24107 icons: props.icons, 24108 text: props.text 24109 }; 24110 24111 delete props.click; 24112 delete props.icon; 24113 delete props.iconPosition; 24114 delete props.showLabel; 24115 24116 // Deprecated options 24117 delete props.icons; 24118 if ( typeof props.text === "boolean" ) { 24119 delete props.text; 24120 } 24121 24122 $( "<button></button>", props ) 24123 .button( buttonOptions ) 24124 .appendTo( that.uiButtonSet ) 24125 .on( "click", function() { 24126 click.apply( that.element[ 0 ], arguments ); 24127 } ); 24128 } ); 24129 this._addClass( this.uiDialog, "ui-dialog-buttons" ); 24130 this.uiDialogButtonPane.appendTo( this.uiDialog ); 24131 }, 24132 24133 _makeDraggable: function() { 24134 var that = this, 24135 options = this.options; 24136 24137 function filteredUi( ui ) { 24138 return { 24139 position: ui.position, 24140 offset: ui.offset 24141 }; 24142 } 24143 24144 this.uiDialog.draggable( { 24145 cancel: ".ui-dialog-content, .ui-dialog-titlebar-close", 24146 handle: ".ui-dialog-titlebar", 24147 containment: "document", 24148 start: function( event, ui ) { 24149 that._addClass( $( this ), "ui-dialog-dragging" ); 24150 that._blockFrames(); 24151 that._trigger( "dragStart", event, filteredUi( ui ) ); 24152 }, 24153 drag: function( event, ui ) { 24154 that._trigger( "drag", event, filteredUi( ui ) ); 24155 }, 24156 stop: function( event, ui ) { 24157 var left = ui.offset.left - that.document.scrollLeft(), 24158 top = ui.offset.top - that.document.scrollTop(); 24159 24160 options.position = { 24161 my: "left top", 24162 at: "left" + ( left >= 0 ? "+" : "" ) + left + " " + 24163 "top" + ( top >= 0 ? "+" : "" ) + top, 24164 of: that.window 24165 }; 24166 that._removeClass( $( this ), "ui-dialog-dragging" ); 24167 that._unblockFrames(); 24168 that._trigger( "dragStop", event, filteredUi( ui ) ); 24169 } 24170 } ); 24171 }, 24172 24173 _makeResizable: function() { 24174 var that = this, 24175 options = this.options, 24176 handles = options.resizable, 24177 24178 // .ui-resizable has position: relative defined in the stylesheet 24179 // but dialogs have to use absolute or fixed positioning 24180 position = this.uiDialog.css( "position" ), 24181 resizeHandles = typeof handles === "string" ? 24182 handles : 24183 "n,e,s,w,se,sw,ne,nw"; 24184 24185 function filteredUi( ui ) { 24186 return { 24187 originalPosition: ui.originalPosition, 24188 originalSize: ui.originalSize, 24189 position: ui.position, 24190 size: ui.size 24191 }; 24192 } 24193 24194 this.uiDialog.resizable( { 24195 cancel: ".ui-dialog-content", 24196 containment: "document", 24197 alsoResize: this.element, 24198 maxWidth: options.maxWidth, 24199 maxHeight: options.maxHeight, 24200 minWidth: options.minWidth, 24201 minHeight: this._minHeight(), 24202 handles: resizeHandles, 24203 start: function( event, ui ) { 24204 that._addClass( $( this ), "ui-dialog-resizing" ); 24205 that._blockFrames(); 24206 that._trigger( "resizeStart", event, filteredUi( ui ) ); 24207 }, 24208 resize: function( event, ui ) { 24209 that._trigger( "resize", event, filteredUi( ui ) ); 24210 }, 24211 stop: function( event, ui ) { 24212 var offset = that.uiDialog.offset(), 24213 left = offset.left - that.document.scrollLeft(), 24214 top = offset.top - that.document.scrollTop(); 24215 24216 options.height = that.uiDialog.height(); 24217 options.width = that.uiDialog.width(); 24218 options.position = { 24219 my: "left top", 24220 at: "left" + ( left >= 0 ? "+" : "" ) + left + " " + 24221 "top" + ( top >= 0 ? "+" : "" ) + top, 24222 of: that.window 24223 }; 24224 that._removeClass( $( this ), "ui-dialog-resizing" ); 24225 that._unblockFrames(); 24226 that._trigger( "resizeStop", event, filteredUi( ui ) ); 24227 } 24228 } ) 24229 .css( "position", position ); 24230 }, 24231 24232 _trackFocus: function() { 24233 this._on( this.widget(), { 24234 focusin: function( event ) { 24235 this._makeFocusTarget(); 24236 this._focusedElement = $( event.target ); 24237 } 24238 } ); 24239 }, 24240 24241 _makeFocusTarget: function() { 24242 this._untrackInstance(); 24243 this._trackingInstances().unshift( this ); 24244 }, 24245 24246 _untrackInstance: function() { 24247 var instances = this._trackingInstances(), 24248 exists = $.inArray( this, instances ); 24249 if ( exists !== -1 ) { 24250 instances.splice( exists, 1 ); 24251 } 24252 }, 24253 24254 _trackingInstances: function() { 24255 var instances = this.document.data( "ui-dialog-instances" ); 24256 if ( !instances ) { 24257 instances = []; 24258 this.document.data( "ui-dialog-instances", instances ); 24259 } 24260 return instances; 24261 }, 24262 24263 _minHeight: function() { 24264 var options = this.options; 24265 24266 return options.height === "auto" ? 24267 options.minHeight : 24268 Math.min( options.minHeight, options.height ); 24269 }, 24270 24271 _position: function() { 24272 24273 // Need to show the dialog to get the actual offset in the position plugin 24274 var isVisible = this.uiDialog.is( ":visible" ); 24275 if ( !isVisible ) { 24276 this.uiDialog.show(); 24277 } 24278 this.uiDialog.position( this.options.position ); 24279 if ( !isVisible ) { 24280 this.uiDialog.hide(); 24281 } 24282 }, 24283 24284 _setOptions: function( options ) { 24285 var that = this, 24286 resize = false, 24287 resizableOptions = {}; 24288 24289 $.each( options, function( key, value ) { 24290 that._setOption( key, value ); 24291 24292 if ( key in that.sizeRelatedOptions ) { 24293 resize = true; 24294 } 24295 if ( key in that.resizableRelatedOptions ) { 24296 resizableOptions[ key ] = value; 24297 } 24298 } ); 24299 24300 if ( resize ) { 24301 this._size(); 24302 this._position(); 24303 } 24304 if ( this.uiDialog.is( ":data(ui-resizable)" ) ) { 24305 this.uiDialog.resizable( "option", resizableOptions ); 24306 } 24307 }, 24308 24309 _setOption: function( key, value ) { 24310 var isDraggable, isResizable, 24311 uiDialog = this.uiDialog; 24312 24313 if ( key === "disabled" ) { 24314 return; 24315 } 24316 24317 this._super( key, value ); 24318 24319 if ( key === "appendTo" ) { 24320 this.uiDialog.appendTo( this._appendTo() ); 24321 } 24322 24323 if ( key === "buttons" ) { 24324 this._createButtons(); 24325 } 24326 24327 if ( key === "closeText" ) { 24328 this.uiDialogTitlebarClose.button( { 24329 24330 // Ensure that we always pass a string 24331 label: $( "<a>" ).text( "" + this.options.closeText ).html() 24332 } ); 24333 } 24334 24335 if ( key === "draggable" ) { 24336 isDraggable = uiDialog.is( ":data(ui-draggable)" ); 24337 if ( isDraggable && !value ) { 24338 uiDialog.draggable( "destroy" ); 24339 } 24340 24341 if ( !isDraggable && value ) { 24342 this._makeDraggable(); 24343 } 24344 } 24345 24346 if ( key === "position" ) { 24347 this._position(); 24348 } 24349 24350 if ( key === "resizable" ) { 24351 24352 // currently resizable, becoming non-resizable 24353 isResizable = uiDialog.is( ":data(ui-resizable)" ); 24354 if ( isResizable && !value ) { 24355 uiDialog.resizable( "destroy" ); 24356 } 24357 24358 // Currently resizable, changing handles 24359 if ( isResizable && typeof value === "string" ) { 24360 uiDialog.resizable( "option", "handles", value ); 24361 } 24362 24363 // Currently non-resizable, becoming resizable 24364 if ( !isResizable && value !== false ) { 24365 this._makeResizable(); 24366 } 24367 } 24368 24369 if ( key === "title" ) { 24370 this._title( this.uiDialogTitlebar.find( ".ui-dialog-title" ) ); 24371 } 24372 }, 24373 24374 _size: function() { 24375 24376 // If the user has resized the dialog, the .ui-dialog and .ui-dialog-content 24377 // divs will both have width and height set, so we need to reset them 24378 var nonContentHeight, minContentHeight, maxContentHeight, 24379 options = this.options; 24380 24381 // Reset content sizing 24382 this.element.show().css( { 24383 width: "auto", 24384 minHeight: 0, 24385 maxHeight: "none", 24386 height: 0 24387 } ); 24388 24389 if ( options.minWidth > options.width ) { 24390 options.width = options.minWidth; 24391 } 24392 24393 // Reset wrapper sizing 24394 // determine the height of all the non-content elements 24395 nonContentHeight = this.uiDialog.css( { 24396 height: "auto", 24397 width: options.width 24398 } ) 24399 .outerHeight(); 24400 minContentHeight = Math.max( 0, options.minHeight - nonContentHeight ); 24401 maxContentHeight = typeof options.maxHeight === "number" ? 24402 Math.max( 0, options.maxHeight - nonContentHeight ) : 24403 "none"; 24404 24405 if ( options.height === "auto" ) { 24406 this.element.css( { 24407 minHeight: minContentHeight, 24408 maxHeight: maxContentHeight, 24409 height: "auto" 24410 } ); 24411 } else { 24412 this.element.height( Math.max( 0, options.height - nonContentHeight ) ); 24413 } 24414 24415 if ( this.uiDialog.is( ":data(ui-resizable)" ) ) { 24416 this.uiDialog.resizable( "option", "minHeight", this._minHeight() ); 24417 } 24418 }, 24419 24420 _blockFrames: function() { 24421 this.iframeBlocks = this.document.find( "iframe" ).map( function() { 24422 var iframe = $( this ); 24423 24424 return $( "<div>" ) 24425 .css( { 24426 position: "absolute", 24427 width: iframe.outerWidth(), 24428 height: iframe.outerHeight() 24429 } ) 24430 .appendTo( iframe.parent() ) 24431 .offset( iframe.offset() )[ 0 ]; 24432 } ); 24433 }, 24434 24435 _unblockFrames: function() { 24436 if ( this.iframeBlocks ) { 24437 this.iframeBlocks.remove(); 24438 delete this.iframeBlocks; 24439 } 24440 }, 24441 24442 _allowInteraction: function( event ) { 24443 if ( $( event.target ).closest( ".ui-dialog" ).length ) { 24444 return true; 24445 } 24446 24447 // TODO: Remove hack when datepicker implements 24448 // the .ui-front logic (#8989) 24449 return !!$( event.target ).closest( ".ui-datepicker" ).length; 24450 }, 24451 24452 _createOverlay: function() { 24453 if ( !this.options.modal ) { 24454 return; 24455 } 24456 24457 var jqMinor = $.fn.jquery.substring( 0, 4 ); 24458 24459 // We use a delay in case the overlay is created from an 24460 // event that we're going to be cancelling (#2804) 24461 var isOpening = true; 24462 this._delay( function() { 24463 isOpening = false; 24464 } ); 24465 24466 if ( !this.document.data( "ui-dialog-overlays" ) ) { 24467 24468 // Prevent use of anchors and inputs 24469 // This doesn't use `_on()` because it is a shared event handler 24470 // across all open modal dialogs. 24471 this.document.on( "focusin.ui-dialog", function( event ) { 24472 if ( isOpening ) { 24473 return; 24474 } 24475 24476 var instance = this._trackingInstances()[ 0 ]; 24477 if ( !instance._allowInteraction( event ) ) { 24478 event.preventDefault(); 24479 instance._focusTabbable(); 24480 24481 // Support: jQuery >=3.4 <3.
vendor: 2,202 bytes, lines 24481-24569
244816 only 24482 // Focus re-triggering in jQuery 3.4/3.5 makes the original element 24483 // have its focus event propagated last, breaking the re-targeting. 24484 // Trigger focus in a delay in addition if needed to avoid the issue 24485 // See https://github.com/jquery/jquery/issues/4382 24486 if ( jqMinor === "3.4." || jqMinor === "3.5." ) { 24487 instance._delay( instance._restoreTabbableFocus ); 24488 } 24489 } 24490 }.bind( this ) ); 24491 } 24492 24493 this.overlay = $( "<div>" ) 24494 .appendTo( this._appendTo() ); 24495 24496 this._addClass( this.overlay, null, "ui-widget-overlay ui-front" ); 24497 this._on( this.overlay, { 24498 mousedown: "_keepFocus" 24499 } ); 24500 this.document.data( "ui-dialog-overlays", 24501 ( this.document.data( "ui-dialog-overlays" ) || 0 ) + 1 ); 24502 }, 24503 24504 _destroyOverlay: function() { 24505 if ( !this.options.modal ) { 24506 return; 24507 } 24508 24509 if ( this.overlay ) { 24510 var overlays = this.document.data( "ui-dialog-overlays" ) - 1; 24511 24512 if ( !overlays ) { 24513 this.document.off( "focusin.ui-dialog" ); 24514 this.document.removeData( "ui-dialog-overlays" ); 24515 } else { 24516 this.document.data( "ui-dialog-overlays", overlays ); 24517 } 24518 24519 this.overlay.remove(); 24520 this.overlay = null; 24521 } 24522 } 24523} ); 24524 24525// DEPRECATED 24526// TODO: switch return back to widget declaration at top of file when this is removed 24527if ( $.uiBackCompat !== false ) { 24528 24529 // Backcompat for dialogClass option 24530 $.widget( "ui.dialog", $.ui.dialog, { 24531 options: { 24532 dialogClass: "" 24533 }, 24534 _createWrapper: function() { 24535 this._super(); 24536 this.uiDialog.addClass( this.options.dialogClass ); 24537 }, 24538 _setOption: function( key, value ) { 24539 if ( key === "dialogClass" ) { 24540 this.uiDialog 24541 .removeClass( this.options.dialogClass ) 24542 .addClass( value ); 24543 } 24544 this._superApply( arguments ); 24545 } 24546 } ); 24547} 24548 24549var widgetsDialog = $.ui.dialog; 24550 24551 24552/*! 24553 * jQuery UI Droppable 1.13.2 24554 * http://jqueryui.com 24555 * 24556 * Copyright jQuery Foundation and other contributors 24557 * Released under the MIT license. 24558 * http://jquery.org/license 24559 */ 24560 24561//>>label: Droppable 24562//>>group: Interactions 24563//>>description: Enables drop targets for draggable elements. 24564//>>docs: http://api.jqueryui.com/droppable/ 24565//>>demos: http://jqueryui.com/droppable/ 24566 24567 24568$.widget( "ui.droppable", { 24569 version: "1.13
vendor: 11,313 bytes, lines 24569-24997
24569.2", 24570 widgetEventPrefix: "drop", 24571 options: { 24572 accept: "*", 24573 addClasses: true, 24574 greedy: false, 24575 scope: "default", 24576 tolerance: "intersect", 24577 24578 // Callbacks 24579 activate: null, 24580 deactivate: null, 24581 drop: null, 24582 out: null, 24583 over: null 24584 }, 24585 _create: function() { 24586 24587 var proportions, 24588 o = this.options, 24589 accept = o.accept; 24590 24591 this.isover = false; 24592 this.isout = true; 24593 24594 this.accept = typeof accept === "function" ? accept : function( d ) { 24595 return d.is( accept ); 24596 }; 24597 24598 this.proportions = function( /* valueToWrite */ ) { 24599 if ( arguments.length ) { 24600 24601 // Store the droppable's proportions 24602 proportions = arguments[ 0 ]; 24603 } else { 24604 24605 // Retrieve or derive the droppable's proportions 24606 return proportions ? 24607 proportions : 24608 proportions = { 24609 width: this.element[ 0 ].offsetWidth, 24610 height: this.element[ 0 ].offsetHeight 24611 }; 24612 } 24613 }; 24614 24615 this._addToManager( o.scope ); 24616 24617 if ( o.addClasses ) { 24618 this._addClass( "ui-droppable" ); 24619 } 24620 24621 }, 24622 24623 _addToManager: function( scope ) { 24624 24625 // Add the reference and positions to the manager 24626 $.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || []; 24627 $.ui.ddmanager.droppables[ scope ].push( this ); 24628 }, 24629 24630 _splice: function( drop ) { 24631 var i = 0; 24632 for ( ; i < drop.length; i++ ) { 24633 if ( drop[ i ] === this ) { 24634 drop.splice( i, 1 ); 24635 } 24636 } 24637 }, 24638 24639 _destroy: function() { 24640 var drop = $.ui.ddmanager.droppables[ this.options.scope ]; 24641 24642 this._splice( drop ); 24643 }, 24644 24645 _setOption: function( key, value ) { 24646 24647 if ( key === "accept" ) { 24648 this.accept = typeof value === "function" ? value : function( d ) { 24649 return d.is( value ); 24650 }; 24651 } else if ( key === "scope" ) { 24652 var drop = $.ui.ddmanager.droppables[ this.options.scope ]; 24653 24654 this._splice( drop ); 24655 this._addToManager( value ); 24656 } 24657 24658 this._super( key, value ); 24659 }, 24660 24661 _activate: function( event ) { 24662 var draggable = $.ui.ddmanager.current; 24663 24664 this._addActiveClass(); 24665 if ( draggable ) { 24666 this._trigger( "activate", event, this.ui( draggable ) ); 24667 } 24668 }, 24669 24670 _deactivate: function( event ) { 24671 var draggable = $.ui.ddmanager.current; 24672 24673 this._removeActiveClass(); 24674 if ( draggable ) { 24675 this._trigger( "deactivate", event, this.ui( draggable ) ); 24676 } 24677 }, 24678 24679 _over: function( event ) { 24680 24681 var draggable = $.ui.ddmanager.current; 24682 24683 // Bail if draggable and droppable are same element 24684 if ( !draggable || ( draggable.currentItem || 24685 draggable.element )[ 0 ] === this.element[ 0 ] ) { 24686 return; 24687 } 24688 24689 if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || 24690 draggable.element ) ) ) { 24691 this._addHoverClass(); 24692 this._trigger( "over", event, this.ui( draggable ) ); 24693 } 24694 24695 }, 24696 24697 _out: function( event ) { 24698 24699 var draggable = $.ui.ddmanager.current; 24700 24701 // Bail if draggable and droppable are same element 24702 if ( !draggable || ( draggable.currentItem || 24703 draggable.element )[ 0 ] === this.element[ 0 ] ) { 24704 return; 24705 } 24706 24707 if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || 24708 draggable.element ) ) ) { 24709 this._removeHoverClass(); 24710 this._trigger( "out", event, this.ui( draggable ) ); 24711 } 24712 24713 }, 24714 24715 _drop: function( event, custom ) { 24716 24717 var draggable = custom || $.ui.ddmanager.current, 24718 childrenIntersection = false; 24719 24720 // Bail if draggable and droppable are same element 24721 if ( !draggable || ( draggable.currentItem || 24722 draggable.element )[ 0 ] === this.element[ 0 ] ) { 24723 return false; 24724 } 24725 24726 this.element 24727 .find( ":data(ui-droppable)" ) 24728 .not( ".ui-draggable-dragging" ) 24729 .each( function() { 24730 var inst = $( this ).droppable( "instance" ); 24731 if ( 24732 inst.options.greedy && 24733 !inst.options.disabled && 24734 inst.options.scope === draggable.options.scope && 24735 inst.accept.call( 24736 inst.element[ 0 ], ( draggable.currentItem || draggable.element ) 24737 ) && 24738 $.ui.intersect( 24739 draggable, 24740 $.extend( inst, { offset: inst.element.offset() } ), 24741 inst.options.tolerance, event 24742 ) 24743 ) { 24744 childrenIntersection = true; 24745 return false; 24746 } 24747 } ); 24748 if ( childrenIntersection ) { 24749 return false; 24750 } 24751 24752 if ( this.accept.call( this.element[ 0 ], 24753 ( draggable.currentItem || draggable.element ) ) ) { 24754 this._removeActiveClass(); 24755 this._removeHoverClass(); 24756 24757 this._trigger( "drop", event, this.ui( draggable ) ); 24758 return this.element; 24759 } 24760 24761 return false; 24762 24763 }, 24764 24765 ui: function( c ) { 24766 return { 24767 draggable: ( c.currentItem || c.element ), 24768 helper: c.helper, 24769 position: c.position, 24770 offset: c.positionAbs 24771 }; 24772 }, 24773 24774 // Extension points just to make backcompat sane and avoid duplicating logic 24775 // TODO: Remove in 1.14 along with call to it below 24776 _addHoverClass: function() { 24777 this._addClass( "ui-droppable-hover" ); 24778 }, 24779 24780 _removeHoverClass: function() { 24781 this._removeClass( "ui-droppable-hover" ); 24782 }, 24783 24784 _addActiveClass: function() { 24785 this._addClass( "ui-droppable-active" ); 24786 }, 24787 24788 _removeActiveClass: function() { 24789 this._removeClass( "ui-droppable-active" ); 24790 } 24791} ); 24792 24793$.ui.intersect = ( function() { 24794 function isOverAxis( x, reference, size ) { 24795 return ( x >= reference ) && ( x < ( reference + size ) ); 24796 } 24797 24798 return function( draggable, droppable, toleranceMode, event ) { 24799 24800 if ( !droppable.offset ) { 24801 return false; 24802 } 24803 24804 var x1 = ( draggable.positionAbs || 24805 draggable.position.absolute ).left + draggable.margins.left, 24806 y1 = ( draggable.positionAbs || 24807 draggable.position.absolute ).top + draggable.margins.top, 24808 x2 = x1 + draggable.helperProportions.width, 24809 y2 = y1 + draggable.helperProportions.height, 24810 l = droppable.offset.left, 24811 t = droppable.offset.top, 24812 r = l + droppable.proportions().width, 24813 b = t + droppable.proportions().height; 24814 24815 switch ( toleranceMode ) { 24816 case "fit": 24817 return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b ); 24818 case "intersect": 24819 return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half 24820 x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half 24821 t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half 24822 y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half 24823 case "pointer": 24824 return isOverAxis( event.pageY, t, droppable.proportions().height ) && 24825 isOverAxis( event.pageX, l, droppable.proportions().width ); 24826 case "touch": 24827 return ( 24828 ( y1 >= t && y1 <= b ) || // Top edge touching 24829 ( y2 >= t && y2 <= b ) || // Bottom edge touching 24830 ( y1 < t && y2 > b ) // Surrounded vertically 24831 ) && ( 24832 ( x1 >= l && x1 <= r ) || // Left edge touching 24833 ( x2 >= l && x2 <= r ) || // Right edge touching 24834 ( x1 < l && x2 > r ) // Surrounded horizontally 24835 ); 24836 default: 24837 return false; 24838 } 24839 }; 24840} )(); 24841 24842/* 24843 This manager tracks offsets of draggables and droppables 24844*/ 24845$.ui.ddmanager = { 24846 current: null, 24847 droppables: { "default": [] }, 24848 prepareOffsets: function( t, event ) { 24849 24850 var i, j, 24851 m = $.ui.ddmanager.droppables[ t.options.scope ] || [], 24852 type = event ? event.type : null, // workaround for #2317 24853 list = ( t.currentItem || t.element ).find( ":data(ui-droppable)" ).addBack(); 24854 24855 droppablesLoop: for ( i = 0; i < m.length; i++ ) { 24856 24857 // No disabled and non-accepted 24858 if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], 24859 ( t.currentItem || t.element ) ) ) ) { 24860 continue; 24861 } 24862 24863 // Filter out elements in the current dragged item 24864 for ( j = 0; j < list.length; j++ ) { 24865 if ( list[ j ] === m[ i ].element[ 0 ] ) { 24866 m[ i ].proportions().height = 0; 24867 continue droppablesLoop; 24868 } 24869 } 24870 24871 m[ i ].visible = m[ i ].element.css( "display" ) !== "none"; 24872 if ( !m[ i ].visible ) { 24873 continue; 24874 } 24875 24876 // Activate the droppable if used directly from draggables 24877 if ( type === "mousedown" ) { 24878 m[ i ]._activate.call( m[ i ], event ); 24879 } 24880 24881 m[ i ].offset = m[ i ].element.offset(); 24882 m[ i ].proportions( { 24883 width: m[ i ].element[ 0 ].offsetWidth, 24884 height: m[ i ].element[ 0 ].offsetHeight 24885 } ); 24886 24887 } 24888 24889 }, 24890 drop: function( draggable, event ) { 24891 24892 var dropped = false; 24893 24894 // Create a copy of the droppables in case the list changes during the drop (#9116) 24895 $.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() { 24896 24897 if ( !this.options ) { 24898 return; 24899 } 24900 if ( !this.options.disabled && this.visible && 24901 $.ui.intersect( draggable, this, this.options.tolerance, event ) ) { 24902 dropped = this._drop.call( this, event ) || dropped; 24903 } 24904 24905 if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], 24906 ( draggable.currentItem || draggable.element ) ) ) { 24907 this.isout = true; 24908 this.isover = false; 24909 this._deactivate.call( this, event ); 24910 } 24911 24912 } ); 24913 return dropped; 24914 24915 }, 24916 dragStart: function( draggable, event ) { 24917 24918 // Listen for scrolling so that if the dragging causes scrolling the position of the 24919 // droppables can be recalculated (see #5003) 24920 draggable.element.parentsUntil( "body" ).on( "scroll.droppable", function() { 24921 if ( !draggable.options.refreshPositions ) { 24922 $.ui.ddmanager.prepareOffsets( draggable, event ); 24923 } 24924 } ); 24925 }, 24926 drag: function( draggable, event ) { 24927 24928 // If you have a highly dynamic page, you might try this option. It renders positions 24929 // every time you move the mouse. 24930 if ( draggable.options.refreshPositions ) { 24931 $.ui.ddmanager.prepareOffsets( draggable, event ); 24932 } 24933 24934 // Run through all droppables and check their positions based on specific tolerance options 24935 $.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() { 24936 24937 if ( this.options.disabled || this.greedyChild || !this.visible ) { 24938 return; 24939 } 24940 24941 var parentInstance, scope, parent, 24942 intersects = $.ui.intersect( draggable, this, this.options.tolerance, event ), 24943 c = !intersects && this.isover ? 24944 "isout" : 24945 ( intersects && !this.isover ? "isover" : null ); 24946 if ( !c ) { 24947 return; 24948 } 24949 24950 if ( this.options.greedy ) { 24951 24952 // find droppable parents with same scope 24953 scope = this.options.scope; 24954 parent = this.element.parents( ":data(ui-droppable)" ).filter( function() { 24955 return $( this ).droppable( "instance" ).options.scope === scope; 24956 } ); 24957 24958 if ( parent.length ) { 24959 parentInstance = $( parent[ 0 ] ).droppable( "instance" ); 24960 parentInstance.greedyChild = ( c === "isover" ); 24961 } 24962 } 24963 24964 // We just moved into a greedy child 24965 if ( parentInstance && c === "isover" ) { 24966 parentInstance.isover = false; 24967 parentInstance.isout = true; 24968 parentInstance._out.call( parentInstance, event ); 24969 } 24970 24971 this[ c ] = true; 24972 this[ c === "isout" ? "isover" : "isout" ] = false; 24973 this[ c === "isover" ? "_over" : "_out" ].call( this, event ); 24974 24975 // We just moved out of a greedy child 24976 if ( parentInstance && c === "isout" ) { 24977 parentInstance.isout = false; 24978 parentInstance.isover = true; 24979 parentInstance._over.call( parentInstance, event ); 24980 } 24981 } ); 24982 24983 }, 24984 dragStop: function( draggable, event ) { 24985 draggable.element.parentsUntil( "body" ).off( "scroll.droppable" ); 24986 24987 // Call prepareOffsets one final time since IE does not fire return scroll events when 24988 // overflow was caused by drag (see #5003) 24989 if ( !draggable.options.refreshPositions ) { 24990 $.ui.ddmanager.prepareOffsets( draggable, event ); 24991 } 24992 } 24993}; 24994 24995// DEPRECATED 24996// TODO: switch return back to widget declaration at top of file when this is removed 24997if ( $.uiBackCompat
24997!== false ) { 24998 24999 // Backcompat for activeClass and hoverClass options 25000 $.widget( "ui.droppable", $.ui.droppable, { 25001 options: { 25002 hoverClass: false, 25003 activeClass: false 25004 }, 25005 _addActiveClass: function() { 25006 this._super(); 25007 if ( this.options.activeClass ) { 25008 this.element.addClass( this.options.activeClass ); 25009 } 25010 }, 25011 _removeActiveClass: function() { 25012 this._super(); 25013 if ( this.options.activeClass ) { 25014 this.element.removeClass( this.options.activeClass ); 25015 } 25016 }, 25017 _addHoverClass: function() { 25018 this._super(); 25019 if ( this.options.hoverClass ) { 25020 this.element.addClass( this.options.hoverClass ); 25021 } 25022 }, 25023 _removeHoverClass: function() { 25024 this._super(); 25025 if ( this.options.hoverClass ) { 25026 this.element.removeClass( this.options.hoverClass ); 25027 } 25028 } 25029 } ); 25030} 25031 25032var widgetsDroppable = $.ui.droppable; 25033 25034 25035/*! 25036 * jQuery UI Progressbar 1.13.2 25037 * http://jqueryui.com 25038 * 25039 * Copyright jQuery Foundation and other contributors 25040 * Released under the MIT license. 25041 * http://jquery.org/license 25042 */ 25043 25044//>>label: Progressbar 25045//>>group: Widgets 25046/* eslint-disable max-len */ 25047//>>
vendor: 4,215 bytes, lines 25047-25216
25047description: Displays a status indicator for loading state, standard percentage, and other progress indicators. 25048/* eslint-enable max-len */ 25049//>>docs: http://api.jqueryui.com/progressbar/ 25050//>>demos: http://jqueryui.com/progressbar/ 25051//>>css.structure: ../../themes/base/core.css 25052//>>css.structure: ../../themes/base/progressbar.css 25053//>>css.theme: ../../themes/base/theme.css 25054 25055 25056var widgetsProgressbar = $.widget( "ui.progressbar", { 25057 version: "1.13.2", 25058 options: { 25059 classes: { 25060 "ui-progressbar": "ui-corner-all", 25061 "ui-progressbar-value": "ui-corner-left", 25062 "ui-progressbar-complete": "ui-corner-right" 25063 }, 25064 max: 100, 25065 value: 0, 25066 25067 change: null, 25068 complete: null 25069 }, 25070 25071 min: 0, 25072 25073 _create: function() { 25074 25075 // Constrain initial value 25076 this.oldValue = this.options.value = this._constrainedValue(); 25077 25078 this.element.attr( { 25079 25080 // Only set static values; aria-valuenow and aria-valuemax are 25081 // set inside _refreshValue() 25082 role: "progressbar", 25083 "aria-valuemin": this.min 25084 } ); 25085 this._addClass( "ui-progressbar", "ui-widget ui-widget-content" ); 25086 25087 this.valueDiv = $( "<div>" ).appendTo( this.element ); 25088 this._addClass( this.valueDiv, "ui-progressbar-value", "ui-widget-header" ); 25089 this._refreshValue(); 25090 }, 25091 25092 _destroy: function() { 25093 this.element.removeAttr( "role aria-valuemin aria-valuemax aria-valuenow" ); 25094 25095 this.valueDiv.remove(); 25096 }, 25097 25098 value: function( newValue ) { 25099 if ( newValue === undefined ) { 25100 return this.options.value; 25101 } 25102 25103 this.options.value = this._constrainedValue( newValue ); 25104 this._refreshValue(); 25105 }, 25106 25107 _constrainedValue: function( newValue ) { 25108 if ( newValue === undefined ) { 25109 newValue = this.options.value; 25110 } 25111 25112 this.indeterminate = newValue === false; 25113 25114 // Sanitize value 25115 if ( typeof newValue !== "number" ) { 25116 newValue = 0; 25117 } 25118 25119 return this.indeterminate ? false : 25120 Math.min( this.options.max, Math.max( this.min, newValue ) ); 25121 }, 25122 25123 _setOptions: function( options ) { 25124 25125 // Ensure "value" option is set after other values (like max) 25126 var value = options.value; 25127 delete options.value; 25128 25129 this._super( options ); 25130 25131 this.options.value = this._constrainedValue( value ); 25132 this._refreshValue(); 25133 }, 25134 25135 _setOption: function( key, value ) { 25136 if ( key === "max" ) { 25137 25138 // Don't allow a max less than min 25139 value = Math.max( this.min, value ); 25140 } 25141 this._super( key, value ); 25142 }, 25143 25144 _setOptionDisabled: function( value ) { 25145 this._super( value ); 25146 25147 this.element.attr( "aria-disabled", value ); 25148 this._toggleClass( null, "ui-state-disabled", !!value ); 25149 }, 25150 25151 _percentage: function() { 25152 return this.indeterminate ? 25153 100 : 25154 100 * ( this.options.value - this.min ) / ( this.options.max - this.min ); 25155 }, 25156 25157 _refreshValue: function() { 25158 var value = this.options.value, 25159 percentage = this._percentage(); 25160 25161 this.valueDiv 25162 .toggle( this.indeterminate || value > this.min ) 25163 .width( percentage.toFixed( 0 ) + "%" ); 25164 25165 this 25166 ._toggleClass( this.valueDiv, "ui-progressbar-complete", null, 25167 value === this.options.max ) 25168 ._toggleClass( "ui-progressbar-indeterminate", null, this.indeterminate ); 25169 25170 if ( this.indeterminate ) { 25171 this.element.removeAttr( "aria-valuenow" ); 25172 if ( !this.overlayDiv ) { 25173 this.overlayDiv = $( "<div>" ).appendTo( this.valueDiv ); 25174 this._addClass( this.overlayDiv, "ui-progressbar-overlay" ); 25175 } 25176 } else { 25177 this.element.attr( { 25178 "aria-valuemax": this.options.max, 25179 "aria-valuenow": value 25180 } ); 25181 if ( this.overlayDiv ) { 25182 this.overlayDiv.remove(); 25183 this.overlayDiv = null; 25184 } 25185 } 25186 25187 if ( this.oldValue !== value ) { 25188 this.oldValue = value; 25189 this._trigger( "change" ); 25190 } 25191 if ( value === this.options.max ) { 25192 this._trigger( "complete" ); 25193 } 25194 } 25195} ); 25196 25197 25198/*! 25199 * jQuery UI Selectable 1.13.2 25200 * http://jqueryui.com 25201 * 25202 * Copyright jQuery Foundation and other contributors 25203 * Released under the MIT license. 25204 * http://jquery.org/license 25205 */ 25206 25207//>>label: Selectable 25208//>>group: Interactions 25209//>>description: Allows groups of elements to be selected with the mouse. 25210//>>docs: http://api.jqueryui.com/selectable/ 25211//>>demos: http://jqueryui.com/selectable/ 25212//>>css.structure: ../../themes/base/selectable.css 25213 25214 25215var widgetsSelectable = $.widget( "ui.selectable", $.ui.mouse, { 25216 version: "1.13
vendor: 7,327 bytes, lines 25216-25497
25216.2", 25217 options: { 25218 appendTo: "body", 25219 autoRefresh: true, 25220 distance: 0, 25221 filter: "*", 25222 tolerance: "touch", 25223 25224 // Callbacks 25225 selected: null, 25226 selecting: null, 25227 start: null, 25228 stop: null, 25229 unselected: null, 25230 unselecting: null 25231 }, 25232 _create: function() { 25233 var that = this; 25234 25235 this._addClass( "ui-selectable" ); 25236 25237 this.dragged = false; 25238 25239 // Cache selectee children based on filter 25240 this.refresh = function() { 25241 that.elementPos = $( that.element[ 0 ] ).offset(); 25242 that.selectees = $( that.options.filter, that.element[ 0 ] ); 25243 that._addClass( that.selectees, "ui-selectee" ); 25244 that.selectees.each( function() { 25245 var $this = $( this ), 25246 selecteeOffset = $this.offset(), 25247 pos = { 25248 left: selecteeOffset.left - that.elementPos.left, 25249 top: selecteeOffset.top - that.elementPos.top 25250 }; 25251 $.data( this, "selectable-item", { 25252 element: this, 25253 $element: $this, 25254 left: pos.left, 25255 top: pos.top, 25256 right: pos.left + $this.outerWidth(), 25257 bottom: pos.top + $this.outerHeight(), 25258 startselected: false, 25259 selected: $this.hasClass( "ui-selected" ), 25260 selecting: $this.hasClass( "ui-selecting" ), 25261 unselecting: $this.hasClass( "ui-unselecting" ) 25262 } ); 25263 } ); 25264 }; 25265 this.refresh(); 25266 25267 this._mouseInit(); 25268 25269 this.helper = $( "<div>" ); 25270 this._addClass( this.helper, "ui-selectable-helper" ); 25271 }, 25272 25273 _destroy: function() { 25274 this.selectees.removeData( "selectable-item" ); 25275 this._mouseDestroy(); 25276 }, 25277 25278 _mouseStart: function( event ) { 25279 var that = this, 25280 options = this.options; 25281 25282 this.opos = [ event.pageX, event.pageY ]; 25283 this.elementPos = $( this.element[ 0 ] ).offset(); 25284 25285 if ( this.options.disabled ) { 25286 return; 25287 } 25288 25289 this.selectees = $( options.filter, this.element[ 0 ] ); 25290 25291 this._trigger( "start", event ); 25292 25293 $( options.appendTo ).append( this.helper ); 25294 25295 // position helper (lasso) 25296 this.helper.css( { 25297 "left": event.pageX, 25298 "top": event.pageY, 25299 "width": 0, 25300 "height": 0 25301 } ); 25302 25303 if ( options.autoRefresh ) { 25304 this.refresh(); 25305 } 25306 25307 this.selectees.filter( ".ui-selected" ).each( function() { 25308 var selectee = $.data( this, "selectable-item" ); 25309 selectee.startselected = true; 25310 if ( !event.metaKey && !event.ctrlKey ) { 25311 that._removeClass( selectee.$element, "ui-selected" ); 25312 selectee.selected = false; 25313 that._addClass( selectee.$element, "ui-unselecting" ); 25314 selectee.unselecting = true; 25315 25316 // selectable UNSELECTING callback 25317 that._trigger( "unselecting", event, { 25318 unselecting: selectee.element 25319 } ); 25320 } 25321 } ); 25322 25323 $( event.target ).parents().addBack().each( function() { 25324 var doSelect, 25325 selectee = $.data( this, "selectable-item" ); 25326 if ( selectee ) { 25327 doSelect = ( !event.metaKey && !event.ctrlKey ) || 25328 !selectee.$element.hasClass( "ui-selected" ); 25329 that._removeClass( selectee.$element, doSelect ? "ui-unselecting" : "ui-selected" ) 25330 ._addClass( selectee.$element, doSelect ? "ui-selecting" : "ui-unselecting" ); 25331 selectee.unselecting = !doSelect; 25332 selectee.selecting = doSelect; 25333 selectee.selected = doSelect; 25334 25335 // selectable (UN)SELECTING callback 25336 if ( doSelect ) { 25337 that._trigger( "selecting", event, { 25338 selecting: selectee.element 25339 } ); 25340 } else { 25341 that._trigger( "unselecting", event, { 25342 unselecting: selectee.element 25343 } ); 25344 } 25345 return false; 25346 } 25347 } ); 25348 25349 }, 25350 25351 _mouseDrag: function( event ) { 25352 25353 this.dragged = true; 25354 25355 if ( this.options.disabled ) { 25356 return; 25357 } 25358 25359 var tmp, 25360 that = this, 25361 options = this.options, 25362 x1 = this.opos[ 0 ], 25363 y1 = this.opos[ 1 ], 25364 x2 = event.pageX, 25365 y2 = event.pageY; 25366 25367 if ( x1 > x2 ) { 25368 tmp = x2; x2 = x1; x1 = tmp; 25369 } 25370 if ( y1 > y2 ) { 25371 tmp = y2; y2 = y1; y1 = tmp; 25372 } 25373 this.helper.css( { left: x1, top: y1, width: x2 - x1, height: y2 - y1 } ); 25374 25375 this.selectees.each( function() { 25376 var selectee = $.data( this, "selectable-item" ), 25377 hit = false, 25378 offset = {}; 25379 25380 //prevent helper from being selected if appendTo: selectable 25381 if ( !selectee || selectee.element === that.element[ 0 ] ) { 25382 return; 25383 } 25384 25385 offset.left = selectee.left + that.elementPos.left; 25386 offset.right = selectee.right + that.elementPos.left; 25387 offset.top = selectee.top + that.elementPos.top; 25388 offset.bottom = selectee.bottom + that.elementPos.top; 25389 25390 if ( options.tolerance === "touch" ) { 25391 hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 || 25392 offset.bottom < y1 ) ); 25393 } else if ( options.tolerance === "fit" ) { 25394 hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 && 25395 offset.bottom < y2 ); 25396 } 25397 25398 if ( hit ) { 25399 25400 // SELECT 25401 if ( selectee.selected ) { 25402 that._removeClass( selectee.$element, "ui-selected" ); 25403 selectee.selected = false; 25404 } 25405 if ( selectee.unselecting ) { 25406 that._removeClass( selectee.$element, "ui-unselecting" ); 25407 selectee.unselecting = false; 25408 } 25409 if ( !selectee.selecting ) { 25410 that._addClass( selectee.$element, "ui-selecting" ); 25411 selectee.selecting = true; 25412 25413 // selectable SELECTING callback 25414 that._trigger( "selecting", event, { 25415 selecting: selectee.element 25416 } ); 25417 } 25418 } else { 25419 25420 // UNSELECT 25421 if ( selectee.selecting ) { 25422 if ( ( event.metaKey || event.ctrlKey ) && selectee.startselected ) { 25423 that._removeClass( selectee.$element, "ui-selecting" ); 25424 selectee.selecting = false; 25425 that._addClass( selectee.$element, "ui-selected" ); 25426 selectee.selected = true; 25427 } else { 25428 that._removeClass( selectee.$element, "ui-selecting" ); 25429 selectee.selecting = false; 25430 if ( selectee.startselected ) { 25431 that._addClass( selectee.$element, "ui-unselecting" ); 25432 selectee.unselecting = true; 25433 } 25434 25435 // selectable UNSELECTING callback 25436 that._trigger( "unselecting", event, { 25437 unselecting: selectee.element 25438 } ); 25439 } 25440 } 25441 if ( selectee.selected ) { 25442 if ( !event.metaKey && !event.ctrlKey && !selectee.startselected ) { 25443 that._removeClass( selectee.$element, "ui-selected" ); 25444 selectee.selected = false; 25445 25446 that._addClass( selectee.$element, "ui-unselecting" ); 25447 selectee.unselecting = true; 25448 25449 // selectable UNSELECTING callback 25450 that._trigger( "unselecting", event, { 25451 unselecting: selectee.element 25452 } ); 25453 } 25454 } 25455 } 25456 } ); 25457 25458 return false; 25459 }, 25460 25461 _mouseStop: function( event ) { 25462 var that = this; 25463 25464 this.dragged = false; 25465 25466 $( ".ui-unselecting", this.element[ 0 ] ).each( function() { 25467 var selectee = $.data( this, "selectable-item" ); 25468 that._removeClass( selectee.$element, "ui-unselecting" ); 25469 selectee.unselecting = false; 25470 selectee.startselected = false; 25471 that._trigger( "unselected", event, { 25472 unselected: selectee.element 25473 } ); 25474 } ); 25475 $( ".ui-selecting", this.element[ 0 ] ).each( function() { 25476 var selectee = $.data( this, "selectable-item" ); 25477 that._removeClass( selectee.$element, "ui-selecting" ) 25478 ._addClass( selectee.$element, "ui-selected" ); 25479 selectee.selecting = false; 25480 selectee.selected = true; 25481 selectee.startselected = true; 25482 that._trigger( "selected", event, { 25483 selected: selectee.element 25484 } ); 25485 } ); 25486 this._trigger( "stop", event ); 25487 25488 this.helper.remove(); 25489 25490 return false; 25491 } 25492 25493} ); 25494 25495 25496/*! 25497 * jQuery UI Selectmenu 1.1
vendor: 1,951 bytes, lines 25497-25573
254973.2 25498 * http://jqueryui.com 25499 * 25500 * Copyright jQuery Foundation and other contributors 25501 * Released under the MIT license. 25502 * http://jquery.org/license 25503 */ 25504 25505//>>label: Selectmenu 25506//>>group: Widgets 25507/* eslint-disable max-len */ 25508//>>description: Duplicates and extends the functionality of a native HTML select element, allowing it to be customizable in behavior and appearance far beyond the limitations of a native select. 25509/* eslint-enable max-len */ 25510//>>docs: http://api.jqueryui.com/selectmenu/ 25511//>>demos: http://jqueryui.com/selectmenu/ 25512//>>css.structure: ../../themes/base/core.css 25513//>>css.structure: ../../themes/base/selectmenu.css, ../../themes/base/button.css 25514//>>css.theme: ../../themes/base/theme.css 25515 25516 25517var widgetsSelectmenu = $.widget( "ui.selectmenu", [ $.ui.formResetMixin, { 25518 version: "1.13.2", 25519 defaultElement: "<select>", 25520 options: { 25521 appendTo: null, 25522 classes: { 25523 "ui-selectmenu-button-open": "ui-corner-top", 25524 "ui-selectmenu-button-closed": "ui-corner-all" 25525 }, 25526 disabled: null, 25527 icons: { 25528 button: "ui-icon-triangle-1-s" 25529 }, 25530 position: { 25531 my: "left top", 25532 at: "left bottom", 25533 collision: "none" 25534 }, 25535 width: false, 25536 25537 // Callbacks 25538 change: null, 25539 close: null, 25540 focus: null, 25541 open: null, 25542 select: null 25543 }, 25544 25545 _create: function() { 25546 var selectmenuId = this.element.uniqueId().attr( "id" ); 25547 this.ids = { 25548 element: selectmenuId, 25549 button: selectmenuId + "-button", 25550 menu: selectmenuId + "-menu" 25551 }; 25552 25553 this._drawButton(); 25554 this._drawMenu(); 25555 this._bindFormResetHandler(); 25556 25557 this._rendered = false; 25558 this.menuItems = $(); 25559 }, 25560 25561 _drawButton: function() { 25562 var icon, 25563 that = this, 25564 item = this._parseOption( 25565 this.element.find( "option:selected" ), 25566 this.element[ 0 ].selectedIndex 25567 ); 25568 25569 // Associate existing label with the new button 25570 this.labels = this.element.labels().attr( "for", this.ids.button ); 25571 this._on( this.labels, { 25572 click: function( event ) { 25573 this.button.trigger( "focus"
vendor: 7,319 bytes, lines 25573-25882
25573); 25574 event.preventDefault(); 25575 } 25576 } ); 25577 25578 // Hide original select element 25579 this.element.hide(); 25580 25581 // Create button 25582 this.button = $( "<span>", { 25583 tabindex: this.options.disabled ? -1 : 0, 25584 id: this.ids.button, 25585 role: "combobox", 25586 "aria-expanded": "false", 25587 "aria-autocomplete": "list", 25588 "aria-owns": this.ids.menu, 25589 "aria-haspopup": "true", 25590 title: this.element.attr( "title" ) 25591 } ) 25592 .insertAfter( this.element ); 25593 25594 this._addClass( this.button, "ui-selectmenu-button ui-selectmenu-button-closed", 25595 "ui-button ui-widget" ); 25596 25597 icon = $( "<span>" ).appendTo( this.button ); 25598 this._addClass( icon, "ui-selectmenu-icon", "ui-icon " + this.options.icons.button ); 25599 this.buttonItem = this._renderButtonItem( item ) 25600 .appendTo( this.button ); 25601 25602 if ( this.options.width !== false ) { 25603 this._resizeButton(); 25604 } 25605 25606 this._on( this.button, this._buttonEvents ); 25607 this.button.one( "focusin", function() { 25608 25609 // Delay rendering the menu items until the button receives focus. 25610 // The menu may have already been rendered via a programmatic open. 25611 if ( !that._rendered ) { 25612 that._refreshMenu(); 25613 } 25614 } ); 25615 }, 25616 25617 _drawMenu: function() { 25618 var that = this; 25619 25620 // Create menu 25621 this.menu = $( "<ul>", { 25622 "aria-hidden": "true", 25623 "aria-labelledby": this.ids.button, 25624 id: this.ids.menu 25625 } ); 25626 25627 // Wrap menu 25628 this.menuWrap = $( "<div>" ).append( this.menu ); 25629 this._addClass( this.menuWrap, "ui-selectmenu-menu", "ui-front" ); 25630 this.menuWrap.appendTo( this._appendTo() ); 25631 25632 // Initialize menu widget 25633 this.menuInstance = this.menu 25634 .menu( { 25635 classes: { 25636 "ui-menu": "ui-corner-bottom" 25637 }, 25638 role: "listbox", 25639 select: function( event, ui ) { 25640 event.preventDefault(); 25641 25642 // Support: IE8 25643 // If the item was selected via a click, the text selection 25644 // will be destroyed in IE 25645 that._setSelection(); 25646 25647 that._select( ui.item.data( "ui-selectmenu-item" ), event ); 25648 }, 25649 focus: function( event, ui ) { 25650 var item = ui.item.data( "ui-selectmenu-item" ); 25651 25652 // Prevent inital focus from firing and check if its a newly focused item 25653 if ( that.focusIndex != null && item.index !== that.focusIndex ) { 25654 that._trigger( "focus", event, { item: item } ); 25655 if ( !that.isOpen ) { 25656 that._select( item, event ); 25657 } 25658 } 25659 that.focusIndex = item.index; 25660 25661 that.button.attr( "aria-activedescendant", 25662 that.menuItems.eq( item.index ).attr( "id" ) ); 25663 } 25664 } ) 25665 .menu( "instance" ); 25666 25667 // Don't close the menu on mouseleave 25668 this.menuInstance._off( this.menu, "mouseleave" ); 25669 25670 // Cancel the menu's collapseAll on document click 25671 this.menuInstance._closeOnDocumentClick = function() { 25672 return false; 25673 }; 25674 25675 // Selects often contain empty items, but never contain dividers 25676 this.menuInstance._isDivider = function() { 25677 return false; 25678 }; 25679 }, 25680 25681 refresh: function() { 25682 this._refreshMenu(); 25683 this.buttonItem.replaceWith( 25684 this.buttonItem = this._renderButtonItem( 25685 25686 // Fall back to an empty object in case there are no options 25687 this._getSelectedItem().data( "ui-selectmenu-item" ) || {} 25688 ) 25689 ); 25690 if ( this.options.width === null ) { 25691 this._resizeButton(); 25692 } 25693 }, 25694 25695 _refreshMenu: function() { 25696 var item, 25697 options = this.element.find( "option" ); 25698 25699 this.menu.empty(); 25700 25701 this._parseOptions( options ); 25702 this._renderMenu( this.menu, this.items ); 25703 25704 this.menuInstance.refresh(); 25705 this.menuItems = this.menu.find( "li" ) 25706 .not( ".ui-selectmenu-optgroup" ) 25707 .find( ".ui-menu-item-wrapper" ); 25708 25709 this._rendered = true; 25710 25711 if ( !options.length ) { 25712 return; 25713 } 25714 25715 item = this._getSelectedItem(); 25716 25717 // Update the menu to have the correct item focused 25718 this.menuInstance.focus( null, item ); 25719 this._setAria( item.data( "ui-selectmenu-item" ) ); 25720 25721 // Set disabled state 25722 this._setOption( "disabled", this.element.prop( "disabled" ) ); 25723 }, 25724 25725 open: function( event ) { 25726 if ( this.options.disabled ) { 25727 return; 25728 } 25729 25730 // If this is the first time the menu is being opened, render the items 25731 if ( !this._rendered ) { 25732 this._refreshMenu(); 25733 } else { 25734 25735 // Menu clears focus on close, reset focus to selected item 25736 this._removeClass( this.menu.find( ".ui-state-active" ), null, "ui-state-active" ); 25737 this.menuInstance.focus( null, this._getSelectedItem() ); 25738 } 25739 25740 // If there are no options, don't open the menu 25741 if ( !this.menuItems.length ) { 25742 return; 25743 } 25744 25745 this.isOpen = true; 25746 this._toggleAttr(); 25747 this._resizeMenu(); 25748 this._position(); 25749 25750 this._on( this.document, this._documentClick ); 25751 25752 this._trigger( "open", event ); 25753 }, 25754 25755 _position: function() { 25756 this.menuWrap.position( $.extend( { of: this.button }, this.options.position ) ); 25757 }, 25758 25759 close: function( event ) { 25760 if ( !this.isOpen ) { 25761 return; 25762 } 25763 25764 this.isOpen = false; 25765 this._toggleAttr(); 25766 25767 this.range = null; 25768 this._off( this.document ); 25769 25770 this._trigger( "close", event ); 25771 }, 25772 25773 widget: function() { 25774 return this.button; 25775 }, 25776 25777 menuWidget: function() { 25778 return this.menu; 25779 }, 25780 25781 _renderButtonItem: function( item ) { 25782 var buttonItem = $( "<span>" ); 25783 25784 this._setText( buttonItem, item.label ); 25785 this._addClass( buttonItem, "ui-selectmenu-text" ); 25786 25787 return buttonItem; 25788 }, 25789 25790 _renderMenu: function( ul, items ) { 25791 var that = this, 25792 currentOptgroup = ""; 25793 25794 $.each( items, function( index, item ) { 25795 var li; 25796 25797 if ( item.optgroup !== currentOptgroup ) { 25798 li = $( "<li>", { 25799 text: item.optgroup 25800 } ); 25801 that._addClass( li, "ui-selectmenu-optgroup", "ui-menu-divider" + 25802 ( item.element.parent( "optgroup" ).prop( "disabled" ) ? 25803 " ui-state-disabled" : 25804 "" ) ); 25805 25806 li.appendTo( ul ); 25807 25808 currentOptgroup = item.optgroup; 25809 } 25810 25811 that._renderItemData( ul, item ); 25812 } ); 25813 }, 25814 25815 _renderItemData: function( ul, item ) { 25816 return this._renderItem( ul, item ).data( "ui-selectmenu-item", item ); 25817 }, 25818 25819 _renderItem: function( ul, item ) { 25820 var li = $( "<li>" ), 25821 wrapper = $( "<div>", { 25822 title: item.element.attr( "title" ) 25823 } ); 25824 25825 if ( item.disabled ) { 25826 this._addClass( li, null, "ui-state-disabled" ); 25827 } 25828 this._setText( wrapper, item.label ); 25829 25830 return li.append( wrapper ).appendTo( ul ); 25831 }, 25832 25833 _setText: function( element, value ) { 25834 if ( value ) { 25835 element.text( value ); 25836 } else { 25837 element.html( " " ); 25838 } 25839 }, 25840 25841 _move: function( direction, event ) { 25842 var item, next, 25843 filter = ".ui-menu-item"; 25844 25845 if ( this.isOpen ) { 25846 item = this.menuItems.eq( this.focusIndex ).parent( "li" ); 25847 } else { 25848 item = this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" ); 25849 filter += ":not(.ui-state-disabled)"; 25850 } 25851 25852 if ( direction === "first" || direction === "last" ) { 25853 next = item[ direction === "first" ? "prevAll" : "nextAll" ]( filter ).eq( -1 ); 25854 } else { 25855 next = item[ direction + "All" ]( filter ).eq( 0 ); 25856 } 25857 25858 if ( next.length ) { 25859 this.menuInstance.focus( event, next ); 25860 } 25861 }, 25862 25863 _getSelectedItem: function() { 25864 return this.menuItems.eq( this.element[ 0 ].selectedIndex ).parent( "li" ); 25865 }, 25866 25867 _toggle: function( event ) { 25868 this[ this.isOpen ? "close" : "open" ]( event ); 25869 }, 25870 25871 _setSelection: function() { 25872 var selection; 25873 25874 if ( !this.range ) { 25875 return; 25876 } 25877 25878 if ( window.getSelection ) { 25879 selection = window.getSelection(); 25880 selection.removeAllRanges(); 25881 selection.addRange( this.range ); 25882
vendor: 5,889 bytes, lines 25883-26132
25883 // Support: IE8 25884 } else { 25885 this.range.select(); 25886 } 25887 25888 // Support: IE 25889 // Setting the text selection kills the button focus in IE, but 25890 // restoring the focus doesn't kill the selection. 25891 this.button.trigger( "focus" ); 25892 }, 25893 25894 _documentClick: { 25895 mousedown: function( event ) { 25896 if ( !this.isOpen ) { 25897 return; 25898 } 25899 25900 if ( !$( event.target ).closest( ".ui-selectmenu-menu, #" + 25901 $.escapeSelector( this.ids.button ) ).length ) { 25902 this.close( event ); 25903 } 25904 } 25905 }, 25906 25907 _buttonEvents: { 25908 25909 // Prevent text selection from being reset when interacting with the selectmenu (#10144) 25910 mousedown: function() { 25911 var selection; 25912 25913 if ( window.getSelection ) { 25914 selection = window.getSelection(); 25915 if ( selection.rangeCount ) { 25916 this.range = selection.getRangeAt( 0 ); 25917 } 25918 25919 // Support: IE8 25920 } else { 25921 this.range = document.selection.createRange(); 25922 } 25923 }, 25924 25925 click: function( event ) { 25926 this._setSelection(); 25927 this._toggle( event ); 25928 }, 25929 25930 keydown: function( event ) { 25931 var preventDefault = true; 25932 switch ( event.keyCode ) { 25933 case $.ui.keyCode.TAB: 25934 case $.ui.keyCode.ESCAPE: 25935 this.close( event ); 25936 preventDefault = false; 25937 break; 25938 case $.ui.keyCode.ENTER: 25939 if ( this.isOpen ) { 25940 this._selectFocusedItem( event ); 25941 } 25942 break; 25943 case $.ui.keyCode.UP: 25944 if ( event.altKey ) { 25945 this._toggle( event ); 25946 } else { 25947 this._move( "prev", event ); 25948 } 25949 break; 25950 case $.ui.keyCode.DOWN: 25951 if ( event.altKey ) { 25952 this._toggle( event ); 25953 } else { 25954 this._move( "next", event ); 25955 } 25956 break; 25957 case $.ui.keyCode.SPACE: 25958 if ( this.isOpen ) { 25959 this._selectFocusedItem( event ); 25960 } else { 25961 this._toggle( event ); 25962 } 25963 break; 25964 case $.ui.keyCode.LEFT: 25965 this._move( "prev", event ); 25966 break; 25967 case $.ui.keyCode.RIGHT: 25968 this._move( "next", event ); 25969 break; 25970 case $.ui.keyCode.HOME: 25971 case $.ui.keyCode.PAGE_UP: 25972 this._move( "first", event ); 25973 break; 25974 case $.ui.keyCode.END: 25975 case $.ui.keyCode.PAGE_DOWN: 25976 this._move( "last", event ); 25977 break; 25978 default: 25979 this.menu.trigger( event ); 25980 preventDefault = false; 25981 } 25982 25983 if ( preventDefault ) { 25984 event.preventDefault(); 25985 } 25986 } 25987 }, 25988 25989 _selectFocusedItem: function( event ) { 25990 var item = this.menuItems.eq( this.focusIndex ).parent( "li" ); 25991 if ( !item.hasClass( "ui-state-disabled" ) ) { 25992 this._select( item.data( "ui-selectmenu-item" ), event ); 25993 } 25994 }, 25995 25996 _select: function( item, event ) { 25997 var oldIndex = this.element[ 0 ].selectedIndex; 25998 25999 // Change native select element 26000 this.element[ 0 ].selectedIndex = item.index; 26001 this.buttonItem.replaceWith( this.buttonItem = this._renderButtonItem( item ) ); 26002 this._setAria( item ); 26003 this._trigger( "select", event, { item: item } ); 26004 26005 if ( item.index !== oldIndex ) { 26006 this._trigger( "change", event, { item: item } ); 26007 } 26008 26009 this.close( event ); 26010 }, 26011 26012 _setAria: function( item ) { 26013 var id = this.menuItems.eq( item.index ).attr( "id" ); 26014 26015 this.button.attr( { 26016 "aria-labelledby": id, 26017 "aria-activedescendant": id 26018 } ); 26019 this.menu.attr( "aria-activedescendant", id ); 26020 }, 26021 26022 _setOption: function( key, value ) { 26023 if ( key === "icons" ) { 26024 var icon = this.button.find( "span.ui-icon" ); 26025 this._removeClass( icon, null, this.options.icons.button ) 26026 ._addClass( icon, null, value.button ); 26027 } 26028 26029 this._super( key, value ); 26030 26031 if ( key === "appendTo" ) { 26032 this.menuWrap.appendTo( this._appendTo() ); 26033 } 26034 26035 if ( key === "width" ) { 26036 this._resizeButton(); 26037 } 26038 }, 26039 26040 _setOptionDisabled: function( value ) { 26041 this._super( value ); 26042 26043 this.menuInstance.option( "disabled", value ); 26044 this.button.attr( "aria-disabled", value ); 26045 this._toggleClass( this.button, null, "ui-state-disabled", value ); 26046 26047 this.element.prop( "disabled", value ); 26048 if ( value ) { 26049 this.button.attr( "tabindex", -1 ); 26050 this.close(); 26051 } else { 26052 this.button.attr( "tabindex", 0 ); 26053 } 26054 }, 26055 26056 _appendTo: function() { 26057 var element = this.options.appendTo; 26058 26059 if ( element ) { 26060 element = element.jquery || element.nodeType ? 26061 $( element ) : 26062 this.document.find( element ).eq( 0 ); 26063 } 26064 26065 if ( !element || !element[ 0 ] ) { 26066 element = this.element.closest( ".ui-front, dialog" ); 26067 } 26068 26069 if ( !element.length ) { 26070 element = this.document[ 0 ].body; 26071 } 26072 26073 return element; 26074 }, 26075 26076 _toggleAttr: function() { 26077 this.button.attr( "aria-expanded", this.isOpen ); 26078 26079 // We can't use two _toggleClass() calls here, because we need to make sure 26080 // we always remove classes first and add them second, otherwise if both classes have the 26081 // same theme class, it will be removed after we add it. 26082 this._removeClass( this.button, "ui-selectmenu-button-" + 26083 ( this.isOpen ? "closed" : "open" ) ) 26084 ._addClass( this.button, "ui-selectmenu-button-" + 26085 ( this.isOpen ? "open" : "closed" ) ) 26086 ._toggleClass( this.menuWrap, "ui-selectmenu-open", null, this.isOpen ); 26087 26088 this.menu.attr( "aria-hidden", !this.isOpen ); 26089 }, 26090 26091 _resizeButton: function() { 26092 var width = this.options.width; 26093 26094 // For `width: false`, just remove inline style and stop 26095 if ( width === false ) { 26096 this.button.css( "width", "" ); 26097 return; 26098 } 26099 26100 // For `width: null`, match the width of the original element 26101 if ( width === null ) { 26102 width = this.element.show().outerWidth(); 26103 this.element.hide(); 26104 } 26105 26106 this.button.outerWidth( width ); 26107 }, 26108 26109 _resizeMenu: function() { 26110 this.menu.outerWidth( Math.max( 26111 this.button.outerWidth(), 26112 26113 // Support: IE10 26114 // IE10 wraps long text (possibly a rounding bug) 26115 // so we add 1px to avoid the wrapping 26116 this.menu.width( "" ).outerWidth() + 1 26117 ) ); 26118 }, 26119 26120 _getCreateOptions: function() { 26121 var options = this._super(); 26122 26123 options.disabled = this.element.prop( "disabled" ); 26124 26125 return options; 26126 }, 26127 26128 _parseOptions: function( options ) { 26129 var that = this, 26130 data = []; 26131 options.each( function( index, item ) { 26132
vendor: 3,668 bytes, lines 26132-26282
26132if ( item.hidden ) { 26133 return; 26134 } 26135 26136 data.push( that._parseOption( $( item ), index ) ); 26137 } ); 26138 this.items = data; 26139 }, 26140 26141 _parseOption: function( option, index ) { 26142 var optgroup = option.parent( "optgroup" ); 26143 26144 return { 26145 element: option, 26146 index: index, 26147 value: option.val(), 26148 label: option.text(), 26149 optgroup: optgroup.attr( "label" ) || "", 26150 disabled: optgroup.prop( "disabled" ) || option.prop( "disabled" ) 26151 }; 26152 }, 26153 26154 _destroy: function() { 26155 this._unbindFormResetHandler(); 26156 this.menuWrap.remove(); 26157 this.button.remove(); 26158 this.element.show(); 26159 this.element.removeUniqueId(); 26160 this.labels.attr( "for", this.ids.element ); 26161 } 26162} ] ); 26163 26164 26165/*! 26166 * jQuery UI Slider 1.13.2 26167 * http://jqueryui.com 26168 * 26169 * Copyright jQuery Foundation and other contributors 26170 * Released under the MIT license. 26171 * http://jquery.org/license 26172 */ 26173 26174//>>label: Slider 26175//>>group: Widgets 26176//>>description: Displays a flexible slider with ranges and accessibility via keyboard. 26177//>>docs: http://api.jqueryui.com/slider/ 26178//>>demos: http://jqueryui.com/slider/ 26179//>>css.structure: ../../themes/base/core.css 26180//>>css.structure: ../../themes/base/slider.css 26181//>>css.theme: ../../themes/base/theme.css 26182 26183 26184var widgetsSlider = $.widget( "ui.slider", $.ui.mouse, { 26185 version: "1.13.2", 26186 widgetEventPrefix: "slide", 26187 26188 options: { 26189 animate: false, 26190 classes: { 26191 "ui-slider": "ui-corner-all", 26192 "ui-slider-handle": "ui-corner-all", 26193 26194 // Note: ui-widget-header isn't the most fittingly semantic framework class for this 26195 // element, but worked best visually with a variety of themes 26196 "ui-slider-range": "ui-corner-all ui-widget-header" 26197 }, 26198 distance: 0, 26199 max: 100, 26200 min: 0, 26201 orientation: "horizontal", 26202 range: false, 26203 step: 1, 26204 value: 0, 26205 values: null, 26206 26207 // Callbacks 26208 change: null, 26209 slide: null, 26210 start: null, 26211 stop: null 26212 }, 26213 26214 // Number of pages in a slider 26215 // (how many times can you page up/down to go through the whole range) 26216 numPages: 5, 26217 26218 _create: function() { 26219 this._keySliding = false; 26220 this._mouseSliding = false; 26221 this._animateOff = true; 26222 this._handleIndex = null; 26223 this._detectOrientation(); 26224 this._mouseInit(); 26225 this._calculateNewMax(); 26226 26227 this._addClass( "ui-slider ui-slider-" + this.orientation, 26228 "ui-widget ui-widget-content" ); 26229 26230 this._refresh(); 26231 26232 this._animateOff = false; 26233 }, 26234 26235 _refresh: function() { 26236 this._createRange(); 26237 this._createHandles(); 26238 this._setupEvents(); 26239 this._refreshValue(); 26240 }, 26241 26242 _createHandles: function() { 26243 var i, handleCount, 26244 options = this.options, 26245 existingHandles = this.element.find( ".ui-slider-handle" ), 26246 handle = "<span tabindex='0'></span>", 26247 handles = []; 26248 26249 handleCount = ( options.values && options.values.length ) || 1; 26250 26251 if ( existingHandles.length > handleCount ) { 26252 existingHandles.slice( handleCount ).remove(); 26253 existingHandles = existingHandles.slice( 0, handleCount ); 26254 } 26255 26256 for ( i = existingHandles.length; i < handleCount; i++ ) { 26257 handles.push( handle ); 26258 } 26259 26260 this.handles = existingHandles.add( $( handles.join( "" ) ).appendTo( this.element ) ); 26261 26262 this._addClass( this.handles, "ui-slider-handle", "ui-state-default" ); 26263 26264 this.handle = this.handles.eq( 0 ); 26265 26266 this.handles.each( function( i ) { 26267 $( this ) 26268 .data( "ui-slider-handle-index", i ) 26269 .attr( "tabIndex", 0 ); 26270 } ); 26271 }, 26272 26273 _createRange: function() { 26274 var options = this.options; 26275 26276 if ( options.range ) { 26277 if ( options.range === true ) { 26278 if ( !options.values ) { 26279 options.values = [ this._valueMin(), this._valueMin() ]; 26280 } else if ( options.values.length && options.values.length !== 2 ) { 26281 options.values = [ options.values[ 0 ], options.values[ 0 ] ]; 26282 } else if ( Array
vendor: 6,343 bytes, lines 26282-26528
26282.isArray( options.values ) ) { 26283 options.values = options.values.slice( 0 ); 26284 } 26285 } 26286 26287 if ( !this.range || !this.range.length ) { 26288 this.range = $( "<div>" ) 26289 .appendTo( this.element ); 26290 26291 this._addClass( this.range, "ui-slider-range" ); 26292 } else { 26293 this._removeClass( this.range, "ui-slider-range-min ui-slider-range-max" ); 26294 26295 // Handle range switching from true to min/max 26296 this.range.css( { 26297 "left": "", 26298 "bottom": "" 26299 } ); 26300 } 26301 if ( options.range === "min" || options.range === "max" ) { 26302 this._addClass( this.range, "ui-slider-range-" + options.range ); 26303 } 26304 } else { 26305 if ( this.range ) { 26306 this.range.remove(); 26307 } 26308 this.range = null; 26309 } 26310 }, 26311 26312 _setupEvents: function() { 26313 this._off( this.handles ); 26314 this._on( this.handles, this._handleEvents ); 26315 this._hoverable( this.handles ); 26316 this._focusable( this.handles ); 26317 }, 26318 26319 _destroy: function() { 26320 this.handles.remove(); 26321 if ( this.range ) { 26322 this.range.remove(); 26323 } 26324 26325 this._mouseDestroy(); 26326 }, 26327 26328 _mouseCapture: function( event ) { 26329 var position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle, 26330 that = this, 26331 o = this.options; 26332 26333 if ( o.disabled ) { 26334 return false; 26335 } 26336 26337 this.elementSize = { 26338 width: this.element.outerWidth(), 26339 height: this.element.outerHeight() 26340 }; 26341 this.elementOffset = this.element.offset(); 26342 26343 position = { x: event.pageX, y: event.pageY }; 26344 normValue = this._normValueFromMouse( position ); 26345 distance = this._valueMax() - this._valueMin() + 1; 26346 this.handles.each( function( i ) { 26347 var thisDistance = Math.abs( normValue - that.values( i ) ); 26348 if ( ( distance > thisDistance ) || 26349 ( distance === thisDistance && 26350 ( i === that._lastChangedValue || that.values( i ) === o.min ) ) ) { 26351 distance = thisDistance; 26352 closestHandle = $( this ); 26353 index = i; 26354 } 26355 } ); 26356 26357 allowed = this._start( event, index ); 26358 if ( allowed === false ) { 26359 return false; 26360 } 26361 this._mouseSliding = true; 26362 26363 this._handleIndex = index; 26364 26365 this._addClass( closestHandle, null, "ui-state-active" ); 26366 closestHandle.trigger( "focus" ); 26367 26368 offset = closestHandle.offset(); 26369 mouseOverHandle = !$( event.target ).parents().addBack().is( ".ui-slider-handle" ); 26370 this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : { 26371 left: event.pageX - offset.left - ( closestHandle.width() / 2 ), 26372 top: event.pageY - offset.top - 26373 ( closestHandle.height() / 2 ) - 26374 ( parseInt( closestHandle.css( "borderTopWidth" ), 10 ) || 0 ) - 26375 ( parseInt( closestHandle.css( "borderBottomWidth" ), 10 ) || 0 ) + 26376 ( parseInt( closestHandle.css( "marginTop" ), 10 ) || 0 ) 26377 }; 26378 26379 if ( !this.handles.hasClass( "ui-state-hover" ) ) { 26380 this._slide( event, index, normValue ); 26381 } 26382 this._animateOff = true; 26383 return true; 26384 }, 26385 26386 _mouseStart: function() { 26387 return true; 26388 }, 26389 26390 _mouseDrag: function( event ) { 26391 var position = { x: event.pageX, y: event.pageY }, 26392 normValue = this._normValueFromMouse( position ); 26393 26394 this._slide( event, this._handleIndex, normValue ); 26395 26396 return false; 26397 }, 26398 26399 _mouseStop: function( event ) { 26400 this._removeClass( this.handles, null, "ui-state-active" ); 26401 this._mouseSliding = false; 26402 26403 this._stop( event, this._handleIndex ); 26404 this._change( event, this._handleIndex ); 26405 26406 this._handleIndex = null; 26407 this._clickOffset = null; 26408 this._animateOff = false; 26409 26410 return false; 26411 }, 26412 26413 _detectOrientation: function() { 26414 this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal"; 26415 }, 26416 26417 _normValueFromMouse: function( position ) { 26418 var pixelTotal, 26419 pixelMouse, 26420 percentMouse, 26421 valueTotal, 26422 valueMouse; 26423 26424 if ( this.orientation === "horizontal" ) { 26425 pixelTotal = this.elementSize.width; 26426 pixelMouse = position.x - this.elementOffset.left - 26427 ( this._clickOffset ? this._clickOffset.left : 0 ); 26428 } else { 26429 pixelTotal = this.elementSize.height; 26430 pixelMouse = position.y - this.elementOffset.top - 26431 ( this._clickOffset ? this._clickOffset.top : 0 ); 26432 } 26433 26434 percentMouse = ( pixelMouse / pixelTotal ); 26435 if ( percentMouse > 1 ) { 26436 percentMouse = 1; 26437 } 26438 if ( percentMouse < 0 ) { 26439 percentMouse = 0; 26440 } 26441 if ( this.orientation === "vertical" ) { 26442 percentMouse = 1 - percentMouse; 26443 } 26444 26445 valueTotal = this._valueMax() - this._valueMin(); 26446 valueMouse = this._valueMin() + percentMouse * valueTotal; 26447 26448 return this._trimAlignValue( valueMouse ); 26449 }, 26450 26451 _uiHash: function( index, value, values ) { 26452 var uiHash = { 26453 handle: this.handles[ index ], 26454 handleIndex: index, 26455 value: value !== undefined ? value : this.value() 26456 }; 26457 26458 if ( this._hasMultipleValues() ) { 26459 uiHash.value = value !== undefined ? value : this.values( index ); 26460 uiHash.values = values || this.values(); 26461 } 26462 26463 return uiHash; 26464 }, 26465 26466 _hasMultipleValues: function() { 26467 return this.options.values && this.options.values.length; 26468 }, 26469 26470 _start: function( event, index ) { 26471 return this._trigger( "start", event, this._uiHash( index ) ); 26472 }, 26473 26474 _slide: function( event, index, newVal ) { 26475 var allowed, otherVal, 26476 currentValue = this.value(), 26477 newValues = this.values(); 26478 26479 if ( this._hasMultipleValues() ) { 26480 otherVal = this.values( index ? 0 : 1 ); 26481 currentValue = this.values( index ); 26482 26483 if ( this.options.values.length === 2 && this.options.range === true ) { 26484 newVal = index === 0 ? Math.min( otherVal, newVal ) : Math.max( otherVal, newVal ); 26485 } 26486 26487 newValues[ index ] = newVal; 26488 } 26489 26490 if ( newVal === currentValue ) { 26491 return; 26492 } 26493 26494 allowed = this._trigger( "slide", event, this._uiHash( index, newVal, newValues ) ); 26495 26496 // A slide can be canceled by returning false from the slide callback 26497 if ( allowed === false ) { 26498 return; 26499 } 26500 26501 if ( this._hasMultipleValues() ) { 26502 this.values( index, newVal ); 26503 } else { 26504 this.value( newVal ); 26505 } 26506 }, 26507 26508 _stop: function( event, index ) { 26509 this._trigger( "stop", event, this._uiHash( index ) ); 26510 }, 26511 26512 _change: function( event, index ) { 26513 if ( !this._keySliding && !this._mouseSliding ) { 26514 26515 //store the last changed value index for reference when handles overlap 26516 this._lastChangedValue = index; 26517 this._trigger( "change", event, this._uiHash( index ) ); 26518 } 26519 }, 26520 26521 value: function( newValue ) { 26522 if ( arguments.length ) { 26523 this.options.value = this._trimAlignValue( newValue ); 26524 this._refreshValue(); 26525 this._change( null, 0 ); 26526 return; 26527 } 26528
vendor: 4,358 bytes, lines 26529-26701
26529 return this._value(); 26530 }, 26531 26532 values: function( index, newValue ) { 26533 var vals, 26534 newValues, 26535 i; 26536 26537 if ( arguments.length > 1 ) { 26538 this.options.values[ index ] = this._trimAlignValue( newValue ); 26539 this._refreshValue(); 26540 this._change( null, index ); 26541 return; 26542 } 26543 26544 if ( arguments.length ) { 26545 if ( Array.isArray( arguments[ 0 ] ) ) { 26546 vals = this.options.values; 26547 newValues = arguments[ 0 ]; 26548 for ( i = 0; i < vals.length; i += 1 ) { 26549 vals[ i ] = this._trimAlignValue( newValues[ i ] ); 26550 this._change( null, i ); 26551 } 26552 this._refreshValue(); 26553 } else { 26554 if ( this._hasMultipleValues() ) { 26555 return this._values( index ); 26556 } else { 26557 return this.value(); 26558 } 26559 } 26560 } else { 26561 return this._values(); 26562 } 26563 }, 26564 26565 _setOption: function( key, value ) { 26566 var i, 26567 valsLength = 0; 26568 26569 if ( key === "range" && this.options.range === true ) { 26570 if ( value === "min" ) { 26571 this.options.value = this._values( 0 ); 26572 this.options.values = null; 26573 } else if ( value === "max" ) { 26574 this.options.value = this._values( this.options.values.length - 1 ); 26575 this.options.values = null; 26576 } 26577 } 26578 26579 if ( Array.isArray( this.options.values ) ) { 26580 valsLength = this.options.values.length; 26581 } 26582 26583 this._super( key, value ); 26584 26585 switch ( key ) { 26586 case "orientation": 26587 this._detectOrientation(); 26588 this._removeClass( "ui-slider-horizontal ui-slider-vertical" ) 26589 ._addClass( "ui-slider-" + this.orientation ); 26590 this._refreshValue(); 26591 if ( this.options.range ) { 26592 this._refreshRange( value ); 26593 } 26594 26595 // Reset positioning from previous orientation 26596 this.handles.css( value === "horizontal" ? "bottom" : "left", "" ); 26597 break; 26598 case "value": 26599 this._animateOff = true; 26600 this._refreshValue(); 26601 this._change( null, 0 ); 26602 this._animateOff = false; 26603 break; 26604 case "values": 26605 this._animateOff = true; 26606 this._refreshValue(); 26607 26608 // Start from the last handle to prevent unreachable handles (#9046) 26609 for ( i = valsLength - 1; i >= 0; i-- ) { 26610 this._change( null, i ); 26611 } 26612 this._animateOff = false; 26613 break; 26614 case "step": 26615 case "min": 26616 case "max": 26617 this._animateOff = true; 26618 this._calculateNewMax(); 26619 this._refreshValue(); 26620 this._animateOff = false; 26621 break; 26622 case "range": 26623 this._animateOff = true; 26624 this._refresh(); 26625 this._animateOff = false; 26626 break; 26627 } 26628 }, 26629 26630 _setOptionDisabled: function( value ) { 26631 this._super( value ); 26632 26633 this._toggleClass( null, "ui-state-disabled", !!value ); 26634 }, 26635 26636 //internal value getter 26637 // _value() returns value trimmed by min and max, aligned by step 26638 _value: function() { 26639 var val = this.options.value; 26640 val = this._trimAlignValue( val ); 26641 26642 return val; 26643 }, 26644 26645 //internal values getter 26646 // _values() returns array of values trimmed by min and max, aligned by step 26647 // _values( index ) returns single value trimmed by min and max, aligned by step 26648 _values: function( index ) { 26649 var val, 26650 vals, 26651 i; 26652 26653 if ( arguments.length ) { 26654 val = this.options.values[ index ]; 26655 val = this._trimAlignValue( val ); 26656 26657 return val; 26658 } else if ( this._hasMultipleValues() ) { 26659 26660 // .slice() creates a copy of the array 26661 // this copy gets trimmed by min and max and then returned 26662 vals = this.options.values.slice(); 26663 for ( i = 0; i < vals.length; i += 1 ) { 26664 vals[ i ] = this._trimAlignValue( vals[ i ] ); 26665 } 26666 26667 return vals; 26668 } else { 26669 return []; 26670 } 26671 }, 26672 26673 // Returns the step-aligned value that val is closest to, between (inclusive) min and max 26674 _trimAlignValue: function( val ) { 26675 if ( val <= this._valueMin() ) { 26676 return this._valueMin(); 26677 } 26678 if ( val >= this._valueMax() ) { 26679 return this._valueMax(); 26680 } 26681 var step = ( this.options.step > 0 ) ? this.options.step : 1, 26682 valModStep = ( val - this._valueMin() ) % step, 26683 alignValue = val - valModStep; 26684 26685 if ( Math.abs( valModStep ) * 2 >= step ) { 26686 alignValue += ( valModStep > 0 ) ? step : ( -step ); 26687 } 26688 26689 // Since JavaScript has problems with large floats, round 26690 // the final value to 5 digits after the decimal point (see #4124) 26691 return parseFloat( alignValue.toFixed( 5 ) ); 26692 }, 26693 26694 _calculateNewMax: function() { 26695 var max = this.options.max, 26696 min = this._valueMin(), 26697 step = this.options.step, 26698 aboveMin = Math.round( ( max - min ) / step ) * step; 26699 max = aboveMin + min; 26700 if ( max > this.options.max ) { 26701
vendor: 5,594 bytes, lines 26702-26901
26702 //If max is not divisible by step, rounding off may increase its value 26703 max -= step; 26704 } 26705 this.max = parseFloat( max.toFixed( this._precision() ) ); 26706 }, 26707 26708 _precision: function() { 26709 var precision = this._precisionOf( this.options.step ); 26710 if ( this.options.min !== null ) { 26711 precision = Math.max( precision, this._precisionOf( this.options.min ) ); 26712 } 26713 return precision; 26714 }, 26715 26716 _precisionOf: function( num ) { 26717 var str = num.toString(), 26718 decimal = str.indexOf( "." ); 26719 return decimal === -1 ? 0 : str.length - decimal - 1; 26720 }, 26721 26722 _valueMin: function() { 26723 return this.options.min; 26724 }, 26725 26726 _valueMax: function() { 26727 return this.max; 26728 }, 26729 26730 _refreshRange: function( orientation ) { 26731 if ( orientation === "vertical" ) { 26732 this.range.css( { "width": "", "left": "" } ); 26733 } 26734 if ( orientation === "horizontal" ) { 26735 this.range.css( { "height": "", "bottom": "" } ); 26736 } 26737 }, 26738 26739 _refreshValue: function() { 26740 var lastValPercent, valPercent, value, valueMin, valueMax, 26741 oRange = this.options.range, 26742 o = this.options, 26743 that = this, 26744 animate = ( !this._animateOff ) ? o.animate : false, 26745 _set = {}; 26746 26747 if ( this._hasMultipleValues() ) { 26748 this.handles.each( function( i ) { 26749 valPercent = ( that.values( i ) - that._valueMin() ) / ( that._valueMax() - 26750 that._valueMin() ) * 100; 26751 _set[ that.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; 26752 $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); 26753 if ( that.options.range === true ) { 26754 if ( that.orientation === "horizontal" ) { 26755 if ( i === 0 ) { 26756 that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { 26757 left: valPercent + "%" 26758 }, o.animate ); 26759 } 26760 if ( i === 1 ) { 26761 that.range[ animate ? "animate" : "css" ]( { 26762 width: ( valPercent - lastValPercent ) + "%" 26763 }, { 26764 queue: false, 26765 duration: o.animate 26766 } ); 26767 } 26768 } else { 26769 if ( i === 0 ) { 26770 that.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { 26771 bottom: ( valPercent ) + "%" 26772 }, o.animate ); 26773 } 26774 if ( i === 1 ) { 26775 that.range[ animate ? "animate" : "css" ]( { 26776 height: ( valPercent - lastValPercent ) + "%" 26777 }, { 26778 queue: false, 26779 duration: o.animate 26780 } ); 26781 } 26782 } 26783 } 26784 lastValPercent = valPercent; 26785 } ); 26786 } else { 26787 value = this.value(); 26788 valueMin = this._valueMin(); 26789 valueMax = this._valueMax(); 26790 valPercent = ( valueMax !== valueMin ) ? 26791 ( value - valueMin ) / ( valueMax - valueMin ) * 100 : 26792 0; 26793 _set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; 26794 this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); 26795 26796 if ( oRange === "min" && this.orientation === "horizontal" ) { 26797 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { 26798 width: valPercent + "%" 26799 }, o.animate ); 26800 } 26801 if ( oRange === "max" && this.orientation === "horizontal" ) { 26802 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { 26803 width: ( 100 - valPercent ) + "%" 26804 }, o.animate ); 26805 } 26806 if ( oRange === "min" && this.orientation === "vertical" ) { 26807 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { 26808 height: valPercent + "%" 26809 }, o.animate ); 26810 } 26811 if ( oRange === "max" && this.orientation === "vertical" ) { 26812 this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { 26813 height: ( 100 - valPercent ) + "%" 26814 }, o.animate ); 26815 } 26816 } 26817 }, 26818 26819 _handleEvents: { 26820 keydown: function( event ) { 26821 var allowed, curVal, newVal, step, 26822 index = $( event.target ).data( "ui-slider-handle-index" ); 26823 26824 switch ( event.keyCode ) { 26825 case $.ui.keyCode.HOME: 26826 case $.ui.keyCode.END: 26827 case $.ui.keyCode.PAGE_UP: 26828 case $.ui.keyCode.PAGE_DOWN: 26829 case $.ui.keyCode.UP: 26830 case $.ui.keyCode.RIGHT: 26831 case $.ui.keyCode.DOWN: 26832 case $.ui.keyCode.LEFT: 26833 event.preventDefault(); 26834 if ( !this._keySliding ) { 26835 this._keySliding = true; 26836 this._addClass( $( event.target ), null, "ui-state-active" ); 26837 allowed = this._start( event, index ); 26838 if ( allowed === false ) { 26839 return; 26840 } 26841 } 26842 break; 26843 } 26844 26845 step = this.options.step; 26846 if ( this._hasMultipleValues() ) { 26847 curVal = newVal = this.values( index ); 26848 } else { 26849 curVal = newVal = this.value(); 26850 } 26851 26852 switch ( event.keyCode ) { 26853 case $.ui.keyCode.HOME: 26854 newVal = this._valueMin(); 26855 break; 26856 case $.ui.keyCode.END: 26857 newVal = this._valueMax(); 26858 break; 26859 case $.ui.keyCode.PAGE_UP: 26860 newVal = this._trimAlignValue( 26861 curVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages ) 26862 ); 26863 break; 26864 case $.ui.keyCode.PAGE_DOWN: 26865 newVal = this._trimAlignValue( 26866 curVal - ( ( this._valueMax() - this._valueMin() ) / this.numPages ) ); 26867 break; 26868 case $.ui.keyCode.UP: 26869 case $.ui.keyCode.RIGHT: 26870 if ( curVal === this._valueMax() ) { 26871 return; 26872 } 26873 newVal = this._trimAlignValue( curVal + step ); 26874 break; 26875 case $.ui.keyCode.DOWN: 26876 case $.ui.keyCode.LEFT: 26877 if ( curVal === this._valueMin() ) { 26878 return; 26879 } 26880 newVal = this._trimAlignValue( curVal - step ); 26881 break; 26882 } 26883 26884 this._slide( event, index, newVal ); 26885 }, 26886 keyup: function( event ) { 26887 var index = $( event.target ).data( "ui-slider-handle-index" ); 26888 26889 if ( this._keySliding ) { 26890 this._keySliding = false; 26891 this._stop( event, index ); 26892 this._change( event, index ); 26893 this._removeClass( $( event.target ), null, "ui-state-active" ); 26894 } 26895 } 26896 } 26897} ); 26898 26899 26900/*! 26901 * jQuery UI Sortable 1.1
269013.2 26902 * http://jqueryui.com 26903 * 26904 * Copyright jQuery Foundation and other contributors 26905 * Released under the MIT license. 26906 * http://jquery.org/license 26907 */ 26908 26909//>>label: Sortable 26910//>>group: Interactions 26911//>>description: Enables items in a list to be sorted using the mouse. 26912//>>docs: http://api.jqueryui.com/sortable/ 26913//>>demos: http://jqueryui.com/sortable/ 26914//>>css.structure: ../../themes/base/sortable.css 26915 26916 26917var widgetsSortable = $.widget( "ui.sortable", $.ui.mouse, { 26918 version: "1.13.2
vendor: 7,925 bytes, lines 26918-27237
26918", 26919 widgetEventPrefix: "sort", 26920 ready: false, 26921 options: { 26922 appendTo: "parent", 26923 axis: false, 26924 connectWith: false, 26925 containment: false, 26926 cursor: "auto", 26927 cursorAt: false, 26928 dropOnEmpty: true, 26929 forcePlaceholderSize: false, 26930 forceHelperSize: false, 26931 grid: false, 26932 handle: false, 26933 helper: "original", 26934 items: "> *", 26935 opacity: false, 26936 placeholder: false, 26937 revert: false, 26938 scroll: true, 26939 scrollSensitivity: 20, 26940 scrollSpeed: 20, 26941 scope: "default", 26942 tolerance: "intersect", 26943 zIndex: 1000, 26944 26945 // Callbacks 26946 activate: null, 26947 beforeStop: null, 26948 change: null, 26949 deactivate: null, 26950 out: null, 26951 over: null, 26952 receive: null, 26953 remove: null, 26954 sort: null, 26955 start: null, 26956 stop: null, 26957 update: null 26958 }, 26959 26960 _isOverAxis: function( x, reference, size ) { 26961 return ( x >= reference ) && ( x < ( reference + size ) ); 26962 }, 26963 26964 _isFloating: function( item ) { 26965 return ( /left|right/ ).test( item.css( "float" ) ) || 26966 ( /inline|table-cell/ ).test( item.css( "display" ) ); 26967 }, 26968 26969 _create: function() { 26970 this.containerCache = {}; 26971 this._addClass( "ui-sortable" ); 26972 26973 //Get the items 26974 this.refresh(); 26975 26976 //Let's determine the parent's offset 26977 this.offset = this.element.offset(); 26978 26979 //Initialize mouse events for interaction 26980 this._mouseInit(); 26981 26982 this._setHandleClassName(); 26983 26984 //We're ready to go 26985 this.ready = true; 26986 26987 }, 26988 26989 _setOption: function( key, value ) { 26990 this._super( key, value ); 26991 26992 if ( key === "handle" ) { 26993 this._setHandleClassName(); 26994 } 26995 }, 26996 26997 _setHandleClassName: function() { 26998 var that = this; 26999 this._removeClass( this.element.find( ".ui-sortable-handle" ), "ui-sortable-handle" ); 27000 $.each( this.items, function() { 27001 that._addClass( 27002 this.instance.options.handle ? 27003 this.item.find( this.instance.options.handle ) : 27004 this.item, 27005 "ui-sortable-handle" 27006 ); 27007 } ); 27008 }, 27009 27010 _destroy: function() { 27011 this._mouseDestroy(); 27012 27013 for ( var i = this.items.length - 1; i >= 0; i-- ) { 27014 this.items[ i ].item.removeData( this.widgetName + "-item" ); 27015 } 27016 27017 return this; 27018 }, 27019 27020 _mouseCapture: function( event, overrideHandle ) { 27021 var currentItem = null, 27022 validHandle = false, 27023 that = this; 27024 27025 if ( this.reverting ) { 27026 return false; 27027 } 27028 27029 if ( this.options.disabled || this.options.type === "static" ) { 27030 return false; 27031 } 27032 27033 //We have to refresh the items data once first 27034 this._refreshItems( event ); 27035 27036 //Find out if the clicked node (or one of its parents) is a actual item in this.items 27037 $( event.target ).parents().each( function() { 27038 if ( $.data( this, that.widgetName + "-item" ) === that ) { 27039 currentItem = $( this ); 27040 return false; 27041 } 27042 } ); 27043 if ( $.data( event.target, that.widgetName + "-item" ) === that ) { 27044 currentItem = $( event.target ); 27045 } 27046 27047 if ( !currentItem ) { 27048 return false; 27049 } 27050 if ( this.options.handle && !overrideHandle ) { 27051 $( this.options.handle, currentItem ).find( "*" ).addBack().each( function() { 27052 if ( this === event.target ) { 27053 validHandle = true; 27054 } 27055 } ); 27056 if ( !validHandle ) { 27057 return false; 27058 } 27059 } 27060 27061 this.currentItem = currentItem; 27062 this._removeCurrentsFromItems(); 27063 return true; 27064 27065 }, 27066 27067 _mouseStart: function( event, overrideHandle, noActivation ) { 27068 27069 var i, body, 27070 o = this.options; 27071 27072 this.currentContainer = this; 27073 27074 //We only need to call refreshPositions, because the refreshItems call has been moved to 27075 // mouseCapture 27076 this.refreshPositions(); 27077 27078 //Prepare the dragged items parent 27079 this.appendTo = $( o.appendTo !== "parent" ? 27080 o.appendTo : 27081 this.currentItem.parent() ); 27082 27083 //Create and append the visible helper 27084 this.helper = this._createHelper( event ); 27085 27086 //Cache the helper size 27087 this._cacheHelperProportions(); 27088 27089 /* 27090 * - Position generation - 27091 * This block generates everything position related - it's the core of draggables. 27092 */ 27093 27094 //Cache the margins of the original element 27095 this._cacheMargins(); 27096 27097 //The element's absolute position on the page minus margins 27098 this.offset = this.currentItem.offset(); 27099 this.offset = { 27100 top: this.offset.top - this.margins.top, 27101 left: this.offset.left - this.margins.left 27102 }; 27103 27104 $.extend( this.offset, { 27105 click: { //Where the click happened, relative to the element 27106 left: event.pageX - this.offset.left, 27107 top: event.pageY - this.offset.top 27108 }, 27109 27110 // This is a relative to absolute position minus the actual position calculation - 27111 // only used for relative positioned helper 27112 relative: this._getRelativeOffset() 27113 } ); 27114 27115 // After we get the helper offset, but before we get the parent offset we can 27116 // change the helper's position to absolute 27117 // TODO: Still need to figure out a way to make relative sorting possible 27118 this.helper.css( "position", "absolute" ); 27119 this.cssPosition = this.helper.css( "position" ); 27120 27121 //Adjust the mouse offset relative to the helper if "cursorAt" is supplied 27122 if ( o.cursorAt ) { 27123 this._adjustOffsetFromHelper( o.cursorAt ); 27124 } 27125 27126 //Cache the former DOM position 27127 this.domPosition = { 27128 prev: this.currentItem.prev()[ 0 ], 27129 parent: this.currentItem.parent()[ 0 ] 27130 }; 27131 27132 // If the helper is not the original, hide the original so it's not playing any role during 27133 // the drag, won't cause anything bad this way 27134 if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) { 27135 this.currentItem.hide(); 27136 } 27137 27138 //Create the placeholder 27139 this._createPlaceholder(); 27140 27141 //Get the next scrolling parent 27142 this.scrollParent = this.placeholder.scrollParent(); 27143 27144 $.extend( this.offset, { 27145 parent: this._getParentOffset() 27146 } ); 27147 27148 //Set a containment if given in the options 27149 if ( o.containment ) { 27150 this._setContainment(); 27151 } 27152 27153 if ( o.cursor && o.cursor !== "auto" ) { // cursor option 27154 body = this.document.find( "body" ); 27155 27156 // Support: IE 27157 this.storedCursor = body.css( "cursor" ); 27158 body.css( "cursor", o.cursor ); 27159 27160 this.storedStylesheet = 27161 $( "<style>*{ cursor: " + o.cursor + " !important; }</style>" ).appendTo( body ); 27162 } 27163 27164 // We need to make sure to grab the zIndex before setting the 27165 // opacity, because setting the opacity to anything lower than 1 27166 // causes the zIndex to change from "auto" to 0. 27167 if ( o.zIndex ) { // zIndex option 27168 if ( this.helper.css( "zIndex" ) ) { 27169 this._storedZIndex = this.helper.css( "zIndex" ); 27170 } 27171 this.helper.css( "zIndex", o.zIndex ); 27172 } 27173 27174 if ( o.opacity ) { // opacity option 27175 if ( this.helper.css( "opacity" ) ) { 27176 this._storedOpacity = this.helper.css( "opacity" ); 27177 } 27178 this.helper.css( "opacity", o.opacity ); 27179 } 27180 27181 //Prepare scrolling 27182 if ( this.scrollParent[ 0 ] !== this.document[ 0 ] && 27183 this.scrollParent[ 0 ].tagName !== "HTML" ) { 27184 this.overflowOffset = this.scrollParent.offset(); 27185 } 27186 27187 //Call callbacks 27188 this._trigger( "start", event, this._uiHash() ); 27189 27190 //Recache the helper size 27191 if ( !this._preserveHelperProportions ) { 27192 this._cacheHelperProportions(); 27193 } 27194 27195 //Post "activate" events to possible containers 27196 if ( !noActivation ) { 27197 for ( i = this.containers.length - 1; i >= 0; i-- ) { 27198 this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) ); 27199 } 27200 } 27201 27202 //Prepare possible droppables 27203 if ( $.ui.ddmanager ) { 27204 $.ui.ddmanager.current = this; 27205 } 27206 27207 if ( $.ui.ddmanager && !o.dropBehaviour ) { 27208 $.ui.ddmanager.prepareOffsets( this, event ); 27209 } 27210 27211 this.dragging = true; 27212 27213 this._addClass( this.helper, "ui-sortable-helper" ); 27214 27215 //Move the helper, if needed 27216 if ( !this.helper.parent().is( this.appendTo ) ) { 27217 this.helper.detach().appendTo( this.appendTo ); 27218 27219 //Update position 27220 this.offset.parent = this._getParentOffset(); 27221 } 27222 27223 //Generate the original position 27224 this.position = this.originalPosition = this._generatePosition( event ); 27225 this.originalPageX = event.pageX; 27226 this.originalPageY = event.pageY; 27227 this.lastPositionAbs = this.positionAbs = this._convertPositionTo( "absolute" ); 27228 27229 this._mouseDrag( event ); 27230 27231 return true; 27232 27233 }, 27234 27235 _scroll: function( event ) { 27236 var o = this.options, 27237 scrolled = false;
vendor: 18,070 bytes, lines 27238-27845
27238 27239 if ( this.scrollParent[ 0 ] !== this.document[ 0 ] && 27240 this.scrollParent[ 0 ].tagName !== "HTML" ) { 27241 27242 if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) - 27243 event.pageY < o.scrollSensitivity ) { 27244 this.scrollParent[ 0 ].scrollTop = 27245 scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed; 27246 } else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) { 27247 this.scrollParent[ 0 ].scrollTop = 27248 scrolled = this.scrollParent[ 0 ].scrollTop - o.scrollSpeed; 27249 } 27250 27251 if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) - 27252 event.pageX < o.scrollSensitivity ) { 27253 this.scrollParent[ 0 ].scrollLeft = scrolled = 27254 this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed; 27255 } else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) { 27256 this.scrollParent[ 0 ].scrollLeft = scrolled = 27257 this.scrollParent[ 0 ].scrollLeft - o.scrollSpeed; 27258 } 27259 27260 } else { 27261 27262 if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) { 27263 scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed ); 27264 } else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) < 27265 o.scrollSensitivity ) { 27266 scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed ); 27267 } 27268 27269 if ( event.pageX - this.document.scrollLeft() < o.scrollSensitivity ) { 27270 scrolled = this.document.scrollLeft( 27271 this.document.scrollLeft() - o.scrollSpeed 27272 ); 27273 } else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) < 27274 o.scrollSensitivity ) { 27275 scrolled = this.document.scrollLeft( 27276 this.document.scrollLeft() + o.scrollSpeed 27277 ); 27278 } 27279 27280 } 27281 27282 return scrolled; 27283 }, 27284 27285 _mouseDrag: function( event ) { 27286 var i, item, itemElement, intersection, 27287 o = this.options; 27288 27289 //Compute the helpers position 27290 this.position = this._generatePosition( event ); 27291 this.positionAbs = this._convertPositionTo( "absolute" ); 27292 27293 //Set the helper position 27294 if ( !this.options.axis || this.options.axis !== "y" ) { 27295 this.helper[ 0 ].style.left = this.position.left + "px"; 27296 } 27297 if ( !this.options.axis || this.options.axis !== "x" ) { 27298 this.helper[ 0 ].style.top = this.position.top + "px"; 27299 } 27300 27301 //Do scrolling 27302 if ( o.scroll ) { 27303 if ( this._scroll( event ) !== false ) { 27304 27305 //Update item positions used in position checks 27306 this._refreshItemPositions( true ); 27307 27308 if ( $.ui.ddmanager && !o.dropBehaviour ) { 27309 $.ui.ddmanager.prepareOffsets( this, event ); 27310 } 27311 } 27312 } 27313 27314 this.dragDirection = { 27315 vertical: this._getDragVerticalDirection(), 27316 horizontal: this._getDragHorizontalDirection() 27317 }; 27318 27319 //Rearrange 27320 for ( i = this.items.length - 1; i >= 0; i-- ) { 27321 27322 //Cache variables and intersection, continue if no intersection 27323 item = this.items[ i ]; 27324 itemElement = item.item[ 0 ]; 27325 intersection = this._intersectsWithPointer( item ); 27326 if ( !intersection ) { 27327 continue; 27328 } 27329 27330 // Only put the placeholder inside the current Container, skip all 27331 // items from other containers. This works because when moving 27332 // an item from one container to another the 27333 // currentContainer is switched before the placeholder is moved. 27334 // 27335 // Without this, moving items in "sub-sortables" can cause 27336 // the placeholder to jitter between the outer and inner container. 27337 if ( item.instance !== this.currentContainer ) { 27338 continue; 27339 } 27340 27341 // Cannot intersect with itself 27342 // no useless actions that have been done before 27343 // no action if the item moved is the parent of the item checked 27344 if ( itemElement !== this.currentItem[ 0 ] && 27345 this.placeholder[ intersection === 1 ? 27346 "next" : "prev" ]()[ 0 ] !== itemElement && 27347 !$.contains( this.placeholder[ 0 ], itemElement ) && 27348 ( this.options.type === "semi-dynamic" ? 27349 !$.contains( this.element[ 0 ], itemElement ) : 27350 true 27351 ) 27352 ) { 27353 27354 this.direction = intersection === 1 ? "down" : "up"; 27355 27356 if ( this.options.tolerance === "pointer" || 27357 this._intersectsWithSides( item ) ) { 27358 this._rearrange( event, item ); 27359 } else { 27360 break; 27361 } 27362 27363 this._trigger( "change", event, this._uiHash() ); 27364 break; 27365 } 27366 } 27367 27368 //Post events to containers 27369 this._contactContainers( event ); 27370 27371 //Interconnect with droppables 27372 if ( $.ui.ddmanager ) { 27373 $.ui.ddmanager.drag( this, event ); 27374 } 27375 27376 //Call callbacks 27377 this._trigger( "sort", event, this._uiHash() ); 27378 27379 this.lastPositionAbs = this.positionAbs; 27380 return false; 27381 27382 }, 27383 27384 _mouseStop: function( event, noPropagation ) { 27385 27386 if ( !event ) { 27387 return; 27388 } 27389 27390 //If we are using droppables, inform the manager about the drop 27391 if ( $.ui.ddmanager && !this.options.dropBehaviour ) { 27392 $.ui.ddmanager.drop( this, event ); 27393 } 27394 27395 if ( this.options.revert ) { 27396 var that = this, 27397 cur = this.placeholder.offset(), 27398 axis = this.options.axis, 27399 animation = {}; 27400 27401 if ( !axis || axis === "x" ) { 27402 animation.left = cur.left - this.offset.parent.left - this.margins.left + 27403 ( this.offsetParent[ 0 ] === this.document[ 0 ].body ? 27404 0 : 27405 this.offsetParent[ 0 ].scrollLeft 27406 ); 27407 } 27408 if ( !axis || axis === "y" ) { 27409 animation.top = cur.top - this.offset.parent.top - this.margins.top + 27410 ( this.offsetParent[ 0 ] === this.document[ 0 ].body ? 27411 0 : 27412 this.offsetParent[ 0 ].scrollTop 27413 ); 27414 } 27415 this.reverting = true; 27416 $( this.helper ).animate( 27417 animation, 27418 parseInt( this.options.revert, 10 ) || 500, 27419 function() { 27420 that._clear( event ); 27421 } 27422 ); 27423 } else { 27424 this._clear( event, noPropagation ); 27425 } 27426 27427 return false; 27428 27429 }, 27430 27431 cancel: function() { 27432 27433 if ( this.dragging ) { 27434 27435 this._mouseUp( new $.Event( "mouseup", { target: null } ) ); 27436 27437 if ( this.options.helper === "original" ) { 27438 this.currentItem.css( this._storedCSS ); 27439 this._removeClass( this.currentItem, "ui-sortable-helper" ); 27440 } else { 27441 this.currentItem.show(); 27442 } 27443 27444 //Post deactivating events to containers 27445 for ( var i = this.containers.length - 1; i >= 0; i-- ) { 27446 this.containers[ i ]._trigger( "deactivate", null, this._uiHash( this ) ); 27447 if ( this.containers[ i ].containerCache.over ) { 27448 this.containers[ i ]._trigger( "out", null, this._uiHash( this ) ); 27449 this.containers[ i ].containerCache.over = 0; 27450 } 27451 } 27452 27453 } 27454 27455 if ( this.placeholder ) { 27456 27457 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, 27458 // it unbinds ALL events from the original node! 27459 if ( this.placeholder[ 0 ].parentNode ) { 27460 this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] ); 27461 } 27462 if ( this.options.helper !== "original" && this.helper && 27463 this.helper[ 0 ].parentNode ) { 27464 this.helper.remove(); 27465 } 27466 27467 $.extend( this, { 27468 helper: null, 27469 dragging: false, 27470 reverting: false, 27471 _noFinalSort: null 27472 } ); 27473 27474 if ( this.domPosition.prev ) { 27475 $( this.domPosition.prev ).after( this.currentItem ); 27476 } else { 27477 $( this.domPosition.parent ).prepend( this.currentItem ); 27478 } 27479 } 27480 27481 return this; 27482 27483 }, 27484 27485 serialize: function( o ) { 27486 27487 var items = this._getItemsAsjQuery( o && o.connected ), 27488 str = []; 27489 o = o || {}; 27490 27491 $( items ).each( function() { 27492 var res = ( $( o.item || this ).attr( o.attribute || "id" ) || "" ) 27493 .match( o.expression || ( /(.+)[\-=_](.+)/ ) ); 27494 if ( res ) { 27495 str.push( 27496 ( o.key || res[ 1 ] + "[]" ) + 27497 "=" + ( o.key && o.expression ? res[ 1 ] : res[ 2 ] ) ); 27498 } 27499 } ); 27500 27501 if ( !str.length && o.key ) { 27502 str.push( o.key + "=" ); 27503 } 27504 27505 return str.join( "&" ); 27506 27507 }, 27508 27509 toArray: function( o ) { 27510 27511 var items = this._getItemsAsjQuery( o && o.connected ), 27512 ret = []; 27513 27514 o = o || {}; 27515 27516 items.each( function() { 27517 ret.push( $( o.item || this ).attr( o.attribute || "id" ) || "" ); 27518 } ); 27519 return ret; 27520 27521 }, 27522 27523 /* Be careful with the following core functions */ 27524 _intersectsWith: function( item ) { 27525 27526 var x1 = this.positionAbs.left, 27527 x2 = x1 + this.helperProportions.width, 27528 y1 = this.positionAbs.top, 27529 y2 = y1 + this.helperProportions.height, 27530 l = item.left, 27531 r = l + item.width, 27532 t = item.top, 27533 b = t + item.height, 27534 dyClick = this.offset.click.top, 27535 dxClick = this.offset.click.left, 27536 isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && 27537 ( y1 + dyClick ) < b ), 27538 isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && 27539 ( x1 + dxClick ) < r ), 27540 isOverElement = isOverElementHeight && isOverElementWidth; 27541 27542 if ( this.options.tolerance === "pointer" || 27543 this.options.forcePointerForContainers || 27544 ( this.options.tolerance !== "pointer" && 27545 this.helperProportions[ this.floating ? "width" : "height" ] > 27546 item[ this.floating ? "width" : "height" ] ) 27547 ) { 27548 return isOverElement; 27549 } else { 27550 27551 return ( l < x1 + ( this.helperProportions.width / 2 ) && // Right Half 27552 x2 - ( this.helperProportions.width / 2 ) < r && // Left Half 27553 t < y1 + ( this.helperProportions.height / 2 ) && // Bottom Half 27554 y2 - ( this.helperProportions.height / 2 ) < b ); // Top Half 27555 27556 } 27557 }, 27558 27559 _intersectsWithPointer: function( item ) { 27560 var verticalDirection, horizontalDirection, 27561 isOverElementHeight = ( this.options.axis === "x" ) || 27562 this._isOverAxis( 27563 this.positionAbs.top + this.offset.click.top, item.top, item.height ), 27564 isOverElementWidth = ( this.options.axis === "y" ) || 27565 this._isOverAxis( 27566 this.positionAbs.left + this.offset.click.left, item.left, item.width ), 27567 isOverElement = isOverElementHeight && isOverElementWidth; 27568 27569 if ( !isOverElement ) { 27570 return false; 27571 } 27572 27573 verticalDirection = this.dragDirection.vertical; 27574 horizontalDirection = this.dragDirection.horizontal; 27575 27576 return this.floating ? 27577 ( ( horizontalDirection === "right" || verticalDirection === "down" ) ? 2 : 1 ) : 27578 ( verticalDirection && ( verticalDirection === "down" ? 2 : 1 ) ); 27579 27580 }, 27581 27582 _intersectsWithSides: function( item ) { 27583 27584 var isOverBottomHalf = this._isOverAxis( this.positionAbs.top + 27585 this.offset.click.top, item.top + ( item.height / 2 ), item.height ), 27586 isOverRightHalf = this._isOverAxis( this.positionAbs.left + 27587 this.offset.click.left, item.left + ( item.width / 2 ), item.width ), 27588 verticalDirection = this.dragDirection.vertical, 27589 horizontalDirection = this.dragDirection.horizontal; 27590 27591 if ( this.floating && horizontalDirection ) { 27592 return ( ( horizontalDirection === "right" && isOverRightHalf ) || 27593 ( horizontalDirection === "left" && !isOverRightHalf ) ); 27594 } else { 27595 return verticalDirection && ( ( verticalDirection === "down" && isOverBottomHalf ) || 27596 ( verticalDirection === "up" && !isOverBottomHalf ) ); 27597 } 27598 27599 }, 27600 27601 _getDragVerticalDirection: function() { 27602 var delta = this.positionAbs.top - this.lastPositionAbs.top; 27603 return delta !== 0 && ( delta > 0 ? "down" : "up" ); 27604 }, 27605 27606 _getDragHorizontalDirection: function() { 27607 var delta = this.positionAbs.left - this.lastPositionAbs.left; 27608 return delta !== 0 && ( delta > 0 ? "right" : "left" ); 27609 }, 27610 27611 refresh: function( event ) { 27612 this._refreshItems( event ); 27613 this._setHandleClassName(); 27614 this.refreshPositions(); 27615 return this; 27616 }, 27617 27618 _connectWith: function() { 27619 var options = this.options; 27620 return options.connectWith.constructor === String ? 27621 [ options.connectWith ] : 27622 options.connectWith; 27623 }, 27624 27625 _getItemsAsjQuery: function( connected ) { 27626 27627 var i, j, cur, inst, 27628 items = [], 27629 queries = [], 27630 connectWith = this._connectWith(); 27631 27632 if ( connectWith && connected ) { 27633 for ( i = connectWith.length - 1; i >= 0; i-- ) { 27634 cur = $( connectWith[ i ], this.document[ 0 ] ); 27635 for ( j = cur.length - 1; j >= 0; j-- ) { 27636 inst = $.data( cur[ j ], this.widgetFullName ); 27637 if ( inst && inst !== this && !inst.options.disabled ) { 27638 queries.push( [ typeof inst.options.items === "function" ? 27639 inst.options.items.call( inst.element ) : 27640 $( inst.options.items, inst.element ) 27641 .not( ".ui-sortable-helper" ) 27642 .not( ".ui-sortable-placeholder" ), inst ] ); 27643 } 27644 } 27645 } 27646 } 27647 27648 queries.push( [ typeof this.options.items === "function" ? 27649 this.options.items 27650 .call( this.element, null, { options: this.options, item: this.currentItem } ) : 27651 $( this.options.items, this.element ) 27652 .not( ".ui-sortable-helper" ) 27653 .not( ".ui-sortable-placeholder" ), this ] ); 27654 27655 function addItems() { 27656 items.push( this ); 27657 } 27658 for ( i = queries.length - 1; i >= 0; i-- ) { 27659 queries[ i ][ 0 ].each( addItems ); 27660 } 27661 27662 return $( items ); 27663 27664 }, 27665 27666 _removeCurrentsFromItems: function() { 27667 27668 var list = this.currentItem.find( ":data(" + this.widgetName + "-item)" ); 27669 27670 this.items = $.grep( this.items, function( item ) { 27671 for ( var j = 0; j < list.length; j++ ) { 27672 if ( list[ j ] === item.item[ 0 ] ) { 27673 return false; 27674 } 27675 } 27676 return true; 27677 } ); 27678 27679 }, 27680 27681 _refreshItems: function( event ) { 27682 27683 this.items = []; 27684 this.containers = [ this ]; 27685 27686 var i, j, cur, inst, targetData, _queries, item, queriesLength, 27687 items = this.items, 27688 queries = [ [ typeof this.options.items === "function" ? 27689 this.options.items.call( this.element[ 0 ], event, { item: this.currentItem } ) : 27690 $( this.options.items, this.element ), this ] ], 27691 connectWith = this._connectWith(); 27692 27693 //Shouldn't be run the first time through due to massive slow-down 27694 if ( connectWith && this.ready ) { 27695 for ( i = connectWith.length - 1; i >= 0; i-- ) { 27696 cur = $( connectWith[ i ], this.document[ 0 ] ); 27697 for ( j = cur.length - 1; j >= 0; j-- ) { 27698 inst = $.data( cur[ j ], this.widgetFullName ); 27699 if ( inst && inst !== this && !inst.options.disabled ) { 27700 queries.push( [ typeof inst.options.items === "function" ? 27701 inst.options.items 27702 .call( inst.element[ 0 ], event, { item: this.currentItem } ) : 27703 $( inst.options.items, inst.element ), inst ] ); 27704 this.containers.push( inst ); 27705 } 27706 } 27707 } 27708 } 27709 27710 for ( i = queries.length - 1; i >= 0; i-- ) { 27711 targetData = queries[ i ][ 1 ]; 27712 _queries = queries[ i ][ 0 ]; 27713 27714 for ( j = 0, queriesLength = _queries.length; j < queriesLength; j++ ) { 27715 item = $( _queries[ j ] ); 27716 27717 // Data for target checking (mouse manager) 27718 item.data( this.widgetName + "-item", targetData ); 27719 27720 items.push( { 27721 item: item, 27722 instance: targetData, 27723 width: 0, height: 0, 27724 left: 0, top: 0 27725 } ); 27726 } 27727 } 27728 27729 }, 27730 27731 _refreshItemPositions: function( fast ) { 27732 var i, item, t, p; 27733 27734 for ( i = this.items.length - 1; i >= 0; i-- ) { 27735 item = this.items[ i ]; 27736 27737 //We ignore calculating positions of all connected containers when we're not over them 27738 if ( this.currentContainer && item.instance !== this.currentContainer && 27739 item.item[ 0 ] !== this.currentItem[ 0 ] ) { 27740 continue; 27741 } 27742 27743 t = this.options.toleranceElement ? 27744 $( this.options.toleranceElement, item.item ) : 27745 item.item; 27746 27747 if ( !fast ) { 27748 item.width = t.outerWidth(); 27749 item.height = t.outerHeight(); 27750 } 27751 27752 p = t.offset(); 27753 item.left = p.left; 27754 item.top = p.top; 27755 } 27756 }, 27757 27758 refreshPositions: function( fast ) { 27759 27760 // Determine whether items are being displayed horizontally 27761 this.floating = this.items.length ? 27762 this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) : 27763 false; 27764 27765 // This has to be redone because due to the item being moved out/into the offsetParent, 27766 // the offsetParent's position will change 27767 if ( this.offsetParent && this.helper ) { 27768 this.offset.parent = this._getParentOffset(); 27769 } 27770 27771 this._refreshItemPositions( fast ); 27772 27773 var i, p; 27774 27775 if ( this.options.custom && this.options.custom.refreshContainers ) { 27776 this.options.custom.refreshContainers.call( this ); 27777 } else { 27778 for ( i = this.containers.length - 1; i >= 0; i-- ) { 27779 p = this.containers[ i ].element.offset(); 27780 this.containers[ i ].containerCache.left = p.left; 27781 this.containers[ i ].containerCache.top = p.top; 27782 this.containers[ i ].containerCache.width = 27783 this.containers[ i ].element.outerWidth(); 27784 this.containers[ i ].containerCache.height = 27785 this.containers[ i ].element.outerHeight(); 27786 } 27787 } 27788 27789 return this; 27790 }, 27791 27792 _createPlaceholder: function( that ) { 27793 that = that || this; 27794 var className, nodeName, 27795 o = that.options; 27796 27797 if ( !o.placeholder || o.placeholder.constructor === String ) { 27798 className = o.placeholder; 27799 nodeName = that.currentItem[ 0 ].nodeName.toLowerCase(); 27800 o.placeholder = { 27801 element: function() { 27802 27803 var element = $( "<" + nodeName + ">", that.document[ 0 ] ); 27804 27805 that._addClass( element, "ui-sortable-placeholder", 27806 className || that.currentItem[ 0 ].className ) 27807 ._removeClass( element, "ui-sortable-helper" ); 27808 27809 if ( nodeName === "tbody" ) { 27810 that._createTrPlaceholder( 27811 that.currentItem.find( "tr" ).eq( 0 ), 27812 $( "<tr>", that.document[ 0 ] ).appendTo( element ) 27813 ); 27814 } else if ( nodeName === "tr" ) { 27815 that._createTrPlaceholder( that.currentItem, element ); 27816 } else if ( nodeName === "img" ) { 27817 element.attr( "src", that.currentItem.attr( "src" ) ); 27818 } 27819 27820 if ( !className ) { 27821 element.css( "visibility", "hidden" ); 27822 } 27823 27824 return element; 27825 }, 27826 update: function( container, p ) { 27827 27828 // 1. If a className is set as 'placeholder option, we don't force sizes - 27829 // the class is responsible for that 27830 // 2. The option 'forcePlaceholderSize can be enabled to force it even if a 27831 // class name is specified 27832 if ( className && !o.forcePlaceholderSize ) { 27833 return; 27834 } 27835 27836 // If the element doesn't have a actual height or width by itself (without 27837 // styles coming from a stylesheet), it receives the inline height and width 27838 // from the dragged item. Or, if it's a tbody or tr, it's going to have a height 27839 // anyway since we're populating them with <td>s above, but they're unlikely to 27840 // be the correct height on their own if the row heights are dynamic, so we'll 27841 // always assign the height of the dragged item given forcePlaceholderSize 27842 // is true. 27843 if ( !p.height() || ( o.forcePlaceholderSize && 27844 ( nodeName === "tbody" || nodeName === "tr" ) ) ) { 27845 p.height(
vendor: 10,145 bytes, lines 27846-28153
27846 that.currentItem.innerHeight() - 27847 parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) - 27848 parseInt( that.currentItem.css( "paddingBottom" ) || 0, 10 ) ); 27849 } 27850 if ( !p.width() ) { 27851 p.width( 27852 that.currentItem.innerWidth() - 27853 parseInt( that.currentItem.css( "paddingLeft" ) || 0, 10 ) - 27854 parseInt( that.currentItem.css( "paddingRight" ) || 0, 10 ) ); 27855 } 27856 } 27857 }; 27858 } 27859 27860 //Create the placeholder 27861 that.placeholder = $( o.placeholder.element.call( that.element, that.currentItem ) ); 27862 27863 //Append it after the actual current item 27864 that.currentItem.after( that.placeholder ); 27865 27866 //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) 27867 o.placeholder.update( that, that.placeholder ); 27868 27869 }, 27870 27871 _createTrPlaceholder: function( sourceTr, targetTr ) { 27872 var that = this; 27873 27874 sourceTr.children().each( function() { 27875 $( "<td> </td>", that.document[ 0 ] ) 27876 .attr( "colspan", $( this ).attr( "colspan" ) || 1 ) 27877 .appendTo( targetTr ); 27878 } ); 27879 }, 27880 27881 _contactContainers: function( event ) { 27882 var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, 27883 floating, axis, 27884 innermostContainer = null, 27885 innermostIndex = null; 27886 27887 // Get innermost container that intersects with item 27888 for ( i = this.containers.length - 1; i >= 0; i-- ) { 27889 27890 // Never consider a container that's located within the item itself 27891 if ( $.contains( this.currentItem[ 0 ], this.containers[ i ].element[ 0 ] ) ) { 27892 continue; 27893 } 27894 27895 if ( this._intersectsWith( this.containers[ i ].containerCache ) ) { 27896 27897 // If we've already found a container and it's more "inner" than this, then continue 27898 if ( innermostContainer && 27899 $.contains( 27900 this.containers[ i ].element[ 0 ], 27901 innermostContainer.element[ 0 ] ) ) { 27902 continue; 27903 } 27904 27905 innermostContainer = this.containers[ i ]; 27906 innermostIndex = i; 27907 27908 } else { 27909 27910 // container doesn't intersect. trigger "out" event if necessary 27911 if ( this.containers[ i ].containerCache.over ) { 27912 this.containers[ i ]._trigger( "out", event, this._uiHash( this ) ); 27913 this.containers[ i ].containerCache.over = 0; 27914 } 27915 } 27916 27917 } 27918 27919 // If no intersecting containers found, return 27920 if ( !innermostContainer ) { 27921 return; 27922 } 27923 27924 // Move the item into the container if it's not there already 27925 if ( this.containers.length === 1 ) { 27926 if ( !this.containers[ innermostIndex ].containerCache.over ) { 27927 this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) ); 27928 this.containers[ innermostIndex ].containerCache.over = 1; 27929 } 27930 } else { 27931 27932 // When entering a new container, we will find the item with the least distance and 27933 // append our item near it 27934 dist = 10000; 27935 itemWithLeastDistance = null; 27936 floating = innermostContainer.floating || this._isFloating( this.currentItem ); 27937 posProperty = floating ? "left" : "top"; 27938 sizeProperty = floating ? "width" : "height"; 27939 axis = floating ? "pageX" : "pageY"; 27940 27941 for ( j = this.items.length - 1; j >= 0; j-- ) { 27942 if ( !$.contains( 27943 this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] ) 27944 ) { 27945 continue; 27946 } 27947 if ( this.items[ j ].item[ 0 ] === this.currentItem[ 0 ] ) { 27948 continue; 27949 } 27950 27951 cur = this.items[ j ].item.offset()[ posProperty ]; 27952 nearBottom = false; 27953 if ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) { 27954 nearBottom = true; 27955 } 27956 27957 if ( Math.abs( event[ axis ] - cur ) < dist ) { 27958 dist = Math.abs( event[ axis ] - cur ); 27959 itemWithLeastDistance = this.items[ j ]; 27960 this.direction = nearBottom ? "up" : "down"; 27961 } 27962 } 27963 27964 //Check if dropOnEmpty is enabled 27965 if ( !itemWithLeastDistance && !this.options.dropOnEmpty ) { 27966 return; 27967 } 27968 27969 if ( this.currentContainer === this.containers[ innermostIndex ] ) { 27970 if ( !this.currentContainer.containerCache.over ) { 27971 this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash() ); 27972 this.currentContainer.containerCache.over = 1; 27973 } 27974 return; 27975 } 27976 27977 if ( itemWithLeastDistance ) { 27978 this._rearrange( event, itemWithLeastDistance, null, true ); 27979 } else { 27980 this._rearrange( event, null, this.containers[ innermostIndex ].element, true ); 27981 } 27982 this._trigger( "change", event, this._uiHash() ); 27983 this.containers[ innermostIndex ]._trigger( "change", event, this._uiHash( this ) ); 27984 this.currentContainer = this.containers[ innermostIndex ]; 27985 27986 //Update the placeholder 27987 this.options.placeholder.update( this.currentContainer, this.placeholder ); 27988 27989 //Update scrollParent 27990 this.scrollParent = this.placeholder.scrollParent(); 27991 27992 //Update overflowOffset 27993 if ( this.scrollParent[ 0 ] !== this.document[ 0 ] && 27994 this.scrollParent[ 0 ].tagName !== "HTML" ) { 27995 this.overflowOffset = this.scrollParent.offset(); 27996 } 27997 27998 this.containers[ innermostIndex ]._trigger( "over", event, this._uiHash( this ) ); 27999 this.containers[ innermostIndex ].containerCache.over = 1; 28000 } 28001 28002 }, 28003 28004 _createHelper: function( event ) { 28005 28006 var o = this.options, 28007 helper = typeof o.helper === "function" ? 28008 $( o.helper.apply( this.element[ 0 ], [ event, this.currentItem ] ) ) : 28009 ( o.helper === "clone" ? this.currentItem.clone() : this.currentItem ); 28010 28011 //Add the helper to the DOM if that didn't happen already 28012 if ( !helper.parents( "body" ).length ) { 28013 this.appendTo[ 0 ].appendChild( helper[ 0 ] ); 28014 } 28015 28016 if ( helper[ 0 ] === this.currentItem[ 0 ] ) { 28017 this._storedCSS = { 28018 width: this.currentItem[ 0 ].style.width, 28019 height: this.currentItem[ 0 ].style.height, 28020 position: this.currentItem.css( "position" ), 28021 top: this.currentItem.css( "top" ), 28022 left: this.currentItem.css( "left" ) 28023 }; 28024 } 28025 28026 if ( !helper[ 0 ].style.width || o.forceHelperSize ) { 28027 helper.width( this.currentItem.width() ); 28028 } 28029 if ( !helper[ 0 ].style.height || o.forceHelperSize ) { 28030 helper.height( this.currentItem.height() ); 28031 } 28032 28033 return helper; 28034 28035 }, 28036 28037 _adjustOffsetFromHelper: function( obj ) { 28038 if ( typeof obj === "string" ) { 28039 obj = obj.split( " " ); 28040 } 28041 if ( Array.isArray( obj ) ) { 28042 obj = { left: +obj[ 0 ], top: +obj[ 1 ] || 0 }; 28043 } 28044 if ( "left" in obj ) { 28045 this.offset.click.left = obj.left + this.margins.left; 28046 } 28047 if ( "right" in obj ) { 28048 this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; 28049 } 28050 if ( "top" in obj ) { 28051 this.offset.click.top = obj.top + this.margins.top; 28052 } 28053 if ( "bottom" in obj ) { 28054 this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; 28055 } 28056 }, 28057 28058 _getParentOffset: function() { 28059 28060 //Get the offsetParent and cache its position 28061 this.offsetParent = this.helper.offsetParent(); 28062 var po = this.offsetParent.offset(); 28063 28064 // This is a special case where we need to modify a offset calculated on start, since the 28065 // following happened: 28066 // 1. The position of the helper is absolute, so it's position is calculated based on the 28067 // next positioned parent 28068 // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't 28069 // the document, which means that the scroll is included in the initial calculation of the 28070 // offset of the parent, and never recalculated upon drag 28071 if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] && 28072 $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) { 28073 po.left += this.scrollParent.scrollLeft(); 28074 po.top += this.scrollParent.scrollTop(); 28075 } 28076 28077 // This needs to be actually done for all browsers, since pageX/pageY includes this 28078 // information with an ugly IE fix 28079 if ( this.offsetParent[ 0 ] === this.document[ 0 ].body || 28080 ( this.offsetParent[ 0 ].tagName && 28081 this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) { 28082 po = { top: 0, left: 0 }; 28083 } 28084 28085 return { 28086 top: po.top + ( parseInt( this.offsetParent.css( "borderTopWidth" ), 10 ) || 0 ), 28087 left: po.left + ( parseInt( this.offsetParent.css( "borderLeftWidth" ), 10 ) || 0 ) 28088 }; 28089 28090 }, 28091 28092 _getRelativeOffset: function() { 28093 28094 if ( this.cssPosition === "relative" ) { 28095 var p = this.currentItem.position(); 28096 return { 28097 top: p.top - ( parseInt( this.helper.css( "top" ), 10 ) || 0 ) + 28098 this.scrollParent.scrollTop(), 28099 left: p.left - ( parseInt( this.helper.css( "left" ), 10 ) || 0 ) + 28100 this.scrollParent.scrollLeft() 28101 }; 28102 } else { 28103 return { top: 0, left: 0 }; 28104 } 28105 28106 }, 28107 28108 _cacheMargins: function() { 28109 this.margins = { 28110 left: ( parseInt( this.currentItem.css( "marginLeft" ), 10 ) || 0 ), 28111 top: ( parseInt( this.currentItem.css( "marginTop" ), 10 ) || 0 ) 28112 }; 28113 }, 28114 28115 _cacheHelperProportions: function() { 28116 this.helperProportions = { 28117 width: this.helper.outerWidth(), 28118 height: this.helper.outerHeight() 28119 }; 28120 }, 28121 28122 _setContainment: function() { 28123 28124 var ce, co, over, 28125 o = this.options; 28126 if ( o.containment === "parent" ) { 28127 o.containment = this.helper[ 0 ].parentNode; 28128 } 28129 if ( o.containment === "document" || o.containment === "window" ) { 28130 this.containment = [ 28131 0 - this.offset.relative.left - this.offset.parent.left, 28132 0 - this.offset.relative.top - this.offset.parent.top, 28133 o.containment === "document" ? 28134 this.document.width() : 28135 this.window.width() - this.helperProportions.width - this.margins.left, 28136 ( o.containment === "document" ? 28137 ( this.document.height() || document.body.parentNode.scrollHeight ) : 28138 this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight 28139 ) - this.helperProportions.height - this.margins.top 28140 ]; 28141 } 28142 28143 if ( !( /^(document|window|parent)$/ ).test( o.containment ) ) { 28144 ce = $( o.containment )[ 0 ]; 28145 co = $( o.containment ).offset(); 28146 over = ( $( ce ).css( "overflow" ) !== "hidden" ); 28147 28148 this.containment = [ 28149 co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) + 28150 ( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left, 28151 co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) + 28152 ( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top, 28153 co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth )
vendor: 6,379 bytes, lines 28153-28349
28153: ce.offsetWidth ) - 28154 ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) - 28155 ( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) - 28156 this.helperProportions.width - this.margins.left, 28157 co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) - 28158 ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) - 28159 ( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) - 28160 this.helperProportions.height - this.margins.top 28161 ]; 28162 } 28163 28164 }, 28165 28166 _convertPositionTo: function( d, pos ) { 28167 28168 if ( !pos ) { 28169 pos = this.position; 28170 } 28171 var mod = d === "absolute" ? 1 : -1, 28172 scroll = this.cssPosition === "absolute" && 28173 !( this.scrollParent[ 0 ] !== this.document[ 0 ] && 28174 $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? 28175 this.offsetParent : 28176 this.scrollParent, 28177 scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName ); 28178 28179 return { 28180 top: ( 28181 28182 // The absolute mouse position 28183 pos.top + 28184 28185 // Only for relative positioned nodes: Relative offset from element to offset parent 28186 this.offset.relative.top * mod + 28187 28188 // The offsetParent's offset without borders (offset + border) 28189 this.offset.parent.top * mod - 28190 ( ( this.cssPosition === "fixed" ? 28191 -this.scrollParent.scrollTop() : 28192 ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod ) 28193 ), 28194 left: ( 28195 28196 // The absolute mouse position 28197 pos.left + 28198 28199 // Only for relative positioned nodes: Relative offset from element to offset parent 28200 this.offset.relative.left * mod + 28201 28202 // The offsetParent's offset without borders (offset + border) 28203 this.offset.parent.left * mod - 28204 ( ( this.cssPosition === "fixed" ? 28205 -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : 28206 scroll.scrollLeft() ) * mod ) 28207 ) 28208 }; 28209 28210 }, 28211 28212 _generatePosition: function( event ) { 28213 28214 var top, left, 28215 o = this.options, 28216 pageX = event.pageX, 28217 pageY = event.pageY, 28218 scroll = this.cssPosition === "absolute" && 28219 !( this.scrollParent[ 0 ] !== this.document[ 0 ] && 28220 $.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ? 28221 this.offsetParent : 28222 this.scrollParent, 28223 scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName ); 28224 28225 // This is another very weird special case that only happens for relative elements: 28226 // 1. If the css position is relative 28227 // 2. and the scroll parent is the document or similar to the offset parent 28228 // we have to refresh the relative offset during the scroll so there are no jumps 28229 if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] && 28230 this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) { 28231 this.offset.relative = this._getRelativeOffset(); 28232 } 28233 28234 /* 28235 * - Position constraining - 28236 * Constrain the position to a mix of grid, containment. 28237 */ 28238 28239 if ( this.originalPosition ) { //If we are not dragging yet, we won't check for options 28240 28241 if ( this.containment ) { 28242 if ( event.pageX - this.offset.click.left < this.containment[ 0 ] ) { 28243 pageX = this.containment[ 0 ] + this.offset.click.left; 28244 } 28245 if ( event.pageY - this.offset.click.top < this.containment[ 1 ] ) { 28246 pageY = this.containment[ 1 ] + this.offset.click.top; 28247 } 28248 if ( event.pageX - this.offset.click.left > this.containment[ 2 ] ) { 28249 pageX = this.containment[ 2 ] + this.offset.click.left; 28250 } 28251 if ( event.pageY - this.offset.click.top > this.containment[ 3 ] ) { 28252 pageY = this.containment[ 3 ] + this.offset.click.top; 28253 } 28254 } 28255 28256 if ( o.grid ) { 28257 top = this.originalPageY + Math.round( ( pageY - this.originalPageY ) / 28258 o.grid[ 1 ] ) * o.grid[ 1 ]; 28259 pageY = this.containment ? 28260 ( ( top - this.offset.click.top >= this.containment[ 1 ] && 28261 top - this.offset.click.top <= this.containment[ 3 ] ) ? 28262 top : 28263 ( ( top - this.offset.click.top >= this.containment[ 1 ] ) ? 28264 top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : 28265 top; 28266 28267 left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) / 28268 o.grid[ 0 ] ) * o.grid[ 0 ]; 28269 pageX = this.containment ? 28270 ( ( left - this.offset.click.left >= this.containment[ 0 ] && 28271 left - this.offset.click.left <= this.containment[ 2 ] ) ? 28272 left : 28273 ( ( left - this.offset.click.left >= this.containment[ 0 ] ) ? 28274 left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : 28275 left; 28276 } 28277 28278 } 28279 28280 return { 28281 top: ( 28282 28283 // The absolute mouse position 28284 pageY - 28285 28286 // Click offset (relative to the element) 28287 this.offset.click.top - 28288 28289 // Only for relative positioned nodes: Relative offset from element to offset parent 28290 this.offset.relative.top - 28291 28292 // The offsetParent's offset without borders (offset + border) 28293 this.offset.parent.top + 28294 ( ( this.cssPosition === "fixed" ? 28295 -this.scrollParent.scrollTop() : 28296 ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) ) 28297 ), 28298 left: ( 28299 28300 // The absolute mouse position 28301 pageX - 28302 28303 // Click offset (relative to the element) 28304 this.offset.click.left - 28305 28306 // Only for relative positioned nodes: Relative offset from element to offset parent 28307 this.offset.relative.left - 28308 28309 // The offsetParent's offset without borders (offset + border) 28310 this.offset.parent.left + 28311 ( ( this.cssPosition === "fixed" ? 28312 -this.scrollParent.scrollLeft() : 28313 scrollIsRootNode ? 0 : scroll.scrollLeft() ) ) 28314 ) 28315 }; 28316 28317 }, 28318 28319 _rearrange: function( event, i, a, hardRefresh ) { 28320 28321 if ( a ) { 28322 a[ 0 ].appendChild( this.placeholder[ 0 ] ); 28323 } else { 28324 i.item[ 0 ].parentNode.insertBefore( this.placeholder[ 0 ], 28325 ( this.direction === "down" ? i.item[ 0 ] : i.item[ 0 ].nextSibling ) ); 28326 } 28327 28328 //Various things done here to improve the performance: 28329 // 1. we create a setTimeout, that calls refreshPositions 28330 // 2. on the instance, we have a counter variable, that get's higher after every append 28331 // 3. on the local scope, we copy the counter variable, and check in the timeout, 28332 // if it's still the same 28333 // 4. this lets only the last addition to the timeout stack through 28334 this.counter = this.counter ? ++this.counter : 1; 28335 var counter = this.counter; 28336 28337 this._delay( function() { 28338 if ( counter === this.counter ) { 28339 28340 //Precompute after each DOM insertion, NOT on mousemove 28341 this.refreshPositions( !hardRefresh ); 28342 } 28343 } ); 28344 28345 }, 28346 28347 _clear: function( event, noPropagation ) { 28348 28349 this.reverting = false;
vendor: 4,283 bytes, lines 28350-28494
28350 28351 // We delay all events that have to be triggered to after the point where the placeholder 28352 // has been removed and everything else normalized again 28353 var i, 28354 delayedTriggers = []; 28355 28356 // We first have to update the dom position of the actual currentItem 28357 // Note: don't do it if the current item is already removed (by a user), or it gets 28358 // reappended (see #4088) 28359 if ( !this._noFinalSort && this.currentItem.parent().length ) { 28360 this.placeholder.before( this.currentItem ); 28361 } 28362 this._noFinalSort = null; 28363 28364 if ( this.helper[ 0 ] === this.currentItem[ 0 ] ) { 28365 for ( i in this._storedCSS ) { 28366 if ( this._storedCSS[ i ] === "auto" || this._storedCSS[ i ] === "static" ) { 28367 this._storedCSS[ i ] = ""; 28368 } 28369 } 28370 this.currentItem.css( this._storedCSS ); 28371 this._removeClass( this.currentItem, "ui-sortable-helper" ); 28372 } else { 28373 this.currentItem.show(); 28374 } 28375 28376 if ( this.fromOutside && !noPropagation ) { 28377 delayedTriggers.push( function( event ) { 28378 this._trigger( "receive", event, this._uiHash( this.fromOutside ) ); 28379 } ); 28380 } 28381 if ( ( this.fromOutside || 28382 this.domPosition.prev !== 28383 this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] || 28384 this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) { 28385 28386 // Trigger update callback if the DOM position has changed 28387 delayedTriggers.push( function( event ) { 28388 this._trigger( "update", event, this._uiHash() ); 28389 } ); 28390 } 28391 28392 // Check if the items Container has Changed and trigger appropriate 28393 // events. 28394 if ( this !== this.currentContainer ) { 28395 if ( !noPropagation ) { 28396 delayedTriggers.push( function( event ) { 28397 this._trigger( "remove", event, this._uiHash() ); 28398 } ); 28399 delayedTriggers.push( ( function( c ) { 28400 return function( event ) { 28401 c._trigger( "receive", event, this._uiHash( this ) ); 28402 }; 28403 } ).call( this, this.currentContainer ) ); 28404 delayedTriggers.push( ( function( c ) { 28405 return function( event ) { 28406 c._trigger( "update", event, this._uiHash( this ) ); 28407 }; 28408 } ).call( this, this.currentContainer ) ); 28409 } 28410 } 28411 28412 //Post events to containers 28413 function delayEvent( type, instance, container ) { 28414 return function( event ) { 28415 container._trigger( type, event, instance._uiHash( instance ) ); 28416 }; 28417 } 28418 for ( i = this.containers.length - 1; i >= 0; i-- ) { 28419 if ( !noPropagation ) { 28420 delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) ); 28421 } 28422 if ( this.containers[ i ].containerCache.over ) { 28423 delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) ); 28424 this.containers[ i ].containerCache.over = 0; 28425 } 28426 } 28427 28428 //Do what was originally in plugins 28429 if ( this.storedCursor ) { 28430 this.document.find( "body" ).css( "cursor", this.storedCursor ); 28431 this.storedStylesheet.remove(); 28432 } 28433 if ( this._storedOpacity ) { 28434 this.helper.css( "opacity", this._storedOpacity ); 28435 } 28436 if ( this._storedZIndex ) { 28437 this.helper.css( "zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex ); 28438 } 28439 28440 this.dragging = false; 28441 28442 if ( !noPropagation ) { 28443 this._trigger( "beforeStop", event, this._uiHash() ); 28444 } 28445 28446 //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, 28447 // it unbinds ALL events from the original node! 28448 this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] ); 28449 28450 if ( !this.cancelHelperRemoval ) { 28451 if ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) { 28452 this.helper.remove(); 28453 } 28454 this.helper = null; 28455 } 28456 28457 if ( !noPropagation ) { 28458 for ( i = 0; i < delayedTriggers.length; i++ ) { 28459 28460 // Trigger all delayed events 28461 delayedTriggers[ i ].call( this, event ); 28462 } 28463 this._trigger( "stop", event, this._uiHash() ); 28464 } 28465 28466 this.fromOutside = false; 28467 return !this.cancelHelperRemoval; 28468 28469 }, 28470 28471 _trigger: function() { 28472 if ( $.Widget.prototype._trigger.apply( this, arguments ) === false ) { 28473 this.cancel(); 28474 } 28475 }, 28476 28477 _uiHash: function( _inst ) { 28478 var inst = _inst || this; 28479 return { 28480 helper: inst.helper, 28481 placeholder: inst.placeholder || $( [] ), 28482 position: inst.position, 28483 originalPosition: inst.originalPosition, 28484 offset: inst.positionAbs, 28485 item: inst.currentItem, 28486 sender: _inst ? _inst.element : null 28487 }; 28488 } 28489 28490} ); 28491 28492 28493/*! 28494 * jQuery UI Spinner 1.13.
284942 28495 * http://jqueryui.com 28496 * 28497 * Copyright jQuery Foundation and other contributors 28498 * Released under the MIT license. 28499 * http://jquery.org/license 28500 */ 28501 28502//>>label: Spinner 28503//>>group: Widgets 28504//>>description: Displays buttons to easily input numbers via the keyboard or mouse. 28505//>>docs: http://api.jqueryui.com/spinner/ 28506//>>demos: http://jqueryui.com/spinner/ 28507//>>css.structure: ../../themes/base/core.css 28508//>>css.structure: ../../themes/base/spinner.css 28509//>>css.theme: ../../themes/base/theme.css 28510 28511 28512function spinnerModifier( fn ) { 28513 return function() { 28514 var previous = this.element.val(); 28515 fn.apply( this, arguments ); 28516 this._refresh(); 28517 if ( previous !== this.element.val() ) { 28518 this._trigger( "change" ); 28519 } 28520 }; 28521} 28522 28523$.widget( "ui.spinner", { 28524 version: "1.13.2
vendor: 13,310 bytes, lines 28524-29055
28524", 28525 defaultElement: "<input>", 28526 widgetEventPrefix: "spin", 28527 options: { 28528 classes: { 28529 "ui-spinner": "ui-corner-all", 28530 "ui-spinner-down": "ui-corner-br", 28531 "ui-spinner-up": "ui-corner-tr" 28532 }, 28533 culture: null, 28534 icons: { 28535 down: "ui-icon-triangle-1-s", 28536 up: "ui-icon-triangle-1-n" 28537 }, 28538 incremental: true, 28539 max: null, 28540 min: null, 28541 numberFormat: null, 28542 page: 10, 28543 step: 1, 28544 28545 change: null, 28546 spin: null, 28547 start: null, 28548 stop: null 28549 }, 28550 28551 _create: function() { 28552 28553 // handle string values that need to be parsed 28554 this._setOption( "max", this.options.max ); 28555 this._setOption( "min", this.options.min ); 28556 this._setOption( "step", this.options.step ); 28557 28558 // Only format if there is a value, prevents the field from being marked 28559 // as invalid in Firefox, see #9573. 28560 if ( this.value() !== "" ) { 28561 28562 // Format the value, but don't constrain. 28563 this._value( this.element.val(), true ); 28564 } 28565 28566 this._draw(); 28567 this._on( this._events ); 28568 this._refresh(); 28569 28570 // Turning off autocomplete prevents the browser from remembering the 28571 // value when navigating through history, so we re-enable autocomplete 28572 // if the page is unloaded before the widget is destroyed. #7790 28573 this._on( this.window, { 28574 beforeunload: function() { 28575 this.element.removeAttr( "autocomplete" ); 28576 } 28577 } ); 28578 }, 28579 28580 _getCreateOptions: function() { 28581 var options = this._super(); 28582 var element = this.element; 28583 28584 $.each( [ "min", "max", "step" ], function( i, option ) { 28585 var value = element.attr( option ); 28586 if ( value != null && value.length ) { 28587 options[ option ] = value; 28588 } 28589 } ); 28590 28591 return options; 28592 }, 28593 28594 _events: { 28595 keydown: function( event ) { 28596 if ( this._start( event ) && this._keydown( event ) ) { 28597 event.preventDefault(); 28598 } 28599 }, 28600 keyup: "_stop", 28601 focus: function() { 28602 this.previous = this.element.val(); 28603 }, 28604 blur: function( event ) { 28605 if ( this.cancelBlur ) { 28606 delete this.cancelBlur; 28607 return; 28608 } 28609 28610 this._stop(); 28611 this._refresh(); 28612 if ( this.previous !== this.element.val() ) { 28613 this._trigger( "change", event ); 28614 } 28615 }, 28616 mousewheel: function( event, delta ) { 28617 var activeElement = $.ui.safeActiveElement( this.document[ 0 ] ); 28618 var isActive = this.element[ 0 ] === activeElement; 28619 28620 if ( !isActive || !delta ) { 28621 return; 28622 } 28623 28624 if ( !this.spinning && !this._start( event ) ) { 28625 return false; 28626 } 28627 28628 this._spin( ( delta > 0 ? 1 : -1 ) * this.options.step, event ); 28629 clearTimeout( this.mousewheelTimer ); 28630 this.mousewheelTimer = this._delay( function() { 28631 if ( this.spinning ) { 28632 this._stop( event ); 28633 } 28634 }, 100 ); 28635 event.preventDefault(); 28636 }, 28637 "mousedown .ui-spinner-button": function( event ) { 28638 var previous; 28639 28640 // We never want the buttons to have focus; whenever the user is 28641 // interacting with the spinner, the focus should be on the input. 28642 // If the input is focused then this.previous is properly set from 28643 // when the input first received focus. If the input is not focused 28644 // then we need to set this.previous based on the value before spinning. 28645 previous = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ) ? 28646 this.previous : this.element.val(); 28647 function checkFocus() { 28648 var isActive = this.element[ 0 ] === $.ui.safeActiveElement( this.document[ 0 ] ); 28649 if ( !isActive ) { 28650 this.element.trigger( "focus" ); 28651 this.previous = previous; 28652 28653 // support: IE 28654 // IE sets focus asynchronously, so we need to check if focus 28655 // moved off of the input because the user clicked on the button. 28656 this._delay( function() { 28657 this.previous = previous; 28658 } ); 28659 } 28660 } 28661 28662 // Ensure focus is on (or stays on) the text field 28663 event.preventDefault(); 28664 checkFocus.call( this ); 28665 28666 // Support: IE 28667 // IE doesn't prevent moving focus even with event.preventDefault() 28668 // so we set a flag to know when we should ignore the blur event 28669 // and check (again) if focus moved off of the input. 28670 this.cancelBlur = true; 28671 this._delay( function() { 28672 delete this.cancelBlur; 28673 checkFocus.call( this ); 28674 } ); 28675 28676 if ( this._start( event ) === false ) { 28677 return; 28678 } 28679 28680 this._repeat( null, $( event.currentTarget ) 28681 .hasClass( "ui-spinner-up" ) ? 1 : -1, event ); 28682 }, 28683 "mouseup .ui-spinner-button": "_stop", 28684 "mouseenter .ui-spinner-button": function( event ) { 28685 28686 // button will add ui-state-active if mouse was down while mouseleave and kept down 28687 if ( !$( event.currentTarget ).hasClass( "ui-state-active" ) ) { 28688 return; 28689 } 28690 28691 if ( this._start( event ) === false ) { 28692 return false; 28693 } 28694 this._repeat( null, $( event.currentTarget ) 28695 .hasClass( "ui-spinner-up" ) ? 1 : -1, event ); 28696 }, 28697 28698 // TODO: do we really want to consider this a stop? 28699 // shouldn't we just stop the repeater and wait until mouseup before 28700 // we trigger the stop event? 28701 "mouseleave .ui-spinner-button": "_stop" 28702 }, 28703 28704 // Support mobile enhanced option and make backcompat more sane 28705 _enhance: function() { 28706 this.uiSpinner = this.element 28707 .attr( "autocomplete", "off" ) 28708 .wrap( "<span>" ) 28709 .parent() 28710 28711 // Add buttons 28712 .append( 28713 "<a></a><a></a>" 28714 ); 28715 }, 28716 28717 _draw: function() { 28718 this._enhance(); 28719 28720 this._addClass( this.uiSpinner, "ui-spinner", "ui-widget ui-widget-content" ); 28721 this._addClass( "ui-spinner-input" ); 28722 28723 this.element.attr( "role", "spinbutton" ); 28724 28725 // Button bindings 28726 this.buttons = this.uiSpinner.children( "a" ) 28727 .attr( "tabIndex", -1 ) 28728 .attr( "aria-hidden", true ) 28729 .button( { 28730 classes: { 28731 "ui-button": "" 28732 } 28733 } ); 28734 28735 // TODO: Right now button does not support classes this is already updated in button PR 28736 this._removeClass( this.buttons, "ui-corner-all" ); 28737 28738 this._addClass( this.buttons.first(), "ui-spinner-button ui-spinner-up" ); 28739 this._addClass( this.buttons.last(), "ui-spinner-button ui-spinner-down" ); 28740 this.buttons.first().button( { 28741 "icon": this.options.icons.up, 28742 "showLabel": false 28743 } ); 28744 this.buttons.last().button( { 28745 "icon": this.options.icons.down, 28746 "showLabel": false 28747 } ); 28748 28749 // IE 6 doesn't understand height: 50% for the buttons 28750 // unless the wrapper has an explicit height 28751 if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) && 28752 this.uiSpinner.height() > 0 ) { 28753 this.uiSpinner.height( this.uiSpinner.height() ); 28754 } 28755 }, 28756 28757 _keydown: function( event ) { 28758 var options = this.options, 28759 keyCode = $.ui.keyCode; 28760 28761 switch ( event.keyCode ) { 28762 case keyCode.UP: 28763 this._repeat( null, 1, event ); 28764 return true; 28765 case keyCode.DOWN: 28766 this._repeat( null, -1, event ); 28767 return true; 28768 case keyCode.PAGE_UP: 28769 this._repeat( null, options.page, event ); 28770 return true; 28771 case keyCode.PAGE_DOWN: 28772 this._repeat( null, -options.page, event ); 28773 return true; 28774 } 28775 28776 return false; 28777 }, 28778 28779 _start: function( event ) { 28780 if ( !this.spinning && this._trigger( "start", event ) === false ) { 28781 return false; 28782 } 28783 28784 if ( !this.counter ) { 28785 this.counter = 1; 28786 } 28787 this.spinning = true; 28788 return true; 28789 }, 28790 28791 _repeat: function( i, steps, event ) { 28792 i = i || 500; 28793 28794 clearTimeout( this.timer ); 28795 this.timer = this._delay( function() { 28796 this._repeat( 40, steps, event ); 28797 }, i ); 28798 28799 this._spin( steps * this.options.step, event ); 28800 }, 28801 28802 _spin: function( step, event ) { 28803 var value = this.value() || 0; 28804 28805 if ( !this.counter ) { 28806 this.counter = 1; 28807 } 28808 28809 value = this._adjustValue( value + step * this._increment( this.counter ) ); 28810 28811 if ( !this.spinning || this._trigger( "spin", event, { value: value } ) !== false ) { 28812 this._value( value ); 28813 this.counter++; 28814 } 28815 }, 28816 28817 _increment: function( i ) { 28818 var incremental = this.options.incremental; 28819 28820 if ( incremental ) { 28821 return typeof incremental === "function" ? 28822 incremental( i ) : 28823 Math.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 ); 28824 } 28825 28826 return 1; 28827 }, 28828 28829 _precision: function() { 28830 var precision = this._precisionOf( this.options.step ); 28831 if ( this.options.min !== null ) { 28832 precision = Math.max( precision, this._precisionOf( this.options.min ) ); 28833 } 28834 return precision; 28835 }, 28836 28837 _precisionOf: function( num ) { 28838 var str = num.toString(), 28839 decimal = str.indexOf( "." ); 28840 return decimal === -1 ? 0 : str.length - decimal - 1; 28841 }, 28842 28843 _adjustValue: function( value ) { 28844 var base, aboveMin, 28845 options = this.options; 28846 28847 // Make sure we're at a valid step 28848 // - find out where we are relative to the base (min or 0) 28849 base = options.min !== null ? options.min : 0; 28850 aboveMin = value - base; 28851 28852 // - round to the nearest step 28853 aboveMin = Math.round( aboveMin / options.step ) * options.step; 28854 28855 // - rounding is based on 0, so adjust back to our base 28856 value = base + aboveMin; 28857 28858 // Fix precision from bad JS floating point math 28859 value = parseFloat( value.toFixed( this._precision() ) ); 28860 28861 // Clamp the value 28862 if ( options.max !== null && value > options.max ) { 28863 return options.max; 28864 } 28865 if ( options.min !== null && value < options.min ) { 28866 return options.min; 28867 } 28868 28869 return value; 28870 }, 28871 28872 _stop: function( event ) { 28873 if ( !this.spinning ) { 28874 return; 28875 } 28876 28877 clearTimeout( this.timer ); 28878 clearTimeout( this.mousewheelTimer ); 28879 this.counter = 0; 28880 this.spinning = false; 28881 this._trigger( "stop", event ); 28882 }, 28883 28884 _setOption: function( key, value ) { 28885 var prevValue, first, last; 28886 28887 if ( key === "culture" || key === "numberFormat" ) { 28888 prevValue = this._parse( this.element.val() ); 28889 this.options[ key ] = value; 28890 this.element.val( this._format( prevValue ) ); 28891 return; 28892 } 28893 28894 if ( key === "max" || key === "min" || key === "step" ) { 28895 if ( typeof value === "string" ) { 28896 value = this._parse( value ); 28897 } 28898 } 28899 if ( key === "icons" ) { 28900 first = this.buttons.first().find( ".ui-icon" ); 28901 this._removeClass( first, null, this.options.icons.up ); 28902 this._addClass( first, null, value.up ); 28903 last = this.buttons.last().find( ".ui-icon" ); 28904 this._removeClass( last, null, this.options.icons.down ); 28905 this._addClass( last, null, value.down ); 28906 } 28907 28908 this._super( key, value ); 28909 }, 28910 28911 _setOptionDisabled: function( value ) { 28912 this._super( value ); 28913 28914 this._toggleClass( this.uiSpinner, null, "ui-state-disabled", !!value ); 28915 this.element.prop( "disabled", !!value ); 28916 this.buttons.button( value ? "disable" : "enable" ); 28917 }, 28918 28919 _setOptions: spinnerModifier( function( options ) { 28920 this._super( options ); 28921 } ), 28922 28923 _parse: function( val ) { 28924 if ( typeof val === "string" && val !== "" ) { 28925 val = window.Globalize && this.options.numberFormat ? 28926 Globalize.parseFloat( val, 10, this.options.culture ) : +val; 28927 } 28928 return val === "" || isNaN( val ) ? null : val; 28929 }, 28930 28931 _format: function( value ) { 28932 if ( value === "" ) { 28933 return ""; 28934 } 28935 return window.Globalize && this.options.numberFormat ? 28936 Globalize.format( value, this.options.numberFormat, this.options.culture ) : 28937 value; 28938 }, 28939 28940 _refresh: function() { 28941 this.element.attr( { 28942 "aria-valuemin": this.options.min, 28943 "aria-valuemax": this.options.max, 28944 28945 // TODO: what should we do with values that can't be parsed? 28946 "aria-valuenow": this._parse( this.element.val() ) 28947 } ); 28948 }, 28949 28950 isValid: function() { 28951 var value = this.value(); 28952 28953 // Null is invalid 28954 if ( value === null ) { 28955 return false; 28956 } 28957 28958 // If value gets adjusted, it's invalid 28959 return value === this._adjustValue( value ); 28960 }, 28961 28962 // Update the value without triggering change 28963 _value: function( value, allowAny ) { 28964 var parsed; 28965 if ( value !== "" ) { 28966 parsed = this._parse( value ); 28967 if ( parsed !== null ) { 28968 if ( !allowAny ) { 28969 parsed = this._adjustValue( parsed ); 28970 } 28971 value = this._format( parsed ); 28972 } 28973 } 28974 this.element.val( value ); 28975 this._refresh(); 28976 }, 28977 28978 _destroy: function() { 28979 this.element 28980 .prop( "disabled", false ) 28981 .removeAttr( "autocomplete role aria-valuemin aria-valuemax aria-valuenow" ); 28982 28983 this.uiSpinner.replaceWith( this.element ); 28984 }, 28985 28986 stepUp: spinnerModifier( function( steps ) { 28987 this._stepUp( steps ); 28988 } ), 28989 _stepUp: function( steps ) { 28990 if ( this._start() ) { 28991 this._spin( ( steps || 1 ) * this.options.step ); 28992 this._stop(); 28993 } 28994 }, 28995 28996 stepDown: spinnerModifier( function( steps ) { 28997 this._stepDown( steps ); 28998 } ), 28999 _stepDown: function( steps ) { 29000 if ( this._start() ) { 29001 this._spin( ( steps || 1 ) * -this.options.step ); 29002 this._stop(); 29003 } 29004 }, 29005 29006 pageUp: spinnerModifier( function( pages ) { 29007 this._stepUp( ( pages || 1 ) * this.options.page ); 29008 } ), 29009 29010 pageDown: spinnerModifier( function( pages ) { 29011 this._stepDown( ( pages || 1 ) * this.options.page ); 29012 } ), 29013 29014 value: function( newVal ) { 29015 if ( !arguments.length ) { 29016 return this._parse( this.element.val() ); 29017 } 29018 spinnerModifier( this._value ).call( this, newVal ); 29019 }, 29020 29021 widget: function() { 29022 return this.uiSpinner; 29023 } 29024} ); 29025 29026// DEPRECATED 29027// TODO: switch return back to widget declaration at top of file when this is removed 29028if ( $.uiBackCompat !== false ) { 29029 29030 // Backcompat for spinner html extension points 29031 $.widget( "ui.spinner", $.ui.spinner, { 29032 _enhance: function() { 29033 this.uiSpinner = this.element 29034 .attr( "autocomplete", "off" ) 29035 .wrap( this._uiSpinnerHtml() ) 29036 .parent() 29037 29038 // Add buttons 29039 .append( this._buttonHtml() ); 29040 }, 29041 _uiSpinnerHtml: function() { 29042 return "<span>"; 29043 }, 29044 29045 _buttonHtml: function() { 29046 return "<a></a><a></a>"; 29047 } 29048 } ); 29049} 29050 29051var widgetsSpinner = $.ui.spinner; 29052 29053 29054/*! 29055 * jQuery UI Tabs 1.13.
290552 29056 * http://jqueryui.com 29057 * 29058 * Copyright jQuery Foundation and other contributors 29059 * Released under the MIT license. 29060 * http://jquery.org/license 29061 */ 29062 29063//>>label: Tabs 29064//>>group: Widgets 29065//>>description: Transforms a set of container elements into a tab structure. 29066//>>docs: http://api.jqueryui.com/tabs/ 29067//>>demos: http://jqueryui.com/tabs/ 29068//>>css.structure: ../../themes/base/core.css 29069//>>css.structure: ../../themes/base/tabs.css 29070//>>css.theme: ../../themes/base/theme.css 29071 29072 29073$.widget( "ui.tabs", { 29074 version: "1.13.2
vendor: 21,408 bytes, lines 29074-29903
29074", 29075 delay: 300, 29076 options: { 29077 active: null, 29078 classes: { 29079 "ui-tabs": "ui-corner-all", 29080 "ui-tabs-nav": "ui-corner-all", 29081 "ui-tabs-panel": "ui-corner-bottom", 29082 "ui-tabs-tab": "ui-corner-top" 29083 }, 29084 collapsible: false, 29085 event: "click", 29086 heightStyle: "content", 29087 hide: null, 29088 show: null, 29089 29090 // Callbacks 29091 activate: null, 29092 beforeActivate: null, 29093 beforeLoad: null, 29094 load: null 29095 }, 29096 29097 _isLocal: ( function() { 29098 var rhash = /#.*$/; 29099 29100 return function( anchor ) { 29101 var anchorUrl, locationUrl; 29102 29103 anchorUrl = anchor.href.replace( rhash, "" ); 29104 locationUrl = location.href.replace( rhash, "" ); 29105 29106 // Decoding may throw an error if the URL isn't UTF-8 (#9518) 29107 try { 29108 anchorUrl = decodeURIComponent( anchorUrl ); 29109 } catch ( error ) {} 29110 try { 29111 locationUrl = decodeURIComponent( locationUrl ); 29112 } catch ( error ) {} 29113 29114 return anchor.hash.length > 1 && anchorUrl === locationUrl; 29115 }; 29116 } )(), 29117 29118 _create: function() { 29119 var that = this, 29120 options = this.options; 29121 29122 this.running = false; 29123 29124 this._addClass( "ui-tabs", "ui-widget ui-widget-content" ); 29125 this._toggleClass( "ui-tabs-collapsible", null, options.collapsible ); 29126 29127 this._processTabs(); 29128 options.active = this._initialActive(); 29129 29130 // Take disabling tabs via class attribute from HTML 29131 // into account and update option properly. 29132 if ( Array.isArray( options.disabled ) ) { 29133 options.disabled = $.uniqueSort( options.disabled.concat( 29134 $.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) { 29135 return that.tabs.index( li ); 29136 } ) 29137 ) ).sort(); 29138 } 29139 29140 // Check for length avoids error when initializing empty list 29141 if ( this.options.active !== false && this.anchors.length ) { 29142 this.active = this._findActive( options.active ); 29143 } else { 29144 this.active = $(); 29145 } 29146 29147 this._refresh(); 29148 29149 if ( this.active.length ) { 29150 this.load( options.active ); 29151 } 29152 }, 29153 29154 _initialActive: function() { 29155 var active = this.options.active, 29156 collapsible = this.options.collapsible, 29157 locationHash = location.hash.substring( 1 ); 29158 29159 if ( active === null ) { 29160 29161 // check the fragment identifier in the URL 29162 if ( locationHash ) { 29163 this.tabs.each( function( i, tab ) { 29164 if ( $( tab ).attr( "aria-controls" ) === locationHash ) { 29165 active = i; 29166 return false; 29167 } 29168 } ); 29169 } 29170 29171 // Check for a tab marked active via a class 29172 if ( active === null ) { 29173 active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) ); 29174 } 29175 29176 // No active tab, set to false 29177 if ( active === null || active === -1 ) { 29178 active = this.tabs.length ? 0 : false; 29179 } 29180 } 29181 29182 // Handle numbers: negative, out of range 29183 if ( active !== false ) { 29184 active = this.tabs.index( this.tabs.eq( active ) ); 29185 if ( active === -1 ) { 29186 active = collapsible ? false : 0; 29187 } 29188 } 29189 29190 // Don't allow collapsible: false and active: false 29191 if ( !collapsible && active === false && this.anchors.length ) { 29192 active = 0; 29193 } 29194 29195 return active; 29196 }, 29197 29198 _getCreateEventData: function() { 29199 return { 29200 tab: this.active, 29201 panel: !this.active.length ? $() : this._getPanelForTab( this.active ) 29202 }; 29203 }, 29204 29205 _tabKeydown: function( event ) { 29206 var focusedTab = $( $.ui.safeActiveElement( this.document[ 0 ] ) ).closest( "li" ), 29207 selectedIndex = this.tabs.index( focusedTab ), 29208 goingForward = true; 29209 29210 if ( this._handlePageNav( event ) ) { 29211 return; 29212 } 29213 29214 switch ( event.keyCode ) { 29215 case $.ui.keyCode.RIGHT: 29216 case $.ui.keyCode.DOWN: 29217 selectedIndex++; 29218 break; 29219 case $.ui.keyCode.UP: 29220 case $.ui.keyCode.LEFT: 29221 goingForward = false; 29222 selectedIndex--; 29223 break; 29224 case $.ui.keyCode.END: 29225 selectedIndex = this.anchors.length - 1; 29226 break; 29227 case $.ui.keyCode.HOME: 29228 selectedIndex = 0; 29229 break; 29230 case $.ui.keyCode.SPACE: 29231 29232 // Activate only, no collapsing 29233 event.preventDefault(); 29234 clearTimeout( this.activating ); 29235 this._activate( selectedIndex ); 29236 return; 29237 case $.ui.keyCode.ENTER: 29238 29239 // Toggle (cancel delayed activation, allow collapsing) 29240 event.preventDefault(); 29241 clearTimeout( this.activating ); 29242 29243 // Determine if we should collapse or activate 29244 this._activate( selectedIndex === this.options.active ? false : selectedIndex ); 29245 return; 29246 default: 29247 return; 29248 } 29249 29250 // Focus the appropriate tab, based on which key was pressed 29251 event.preventDefault(); 29252 clearTimeout( this.activating ); 29253 selectedIndex = this._focusNextTab( selectedIndex, goingForward ); 29254 29255 // Navigating with control/command key will prevent automatic activation 29256 if ( !event.ctrlKey && !event.metaKey ) { 29257 29258 // Update aria-selected immediately so that AT think the tab is already selected. 29259 // Otherwise AT may confuse the user by stating that they need to activate the tab, 29260 // but the tab will already be activated by the time the announcement finishes. 29261 focusedTab.attr( "aria-selected", "false" ); 29262 this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" ); 29263 29264 this.activating = this._delay( function() { 29265 this.option( "active", selectedIndex ); 29266 }, this.delay ); 29267 } 29268 }, 29269 29270 _panelKeydown: function( event ) { 29271 if ( this._handlePageNav( event ) ) { 29272 return; 29273 } 29274 29275 // Ctrl+up moves focus to the current tab 29276 if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) { 29277 event.preventDefault(); 29278 this.active.trigger( "focus" ); 29279 } 29280 }, 29281 29282 // Alt+page up/down moves focus to the previous/next tab (and activates) 29283 _handlePageNav: function( event ) { 29284 if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) { 29285 this._activate( this._focusNextTab( this.options.active - 1, false ) ); 29286 return true; 29287 } 29288 if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) { 29289 this._activate( this._focusNextTab( this.options.active + 1, true ) ); 29290 return true; 29291 } 29292 }, 29293 29294 _findNextTab: function( index, goingForward ) { 29295 var lastTabIndex = this.tabs.length - 1; 29296 29297 function constrain() { 29298 if ( index > lastTabIndex ) { 29299 index = 0; 29300 } 29301 if ( index < 0 ) { 29302 index = lastTabIndex; 29303 } 29304 return index; 29305 } 29306 29307 while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) { 29308 index = goingForward ? index + 1 : index - 1; 29309 } 29310 29311 return index; 29312 }, 29313 29314 _focusNextTab: function( index, goingForward ) { 29315 index = this._findNextTab( index, goingForward ); 29316 this.tabs.eq( index ).trigger( "focus" ); 29317 return index; 29318 }, 29319 29320 _setOption: function( key, value ) { 29321 if ( key === "active" ) { 29322 29323 // _activate() will handle invalid values and update this.options 29324 this._activate( value ); 29325 return; 29326 } 29327 29328 this._super( key, value ); 29329 29330 if ( key === "collapsible" ) { 29331 this._toggleClass( "ui-tabs-collapsible", null, value ); 29332 29333 // Setting collapsible: false while collapsed; open first panel 29334 if ( !value && this.options.active === false ) { 29335 this._activate( 0 ); 29336 } 29337 } 29338 29339 if ( key === "event" ) { 29340 this._setupEvents( value ); 29341 } 29342 29343 if ( key === "heightStyle" ) { 29344 this._setupHeightStyle( value ); 29345 } 29346 }, 29347 29348 _sanitizeSelector: function( hash ) { 29349 return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : ""; 29350 }, 29351 29352 refresh: function() { 29353 var options = this.options, 29354 lis = this.tablist.children( ":has(a[href])" ); 29355 29356 // Get disabled tabs from class attribute from HTML 29357 // this will get converted to a boolean if needed in _refresh() 29358 options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) { 29359 return lis.index( tab ); 29360 } ); 29361 29362 this._processTabs(); 29363 29364 // Was collapsed or no tabs 29365 if ( options.active === false || !this.anchors.length ) { 29366 options.active = false; 29367 this.active = $(); 29368 29369 // was active, but active tab is gone 29370 } else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) { 29371 29372 // all remaining tabs are disabled 29373 if ( this.tabs.length === options.disabled.length ) { 29374 options.active = false; 29375 this.active = $(); 29376 29377 // activate previous tab 29378 } else { 29379 this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) ); 29380 } 29381 29382 // was active, active tab still exists 29383 } else { 29384 29385 // make sure active index is correct 29386 options.active = this.tabs.index( this.active ); 29387 } 29388 29389 this._refresh(); 29390 }, 29391 29392 _refresh: function() { 29393 this._setOptionDisabled( this.options.disabled ); 29394 this._setupEvents( this.options.event ); 29395 this._setupHeightStyle( this.options.heightStyle ); 29396 29397 this.tabs.not( this.active ).attr( { 29398 "aria-selected": "false", 29399 "aria-expanded": "false", 29400 tabIndex: -1 29401 } ); 29402 this.panels.not( this._getPanelForTab( this.active ) ) 29403 .hide() 29404 .attr( { 29405 "aria-hidden": "true" 29406 } ); 29407 29408 // Make sure one tab is in the tab order 29409 if ( !this.active.length ) { 29410 this.tabs.eq( 0 ).attr( "tabIndex", 0 ); 29411 } else { 29412 this.active 29413 .attr( { 29414 "aria-selected": "true", 29415 "aria-expanded": "true", 29416 tabIndex: 0 29417 } ); 29418 this._addClass( this.active, "ui-tabs-active", "ui-state-active" ); 29419 this._getPanelForTab( this.active ) 29420 .show() 29421 .attr( { 29422 "aria-hidden": "false" 29423 } ); 29424 } 29425 }, 29426 29427 _processTabs: function() { 29428 var that = this, 29429 prevTabs = this.tabs, 29430 prevAnchors = this.anchors, 29431 prevPanels = this.panels; 29432 29433 this.tablist = this._getList().attr( "role", "tablist" ); 29434 this._addClass( this.tablist, "ui-tabs-nav", 29435 "ui-helper-reset ui-helper-clearfix ui-widget-header" ); 29436 29437 // Prevent users from focusing disabled tabs via click 29438 this.tablist 29439 .on( "mousedown" + this.eventNamespace, "> li", function( event ) { 29440 if ( $( this ).is( ".ui-state-disabled" ) ) { 29441 event.preventDefault(); 29442 } 29443 } ) 29444 29445 // Support: IE <9 29446 // Preventing the default action in mousedown doesn't prevent IE 29447 // from focusing the element, so if the anchor gets focused, blur. 29448 // We don't have to worry about focusing the previously focused 29449 // element since clicking on a non-focusable element should focus 29450 // the body anyway. 29451 .on( "focus" + this.eventNamespace, ".ui-tabs-anchor", function() { 29452 if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) { 29453 this.blur(); 29454 } 29455 } ); 29456 29457 this.tabs = this.tablist.find( "> li:has(a[href])" ) 29458 .attr( { 29459 role: "tab", 29460 tabIndex: -1 29461 } ); 29462 this._addClass( this.tabs, "ui-tabs-tab", "ui-state-default" ); 29463 29464 this.anchors = this.tabs.map( function() { 29465 return $( "a", this )[ 0 ]; 29466 } ) 29467 .attr( { 29468 tabIndex: -1 29469 } ); 29470 this._addClass( this.anchors, "ui-tabs-anchor" ); 29471 29472 this.panels = $(); 29473 29474 this.anchors.each( function( i, anchor ) { 29475 var selector, panel, panelId, 29476 anchorId = $( anchor ).uniqueId().attr( "id" ), 29477 tab = $( anchor ).closest( "li" ), 29478 originalAriaControls = tab.attr( "aria-controls" ); 29479 29480 // Inline tab 29481 if ( that._isLocal( anchor ) ) { 29482 selector = anchor.hash; 29483 panelId = selector.substring( 1 ); 29484 panel = that.element.find( that._sanitizeSelector( selector ) ); 29485 29486 // remote tab 29487 } else { 29488 29489 // If the tab doesn't already have aria-controls, 29490 // generate an id by using a throw-away element 29491 panelId = tab.attr( "aria-controls" ) || $( {} ).uniqueId()[ 0 ].id; 29492 selector = "#" + panelId; 29493 panel = that.element.find( selector ); 29494 if ( !panel.length ) { 29495 panel = that._createPanel( panelId ); 29496 panel.insertAfter( that.panels[ i - 1 ] || that.tablist ); 29497 } 29498 panel.attr( "aria-live", "polite" ); 29499 } 29500 29501 if ( panel.length ) { 29502 that.panels = that.panels.add( panel ); 29503 } 29504 if ( originalAriaControls ) { 29505 tab.data( "ui-tabs-aria-controls", originalAriaControls ); 29506 } 29507 tab.attr( { 29508 "aria-controls": panelId, 29509 "aria-labelledby": anchorId 29510 } ); 29511 panel.attr( "aria-labelledby", anchorId ); 29512 } ); 29513 29514 this.panels.attr( "role", "tabpanel" ); 29515 this._addClass( this.panels, "ui-tabs-panel", "ui-widget-content" ); 29516 29517 // Avoid memory leaks (#10056) 29518 if ( prevTabs ) { 29519 this._off( prevTabs.not( this.tabs ) ); 29520 this._off( prevAnchors.not( this.anchors ) ); 29521 this._off( prevPanels.not( this.panels ) ); 29522 } 29523 }, 29524 29525 // Allow overriding how to find the list for rare usage scenarios (#7715) 29526 _getList: function() { 29527 return this.tablist || this.element.find( "ol, ul" ).eq( 0 ); 29528 }, 29529 29530 _createPanel: function( id ) { 29531 return $( "<div>" ) 29532 .attr( "id", id ) 29533 .data( "ui-tabs-destroy", true ); 29534 }, 29535 29536 _setOptionDisabled: function( disabled ) { 29537 var currentItem, li, i; 29538 29539 if ( Array.isArray( disabled ) ) { 29540 if ( !disabled.length ) { 29541 disabled = false; 29542 } else if ( disabled.length === this.anchors.length ) { 29543 disabled = true; 29544 } 29545 } 29546 29547 // Disable tabs 29548 for ( i = 0; ( li = this.tabs[ i ] ); i++ ) { 29549 currentItem = $( li ); 29550 if ( disabled === true || $.inArray( i, disabled ) !== -1 ) { 29551 currentItem.attr( "aria-disabled", "true" ); 29552 this._addClass( currentItem, null, "ui-state-disabled" ); 29553 } else { 29554 currentItem.removeAttr( "aria-disabled" ); 29555 this._removeClass( currentItem, null, "ui-state-disabled" ); 29556 } 29557 } 29558 29559 this.options.disabled = disabled; 29560 29561 this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, 29562 disabled === true ); 29563 }, 29564 29565 _setupEvents: function( event ) { 29566 var events = {}; 29567 if ( event ) { 29568 $.each( event.split( " " ), function( index, eventName ) { 29569 events[ eventName ] = "_eventHandler"; 29570 } ); 29571 } 29572 29573 this._off( this.anchors.add( this.tabs ).add( this.panels ) ); 29574 29575 // Always prevent the default action, even when disabled 29576 this._on( true, this.anchors, { 29577 click: function( event ) { 29578 event.preventDefault(); 29579 } 29580 } ); 29581 this._on( this.anchors, events ); 29582 this._on( this.tabs, { keydown: "_tabKeydown" } ); 29583 this._on( this.panels, { keydown: "_panelKeydown" } ); 29584 29585 this._focusable( this.tabs ); 29586 this._hoverable( this.tabs ); 29587 }, 29588 29589 _setupHeightStyle: function( heightStyle ) { 29590 var maxHeight, 29591 parent = this.element.parent(); 29592 29593 if ( heightStyle === "fill" ) { 29594 maxHeight = parent.height(); 29595 maxHeight -= this.element.outerHeight() - this.element.height(); 29596 29597 this.element.siblings( ":visible" ).each( function() { 29598 var elem = $( this ), 29599 position = elem.css( "position" ); 29600 29601 if ( position === "absolute" || position === "fixed" ) { 29602 return; 29603 } 29604 maxHeight -= elem.outerHeight( true ); 29605 } ); 29606 29607 this.element.children().not( this.panels ).each( function() { 29608 maxHeight -= $( this ).outerHeight( true ); 29609 } ); 29610 29611 this.panels.each( function() { 29612 $( this ).height( Math.max( 0, maxHeight - 29613 $( this ).innerHeight() + $( this ).height() ) ); 29614 } ) 29615 .css( "overflow", "auto" ); 29616 } else if ( heightStyle === "auto" ) { 29617 maxHeight = 0; 29618 this.panels.each( function() { 29619 maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() ); 29620 } ).height( maxHeight ); 29621 } 29622 }, 29623 29624 _eventHandler: function( event ) { 29625 var options = this.options, 29626 active = this.active, 29627 anchor = $( event.currentTarget ), 29628 tab = anchor.closest( "li" ), 29629 clickedIsActive = tab[ 0 ] === active[ 0 ], 29630 collapsing = clickedIsActive && options.collapsible, 29631 toShow = collapsing ? $() : this._getPanelForTab( tab ), 29632 toHide = !active.length ? $() : this._getPanelForTab( active ), 29633 eventData = { 29634 oldTab: active, 29635 oldPanel: toHide, 29636 newTab: collapsing ? $() : tab, 29637 newPanel: toShow 29638 }; 29639 29640 event.preventDefault(); 29641 29642 if ( tab.hasClass( "ui-state-disabled" ) || 29643 29644 // tab is already loading 29645 tab.hasClass( "ui-tabs-loading" ) || 29646 29647 // can't switch durning an animation 29648 this.running || 29649 29650 // click on active header, but not collapsible 29651 ( clickedIsActive && !options.collapsible ) || 29652 29653 // allow canceling activation 29654 ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { 29655 return; 29656 } 29657 29658 options.active = collapsing ? false : this.tabs.index( tab ); 29659 29660 this.active = clickedIsActive ? $() : tab; 29661 if ( this.xhr ) { 29662 this.xhr.abort(); 29663 } 29664 29665 if ( !toHide.length && !toShow.length ) { 29666 $.error( "jQuery UI Tabs: Mismatching fragment identifier." ); 29667 } 29668 29669 if ( toShow.length ) { 29670 this.load( this.tabs.index( tab ), event ); 29671 } 29672 this._toggle( event, eventData ); 29673 }, 29674 29675 // Handles show/hide for selecting tabs 29676 _toggle: function( event, eventData ) { 29677 var that = this, 29678 toShow = eventData.newPanel, 29679 toHide = eventData.oldPanel; 29680 29681 this.running = true; 29682 29683 function complete() { 29684 that.running = false; 29685 that._trigger( "activate", event, eventData ); 29686 } 29687 29688 function show() { 29689 that._addClass( eventData.newTab.closest( "li" ), "ui-tabs-active", "ui-state-active" ); 29690 29691 if ( toShow.length && that.options.show ) { 29692 that._show( toShow, that.options.show, complete ); 29693 } else { 29694 toShow.show(); 29695 complete(); 29696 } 29697 } 29698 29699 // Start out by hiding, then showing, then completing 29700 if ( toHide.length && this.options.hide ) { 29701 this._hide( toHide, this.options.hide, function() { 29702 that._removeClass( eventData.oldTab.closest( "li" ), 29703 "ui-tabs-active", "ui-state-active" ); 29704 show(); 29705 } ); 29706 } else { 29707 this._removeClass( eventData.oldTab.closest( "li" ), 29708 "ui-tabs-active", "ui-state-active" ); 29709 toHide.hide(); 29710 show(); 29711 } 29712 29713 toHide.attr( "aria-hidden", "true" ); 29714 eventData.oldTab.attr( { 29715 "aria-selected": "false", 29716 "aria-expanded": "false" 29717 } ); 29718 29719 // If we're switching tabs, remove the old tab from the tab order. 29720 // If we're opening from collapsed state, remove the previous tab from the tab order. 29721 // If we're collapsing, then keep the collapsing tab in the tab order. 29722 if ( toShow.length && toHide.length ) { 29723 eventData.oldTab.attr( "tabIndex", -1 ); 29724 } else if ( toShow.length ) { 29725 this.tabs.filter( function() { 29726 return $( this ).attr( "tabIndex" ) === 0; 29727 } ) 29728 .attr( "tabIndex", -1 ); 29729 } 29730 29731 toShow.attr( "aria-hidden", "false" ); 29732 eventData.newTab.attr( { 29733 "aria-selected": "true", 29734 "aria-expanded": "true", 29735 tabIndex: 0 29736 } ); 29737 }, 29738 29739 _activate: function( index ) { 29740 var anchor, 29741 active = this._findActive( index ); 29742 29743 // Trying to activate the already active panel 29744 if ( active[ 0 ] === this.active[ 0 ] ) { 29745 return; 29746 } 29747 29748 // Trying to collapse, simulate a click on the current active header 29749 if ( !active.length ) { 29750 active = this.active; 29751 } 29752 29753 anchor = active.find( ".ui-tabs-anchor" )[ 0 ]; 29754 this._eventHandler( { 29755 target: anchor, 29756 currentTarget: anchor, 29757 preventDefault: $.noop 29758 } ); 29759 }, 29760 29761 _findActive: function( index ) { 29762 return index === false ? $() : this.tabs.eq( index ); 29763 }, 29764 29765 _getIndex: function( index ) { 29766 29767 // meta-function to give users option to provide a href string instead of a numerical index. 29768 if ( typeof index === "string" ) { 29769 index = this.anchors.index( this.anchors.filter( "[href$='" + 29770 $.escapeSelector( index ) + "']" ) ); 29771 } 29772 29773 return index; 29774 }, 29775 29776 _destroy: function() { 29777 if ( this.xhr ) { 29778 this.xhr.abort(); 29779 } 29780 29781 this.tablist 29782 .removeAttr( "role" ) 29783 .off( this.eventNamespace ); 29784 29785 this.anchors 29786 .removeAttr( "role tabIndex" ) 29787 .removeUniqueId(); 29788 29789 this.tabs.add( this.panels ).each( function() { 29790 if ( $.data( this, "ui-tabs-destroy" ) ) { 29791 $( this ).remove(); 29792 } else { 29793 $( this ).removeAttr( "role tabIndex " + 29794 "aria-live aria-busy aria-selected aria-labelledby aria-hidden aria-expanded" ); 29795 } 29796 } ); 29797 29798 this.tabs.each( function() { 29799 var li = $( this ), 29800 prev = li.data( "ui-tabs-aria-controls" ); 29801 if ( prev ) { 29802 li 29803 .attr( "aria-controls", prev ) 29804 .removeData( "ui-tabs-aria-controls" ); 29805 } else { 29806 li.removeAttr( "aria-controls" ); 29807 } 29808 } ); 29809 29810 this.panels.show(); 29811 29812 if ( this.options.heightStyle !== "content" ) { 29813 this.panels.css( "height", "" ); 29814 } 29815 }, 29816 29817 enable: function( index ) { 29818 var disabled = this.options.disabled; 29819 if ( disabled === false ) { 29820 return; 29821 } 29822 29823 if ( index === undefined ) { 29824 disabled = false; 29825 } else { 29826 index = this._getIndex( index ); 29827 if ( Array.isArray( disabled ) ) { 29828 disabled = $.map( disabled, function( num ) { 29829 return num !== index ? num : null; 29830 } ); 29831 } else { 29832 disabled = $.map( this.tabs, function( li, num ) { 29833 return num !== index ? num : null; 29834 } ); 29835 } 29836 } 29837 this._setOptionDisabled( disabled ); 29838 }, 29839 29840 disable: function( index ) { 29841 var disabled = this.options.disabled; 29842 if ( disabled === true ) { 29843 return; 29844 } 29845 29846 if ( index === undefined ) { 29847 disabled = true; 29848 } else { 29849 index = this._getIndex( index ); 29850 if ( $.inArray( index, disabled ) !== -1 ) { 29851 return; 29852 } 29853 if ( Array.isArray( disabled ) ) { 29854 disabled = $.merge( [ index ], disabled ).sort(); 29855 } else { 29856 disabled = [ index ]; 29857 } 29858 } 29859 this._setOptionDisabled( disabled ); 29860 }, 29861 29862 load: function( index, event ) { 29863 index = this._getIndex( index ); 29864 var that = this, 29865 tab = this.tabs.eq( index ), 29866 anchor = tab.find( ".ui-tabs-anchor" ), 29867 panel = this._getPanelForTab( tab ), 29868 eventData = { 29869 tab: tab, 29870 panel: panel 29871 }, 29872 complete = function( jqXHR, status ) { 29873 if ( status === "abort" ) { 29874 that.panels.stop( false, true ); 29875 } 29876 29877 that._removeClass( tab, "ui-tabs-loading" ); 29878 panel.removeAttr( "aria-busy" ); 29879 29880 if ( jqXHR === that.xhr ) { 29881 delete that.xhr; 29882 } 29883 }; 29884 29885 // Not remote 29886 if ( this._isLocal( anchor[ 0 ] ) ) { 29887 return; 29888 } 29889 29890 this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) ); 29891 29892 // Support: jQuery <1.8 29893 // jQuery <1.8 returns false if the request is canceled in beforeSend, 29894 // but as of 1.8, $.ajax() always returns a jqXHR object. 29895 if ( this.xhr && this.xhr.statusText !== "canceled" ) { 29896 this._addClass( tab, "ui-tabs-loading" ); 29897 panel.attr( "aria-busy", "true" ); 29898 29899 this.xhr 29900 .done( function( response, status, jqXHR ) { 29901 29902 // support: jQuery <1.8 29903 // http
29903://bugs.jquery.com/ticket/11778 29904 setTimeout( function() { 29905 panel.html( response ); 29906 that._trigger( "load", event, eventData ); 29907 29908 complete( jqXHR, status ); 29909 }, 1 ); 29910 } ) 29911 .fail( function( jqXHR, status ) { 29912 29913 // support: jQuery <1.8 29914 // http://bugs.jquery.com/ticket/11778 29915 setTimeout( function() { 29916 complete( jqXHR, status ); 29917 }, 1 ); 29918 } ); 29919 } 29920 }, 29921 29922 _ajaxSettings: function( anchor, event, eventData ) { 29923 var that = this; 29924 return { 29925
vendor: 1,423 bytes, lines 29926-29978
29926 // Support: IE <11 only 29927 // Strip any hash that exists to prevent errors with the Ajax request 29928 url: anchor.attr( "href" ).replace( /#.*$/, "" ), 29929 beforeSend: function( jqXHR, settings ) { 29930 return that._trigger( "beforeLoad", event, 29931 $.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) ); 29932 } 29933 }; 29934 }, 29935 29936 _getPanelForTab: function( tab ) { 29937 var id = $( tab ).attr( "aria-controls" ); 29938 return this.element.find( this._sanitizeSelector( "#" + id ) ); 29939 } 29940} ); 29941 29942// DEPRECATED 29943// TODO: Switch return back to widget declaration at top of file when this is removed 29944if ( $.uiBackCompat !== false ) { 29945 29946 // Backcompat for ui-tab class (now ui-tabs-tab) 29947 $.widget( "ui.tabs", $.ui.tabs, { 29948 _processTabs: function() { 29949 this._superApply( arguments ); 29950 this._addClass( this.tabs, "ui-tab" ); 29951 } 29952 } ); 29953} 29954 29955var widgetsTabs = $.ui.tabs; 29956 29957 29958/*! 29959 * jQuery UI Tooltip 1.13.2 29960 * http://jqueryui.com 29961 * 29962 * Copyright jQuery Foundation and other contributors 29963 * Released under the MIT license. 29964 * http://jquery.org/license 29965 */ 29966 29967//>>label: Tooltip 29968//>>group: Widgets 29969//>>description: Shows additional information for any element on hover or focus. 29970//>>docs: http://api.jqueryui.com/tooltip/ 29971//>>demos: http://jqueryui.com/tooltip/ 29972//>>css.structure: ../../themes/base/core.css 29973//>>css.structure: ../../themes/base/tooltip.css 29974//>>css.theme: ../../themes/base/theme.css 29975 29976 29977$.widget( "ui.tooltip", { 29978 version: "1.13.2
vendor: 13,567 bytes, lines 29978-30466
29978", 29979 options: { 29980 classes: { 29981 "ui-tooltip": "ui-corner-all ui-widget-shadow" 29982 }, 29983 content: function() { 29984 var title = $( this ).attr( "title" ); 29985 29986 // Escape title, since we're going from an attribute to raw HTML 29987 return $( "<a>" ).text( title ).html(); 29988 }, 29989 hide: true, 29990 29991 // Disabled elements have inconsistent behavior across browsers (#8661) 29992 items: "[title]:not([disabled])", 29993 position: { 29994 my: "left top+15", 29995 at: "left bottom", 29996 collision: "flipfit flip" 29997 }, 29998 show: true, 29999 track: false, 30000 30001 // Callbacks 30002 close: null, 30003 open: null 30004 }, 30005 30006 _addDescribedBy: function( elem, id ) { 30007 var describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ); 30008 describedby.push( id ); 30009 elem 30010 .data( "ui-tooltip-id", id ) 30011 .attr( "aria-describedby", String.prototype.trim.call( describedby.join( " " ) ) ); 30012 }, 30013 30014 _removeDescribedBy: function( elem ) { 30015 var id = elem.data( "ui-tooltip-id" ), 30016 describedby = ( elem.attr( "aria-describedby" ) || "" ).split( /\s+/ ), 30017 index = $.inArray( id, describedby ); 30018 30019 if ( index !== -1 ) { 30020 describedby.splice( index, 1 ); 30021 } 30022 30023 elem.removeData( "ui-tooltip-id" ); 30024 describedby = String.prototype.trim.call( describedby.join( " " ) ); 30025 if ( describedby ) { 30026 elem.attr( "aria-describedby", describedby ); 30027 } else { 30028 elem.removeAttr( "aria-describedby" ); 30029 } 30030 }, 30031 30032 _create: function() { 30033 this._on( { 30034 mouseover: "open", 30035 focusin: "open" 30036 } ); 30037 30038 // IDs of generated tooltips, needed for destroy 30039 this.tooltips = {}; 30040 30041 // IDs of parent tooltips where we removed the title attribute 30042 this.parents = {}; 30043 30044 // Append the aria-live region so tooltips announce correctly 30045 this.liveRegion = $( "<div>" ) 30046 .attr( { 30047 role: "log", 30048 "aria-live": "assertive", 30049 "aria-relevant": "additions" 30050 } ) 30051 .appendTo( this.document[ 0 ].body ); 30052 this._addClass( this.liveRegion, null, "ui-helper-hidden-accessible" ); 30053 30054 this.disabledTitles = $( [] ); 30055 }, 30056 30057 _setOption: function( key, value ) { 30058 var that = this; 30059 30060 this._super( key, value ); 30061 30062 if ( key === "content" ) { 30063 $.each( this.tooltips, function( id, tooltipData ) { 30064 that._updateContent( tooltipData.element ); 30065 } ); 30066 } 30067 }, 30068 30069 _setOptionDisabled: function( value ) { 30070 this[ value ? "_disable" : "_enable" ](); 30071 }, 30072 30073 _disable: function() { 30074 var that = this; 30075 30076 // Close open tooltips 30077 $.each( this.tooltips, function( id, tooltipData ) { 30078 var event = $.Event( "blur" ); 30079 event.target = event.currentTarget = tooltipData.element[ 0 ]; 30080 that.close( event, true ); 30081 } ); 30082 30083 // Remove title attributes to prevent native tooltips 30084 this.disabledTitles = this.disabledTitles.add( 30085 this.element.find( this.options.items ).addBack() 30086 .filter( function() { 30087 var element = $( this ); 30088 if ( element.is( "[title]" ) ) { 30089 return element 30090 .data( "ui-tooltip-title", element.attr( "title" ) ) 30091 .removeAttr( "title" ); 30092 } 30093 } ) 30094 ); 30095 }, 30096 30097 _enable: function() { 30098 30099 // restore title attributes 30100 this.disabledTitles.each( function() { 30101 var element = $( this ); 30102 if ( element.data( "ui-tooltip-title" ) ) { 30103 element.attr( "title", element.data( "ui-tooltip-title" ) ); 30104 } 30105 } ); 30106 this.disabledTitles = $( [] ); 30107 }, 30108 30109 open: function( event ) { 30110 var that = this, 30111 target = $( event ? event.target : this.element ) 30112 30113 // we need closest here due to mouseover bubbling, 30114 // but always pointing at the same event target 30115 .closest( this.options.items ); 30116 30117 // No element to show a tooltip for or the tooltip is already open 30118 if ( !target.length || target.data( "ui-tooltip-id" ) ) { 30119 return; 30120 } 30121 30122 if ( target.attr( "title" ) ) { 30123 target.data( "ui-tooltip-title", target.attr( "title" ) ); 30124 } 30125 30126 target.data( "ui-tooltip-open", true ); 30127 30128 // Kill parent tooltips, custom or native, for hover 30129 if ( event && event.type === "mouseover" ) { 30130 target.parents().each( function() { 30131 var parent = $( this ), 30132 blurEvent; 30133 if ( parent.data( "ui-tooltip-open" ) ) { 30134 blurEvent = $.Event( "blur" ); 30135 blurEvent.target = blurEvent.currentTarget = this; 30136 that.close( blurEvent, true ); 30137 } 30138 if ( parent.attr( "title" ) ) { 30139 parent.uniqueId(); 30140 that.parents[ this.id ] = { 30141 element: this, 30142 title: parent.attr( "title" ) 30143 }; 30144 parent.attr( "title", "" ); 30145 } 30146 } ); 30147 } 30148 30149 this._registerCloseHandlers( event, target ); 30150 this._updateContent( target, event ); 30151 }, 30152 30153 _updateContent: function( target, event ) { 30154 var content, 30155 contentOption = this.options.content, 30156 that = this, 30157 eventType = event ? event.type : null; 30158 30159 if ( typeof contentOption === "string" || contentOption.nodeType || 30160 contentOption.jquery ) { 30161 return this._open( event, target, contentOption ); 30162 } 30163 30164 content = contentOption.call( target[ 0 ], function( response ) { 30165 30166 // IE may instantly serve a cached response for ajax requests 30167 // delay this call to _open so the other call to _open runs first 30168 that._delay( function() { 30169 30170 // Ignore async response if tooltip was closed already 30171 if ( !target.data( "ui-tooltip-open" ) ) { 30172 return; 30173 } 30174 30175 // JQuery creates a special event for focusin when it doesn't 30176 // exist natively. To improve performance, the native event 30177 // object is reused and the type is changed. Therefore, we can't 30178 // rely on the type being correct after the event finished 30179 // bubbling, so we set it back to the previous value. (#8740) 30180 if ( event ) { 30181 event.type = eventType; 30182 } 30183 this._open( event, target, response ); 30184 } ); 30185 } ); 30186 if ( content ) { 30187 this._open( event, target, content ); 30188 } 30189 }, 30190 30191 _open: function( event, target, content ) { 30192 var tooltipData, tooltip, delayedShow, a11yContent, 30193 positionOption = $.extend( {}, this.options.position ); 30194 30195 if ( !content ) { 30196 return; 30197 } 30198 30199 // Content can be updated multiple times. If the tooltip already 30200 // exists, then just update the content and bail. 30201 tooltipData = this._find( target ); 30202 if ( tooltipData ) { 30203 tooltipData.tooltip.find( ".ui-tooltip-content" ).html( content ); 30204 return; 30205 } 30206 30207 // If we have a title, clear it to prevent the native tooltip 30208 // we have to check first to avoid defining a title if none exists 30209 // (we don't want to cause an element to start matching [title]) 30210 // 30211 // We use removeAttr only for key events, to allow IE to export the correct 30212 // accessible attributes. For mouse events, set to empty string to avoid 30213 // native tooltip showing up (happens only when removing inside mouseover). 30214 if ( target.is( "[title]" ) ) { 30215 if ( event && event.type === "mouseover" ) { 30216 target.attr( "title", "" ); 30217 } else { 30218 target.removeAttr( "title" ); 30219 } 30220 } 30221 30222 tooltipData = this._tooltip( target ); 30223 tooltip = tooltipData.tooltip; 30224 this._addDescribedBy( target, tooltip.attr( "id" ) ); 30225 tooltip.find( ".ui-tooltip-content" ).html( content ); 30226 30227 // Support: Voiceover on OS X, JAWS on IE <= 9 30228 // JAWS announces deletions even when aria-relevant="additions" 30229 // Voiceover will sometimes re-read the entire log region's contents from the beginning 30230 this.liveRegion.children().hide(); 30231 a11yContent = $( "<div>" ).html( tooltip.find( ".ui-tooltip-content" ).html() ); 30232 a11yContent.removeAttr( "name" ).find( "[name]" ).removeAttr( "name" ); 30233 a11yContent.removeAttr( "id" ).find( "[id]" ).removeAttr( "id" ); 30234 a11yContent.appendTo( this.liveRegion ); 30235 30236 function position( event ) { 30237 positionOption.of = event; 30238 if ( tooltip.is( ":hidden" ) ) { 30239 return; 30240 } 30241 tooltip.position( positionOption ); 30242 } 30243 if ( this.options.track && event && /^mouse/.test( event.type ) ) { 30244 this._on( this.document, { 30245 mousemove: position 30246 } ); 30247 30248 // trigger once to override element-relative positioning 30249 position( event ); 30250 } else { 30251 tooltip.position( $.extend( { 30252 of: target 30253 }, this.options.position ) ); 30254 } 30255 30256 tooltip.hide(); 30257 30258 this._show( tooltip, this.options.show ); 30259 30260 // Handle tracking tooltips that are shown with a delay (#8644). As soon 30261 // as the tooltip is visible, position the tooltip using the most recent 30262 // event. 30263 // Adds the check to add the timers only when both delay and track options are set (#14682) 30264 if ( this.options.track && this.options.show && this.options.show.delay ) { 30265 delayedShow = this.delayedShow = setInterval( function() { 30266 if ( tooltip.is( ":visible" ) ) { 30267 position( positionOption.of ); 30268 clearInterval( delayedShow ); 30269 } 30270 }, 13 ); 30271 } 30272 30273 this._trigger( "open", event, { tooltip: tooltip } ); 30274 }, 30275 30276 _registerCloseHandlers: function( event, target ) { 30277 var events = { 30278 keyup: function( event ) { 30279 if ( event.keyCode === $.ui.keyCode.ESCAPE ) { 30280 var fakeEvent = $.Event( event ); 30281 fakeEvent.currentTarget = target[ 0 ]; 30282 this.close( fakeEvent, true ); 30283 } 30284 } 30285 }; 30286 30287 // Only bind remove handler for delegated targets. Non-delegated 30288 // tooltips will handle this in destroy. 30289 if ( target[ 0 ] !== this.element[ 0 ] ) { 30290 events.remove = function() { 30291 var targetElement = this._find( target ); 30292 if ( targetElement ) { 30293 this._removeTooltip( targetElement.tooltip ); 30294 } 30295 }; 30296 } 30297 30298 if ( !event || event.type === "mouseover" ) { 30299 events.mouseleave = "close"; 30300 } 30301 if ( !event || event.type === "focusin" ) { 30302 events.focusout = "close"; 30303 } 30304 this._on( true, target, events ); 30305 }, 30306 30307 close: function( event ) { 30308 var tooltip, 30309 that = this, 30310 target = $( event ? event.currentTarget : this.element ), 30311 tooltipData = this._find( target ); 30312 30313 // The tooltip may already be closed 30314 if ( !tooltipData ) { 30315 30316 // We set ui-tooltip-open immediately upon open (in open()), but only set the 30317 // additional data once there's actually content to show (in _open()). So even if the 30318 // tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in 30319 // the period between open() and _open(). 30320 target.removeData( "ui-tooltip-open" ); 30321 return; 30322 } 30323 30324 tooltip = tooltipData.tooltip; 30325 30326 // Disabling closes the tooltip, so we need to track when we're closing 30327 // to avoid an infinite loop in case the tooltip becomes disabled on close 30328 if ( tooltipData.closing ) { 30329 return; 30330 } 30331 30332 // Clear the interval for delayed tracking tooltips 30333 clearInterval( this.delayedShow ); 30334 30335 // Only set title if we had one before (see comment in _open()) 30336 // If the title attribute has changed since open(), don't restore 30337 if ( target.data( "ui-tooltip-title" ) && !target.attr( "title" ) ) { 30338 target.attr( "title", target.data( "ui-tooltip-title" ) ); 30339 } 30340 30341 this._removeDescribedBy( target ); 30342 30343 tooltipData.hiding = true; 30344 tooltip.stop( true ); 30345 this._hide( tooltip, this.options.hide, function() { 30346 that._removeTooltip( $( this ) ); 30347 } ); 30348 30349 target.removeData( "ui-tooltip-open" ); 30350 this._off( target, "mouseleave focusout keyup" ); 30351 30352 // Remove 'remove' binding only on delegated targets 30353 if ( target[ 0 ] !== this.element[ 0 ] ) { 30354 this._off( target, "remove" ); 30355 } 30356 this._off( this.document, "mousemove" ); 30357 30358 if ( event && event.type === "mouseleave" ) { 30359 $.each( this.parents, function( id, parent ) { 30360 $( parent.element ).attr( "title", parent.title ); 30361 delete that.parents[ id ]; 30362 } ); 30363 } 30364 30365 tooltipData.closing = true; 30366 this._trigger( "close", event, { tooltip: tooltip } ); 30367 if ( !tooltipData.hiding ) { 30368 tooltipData.closing = false; 30369 } 30370 }, 30371 30372 _tooltip: function( element ) { 30373 var tooltip = $( "<div>" ).attr( "role", "tooltip" ), 30374 content = $( "<div>" ).appendTo( tooltip ), 30375 id = tooltip.uniqueId().attr( "id" ); 30376 30377 this._addClass( content, "ui-tooltip-content" ); 30378 this._addClass( tooltip, "ui-tooltip", "ui-widget ui-widget-content" ); 30379 30380 tooltip.appendTo( this._appendTo( element ) ); 30381 30382 return this.tooltips[ id ] = { 30383 element: element, 30384 tooltip: tooltip 30385 }; 30386 }, 30387 30388 _find: function( target ) { 30389 var id = target.data( "ui-tooltip-id" ); 30390 return id ? this.tooltips[ id ] : null; 30391 }, 30392 30393 _removeTooltip: function( tooltip ) { 30394 30395 // Clear the interval for delayed tracking tooltips 30396 clearInterval( this.delayedShow ); 30397 30398 tooltip.remove(); 30399 delete this.tooltips[ tooltip.attr( "id" ) ]; 30400 }, 30401 30402 _appendTo: function( target ) { 30403 var element = target.closest( ".ui-front, dialog" ); 30404 30405 if ( !element.length ) { 30406 element = this.document[ 0 ].body; 30407 } 30408 30409 return element; 30410 }, 30411 30412 _destroy: function() { 30413 var that = this; 30414 30415 // Close open tooltips 30416 $.each( this.tooltips, function( id, tooltipData ) { 30417 30418 // Delegate to close method to handle common cleanup 30419 var event = $.Event( "blur" ), 30420 element = tooltipData.element; 30421 event.target = event.currentTarget = element[ 0 ]; 30422 that.close( event, true ); 30423 30424 // Remove immediately; destroying an open tooltip doesn't use the 30425 // hide animation 30426 $( "#" + id ).remove(); 30427 30428 // Restore the title 30429 if ( element.data( "ui-tooltip-title" ) ) { 30430 30431 // If the title attribute has changed since open(), don't restore 30432 if ( !element.attr( "title" ) ) { 30433 element.attr( "title", element.data( "ui-tooltip-title" ) ); 30434 } 30435 element.removeData( "ui-tooltip-title" ); 30436 } 30437 } ); 30438 this.liveRegion.remove(); 30439 } 30440} ); 30441 30442// DEPRECATED 30443// TODO: Switch return back to widget declaration at top of file when this is removed 30444if ( $.uiBackCompat !== false ) { 30445 30446 // Backcompat for tooltipClass option 30447 $.widget( "ui.tooltip", $.ui.tooltip, { 30448 options: { 30449 tooltipClass: null 30450 }, 30451 _tooltip: function() { 30452 var tooltipData = this._superApply( arguments ); 30453 if ( this.options.tooltipClass ) { 30454 tooltipData.tooltip.addClass( this.options.tooltipClass ); 30455 } 30456 return tooltipData; 30457 } 30458 } ); 30459} 30460 30461var widgetsTooltip = $.ui.tooltip; 30462 30463 30464 30465 30466} );
vendor: 11,466 bytes, lines 30466-30805
30466 30467function setCustomJsonStringify () 30468{ 30469 'use strict'; 30470 30471 function f(n) 30472 { 30473 // Format integers to have at least two digits. 30474 return n < 10 ? '0' + n : n; 30475 } 30476 30477 if (typeof Date.prototype.toJSON !== 'function') 30478 { 30479 30480 Date.prototype.toJSON = function (key) 30481 { 30482 30483 return isFinite(this.valueOf()) 30484 ? this.getUTCFullYear() + '-' + 30485 f(this.getUTCMonth() + 1) + '-' + 30486 f(this.getUTCDate()) + 'T' + 30487 f(this.getUTCHours()) + ':' + 30488 f(this.getUTCMinutes()) + ':' + 30489 f(this.getUTCSeconds()) + 'Z' 30490 : null; 30491 }; 30492 30493 String.prototype.toJSON = 30494 Number.prototype.toJSON = 30495 Boolean.prototype.toJSON = function (key) 30496 { 30497 return this.valueOf(); 30498 }; 30499 } 30500 30501 var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 30502 escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, 30503 gap, 30504 indent, 30505 meta = { // table of character substitutions 30506 '\b': '\\b', 30507 '\t': '\\t', 30508 '\n': '\\n', 30509 '\f': '\\f', 30510 '\r': '\\r', 30511 '"': '\\"', 30512 '\\': '\\\\' 30513 }, 30514 rep; 30515 30516 30517 function quote(string) 30518 { 30519 30520 // If the string contains no control characters, no quote characters, and no 30521 // backslash characters, then we can safely slap some quotes around it. 30522 // Otherwise we must also replace the offending characters with safe escape 30523 // sequences. 30524 30525 escapable.lastIndex = 0; 30526 return escapable.test(string) ? '"' + string.replace(escapable, function (a) 30527 { 30528 var c = meta[a]; 30529 return typeof c === 'string' 30530 ? c 30531 : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); 30532 }) + '"' : '"' + string + '"'; 30533 } 30534 30535 30536 function str(key, holder) 30537 { 30538 30539 // Produce a string from holder[key]. 30540 30541 var i, // The loop counter. 30542 k, // The member key. 30543 v, // The member value. 30544 length, 30545 mind = gap, 30546 partial, 30547 value = holder[key]; 30548 30549 // If the value has a toJSON method, call it to obtain a replacement value. 30550 30551 if (value && typeof value === 'object' && 30552 typeof value.toJSON === 'function') 30553 { 30554 value = value.toJSON(key); 30555 } 30556 30557 // If we were called with a replacer function, then call the replacer to 30558 // obtain a replacement value. 30559 30560 if (typeof rep === 'function') 30561 { 30562 value = rep.call(holder, key, value); 30563 } 30564 30565 // What happens next depends on the value's type. 30566 30567 switch (typeof value) 30568 { 30569 case 'string': 30570 return quote(value); 30571 30572 case 'number': 30573 30574 // JSON numbers must be finite. Encode non-finite numbers as null. 30575 30576 return isFinite(value) ? String(value) : 'null'; 30577 30578 case 'boolean': 30579 case 'null': 30580 30581 // If the value is a boolean or null, convert it to a string. Note: 30582 // typeof null does not produce 'null'. The case is included here in 30583 // the remote chance that this gets fixed someday. 30584 30585 return String(value); 30586 30587 // If the type is 'object', we might be dealing with an object or an array or 30588 // null. 30589 30590 case 'object': 30591 30592 // Due to a specification blunder in ECMAScript, typeof null is 'object', 30593 // so watch out for that case. 30594 30595 if (!value) 30596 { 30597 return 'null'; 30598 } 30599 30600 // Make an array to hold the partial results of stringifying this object value. 30601 30602 gap += indent; 30603 partial = []; 30604 30605 // Is the value an array? 30606 30607 if (Object.prototype.toString.apply(value) === '[object Array]') 30608 { 30609 30610 // The value is an array. Stringify every element. Use null as a placeholder 30611 // for non-JSON values. 30612 30613 length = value.length; 30614 for (i = 0; i < length; i += 1) 30615 { 30616 partial[i] = str(i, value) || 'null'; 30617 } 30618 30619 // Join all of the elements together, separated with commas, and wrap them in 30620 // brackets. 30621 30622 v = partial.length === 0 30623 ? '[]' 30624 : gap 30625 ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' 30626 : '[' + partial.join(',') + ']'; 30627 gap = mind; 30628 return v; 30629 } 30630 30631 // If the replacer is an array, use it to select the members to be stringified. 30632 30633 if (rep && typeof rep === 'object') 30634 { 30635 length = rep.length; 30636 for (i = 0; i < length; i += 1) 30637 { 30638 if (typeof rep[i] === 'string') 30639 { 30640 k = rep[i]; 30641 v = str(k, value); 30642 if (v) 30643 { 30644 partial.push(quote(k) + (gap ? ': ' : ':') + v); 30645 } 30646 } 30647 } 30648 } else 30649 { 30650 30651 // Otherwise, iterate through all of the keys in the object. 30652 30653 for (k in value) 30654 { 30655 if (Object.prototype.hasOwnProperty.call(value, k)) 30656 { 30657 v = str(k, value); 30658 if (v) 30659 { 30660 partial.push(quote(k) + (gap ? ': ' : ':') + v); 30661 } 30662 } 30663 } 30664 } 30665 30666 // Join all of the member texts together, separated with commas, 30667 // and wrap them in braces. 30668 30669 v = partial.length === 0 30670 ? '{}' 30671 : gap 30672 ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' 30673 : '{' + partial.join(',') + '}'; 30674 gap = mind; 30675 return v; 30676 } 30677 } 30678 30679 // If the JSON object does not yet have a stringify method, give it one. 30680 30681 JSON.stringify = function (value, replacer, space) 30682 { 30683 30684 // The stringify method takes a value and an optional replacer, and an optional 30685 // space parameter, and returns a JSON text. The replacer can be a function 30686 // that can replace values, or an array of strings that will select the keys. 30687 // A default replacer method can be provided. Use of the space parameter can 30688 // produce text that is more easily readable. 30689 30690 var i; 30691 gap = ''; 30692 indent = ''; 30693 30694 // If the space parameter is a number, make an indent string containing that 30695 // many spaces. 30696 30697 if (typeof space === 'number') 30698 { 30699 for (i = 0; i < space; i += 1) 30700 { 30701 indent += ' '; 30702 } 30703 30704 // If the space parameter is a string, it will be used as the indent string. 30705 30706 } else if (typeof space === 'string') 30707 { 30708 indent = space; 30709 } 30710 30711 // If there is a replacer, it must be a function or an array. 30712 // Otherwise, throw an error. 30713 30714 rep = replacer; 30715 if (replacer && typeof replacer !== 'function' && 30716 (typeof replacer !== 'object' || 30717 typeof replacer.length !== 'number')) 30718 { 30719 throw new Error('JSON.stringify'); 30720 } 30721 30722 // Make a fake root object containing our value under the key of ''. 30723 // Return the result of stringifying the value. 30724 30725 return str('', { '': value }); 30726 }; 30727 30728 30729 // If the JSON object does not yet have a parse method, give it one. 30730 30731 JSON.parse = function (text, reviver) 30732 { 30733 30734 // The parse method takes a text and an optional reviver function, and returns 30735 // a JavaScript value if the text is a valid JSON text. 30736 30737 var j; 30738 30739 function walk(holder, key) 30740 { 30741 30742 // The walk method is used to recursively walk the resulting structure so 30743 // that modifications can be made. 30744 30745 var k, v, value = holder[key]; 30746 if (value && typeof value === 'object') 30747 { 30748 for (k in value) 30749 { 30750 if (Object.prototype.hasOwnProperty.call(value, k)) 30751 { 30752 v = walk(value, k); 30753 if (v !== undefined) 30754 { 30755 value[k] = v; 30756 } else 30757 { 30758 delete value[k]; 30759 } 30760 } 30761 } 30762 } 30763 return reviver.call(holder, key, value); 30764 } 30765 30766 30767 // Parsing happens in four stages. In the first stage, we replace certain 30768 // Unicode characters with escape sequences. JavaScript handles many characters 30769 // incorrectly, either silently deleting them, or treating them as line endings. 30770 30771 text = String(text); 30772 cx.lastIndex = 0; 30773 if (cx.test(text)) 30774 { 30775 text = text.replace(cx, function (a) 30776 { 30777 return '\\u' + 30778 ('0000' + a.charCodeAt(0).toString(16)).slice(-4); 30779 }); 30780 } 30781 30782 // In the second stage, we run the text against regular expressions that look 30783 // for non-JSON patterns. We are especially concerned with '()' and 'new' 30784 // because they can cause invocation, and '=' because it can cause mutation. 30785 // But just to be safe, we want to reject all unexpected forms. 30786 30787 // We split the second stage into 4 regexp operations in order to work around 30788 // crippling inefficiencies in IE's and Safari's regexp engines. First we 30789 // replace the JSON backslash pairs with '@' (a non-JSON character). Second, we 30790 // replace all simple value tokens with ']' characters. Third, we delete all 30791 // open brackets that follow a colon or comma or that begin the text. Finally, 30792 // we look to see that the remaining characters are only whitespace or ']' or 30793 // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. 30794 30795 if (/^[\],:{}\s]*$/ 30796 .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') 30797 .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') 30798 .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) 30799 { 30800 30801 // In the third stage we use the eval function to compile the text into a 30802 // JavaScript structure. The '{' operator is subject to a syntactic ambiguity 30803 // in JavaScript: it can begin a block or an object literal. We wrap the text 30804 // in parens to eliminate the ambiguity. 30805
30806 j = eval('(' + text + ')'); 30807 30808 // In the optional fourth stage, we recursively walk the new structure, passing 30809 // each name/value pair to a reviver function for possible transformation. 30810 30811 return typeof reviver === 'function' 30812 ? walk({ '': j }, '') 30813 : j; 30814 } 30815 30816 // If the text is not JSON parseable, then a SyntaxError is thrown. 30817 30818 throw new SyntaxError('JSON.parse'); 30819 }; 30820} 30821 30822$(function () 30823{ 30824 if (/MSIE 8.0/i.test(navigator.userAgent)) 30825 setCustomJsonStringify(); 30826}); 30827/*! DataTables 30828 * ©2008-2015 SpryMedia Ltd - datatables.net/license 30829 */ 30830 30831/** 30832 * @summary DataTables 30833 * @description Paginate, search and order HTML tables 30834 * @file jquery.dataTables.js 30835 * @author SpryMedia Ltd (www.sprymedia.co.uk) 30836 * @contact www.sprymedia.co.uk/contact 30837 * @copyright Copyright 2008-2015 SpryMedia Ltd. 30838 * 30839 * This source file is free software, available under the following license: 30840 * MIT license - http://datatables.net/license 30841 * 30842 * This source file is distributed in the hope that it will be useful, but 30843 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 30844 * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. 30845 * 30846 * For details please refer to: http://www.datatables.net 30847 */ 30848 30849/*jslint evil: true, undef: true, browser: true */ 30850/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/ 30851 30852(/** @lends <global> */function( window, document, undefined ) { 30853 30854(function( factory ) { 30855 "use strict"; 30856 30857 if ( typeof define === 'function' && define.amd ) { 30858 // Define as an AMD module if possible 30859 define( 'datatables', ['jquery'], factory ); 30860 } 30861 else if ( typeof exports === 'object' ) { 30862 // Node/CommonJS 30863 module.exports = factory( require( 'jquery' ) ); 30864 } 30865 else if ( jQuery && !jQuery.fn.dataTable ) { 30866 // Define using browser globals otherwise 30867 // Prevent multiple instantiations if the script is loaded twice 30868 factory( jQuery ); 30869 } 30870} 30871(/** @lends <global> */function( $ ) { 30872 "use strict"; 30873 30874 /** 30875 * DataTables is a plug-in for the jQuery Javascript library. It is a highly 30876 * flexible tool, based upon the foundations of progressive enhancement, 30877 * which will add advanced interaction controls to any HTML table. For a 30878 * full list of features please refer to 30879 * [DataTables.net](href="http://datatables.net). 30880 * 30881 * Note that the `DataTable` object is not a global variable but is aliased 30882 * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may 30883 * be accessed. 30884 * 30885 * @class 30886 * @param {object} [init={}] Configuration object for DataTables. Options 30887 * are defined by {@link DataTable.defaults} 30888 * @requires jQuery 1.7+ 30889 * 30890 * @example 30891 * // Basic initialisation 30892 * $(document).ready( function { 30893 * $('#example').dataTable(); 30894 * } ); 30895 * 30896 * @example 30897 * // Initialisation with configuration options - in this case, disable 30898 * // pagination and sorting. 30899 * $(document).ready( function { 30900 * $('#example').dataTable( { 30901 * "paginate": false, 30902 * "sort": false 30903 * } ); 30904 * } ); 30905 */ 30906 var DataTable; 30907 30908 30909 /*
30910 * It is useful to have variables which are scoped locally so only the 30911 * DataTables functions can access them and they don't leak into global space. 30912 * At the same time these functions are often useful over multiple files in the 30913 * core and API, so we list, or at least document, all variables which are used 30914 * by DataTables as private variables here. This also ensures that there is no 30915 * clashing of variable names and that they can easily referenced for reuse. 30916 */ 30917 30918 30919 // Defined else where 30920 // _selector_run 30921 // _selector_opts 30922 // _selector_first 30923 // _selector_row_indexes 30924 30925 var _ext; // DataTable.ext 30926 var _Api; // DataTable.Api 30927 var _api_register; // DataTable.Api.register 30928 var _api_registerPlural; // DataTable.Api.registerPlural 30929 30930 var _re_dic = {}; 30931 var _re_new_lines = /[\r\n]/g; 30932 var _re_html = /<.*?>/g; 30933 var _re_date_start = /^[\w\+\-]/; 30934 var _re_date_end = /[\w\+\-]$/; 30935 30936 // Escape regular expression special characters 30937 var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' ); 30938 30939 // http://en.wikipedia.org/wiki/Foreign_exchange_market 30940 // - \u20BD - Russian ruble. 30941 // - \u20a9 - South Korean Won 30942 // - \u20BA - Turkish Lira 30943 // - \u20B9 - Indian Rupee 30944 // - R - Brazil (R$) and South Africa 30945 // - fr - Swiss Franc 30946 // - kr - Swedish krona, Norwegian krone and Danish krone 30947 // - \u2009 is thin space and \u202F is narrow no-break space, both used in many 30948 // standards as thousands separators. 30949 var _re_formatted_numeric = /[',$£â¬Â¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi; 30950 30951 30952 var _empty = function ( d ) { 30953 return !d || d === true || d === '-' ? true : false; 30954 }; 30955 30956 30957 var _intVal = function ( s ) { 30958 var integer = parseInt( s, 10 ); 30959 return !isNaN(integer) && isFinite(s) ? integer : null; 30960 }; 30961 30962 // Convert from a formatted number with characters other than `.` as the 30963 // decimal place, to a Javascript number 30964 var _numToDecimal = function ( num, decimalPoint ) { 30965 // Cache created regular expressions for speed as this function is called often 30966 if ( ! _re_dic[ decimalPoint ] ) { 30967 _re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' ); 30968 } 30969 return typeof num === 'string' && decimalPoint !== '.' ? 30970 num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) : 30971 num; 30972 }; 30973 30974 30975 var _isNumber = function ( d, decimalPoint, formatted ) { 30976 var strType = typeof d === 'string'; 30977 30978 // If empty return immediately so there must be a number if it is a 30979 // formatted string (this stops the string "k", or "kr", etc being detected 30980 // as a formatted number for currency 30981 if ( _empty( d ) ) { 30982 return true; 30983 } 30984 30985 if ( decimalPoint && strType ) { 30986 d = _numToDecimal( d, decimalPoint ); 30987 } 30988 30989 if ( formatted && strType ) { 30990 d = d.replace( _re_formatted_numeric, '' ); 30991 } 30992 30993 return !isNaN( parseFloat(d) ) && isFinite( d ); 30994 }; 30995 30996 30997 // A string without HTML in it can be considered to be HTML still 30998 var _isHtml = function ( d ) { 30999 return _empty( d ) || typeof d === 'string'; 31000 }; 31001 31002 31003 var _htmlNumeric = function ( d, decimalPoint, formatted ) { 31004 if ( _empty( d ) ) { 31005 return true; 31006 } 31007 31008 var html = _isHtml( d ); 31009 return ! html ? 31010 null : 31011 _isNumber( _stripHtml( d ), decimalPoint, formatted ) ? 31012 true : 31013 null; 31014 }; 31015 31016 31017 var _pluck = function ( a, prop, prop2 ) { 31018 var out = []; 31019 var i=0, ien=a.length; 31020 31021 // Could have the test in the loop for slightly smaller code, but speed 31022 // is essential here 31023 if ( prop2 !== undefined ) { 31024 for ( ; i<ien ; i++ ) { 31025 if ( a[i] && a[i][ prop ] ) { 31026 out.push( a[i][ prop ][ prop2 ] ); 31027 } 31028 } 31029 } 31030 else { 31031 for ( ; i<ien ; i++ ) { 31032 if ( a[i] ) { 31033 out.push( a[i][ prop ] ); 31034 } 31035 } 31036 } 31037 31038 return out; 31039 }; 31040 31041 31042 // Basically the same as _pluck, but rather than looping over `a` we use `order` 31043 // as the indexes to pick from `a` 31044 var _pluck_order = function ( a, order, prop, prop2 ) 31045 { 31046 var out = []; 31047 var i=0, ien=order.length; 31048 31049 // Could have the test in the loop for slightly smaller code, but speed 31050 // is essential here 31051 if ( prop2 !== undefined ) { 31052 for ( ; i<ien ; i++ ) { 31053 if ( a[ order[i] ][ prop ] ) { 31054 out.push( a[ order[i] ][ prop ][ prop2 ] ); 31055 } 31056 } 31057 } 31058 else { 31059 for ( ; i<ien ; i++ ) { 31060 out.push( a[ order[i] ][ prop ] ); 31061 } 31062 } 31063 31064 return out; 31065 }; 31066 31067 31068 var _range = function ( len, start ) 31069 { 31070 var out = []; 31071 var end; 31072 31073 if ( start === undefined ) { 31074 start = 0; 31075 end = len; 31076 } 31077 else { 31078 end = start; 31079 start = len; 31080 } 31081 31082 for ( var i=start ; i<end ; i++ ) { 31083 out.push( i ); 31084 } 31085 31086 return out; 31087 }; 31088 31089 31090 var _removeEmpty = function ( a ) 31091 { 31092 var out = []; 31093 31094 for ( var i=0, ien=a.length ; i<ien ; i++ ) { 31095 if ( a[i] ) { // careful - will remove all falsy values! 31096 out.push( a[i] ); 31097 } 31098 } 31099 31100 return out; 31101 }; 31102 31103 31104 var _stripHtml = function ( d ) { 31105 return d.replace( _re_html, '' ); 31106 }; 31107 31108 31109 /** 31110 * Find the unique elements in a source array. 31111 * 31112 * @param {array} src Source array 31113 * @return {array} Array of unique items 31114 * @ignore 31115 */ 31116 var _unique = function ( src ) 31117 {
31118 // A faster unique method is to use object keys to identify used values, 31119 // but this doesn't work with arrays or objects, which we must also 31120 // consider. See jsperf.com/compare-array-unique-versions/4 for more 31121 // information. 31122 var 31123 out = [], 31124 val, 31125 i, ien=src.length, 31126 j, k=0; 31127 31128 again: for ( i=0 ; i<ien ; i++ ) { 31129 val = src[i]; 31130 31131 for ( j=0 ; j<k ; j++ ) { 31132 if ( out[j] === val ) { 31133 continue again; 31134 } 31135 } 31136 31137 out.push( val ); 31138 k++; 31139 } 31140 31141 return out; 31142 }; 31143 31144 31145 31146 /** 31147 * Create a mapping object that allows camel case parameters to be looked up 31148 * for their Hungarian counterparts. The mapping is stored in a private 31149 * parameter called `_hungarianMap` which can be accessed on the source object. 31150 * @param {object} o 31151 * @memberof DataTable#oApi 31152 */ 31153 function _fnHungarianMap ( o ) 31154 { 31155 var 31156 hungarian = 'a aa ai ao as b fn i m o s ', 31157 match, 31158 newKey, 31159 map = {}; 31160 31161 $.each( o, function (key, val) { 31162 match = key.match(/^([^A-Z]+?)([A-Z])/); 31163 31164 if ( match && hungarian.indexOf(match[1]+' ') !== -1 ) 31165 { 31166 newKey = key.replace( match[0], match[2].toLowerCase() ); 31167 map[ newKey ] = key; 31168 31169 if ( match[1] === 'o' ) 31170 { 31171 _fnHungarianMap( o[key] ); 31172 } 31173 } 31174 } ); 31175 31176 o._hungarianMap = map; 31177 } 31178 31179 31180 /** 31181 * Convert from camel case parameters to Hungarian, based on a Hungarian map 31182 * created by _fnHungarianMap. 31183 * @param {object} src The model object which holds all parameters that can be 31184 * mapped. 31185 * @param {object} user The object to convert from camel case to Hungarian. 31186 * @param {boolean} force When set to `true`, properties which already have a 31187 * Hungarian value in the `user` object will be overwritten. Otherwise they 31188 * won't be. 31189 * @memberof DataTable#oApi 31190 */ 31191 function _fnCamelToHungarian ( src, user, force ) 31192 { 31193 if ( ! src._hungarianMap ) { 31194 _fnHungarianMap( src ); 31195 } 31196 31197 var hungarianKey; 31198 31199 $.each( user, function (key, val) { 31200 hungarianKey = src._hungarianMap[ key ]; 31201 31202 if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) ) 31203 { 31204 // For objects, we need to buzz down into the object to copy parameters 31205 if ( hungarianKey.charAt(0) === 'o' ) 31206 { 31207 // Copy the camelCase options over to the hungarian 31208 if ( ! user[ hungarianKey ] ) { 31209 user[ hungarianKey ] = {}; 31210 } 31211 $.extend( true, user[hungarianKey], user[key] ); 31212 31213 _fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force ); 31214 } 31215 else { 31216 user[hungarianKey] = user[ key ]; 31217 } 31218 } 31219 } ); 31220 } 31221 31222 31223 /** 31224 * Language compatibility - when certain options are given, and others aren't, we 31225 * need to duplicate the values over, in order to provide backwards compatibility 31226 * with older language files. 31227 * @param {object} oSettings dataTables settings object 31228 * @memberof DataTable#oApi 31229 */ 31230 function _fnLanguageCompat( lang ) 31231 { 31232 var defaults = DataTable.defaults.oLanguage; 31233 var zeroRecords = lang.sZeroRecords; 31234 31235 /* Backwards compatibility - if there is no sEmptyTable given, then use the same as 31236 * sZeroRecords - assuming that is given. 31237 */ 31238 if ( ! lang.sEmptyTable && zeroRecords && 31239 defaults.sEmptyTable === "No data available in table" ) 31240 { 31241 _fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' ); 31242 } 31243 31244 /* Likewise with loading records */ 31245 if ( ! lang.sLoadingRecords && zeroRecords && 31246 defaults.sLoadingRecords === "Loading..." ) 31247 { 31248 _fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' ); 31249 } 31250 31251 // Old parameter name of the thousands separator mapped onto the new 31252 if ( lang.sInfoThousands ) { 31253 lang.sThousands = lang.sInfoThousands; 31254 } 31255 31256 var decimal = lang.sDecimal; 31257 if ( decimal ) { 31258 _addNumericSort( decimal ); 31259 } 31260 } 31261 31262 31263 /** 31264 * Map one parameter onto another 31265 * @param {object} o Object to map 31266 * @param {*} knew The new parameter name 31267 * @param {*} old The old parameter name 31268 */ 31269 var _fnCompatMap = function ( o, knew, old ) { 31270 if ( o[ knew ] !== undefined ) { 31271 o[ old ] = o[ knew ]; 31272 } 31273 }; 31274 31275 31276 /** 31277 * Provide backwards compatibility for the main DT options. Note that the new 31278 * options are mapped onto the old parameters, so this is an external interface 31279 * change only. 31280 * @param {object} init Object to map 31281 */ 31282 function _fnCompatOpts ( init ) 31283 { 31284 _fnCompatMap( init, 'ordering', 'bSort' ); 31285 _fnCompatMap( init, 'orderMulti', 'bSortMulti' ); 31286 _fnCompatMap( init, 'orderClasses', 'bSortClasses' ); 31287 _fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' ); 31288 _fnCompatMap( init, 'order', 'aaSorting' ); 31289 _fnCompatMap( init, 'orderFixed', 'aaSortingFixed' ); 31290 _fnCompatMap( init, 'paging', 'bPaginate' ); 31291 _fnCompatMap( init, 'pagingType', 'sPaginationType' ); 31292 _fnCompatMap( init, 'pageLength', 'iDisplayLength' ); 31293 _fnCompatMap( init, 'searching', 'bFilter' ); 31294 31295 // Boolean initialisation of x-scrolling 31296 if ( typeof init.sScrollX === 'boolean' ) { 31297 init.sScrollX = init.sScrollX ? '100%' : ''; 31298 } 31299 31300 // Column search objects are in an array, so it needs to be converted 31301 // element by element 31302 var searchCols = init.aoSearchCols; 31303 31304 if ( searchCols ) { 31305 for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) { 31306 if ( searchCols[i] ) { 31307 _fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] ); 31308 } 31309 } 31310 } 31311 } 31312 31313 31314 /** 31315 * Provide backwards compatibility for column options. Note that the new options 31316 * are mapped onto the old parameters, so this is an external interface change 31317 * only. 31318 * @param {object} init Object to map 31319 */ 31320 function _fnCompatCols ( init ) 31321 { 31322 _fnCompatMap( init, 'orderable', 'bSortable' ); 31323 _fnCompatMap( init, 'orderData', 'aDataSort' ); 31324 _fnCompatMap( init, 'orderSequence', 'asSorting' ); 31325 _fnCompatMap( init, 'orderDataType', 'sortDataType' ); 31326 31327 // orderData can be given as an integer 31328 var dataSort = init.aDataSort; 31329 if ( dataSort && ! $.isArray( dataSort ) ) { 31330 init.aDataSort = [ dataSort ]; 31331 } 31332 } 31333 31334 31335 /** 31336 * Browser feature detection for capabilities, quirks 31337 * @param {object} settings dataTables settings object 31338 * @memberof DataTable#oApi 31339 */ 31340 function _fnBrowserDetect( settings ) 31341 { 31342 // We don't need to do this every time DataTables is constructed, the values 31343 // calculated are specific to the browser and OS configuration which we 31344 // don't expect to change between initialisations 31345 if ( ! DataTable.__browser ) { 31346 var browser = {}; 31347 DataTable.__browser = browser; 31348 31349 // Scrolling feature / quirks detection 31350 var n = $('<div/>') 31351 .css( { 31352 position: 'fixed', 31353 top: 0, 31354 left: 0, 31355 height: 1, 31356 width: 1, 31357 overflow: 'hidden' 31358 } ) 31359 .append( 31360 $('<div/>') 31361 .css( { 31362 position: 'absolute', 31363 top: 1, 31364 left: 1, 31365 width: 100, 31366 overflow: 'scroll' 31367 } ) 31368 .append( 31369 $('<div/>') 31370 .css( { 31371 width: '100%', 31372 height: 10 31373 } ) 31374 ) 31375 ) 31376 .appendTo( 'body' ); 31377 31378 var outer = n.children(); 31379 var inner = outer.children(); 31380 31381 // Numbers below, in order, are: 31382 // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth 31383 // 31384 // IE6 XP: 100 100 100 83 31385 // IE7 Vista: 100 100 100 83 31386 // IE 8+ Windows: 83 83 100 83 31387 // Evergreen Windows: 83 83 100 83 31388 // Evergreen Mac with scrollbars: 85 85 100 85 31389 // Evergreen Mac without scrollbars: 100 100 100 100 31390 31391 // Get scrollbar width 31392 browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth; 31393 31394 // IE6/7 will oversize a width 100% element inside a scrolling element, to 31395 // include the width of the scrollbar, while other browsers ensure the inner 31396 // element is contained without forcing scrolling 31397 //console.log( inner.offsetWidth ); 31398 browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100; 31399 31400 // In rtl text layout, some browsers (most, but not all) will place the 31401 // scrollbar on the left, rather than the right. 31402 browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1; 31403 31404 // IE8- don't provide height and width for getBoundingClientRect 31405 browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
31406 31407 n.remove(); 31408 } 31409 31410 $.extend( settings.oBrowser, DataTable.__browser ); 31411 settings.oScroll.iBarWidth = DataTable.__browser.barWidth; 31412 } 31413 31414 31415 /** 31416 * Array.prototype reduce[Right] method, used for browsers which don't support 31417 * JS 1.6. Done this way to reduce code size, since we iterate either way 31418 * @param {object} settings dataTables settings object 31419 * @memberof DataTable#oApi 31420 */ 31421 function _fnReduce ( that, fn, init, start, end, inc ) 31422 { 31423 var 31424 i = start, 31425 value, 31426 isSet = false; 31427 31428 if ( init !== undefined ) { 31429 value = init; 31430 isSet = true; 31431 } 31432 31433 while ( i !== end ) { 31434 if ( ! that.hasOwnProperty(i) ) { 31435 continue; 31436 } 31437 31438 value = isSet ? 31439 fn( value, that[i], i, that ) : 31440 that[i]; 31441 31442 isSet = true; 31443 i += inc; 31444 } 31445 31446 return value; 31447 } 31448 31449 /** 31450 * Add a column to the list used for the table with default values 31451 * @param {object} oSettings dataTables settings object 31452 * @param {node} nTh The th element for this column 31453 * @memberof DataTable#oApi 31454 */ 31455 function _fnAddColumn( oSettings, nTh ) 31456 { 31457 // Add column to aoColumns array 31458 var oDefaults = DataTable.defaults.column; 31459 var iCol = oSettings.aoColumns.length; 31460 var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, { 31461 "nTh": nTh ? nTh : document.createElement('th'), 31462 "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '', 31463 "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol], 31464 "mData": oDefaults.mData ? oDefaults.mData : iCol, 31465 idx: iCol 31466 } ); 31467 oSettings.aoColumns.push( oCol ); 31468 31469 // Add search object for column specific search. Note that the `searchCols[ iCol ]` 31470 // passed into extend can be undefined. This allows the user to give a default 31471 // with only some of the parameters defined, and also not give a default 31472 var searchCols = oSettings.aoPreSearchCols; 31473 searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] ); 31474 31475 // Use the default column options function to initialise classes etc 31476 _fnColumnOptions( oSettings, iCol, $(nTh).data() ); 31477 } 31478 31479 31480 /** 31481 * Apply options for a column 31482 * @param {object} oSettings dataTables settings object 31483 * @param {int} iCol column index to consider 31484 * @param {object} oOptions object with sType, bVisible and bSearchable etc 31485 * @memberof DataTable#oApi 31486 */ 31487 function _fnColumnOptions( oSettings, iCol, oOptions ) 31488 { 31489 var oCol = oSettings.aoColumns[ iCol ]; 31490 var oClasses = oSettings.oClasses; 31491 var th = $(oCol.nTh); 31492 31493 // Try to get width information from the DOM. We can't get it from CSS 31494 // as we'd need to parse the CSS stylesheet. `width` option can override 31495 if ( ! oCol.sWidthOrig ) { 31496 // Width attribute 31497 oCol.sWidthOrig = th.attr('width') || null; 31498 31499 // Style attribute 31500 var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/); 31501 if ( t ) { 31502 oCol.sWidthOrig = t[1]; 31503 } 31504 } 31505 31506 /* User specified column options */ 31507 if ( oOptions !== undefined && oOptions !== null ) 31508 { 31509 // Backwards compatibility 31510 _fnCompatCols( oOptions ); 31511 31512 // Map camel case parameters to their Hungarian counterparts 31513 _fnCamelToHungarian( DataTable.defaults.column, oOptions ); 31514 31515 /* Backwards compatibility for mDataProp */ 31516 if ( oOptions.mDataProp !== undefined && !oOptions.mData ) 31517 { 31518 oOptions.mData = oOptions.mDataProp; 31519 } 31520 31521 if ( oOptions.sType ) 31522 { 31523 oCol._sManualType = oOptions.sType; 31524 } 31525 31526 // `class` is a reserved word in Javascript, so we need to provide 31527 // the ability to use a valid name for the camel case input 31528 if ( oOptions.className && ! oOptions.sClass ) 31529 { 31530 oOptions.sClass = oOptions.className; 31531 } 31532 31533 $.extend( oCol, oOptions ); 31534 _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" ); 31535 31536 /* iDataSort to be applied (backwards compatibility), but aDataSort will take 31537 * priority if defined 31538 */ 31539 if ( oOptions.iDataSort !== undefined ) 31540 { 31541 oCol.aDataSort = [ oOptions.iDataSort ]; 31542 } 31543 _fnMap( oCol, oOptions, "aDataSort" ); 31544 } 31545 31546 /* Cache the data get and set functions for speed */ 31547 var mDataSrc = oCol.mData; 31548 var mData = _fnGetObjectDataFn( mDataSrc ); 31549 var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null; 31550 31551 var attrTest = function( src ) { 31552 return typeof src === 'string' && src.indexOf('@') !== -1; 31553 }; 31554 oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && ( 31555 attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter) 31556 ); 31557 31558 oCol.fnGetData = function (rowData, type, meta) { 31559 var innerData = mData( rowData, type, undefined, meta ); 31560
31561 return mRender && type ? 31562 mRender( innerData, type, rowData, meta ) : 31563 innerData; 31564 }; 31565 oCol.fnSetData = function ( rowData, val, meta ) { 31566 return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta ); 31567 }; 31568 31569 // Indicate if DataTables should read DOM data as an object or array 31570 // Used in _fnGetRowElements 31571 if ( typeof mDataSrc !== 'number' ) { 31572 oSettings._rowReadObject = true; 31573 } 31574 31575 /* Feature sorting overrides column specific when off */ 31576 if ( !oSettings.oFeatures.bSort ) 31577 { 31578 oCol.bSortable = false; 31579 th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called 31580 } 31581 31582 /* Check that the class assignment is correct for sorting */ 31583 var bAsc = $.inArray('asc', oCol.asSorting) !== -1; 31584 var bDesc = $.inArray('desc', oCol.asSorting) !== -1; 31585 if ( !oCol.bSortable || (!bAsc && !bDesc) ) 31586 { 31587 oCol.sSortingClass = oClasses.sSortableNone; 31588 oCol.sSortingClassJUI = ""; 31589 } 31590 else if ( bAsc && !bDesc ) 31591 { 31592 oCol.sSortingClass = oClasses.sSortableAsc; 31593 oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed; 31594 } 31595 else if ( !bAsc && bDesc ) 31596 { 31597 oCol.sSortingClass = oClasses.sSortableDesc; 31598 oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed; 31599 } 31600 else 31601 { 31602 oCol.sSortingClass = oClasses.sSortable; 31603 oCol.sSortingClassJUI = oClasses.sSortJUI; 31604 } 31605 } 31606 31607 31608 /** 31609 * Adjust the table column widths for new data. Note: you would probably want to 31610 * do a redraw after calling this function! 31611 * @param {object} settings dataTables settings object 31612 * @memberof DataTable#oApi 31613 */ 31614 function _fnAdjustColumnSizing ( settings ) 31615 { 31616 /* Not interested in doing column width calculation if auto-width is disabled */ 31617 if ( settings.oFeatures.bAutoWidth !== false ) 31618 { 31619 var columns = settings.aoColumns; 31620 31621 _fnCalculateColumnWidths( settings ); 31622 for ( var i=0 , iLen=columns.length ; i<iLen ; i++ ) 31623 { 31624 columns[i].nTh.style.width = columns[i].sWidth; 31625 } 31626 } 31627 31628 var scroll = settings.oScroll; 31629 if ( scroll.sY !== '' || scroll.sX !== '') 31630 { 31631 _fnScrollDraw( settings ); 31632 } 31633 31634 _fnCallbackFire( settings, null, 'column-sizing', [settings] ); 31635 } 31636 31637 31638 /** 31639 * Covert the index of a visible column to the index in the data array (take account 31640 * of hidden columns) 31641 * @param {object} oSettings dataTables settings object 31642 * @param {int} iMatch Visible column index to lookup 31643 * @returns {int} i the data index 31644 * @memberof DataTable#oApi 31645 */ 31646 function _fnVisibleToColumnIndex( oSettings, iMatch ) 31647 { 31648 var aiVis = _fnGetColumns( oSettings, 'bVisible' ); 31649 31650 return typeof aiVis[iMatch] === 'number' ? 31651 aiVis[iMatch] : 31652 null; 31653 } 31654 31655 31656 /** 31657 * Covert the index of an index in the data array and convert it to the visible 31658 * column index (take account of hidden columns) 31659 * @param {int} iMatch Column index to lookup 31660 * @param {object} oSettings dataTables settings object 31661 * @returns {int} i the data index 31662 * @memberof DataTable#oApi 31663 */ 31664 function _fnColumnIndexToVisible( oSettings, iMatch ) 31665 { 31666 var aiVis = _fnGetColumns( oSettings, 'bVisible' ); 31667 var iPos = $.inArray( iMatch, aiVis ); 31668 31669 return iPos !== -1 ? iPos : null; 31670 } 31671 31672 31673 /** 31674 * Get the number of visible columns 31675 * @param {object} oSettings dataTables settings object 31676 * @returns {int} i the number of visible columns 31677 * @memberof DataTable#oApi 31678 */ 31679 function _fnVisbleColumns( oSettings ) 31680 { 31681 return _fnGetColumns( oSettings, 'bVisible' ).length; 31682 } 31683 31684 31685 /** 31686 * Get an array of column indexes that match a given property 31687 * @param {object} oSettings dataTables settings object 31688 * @param {string} sParam Parameter in aoColumns to look for - typically 31689 * bVisible or bSearchable 31690 * @returns {array} Array of indexes with matched properties 31691 * @memberof DataTable#oApi 31692 */ 31693 function _fnGetColumns( oSettings, sParam ) 31694 { 31695 var a = []; 31696 31697 $.map( oSettings.aoColumns, function(val, i) { 31698 if ( val[sParam] ) { 31699 a.push( i ); 31700 } 31701 } ); 31702 31703 return a; 31704 } 31705 31706 31707 /** 31708 * Calculate the 'type' of a column 31709 * @param {object} settings dataTables settings object 31710 * @memberof DataTable#oApi 31711 */ 31712 function _fnColumnTypes ( settings ) 31713 { 31714 var columns = settings.aoColumns; 31715 var data = settings.aoData; 31716 var types = DataTable.ext.type.detect; 31717 var i, ien, j, jen, k, ken; 31718 var col, cell, detectedType, cache; 31719 31720 // For each column, spin over the 31721 for ( i=0, ien=columns.length ; i<ien ; i++ ) { 31722 col = columns[i]; 31723 cache = []; 31724 31725 if ( ! col.sType && col._sManualType ) {
31726 col.sType = col._sManualType; 31727 } 31728 else if ( ! col.sType ) { 31729 for ( j=0, jen=types.length ; j<jen ; j++ ) { 31730 for ( k=0, ken=data.length ; k<ken ; k++ ) { 31731 // Use a cache array so we only need to get the type data 31732 // from the formatter once (when using multiple detectors) 31733 if ( cache[k] === undefined ) { 31734 cache[k] = _fnGetCellData( settings, k, i, 'type' ); 31735 } 31736 31737 detectedType = types[j]( cache[k], settings ); 31738 31739 // If null, then this type can't apply to this column, so 31740 // rather than testing all cells, break out. There is an 31741 // exception for the last type which is `html`. We need to 31742 // scan all rows since it is possible to mix string and HTML 31743 // types 31744 if ( ! detectedType && j !== types.length-1 ) { 31745 break; 31746 } 31747 31748 // Only a single match is needed for html type since it is 31749 // bottom of the pile and very similar to string 31750 if ( detectedType === 'html' ) { 31751 break; 31752 } 31753 } 31754 31755 // Type is valid for all data points in the column - use this 31756 // type 31757 if ( detectedType ) { 31758 col.sType = detectedType; 31759 break; 31760 } 31761 } 31762 31763 // Fall back - if no type was detected, always use string 31764 if ( ! col.sType ) { 31765 col.sType = 'string'; 31766 } 31767 } 31768 } 31769 } 31770 31771 31772 /** 31773 * Take the column definitions and static columns arrays and calculate how 31774 * they relate to column indexes. The callback function will then apply the 31775 * definition found for a column to a suitable configuration object. 31776 * @param {object} oSettings dataTables settings object 31777 * @param {array} aoColDefs The aoColumnDefs array that is to be applied 31778 * @param {array} aoCols The aoColumns array that defines columns individually 31779 * @param {function} fn Callback function - takes two parameters, the calculated 31780 * column index and the definition for that column. 31781 * @memberof DataTable#oApi 31782 */ 31783 function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn ) 31784 { 31785 var i, iLen, j, jLen, k, kLen, def; 31786 var columns = oSettings.aoColumns; 31787 31788 // Column definitions with aTargets 31789 if ( aoColDefs ) 31790 { 31791 /* Loop over the definitions array - loop in reverse so first instance has priority */ 31792 for ( i=aoColDefs.length-1 ; i>=0 ; i-- ) 31793 { 31794 def = aoColDefs[i]; 31795 31796 /* Each definition can target multiple columns, as it is an array */ 31797 var aTargets = def.targets !== undefined ? 31798 def.targets : 31799 def.aTargets; 31800 31801 if ( ! $.isArray( aTargets ) ) 31802 { 31803 aTargets = [ aTargets ]; 31804 } 31805 31806 for ( j=0, jLen=aTargets.length ; j<jLen ; j++ ) 31807 { 31808 if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 ) 31809 { 31810 /* Add columns that we don't yet know about */ 31811 while( columns.length <= aTargets[j] ) 31812 { 31813 _fnAddColumn( oSettings ); 31814 } 31815 31816 /* Integer, basic index */ 31817 fn( aTargets[j], def ); 31818 } 31819 else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 ) 31820 { 31821 /* Negative integer, right to left column counting */ 31822 fn( columns.length+aTargets[j], def ); 31823 } 31824 else if ( typeof aTargets[j] === 'string' ) 31825 { 31826 /* Class name matching on TH element */ 31827 for ( k=0, kLen=columns.length ; k<kLen ; k++ ) 31828 { 31829 if ( aTargets[j] == "_all" || 31830 $(columns[k].nTh).hasClass( aTargets[j] ) ) 31831 { 31832 fn( k, def ); 31833 } 31834 } 31835 } 31836 } 31837 } 31838 } 31839 31840 // Statically defined columns array 31841 if ( aoCols ) 31842 { 31843 for ( i=0, iLen=aoCols.length ; i<iLen ; i++ ) 31844 { 31845 fn( i, aoCols[i] ); 31846 } 31847 } 31848 } 31849 31850 /** 31851 * Add a data array to the table, creating DOM node etc. This is the parallel to 31852 * _fnGatherData, but for adding rows from a Javascript source, rather than a 31853 * DOM source. 31854 * @param {object} oSettings dataTables settings object 31855 * @param {array} aData data array to be added 31856 * @param {node} [nTr] TR element to add to the table - optional. If not given, 31857 * DataTables will create a row automatically 31858 * @param {array} [anTds] Array of TD|TH elements for the row - must be given 31859 * if nTr is. 31860 * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed 31861 * @memberof DataTable#oApi 31862 */ 31863 function _fnAddData ( oSettings, aDataIn, nTr, anTds ) 31864 { 31865 /* Create the object for storing information about this new row */ 31866 var iRow = oSettings.aoData.length; 31867 var oData = $.extend( true, {}, DataTable.models.oRow, { 31868 src: nTr ? 'dom' : 'data', 31869 idx: iRow 31870 } ); 31871 31872 oData._aData = aDataIn; 31873 oSettings.aoData.push( oData ); 31874 31875 /* Create the cells */ 31876 var nTd, sThisType; 31877 var columns = oSettings.aoColumns; 31878 31879 // Invalidate the column types as the new data needs to be revalidated 31880 for ( var i=0, iLen=columns.length ; i<iLen ; i++ ) 31881 {
31882 columns[i].sType = null; 31883 } 31884 31885 /* Add to the display array */ 31886 oSettings.aiDisplayMaster.push( iRow ); 31887 31888 var id = oSettings.rowIdFn( aDataIn ); 31889 if ( id !== undefined ) { 31890 oSettings.aIds[ id ] = oData; 31891 } 31892 31893 /* Create the DOM information, or register it if already present */ 31894 if ( nTr || ! oSettings.oFeatures.bDeferRender ) 31895 { 31896 _fnCreateTr( oSettings, iRow, nTr, anTds ); 31897 } 31898 31899 return iRow; 31900 } 31901 31902 31903 /** 31904 * Add one or more TR elements to the table. Generally we'd expect to 31905 * use this for reading data from a DOM sourced table, but it could be 31906 * used for an TR element. Note that if a TR is given, it is used (i.e. 31907 * it is not cloned). 31908 * @param {object} settings dataTables settings object 31909 * @param {array|node|jQuery} trs The TR element(s) to add to the table 31910 * @returns {array} Array of indexes for the added rows 31911 * @memberof DataTable#oApi 31912 */ 31913 function _fnAddTr( settings, trs ) 31914 { 31915 var row; 31916 31917 // Allow an individual node to be passed in 31918 if ( ! (trs instanceof $) ) { 31919 trs = $(trs); 31920 } 31921 31922 return trs.map( function (i, el) { 31923 row = _fnGetRowElements( settings, el ); 31924 return _fnAddData( settings, row.data, el, row.cells ); 31925 } ); 31926 } 31927 31928 31929 /** 31930 * Take a TR element and convert it to an index in aoData 31931 * @param {object} oSettings dataTables settings object 31932 * @param {node} n the TR element to find 31933 * @returns {int} index if the node is found, null if not 31934 * @memberof DataTable#oApi 31935 */ 31936 function _fnNodeToDataIndex( oSettings, n ) 31937 { 31938 return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null; 31939 } 31940 31941 31942 /** 31943 * Take a TD element and convert it into a column data index (not the visible index) 31944 * @param {object} oSettings dataTables settings object 31945 * @param {int} iRow The row number the TD/TH can be found in 31946 * @param {node} n The TD/TH element to find 31947 * @returns {int} index if the node is found, -1 if not 31948 * @memberof DataTable#oApi 31949 */ 31950 function _fnNodeToColumnIndex( oSettings, iRow, n ) 31951 { 31952 return $.inArray( n, oSettings.aoData[ iRow ].anCells ); 31953 } 31954 31955 31956 /** 31957 * Get the data for a given cell from the internal cache, taking into account data mapping 31958 * @param {object} settings dataTables settings object 31959 * @param {int} rowIdx aoData row id 31960 * @param {int} colIdx Column index 31961 * @param {string} type data get type ('display', 'type' 'filter' 'sort') 31962 * @returns {*} Cell data 31963 * @memberof DataTable#oApi 31964 */ 31965 function _fnGetCellData( settings, rowIdx, colIdx, type ) 31966 { 31967 var draw = settings.iDraw; 31968 var col = settings.aoColumns[colIdx]; 31969 var rowData = settings.aoData[rowIdx]._aData; 31970 var defaultContent = col.sDefaultContent; 31971 var cellData = col.fnGetData( rowData, type, { 31972 settings: settings, 31973 row: rowIdx, 31974 col: colIdx 31975 } ); 31976 31977 if ( cellData === undefined ) { 31978 if ( settings.iDrawError != draw && defaultContent === null ) { 31979 _fnLog( settings, 0, "Requested unknown parameter "+ 31980 (typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+ 31981 " for row "+rowIdx, 4 ); 31982 settings.iDrawError = draw; 31983 } 31984 return defaultContent; 31985 } 31986 31987 /* When the data source is null, we can use default column data */ 31988 if ( (cellData === rowData || cellData === null) && defaultContent !== null ) { 31989 cellData = defaultContent; 31990 } 31991 else if ( typeof cellData === 'function' ) { 31992 // If the data source is a function, then we run it and use the return, 31993 // executing in the scope of the data object (for instances) 31994 return cellData.call( rowData ); 31995 } 31996 31997 if ( cellData === null && type == 'display' ) { 31998 return ''; 31999 } 32000 return cellData; 32001 } 32002 32003 32004 /** 32005 * Set the value for a specific cell, into the internal data cache 32006 * @param {object} settings dataTables settings object 32007 * @param {int} rowIdx aoData row id 32008 * @param {int} colIdx Column index 32009 * @param {*} val Value to set 32010 * @memberof DataTable#oApi 32011 */ 32012 function _fnSetCellData( settings, rowIdx, colIdx, val ) 32013 { 32014 var col = settings.aoColumns[colIdx]; 32015 var rowData = settings.aoData[rowIdx]._aData; 32016 32017 col.fnSetData( rowData, val, { 32018 settings: settings, 32019 row: rowIdx, 32020 col: colIdx 32021 } ); 32022 } 32023 32024 32025 // Private variable that is used to match action syntax in the data property object 32026 var __reArray = /\[.*?\]$/; 32027 var __reFn = /\(\)$/; 32028 32029 /** 32030 * Split string on periods, taking into account escaped periods 32031 * @param {string} str String to split 32032 * @return {array} Split string 32033 */ 32034 function _fnSplitObjNotation( str ) 32035 { 32036 return $.map( str.match(/(\\.|[^\.])+/g) || [''], function ( s ) { 32037 return s.replace(/\\./g, '.'); 32038 } ); 32039 } 32040 32041 32042 /** 32043 * Return a function that can be used to get data from a source object, taking 32044 * into account the ability to use nested objects as a source 32045 * @param {string|int|function} mSource The data source for the object 32046 * @returns {function} Data get function 32047 * @memberof DataTable#oApi 32048 */ 32049 function _fnGetObjectDataFn( mSource ) 32050 { 32051 if ( $.isPlainObject( mSource ) ) 32052 { 32053 /* Build an object of get functions, and wrap them in a single call */ 32054 var o = {}; 32055 $.each( mSource, function (key, val) { 32056 if ( val ) { 32057 o[key] = _fnGetObjectDataFn( val ); 32058 } 32059 } ); 32060 32061 return function (data, type, row, meta) { 32062 var t = o[type] || o._; 32063 return t !== undefined ? 32064 t(data, type, row, meta) : 32065 data; 32066 }; 32067 } 32068 else if ( mSource === null ) 32069 { 32070 /* Give an empty string for rendering / sorting etc */ 32071 return function (data) { // type, row and meta also passed, but not used 32072 return data; 32073 }; 32074 } 32075 else if ( typeof mSource === 'function' ) 32076 { 32077 return function (data, type, row, meta) { 32078 return mSource( data, type, row, meta ); 32079 }; 32080 } 32081 else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || 32082 mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) ) 32083 { 32084 /* If there is a . in the source string then the data source is in a 32085 * nested object so we loop over the data for each level to get the next 32086 * level down. On each loop we test for undefined, and if found immediately 32087 * return. This allows entire objects to be missing and sDefaultContent to 32088 * be used if defined, rather than throwing an error 32089 */
32090 var fetchData = function (data, type, src) { 32091 var arrayNotation, funcNotation, out, innerSrc; 32092 32093 if ( src !== "" ) 32094 { 32095 var a = _fnSplitObjNotation( src ); 32096 32097 for ( var i=0, iLen=a.length ; i<iLen ; i++ ) 32098 { 32099 // Check if we are dealing with special notation 32100 arrayNotation = a[i].match(__reArray); 32101 funcNotation = a[i].match(__reFn); 32102 32103 if ( arrayNotation ) 32104 { 32105 // Array notation 32106 a[i] = a[i].replace(__reArray, ''); 32107 32108 // Condition allows simply [] to be passed in 32109 if ( a[i] !== "" ) { 32110 data = data[ a[i] ]; 32111 } 32112 out = []; 32113 32114 // Get the remainder of the nested object to get 32115 a.splice( 0, i+1 ); 32116 innerSrc = a.join('.'); 32117 32118 // Traverse each entry in the array getting the properties requested 32119 if ( $.isArray( data ) ) { 32120 for ( var j=0, jLen=data.length ; j<jLen ; j++ ) { 32121 out.push( fetchData( data[j], type, innerSrc ) ); 32122 } 32123 } 32124 32125 // If a string is given in between the array notation indicators, that 32126 // is used to join the strings together, otherwise an array is returned 32127 var join = arrayNotation[0].substring(1, arrayNotation[0].length-1); 32128 data = (join==="") ? out : out.join(join); 32129 32130 // The inner call to fetchData has already traversed through the remainder 32131 // of the source requested, so we exit from the loop 32132 break; 32133 } 32134 else if ( funcNotation ) 32135 { 32136 // Function call 32137 a[i] = a[i].replace(__reFn, ''); 32138 data = data[ a[i] ](); 32139 continue; 32140 } 32141 32142 if ( data === null || data[ a[i] ] === undefined ) 32143 { 32144 return undefined; 32145 } 32146 data = data[ a[i] ]; 32147 } 32148 } 32149 32150 return data; 32151 }; 32152 32153 return function (data, type) { // row and meta also passed, but not used 32154 return fetchData( data, type, mSource ); 32155 }; 32156 } 32157 else 32158 { 32159 /* Array or flat object mapping */ 32160 return function (data, type) { // row and meta also passed, but not used 32161 return data[mSource]; 32162 }; 32163 } 32164 } 32165 32166 32167 /** 32168 * Return a function that can be used to set data from a source object, taking 32169 * into account the ability to use nested objects as a source 32170 * @param {string|int|function} mSource The data source for the object 32171 * @returns {function} Data set function 32172 * @memberof DataTable#oApi 32173 */ 32174 function _fnSetObjectDataFn( mSource ) 32175 { 32176 if ( $.isPlainObject( mSource ) ) 32177 { 32178 /* Unlike get, only the underscore (global) option is used for for 32179 * setting data since we don't know the type here. This is why an object 32180 * option is not documented for `mData` (which is read/write), but it is 32181 * for `mRender` which is read only. 32182 */ 32183 return _fnSetObjectDataFn( mSource._ ); 32184 } 32185 else if ( mSource === null ) 32186 { 32187 /* Nothing to do when the data source is null */ 32188 return function () {}; 32189 } 32190 else if ( typeof mSource === 'function' ) 32191 { 32192 return function (data, val, meta) { 32193 mSource( data, 'set', val, meta ); 32194 }; 32195 } 32196 else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 || 32197 mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) ) 32198 { 32199 /* Like the get, we need to get data from a nested object */ 32200 var setData = function (data, val, src) { 32201 var a = _fnSplitObjNotation( src ), b; 32202 var aLast = a[a.length-1]; 32203 var arrayNotation, funcNotation, o, innerSrc; 32204 32205 for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ ) 32206 { 32207 // Check if we are dealing with an array notation request 32208 arrayNotation = a[i].match(__reArray); 32209 funcNotation = a[i].match(__reFn); 32210 32211 if ( arrayNotation ) 32212 { 32213 a[i] = a[i].replace(__reArray, ''); 32214 data[ a[i] ] = []; 32215 32216 // Get the remainder of the nested object to set so we can recurse 32217 b = a.slice(); 32218 b.splice( 0, i+1 ); 32219 innerSrc = b.join('.'); 32220 32221 // Traverse each entry in the array setting the properties requested 32222 if ( $.isArray( val ) ) 32223 { 32224 for ( var j=0, jLen=val.length ; j<jLen ; j++ ) 32225 { 32226 o = {}; 32227 setData( o, val[j], innerSrc ); 32228 data[ a[i] ].push( o ); 32229 } 32230 } 32231 else 32232 { 32233 // We've been asked to save data to an array, but it 32234 // isn't array data to be saved. Best that can be done 32235 // is to just save the value. 32236 data[ a[i] ] = val; 32237 } 32238 32239 // The inner call to setData has already traversed through the remainder 32240 // of the source and has set the data, thus we can exit here 32241 return; 32242 } 32243 else if ( funcNotation ) 32244 { 32245 // Function call 32246 a[i] = a[i].replace(__reFn, ''); 32247 data = data[ a[i] ]( val ); 32248 } 32249 32250 // If the nested object doesn't currently exist - since we are 32251 // trying to set the value - create it 32252 if ( data[ a[i] ] === null || data[ a[i] ] === undefined ) 32253 { 32254 data[ a[i] ] = {}; 32255 } 32256 data = data[ a[i] ]; 32257 } 32258 32259 // Last item in the input - i.e, the actual set 32260 if ( aLast.match(__reFn ) ) 32261 { 32262 // Function call 32263 data = data[ aLast.replace(__reFn, '') ]( val ); 32264 } 32265 else 32266 { 32267 // If array notation is used, we just want to strip it and use the property name 32268 // and assign the value. If it isn't used, then we get the result we want anyway 32269 data[ aLast.replace(__reArray, '') ] = val; 32270 } 32271 }; 32272 32273 return function (data, val) { // meta is also passed in, but not used 32274 return setData( data, val, mSource ); 32275 }; 32276 } 32277 else 32278 { 32279 /* Array or flat object mapping */ 32280 return function (data, val) { // meta is also passed in, but not used 32281 data[mSource] = val; 32282 }; 32283 } 32284 } 32285 32286 32287 /** 32288 * Return an array with the full table data 32289 * @param {object} oSettings dataTables settings object 32290 * @returns array {array} aData Master data array 32291 * @memberof DataTable#oApi 32292 */ 32293 function _fnGetDataMaster ( settings ) 32294 { 32295 return _pluck( settings.aoData, '_aData' ); 32296 } 32297 32298 32299 /** 32300 * Nuke the table 32301 * @param {object} oSettings dataTables settings object 32302 * @memberof DataTable#oApi 32303 */ 32304 function _fnClearTable( settings ) 32305 { 32306 settings.aoData.length = 0; 32307 settings.aiDisplayMaster.length = 0; 32308 settings.aiDisplay.length = 0; 32309 settings.aIds = {}; 32310 } 32311 32312 32313 /** 32314 * Take an array of integers (index array) and remove a target integer (value - not 32315 * the key!) 32316 * @param {array} a Index array to target 32317 * @param {int} iTarget value to find 32318 * @memberof DataTable#oApi 32319 */ 32320 function _fnDeleteIndex( a, iTarget, splice ) 32321 { 32322 var iTargetIndex = -1; 32323 32324 for ( var i=0, iLen=a.length ; i<iLen ; i++ ) 32325 { 32326 if ( a[i] == iTarget ) 32327 { 32328 iTargetIndex = i; 32329 } 32330 else if ( a[i] > iTarget ) 32331 { 32332 a[i]--; 32333 } 32334 } 32335 32336 if ( iTargetIndex != -1 && splice === undefined ) 32337 { 32338 a.splice( iTargetIndex, 1 ); 32339 } 32340 } 32341 32342 32343 /**
32344 * Mark cached data as invalid such that a re-read of the data will occur when 32345 * the cached data is next requested. Also update from the data source object. 32346 * 32347 * @param {object} settings DataTables settings object 32348 * @param {int} rowIdx Row index to invalidate 32349 * @param {string} [src] Source to invalidate from: undefined, 'auto', 'dom' 32350 * or 'data' 32351 * @param {int} [colIdx] Column index to invalidate. If undefined the whole 32352 * row will be invalidated 32353 * @memberof DataTable#oApi 32354 * 32355 * @todo For the modularisation of v1.11 this will need to become a callback, so 32356 * the sort and filter methods can subscribe to it. That will required 32357 * initialisation options for sorting, which is why it is not already baked in 32358 */ 32359 function _fnInvalidate( settings, rowIdx, src, colIdx ) 32360 { 32361 var row = settings.aoData[ rowIdx ]; 32362 var i, ien; 32363 var cellWrite = function ( cell, col ) { 32364 // This is very frustrating, but in IE if you just write directly 32365 // to innerHTML, and elements that are overwritten are GC'ed, 32366 // even if there is a reference to them elsewhere 32367 while ( cell.childNodes.length ) { 32368 cell.removeChild( cell.firstChild ); 32369 } 32370 32371 cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' ); 32372 }; 32373 32374 // Are we reading last data from DOM or the data object? 32375 if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) { 32376 // Read the data from the DOM 32377 row._aData = _fnGetRowElements( 32378 settings, row, colIdx, colIdx === undefined ? undefined : row._aData 32379 ) 32380 .data; 32381 } 32382 else { 32383 // Reading from data object, update the DOM 32384 var cells = row.anCells; 32385 32386 if ( cells ) { 32387 if ( colIdx !== undefined ) { 32388 cellWrite( cells[colIdx], colIdx ); 32389 } 32390 else { 32391 for ( i=0, ien=cells.length ; i<ien ; i++ ) { 32392 cellWrite( cells[i], i ); 32393 } 32394 } 32395 } 32396 } 32397 32398 // For both row and cell invalidation, the cached data for sorting and 32399 // filtering is nulled out 32400 row._aSortData = null; 32401 row._aFilterData = null; 32402 32403 // Invalidate the type for a specific column (if given) or all columns since 32404 // the data might have changed 32405 var cols = settings.aoColumns; 32406 if ( colIdx !== undefined ) { 32407 cols[ colIdx ].sType = null; 32408 } 32409 else { 32410 for ( i=0, ien=cols.length ; i<ien ; i++ ) { 32411 cols[i].sType = null; 32412 } 32413 32414 // Update DataTables special `DT_*` attributes for the row 32415 _fnRowAttributes( settings, row ); 32416 } 32417 } 32418 32419 32420 /** 32421 * Build a data source object from an HTML row, reading the contents of the 32422 * cells that are in the row. 32423 * 32424 * @param {object} settings DataTables settings object 32425 * @param {node|object} TR element from which to read data or existing row 32426 * object from which to re-read the data from the cells 32427 * @param {int} [colIdx] Optional column index 32428 * @param {array|object} [d] Data source object. If `colIdx` is given then this 32429 * parameter should also be given and will be used to write the data into. 32430 * Only the column in question will be written 32431 * @returns {object} Object with two parameters: `data` the data read, in 32432 * document order, and `cells` and array of nodes (they can be useful to the 32433 * caller, so rather than needing a second traversal to get them, just return 32434 * them from here). 32435 * @memberof DataTable#oApi 32436 */ 32437 function _fnGetRowElements( settings, row, colIdx, d ) 32438 { 32439 var 32440 tds = [], 32441 td = row.firstChild, 32442 name, col, o, i=0, contents, 32443 columns = settings.aoColumns, 32444 objectRead = settings._rowReadObject; 32445 32446 // Allow the data object to be passed in, or construct 32447 d = d !== undefined ? 32448 d : 32449 objectRead ? 32450 {} : 32451 []; 32452 32453 var attr = function ( str, td ) { 32454 if ( typeof str === 'string' ) { 32455 var idx = str.indexOf('@'); 32456 32457 if ( idx !== -1 ) { 32458 var attr = str.substring( idx+1 ); 32459 var setter = _fnSetObjectDataFn( str ); 32460 setter( d, td.getAttribute( attr ) ); 32461 } 32462 } 32463 }; 32464 32465 // Read data from a cell and store into the data object 32466 var cellProcess = function ( cell ) { 32467 if ( colIdx === undefined || colIdx === i ) { 32468 col = columns[i]; 32469 contents = $.trim(cell.innerHTML); 32470 32471 if ( col && col._bAttrSrc ) { 32472 var setter = _fnSetObjectDataFn( col.mData._ ); 32473 setter( d, contents ); 32474 32475 attr( col.mData.sort, cell ); 32476 attr( col.mData.type, cell ); 32477 attr( col.mData.filter, cell ); 32478 } 32479 else { 32480 // Depending on the `data` option for the columns the data can 32481 // be read to either an object or an array.
32482 if ( objectRead ) { 32483 if ( ! col._setter ) { 32484 // Cache the setter function 32485 col._setter = _fnSetObjectDataFn( col.mData ); 32486 } 32487 col._setter( d, contents ); 32488 } 32489 else { 32490 d[i] = contents; 32491 } 32492 } 32493 } 32494 32495 i++; 32496 }; 32497 32498 if ( td ) { 32499 // `tr` element was passed in 32500 while ( td ) { 32501 name = td.nodeName.toUpperCase(); 32502 32503 if ( name == "TD" || name == "TH" ) { 32504 cellProcess( td ); 32505 tds.push( td ); 32506 } 32507 32508 td = td.nextSibling; 32509 } 32510 } 32511 else { 32512 // Existing row object passed in 32513 tds = row.anCells; 32514 32515 for ( var j=0, jen=tds.length ; j<jen ; j++ ) { 32516 cellProcess( tds[j] ); 32517 } 32518 } 32519 32520 // Read the ID from the DOM if present 32521 var rowNode = td ? row : row.nTr; 32522 32523 if ( rowNode ) { 32524 var id = rowNode.getAttribute( 'id' ); 32525 32526 if ( id ) { 32527 _fnSetObjectDataFn( settings.rowId )( d, id ); 32528 } 32529 } 32530 32531 return { 32532 data: d, 32533 cells: tds 32534 }; 32535 } 32536 /** 32537 * Create a new TR element (and it's TD children) for a row 32538 * @param {object} oSettings dataTables settings object 32539 * @param {int} iRow Row to consider 32540 * @param {node} [nTrIn] TR element to add to the table - optional. If not given, 32541 * DataTables will create a row automatically 32542 * @param {array} [anTds] Array of TD|TH elements for the row - must be given 32543 * if nTr is. 32544 * @memberof DataTable#oApi 32545 */ 32546 function _fnCreateTr ( oSettings, iRow, nTrIn, anTds ) 32547 { 32548 var 32549 row = oSettings.aoData[iRow], 32550 rowData = row._aData, 32551 cells = [], 32552 nTr, nTd, oCol, 32553 i, iLen; 32554 32555 if ( row.nTr === null ) 32556 { 32557 nTr = nTrIn || document.createElement('tr'); 32558 32559 row.nTr = nTr; 32560 row.anCells = cells; 32561 32562 /* Use a private property on the node to allow reserve mapping from the node 32563 * to the aoData array for fast look up 32564 */ 32565 nTr._DT_RowIndex = iRow; 32566 32567 /* Special parameters can be given by the data source to be used on the row */ 32568 _fnRowAttributes( oSettings, row ); 32569 32570 /* Process each column */ 32571 for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ ) 32572 { 32573 oCol = oSettings.aoColumns[i]; 32574 32575 nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType ); 32576 cells.push( nTd ); 32577 32578 // Need to create the HTML if new, or if a rendering function is defined 32579 if ( !nTrIn || oCol.mRender || oCol.mData !== i ) 32580 { 32581 nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' ); 32582 } 32583 32584 /* Add user defined class */ 32585 if ( oCol.sClass ) 32586 { 32587 nTd.className += ' '+oCol.sClass; 32588 } 32589 32590 // Visibility - add or remove as required 32591 if ( oCol.bVisible && ! nTrIn ) 32592 { 32593 nTr.appendChild( nTd ); 32594 } 32595 else if ( ! oCol.bVisible && nTrIn ) 32596 { 32597 nTd.parentNode.removeChild( nTd ); 32598 } 32599 32600 if ( oCol.fnCreatedCell ) 32601 { 32602 oCol.fnCreatedCell.call( oSettings.oInstance, 32603 nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i 32604 ); 32605 } 32606 } 32607 32608 _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] ); 32609 } 32610 32611 // Remove once webkit bug 131819 and Chromium bug 365619 have been resolved 32612 // and deployed 32613 row.nTr.setAttribute( 'role', 'row' ); 32614 } 32615 32616 32617 /** 32618 * Add attributes to a row based on the special `DT_*` parameters in a data 32619 * source object. 32620 * @param {object} settings DataTables settings object 32621 * @param {object} DataTables row object for the row to be modified 32622 * @memberof DataTable#oApi 32623 */ 32624 function _fnRowAttributes( settings, row ) 32625 { 32626 var tr = row.nTr; 32627 var data = row._aData; 32628 32629 if ( tr ) { 32630 var id = settings.rowIdFn( data ); 32631 32632 if ( id ) { 32633 tr.id = id; 32634 } 32635 32636 if ( data.DT_RowClass ) { 32637 // Remove any classes added by DT_RowClass before 32638 var a = data.DT_RowClass.split(' '); 32639 row.__rowc = row.__rowc ? 32640 _unique( row.__rowc.concat( a ) ) : 32641 a; 32642 32643 $(tr) 32644 .removeClass( row.__rowc.join(' ') ) 32645 .addClass( data.DT_RowClass ); 32646 } 32647 32648 if ( data.DT_RowAttr ) { 32649 $(tr).attr( data.DT_RowAttr ); 32650 } 32651 32652 if ( data.DT_RowData ) { 32653 $(tr).data( data.DT_RowData ); 32654 } 32655 } 32656 } 32657 32658 32659 /** 32660 * Create the HTML header for the table 32661 * @param {object} oSettings dataTables settings object 32662 * @memberof DataTable#oApi 32663 */ 32664 function _fnBuildHead( oSettings ) 32665 { 32666 var i, ien, cell, row, column; 32667 var thead = oSettings.nTHead; 32668 var tfoot = oSettings.nTFoot; 32669 var createHeader = $('th, td', thead).length === 0; 32670 var classes = oSettings.oClasses; 32671 var columns = oSettings.aoColumns; 32672 32673 if ( createHeader ) { 32674 row = $('<tr/>').appendTo( thead ); 32675 } 32676 32677 for ( i=0, ien=columns.length ; i<ien ; i++ ) { 32678 column = columns[i]; 32679 cell = $( column.nTh ).addClass( column.sClass ); 32680 32681 if ( createHeader ) { 32682 cell.appendTo( row ); 32683 } 32684 32685 // 1.11 move into sorting 32686 if ( oSettings.oFeatures.bSort ) { 32687 cell.addClass( column.sSortingClass ); 32688 32689 if ( column.bSortable !== false ) { 32690 cell 32691 .attr( 'tabindex', oSettings.iTabIndex ) 32692 .attr( 'aria-controls', oSettings.sTableId ); 32693 32694 _fnSortAttachListener( oSettings, column.nTh, i ); 32695 } 32696 } 32697 32698 if ( column.sTitle != cell[0].innerHTML ) { 32699 cell.html( column.sTitle ); 32700 } 32701 32702 _fnRenderer( oSettings, 'header' )( 32703 oSettings, cell, column, classes 32704 ); 32705 } 32706 32707 if ( createHeader ) { 32708 _fnDetectHeader( oSettings.aoHeader, thead ); 32709 } 32710 32711 /* ARIA role for the rows */ 32712 $(thead).find('>tr').attr('role', 'row'); 32713 32714 /* Deal with the footer - add classes if required */ 32715 $(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH ); 32716 $(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH ); 32717 32718 // Cache the footer cells. Note that we only take the cells from the first 32719 // row in the footer. If there is more than one row the user wants to 32720 // interact with, they need to use the table().foot() method. Note also this 32721 // allows cells to be used for multiple columns using colspan 32722 if ( tfoot !== null ) { 32723 var cells = oSettings.aoFooter[0]; 32724 32725 for ( i=0, ien=cells.length ; i<ien ; i++ ) { 32726 column = columns[i]; 32727 column.nTf = cells[i].cell; 32728 32729 if ( column.sClass ) { 32730 $(column.nTf).addClass( column.sClass ); 32731 } 32732 } 32733 } 32734 } 32735 32736 32737 /** 32738 * Draw the header (or footer) element based on the column visibility states. The 32739 * methodology here is to use the layout array from _fnDetectHeader, modified for 32740 * the instantaneous column visibility, to construct the new layout. The grid is 32741 * traversed over cell at a time in a rows x columns grid fashion, although each 32742 * cell insert can cover multiple elements in the grid - which is tracks using the 32743 * aApplied array. Cell inserts in the grid will only occur where there isn't 32744 * already a cell in that position. 32745 * @param {object} oSettings dataTables settings object 32746 * @param array {objects} aoSource Layout array from _fnDetectHeader 32747 * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc, 32748 * @memberof DataTable#oApi 32749 */ 32750 function _fnDrawHead( oSettings, aoSource, bIncludeHidden ) 32751 { 32752 var i, iLen, j, jLen, k, kLen, n, nLocalTr; 32753 var aoLocal = []; 32754 var aApplied = []; 32755 var iColumns = oSettings.aoColumns.length; 32756 var iRowspan, iColspan; 32757 32758 if ( ! aoSource ) 32759 { 32760 return; 32761 } 32762 32763 if ( bIncludeHidden === undefined ) 32764 { 32765 bIncludeHidden = false;
32766 } 32767 32768 /* Make a copy of the master layout array, but without the visible columns in it */ 32769 for ( i=0, iLen=aoSource.length ; i<iLen ; i++ ) 32770 { 32771 aoLocal[i] = aoSource[i].slice(); 32772 aoLocal[i].nTr = aoSource[i].nTr; 32773 32774 /* Remove any columns which are currently hidden */ 32775 for ( j=iColumns-1 ; j>=0 ; j-- ) 32776 { 32777 if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden ) 32778 { 32779 aoLocal[i].splice( j, 1 ); 32780 } 32781 } 32782 32783 /* Prep the applied array - it needs an element for each row */ 32784 aApplied.push( [] ); 32785 } 32786 32787 for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ ) 32788 { 32789 nLocalTr = aoLocal[i].nTr; 32790 32791 /* All cells are going to be replaced, so empty out the row */ 32792 if ( nLocalTr ) 32793 { 32794 while( (n = nLocalTr.firstChild) ) 32795 { 32796 nLocalTr.removeChild( n ); 32797 } 32798 } 32799 32800 for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ ) 32801 { 32802 iRowspan = 1; 32803 iColspan = 1; 32804 32805 /* Check to see if there is already a cell (row/colspan) covering our target 32806 * insert point. If there is, then there is nothing to do. 32807 */ 32808 if ( aApplied[i][j] === undefined ) 32809 { 32810 nLocalTr.appendChild( aoLocal[i][j].cell ); 32811 aApplied[i][j] = 1; 32812 32813 /* Expand the cell to cover as many rows as needed */ 32814 while ( aoLocal[i+iRowspan] !== undefined && 32815 aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell ) 32816 { 32817 aApplied[i+iRowspan][j] = 1; 32818 iRowspan++; 32819 } 32820 32821 /* Expand the cell to cover as many columns as needed */ 32822 while ( aoLocal[i][j+iColspan] !== undefined && 32823 aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell ) 32824 { 32825 /* Must update the applied array over the rows for the columns */ 32826 for ( k=0 ; k<iRowspan ; k++ ) 32827 { 32828 aApplied[i+k][j+iColspan] = 1; 32829 } 32830 iColspan++; 32831 } 32832 32833 /* Do the actual expansion in the DOM */ 32834 $(aoLocal[i][j].cell) 32835 .attr('rowspan', iRowspan) 32836 .attr('colspan', iColspan); 32837 } 32838 } 32839 } 32840 } 32841 32842 32843 /** 32844 * Insert the required TR nodes into the table for display 32845 * @param {object} oSettings dataTables settings object 32846 * @memberof DataTable#oApi 32847 */ 32848 function _fnDraw( oSettings ) 32849 { 32850 /* Provide a pre-callback function which can be used to cancel the draw is false is returned */ 32851 var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] ); 32852 if ( $.inArray( false, aPreDraw ) !== -1 ) 32853 { 32854 _fnProcessingDisplay( oSettings, false ); 32855 return; 32856 } 32857 32858 var i, iLen, n; 32859 var anRows = []; 32860 var iRowCount = 0; 32861 var asStripeClasses = oSettings.asStripeClasses; 32862 var iStripes = asStripeClasses.length; 32863 var iOpenRows = oSettings.aoOpenRows.length; 32864 var oLang = oSettings.oLanguage; 32865 var iInitDisplayStart = oSettings.iInitDisplayStart; 32866 var bServerSide = _fnDataSource( oSettings ) == 'ssp'; 32867 var aiDisplay = oSettings.aiDisplay; 32868 32869 oSettings.bDrawing = true; 32870 32871 /* Check and see if we have an initial draw position from state saving */ 32872 if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 ) 32873 { 32874 oSettings._iDisplayStart = bServerSide ? 32875 iInitDisplayStart : 32876 iInitDisplayStart >= oSettings.fnRecordsDisplay() ? 32877 0 : 32878 iInitDisplayStart; 32879 32880 oSettings.iInitDisplayStart = -1; 32881 } 32882 32883 var iDisplayStart = oSettings._iDisplayStart; 32884 var iDisplayEnd = oSettings.fnDisplayEnd(); 32885 32886 /* Server-side processing draw intercept */ 32887 if ( oSettings.bDeferLoading ) 32888 { 32889 oSettings.bDeferLoading = false; 32890 oSettings.iDraw++; 32891 _fnProcessingDisplay( oSettings, false ); 32892 } 32893 else if ( !bServerSide ) 32894 { 32895 oSettings.iDraw++; 32896 } 32897 else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) ) 32898 { 32899 return; 32900 } 32901 32902 if ( aiDisplay.length !== 0 ) 32903 { 32904 var iStart = bServerSide ? 0 : iDisplayStart; 32905 var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd; 32906 32907 for ( var j=iStart ; j<iEnd ; j++ ) 32908 { 32909 var iDataIndex = aiDisplay[j]; 32910 var aoData = oSettings.aoData[ iDataIndex ]; 32911 if ( aoData.nTr === null ) 32912 { 32913 _fnCreateTr( oSettings, iDataIndex ); 32914 } 32915 32916 var nRow = aoData.nTr; 32917 32918 /* Remove the old striping classes and then add the new one */ 32919 if ( iStripes !== 0 ) 32920 { 32921 var sStripe = asStripeClasses[ iRowCount % iStripes ]; 32922 if ( aoData._sRowStripe != sStripe ) 32923 { 32924 $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe ); 32925 aoData._sRowStripe = sStripe; 32926 } 32927 } 32928 32929 // Row callback functions - might want to manipulate the row 32930 // iRowCount and j are not currently documented. Are they at all 32931 // useful? 32932 _fnCallbackFire( oSettings, 'aoRowCallback', null, 32933 [nRow, aoData._aData, iRowCount, j] ); 32934 32935 anRows.push( nRow ); 32936 iRowCount++; 32937 } 32938 } 32939 else 32940 { 32941 /* Table is empty - create a row with an empty message in it */ 32942 var sZero = oLang.sZeroRecords; 32943 if ( oSettings.iDraw == 1 && _fnDataSource( oSettings ) == 'ajax' ) 32944 { 32945 sZero = oLang.sLoadingRecords; 32946 } 32947 else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 ) 32948 { 32949 sZero = oLang.sEmptyTable; 32950 } 32951 32952 anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } ) 32953 .append( $('<td />', { 32954 'valign': 'top', 32955 'colSpan': _fnVisbleColumns( oSettings ), 32956 'class': oSettings.oClasses.sRowEmpty 32957 } ).html( sZero ) )[0]; 32958 } 32959 32960 /* Header and footer callbacks */ 32961 _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0], 32962 _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] ); 32963 32964 _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0], 32965 _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] ); 32966 32967 var body = $(oSettings.nTBody); 32968 32969 body.children().detach(); 32970 body.append( $(anRows) ); 32971 32972 /* Call all required callback functions for the end of a draw */ 32973 _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] ); 32974 32975 /* Draw is complete, sorting and filtering must be as well */ 32976 oSettings.bSorted = false;
32977 oSettings.bFiltered = false; 32978 oSettings.bDrawing = false; 32979 } 32980 32981 32982 /** 32983 * Redraw the table - taking account of the various features which are enabled 32984 * @param {object} oSettings dataTables settings object 32985 * @param {boolean} [holdPosition] Keep the current paging position. By default 32986 * the paging is reset to the first page 32987 * @memberof DataTable#oApi 32988 */ 32989 function _fnReDraw( settings, holdPosition ) 32990 { 32991 var 32992 features = settings.oFeatures, 32993 sort = features.bSort, 32994 filter = features.bFilter; 32995 32996 if ( sort ) { 32997 _fnSort( settings ); 32998 } 32999 33000 if ( filter ) { 33001 _fnFilterComplete( settings, settings.oPreviousSearch ); 33002 } 33003 else { 33004 // No filtering, so we want to just use the display master 33005 settings.aiDisplay = settings.aiDisplayMaster.slice(); 33006 } 33007 33008 if ( holdPosition !== true ) { 33009 settings._iDisplayStart = 0; 33010 } 33011 33012 // Let any modules know about the draw hold position state (used by 33013 // scrolling internally) 33014 settings._drawHold = holdPosition; 33015 33016 _fnDraw( settings ); 33017 33018 settings._drawHold = false; 33019 } 33020 33021 33022 /** 33023 * Add the options to the page HTML for the table 33024 * @param {object} oSettings dataTables settings object 33025 * @memberof DataTable#oApi 33026 */ 33027 function _fnAddOptionsHtml ( oSettings ) 33028 { 33029 var classes = oSettings.oClasses; 33030 var table = $(oSettings.nTable); 33031 var holding = $('<div/>').insertBefore( table ); // Holding element for speed 33032 var features = oSettings.oFeatures; 33033 33034 // All DataTables are wrapped in a div 33035 var insert = $('<div/>', { 33036 id: oSettings.sTableId+'_wrapper', 33037 'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter) 33038 } ); 33039 33040 oSettings.nHolding = holding[0]; 33041 oSettings.nTableWrapper = insert[0]; 33042 oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling; 33043
33044 /* Loop over the user set positioning and place the elements as needed */ 33045 var aDom = oSettings.sDom.split(''); 33046 var featureNode, cOption, nNewNode, cNext, sAttr, j; 33047 for ( var i=0 ; i<aDom.length ; i++ ) 33048 { 33049 featureNode = null; 33050 cOption = aDom[i]; 33051 33052 if ( cOption == '<' ) 33053 { 33054 /* New container div */ 33055 nNewNode = $('<div/>')[0]; 33056 33057 /* Check to see if we should append an id and/or a class name to the container */ 33058 cNext = aDom[i+1]; 33059 if ( cNext == "'" || cNext == '"' ) 33060 { 33061 sAttr = ""; 33062 j = 2; 33063 while ( aDom[i+j] != cNext ) 33064 { 33065 sAttr += aDom[i+j]; 33066 j++; 33067 } 33068 33069 /* Replace jQuery UI constants @todo depreciated */ 33070 if ( sAttr == "H" ) 33071 { 33072 sAttr = classes.sJUIHeader; 33073 } 33074 else if ( sAttr == "F" ) 33075 { 33076 sAttr = classes.sJUIFooter; 33077 } 33078 33079 /* The attribute can be in the format of "#id.class", "#id" or "class" This logic 33080 * breaks the string into parts and applies them as needed 33081 */ 33082 if ( sAttr.indexOf('.') != -1 ) 33083 { 33084 var aSplit = sAttr.split('.'); 33085 nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1); 33086 nNewNode.className = aSplit[1]; 33087 } 33088 else if ( sAttr.charAt(0) == "#" ) 33089 { 33090 nNewNode.id = sAttr.substr(1, sAttr.length-1); 33091 } 33092 else 33093 { 33094 nNewNode.className = sAttr; 33095 } 33096 33097 i += j; /* Move along the position array */ 33098 } 33099 33100 insert.append( nNewNode ); 33101 insert = $(nNewNode); 33102 } 33103 else if ( cOption == '>' ) 33104 { 33105 /* End container div */ 33106 insert = insert.parent(); 33107 } 33108 // @todo Move options into their own plugins? 33109 else if ( cOption == 'l' && features.bPaginate && features.bLengthChange ) 33110 { 33111 /* Length */ 33112 featureNode = _fnFeatureHtmlLength( oSettings ); 33113 } 33114 else if ( cOption == 'f' && features.bFilter ) 33115 { 33116 /* Filter */ 33117 featureNode = _fnFeatureHtmlFilter( oSettings ); 33118 } 33119 else if ( cOption == 'r' && features.bProcessing ) 33120 { 33121 /* pRocessing */ 33122 featureNode = _fnFeatureHtmlProcessing( oSettings ); 33123 } 33124 else if ( cOption == 't' ) 33125 { 33126 /* Table */ 33127 featureNode = _fnFeatureHtmlTable( oSettings ); 33128 } 33129 else if ( cOption == 'i' && features.bInfo ) 33130 { 33131 /* Info */ 33132 featureNode = _fnFeatureHtmlInfo( oSettings ); 33133 } 33134 else if ( cOption == 'p' && features.bPaginate ) 33135 { 33136 /* Pagination */ 33137 featureNode = _fnFeatureHtmlPaginate( oSettings ); 33138 } 33139 else if ( DataTable.ext.feature.length !== 0 ) 33140 { 33141 /* Plug-in features */ 33142 var aoFeatures = DataTable.ext.feature; 33143 for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ ) 33144 { 33145 if ( cOption == aoFeatures[k].cFeature ) 33146 { 33147 featureNode = aoFeatures[k].fnInit( oSettings ); 33148 break; 33149 } 33150 } 33151 } 33152 33153 /* Add to the 2D features array */ 33154 if ( featureNode ) 33155 { 33156 var aanFeatures = oSettings.aanFeatures; 33157 33158 if ( ! aanFeatures[cOption] ) 33159 { 33160 aanFeatures[cOption] = []; 33161 } 33162 33163 aanFeatures[cOption].push( featureNode ); 33164 insert.append( featureNode ); 33165 } 33166 } 33167 33168 /* Built our DOM structure - replace the holding div with what we want */ 33169 holding.replaceWith( insert ); 33170 oSettings.nHolding = null; 33171 } 33172 33173 33174 /** 33175 * Use the DOM source to create up an array of header cells. The idea here is to 33176 * create a layout grid (array) of rows x columns, which contains a reference 33177 * to the cell that that point in the grid (regardless of col/rowspan), such that 33178 * any column / row could be removed and the new grid constructed 33179 * @param array {object} aLayout Array to store the calculated layout in 33180 * @param {node} nThead The header/footer element for the table 33181 * @memberof DataTable#oApi 33182 */ 33183 function _fnDetectHeader ( aLayout, nThead ) 33184 { 33185 var nTrs = $(nThead).children('tr'); 33186 var nTr, nCell; 33187 var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan; 33188 var bUnique; 33189 var fnShiftCol = function ( a, i, j ) { 33190 var k = a[i]; 33191 while ( k[j] ) { 33192 j++; 33193 } 33194 return j; 33195 }; 33196 33197 aLayout.splice( 0, aLayout.length ); 33198 33199 /* We know how many rows there are in the layout - so prep it */ 33200 for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) 33201 { 33202 aLayout.push( [] ); 33203 } 33204 33205 /* Calculate a layout array */ 33206 for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) 33207 { 33208 nTr = nTrs[i]; 33209 iColumn = 0; 33210 33211 /* For every cell in the row... */ 33212 nCell = nTr.firstChild; 33213 while ( nCell ) { 33214 if ( nCell.nodeName.toUpperCase() == "TD" || 33215 nCell.nodeName.toUpperCase() == "TH" ) 33216 { 33217 /* Get the col and rowspan attributes from the DOM and sanitise them */ 33218 iColspan = nCell.getAttribute('colspan') * 1;
33219 iRowspan = nCell.getAttribute('rowspan') * 1; 33220 iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan; 33221 iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan; 33222 33223 /* There might be colspan cells already in this row, so shift our target 33224 * accordingly 33225 */ 33226 iColShifted = fnShiftCol( aLayout, i, iColumn ); 33227 33228 /* Cache calculation for unique columns */ 33229 bUnique = iColspan === 1 ? true : false; 33230 33231 /* If there is col / rowspan, copy the information into the layout grid */ 33232 for ( l=0 ; l<iColspan ; l++ ) 33233 { 33234 for ( k=0 ; k<iRowspan ; k++ ) 33235 { 33236 aLayout[i+k][iColShifted+l] = { 33237 "cell": nCell, 33238 "unique": bUnique 33239 }; 33240 aLayout[i+k].nTr = nTr; 33241 } 33242 } 33243 } 33244 nCell = nCell.nextSibling; 33245 } 33246 } 33247 } 33248 33249 33250 /** 33251 * Get an array of unique th elements, one for each column 33252 * @param {object} oSettings dataTables settings object 33253 * @param {node} nHeader automatically detect the layout from this node - optional 33254 * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional 33255 * @returns array {node} aReturn list of unique th's 33256 * @memberof DataTable#oApi 33257 */ 33258 function _fnGetUniqueThs ( oSettings, nHeader, aLayout ) 33259 { 33260 var aReturn = []; 33261 if ( !aLayout ) 33262 { 33263 aLayout = oSettings.aoHeader; 33264 if ( nHeader ) 33265 { 33266 aLayout = []; 33267 _fnDetectHeader( aLayout, nHeader ); 33268 } 33269 } 33270 33271 for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ ) 33272 { 33273 for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ ) 33274 { 33275 if ( aLayout[i][j].unique && 33276 (!aReturn[j] || !oSettings.bSortCellsTop) ) 33277 { 33278 aReturn[j] = aLayout[i][j].cell; 33279 } 33280 } 33281 } 33282 33283 return aReturn; 33284 } 33285 33286 /** 33287 * Create an Ajax call based on the table's settings, taking into account that 33288 * parameters can have multiple forms, and backwards compatibility. 33289 * 33290 * @param {object} oSettings dataTables settings object 33291 * @param {array} data Data to send to the server, required by 33292 * DataTables - may be augmented by developer callbacks 33293 * @param {function} fn Callback function to run when data is obtained 33294 */ 33295 function _fnBuildAjax( oSettings, data, fn ) 33296 { 33297 // Compatibility with 1.9-, allow fnServerData and event to manipulate 33298 _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] ); 33299 33300 // Convert to object based for 1.10+ if using the old array scheme which can 33301 // come from server-side processing or serverParams 33302 if ( data && $.isArray(data) ) { 33303 var tmp = {}; 33304 var rbracket = /(.*?)\[\]$/; 33305 33306 $.each( data, function (key, val) { 33307 var match = val.name.match(rbracket); 33308 33309 if ( match ) { 33310 // Support for arrays 33311 var name = match[0]; 33312 33313 if ( ! tmp[ name ] ) { 33314 tmp[ name ] = []; 33315 } 33316 tmp[ name ].push( val.value ); 33317 } 33318 else { 33319 tmp[val.name] = val.value; 33320 } 33321 } ); 33322 data = tmp; 33323 } 33324 33325 var ajaxData; 33326 var ajax = oSettings.ajax; 33327 var instance = oSettings.oInstance; 33328 var callback = function ( json ) { 33329 _fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] ); 33330 fn( json ); 33331 }; 33332 33333 if ( $.isPlainObject( ajax ) && ajax.data ) 33334 { 33335 ajaxData = ajax.data; 33336 33337 var newData = $.isFunction( ajaxData ) ? 33338 ajaxData( data, oSettings ) : // fn can manipulate data or return 33339 ajaxData; // an object object or array to merge 33340 33341 // If the function returned something, use that alone 33342 data = $.isFunction( ajaxData ) && newData ? 33343 newData : 33344 $.extend( true, data, newData ); 33345 33346 // Remove the data property as we've resolved it already and don't want 33347 // jQuery to do it again (it is restored at the end of the function) 33348 delete ajax.data; 33349 } 33350 33351 var baseAjax = { 33352 "data": data, 33353 "success": function (json) { 33354 var error = json.error || json.sError; 33355 if ( error ) { 33356 _fnLog( oSettings, 0, error ); 33357 } 33358 33359 oSettings.json = json; 33360 callback( json ); 33361 }, 33362 "dataType": "json", 33363 "cache": false, 33364 "type": oSettings.sServerMethod, 33365 "error": function (xhr, error, thrown) { 33366 var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] ); 33367 33368 if ( $.inArray( true, ret ) === -1 ) { 33369 if ( error == "parsererror" ) { 33370 _fnLog( oSettings, 0, 'Invalid JSON response', 1 ); 33371 } 33372 else if ( xhr.readyState === 4 ) { 33373 _fnLog( oSettings, 0, 'Ajax error', 7 ); 33374 } 33375 } 33376 33377 _fnProcessingDisplay( oSettings, false ); 33378 } 33379 }; 33380 33381 // Store the data submitted for the API 33382 oSettings.oAjaxData = data; 33383 33384 // Allow plug-ins and external processes to modify the data 33385 _fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] ); 33386 33387 if ( oSettings.fnServerData ) 33388 { 33389 // DataTables 1.9- compatibility 33390 oSettings.fnServerData.call( instance, 33391 oSettings.sAjaxSource, 33392 $.map( data, function (val, key) { // Need to convert back to 1.9 trad format 33393 return { name: key, value: val }; 33394 } ), 33395 callback, 33396 oSettings 33397 ); 33398 } 33399 else if ( oSettings.sAjaxSource || typeof ajax === 'string' ) 33400 { 33401 // DataTables 1.9- compatibility 33402 oSettings.jqXHR = $.ajax( $.extend( baseAjax, { 33403 url: ajax || oSettings.sAjaxSource 33404 } ) ); 33405 } 33406 else if ( $.isFunction( ajax ) ) 33407 { 33408 // Is a function - let the caller define what needs to be done 33409 oSettings.jqXHR = ajax.call( instance, data, callback, oSettings ); 33410 } 33411 else 33412 { 33413 // Object to extend the base settings 33414 oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) ); 33415 33416 // Restore for next time around 33417 ajax.data = ajaxData; 33418 } 33419 } 33420 33421 33422 /** 33423 * Update the table using an Ajax call 33424 * @param {object} settings dataTables settings object 33425 * @returns {boolean} Block the table drawing or not 33426 * @memberof DataTable#oApi 33427 */ 33428 function _fnAjaxUpdate( settings ) 33429 { 33430 if ( settings.bAjaxDataGet ) { 33431 settings.iDraw++; 33432 _fnProcessingDisplay( settings, true ); 33433 33434 _fnBuildAjax( 33435 settings, 33436 _fnAjaxParameters( settings ), 33437 function(json) { 33438 _fnAjaxUpdateDraw( settings, json ); 33439 } 33440 ); 33441 33442 return false;
33443 } 33444 return true; 33445 } 33446 33447 33448 /** 33449 * Build up the parameters in an object needed for a server-side processing 33450 * request. Note that this is basically done twice, is different ways - a modern 33451 * method which is used by default in DataTables 1.10 which uses objects and 33452 * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if 33453 * the sAjaxSource option is used in the initialisation, or the legacyAjax 33454 * option is set. 33455 * @param {object} oSettings dataTables settings object 33456 * @returns {bool} block the table drawing or not 33457 * @memberof DataTable#oApi 33458 */ 33459 function _fnAjaxParameters( settings ) 33460 { 33461 var 33462 columns = settings.aoColumns, 33463 columnCount = columns.length, 33464 features = settings.oFeatures, 33465 preSearch = settings.oPreviousSearch, 33466 preColSearch = settings.aoPreSearchCols, 33467 i, data = [], dataProp, column, columnSearch, 33468 sort = _fnSortFlatten( settings ), 33469 displayStart = settings._iDisplayStart, 33470 displayLength = features.bPaginate !== false ? 33471 settings._iDisplayLength : 33472 -1; 33473 33474 var param = function ( name, value ) { 33475 data.push( { 'name': name, 'value': value } ); 33476 }; 33477 33478 // DataTables 1.9- compatible method 33479 param( 'sEcho', settings.iDraw ); 33480 param( 'iColumns', columnCount ); 33481 param( 'sColumns', _pluck( columns, 'sName' ).join(',') ); 33482 param( 'iDisplayStart', displayStart ); 33483 param( 'iDisplayLength', displayLength ); 33484 33485 // DataTables 1.10+ method 33486 var d = { 33487 draw: settings.iDraw, 33488 columns: [], 33489 order: [], 33490 start: displayStart, 33491 length: displayLength, 33492 search: { 33493 value: preSearch.sSearch, 33494 regex: preSearch.bRegex 33495 } 33496 }; 33497 33498 for ( i=0 ; i<columnCount ; i++ ) { 33499 column = columns[i]; 33500 columnSearch = preColSearch[i]; 33501 dataProp = typeof column.mData=="function" ? 'function' : column.mData ; 33502 33503 d.columns.push( { 33504 data: dataProp, 33505 name: column.sName, 33506 searchable: column.bSearchable, 33507 orderable: column.bSortable, 33508 search: { 33509 value: columnSearch.sSearch, 33510 regex: columnSearch.bRegex 33511 } 33512 } ); 33513 33514 param( "mDataProp_"+i, dataProp ); 33515 33516 if ( features.bFilter ) { 33517 param( 'sSearch_'+i, columnSearch.sSearch ); 33518 param( 'bRegex_'+i, columnSearch.bRegex ); 33519 param( 'bSearchable_'+i, column.bSearchable ); 33520 } 33521 33522 if ( features.bSort ) { 33523 param( 'bSortable_'+i, column.bSortable ); 33524 } 33525 } 33526 33527 if ( features.bFilter ) { 33528 param( 'sSearch', preSearch.sSearch ); 33529 param( 'bRegex', preSearch.bRegex ); 33530 } 33531 33532 if ( features.bSort ) { 33533 $.each( sort, function ( i, val ) { 33534 d.order.push( { column: val.col, dir: val.dir } ); 33535 33536 param( 'iSortCol_'+i, val.col ); 33537 param( 'sSortDir_'+i, val.dir ); 33538 } ); 33539 33540 param( 'iSortingCols', sort.length ); 33541 } 33542 33543 // If the legacy.ajax parameter is null, then we automatically decide which 33544 // form to use, based on sAjaxSource 33545 var legacy = DataTable.ext.legacy.ajax; 33546 if ( legacy === null ) { 33547 return settings.sAjaxSource ? data : d; 33548 } 33549 33550 // Otherwise, if legacy has been specified then we use that to decide on the 33551 // form 33552 return legacy ? data : d; 33553 } 33554 33555 33556 /** 33557 * Data the data from the server (nuking the old) and redraw the table 33558 * @param {object} oSettings dataTables settings object 33559 * @param {object} json json data return from the server. 33560 * @param {string} json.sEcho Tracking flag for DataTables to match requests 33561 * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering 33562 * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering 33563 * @param {array} json.aaData The data to display on this page 33564 * @param {string} [json.sColumns] Column ordering (sName, comma separated) 33565 * @memberof DataTable#oApi 33566 */ 33567 function _fnAjaxUpdateDraw ( settings, json ) 33568 { 33569 // v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
33570 // Support both 33571 var compat = function ( old, modern ) { 33572 return json[old] !== undefined ? json[old] : json[modern]; 33573 }; 33574 33575 var data = _fnAjaxDataSrc( settings, json ); 33576 var draw = compat( 'sEcho', 'draw' ); 33577 var recordsTotal = compat( 'iTotalRecords', 'recordsTotal' ); 33578 var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' ); 33579 33580 if ( draw ) { 33581 // Protect against out of sequence returns 33582 if ( draw*1 < settings.iDraw ) { 33583 return; 33584 } 33585 settings.iDraw = draw * 1; 33586 } 33587 33588 _fnClearTable( settings ); 33589 settings._iRecordsTotal = parseInt(recordsTotal, 10); 33590 settings._iRecordsDisplay = parseInt(recordsFiltered, 10); 33591 33592 for ( var i=0, ien=data.length ; i<ien ; i++ ) { 33593 _fnAddData( settings, data[i] ); 33594 } 33595 settings.aiDisplay = settings.aiDisplayMaster.slice(); 33596 33597 settings.bAjaxDataGet = false; 33598 _fnDraw( settings ); 33599 33600 if ( ! settings._bInitComplete ) { 33601 _fnInitComplete( settings, json ); 33602 } 33603 33604 settings.bAjaxDataGet = true; 33605 _fnProcessingDisplay( settings, false ); 33606 } 33607 33608 33609 /** 33610 * Get the data from the JSON data source to use for drawing a table. Using 33611 * `_fnGetObjectDataFn` allows the data to be sourced from a property of the 33612 * source object, or from a processing function. 33613 * @param {object} oSettings dataTables settings object 33614 * @param {object} json Data source object / array from the server 33615 * @return {array} Array of data to use 33616 */ 33617 function _fnAjaxDataSrc ( oSettings, json ) 33618 { 33619 var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ? 33620 oSettings.ajax.dataSrc : 33621 oSettings.sAjaxDataProp; // Compatibility with 1.9-. 33622 33623 // Compatibility with 1.9-. In order to read from aaData, check if the 33624 // default has been changed, if not, check for aaData 33625 if ( dataSrc === 'data' ) { 33626 return json.aaData || json[dataSrc]; 33627 } 33628 33629 return dataSrc !== "" ? 33630 _fnGetObjectDataFn( dataSrc )( json ) : 33631 json; 33632 } 33633 33634 /** 33635 * Generate the node required for filtering text 33636 * @returns {node} Filter control element 33637 * @param {object} oSettings dataTables settings object 33638 * @memberof DataTable#oApi 33639 */ 33640 function _fnFeatureHtmlFilter ( settings ) 33641 { 33642 var classes = settings.oClasses; 33643 var tableId = settings.sTableId; 33644 var language = settings.oLanguage; 33645 var previousSearch = settings.oPreviousSearch; 33646 var features = settings.aanFeatures; 33647 var input = '<input type="search" class="'+classes.sFilterInput+'"/>'; 33648 33649 var str = language.sSearch; 33650 str = str.match(/_INPUT_/) ? 33651 str.replace('_INPUT_', input) : 33652 str+input; 33653 33654 var filter = $('<div/>', { 33655 'id': ! features.f ? tableId+'_filter' : null, 33656 'class': classes.sFilter 33657 } ) 33658 .append( $('<label/>' ).append( str ) ); 33659 33660 var searchFn = function() { 33661 /* Update all other filter input elements for the new display */ 33662 var n = features.f; 33663 var val = !this.value ? "" : this.value; // mental IE8 fix :-( 33664 33665 /* Now do the filter */ 33666 if ( val != previousSearch.sSearch ) { 33667 _fnFilterComplete( settings, { 33668 "sSearch": val, 33669 "bRegex": previousSearch.bRegex, 33670 "bSmart": previousSearch.bSmart , 33671 "bCaseInsensitive": previousSearch.bCaseInsensitive 33672 } ); 33673 33674 // Need to redraw, without resorting 33675 settings._iDisplayStart = 0; 33676 _fnDraw( settings ); 33677 } 33678 }; 33679 33680 var searchDelay = settings.searchDelay !== null ? 33681 settings.searchDelay : 33682 _fnDataSource( settings ) === 'ssp' ? 33683 400 : 33684 0; 33685 33686 var jqFilter = $('input', filter) 33687 .val( previousSearch.sSearch ) 33688 .attr( 'placeholder', language.sSearchPlaceholder ) 33689 .bind( 33690 'keyup.DT search.DT input.DT paste.DT cut.DT', 33691 searchDelay ? 33692 _fnThrottle( searchFn, searchDelay ) : 33693 searchFn 33694 ) 33695 .bind( 'keypress.DT', function(e) { 33696 /* Prevent form submission */ 33697 if ( e.keyCode == 13 ) { 33698 return false; 33699 } 33700 } ) 33701 .attr('aria-controls', tableId); 33702 33703 // Update the input elements whenever the table is filtered 33704 $(settings.nTable).on( 'search.dt.DT', function ( ev, s ) { 33705 if ( settings === s ) { 33706 // IE9 throws an 'unknown error' if document.activeElement is used 33707 // inside an iframe or frame...
33708 try { 33709 if ( jqFilter[0] !== document.activeElement ) { 33710 jqFilter.val( previousSearch.sSearch ); 33711 } 33712 } 33713 catch ( e ) {} 33714 } 33715 } ); 33716 33717 return filter[0]; 33718 } 33719 33720 33721 /** 33722 * Filter the table using both the global filter and column based filtering 33723 * @param {object} oSettings dataTables settings object 33724 * @param {object} oSearch search information 33725 * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0) 33726 * @memberof DataTable#oApi 33727 */ 33728 function _fnFilterComplete ( oSettings, oInput, iForce ) 33729 { 33730 var oPrevSearch = oSettings.oPreviousSearch; 33731 var aoPrevSearch = oSettings.aoPreSearchCols; 33732 var fnSaveFilter = function ( oFilter ) { 33733 /* Save the filtering values */ 33734 oPrevSearch.sSearch = oFilter.sSearch; 33735 oPrevSearch.bRegex = oFilter.bRegex; 33736 oPrevSearch.bSmart = oFilter.bSmart; 33737 oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive; 33738 }; 33739 var fnRegex = function ( o ) { 33740 // Backwards compatibility with the bEscapeRegex option 33741 return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex; 33742 }; 33743 33744 // Resolve any column types that are unknown due to addition or invalidation 33745 // @todo As per sort - can this be moved into an event handler? 33746 _fnColumnTypes( oSettings ); 33747 33748 /* In server-side processing all filtering is done by the server, so no point hanging around here */ 33749 if ( _fnDataSource( oSettings ) != 'ssp' ) 33750 { 33751 /* Global filter */ 33752 _fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive ); 33753 fnSaveFilter( oInput ); 33754 33755 /* Now do the individual column filter */ 33756 for ( var i=0 ; i<aoPrevSearch.length ; i++ ) 33757 { 33758 _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]), 33759 aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive ); 33760 } 33761 33762 /* Custom filtering */ 33763 _fnFilterCustom( oSettings ); 33764 } 33765 else 33766 { 33767 fnSaveFilter( oInput ); 33768 } 33769 33770 /* Tell the draw function we have been filtering */ 33771 oSettings.bFiltered = true; 33772 _fnCallbackFire( oSettings, null, 'search', [oSettings] ); 33773 } 33774 33775 33776 /** 33777 * Apply custom filtering functions 33778 * @param {object} oSettings dataTables settings object 33779 * @memberof DataTable#oApi 33780 */ 33781 function _fnFilterCustom( settings ) 33782 { 33783 var filters = DataTable.ext.search; 33784 var displayRows = settings.aiDisplay; 33785 var row, rowIdx; 33786 33787 for ( var i=0, ien=filters.length ; i<ien ; i++ ) { 33788 var rows = []; 33789 33790 // Loop over each row and see if it should be included 33791 for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) { 33792 rowIdx = displayRows[ j ]; 33793 row = settings.aoData[ rowIdx ]; 33794 33795 if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) { 33796 rows.push( rowIdx ); 33797 } 33798 } 33799 33800 // So the array reference doesn't break set the results into the 33801 // existing array 33802 displayRows.length = 0; 33803 $.merge( displayRows, rows ); 33804 } 33805 } 33806 33807 33808 /** 33809 * Filter the table on a per-column basis 33810 * @param {object} oSettings dataTables settings object 33811 * @param {string} sInput string to filter on 33812 * @param {int} iColumn column to filter 33813 * @param {bool} bRegex treat search string as a regular expression or not 33814 * @param {bool} bSmart use smart filtering or not 33815 * @param {bool} bCaseInsensitive Do case insenstive matching or not 33816 * @memberof DataTable#oApi 33817 */ 33818 function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive ) 33819 { 33820 if ( searchStr === '' ) { 33821 return; 33822 } 33823 33824 var data; 33825 var display = settings.aiDisplay; 33826 var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive ); 33827 33828 for ( var i=display.length-1 ; i>=0 ; i-- ) { 33829 data = settings.aoData[ display[i] ]._aFilterData[ colIdx ]; 33830 33831 if ( ! rpSearch.test( data ) ) { 33832 display.splice( i, 1 ); 33833 } 33834 } 33835 } 33836 33837 33838 /** 33839 * Filter the data table based on user input and draw the table 33840 * @param {object} settings dataTables settings object 33841 * @param {string} input string to filter on 33842 * @param {int} force optional - force a research of the master array (1) or not (undefined or 0) 33843 * @param {bool} regex treat as a regular expression or not 33844 * @param {bool} smart perform smart filtering or not 33845 * @param {bool} caseInsensitive Do case insenstive matching or not 33846 * @memberof DataTable#oApi 33847 */ 33848 function _fnFilter( settings, input, force, regex, smart, caseInsensitive ) 33849 { 33850 var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive ); 33851 var prevSearch = settings.oPreviousSearch.sSearch; 33852 var displayMaster = settings.aiDisplayMaster; 33853 var display, invalidated, i; 33854 33855 // Need to take account of custom filtering functions - always filter 33856 if ( DataTable.ext.search.length !== 0 ) { 33857 force = true; 33858 } 33859 33860 // Check if any of the rows were invalidated 33861 invalidated = _fnFilterData( settings ); 33862 33863 // If the input is blank - we just want the full data set 33864 if ( input.length <= 0 ) { 33865 settings.aiDisplay = displayMaster.slice(); 33866 } 33867 else { 33868 // New search - start from the master array 33869 if ( invalidated || 33870 force || 33871 prevSearch.length > input.length || 33872 input.indexOf(prevSearch) !== 0 || 33873 settings.bSorted // On resort, the display master needs to be 33874 // re-filtered since indexes will have changed 33875 ) { 33876 settings.aiDisplay = displayMaster.slice(); 33877 } 33878 33879 // Search the display array 33880 display = settings.aiDisplay; 33881 33882 for ( i=display.length-1 ; i>=0 ; i-- ) { 33883 if ( ! rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) { 33884 display.splice( i, 1 ); 33885 } 33886 } 33887 } 33888 } 33889 33890 33891 /** 33892 * Build a regular expression object suitable for searching a table 33893 * @param {string} sSearch string to search for 33894 * @param {bool} bRegex treat as a regular expression or not 33895 * @param {bool} bSmart perform smart filtering or not 33896 * @param {bool} bCaseInsensitive Do case insensitive matching or not 33897 * @returns {RegExp} constructed object 33898 * @memberof DataTable#oApi 33899 */ 33900 function _fnFilterCreateSearch( search, regex, smart, caseInsensitive ) 33901 { 33902 search = regex ? 33903 search : 33904 _fnEscapeRegex( search ); 33905 33906 if ( smart ) { 33907 /* For smart filtering we want to allow the search to work regardless of 33908 * word order. We also want double quoted text to be preserved, so word 33909 * order is important - a la google. So this is what we want to 33910 * generate: 33911 * 33912 * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$ 33913 */ 33914 var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) { 33915 if ( word.charAt(0) === '"' ) { 33916 var m = word.match( /^"(.*)"$/ ); 33917 word = m ? m[1] : word; 33918 } 33919 33920 return word.replace('"', ''); 33921 } ); 33922 33923 search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$'; 33924 } 33925 33926 return new RegExp( search, caseInsensitive ? 'i' : '' ); 33927 } 33928 33929 33930 /** 33931 * Escape a string such that it can be used in a regular expression 33932 * @param {string} sVal string to escape 33933 * @returns {string} escaped string 33934 * @memberof DataTable#oApi 33935 */ 33936 function _fnEscapeRegex ( sVal ) 33937 { 33938 return sVal.replace( _re_escape_regex, '\\$1' ); 33939 } 33940 33941 33942
33943 var __filter_div = $('<div>')[0]; 33944 var __filter_div_textContent = __filter_div.textContent !== undefined; 33945 33946 // Update the filtering data for each row if needed (by invalidation or first run) 33947 function _fnFilterData ( settings ) 33948 { 33949 var columns = settings.aoColumns; 33950 var column; 33951 var i, j, ien, jen, filterData, cellData, row; 33952 var fomatters = DataTable.ext.type.search; 33953 var wasInvalidated = false; 33954 33955 for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) { 33956 row = settings.aoData[i]; 33957 33958 if ( ! row._aFilterData ) { 33959 filterData = []; 33960 33961 for ( j=0, jen=columns.length ; j<jen ; j++ ) { 33962 column = columns[j]; 33963 33964 if ( column.bSearchable ) { 33965 cellData = _fnGetCellData( settings, i, j, 'filter' ); 33966 33967 if ( fomatters[ column.sType ] ) { 33968 cellData = fomatters[ column.sType ]( cellData ); 33969 } 33970 33971 // Search in DataTables 1.10 is string based. In 1.11 this 33972 // should be altered to also allow strict type checking. 33973 if ( cellData === null ) { 33974 cellData = ''; 33975 } 33976 33977 if ( typeof cellData !== 'string' && cellData.toString ) { 33978 cellData = cellData.toString(); 33979 } 33980 } 33981 else { 33982 cellData = ''; 33983 } 33984 33985 // If it looks like there is an HTML entity in the string, 33986 // attempt to decode it so sorting works as expected. Note that 33987 // we could use a single line of jQuery to do this, but the DOM 33988 // method used here is much faster http://jsperf.com/html-decode 33989 if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) { 33990 __filter_div.innerHTML = cellData; 33991 cellData = __filter_div_textContent ? 33992 __filter_div.textContent : 33993 __filter_div.innerText; 33994 } 33995 33996 if ( cellData.replace ) { 33997 cellData = cellData.replace(/[\r\n]/g, ''); 33998 } 33999 34000 filterData.push( cellData ); 34001 } 34002 34003 row._aFilterData = filterData; 34004 row._sFilterRow = filterData.join(' '); 34005 wasInvalidated = true; 34006 } 34007 } 34008 34009 return wasInvalidated; 34010 } 34011 34012 34013 /** 34014 * Convert from the internal Hungarian notation to camelCase for external 34015 * interaction 34016 * @param {object} obj Object to convert 34017 * @returns {object} Inverted object 34018 * @memberof DataTable#oApi 34019 */ 34020 function _fnSearchToCamel ( obj ) 34021 { 34022 return { 34023 search: obj.sSearch, 34024 smart: obj.bSmart, 34025 regex: obj.bRegex, 34026 caseInsensitive: obj.bCaseInsensitive 34027 }; 34028 } 34029 34030 34031 34032 /** 34033 * Convert from camelCase notation to the internal Hungarian. We could use the 34034 * Hungarian convert function here, but this is cleaner 34035 * @param {object} obj Object to convert 34036 * @returns {object} Inverted object 34037 * @memberof DataTable#oApi 34038 */ 34039 function _fnSearchToHung ( obj ) 34040 { 34041 return { 34042 sSearch: obj.search, 34043 bSmart: obj.smart, 34044 bRegex: obj.regex, 34045 bCaseInsensitive: obj.caseInsensitive 34046 }; 34047 } 34048 34049 /** 34050 * Generate the node required for the info display 34051 * @param {object} oSettings dataTables settings object 34052 * @returns {node} Information element 34053 * @memberof DataTable#oApi 34054 */ 34055 function _fnFeatureHtmlInfo ( settings ) 34056 { 34057 var 34058 tid = settings.sTableId, 34059 nodes = settings.aanFeatures.i, 34060 n = $('<div/>', { 34061 'class': settings.oClasses.sInfo, 34062 'id': ! nodes ? tid+'_info' : null 34063 } ); 34064 34065 if ( ! nodes ) { 34066 // Update display on each draw 34067 settings.aoDrawCallback.push( { 34068 "fn": _fnUpdateInfo, 34069 "sName": "information" 34070 } ); 34071 34072 n 34073 .attr( 'role', 'status' ) 34074 .attr( 'aria-live', 'polite' ); 34075 34076 // Table is described by our info div 34077 $(settings.nTable).attr( 'aria-describedby', tid+'_info' ); 34078 } 34079 34080 return n[0]; 34081 } 34082 34083 34084 /** 34085 * Update the information elements in the display 34086 * @param {object} settings dataTables settings object 34087 * @memberof DataTable#oApi 34088 */ 34089 function _fnUpdateInfo ( settings ) 34090 { 34091 /* Show information about the table */ 34092 var nodes = settings.aanFeatures.i; 34093 if ( nodes.length === 0 ) { 34094 return; 34095 } 34096 34097 var 34098 lang = settings.oLanguage, 34099 start = settings._iDisplayStart+1, 34100 end = settings.fnDisplayEnd(), 34101 max = settings.fnRecordsTotal(), 34102 total = settings.fnRecordsDisplay(), 34103 out = total ? 34104 lang.sInfo : 34105 lang.sInfoEmpty; 34106 34107 if ( total !== max ) { 34108 /* Record set after filtering */ 34109 out += ' ' + lang.sInfoFiltered; 34110 } 34111 34112 // Convert the macros 34113 out += lang.sInfoPostFix; 34114 out = _fnInfoMacros( settings, out ); 34115 34116 var callback = lang.fnInfoCallback; 34117 if ( callback !== null ) { 34118 out = callback.call( settings.oInstance, 34119 settings, start, end, max, total, out 34120 ); 34121 } 34122 34123 $(nodes).html( out ); 34124 } 34125 34126 34127 function _fnInfoMacros ( settings, str ) 34128 { 34129 // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only 34130 // internally 34131 var
34132 formatter = settings.fnFormatNumber, 34133 start = settings._iDisplayStart+1, 34134 len = settings._iDisplayLength, 34135 vis = settings.fnRecordsDisplay(), 34136 all = len === -1; 34137 34138 return str. 34139 replace(/_START_/g, formatter.call( settings, start ) ). 34140 replace(/_END_/g, formatter.call( settings, settings.fnDisplayEnd() ) ). 34141 replace(/_MAX_/g, formatter.call( settings, settings.fnRecordsTotal() ) ). 34142 replace(/_TOTAL_/g, formatter.call( settings, vis ) ). 34143 replace(/_PAGE_/g, formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ). 34144 replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) ); 34145 } 34146 34147 34148 34149 /** 34150 * Draw the table for the first time, adding all required features 34151 * @param {object} settings dataTables settings object 34152 * @memberof DataTable#oApi 34153 */ 34154 function _fnInitialise ( settings ) 34155 { 34156 var i, iLen, iAjaxStart=settings.iInitDisplayStart; 34157 var columns = settings.aoColumns, column; 34158 var features = settings.oFeatures; 34159 var deferLoading = settings.bDeferLoading; // value modified by the draw 34160 34161 /* Ensure that the table data is fully initialised */ 34162 if ( ! settings.bInitialised ) { 34163 setTimeout( function(){ _fnInitialise( settings ); }, 200 ); 34164 return; 34165 } 34166 34167 /* Show the display HTML options */ 34168 _fnAddOptionsHtml( settings ); 34169 34170 /* Build and draw the header / footer for the table */ 34171 _fnBuildHead( settings ); 34172 _fnDrawHead( settings, settings.aoHeader ); 34173 _fnDrawHead( settings, settings.aoFooter ); 34174 34175 /* Okay to show that something is going on now */ 34176 _fnProcessingDisplay( settings, true ); 34177 34178 /* Calculate sizes for columns */ 34179 if ( features.bAutoWidth ) { 34180 _fnCalculateColumnWidths( settings ); 34181 } 34182 34183 for ( i=0, iLen=columns.length ; i<iLen ; i++ ) { 34184 column = columns[i]; 34185 34186 if ( column.sWidth ) { 34187 column.nTh.style.width = _fnStringToCss( column.sWidth ); 34188 } 34189 } 34190 34191 _fnCallbackFire( settings, null, 'preInit', [settings] ); 34192 34193 // If there is default sorting required - let's do it. The sort function 34194 // will do the drawing for us. Otherwise we draw the table regardless of the 34195 // Ajax source - this allows the table to look initialised for Ajax sourcing 34196 // data (show 'loading' message possibly) 34197 _fnReDraw( settings ); 34198 34199 // Server-side processing init complete is done by _fnAjaxUpdateDraw 34200 var dataSrc = _fnDataSource( settings ); 34201 if ( dataSrc != 'ssp' || deferLoading ) { 34202 // if there is an ajax source load the data 34203 if ( dataSrc == 'ajax' ) { 34204 _fnBuildAjax( settings, [], function(json) { 34205 var aData = _fnAjaxDataSrc( settings, json ); 34206 34207 // Got the data - add it to the table 34208 for ( i=0 ; i<aData.length ; i++ ) { 34209 _fnAddData( settings, aData[i] ); 34210 } 34211 34212 // Reset the init display for cookie saving. We've already done 34213 // a filter, and therefore cleared it before. So we need to make 34214 // it appear 'fresh' 34215 settings.iInitDisplayStart = iAjaxStart; 34216 34217 _fnReDraw( settings ); 34218 34219 _fnProcessingDisplay( settings, false ); 34220 _fnInitComplete( settings, json ); 34221 }, settings ); 34222 } 34223 else { 34224 _fnProcessingDisplay( settings, false ); 34225 _fnInitComplete( settings ); 34226 } 34227 } 34228 } 34229 34230 34231 /** 34232 * Draw the table for the first time, adding all required features 34233 * @param {object} oSettings dataTables settings object 34234 * @param {object} [json] JSON from the server that completed the table, if using Ajax source 34235 * with client-side processing (optional) 34236 * @memberof DataTable#oApi 34237 */ 34238 function _fnInitComplete ( settings, json ) 34239 { 34240 settings._bInitComplete = true; 34241 34242 // When data was added after the initialisation (data or Ajax) we need to 34243 // calculate the column sizing 34244 if ( json || settings.oInit.aaData ) { 34245 _fnAdjustColumnSizing( settings ); 34246 } 34247 34248 _fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] ); 34249 } 34250 34251 34252 function _fnLengthChange ( settings, val ) 34253 { 34254 var len = parseInt( val, 10 ); 34255 settings._iDisplayLength = len; 34256 34257 _fnLengthOverflow( settings ); 34258 34259 // Fire length change event 34260 _fnCallbackFire( settings, null, 'length', [settings, len] ); 34261 } 34262 34263 34264 /** 34265 * Generate the node required for user display length changing 34266 * @param {object} settings dataTables settings object 34267 * @returns {node} Display length feature node 34268 * @memberof DataTable#oApi 34269 */ 34270 function _fnFeatureHtmlLength ( settings ) 34271 { 34272 var 34273 classes = settings.oClasses, 34274 tableId = settings.sTableId, 34275 menu = settings.aLengthMenu, 34276 d2 = $.isArray( menu[0] ), 34277 lengths = d2 ? menu[0] : menu, 34278 language = d2 ? menu[1] : menu; 34279 34280 var select = $('<select/>', { 34281 'name': tableId+'_length', 34282 'aria-controls': tableId, 34283 'class': classes.sLengthSelect 34284 } ); 34285 34286 for ( var i=0, ien=lengths.length ; i<ien ; i++ ) { 34287 select[0][ i ] = new Option( language[i], lengths[i] ); 34288 } 34289
34290 var div = $('<div><label/></div>').addClass( classes.sLength ); 34291 if ( ! settings.aanFeatures.l ) { 34292 div[0].id = tableId+'_length'; 34293 } 34294 34295 div.children().append( 34296 settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML ) 34297 ); 34298 34299 // Can't use `select` variable as user might provide their own and the 34300 // reference is broken by the use of outerHTML 34301 $('select', div) 34302 .val( settings._iDisplayLength ) 34303 .bind( 'change.DT', function(e) { 34304 _fnLengthChange( settings, $(this).val() ); 34305 _fnDraw( settings ); 34306 } ); 34307 34308 // Update node value whenever anything changes the table's length 34309 $(settings.nTable).bind( 'length.dt.DT', function (e, s, len) { 34310 if ( settings === s ) { 34311 $('select', div).val( len ); 34312 } 34313 } ); 34314 34315 return div[0]; 34316 } 34317 34318 34319 34320 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 34321 * Note that most of the paging logic is done in 34322 * DataTable.ext.pager 34323 */ 34324 34325 /** 34326 * Generate the node required for default pagination 34327 * @param {object} oSettings dataTables settings object 34328 * @returns {node} Pagination feature node 34329 * @memberof DataTable#oApi 34330 */ 34331 function _fnFeatureHtmlPaginate ( settings ) 34332 { 34333 var 34334 type = settings.sPaginationType, 34335 plugin = DataTable.ext.pager[ type ], 34336 modern = typeof plugin === 'function', 34337 redraw = function( settings ) { 34338 _fnDraw( settings ); 34339 }, 34340 node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0], 34341 features = settings.aanFeatures; 34342 34343 if ( ! modern ) { 34344 plugin.fnInit( settings, node, redraw ); 34345 } 34346 34347 /* Add a draw callback for the pagination on first instance, to update the paging display */ 34348 if ( ! features.p ) 34349 { 34350 node.id = settings.sTableId+'_paginate'; 34351 34352 settings.aoDrawCallback.push( { 34353 "fn": function( settings ) { 34354 if ( modern ) { 34355 var 34356 start = settings._iDisplayStart, 34357 len = settings._iDisplayLength, 34358 visRecords = settings.fnRecordsDisplay(), 34359 all = len === -1, 34360 page = all ? 0 : Math.ceil( start / len ), 34361 pages = all ? 1 : Math.ceil( visRecords / len ), 34362 buttons = plugin(page, pages), 34363 i, ien; 34364 34365 for ( i=0, ien=features.p.length ; i<ien ; i++ ) { 34366 _fnRenderer( settings, 'pageButton' )( 34367 settings, features.p[i], i, buttons, page, pages 34368 ); 34369 } 34370 } 34371 else { 34372 plugin.fnUpdate( settings, redraw ); 34373 } 34374 }, 34375 "sName": "pagination" 34376 } ); 34377 } 34378 34379 return node; 34380 } 34381 34382 34383 /** 34384 * Alter the display settings to change the page 34385 * @param {object} settings DataTables settings object 34386 * @param {string|int} action Paging action to take: "first", "previous", 34387 * "next" or "last" or page number to jump to (integer) 34388 * @param [bool] redraw Automatically draw the update or not 34389 * @returns {bool} true page has changed, false - no change 34390 * @memberof DataTable#oApi 34391 */ 34392 function _fnPageChange ( settings, action, redraw ) 34393 { 34394 var 34395 start = settings._iDisplayStart, 34396 len = settings._iDisplayLength, 34397 records = settings.fnRecordsDisplay(); 34398 34399 if ( records === 0 || len === -1 ) 34400 { 34401 start = 0; 34402 } 34403 else if ( typeof action === "number" ) 34404 { 34405 start = action * len; 34406 34407 if ( start > records ) 34408 { 34409 start = 0; 34410 } 34411 } 34412 else if ( action == "first" ) 34413 { 34414 start = 0; 34415 } 34416 else if ( action == "previous" ) 34417 { 34418 start = len >= 0 ? 34419 start - len : 34420 0; 34421 34422 if ( start < 0 ) 34423 { 34424 start = 0; 34425 } 34426 } 34427 else if ( action == "next" ) 34428 { 34429 if ( start + len < records ) 34430 { 34431 start += len; 34432 } 34433 } 34434 else if ( action == "last" ) 34435 { 34436 start = Math.floor( (records-1) / len) * len; 34437 } 34438 else 34439 { 34440 _fnLog( settings, 0, "Unknown paging action: "+action, 5 ); 34441 } 34442 34443 var changed = settings._iDisplayStart !== start; 34444 settings._iDisplayStart = start; 34445 34446 if ( changed ) { 34447 _fnCallbackFire( settings, null, 'page', [settings] ); 34448 34449 if ( redraw ) { 34450 _fnDraw( settings ); 34451 } 34452 } 34453 34454 return changed; 34455 } 34456 34457 34458 34459 /** 34460 * Generate the node required for the processing node 34461 * @param {object} settings dataTables settings object 34462 * @returns {node} Processing element 34463 * @memberof DataTable#oApi 34464 */ 34465 function _fnFeatureHtmlProcessing ( settings ) 34466 { 34467 return $('<div/>', { 34468 'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null, 34469 'class': settings.oClasses.sProcessing 34470 } ) 34471 .html( settings.oLanguage.sProcessing ) 34472 .insertBefore( settings.nTable )[0]; 34473 } 34474 34475 34476 /** 34477 * Display or hide the processing indicator 34478 * @param {object} settings dataTables settings object 34479 * @param {bool} show Show the processing indicator (true) or not (false) 34480 * @memberof DataTable#oApi 34481 */ 34482 function _fnProcessingDisplay ( settings, show ) 34483 { 34484 if ( settings.oFeatures.bProcessing ) { 34485 $(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' ); 34486 } 34487 34488 _fnCallbackFire( settings, null, 'processing', [settings, show] ); 34489 } 34490 34491 /** 34492 * Add any control elements for the table - specifically scrolling 34493 * @param {object} settings dataTables settings object 34494 * @returns {node} Node to add to the DOM 34495 * @memberof DataTable#oApi 34496 */ 34497 function _fnFeatureHtmlTable ( settings ) 34498 { 34499 var table = $(settings.nTable); 34500 34501 // Add the ARIA grid role to the table 34502 table.attr( 'role', 'grid' ); 34503 34504 // Scrolling from here on in 34505 var scroll = settings.oScroll; 34506
34507 if ( scroll.sX === '' && scroll.sY === '' ) { 34508 return settings.nTable; 34509 } 34510 34511 var scrollX = scroll.sX; 34512 var scrollY = scroll.sY; 34513 var classes = settings.oClasses; 34514 var caption = table.children('caption'); 34515 var captionSide = caption.length ? caption[0]._captionSide : null; 34516 var headerClone = $( table[0].cloneNode(false) ); 34517 var footerClone = $( table[0].cloneNode(false) ); 34518 var footer = table.children('tfoot'); 34519 var _div = '<div/>'; 34520 var size = function ( s ) { 34521 return !s ? null : _fnStringToCss( s ); 34522 }; 34523 34524 // This is fairly messy, but with x scrolling enabled, if the table has a 34525 // width attribute, regardless of any width applied using the column width 34526 // options, the browser will shrink or grow the table as needed to fit into 34527 // that 100%. That would make the width options useless. So we remove it. 34528 // This is okay, under the assumption that width:100% is applied to the 34529 // table in CSS (it is in the default stylesheet) which will set the table 34530 // width as appropriate (the attribute and css behave differently...) 34531 if ( scroll.sX && table.attr('width') === '100%' ) { 34532 table.removeAttr('width'); 34533 } 34534 34535 if ( ! footer.length ) { 34536 footer = null; 34537 } 34538 34539 /* 34540 * The HTML structure that we want to generate in this function is: 34541 * div - scroller 34542 * div - scroll head 34543 * div - scroll head inner 34544 * table - scroll head table 34545 * thead - thead 34546 * div - scroll body 34547 * table - table (master table) 34548 * thead - thead clone for sizing 34549 * tbody - tbody 34550 * div - scroll foot 34551 * div - scroll foot inner 34552 * table - scroll foot table 34553 * tfoot - tfoot 34554 */ 34555 var scroller = $( _div, { 'class': classes.sScrollWrapper } ) 34556 .append( 34557 $(_div, { 'class': classes.sScrollHead } ) 34558 .css( { 34559 overflow: 'hidden', 34560 position: 'relative', 34561 border: 0, 34562 width: scrollX ? size(scrollX) : '100%' 34563 } ) 34564 .append( 34565 $(_div, { 'class': classes.sScrollHeadInner } ) 34566 .css( { 34567 'box-sizing': 'content-box', 34568 width: scroll.sXInner || '100%' 34569 } ) 34570 .append( 34571 headerClone 34572 .removeAttr('id') 34573 .css( 'margin-left', 0 ) 34574 .append( captionSide === 'top' ? caption : null ) 34575 .append( 34576 table.children('thead') 34577 ) 34578 ) 34579 ) 34580 ) 34581 .append( 34582 $(_div, { 'class': classes.sScrollBody } ) 34583 .css( { 34584 position: 'relative', 34585 overflow: 'auto', 34586 width: size( scrollX ) 34587 } ) 34588 .append( table ) 34589 ); 34590 34591 if ( footer ) { 34592 scroller.append( 34593 $(_div, { 'class': classes.sScrollFoot } ) 34594 .css( { 34595 overflow: 'hidden', 34596 border: 0, 34597 width: scrollX ? size(scrollX) : '100%' 34598 } ) 34599 .append( 34600 $(_div, { 'class': classes.sScrollFootInner } ) 34601 .append( 34602 footerClone 34603 .removeAttr('id') 34604 .css( 'margin-left', 0 ) 34605 .append( captionSide === 'bottom' ? caption : null ) 34606 .append( 34607 table.children('tfoot') 34608 ) 34609 ) 34610 ) 34611 ); 34612 } 34613 34614 var children = scroller.children(); 34615 var scrollHead = children[0]; 34616 var scrollBody = children[1]; 34617 var scrollFoot = footer ? children[2] : null; 34618 34619 // When the body is scrolled, then we also want to scroll the headers 34620 if ( scrollX ) { 34621 $(scrollBody).on( 'scroll.DT', function (e) { 34622 var scrollLeft = this.scrollLeft; 34623 34624 scrollHead.scrollLeft = scrollLeft; 34625 34626 if ( footer ) { 34627 scrollFoot.scrollLeft = scrollLeft; 34628 } 34629 } ); 34630 } 34631 34632 $(scrollBody).css( 34633 scrollY && scroll.bCollapse ? 'max-height' : 'height', 34634 scrollY 34635 ); 34636 34637 settings.nScrollHead = scrollHead; 34638 settings.nScrollBody = scrollBody; 34639 settings.nScrollFoot = scrollFoot; 34640 34641 // On redraw - align columns 34642 settings.aoDrawCallback.push( { 34643 "fn": _fnScrollDraw, 34644 "sName": "scrolling" 34645 } ); 34646 34647 return scroller[0]; 34648 } 34649 34650 34651 34652 /** 34653 * Update the header, footer and body tables for resizing - i.e. column 34654 * alignment. 34655 * 34656 * Welcome to the most horrible function DataTables. The process that this 34657 * function follows is basically: 34658 * 1. Re-create the table inside the scrolling div 34659 * 2. Take live measurements from the DOM 34660 * 3. Apply the measurements to align the columns 34661 * 4. Clean up 34662 * 34663 * @param {object} settings dataTables settings object 34664 * @memberof DataTable#oApi 34665 */ 34666 function _fnScrollDraw ( settings ) 34667 { 34668 // Given that this is such a monster function, a lot of variables are use 34669 // to try and keep the minimised size as small as possible 34670 var 34671 scroll = settings.oScroll, 34672 scrollX = scroll.sX, 34673 scrollXInner = scroll.sXInner, 34674 scrollY = scroll.sY, 34675 barWidth = scroll.iBarWidth, 34676 divHeader = $(settings.nScrollHead), 34677 divHeaderStyle = divHeader[0].style, 34678 divHeaderInner = divHeader.children('div'), 34679 divHeaderInnerStyle = divHeaderInner[0].style, 34680 divHeaderTable = divHeaderInner.children('table'), 34681 divBodyEl = settings.nScrollBody,
34682 divBody = $(divBodyEl), 34683 divBodyStyle = divBodyEl.style, 34684 divFooter = $(settings.nScrollFoot), 34685 divFooterInner = divFooter.children('div'), 34686 divFooterTable = divFooterInner.children('table'), 34687 header = $(settings.nTHead), 34688 table = $(settings.nTable), 34689 tableEl = table[0], 34690 tableStyle = tableEl.style, 34691 footer = settings.nTFoot ? $(settings.nTFoot) : null, 34692 browser = settings.oBrowser, 34693 ie67 = browser.bScrollOversize, 34694 headerTrgEls, footerTrgEls, 34695 headerSrcEls, footerSrcEls, 34696 headerCopy, footerCopy, 34697 headerWidths=[], footerWidths=[], 34698 headerContent=[], 34699 idx, correction, sanityWidth, 34700 zeroOut = function(nSizer) { 34701 var style = nSizer.style; 34702 style.paddingTop = "0"; 34703 style.paddingBottom = "0"; 34704 style.borderTopWidth = "0"; 34705 style.borderBottomWidth = "0"; 34706 style.height = 0; 34707 }; 34708 34709 /* 34710 * 1. Re-create the table inside the scrolling div 34711 */ 34712 34713 // Remove the old minimised thead and tfoot elements in the inner table 34714 table.children('thead, tfoot').remove(); 34715 34716 // Clone the current header and footer elements and then place it into the inner table 34717 headerCopy = header.clone().prependTo( table ); 34718 headerTrgEls = header.find('tr'); // original header is in its own table 34719 headerSrcEls = headerCopy.find('tr'); 34720 headerCopy.find('th, td').removeAttr('tabindex'); 34721 34722 if ( footer ) { 34723 footerCopy = footer.clone().prependTo( table ); 34724 footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized 34725 footerSrcEls = footerCopy.find('tr'); 34726 } 34727 34728 34729 /* 34730 * 2. Take live measurements from the DOM - do not alter the DOM itself! 34731 */ 34732 34733 // Remove old sizing and apply the calculated column widths 34734 // Get the unique column headers in the newly created (cloned) header. We want to apply the 34735 // calculated sizes to this header 34736 if ( ! scrollX ) 34737 { 34738 divBodyStyle.width = '100%'; 34739 divHeader[0].style.width = '100%'; 34740 } 34741 34742 $.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) { 34743 idx = _fnVisibleToColumnIndex( settings, i ); 34744 el.style.width = settings.aoColumns[idx].sWidth; 34745 } ); 34746 34747 if ( footer ) { 34748 _fnApplyToChildren( function(n) { 34749 n.style.width = ""; 34750 }, footerSrcEls ); 34751 } 34752 34753 // Size the table as a whole 34754 sanityWidth = table.outerWidth(); 34755 if ( scrollX === "" ) { 34756 // No x scrolling 34757 tableStyle.width = "100%"; 34758 34759 // IE7 will make the width of the table when 100% include the scrollbar 34760 // - which is shouldn't. When there is a scrollbar we need to take this 34761 // into account. 34762 if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight || 34763 divBody.css('overflow-y') == "scroll") 34764 ) { 34765 tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth); 34766 } 34767 34768 // Recalculate the sanity width 34769 sanityWidth = table.outerWidth(); 34770 } 34771 else if ( scrollXInner !== "" ) { 34772 // legacy x scroll inner has been given - use it 34773 tableStyle.width = _fnStringToCss(scrollXInner); 34774 34775 // Recalculate the sanity width 34776 sanityWidth = table.outerWidth(); 34777 } 34778 34779 // Hidden header should have zero height, so remove padding and borders. Then 34780 // set the width based on the real headers 34781 34782 // Apply all styles in one pass 34783 _fnApplyToChildren( zeroOut, headerSrcEls ); 34784 34785 // Read all widths in next pass 34786 _fnApplyToChildren( function(nSizer) { 34787 headerContent.push( nSizer.innerHTML ); 34788 headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) ); 34789 }, headerSrcEls ); 34790 34791 // Apply all widths in final pass 34792 _fnApplyToChildren( function(nToSize, i) { 34793 nToSize.style.width = headerWidths[i]; 34794 }, headerTrgEls ); 34795 34796 $(headerSrcEls).height(0); 34797 34798 /* Same again with the footer if we have one */ 34799 if ( footer ) 34800 { 34801 _fnApplyToChildren( zeroOut, footerSrcEls ); 34802 34803 _fnApplyToChildren( function(nSizer) { 34804 footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) ); 34805 }, footerSrcEls ); 34806 34807 _fnApplyToChildren( function(nToSize, i) { 34808 nToSize.style.width = footerWidths[i]; 34809 }, footerTrgEls ); 34810 34811 $(footerSrcEls).height(0); 34812 } 34813 34814 34815 /* 34816 * 3. Apply the measurements 34817 */ 34818 34819 // "Hide" the header and footer that we used for the sizing. We need to keep 34820 // the content of the cell so that the width applied to the header and body 34821 // both match, but we want to hide it completely. We want to also fix their 34822 // width to what they currently are 34823 _fnApplyToChildren( function(nSizer, i) { 34824 nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+headerContent[i]+'</div>'; 34825 nSizer.style.width = headerWidths[i]; 34826 }, headerSrcEls ); 34827 34828 if ( footer ) 34829 { 34830 _fnApplyToChildren( function(nSizer, i) { 34831 nSizer.innerHTML = "";
34832 nSizer.style.width = footerWidths[i]; 34833 }, footerSrcEls ); 34834 } 34835 34836 // Sanity check that the table is of a sensible width. If not then we are going to get 34837 // misalignment - try to prevent this by not allowing the table to shrink below its min width 34838 if ( table.outerWidth() < sanityWidth ) 34839 { 34840 // The min width depends upon if we have a vertical scrollbar visible or not */ 34841 correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight || 34842 divBody.css('overflow-y') == "scroll")) ? 34843 sanityWidth+barWidth : 34844 sanityWidth; 34845 34846 // IE6/7 are a law unto themselves... 34847 if ( ie67 && (divBodyEl.scrollHeight > 34848 divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll") 34849 ) { 34850 tableStyle.width = _fnStringToCss( correction-barWidth ); 34851 } 34852 34853 // And give the user a warning that we've stopped the table getting too small 34854 if ( scrollX === "" || scrollXInner !== "" ) { 34855 _fnLog( settings, 1, 'Possible column misalignment', 6 ); 34856 } 34857 } 34858 else 34859 { 34860 correction = '100%'; 34861 } 34862 34863 // Apply to the container elements 34864 divBodyStyle.width = _fnStringToCss( correction ); 34865 divHeaderStyle.width = _fnStringToCss( correction ); 34866 34867 if ( footer ) { 34868 settings.nScrollFoot.style.width = _fnStringToCss( correction ); 34869 } 34870 34871 34872 /* 34873 * 4. Clean up 34874 */ 34875 if ( ! scrollY ) { 34876 /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting 34877 * the scrollbar height from the visible display, rather than adding it on. We need to 34878 * set the height in order to sort this. Don't want to do it in any other browsers. 34879 */ 34880 if ( ie67 ) { 34881 divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth ); 34882 } 34883 } 34884 34885 /* Finally set the width's of the header and footer tables */ 34886 var iOuterWidth = table.outerWidth(); 34887 divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth ); 34888 divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth ); 34889 34890 // Figure out if there are scrollbar present - if so then we need a the header and footer to 34891 // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar) 34892 var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll"; 34893 var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' ); 34894 divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px"; 34895 34896 if ( footer ) { 34897 divFooterTable[0].style.width = _fnStringToCss( iOuterWidth ); 34898 divFooterInner[0].style.width = _fnStringToCss( iOuterWidth ); 34899 divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px"; 34900 } 34901 34902 /* Adjust the position of the header in case we loose the y-scrollbar */ 34903 divBody.scroll(); 34904 34905 // If sorting or filtering has occurred, jump the scrolling back to the top 34906 // only if we aren't holding the position 34907 if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) { 34908 divBodyEl.scrollTop = 0; 34909 } 34910 } 34911 34912 34913 34914 /** 34915 * Apply a given function to the display child nodes of an element array (typically 34916 * TD children of TR rows 34917 * @param {function} fn Method to apply to the objects 34918 * @param array {nodes} an1 List of elements to look through for display children 34919 * @param array {nodes} an2 Another list (identical structure to the first) - optional 34920 * @memberof DataTable#oApi 34921 */ 34922 function _fnApplyToChildren( fn, an1, an2 ) 34923 { 34924 var index=0, i=0, iLen=an1.length; 34925 var nNode1, nNode2; 34926 34927 while ( i < iLen ) { 34928 nNode1 = an1[i].firstChild; 34929 nNode2 = an2 ? an2[i].firstChild : null; 34930 34931 while ( nNode1 ) { 34932 if ( nNode1.nodeType === 1 ) { 34933 if ( an2 ) { 34934 fn( nNode1, nNode2, index ); 34935 } 34936 else { 34937 fn( nNode1, index ); 34938 } 34939 34940 index++; 34941 } 34942 34943 nNode1 = nNode1.nextSibling; 34944 nNode2 = an2 ? nNode2.nextSibling : null; 34945 } 34946 34947 i++; 34948 } 34949 } 34950 34951 34952 34953 var __re_html_remove = /<.*?>/g; 34954 34955 34956 /** 34957 * Calculate the width of columns for the table 34958 * @param {object} oSettings dataTables settings object 34959 * @memberof DataTable#oApi 34960 */ 34961 function _fnCalculateColumnWidths ( oSettings ) 34962 { 34963 var 34964 table = oSettings.nTable, 34965 columns = oSettings.aoColumns, 34966 scroll = oSettings.oScroll, 34967 scrollY = scroll.sY, 34968 scrollX = scroll.sX, 34969 scrollXInner = scroll.sXInner, 34970 columnCount = columns.length, 34971 visibleColumns = _fnGetColumns( oSettings, 'bVisible' ), 34972 headerCells = $('th', oSettings.nTHead), 34973 tableWidthAttr = table.getAttribute('width'), // from DOM element 34974 tableContainer = table.parentNode, 34975 userInputs = false, 34976 i, column, columnIdx, width, outerWidth, 34977 browser = oSettings.oBrowser, 34978 ie67 = browser.bScrollOversize; 34979 34980 var styleWidth = table.style.width; 34981 if ( styleWidth && styleWidth.indexOf('%') !== -1 ) { 34982 tableWidthAttr = styleWidth; 34983 } 34984 34985 /* Convert any user input sizes into pixel sizes */ 34986 for ( i=0 ; i<visibleColumns.length ; i++ ) { 34987 column = columns[ visibleColumns[i] ]; 34988 34989 if ( column.sWidth !== null ) { 34990 column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer ); 34991 34992 userInputs = true; 34993 } 34994 } 34995 34996 /* If the number of columns in the DOM equals the number that we have to 34997 * process in DataTables, then we can use the offsets that are created by 34998 * the web- browser. No custom sizes can be set in order for this to happen, 34999 * nor scrolling used 35000 */ 35001 if ( ie67 || ! userInputs && ! scrollX && ! scrollY && 35002 columnCount == _fnVisbleColumns( oSettings ) && 35003 columnCount == headerCells.length 35004 ) { 35005 for ( i=0 ; i<columnCount ; i++ ) { 35006 var colIdx = _fnVisibleToColumnIndex( oSettings, i ); 35007 35008 if ( colIdx ) { 35009 columns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() ); 35010 } 35011 } 35012 } 35013 else 35014 { 35015 // Otherwise construct a single row, worst case, table with the widest 35016 // node in the data, assign any user defined widths, then insert it into
35017 // the DOM and allow the browser to do all the hard work of calculating 35018 // table widths 35019 var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table 35020 .css( 'visibility', 'hidden' ) 35021 .removeAttr( 'id' ); 35022 35023 // Clean up the table body 35024 tmpTable.find('tbody tr').remove(); 35025 var tr = $('<tr/>').appendTo( tmpTable.find('tbody') ); 35026 35027 // Clone the table header and footer - we can't use the header / footer 35028 // from the cloned table, since if scrolling is active, the table's 35029 // real header and footer are contained in different table tags 35030 tmpTable.find('thead, tfoot').remove(); 35031 tmpTable 35032 .append( $(oSettings.nTHead).clone() ) 35033 .append( $(oSettings.nTFoot).clone() ); 35034 35035 // Remove any assigned widths from the footer (from scrolling) 35036 tmpTable.find('tfoot th, tfoot td').css('width', ''); 35037 35038 // Apply custom sizing to the cloned header 35039 headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] ); 35040 35041 for ( i=0 ; i<visibleColumns.length ; i++ ) { 35042 column = columns[ visibleColumns[i] ]; 35043 35044 headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ? 35045 _fnStringToCss( column.sWidthOrig ) : 35046 ''; 35047 } 35048 35049 // Find the widest cell for each column and put it into the table 35050 if ( oSettings.aoData.length ) { 35051 for ( i=0 ; i<visibleColumns.length ; i++ ) { 35052 columnIdx = visibleColumns[i]; 35053 column = columns[ columnIdx ]; 35054 35055 $( _fnGetWidestNode( oSettings, columnIdx ) ) 35056 .clone( false ) 35057 .append( column.sContentPadding ) 35058 .appendTo( tr ); 35059 } 35060 } 35061 35062 // Table has been built, attach to the document so we can work with it. 35063 // A holding element is used, positioned at the top of the container 35064 // with minimal height, so it has no effect on if the container scrolls 35065 // or not. Otherwise it might trigger scrolling when it actually isn't 35066 // needed 35067 var holder = $('<div/>').css( scrollX || scrollY ? 35068 { 35069 position: 'absolute', 35070 top: 0, 35071 left: 0, 35072 height: 1, 35073 right: 0, 35074 overflow: 'hidden' 35075 } : 35076 {} 35077 ) 35078 .append( tmpTable ) 35079 .appendTo( tableContainer ); 35080 35081 // When scrolling (X or Y) we want to set the width of the table as 35082 // appropriate. However, when not scrolling leave the table width as it 35083 // is. This results in slightly different, but I think correct behaviour 35084 if ( scrollX && scrollXInner ) { 35085 tmpTable.width( scrollXInner ); 35086 } 35087 else if ( scrollX ) { 35088 tmpTable.css( 'width', 'auto' ); 35089 35090 if ( tmpTable.width() < tableContainer.clientWidth ) { 35091 tmpTable.width( tableContainer.clientWidth ); 35092 } 35093 } 35094 else if ( scrollY ) { 35095 tmpTable.width( tableContainer.clientWidth ); 35096 } 35097 else if ( tableWidthAttr ) { 35098 tmpTable.width( tableWidthAttr ); 35099 } 35100 35101 // Browsers need a bit of a hand when a width is assigned to any columns 35102 // when x-scrolling as they tend to collapse the table to the min-width, 35103 // even if we sent the column widths. So we need to keep track of what 35104 // the table width should be by summing the user given values, and the 35105 // automatic values 35106 if ( scrollX ) 35107 { 35108 var total = 0; 35109 35110 for ( i=0 ; i<visibleColumns.length ; i++ ) { 35111 column = columns[ visibleColumns[i] ]; 35112 35113 // Much prefer to use getBoundingClientRect due to its sub-pixel 35114 // resolution, but IE8- do not support the width property. 35115 outerWidth = browser.bBounding ? 35116 headerCells[i].getBoundingClientRect().width : 35117 $(headerCells[i]).outerWidth(); 35118 35119 total += column.sWidthOrig === null ? 35120 outerWidth : 35121 parseInt( column.sWidth, 10 ) + outerWidth - $(headerCells[i]).width(); 35122 } 35123 35124 tmpTable.width( _fnStringToCss( total ) ); 35125 table.style.width = _fnStringToCss( total ); 35126 } 35127 35128 // Get the width of each column in the constructed table 35129 for ( i=0 ; i<visibleColumns.length ; i++ ) { 35130 column = columns[ visibleColumns[i] ]; 35131 width = $(headerCells[i]).width(); 35132 35133 if ( width ) { 35134 column.sWidth = _fnStringToCss( width ); 35135 } 35136 } 35137 35138 table.style.width = _fnStringToCss( tmpTable.css('width') ); 35139
35140 // Finished with the table - ditch it 35141 holder.remove(); 35142 } 35143 35144 // If there is a width attr, we want to attach an event listener which 35145 // allows the table sizing to automatically adjust when the window is 35146 // resized. Use the width attr rather than CSS, since we can't know if the 35147 // CSS is a relative value or absolute - DOM read is always px. 35148 if ( tableWidthAttr ) { 35149 table.style.width = _fnStringToCss( tableWidthAttr ); 35150 } 35151 35152 if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) { 35153 var bindResize = function () { 35154 $(window).bind('resize.DT-'+oSettings.sInstance, _fnThrottle( function () { 35155 _fnAdjustColumnSizing( oSettings ); 35156 } ) ); 35157 }; 35158 35159 // IE6/7 will crash if we bind a resize event handler on page load. 35160 // To be removed in 1.11 which drops IE6/7 support 35161 if ( ie67 ) { 35162 setTimeout( bindResize, 1000 ); 35163 } 35164 else { 35165 bindResize(); 35166 } 35167 35168 oSettings._reszEvt = true; 35169 } 35170 } 35171 35172 35173 /** 35174 * Throttle the calls to a function. Arguments and context are maintained for 35175 * the throttled function 35176 * @param {function} fn Function to be called 35177 * @param {int} [freq=200] call frequency in mS 35178 * @returns {function} wrapped function 35179 * @memberof DataTable#oApi 35180 */ 35181 function _fnThrottle( fn, freq ) { 35182 var 35183 frequency = freq !== undefined ? freq : 200, 35184 last, 35185 timer; 35186 35187 return function () { 35188 var 35189 that = this, 35190 now = +new Date(), 35191 args = arguments; 35192 35193 if ( last && now < last + frequency ) { 35194 clearTimeout( timer ); 35195 35196 timer = setTimeout( function () { 35197 last = undefined; 35198 fn.apply( that, args ); 35199 }, frequency ); 35200 } 35201 else { 35202 last = now; 35203 fn.apply( that, args ); 35204 } 35205 }; 35206 } 35207 35208 35209 /** 35210 * Convert a CSS unit width to pixels (e.g. 2em) 35211 * @param {string} width width to be converted 35212 * @param {node} parent parent to get the with for (required for relative widths) - optional 35213 * @returns {int} width in pixels 35214 * @memberof DataTable#oApi 35215 */ 35216 function _fnConvertToWidth ( width, parent ) 35217 { 35218 if ( ! width ) { 35219 return 0; 35220 } 35221 35222 var n = $('<div/>') 35223 .css( 'width', _fnStringToCss( width ) ) 35224 .appendTo( parent || document.body ); 35225 35226 var val = n[0].offsetWidth; 35227 n.remove(); 35228 35229 return val; 35230 } 35231 35232 35233 /** 35234 * Get the widest node 35235 * @param {object} settings dataTables settings object 35236 * @param {int} colIdx column of interest 35237 * @returns {node} widest table node 35238 * @memberof DataTable#oApi 35239 */ 35240 function _fnGetWidestNode( settings, colIdx ) 35241 { 35242 var idx = _fnGetMaxLenString( settings, colIdx ); 35243 if ( idx < 0 ) { 35244 return null; 35245 } 35246 35247 var data = settings.aoData[ idx ]; 35248 return ! data.nTr ? // Might not have been created when deferred rendering 35249 $('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] : 35250 data.anCells[ colIdx ]; 35251 } 35252 35253 35254 /** 35255 * Get the maximum strlen for each data column 35256 * @param {object} settings dataTables settings object 35257 * @param {int} colIdx column of interest 35258 * @returns {string} max string length for each column 35259 * @memberof DataTable#oApi 35260 */ 35261 function _fnGetMaxLenString( settings, colIdx ) 35262 { 35263 var s, max=-1, maxIdx = -1; 35264 35265 for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) { 35266 s = _fnGetCellData( settings, i, colIdx, 'display' )+''; 35267 s = s.replace( __re_html_remove, '' ); 35268 35269 if ( s.length > max ) { 35270 max = s.length; 35271 maxIdx = i; 35272 } 35273 } 35274 35275 return maxIdx; 35276 } 35277 35278 35279 /** 35280 * Append a CSS unit (only if required) to a string 35281 * @param {string} value to css-ify 35282 * @returns {string} value with css unit 35283 * @memberof DataTable#oApi 35284 */ 35285 function _fnStringToCss( s ) 35286 { 35287 if ( s === null ) { 35288 return '0px'; 35289 } 35290 35291 if ( typeof s == 'number' ) { 35292 return s < 0 ? 35293 '0px' : 35294 s+'px'; 35295 } 35296 35297 // Check it has a unit character already 35298 return s.match(/\d$/) ? 35299 s+'px' : 35300 s; 35301 } 35302 35303 35304 35305 function _fnSortFlatten ( settings ) 35306 { 35307 var 35308 i, iLen, k, kLen, 35309 aSort = [], 35310 aiOrig = [], 35311 aoColumns = settings.aoColumns, 35312 aDataSort, iCol, sType, srcCol, 35313 fixed = settings.aaSortingFixed, 35314 fixedObj = $.isPlainObject( fixed ), 35315 nestedSort = [], 35316 add = function ( a ) { 35317 if ( a.length && ! $.isArray( a[0] ) ) { 35318 // 1D array 35319 nestedSort.push( a ); 35320 } 35321 else { 35322 // 2D array 35323 $.merge( nestedSort, a ); 35324 } 35325 }; 35326 35327 // Build the sort array, with pre-fix and post-fix options if they have been 35328 // specified 35329 if ( $.isArray( fixed ) ) { 35330 add( fixed ); 35331 } 35332 35333 if ( fixedObj && fixed.pre ) { 35334 add( fixed.pre ); 35335 } 35336 35337 add( settings.aaSorting ); 35338 35339 if (fixedObj && fixed.post ) { 35340 add( fixed.post ); 35341 } 35342 35343 for ( i=0 ; i<nestedSort.length ; i++ ) 35344 { 35345 srcCol = nestedSort[i][0]; 35346 aDataSort = aoColumns[ srcCol ].aDataSort; 35347 35348 for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ ) 35349 { 35350 iCol = aDataSort[k]; 35351 sType = aoColumns[ iCol ].sType || 'string'; 35352 35353 if ( nestedSort[i]._idx === undefined ) { 35354 nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting ); 35355 } 35356 35357 aSort.push( { 35358 src: srcCol, 35359 col: iCol, 35360 dir: nestedSort[i][1], 35361 index: nestedSort[i]._idx, 35362 type: sType, 35363 formatter: DataTable.ext.type.order[ sType+"-pre" ] 35364 } ); 35365 } 35366 } 35367 35368 return aSort; 35369 } 35370 35371 /** 35372 * Change the order of the table 35373 * @param {object} oSettings dataTables settings object 35374 * @memberof DataTable#oApi 35375 * @todo This really needs split up! 35376 */ 35377 function _fnSort ( oSettings ) 35378 { 35379 var 35380 i, ien, iLen, j, jLen, k, kLen, 35381 sDataType, nTh, 35382 aiOrig = [], 35383 oExtSort = DataTable.ext.type.order, 35384 aoData = oSettings.aoData, 35385 aoColumns = oSettings.aoColumns, 35386 aDataSort, data, iCol, sType, oSort, 35387 formatters = 0, 35388 sortCol, 35389 displayMaster = oSettings.aiDisplayMaster, 35390 aSort; 35391 35392 // Resolve any column types that are unknown due to addition or invalidation 35393 // @todo Can this be moved into a 'data-ready' handler which is called when 35394 // data is going to be used in the table? 35395 _fnColumnTypes( oSettings ); 35396 35397 aSort = _fnSortFlatten( oSettings ); 35398 35399 for ( i=0, ien=aSort.length ; i<ien ; i++ ) { 35400 sortCol = aSort[i]; 35401 35402 // Track if we can use the fast sort algorithm 35403 if ( sortCol.formatter ) { 35404 formatters++; 35405 } 35406 35407 // Load the data needed for the sort, for each cell 35408 _fnSortData( oSettings, sortCol.col ); 35409 } 35410 35411 /* No sorting required if server-side or no sorting array */ 35412 if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 ) 35413 { 35414 // Create a value - key array of the current row positions such that we can use their 35415 // current position during the sort, if values match, in order to perform stable sorting 35416 for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) { 35417 aiOrig[ displayMaster[i] ] = i; 35418 } 35419
35420 /* Do the sort - here we want multi-column sorting based on a given data source (column) 35421 * and sorting function (from oSort) in a certain direction. It's reasonably complex to 35422 * follow on it's own, but this is what we want (example two column sorting): 35423 * fnLocalSorting = function(a,b){ 35424 * var iTest; 35425 * iTest = oSort['string-asc']('data11', 'data12'); 35426 * if (iTest !== 0) 35427 * return iTest; 35428 * iTest = oSort['numeric-desc']('data21', 'data22'); 35429 * if (iTest !== 0) 35430 * return iTest; 35431 * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] ); 35432 * } 35433 * Basically we have a test for each sorting column, if the data in that column is equal, 35434 * test the next column. If all columns match, then we use a numeric sort on the row 35435 * positions in the original data array to provide a stable sort. 35436 * 35437 * Note - I know it seems excessive to have two sorting methods, but the first is around 35438 * 15% faster, so the second is only maintained for backwards compatibility with sorting 35439 * methods which do not have a pre-sort formatting function. 35440 */ 35441 if ( formatters === aSort.length ) { 35442 // All sort types have formatting functions 35443 displayMaster.sort( function ( a, b ) { 35444 var 35445 x, y, k, test, sort, 35446 len=aSort.length, 35447 dataA = aoData[a]._aSortData, 35448 dataB = aoData[b]._aSortData; 35449 35450 for ( k=0 ; k<len ; k++ ) { 35451 sort = aSort[k]; 35452 35453 x = dataA[ sort.col ]; 35454 y = dataB[ sort.col ]; 35455 35456 test = x<y ? -1 : x>y ? 1 : 0; 35457 if ( test !== 0 ) { 35458 return sort.dir === 'asc' ? test : -test; 35459 } 35460 } 35461 35462 x = aiOrig[a]; 35463 y = aiOrig[b]; 35464 return x<y ? -1 : x>y ? 1 : 0; 35465 } ); 35466 } 35467 else { 35468 // Depreciated - remove in 1.11 (providing a plug-in option) 35469 // Not all sort types have formatting methods, so we have to call their sorting 35470 // methods. 35471 displayMaster.sort( function ( a, b ) { 35472 var 35473 x, y, k, l, test, sort, fn, 35474 len=aSort.length, 35475 dataA = aoData[a]._aSortData, 35476 dataB = aoData[b]._aSortData; 35477 35478 for ( k=0 ; k<len ; k++ ) { 35479 sort = aSort[k]; 35480 35481 x = dataA[ sort.col ]; 35482 y = dataB[ sort.col ]; 35483 35484 fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ]; 35485 test = fn( x, y ); 35486 if ( test !== 0 ) { 35487 return test; 35488 } 35489 } 35490 35491 x = aiOrig[a]; 35492 y = aiOrig[b]; 35493 return x<y ? -1 : x>y ? 1 : 0; 35494 } ); 35495 } 35496 } 35497 35498 /* Tell the draw function that we have sorted the data */ 35499 oSettings.bSorted = true; 35500 } 35501 35502 35503 function _fnSortAria ( settings ) 35504 { 35505 var label; 35506 var nextSort; 35507 var columns = settings.aoColumns; 35508 var aSort = _fnSortFlatten( settings ); 35509 var oAria = settings.oLanguage.oAria; 35510 35511 // ARIA attributes - need to loop all columns, to update all (removing old 35512 // attributes as needed) 35513 for ( var i=0, iLen=columns.length ; i<iLen ; i++ ) 35514 { 35515 var col = columns[i]; 35516 var asSorting = col.asSorting; 35517 var sTitle = col.sTitle.replace( /<.*?>/g, "" ); 35518 var th = col.nTh; 35519 35520 // IE7 is throwing an error when setting these properties with jQuery's 35521 // attr() and removeAttr() methods... 35522 th.removeAttribute('aria-sort'); 35523 35524 /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */ 35525 if ( col.bSortable ) { 35526 if ( aSort.length > 0 && aSort[0].col == i ) { 35527 th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" ); 35528 nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0]; 35529 } 35530 else { 35531 nextSort = asSorting[0]; 35532 } 35533 35534 label = sTitle + ( nextSort === "asc" ? 35535 oAria.sSortAscending : 35536 oAria.sSortDescending 35537 ); 35538 } 35539 else { 35540 label = sTitle; 35541 } 35542 35543 th.setAttribute('aria-label', label); 35544 } 35545 } 35546 35547 35548 /** 35549 * Function to run on user sort request 35550 * @param {object} settings dataTables settings object 35551 * @param {node} attachTo node to attach the handler to 35552 * @param {int} colIdx column sorting index 35553 * @param {boolean} [append=false] Append the requested sort to the existing
35554 * sort if true (i.e. multi-column sort) 35555 * @param {function} [callback] callback function 35556 * @memberof DataTable#oApi 35557 */ 35558 function _fnSortListener ( settings, colIdx, append, callback ) 35559 { 35560 var col = settings.aoColumns[ colIdx ]; 35561 var sorting = settings.aaSorting; 35562 var asSorting = col.asSorting; 35563 var nextSortIdx; 35564 var next = function ( a, overflow ) { 35565 var idx = a._idx; 35566 if ( idx === undefined ) { 35567 idx = $.inArray( a[1], asSorting ); 35568 } 35569 35570 return idx+1 < asSorting.length ? 35571 idx+1 : 35572 overflow ? 35573 null : 35574 0; 35575 }; 35576 35577 // Convert to 2D array if needed 35578 if ( typeof sorting[0] === 'number' ) { 35579 sorting = settings.aaSorting = [ sorting ]; 35580 } 35581 35582 // If appending the sort then we are multi-column sorting 35583 if ( append && settings.oFeatures.bSortMulti ) { 35584 // Are we already doing some kind of sort on this column? 35585 var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') ); 35586 35587 if ( sortIdx !== -1 ) { 35588 // Yes, modify the sort 35589 nextSortIdx = next( sorting[sortIdx], true ); 35590 35591 if ( nextSortIdx === null && sorting.length === 1 ) { 35592 nextSortIdx = 0; // can't remove sorting completely 35593 } 35594 35595 if ( nextSortIdx === null ) { 35596 sorting.splice( sortIdx, 1 ); 35597 } 35598 else { 35599 sorting[sortIdx][1] = asSorting[ nextSortIdx ]; 35600 sorting[sortIdx]._idx = nextSortIdx; 35601 } 35602 } 35603 else { 35604 // No sort on this column yet 35605 sorting.push( [ colIdx, asSorting[0], 0 ] ); 35606 sorting[sorting.length-1]._idx = 0; 35607 } 35608 } 35609 else if ( sorting.length && sorting[0][0] == colIdx ) { 35610 // Single column - already sorting on this column, modify the sort 35611 nextSortIdx = next( sorting[0] ); 35612 35613 sorting.length = 1; 35614 sorting[0][1] = asSorting[ nextSortIdx ]; 35615 sorting[0]._idx = nextSortIdx; 35616 } 35617 else { 35618 // Single column - sort only on this column 35619 sorting.length = 0; 35620 sorting.push( [ colIdx, asSorting[0] ] ); 35621 sorting[0]._idx = 0; 35622 } 35623 35624 // Run the sort by calling a full redraw 35625 _fnReDraw( settings ); 35626 35627 // callback used for async user interaction 35628 if ( typeof callback == 'function' ) { 35629 callback( settings ); 35630 } 35631 } 35632 35633 35634 /** 35635 * Attach a sort handler (click) to a node 35636 * @param {object} settings dataTables settings object 35637 * @param {node} attachTo node to attach the handler to 35638 * @param {int} colIdx column sorting index 35639 * @param {function} [callback] callback function 35640 * @memberof DataTable#oApi 35641 */ 35642 function _fnSortAttachListener ( settings, attachTo, colIdx, callback ) 35643 { 35644 var col = settings.aoColumns[ colIdx ]; 35645 35646 _fnBindAction( attachTo, {}, function (e) { 35647 /* If the column is not sortable - don't to anything */ 35648 if ( col.bSortable === false ) { 35649 return; 35650 } 35651 35652 // If processing is enabled use a timeout to allow the processing 35653 // display to be shown - otherwise to it synchronously 35654 if ( settings.oFeatures.bProcessing ) { 35655 _fnProcessingDisplay( settings, true ); 35656 35657 setTimeout( function() { 35658 _fnSortListener( settings, colIdx, e.shiftKey, callback ); 35659 35660 // In server-side processing, the draw callback will remove the 35661 // processing display 35662 if ( _fnDataSource( settings ) !== 'ssp' ) { 35663 _fnProcessingDisplay( settings, false ); 35664 } 35665 }, 0 ); 35666 } 35667 else { 35668 _fnSortListener( settings, colIdx, e.shiftKey, callback ); 35669 } 35670 } ); 35671 } 35672 35673 35674 /** 35675 * Set the sorting classes on table's body, Note: it is safe to call this function 35676 * when bSort and bSortClasses are false 35677 * @param {object} oSettings dataTables settings object 35678 * @memberof DataTable#oApi 35679 */ 35680 function _fnSortingClasses( settings ) 35681 { 35682 var oldSort = settings.aLastSort; 35683 var sortClass = settings.oClasses.sSortColumn; 35684 var sort = _fnSortFlatten( settings ); 35685 var features = settings.oFeatures; 35686 var i, ien, colIdx; 35687 35688 if ( features.bSort && features.bSortClasses ) { 35689 // Remove old sorting classes 35690 for ( i=0, ien=oldSort.length ; i<ien ; i++ ) { 35691 colIdx = oldSort[i].src; 35692 35693 // Remove column sorting 35694 $( _pluck( settings.aoData, 'anCells', colIdx ) ) 35695 .removeClass( sortClass + (i<2 ? i+1 : 3) ); 35696 } 35697 35698 // Add new column sorting 35699 for ( i=0, ien=sort.length ; i<ien ; i++ ) { 35700 colIdx = sort[i].src; 35701 35702 $( _pluck( settings.aoData, 'anCells', colIdx ) ) 35703 .addClass( sortClass + (i<2 ? i+1 : 3) ); 35704 } 35705 } 35706 35707 settings.aLastSort = sort; 35708 } 35709 35710 35711 // Get the data to sort a column, be it from cache, fresh (populating the 35712 // cache), or from a sort formatter 35713 function _fnSortData( settings, idx ) 35714 { 35715 // Custom sorting function - provided by the sort data type 35716 var column = settings.aoColumns[ idx ]; 35717 var customSort = DataTable.ext.order[ column.sSortDataType ]; 35718 var customData; 35719 35720 if ( customSort ) { 35721 customData = customSort.call( settings.oInstance, settings, idx, 35722 _fnColumnIndexToVisible( settings, idx ) 35723 ); 35724 } 35725 35726 // Use / populate cache 35727 var row, cellData; 35728 var formatter = DataTable.ext.type.order[ column.sType+"-pre" ]; 35729 35730 for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) { 35731 row = settings.aoData[i]; 35732 35733 if ( ! row._aSortData ) { 35734 row._aSortData = []; 35735 } 35736 35737 if ( ! row._aSortData[idx] || customSort ) { 35738 cellData = customSort ? 35739 customData[i] : // If there was a custom sort function, use data from there 35740 _fnGetCellData( settings, i, idx, 'sort' ); 35741 35742 row._aSortData[ idx ] = formatter ? 35743 formatter( cellData ) : 35744 cellData; 35745 } 35746 } 35747 } 35748 35749 35750 35751 /** 35752 * Save the state of a table 35753 * @param {object} oSettings dataTables settings object 35754 * @memberof DataTable#oApi 35755 */ 35756 function _fnSaveState ( settings ) 35757 { 35758 if ( !settings.oFeatures.bStateSave || settings.bDestroying ) 35759 { 35760 return; 35761 } 35762 35763 /* Store the interesting variables */ 35764 var state = { 35765 time: +new Date(), 35766 start: settings._iDisplayStart, 35767 length: settings._iDisplayLength, 35768 order: $.extend( true, [], settings.aaSorting ), 35769 search: _fnSearchToCamel( settings.oPreviousSearch ),
35770 columns: $.map( settings.aoColumns, function ( col, i ) { 35771 return { 35772 visible: col.bVisible, 35773 search: _fnSearchToCamel( settings.aoPreSearchCols[i] ) 35774 }; 35775 } ) 35776 }; 35777 35778 _fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] ); 35779 35780 settings.oSavedState = state; 35781 settings.fnStateSaveCallback.call( settings.oInstance, settings, state ); 35782 } 35783 35784 35785 /** 35786 * Attempt to load a saved table state 35787 * @param {object} oSettings dataTables settings object 35788 * @param {object} oInit DataTables init object so we can override settings 35789 * @memberof DataTable#oApi 35790 */ 35791 function _fnLoadState ( settings, oInit ) 35792 { 35793 var i, ien; 35794 var columns = settings.aoColumns; 35795 35796 if ( ! settings.oFeatures.bStateSave ) { 35797 return; 35798 } 35799 35800 var state = settings.fnStateLoadCallback.call( settings.oInstance, settings ); 35801 if ( ! state || ! state.time ) { 35802 return; 35803 } 35804 35805 /* Allow custom and plug-in manipulation functions to alter the saved data set and 35806 * cancelling of loading by returning false 35807 */ 35808 var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, state] ); 35809 if ( $.inArray( false, abStateLoad ) !== -1 ) { 35810 return; 35811 } 35812 35813 /* Reject old data */ 35814 var duration = settings.iStateDuration; 35815 if ( duration > 0 && state.time < +new Date() - (duration*1000) ) { 35816 return; 35817 } 35818 35819 // Number of columns have changed - all bets are off, no restore of settings 35820 if ( columns.length !== state.columns.length ) { 35821 return; 35822 } 35823 35824 // Store the saved state so it might be accessed at any time 35825 settings.oLoadedState = $.extend( true, {}, state ); 35826 35827 // Restore key features - todo - for 1.11 this needs to be done by 35828 // subscribed events 35829 if ( state.start !== undefined ) { 35830 settings._iDisplayStart = state.start; 35831 settings.iInitDisplayStart = state.start; 35832 } 35833 if ( state.length !== undefined ) { 35834 settings._iDisplayLength = state.length; 35835 } 35836 35837 // Order 35838 if ( state.order !== undefined ) { 35839 settings.aaSorting = []; 35840 $.each( state.order, function ( i, col ) { 35841 settings.aaSorting.push( col[0] >= columns.length ? 35842 [ 0, col[1] ] : 35843 col 35844 ); 35845 } ); 35846 } 35847 35848 // Search 35849 if ( state.search !== undefined ) { 35850 $.extend( settings.oPreviousSearch, _fnSearchToHung( state.search ) ); 35851 } 35852 35853 // Columns 35854 for ( i=0, ien=state.columns.length ; i<ien ; i++ ) { 35855 var col = state.columns[i]; 35856 35857 // Visibility 35858 if ( col.visible !== undefined ) { 35859 columns[i].bVisible = col.visible; 35860 } 35861 35862 // Search 35863 if ( col.search !== undefined ) { 35864 $.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) ); 35865 } 35866 } 35867 35868 _fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, state] ); 35869 } 35870 35871 35872 /** 35873 * Return the settings object for a particular table 35874 * @param {node} table table we are using as a dataTable 35875 * @returns {object} Settings object - or null if not found 35876 * @memberof DataTable#oApi 35877 */ 35878 function _fnSettingsFromNode ( table ) 35879 { 35880 var settings = DataTable.settings; 35881 var idx = $.inArray( table, _pluck( settings, 'nTable' ) ); 35882 35883 return idx !== -1 ? 35884 settings[ idx ] : 35885 null; 35886 } 35887 35888 35889 /** 35890 * Log an error message 35891 * @param {object} settings dataTables settings object 35892 * @param {int} level log error messages, or display them to the user 35893 * @param {string} msg error message 35894 * @param {int} tn Technical note id to get more information about the error. 35895 * @memberof DataTable#oApi 35896 */ 35897 function _fnLog( settings, level, msg, tn ) 35898 { 35899 msg = 'DataTables warning: '+ 35900 (settings ? 'table id='+settings.sTableId+' - ' : '')+msg; 35901 35902 if ( tn ) { 35903 msg += '. For more information about this error, please see '+ 35904 'http://datatables.net/tn/'+tn; 35905 } 35906 35907 if ( ! level ) { 35908 // Backwards compatibility pre 1.10 35909 var ext = DataTable.ext; 35910 var type = ext.sErrMode || ext.errMode; 35911 35912 if ( settings ) { 35913 _fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] ); 35914 } 35915 35916 if ( type == 'alert' ) { 35917 alert( msg ); 35918 } 35919 else if ( type == 'throw' ) { 35920 throw new Error(msg); 35921 } 35922 else if ( typeof type == 'function' ) { 35923 type( settings, tn, msg ); 35924 } 35925 } 35926 else if ( window.console && console.log ) { 35927 console.log( msg ); 35928 } 35929 } 35930 35931 35932 /** 35933 * See if a property is defined on one object, if so assign it to the other object 35934 * @param {object} ret target object 35935 * @param {object} src source object 35936 * @param {string} name property 35937 * @param {string} [mappedName] name to map too - optional, name used if not given 35938 * @memberof DataTable#oApi 35939 */ 35940 function _fnMap( ret, src, name, mappedName ) 35941 { 35942 if ( $.isArray( name ) ) { 35943 $.each( name, function (i, val) { 35944 if ( $.isArray( val ) ) { 35945 _fnMap( ret, src, val[0], val[1] ); 35946 } 35947 else { 35948 _fnMap( ret, src, val ); 35949 } 35950 } ); 35951 35952 return; 35953 } 35954 35955 if ( mappedName === undefined ) { 35956 mappedName = name; 35957 } 35958 35959 if ( src[name] !== undefined ) { 35960 ret[mappedName] = src[name]; 35961 } 35962 } 35963 35964 35965 /** 35966 * Extend objects - very similar to jQuery.extend, but deep copy objects, and 35967 * shallow copy arrays. The reason we need to do this, is that we don't want to 35968 * deep copy array init values (such as aaSorting) since the dev wouldn't be 35969 * able to override them, but we do want to deep copy arrays. 35970 * @param {object} out Object to extend 35971 * @param {object} extender Object from which the properties will be applied to 35972 * out 35973 * @param {boolean} breakRefs If true, then arrays will be sliced to take an 35974 * independent copy with the exception of the `data` or `aaData` parameters 35975 * if they are present. This is so you can pass in a collection to 35976 * DataTables and have that used as your data source without breaking the 35977 * references 35978 * @returns {object} out Reference, just for convenience - out === the return. 35979 * @memberof DataTable#oApi 35980 * @todo This doesn't take account of arrays inside the deep copied objects. 35981 */ 35982 function _fnExtend( out, extender, breakRefs ) 35983 { 35984 var val; 35985 35986 for ( var prop in extender ) { 35987 if ( extender.hasOwnProperty(prop) ) { 35988 val = extender[prop]; 35989 35990 if ( $.isPlainObject( val ) ) { 35991 if ( ! $.isPlainObject( out[prop] ) ) { 35992 out[prop] = {}; 35993 } 35994 $.extend( true, out[prop], val ); 35995 } 35996 else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) { 35997 out[prop] = val.slice(); 35998 } 35999 else { 36000 out[prop] = val; 36001 } 36002 } 36003 } 36004 36005 return out; 36006 } 36007 36008 36009 /** 36010 * Bind an event handers to allow a click or return key to activate the callback. 36011 * This is good for accessibility since a return on the keyboard will have the 36012 * same effect as a click, if the element has focus. 36013 * @param {element} n Element to bind the action to 36014 * @param {object} oData Data object to pass to the triggered function 36015 * @param {function} fn Callback function for when the event is triggered 36016 * @memberof DataTable#oApi 36017 */ 36018 function _fnBindAction( n, oData, fn ) 36019 { 36020 $(n) 36021 .bind( 'click.DT', oData, function (e) { 36022 n.blur(); // Remove focus outline for mouse users 36023 fn(e); 36024 } ) 36025 .bind( 'keypress.DT', oData, function (e){ 36026 if ( e.which === 13 ) { 36027 e.preventDefault(); 36028 fn(e); 36029 } 36030 } ) 36031 .bind( 'selectstart.DT', function () { 36032 /* Take the brutal approach to cancelling text selection */ 36033 return false;
36034 } ); 36035 } 36036 36037 36038 /** 36039 * Register a callback function. Easily allows a callback function to be added to 36040 * an array store of callback functions that can then all be called together. 36041 * @param {object} oSettings dataTables settings object 36042 * @param {string} sStore Name of the array storage for the callbacks in oSettings 36043 * @param {function} fn Function to be called back 36044 * @param {string} sName Identifying name for the callback (i.e. a label) 36045 * @memberof DataTable#oApi 36046 */ 36047 function _fnCallbackReg( oSettings, sStore, fn, sName ) 36048 { 36049 if ( fn ) 36050 { 36051 oSettings[sStore].push( { 36052 "fn": fn, 36053 "sName": sName 36054 } ); 36055 } 36056 } 36057 36058 36059 /** 36060 * Fire callback functions and trigger events. Note that the loop over the 36061 * callback array store is done backwards! Further note that you do not want to 36062 * fire off triggers in time sensitive applications (for example cell creation) 36063 * as its slow. 36064 * @param {object} settings dataTables settings object 36065 * @param {string} callbackArr Name of the array storage for the callbacks in 36066 * oSettings 36067 * @param {string} eventName Name of the jQuery custom event to trigger. If 36068 * null no trigger is fired 36069 * @param {array} args Array of arguments to pass to the callback function / 36070 * trigger 36071 * @memberof DataTable#oApi 36072 */ 36073 function _fnCallbackFire( settings, callbackArr, eventName, args ) 36074 { 36075 var ret = []; 36076 36077 if ( callbackArr ) { 36078 ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) { 36079 return val.fn.apply( settings.oInstance, args ); 36080 } ); 36081 } 36082 36083 if ( eventName !== null ) { 36084 var e = $.Event( eventName+'.dt' ); 36085 36086 $(settings.nTable).trigger( e, args ); 36087 36088 ret.push( e.result ); 36089 } 36090 36091 return ret; 36092 } 36093 36094 36095 function _fnLengthOverflow ( settings ) 36096 { 36097 var 36098 start = settings._iDisplayStart, 36099 end = settings.fnDisplayEnd(), 36100 len = settings._iDisplayLength; 36101 36102 /* If we have space to show extra rows (backing up from the end point - then do so */ 36103 if ( start >= end ) 36104 { 36105 start = end - len; 36106 } 36107 36108 // Keep the start record on the current page 36109 start -= (start % len); 36110 36111 if ( len === -1 || start < 0 ) 36112 { 36113 start = 0; 36114 } 36115 36116 settings._iDisplayStart = start; 36117 } 36118 36119 36120 function _fnRenderer( settings, type ) 36121 { 36122 var renderer = settings.renderer; 36123 var host = DataTable.ext.renderer[type]; 36124 36125 if ( $.isPlainObject( renderer ) && renderer[type] ) { 36126 // Specific renderer for this type. If available use it, otherwise use 36127 // the default. 36128 return host[renderer[type]] || host._; 36129 } 36130 else if ( typeof renderer === 'string' ) { 36131 // Common renderer - if there is one available for this type use it, 36132 // otherwise use the default 36133 return host[renderer] || host._; 36134 } 36135 36136 // Use the default 36137 return host._; 36138 } 36139 36140 36141 /** 36142 * Detect the data source being used for the table. Used to simplify the code 36143 * a little (ajax) and to make it compress a little smaller. 36144 * 36145 * @param {object} settings dataTables settings object 36146 * @returns {string} Data source 36147 * @memberof DataTable#oApi 36148 */ 36149 function _fnDataSource ( settings ) 36150 { 36151 if ( settings.oFeatures.bServerSide ) { 36152 return 'ssp'; 36153 } 36154 else if ( settings.ajax || settings.sAjaxSource ) { 36155 return 'ajax'; 36156 } 36157 return 'dom'; 36158 } 36159 36160 36161 DataTable = function( options ) 36162 { 36163 /** 36164 * Perform a jQuery selector action on the table's TR elements (from the tbody) and 36165 * return the resulting jQuery object. 36166 * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on 36167 * @param {object} [oOpts] Optional parameters for modifying the rows to be included 36168 * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter 36169 * criterion ("applied") or all TR elements (i.e. no filter). 36170 * @param {string} [oOpts.order=current] Order of the TR elements in the processed array. 36171 * Can be either 'current', whereby the current sorting of the table is used, or 36172 * 'original' whereby the original order the data was read into the table is used. 36173 * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page 36174 * ("current") or not ("all"). If 'current' is given, then order is assumed to be 36175 * 'current' and filter is 'applied', regardless of what they might be given as. 36176 * @returns {object} jQuery object, filtered by the given selector. 36177 * @dtopt API 36178 * @deprecated Since v1.10 36179 * 36180 * @example 36181 * $(document).ready(function() { 36182 * var oTable = $('#example').dataTable(); 36183 * 36184 * // Highlight every second row 36185 * oTable.$('tr:odd').css('backgroundColor', 'blue'); 36186 * } ); 36187 * 36188 * @example 36189 * $(document).ready(function() { 36190 * var oTable = $('#example').dataTable(); 36191 * 36192 * // Filter to rows with 'Webkit' in them, add a background colour and then 36193 * // remove the filter, thus highlighting the 'Webkit' rows only. 36194 * oTable.fnFilter('Webkit'); 36195 * oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue'); 36196 * oTable.fnFilter(''); 36197 * } ); 36198 */ 36199 this.$ = function ( sSelector, oOpts ) 36200 { 36201 return this.api(true).$( sSelector, oOpts ); 36202 }; 36203
36204 36205 /** 36206 * Almost identical to $ in operation, but in this case returns the data for the matched 36207 * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes 36208 * rather than any descendants, so the data can be obtained for the row/cell. If matching 36209 * rows are found, the data returned is the original data array/object that was used to 36210 * create the row (or a generated array if from a DOM source). 36211 * 36212 * This method is often useful in-combination with $ where both functions are given the 36213 * same parameters and the array indexes will match identically. 36214 * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on 36215 * @param {object} [oOpts] Optional parameters for modifying the rows to be included 36216 * @param {string} [oOpts.filter=none] Select elements that meet the current filter 36217 * criterion ("applied") or all elements (i.e. no filter). 36218 * @param {string} [oOpts.order=current] Order of the data in the processed array. 36219 * Can be either 'current', whereby the current sorting of the table is used, or 36220 * 'original' whereby the original order the data was read into the table is used. 36221 * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page 36222 * ("current") or not ("all"). If 'current' is given, then order is assumed to be 36223 * 'current' and filter is 'applied', regardless of what they might be given as. 36224 * @returns {array} Data for the matched elements. If any elements, as a result of the 36225 * selector, were not TR, TD or TH elements in the DataTable, they will have a null 36226 * entry in the array. 36227 * @dtopt API 36228 * @deprecated Since v1.10 36229 * 36230 * @example 36231 * $(document).ready(function() { 36232 * var oTable = $('#example').dataTable(); 36233 * 36234 * // Get the data from the first row in the table 36235 * var data = oTable._('tr:first'); 36236 * 36237 * // Do something useful with the data 36238 * alert( "First cell is: "+data[0] ); 36239 * } ); 36240 * 36241 * @example 36242 * $(document).ready(function() { 36243 * var oTable = $('#example').dataTable(); 36244 * 36245 * // Filter to 'Webkit' and get all data for 36246 * oTable.fnFilter('Webkit'); 36247 * var data = oTable._('tr', {"search": "applied"}); 36248 * 36249 * // Do something with the data 36250 * alert( data.length+" rows matched the search" ); 36251 * } ); 36252 */ 36253 this._ = function ( sSelector, oOpts ) 36254 { 36255 return this.api(true).rows( sSelector, oOpts ).data(); 36256 }; 36257 36258 36259 /** 36260 * Create a DataTables Api instance, with the currently selected tables for 36261 * the Api's context. 36262 * @param {boolean} [traditional=false] Set the API instance's context to be 36263 * only the table referred to by the `DataTable.ext.iApiIndex` option, as was 36264 * used in the API presented by DataTables 1.9- (i.e. the traditional mode), 36265 * or if all tables captured in the jQuery object should be used. 36266 * @return {DataTables.Api} 36267 */ 36268 this.api = function ( traditional ) 36269 { 36270 return traditional ? 36271 new _Api( 36272 _fnSettingsFromNode( this[ _ext.iApiIndex ] ) 36273 ) : 36274 new _Api( this ); 36275 }; 36276 36277 36278 /** 36279 * Add a single new row or multiple rows of data to the table. Please note 36280 * that this is suitable for client-side processing only - if you are using 36281 * server-side processing (i.e. "bServerSide": true), then to add data, you 36282 * must add it to the data source, i.e. the server-side, through an Ajax call. 36283 * @param {array|object} data The data to be added to the table. This can be: 36284 * <ul> 36285 * <li>1D array of data - add a single row with the data provided</li> 36286 * <li>2D array of arrays - add multiple rows in a single call</li> 36287 * <li>object - data object when using <i>mData</i></li> 36288 * <li>array of objects - multiple data objects when using <i>mData</i></li> 36289 * </ul> 36290 * @param {bool} [redraw=true] redraw the table or not 36291 * @returns {array} An array of integers, representing the list of indexes in 36292 * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to 36293 * the table. 36294 * @dtopt API 36295 * @deprecated Since v1.10 36296 * 36297 * @example 36298 * // Global var for counter 36299 * var giCount = 2; 36300 * 36301 * $(document).ready(function() { 36302 * $('#example').dataTable(); 36303 * } ); 36304 * 36305 * function fnClickAddRow() { 36306 * $('#example').dataTable().fnAddData( [ 36307 * giCount+".1", 36308 * giCount+".2", 36309 * giCount+".3", 36310 * giCount+".4" ] 36311 * ); 36312 * 36313 * giCount++; 36314 * } 36315 */ 36316 this.fnAddData = function( data, redraw ) 36317 { 36318 var api = this.api( true ); 36319 36320 /* Check if we want to add multiple rows or not */ 36321 var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ? 36322 api.rows.add( data ) : 36323 api.row.add( data ); 36324 36325 if ( redraw === undefined || redraw ) { 36326 api.draw(); 36327 } 36328 36329 return rows.flatten().toArray(); 36330 }; 36331
36332 36333 /** 36334 * This function will make DataTables recalculate the column sizes, based on the data 36335 * contained in the table and the sizes applied to the columns (in the DOM, CSS or 36336 * through the sWidth parameter). This can be useful when the width of the table's 36337 * parent element changes (for example a window resize). 36338 * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to 36339 * @dtopt API 36340 * @deprecated Since v1.10 36341 * 36342 * @example 36343 * $(document).ready(function() { 36344 * var oTable = $('#example').dataTable( { 36345 * "sScrollY": "200px", 36346 * "bPaginate": false 36347 * } ); 36348 * 36349 * $(window).bind('resize', function () { 36350 * oTable.fnAdjustColumnSizing(); 36351 * } ); 36352 * } ); 36353 */ 36354 this.fnAdjustColumnSizing = function ( bRedraw ) 36355 { 36356 var api = this.api( true ).columns.adjust(); 36357 var settings = api.settings()[0]; 36358 var scroll = settings.oScroll; 36359 36360 if ( bRedraw === undefined || bRedraw ) { 36361 api.draw( false ); 36362 } 36363 else if ( scroll.sX !== "" || scroll.sY !== "" ) { 36364 /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */ 36365 _fnScrollDraw( settings ); 36366 } 36367 }; 36368 36369 36370 /** 36371 * Quickly and simply clear a table 36372 * @param {bool} [bRedraw=true] redraw the table or not 36373 * @dtopt API 36374 * @deprecated Since v1.10 36375 * 36376 * @example 36377 * $(document).ready(function() { 36378 * var oTable = $('#example').dataTable(); 36379 * 36380 * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...) 36381 * oTable.fnClearTable(); 36382 * } ); 36383 */ 36384 this.fnClearTable = function( bRedraw ) 36385 { 36386 var api = this.api( true ).clear(); 36387 36388 if ( bRedraw === undefined || bRedraw ) { 36389 api.draw(); 36390 } 36391 }; 36392 36393 36394 /** 36395 * The exact opposite of 'opening' a row, this function will close any rows which 36396 * are currently 'open'. 36397 * @param {node} nTr the table row to 'close' 36398 * @returns {int} 0 on success, or 1 if failed (can't find the row) 36399 * @dtopt API 36400 * @deprecated Since v1.10 36401 * 36402 * @example 36403 * $(document).ready(function() { 36404 * var oTable; 36405 * 36406 * // 'open' an information row when a row is clicked on 36407 * $('#example tbody tr').click( function () { 36408 * if ( oTable.fnIsOpen(this) ) { 36409 * oTable.fnClose( this ); 36410 * } else { 36411 * oTable.fnOpen( this, "Temporary row opened", "info_row" ); 36412 * } 36413 * } ); 36414 * 36415 * oTable = $('#example').dataTable(); 36416 * } ); 36417 */ 36418 this.fnClose = function( nTr ) 36419 { 36420 this.api( true ).row( nTr ).child.hide(); 36421 }; 36422 36423 36424 /** 36425 * Remove a row for the table 36426 * @param {mixed} target The index of the row from aoData to be deleted, or 36427 * the TR element you want to delete 36428 * @param {function|null} [callBack] Callback function 36429 * @param {bool} [redraw=true] Redraw the table or not 36430 * @returns {array} The row that was deleted 36431 * @dtopt API 36432 * @deprecated Since v1.10 36433 * 36434 * @example 36435 * $(document).ready(function() { 36436 * var oTable = $('#example').dataTable(); 36437 * 36438 * // Immediately remove the first row 36439 * oTable.fnDeleteRow( 0 ); 36440 * } ); 36441 */ 36442 this.fnDeleteRow = function( target, callback, redraw ) 36443 { 36444 var api = this.api( true ); 36445 var rows = api.rows( target ); 36446 var settings = rows.settings()[0]; 36447 var data = settings.aoData[ rows[0][0] ]; 36448 36449 rows.remove(); 36450 36451 if ( callback ) { 36452 callback.call( this, settings, data ); 36453 } 36454 36455 if ( redraw === undefined || redraw ) { 36456 api.draw(); 36457 } 36458 36459 return data; 36460 }; 36461 36462 36463 /** 36464 * Restore the table to it's original state in the DOM by removing all of DataTables 36465 * enhancements, alterations to the DOM structure of the table and event listeners. 36466 * @param {boolean} [remove=false] Completely remove the table from the DOM 36467 * @dtopt API 36468 * @deprecated Since v1.10 36469 * 36470 * @example 36471 * $(document).ready(function() { 36472 * // This example is fairly pointless in reality, but shows how fnDestroy can be used 36473 * var oTable = $('#example').dataTable(); 36474 * oTable.fnDestroy(); 36475 * } ); 36476 */ 36477 this.fnDestroy = function ( remove ) 36478 { 36479 this.api( true ).destroy( remove ); 36480 }; 36481
36482 36483 /** 36484 * Redraw the table 36485 * @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw. 36486 * @dtopt API 36487 * @deprecated Since v1.10 36488 * 36489 * @example 36490 * $(document).ready(function() { 36491 * var oTable = $('#example').dataTable(); 36492 * 36493 * // Re-draw the table - you wouldn't want to do it here, but it's an example :-) 36494 * oTable.fnDraw(); 36495 * } ); 36496 */ 36497 this.fnDraw = function( complete ) 36498 { 36499 // Note that this isn't an exact match to the old call to _fnDraw - it takes 36500 // into account the new data, but can hold position. 36501 this.api( true ).draw( complete ); 36502 }; 36503 36504 36505 /** 36506 * Filter the input based on data 36507 * @param {string} sInput String to filter the table on 36508 * @param {int|null} [iColumn] Column to limit filtering to 36509 * @param {bool} [bRegex=false] Treat as regular expression or not 36510 * @param {bool} [bSmart=true] Perform smart filtering or not 36511 * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es) 36512 * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false) 36513 * @dtopt API 36514 * @deprecated Since v1.10 36515 * 36516 * @example 36517 * $(document).ready(function() { 36518 * var oTable = $('#example').dataTable(); 36519 * 36520 * // Sometime later - filter... 36521 * oTable.fnFilter( 'test string' ); 36522 * } ); 36523 */ 36524 this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive ) 36525 { 36526 var api = this.api( true ); 36527 36528 if ( iColumn === null || iColumn === undefined ) { 36529 api.search( sInput, bRegex, bSmart, bCaseInsensitive ); 36530 } 36531 else { 36532 api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive ); 36533 } 36534 36535 api.draw(); 36536 }; 36537 36538 36539 /** 36540 * Get the data for the whole table, an individual row or an individual cell based on the 36541 * provided parameters. 36542 * @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as 36543 * a TR node then the data source for the whole row will be returned. If given as a 36544 * TD/TH cell node then iCol will be automatically calculated and the data for the 36545 * cell returned. If given as an integer, then this is treated as the aoData internal 36546 * data index for the row (see fnGetPosition) and the data for that row used. 36547 * @param {int} [col] Optional column index that you want the data of. 36548 * @returns {array|object|string} If mRow is undefined, then the data for all rows is 36549 * returned. If mRow is defined, just data for that row, and is iCol is 36550 * defined, only data for the designated cell is returned. 36551 * @dtopt API 36552 * @deprecated Since v1.10 36553 * 36554 * @example 36555 * // Row data 36556 * $(document).ready(function() { 36557 * oTable = $('#example').dataTable(); 36558 * 36559 * oTable.$('tr').click( function () { 36560 * var data = oTable.fnGetData( this ); 36561 * // ... do something with the array / object of data for the row 36562 * } ); 36563 * } ); 36564 * 36565 * @example 36566 * // Individual cell data 36567 * $(document).ready(function() { 36568 * oTable = $('#example').dataTable(); 36569 * 36570 * oTable.$('td').click( function () { 36571 * var sData = oTable.fnGetData( this ); 36572 * alert( 'The cell clicked on had the value of '+sData ); 36573 * } ); 36574 * } ); 36575 */ 36576 this.fnGetData = function( src, col ) 36577 { 36578 var api = this.api( true ); 36579 36580 if ( src !== undefined ) { 36581 var type = src.nodeName ? src.nodeName.toLowerCase() : ''; 36582 36583 return col !== undefined || type == 'td' || type == 'th' ? 36584 api.cell( src, col ).data() : 36585 api.row( src ).data() || null; 36586 } 36587 36588 return api.data().toArray(); 36589 }; 36590 36591 36592 /** 36593 * Get an array of the TR nodes that are used in the table's body. Note that you will 36594 * typically want to use the '$' API method in preference to this as it is more 36595 * flexible. 36596 * @param {int} [iRow] Optional row index for the TR element you want 36597 * @returns {array|node} If iRow is undefined, returns an array of all TR elements 36598 * in the table's body, or iRow is defined, just the TR element requested. 36599 * @dtopt API 36600 * @deprecated Since v1.10 36601 * 36602 * @example 36603 * $(document).ready(function() { 36604 * var oTable = $('#example').dataTable(); 36605 * 36606 * // Get the nodes from the table 36607 * var nNodes = oTable.fnGetNodes( ); 36608 * } ); 36609 */ 36610 this.fnGetNodes = function( iRow ) 36611 { 36612 var api = this.api( true ); 36613 36614 return iRow !== undefined ? 36615 api.row( iRow ).node() : 36616 api.rows().nodes().flatten().toArray(); 36617 }; 36618
36619 36620 /** 36621 * Get the array indexes of a particular cell from it's DOM element 36622 * and column index including hidden columns 36623 * @param {node} node this can either be a TR, TD or TH in the table's body 36624 * @returns {int} If nNode is given as a TR, then a single index is returned, or 36625 * if given as a cell, an array of [row index, column index (visible), 36626 * column index (all)] is given. 36627 * @dtopt API 36628 * @deprecated Since v1.10 36629 * 36630 * @example 36631 * $(document).ready(function() { 36632 * $('#example tbody td').click( function () { 36633 * // Get the position of the current data from the node 36634 * var aPos = oTable.fnGetPosition( this ); 36635 * 36636 * // Get the data array for this row 36637 * var aData = oTable.fnGetData( aPos[0] ); 36638 * 36639 * // Update the data array and return the value 36640 * aData[ aPos[1] ] = 'clicked'; 36641 * this.innerHTML = 'clicked'; 36642 * } ); 36643 * 36644 * // Init DataTables 36645 * oTable = $('#example').dataTable(); 36646 * } ); 36647 */ 36648 this.fnGetPosition = function( node ) 36649 { 36650 var api = this.api( true ); 36651 var nodeName = node.nodeName.toUpperCase(); 36652 36653 if ( nodeName == 'TR' ) { 36654 return api.row( node ).index(); 36655 } 36656 else if ( nodeName == 'TD' || nodeName == 'TH' ) { 36657 var cell = api.cell( node ).index(); 36658 36659 return [ 36660 cell.row, 36661 cell.columnVisible, 36662 cell.column 36663 ]; 36664 } 36665 return null; 36666 }; 36667 36668 36669 /** 36670 * Check to see if a row is 'open' or not. 36671 * @param {node} nTr the table row to check 36672 * @returns {boolean} true if the row is currently open, false otherwise 36673 * @dtopt API 36674 * @deprecated Since v1.10 36675 * 36676 * @example 36677 * $(document).ready(function() { 36678 * var oTable; 36679 * 36680 * // 'open' an information row when a row is clicked on 36681 * $('#example tbody tr').click( function () { 36682 * if ( oTable.fnIsOpen(this) ) { 36683 * oTable.fnClose( this ); 36684 * } else { 36685 * oTable.fnOpen( this, "Temporary row opened", "info_row" ); 36686 * } 36687 * } ); 36688 * 36689 * oTable = $('#example').dataTable(); 36690 * } ); 36691 */ 36692 this.fnIsOpen = function( nTr ) 36693 { 36694 return this.api( true ).row( nTr ).child.isShown(); 36695 }; 36696 36697 36698 /** 36699 * This function will place a new row directly after a row which is currently 36700 * on display on the page, with the HTML contents that is passed into the 36701 * function. This can be used, for example, to ask for confirmation that a 36702 * particular record should be deleted. 36703 * @param {node} nTr The table row to 'open' 36704 * @param {string|node|jQuery} mHtml The HTML to put into the row 36705 * @param {string} sClass Class to give the new TD cell 36706 * @returns {node} The row opened. Note that if the table row passed in as the 36707 * first parameter, is not found in the table, this method will silently 36708 * return. 36709 * @dtopt API 36710 * @deprecated Since v1.10 36711 * 36712 * @example 36713 * $(document).ready(function() { 36714 * var oTable; 36715 * 36716 * // 'open' an information row when a row is clicked on 36717 * $('#example tbody tr').click( function () { 36718 * if ( oTable.fnIsOpen(this) ) { 36719 * oTable.fnClose( this ); 36720 * } else { 36721 * oTable.fnOpen( this, "Temporary row opened", "info_row" ); 36722 * } 36723 * } ); 36724 * 36725 * oTable = $('#example').dataTable(); 36726 * } ); 36727 */ 36728 this.fnOpen = function( nTr, mHtml, sClass ) 36729 { 36730 return this.api( true ) 36731 .row( nTr ) 36732 .child( mHtml, sClass ) 36733 .show() 36734 .child()[0]; 36735 }; 36736 36737 36738 /** 36739 * Change the pagination - provides the internal logic for pagination in a simple API 36740 * function. With this function you can have a DataTables table go to the next, 36741 * previous, first or last pages. 36742 * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last" 36743 * or page number to jump to (integer), note that page 0 is the first page. 36744 * @param {bool} [bRedraw=true] Redraw the table or not 36745 * @dtopt API 36746 * @deprecated Since v1.10 36747 * 36748 * @example 36749 * $(document).ready(function() { 36750 * var oTable = $('#example').dataTable(); 36751 * oTable.fnPageChange( 'next' ); 36752 * } ); 36753 */ 36754 this.fnPageChange = function ( mAction, bRedraw ) 36755 { 36756 var api = this.api( true ).page( mAction ); 36757 36758 if ( bRedraw === undefined || bRedraw ) { 36759 api.draw(false); 36760 } 36761 }; 36762 36763 36764 /** 36765 * Show a particular column 36766 * @param {int} iCol The column whose display should be changed 36767 * @param {bool} bShow Show (true) or hide (false) the column 36768 * @param {bool} [bRedraw=true] Redraw the table or not 36769 * @dtopt API 36770 * @deprecated Since v1.10 36771 * 36772 * @example 36773 * $(document).ready(function() { 36774 * var oTable = $('#example').dataTable(); 36775 * 36776 * // Hide the second column after initialisation 36777 * oTable.fnSetColumnVis( 1, false ); 36778 * } ); 36779 */ 36780 this.fnSetColumnVis = function ( iCol, bShow, bRedraw ) 36781 { 36782 var api = this.api( true ).column( iCol ).visible( bShow ); 36783 36784 if ( bRedraw === undefined || bRedraw ) { 36785 api.columns.adjust().draw(); 36786 } 36787 }; 36788 36789 36790 /** 36791 * Get the settings for a particular table for external manipulation 36792 * @returns {object} DataTables settings object. See 36793 * {@link DataTable.models.oSettings} 36794 * @dtopt API 36795 * @deprecated Since v1.10 36796 * 36797 * @example 36798 * $(document).ready(function() { 36799 * var oTable = $('#example').dataTable(); 36800 * var oSettings = oTable.fnSettings(); 36801 * 36802 * // Show an example parameter from the settings 36803 * alert( oSettings._iDisplayStart ); 36804 * } ); 36805 */ 36806 this.fnSettings = function() 36807 {
36808 return _fnSettingsFromNode( this[_ext.iApiIndex] ); 36809 }; 36810 36811 36812 /** 36813 * Sort the table by a particular column 36814 * @param {int} iCol the data index to sort on. Note that this will not match the 36815 * 'display index' if you have hidden data entries 36816 * @dtopt API 36817 * @deprecated Since v1.10 36818 * 36819 * @example 36820 * $(document).ready(function() { 36821 * var oTable = $('#example').dataTable(); 36822 * 36823 * // Sort immediately with columns 0 and 1 36824 * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] ); 36825 * } ); 36826 */ 36827 this.fnSort = function( aaSort ) 36828 { 36829 this.api( true ).order( aaSort ).draw(); 36830 }; 36831 36832 36833 /** 36834 * Attach a sort listener to an element for a given column 36835 * @param {node} nNode the element to attach the sort listener to 36836 * @param {int} iColumn the column that a click on this node will sort on 36837 * @param {function} [fnCallback] callback function when sort is run 36838 * @dtopt API 36839 * @deprecated Since v1.10 36840 * 36841 * @example 36842 * $(document).ready(function() { 36843 * var oTable = $('#example').dataTable(); 36844 * 36845 * // Sort on column 1, when 'sorter' is clicked on 36846 * oTable.fnSortListener( document.getElementById('sorter'), 1 ); 36847 * } ); 36848 */ 36849 this.fnSortListener = function( nNode, iColumn, fnCallback ) 36850 { 36851 this.api( true ).order.listener( nNode, iColumn, fnCallback ); 36852 }; 36853 36854 36855 /** 36856 * Update a table cell or row - this method will accept either a single value to 36857 * update the cell with, an array of values with one element for each column or 36858 * an object in the same format as the original data source. The function is 36859 * self-referencing in order to make the multi column updates easier. 36860 * @param {object|array|string} mData Data to update the cell/row with 36861 * @param {node|int} mRow TR element you want to update or the aoData index 36862 * @param {int} [iColumn] The column to update, give as null or undefined to 36863 * update a whole row. 36864 * @param {bool} [bRedraw=true] Redraw the table or not 36865 * @param {bool} [bAction=true] Perform pre-draw actions or not 36866 * @returns {int} 0 on success, 1 on error 36867 * @dtopt API 36868 * @deprecated Since v1.10 36869 * 36870 * @example 36871 * $(document).ready(function() { 36872 * var oTable = $('#example').dataTable(); 36873 * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell 36874 * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row 36875 * } ); 36876 */ 36877 this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction ) 36878 { 36879 var api = this.api( true ); 36880 36881 if ( iColumn === undefined || iColumn === null ) { 36882 api.row( mRow ).data( mData ); 36883 } 36884 else { 36885 api.cell( mRow, iColumn ).data( mData ); 36886 } 36887 36888 if ( bAction === undefined || bAction ) { 36889 api.columns.adjust(); 36890 } 36891 36892 if ( bRedraw === undefined || bRedraw ) { 36893 api.draw(); 36894 } 36895 return 0; 36896 }; 36897 36898 36899 /** 36900 * Provide a common method for plug-ins to check the version of DataTables being used, in order 36901 * to ensure compatibility. 36902 * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the 36903 * formats "X" and "X.Y" are also acceptable. 36904 * @returns {boolean} true if this version of DataTables is greater or equal to the required 36905 * version, or false if this version of DataTales is not suitable 36906 * @method 36907 * @dtopt API 36908 * @deprecated Since v1.10 36909 * 36910 * @example 36911 * $(document).ready(function() { 36912 * var oTable = $('#example').dataTable(); 36913 * alert( oTable.fnVersionCheck( '1.9.0' ) ); 36914 * } ); 36915 */ 36916 this.fnVersionCheck = _ext.fnVersionCheck; 36917 36918 36919 var _that = this; 36920 var emptyInit = options === undefined; 36921 var len = this.length; 36922 36923 if ( emptyInit ) { 36924 options = {}; 36925 } 36926 36927 this.oApi = this.internal = _ext.internal; 36928 36929 // Extend with old style plug-in API methods 36930 for ( var fn in DataTable.ext.internal ) { 36931 if ( fn ) { 36932 this[fn] = _fnExternApiFunc(fn); 36933 } 36934 } 36935 36936 this.each(function() { 36937 // For each initialisation we want to give it a clean initialisation 36938 // object that can be bashed around 36939 var o = {}; 36940 var oInit = len > 1 ? // optimisation for single table case 36941 _fnExtend( o, options, true ) : 36942 options; 36943 36944 /*global oInit,_that,emptyInit*/ 36945 var i=0, iLen, j, jLen, k, kLen; 36946 var sId = this.getAttribute( 'id' ); 36947 var bInitHandedOff = false;
36948 var defaults = DataTable.defaults; 36949 var $this = $(this); 36950 36951 36952 /* Sanity check */ 36953 if ( this.nodeName.toLowerCase() != 'table' ) 36954 { 36955 _fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 ); 36956 return; 36957 } 36958 36959 /* Backwards compatibility for the defaults */ 36960 _fnCompatOpts( defaults ); 36961 _fnCompatCols( defaults.column ); 36962 36963 /* Convert the camel-case defaults to Hungarian */ 36964 _fnCamelToHungarian( defaults, defaults, true ); 36965 _fnCamelToHungarian( defaults.column, defaults.column, true ); 36966 36967 /* Setting up the initialisation object */ 36968 _fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) ); 36969 36970 36971 36972 /* Check to see if we are re-initialising a table */ 36973 var allSettings = DataTable.settings; 36974 for ( i=0, iLen=allSettings.length ; i<iLen ; i++ ) 36975 { 36976 var s = allSettings[i]; 36977 36978 /* Base check on table node */ 36979 if ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) ) 36980 { 36981 var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve; 36982 var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy; 36983 36984 if ( emptyInit || bRetrieve ) 36985 { 36986 return s.oInstance; 36987 } 36988 else if ( bDestroy ) 36989 { 36990 s.oInstance.fnDestroy(); 36991 break; 36992 } 36993 else 36994 { 36995 _fnLog( s, 0, 'Cannot reinitialise DataTable', 3 ); 36996 return; 36997 } 36998 } 36999 37000 /* If the element we are initialising has the same ID as a table which was previously 37001 * initialised, but the table nodes don't match (from before) then we destroy the old 37002 * instance by simply deleting it. This is under the assumption that the table has been 37003 * destroyed by other methods. Anyone using non-id selectors will need to do this manually 37004 */ 37005 if ( s.sTableId == this.id ) 37006 { 37007 allSettings.splice( i, 1 ); 37008 break; 37009 } 37010 } 37011 37012 /* Ensure the table has an ID - required for accessibility */ 37013 if ( sId === null || sId === "" ) 37014 { 37015 sId = "DataTables_Table_"+(DataTable.ext._unique++); 37016 this.id = sId; 37017 } 37018 37019 /* Create the settings object for this table and set some of the default parameters */ 37020 var oSettings = $.extend( true, {}, DataTable.models.oSettings, { 37021 "sDestroyWidth": $this[0].style.width, 37022 "sInstance": sId, 37023 "sTableId": sId 37024 } ); 37025 oSettings.nTable = this; 37026 oSettings.oApi = _that.internal; 37027 oSettings.oInit = oInit; 37028 37029 allSettings.push( oSettings ); 37030 37031 // Need to add the instance after the instance after the settings object has been added 37032 // to the settings array, so we can self reference the table instance if more than one 37033 oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable(); 37034 37035 // Backwards compatibility, before we apply all the defaults 37036 _fnCompatOpts( oInit ); 37037 37038 if ( oInit.oLanguage ) 37039 { 37040 _fnLanguageCompat( oInit.oLanguage ); 37041 } 37042 37043 // If the length menu is given, but the init display length is not, use the length menu 37044 if ( oInit.aLengthMenu && ! oInit.iDisplayLength ) 37045 { 37046 oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ? 37047 oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0]; 37048 } 37049 37050 // Apply the defaults and init options to make a single init object will all 37051 // options defined from defaults and instance options. 37052 oInit = _fnExtend( $.extend( true, {}, defaults ), oInit ); 37053 37054 37055 // Map the initialisation options onto the settings object 37056 _fnMap( oSettings.oFeatures, oInit, [ 37057 "bPaginate", 37058 "bLengthChange", 37059 "bFilter", 37060 "bSort", 37061 "bSortMulti", 37062 "bInfo", 37063 "bProcessing", 37064 "bAutoWidth", 37065 "bSortClasses", 37066 "bServerSide", 37067 "bDeferRender" 37068 ] ); 37069 _fnMap( oSettings, oInit, [ 37070 "asStripeClasses", 37071 "ajax", 37072 "fnServerData", 37073 "fnFormatNumber", 37074 "sServerMethod", 37075 "aaSorting", 37076 "aaSortingFixed", 37077 "aLengthMenu", 37078 "sPaginationType", 37079 "sAjaxSource", 37080 "sAjaxDataProp", 37081 "iStateDuration", 37082 "sDom", 37083 "bSortCellsTop", 37084 "iTabIndex", 37085 "fnStateLoadCallback", 37086 "fnStateSaveCallback", 37087 "renderer", 37088 "searchDelay", 37089 "rowId", 37090 [ "iCookieDuration", "iStateDuration" ], // backwards compat 37091 [ "oSearch", "oPreviousSearch" ], 37092 [ "aoSearchCols", "aoPreSearchCols" ], 37093 [ "iDisplayLength", "_iDisplayLength" ], 37094 [ "bJQueryUI", "bJUI" ] 37095 ] ); 37096 _fnMap( oSettings.oScroll, oInit, [ 37097 [ "sScrollX", "sX" ], 37098 [ "sScrollXInner", "sXInner" ], 37099 [ "sScrollY", "sY" ],
37100 [ "bScrollCollapse", "bCollapse" ] 37101 ] ); 37102 _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" ); 37103 37104 /* Callback functions which are array driven */ 37105 _fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' ); 37106 _fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' ); 37107 _fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' ); 37108 _fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user' ); 37109 _fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' ); 37110 _fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' ); 37111 _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' ); 37112 _fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' ); 37113 _fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' ); 37114 _fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' ); 37115 _fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' ); 37116 37117 oSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId ); 37118 37119 /* Browser support detection */ 37120 _fnBrowserDetect( oSettings ); 37121 37122 var oClasses = oSettings.oClasses; 37123 37124 // @todo Remove in 1.11 37125 if ( oInit.bJQueryUI ) 37126 { 37127 /* Use the JUI classes object for display. You could clone the oStdClasses object if 37128 * you want to have multiple tables with multiple independent classes 37129 */ 37130 $.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses ); 37131 37132 if ( oInit.sDom === defaults.sDom && defaults.sDom === "lfrtip" ) 37133 { 37134 /* Set the DOM to use a layout suitable for jQuery UI's theming */ 37135 oSettings.sDom = '<"H"lfr>t<"F"ip>'; 37136 } 37137 37138 if ( ! oSettings.renderer ) { 37139 oSettings.renderer = 'jqueryui'; 37140 } 37141 else if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) { 37142 oSettings.renderer.header = 'jqueryui'; 37143 } 37144 } 37145 else 37146 { 37147 $.extend( oClasses, DataTable.ext.classes, oInit.oClasses ); 37148 } 37149 $this.addClass( oClasses.sTable ); 37150 37151 37152 if ( oSettings.iInitDisplayStart === undefined ) 37153 { 37154 /* Display start point, taking into account the save saving */ 37155 oSettings.iInitDisplayStart = oInit.iDisplayStart; 37156 oSettings._iDisplayStart = oInit.iDisplayStart; 37157 } 37158 37159 if ( oInit.iDeferLoading !== null ) 37160 { 37161 oSettings.bDeferLoading = true; 37162 var tmp = $.isArray( oInit.iDeferLoading ); 37163 oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading; 37164 oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading; 37165 } 37166 37167 /* Language definitions */ 37168 var oLanguage = oSettings.oLanguage; 37169 $.extend( true, oLanguage, oInit.oLanguage ); 37170 37171 if ( oLanguage.sUrl !== "" ) 37172 { 37173 /* Get the language definitions from a file - because this Ajax call makes the language 37174 * get async to the remainder of this function we use bInitHandedOff to indicate that 37175 * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor 37176 */ 37177 $.ajax( { 37178 dataType: 'json', 37179 url: oLanguage.sUrl, 37180 success: function ( json ) { 37181 _fnLanguageCompat( json ); 37182 _fnCamelToHungarian( defaults.oLanguage, json ); 37183 $.extend( true, oLanguage, json ); 37184 _fnInitialise( oSettings ); 37185 }, 37186 error: function () { 37187 // Error occurred loading language file, continue on as best we can 37188 _fnInitialise( oSettings ); 37189 } 37190 } ); 37191 bInitHandedOff = true; 37192 } 37193 37194 /* 37195 * Stripes 37196 */ 37197 if ( oInit.asStripeClasses === null ) 37198 { 37199 oSettings.asStripeClasses =[ 37200 oClasses.sStripeOdd, 37201 oClasses.sStripeEven 37202 ]; 37203 } 37204 37205 /* Remove row stripe classes if they are already on the table row */ 37206 var stripeClasses = oSettings.asStripeClasses; 37207 var rowOne = $this.children('tbody').find('tr').eq(0); 37208 if ( $.inArray( true, $.map( stripeClasses, function(el, i) { 37209 return rowOne.hasClass(el); 37210 } ) ) !== -1 ) { 37211 $('tbody tr', this).removeClass( stripeClasses.join(' ') ); 37212 oSettings.asDestroyStripes = stripeClasses.slice(); 37213 } 37214 37215 /* 37216 * Columns 37217 * See if we should load columns automatically or use defined ones 37218 */ 37219 var anThs = []; 37220 var aoColumnsInit; 37221 var nThead = this.getElementsByTagName('thead'); 37222 if ( nThead.length !== 0 ) 37223 { 37224 _fnDetectHeader( oSettings.aoHeader, nThead[0] ); 37225 anThs = _fnGetUniqueThs( oSettings ); 37226 } 37227 37228 /* If not given a column array, generate one with nulls */ 37229 if ( oInit.aoColumns === null ) 37230 { 37231 aoColumnsInit = []; 37232 for ( i=0, iLen=anThs.length ; i<iLen ; i++ ) 37233 { 37234 aoColumnsInit.push( null ); 37235 } 37236 } 37237 else 37238 {
37239 aoColumnsInit = oInit.aoColumns; 37240 } 37241 37242 /* Add the columns */ 37243 for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ ) 37244 { 37245 _fnAddColumn( oSettings, anThs ? anThs[i] : null ); 37246 } 37247 37248 /* Apply the column definitions */ 37249 _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) { 37250 _fnColumnOptions( oSettings, iCol, oDef ); 37251 } ); 37252 37253 /* HTML5 attribute detection - build an mData object automatically if the 37254 * attributes are found 37255 */ 37256 if ( rowOne.length ) { 37257 var a = function ( cell, name ) { 37258 return cell.getAttribute( 'data-'+name ) !== null ? name : null; 37259 }; 37260 37261 $( rowOne[0] ).children('th, td').each( function (i, cell) { 37262 var col = oSettings.aoColumns[i]; 37263 37264 if ( col.mData === i ) { 37265 var sort = a( cell, 'sort' ) || a( cell, 'order' ); 37266 var filter = a( cell, 'filter' ) || a( cell, 'search' ); 37267 37268 if ( sort !== null || filter !== null ) { 37269 col.mData = { 37270 _: i+'.display', 37271 sort: sort !== null ? i+'.@data-'+sort : undefined, 37272 type: sort !== null ? i+'.@data-'+sort : undefined, 37273 filter: filter !== null ? i+'.@data-'+filter : undefined 37274 }; 37275 37276 _fnColumnOptions( oSettings, i ); 37277 } 37278 } 37279 } ); 37280 } 37281 37282 var features = oSettings.oFeatures; 37283 37284 /* Must be done after everything which can be overridden by the state saving! */ 37285 if ( oInit.bStateSave ) 37286 { 37287 features.bStateSave = true; 37288 _fnLoadState( oSettings, oInit ); 37289 _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' ); 37290 } 37291 37292 37293 /* 37294 * Sorting 37295 * @todo For modularisation (1.11) this needs to do into a sort start up handler 37296 */ 37297 37298 // If aaSorting is not defined, then we use the first indicator in asSorting 37299 // in case that has been altered, so the default sort reflects that option 37300 if ( oInit.aaSorting === undefined ) 37301 { 37302 var sorting = oSettings.aaSorting; 37303 for ( i=0, iLen=sorting.length ; i<iLen ; i++ ) 37304 { 37305 sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0]; 37306 } 37307 } 37308 37309 /* Do a first pass on the sorting classes (allows any size changes to be taken into 37310 * account, and also will apply sorting disabled classes if disabled 37311 */ 37312 _fnSortingClasses( oSettings ); 37313 37314 if ( features.bSort ) 37315 { 37316 _fnCallbackReg( oSettings, 'aoDrawCallback', function () { 37317 if ( oSettings.bSorted ) { 37318 var aSort = _fnSortFlatten( oSettings ); 37319 var sortedColumns = {}; 37320 37321 $.each( aSort, function (i, val) { 37322 sortedColumns[ val.src ] = val.dir; 37323 } ); 37324 37325 _fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] ); 37326 _fnSortAria( oSettings ); 37327 } 37328 } ); 37329 } 37330 37331 _fnCallbackReg( oSettings, 'aoDrawCallback', function () { 37332 if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) { 37333 _fnSortingClasses( oSettings ); 37334 } 37335 }, 'sc' ); 37336 37337 37338 /* 37339 * Final init 37340 * Cache the header, body and footer as required, creating them if needed 37341 */ 37342 37343 // Work around for Webkit bug 83867 - store the caption-side before removing from doc 37344 var captions = $this.children('caption').each( function () { 37345 this._captionSide = $this.css('caption-side'); 37346 } ); 37347 37348 var thead = $this.children('thead'); 37349 if ( thead.length === 0 ) 37350 { 37351 thead = $('<thead/>').appendTo(this); 37352 } 37353 oSettings.nTHead = thead[0]; 37354 37355 var tbody = $this.children('tbody'); 37356 if ( tbody.length === 0 ) 37357 { 37358 tbody = $('<tbody/>').appendTo(this); 37359 } 37360 oSettings.nTBody = tbody[0]; 37361 37362 var tfoot = $this.children('tfoot'); 37363 if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") ) 37364 { 37365 // If we are a scrolling table, and no footer has been given, then we need to create 37366 // a tfoot element for the caption element to be appended to 37367 tfoot = $('<tfoot/>').appendTo(this); 37368 } 37369 37370 if ( tfoot.length === 0 || tfoot.children().length === 0 ) { 37371 $this.addClass( oClasses.sNoFooter ); 37372 } 37373 else if ( tfoot.length > 0 ) { 37374 oSettings.nTFoot = tfoot[0]; 37375 _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot ); 37376 } 37377 37378 /* Check if there is data passing into the constructor */ 37379 if ( oInit.aaData ) 37380 { 37381 for ( i=0 ; i<oInit.aaData.length ; i++ ) 37382 { 37383 _fnAddData( oSettings, oInit.aaData[ i ] ); 37384 } 37385 } 37386 else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' ) 37387 { 37388 /* Grab the data from the page - only do this when deferred loading or no Ajax 37389 * source since there is no point in reading the DOM data if we are then going 37390 * to replace it with Ajax data 37391 */ 37392 _fnAddTr( oSettings, $(oSettings.nTBody).children('tr') ); 37393 } 37394 37395 /* Copy the data index array */ 37396 oSettings.aiDisplay = oSettings.aiDisplayMaster.slice(); 37397 37398 /* Initialisation complete - table can be drawn */
37399 oSettings.bInitialised = true; 37400 37401 /* Check if we need to initialise the table (it might not have been handed off to the 37402 * language processor) 37403 */ 37404 if ( bInitHandedOff === false ) 37405 { 37406 _fnInitialise( oSettings ); 37407 } 37408 } ); 37409 _that = null; 37410 return this; 37411 }; 37412 37413 37414 37415 /** 37416 * Computed structure of the DataTables API, defined by the options passed to 37417 * `DataTable.Api.register()` when building the API. 37418 * 37419 * The structure is built in order to speed creation and extension of the Api 37420 * objects since the extensions are effectively pre-parsed. 37421 * 37422 * The array is an array of objects with the following structure, where this 37423 * base array represents the Api prototype base: 37424 * 37425 * [ 37426 * { 37427 * name: 'data' -- string - Property name 37428 * val: function () {}, -- function - Api method (or undefined if just an object 37429 * methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result 37430 * propExt: [ ... ] -- array - Array of Api object definitions to extend the property 37431 * }, 37432 * { 37433 * name: 'row' 37434 * val: {}, 37435 * methodExt: [ ... ], 37436 * propExt: [ 37437 * { 37438 * name: 'data' 37439 * val: function () {}, 37440 * methodExt: [ ... ], 37441 * propExt: [ ... ] 37442 * }, 37443 * ... 37444 * ] 37445 * } 37446 * ] 37447 * 37448 * @type {Array} 37449 * @ignore 37450 */ 37451 var __apiStruct = []; 37452 37453 37454 /** 37455 * `Array.prototype` reference. 37456 * 37457 * @type object 37458 * @ignore 37459 */ 37460 var __arrayProto = Array.prototype; 37461 37462 37463 /** 37464 * Abstraction for `context` parameter of the `Api` constructor to allow it to 37465 * take several different forms for ease of use. 37466 * 37467 * Each of the input parameter types will be converted to a DataTables settings 37468 * object where possible. 37469 * 37470 * @param {string|node|jQuery|object} mixed DataTable identifier. Can be one 37471 * of: 37472 * 37473 * * `string` - jQuery selector. Any DataTables' matching the given selector 37474 * with be found and used. 37475 * * `node` - `TABLE` node which has already been formed into a DataTable. 37476 * * `jQuery` - A jQuery object of `TABLE` nodes. 37477 * * `object` - DataTables settings object 37478 * * `DataTables.Api` - API instance 37479 * @return {array|null} Matching DataTables settings objects. `null` or 37480 * `undefined` is returned if no matching DataTable is found. 37481 * @ignore 37482 */ 37483 var _toSettings = function ( mixed ) 37484 { 37485 var idx, jq; 37486 var settings = DataTable.settings; 37487 var tables = $.map( settings, function (el, i) { 37488 return el.nTable; 37489 } ); 37490 37491 if ( ! mixed ) { 37492 return []; 37493 } 37494 else if ( mixed.nTable && mixed.oApi ) { 37495 // DataTables settings object 37496 return [ mixed ]; 37497 } 37498 else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) { 37499 // Table node 37500 idx = $.inArray( mixed, tables ); 37501 return idx !== -1 ? [ settings[idx] ] : null; 37502 } 37503 else if ( mixed && typeof mixed.settings === 'function' ) { 37504 return mixed.settings().toArray(); 37505 } 37506 else if ( typeof mixed === 'string' ) { 37507 // jQuery selector 37508 jq = $(mixed); 37509 } 37510 else if ( mixed instanceof $ ) { 37511 // jQuery object (also DataTables instance) 37512 jq = mixed; 37513 } 37514 37515 if ( jq ) { 37516 return jq.map( function(i) { 37517 idx = $.inArray( this, tables ); 37518 return idx !== -1 ? settings[idx] : null; 37519 } ).toArray(); 37520 } 37521 }; 37522 37523 37524 /** 37525 * DataTables API class - used to control and interface with one or more 37526 * DataTables enhanced tables. 37527 * 37528 * The API class is heavily based on jQuery, presenting a chainable interface 37529 * that you can use to interact with tables. Each instance of the API class has 37530 * a "context" - i.e. the tables that it will operate on. This could be a single 37531 * table, all tables on a page or a sub-set thereof. 37532 * 37533 * Additionally the API is designed to allow you to easily work with the data in 37534 * the tables, retrieving and manipulating it as required. This is done by 37535 * presenting the API class as an array like interface. The contents of the 37536 * array depend upon the actions requested by each method (for example 37537 * `rows().nodes()` will return an array of nodes, while `rows().data()` will
37538 * return an array of objects or arrays depending upon your table's 37539 * configuration). The API object has a number of array like methods (`push`, 37540 * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`, 37541 * `unique` etc) to assist your working with the data held in a table. 37542 * 37543 * Most methods (those which return an Api instance) are chainable, which means 37544 * the return from a method call also has all of the methods available that the 37545 * top level object had. For example, these two calls are equivalent: 37546 * 37547 * // Not chained 37548 * api.row.add( {...} ); 37549 * api.draw(); 37550 * 37551 * // Chained 37552 * api.row.add( {...} ).draw(); 37553 * 37554 * @class DataTable.Api 37555 * @param {array|object|string|jQuery} context DataTable identifier. This is 37556 * used to define which DataTables enhanced tables this API will operate on. 37557 * Can be one of: 37558 * 37559 * * `string` - jQuery selector. Any DataTables' matching the given selector 37560 * with be found and used. 37561 * * `node` - `TABLE` node which has already been formed into a DataTable. 37562 * * `jQuery` - A jQuery object of `TABLE` nodes. 37563 * * `object` - DataTables settings object 37564 * @param {array} [data] Data to initialise the Api instance with. 37565 * 37566 * @example 37567 * // Direct initialisation during DataTables construction 37568 * var api = $('#example').DataTable(); 37569 * 37570 * @example 37571 * // Initialisation using a DataTables jQuery object 37572 * var api = $('#example').dataTable().api(); 37573 * 37574 * @example 37575 * // Initialisation as a constructor 37576 * var api = new $.fn.DataTable.Api( 'table.dataTable' ); 37577 */ 37578 _Api = function ( context, data ) 37579 { 37580 if ( ! (this instanceof _Api) ) { 37581 return new _Api( context, data ); 37582 } 37583 37584 var settings = []; 37585 var ctxSettings = function ( o ) { 37586 var a = _toSettings( o ); 37587 if ( a ) { 37588 settings = settings.concat( a ); 37589 } 37590 }; 37591 37592 if ( $.isArray( context ) ) { 37593 for ( var i=0, ien=context.length ; i<ien ; i++ ) { 37594 ctxSettings( context[i] ); 37595 } 37596 } 37597 else { 37598 ctxSettings( context ); 37599 } 37600 37601 // Remove duplicates 37602 this.context = _unique( settings ); 37603 37604 // Initial data 37605 if ( data ) { 37606 $.merge( this, data ); 37607 } 37608 37609 // selector 37610 this.selector = { 37611 rows: null, 37612 cols: null, 37613 opts: null 37614 }; 37615 37616 _Api.extend( this, this, __apiStruct ); 37617 }; 37618 37619 DataTable.Api = _Api; 37620 37621 // Don't destroy the existing prototype, just extend it. Required for jQuery 2's 37622 // isPlainObject. 37623 $.extend( _Api.prototype, { 37624 any: function () 37625 { 37626 return this.count() !== 0; 37627 }, 37628 37629 37630 concat: __arrayProto.concat, 37631 37632 37633 context: [], // array of table settings objects 37634 37635 37636 count: function () 37637 { 37638 return this.flatten().length; 37639 }, 37640 37641 37642 each: function ( fn ) 37643 { 37644 for ( var i=0, ien=this.length ; i<ien; i++ ) { 37645 fn.call( this, this[i], i, this ); 37646 } 37647 37648 return this; 37649 }, 37650 37651 37652 eq: function ( idx ) 37653 { 37654 var ctx = this.context; 37655 37656 return ctx.length > idx ? 37657 new _Api( ctx[idx], this[idx] ) : 37658 null; 37659 }, 37660 37661 37662 filter: function ( fn ) 37663 { 37664 var a = []; 37665 37666 if ( __arrayProto.filter ) { 37667 a = __arrayProto.filter.call( this, fn, this ); 37668 } 37669 else { 37670 // Compatibility for browsers without EMCA-252-5 (JS 1.6) 37671 for ( var i=0, ien=this.length ; i<ien ; i++ ) { 37672 if ( fn.call( this, this[i], i, this ) ) { 37673 a.push( this[i] ); 37674 } 37675 } 37676 } 37677 37678 return new _Api( this.context, a ); 37679 }, 37680 37681 37682 flatten: function () 37683 { 37684 var a = []; 37685 return new _Api( this.context, a.concat.apply( a, this.toArray() ) ); 37686 }, 37687 37688 37689 join: __arrayProto.join, 37690 37691 37692 indexOf: __arrayProto.indexOf || function (obj, start) 37693 { 37694 for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) { 37695 if ( this[i] === obj ) { 37696 return i; 37697 } 37698 } 37699 return -1; 37700 }, 37701 37702 iterator: function ( flatten, type, fn, alwaysNew ) { 37703 var 37704 a = [], ret, 37705 i, ien, j, jen, 37706 context = this.context, 37707 rows, items, item, 37708 selector = this.selector; 37709 37710 // Argument shifting 37711 if ( typeof flatten === 'string' ) { 37712 alwaysNew = fn; 37713 fn = type; 37714 type = flatten; 37715 flatten = false; 37716 } 37717 37718 for ( i=0, ien=context.length ; i<ien ; i++ ) { 37719 var apiInst = new _Api( context[i] ); 37720 37721 if ( type === 'table' ) { 37722 ret = fn.call( apiInst, context[i], i ); 37723 37724 if ( ret !== undefined ) { 37725 a.push( ret ); 37726 } 37727 } 37728 else if ( type === 'columns' || type === 'rows' ) { 37729 // this has same length as context - one entry for each table 37730 ret = fn.call( apiInst, context[i], this[i], i ); 37731 37732 if ( ret !== undefined ) { 37733 a.push( ret ); 37734 } 37735 } 37736 else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) { 37737 // columns and rows share the same structure. 37738 // 'this' is an array of column indexes for each context 37739 items = this[i]; 37740 37741 if ( type === 'column-rows' ) { 37742 rows = _selector_row_indexes( context[i], selector.opts ); 37743 } 37744 37745 for ( j=0, jen=items.length ; j<jen ; j++ ) { 37746 item = items[j]; 37747 37748 if ( type === 'cell' ) { 37749 ret = fn.call( apiInst, context[i], item.row, item.column, i, j ); 37750 } 37751 else { 37752 ret = fn.call( apiInst, context[i], item, i, j, rows ); 37753 } 37754 37755 if ( ret !== undefined ) { 37756 a.push( ret ); 37757 } 37758 } 37759 } 37760 } 37761 37762 if ( a.length || alwaysNew ) { 37763 var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a ); 37764 var apiSelector = api.selector; 37765 apiSelector.rows = selector.rows; 37766 apiSelector.cols = selector.cols; 37767 apiSelector.opts = selector.opts; 37768 return api; 37769 } 37770 return this; 37771 }, 37772 37773 37774 lastIndexOf: __arrayProto.lastIndexOf || function (obj, start) 37775 { 37776 // Bit cheeky... 37777 return this.indexOf.apply( this.toArray.reverse(), arguments ); 37778 }, 37779 37780 37781 length: 0, 37782 37783 37784 map: function ( fn ) 37785 { 37786 var a = []; 37787 37788 if ( __arrayProto.map ) { 37789 a = __arrayProto.map.call( this, fn, this ); 37790 } 37791 else { 37792 // Compatibility for browsers without EMCA-252-5 (JS 1.6) 37793 for ( var i=0, ien=this.length ; i<ien ; i++ ) { 37794 a.push( fn.call( this, this[i], i ) ); 37795 } 37796 } 37797 37798 return new _Api( this.context, a ); 37799 }, 37800 37801 37802 pluck: function ( prop ) 37803 { 37804 return this.map( function ( el ) { 37805 return el[ prop ]; 37806 } ); 37807 }, 37808 37809 pop: __arrayProto.pop, 37810 37811 37812 push: __arrayProto.push, 37813 37814 37815 // Does not return an API instance 37816 reduce: __arrayProto.reduce || function ( fn, init ) 37817 { 37818 return _fnReduce( this, fn, init, 0, this.length, 1 ); 37819 }, 37820 37821 37822 reduceRight: __arrayProto.reduceRight || function ( fn, init ) 37823 { 37824 return _fnReduce( this, fn, init, this.length-1, -1, -1 ); 37825 }, 37826 37827 37828 reverse: __arrayProto.reverse, 37829 37830 37831 // Object with rows, columns and opts 37832 selector: null, 37833 37834 37835 shift: __arrayProto.shift, 37836 37837 37838 sort: __arrayProto.sort, // ? name - order? 37839 37840 37841 splice: __arrayProto.splice, 37842 37843 37844 toArray: function () 37845 { 37846 return __arrayProto.slice.call( this ); 37847 }, 37848 37849 37850 to$: function () 37851 { 37852 return $( this ); 37853 }, 37854 37855 37856 toJQuery: function () 37857 { 37858 return $( this ); 37859 }, 37860 37861 37862 unique: function () 37863 { 37864 return new _Api( this.context, _unique(this) ); 37865 }, 37866 37867 37868 unshift: __arrayProto.unshift 37869 } ); 37870 37871 37872 _Api.extend = function ( scope, obj, ext ) 37873 { 37874 // Only extend API instances and static properties of the API 37875 if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) { 37876 return; 37877 } 37878 37879 var 37880 i, ien, 37881 j, jen, 37882 struct, inner, 37883 methodScoping = function ( scope, fn, struc ) { 37884 return function () { 37885 var ret = fn.apply( scope, arguments ); 37886 37887 // Method extension 37888 _Api.extend( ret, ret, struc.methodExt ); 37889 return ret; 37890 }; 37891 }; 37892 37893 for ( i=0, ien=ext.length ; i<ien ; i++ ) { 37894 struct = ext[i]; 37895 37896 // Value 37897 obj[ struct.name ] = typeof struct.val === 'function' ? 37898 methodScoping( scope, struct.val, struct ) : 37899 $.isPlainObject( struct.val ) ? 37900 {} : 37901 struct.val; 37902 37903 obj[ struct.name ].__dt_wrapper = true; 37904 37905 // Property extension 37906 _Api.extend( scope, obj[ struct.name ], struct.propExt ); 37907 } 37908 }; 37909 37910 37911 // @todo - Is there need for an augment function? 37912 // _Api.augment = function ( inst, name ) 37913 // { 37914 // // Find src object in the structure from the name 37915 // var parts = name.split('.'); 37916 37917 // _Api.extend( inst, obj ); 37918 // }; 37919 37920 37921 // [ 37922 // { 37923 // name: 'data' -- string - Property name 37924 // val: function () {}, -- function - Api method (or undefined if just an object 37925 // methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result 37926 // propExt: [ ... ] -- array - Array of Api object definitions to extend the property 37927 // }, 37928 // { 37929 // name: 'row' 37930 // val: {}, 37931 // methodExt: [ ... ], 37932 // propExt: [ 37933 // { 37934 // name: 'data' 37935 // val: function () {}, 37936 // methodExt: [ ... ], 37937 // propExt: [ ... ] 37938 // }, 37939 // ... 37940 // ] 37941 // } 37942 // ] 37943 37944 _Api.register = _api_register = function ( name, val ) 37945 { 37946 if ( $.isArray( name ) ) { 37947 for ( var j=0, jen=name.length ; j<jen ; j++ ) { 37948 _Api.register( name[j], val ); 37949 } 37950 return; 37951 } 37952 37953 var 37954 i, ien, 37955 heir = name.split('.'), 37956 struct = __apiStruct, 37957 key, method; 37958 37959 var find = function ( src, name ) { 37960 for ( var i=0, ien=src.length ; i<ien ; i++ ) { 37961 if ( src[i].name === name ) { 37962 return src[i]; 37963 } 37964 } 37965 return null; 37966 }; 37967 37968 for ( i=0, ien=heir.length ; i<ien ; i++ ) { 37969 method = heir[i].indexOf('()') !== -1; 37970 key = method ?
37971 heir[i].replace('()', '') : 37972 heir[i]; 37973 37974 var src = find( struct, key ); 37975 if ( ! src ) { 37976 src = { 37977 name: key, 37978 val: {}, 37979 methodExt: [], 37980 propExt: [] 37981 }; 37982 struct.push( src ); 37983 } 37984 37985 if ( i === ien-1 ) { 37986 src.val = val; 37987 } 37988 else { 37989 struct = method ? 37990 src.methodExt : 37991 src.propExt; 37992 } 37993 } 37994 }; 37995 37996 37997 _Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) { 37998 _Api.register( pluralName, val ); 37999 38000 _Api.register( singularName, function () { 38001 var ret = val.apply( this, arguments ); 38002 38003 if ( ret === this ) { 38004 // Returned item is the API instance that was passed in, return it 38005 return this; 38006 } 38007 else if ( ret instanceof _Api ) { 38008 // New API instance returned, want the value from the first item 38009 // in the returned array for the singular result. 38010 return ret.length ? 38011 $.isArray( ret[0] ) ? 38012 new _Api( ret.context, ret[0] ) : // Array results are 'enhanced' 38013 ret[0] : 38014 undefined; 38015 } 38016 38017 // Non-API return - just fire it back 38018 return ret; 38019 } ); 38020 }; 38021 38022 38023 /** 38024 * Selector for HTML tables. Apply the given selector to the give array of 38025 * DataTables settings objects. 38026 * 38027 * @param {string|integer} [selector] jQuery selector string or integer 38028 * @param {array} Array of DataTables settings objects to be filtered 38029 * @return {array} 38030 * @ignore 38031 */ 38032 var __table_selector = function ( selector, a ) 38033 { 38034 // Integer is used to pick out a table by index 38035 if ( typeof selector === 'number' ) { 38036 return [ a[ selector ] ]; 38037 } 38038 38039 // Perform a jQuery selector on the table nodes 38040 var nodes = $.map( a, function (el, i) { 38041 return el.nTable; 38042 } ); 38043 38044 return $(nodes) 38045 .filter( selector ) 38046 .map( function (i) { 38047 // Need to translate back from the table node to the settings 38048 var idx = $.inArray( this, nodes ); 38049 return a[ idx ]; 38050 } ) 38051 .toArray(); 38052 }; 38053 38054 38055 38056 /** 38057 * Context selector for the API's context (i.e. the tables the API instance 38058 * refers to. 38059 * 38060 * @name DataTable.Api#tables 38061 * @param {string|integer} [selector] Selector to pick which tables the iterator 38062 * should operate on. If not given, all tables in the current context are 38063 * used. This can be given as a jQuery selector (for example `':gt(0)'`) to 38064 * select multiple tables or as an integer to select a single table. 38065 * @returns {DataTable.Api} Returns a new API instance if a selector is given. 38066 */ 38067 _api_register( 'tables()', function ( selector ) { 38068 // A new instance is created if there was a selector specified 38069 return selector ? 38070 new _Api( __table_selector( selector, this.context ) ) : 38071 this; 38072 } ); 38073 38074 38075 _api_register( 'table()', function ( selector ) { 38076 var tables = this.tables( selector ); 38077 var ctx = tables.context; 38078 38079 // Truncate to the first matched table 38080 return ctx.length ? 38081 new _Api( ctx[0] ) : 38082 tables; 38083 } ); 38084 38085 38086 _api_registerPlural( 'tables().nodes()', 'table().node()' , function () { 38087 return this.iterator( 'table', function ( ctx ) { 38088 return ctx.nTable; 38089 }, 1 ); 38090 } ); 38091 38092 38093 _api_registerPlural( 'tables().body()', 'table().body()' , function () { 38094 return this.iterator( 'table', function ( ctx ) { 38095 return ctx.nTBody; 38096 }, 1 ); 38097 } ); 38098 38099 38100 _api_registerPlural( 'tables().header()', 'table().header()' , function () { 38101 return this.iterator( 'table', function ( ctx ) { 38102 return ctx.nTHead; 38103 }, 1 ); 38104 } ); 38105 38106 38107 _api_registerPlural( 'tables().footer()', 'table().footer()' , function () { 38108 return this.iterator( 'table', function ( ctx ) { 38109 return ctx.nTFoot; 38110 }, 1 ); 38111 } ); 38112 38113 38114 _api_registerPlural( 'tables().containers()', 'table().container()' , function () { 38115 return this.iterator( 'table', function ( ctx ) { 38116 return ctx.nTableWrapper; 38117 }, 1 ); 38118 } ); 38119 38120 38121 38122 /** 38123 * Redraw the tables in the current context. 38124 */ 38125 _api_register( 'draw()', function ( paging ) { 38126 return this.iterator( 'table', function ( settings ) { 38127 if ( paging === 'page' ) { 38128 _fnDraw( settings ); 38129 } 38130 else { 38131 if ( typeof paging === 'string' ) { 38132 paging = paging === 'full-hold' ? 38133 false : 38134 true; 38135 } 38136 38137 _fnReDraw( settings, paging===false ); 38138 } 38139 } ); 38140 } ); 38141 38142 38143 38144 /** 38145 * Get the current page index. 38146 * 38147 * @return {integer} Current page index (zero based) 38148 *//** 38149 * Set the current page. 38150 * 38151 * Note that if you attempt to show a page which does not exist, DataTables will 38152 * not throw an error, but rather reset the paging. 38153 * 38154 * @param {integer|string} action The paging action to take. This can be one of:
38155 * * `integer` - The page index to jump to 38156 * * `string` - An action to take: 38157 * * `first` - Jump to first page. 38158 * * `next` - Jump to the next page 38159 * * `previous` - Jump to previous page 38160 * * `last` - Jump to the last page. 38161 * @returns {DataTables.Api} this 38162 */ 38163 _api_register( 'page()', function ( action ) { 38164 if ( action === undefined ) { 38165 return this.page.info().page; // not an expensive call 38166 } 38167 38168 // else, have an action to take on all tables 38169 return this.iterator( 'table', function ( settings ) { 38170 _fnPageChange( settings, action ); 38171 } ); 38172 } ); 38173 38174 38175 /** 38176 * Paging information for the first table in the current context. 38177 * 38178 * If you require paging information for another table, use the `table()` method 38179 * with a suitable selector. 38180 * 38181 * @return {object} Object with the following properties set: 38182 * * `page` - Current page index (zero based - i.e. the first page is `0`) 38183 * * `pages` - Total number of pages 38184 * * `start` - Display index for the first record shown on the current page 38185 * * `end` - Display index for the last record shown on the current page 38186 * * `length` - Display length (number of records). Note that generally `start 38187 * + length = end`, but this is not always true, for example if there are 38188 * only 2 records to show on the final page, with a length of 10. 38189 * * `recordsTotal` - Full data set length 38190 * * `recordsDisplay` - Data set length once the current filtering criterion 38191 * are applied. 38192 */ 38193 _api_register( 'page.info()', function ( action ) { 38194 if ( this.context.length === 0 ) { 38195 return undefined; 38196 } 38197 38198 var 38199 settings = this.context[0], 38200 start = settings._iDisplayStart, 38201 len = settings._iDisplayLength, 38202 visRecords = settings.fnRecordsDisplay(), 38203 all = len === -1; 38204 38205 return { 38206 "page": all ? 0 : Math.floor( start / len ), 38207 "pages": all ? 1 : Math.ceil( visRecords / len ), 38208 "start": start, 38209 "end": settings.fnDisplayEnd(), 38210 "length": len, 38211 "recordsTotal": settings.fnRecordsTotal(), 38212 "recordsDisplay": visRecords, 38213 "serverSide": _fnDataSource( settings ) === 'ssp' 38214 }; 38215 } ); 38216 38217 38218 /** 38219 * Get the current page length. 38220 * 38221 * @return {integer} Current page length. Note `-1` indicates that all records 38222 * are to be shown. 38223 *//** 38224 * Set the current page length. 38225 * 38226 * @param {integer} Page length to set. Use `-1` to show all records. 38227 * @returns {DataTables.Api} this 38228 */ 38229 _api_register( 'page.len()', function ( len ) { 38230 // Note that we can't call this function 'length()' because `length` 38231 // is a Javascript property of functions which defines how many arguments 38232 // the function expects. 38233 if ( len === undefined ) { 38234 return this.context.length !== 0 ? 38235 this.context[0]._iDisplayLength : 38236 undefined; 38237 } 38238 38239 // else, set the page length 38240 return this.iterator( 'table', function ( settings ) { 38241 _fnLengthChange( settings, len ); 38242 } ); 38243 } ); 38244 38245 38246 38247 var __reload = function ( settings, holdPosition, callback ) { 38248 // Use the draw event to trigger a callback 38249 if ( callback ) { 38250 var api = new _Api( settings ); 38251 38252 api.one( 'draw', function () { 38253 callback( api.ajax.json() ); 38254 } ); 38255 } 38256 38257 if ( _fnDataSource( settings ) == 'ssp' ) { 38258 _fnReDraw( settings, holdPosition ); 38259 } 38260 else { 38261 _fnProcessingDisplay( settings, true ); 38262 38263 // Cancel an existing request 38264 var xhr = settings.jqXHR; 38265 if ( xhr && xhr.readyState !== 4 ) { 38266 xhr.abort(); 38267 } 38268 38269 // Trigger xhr 38270 _fnBuildAjax( settings, [], function( json ) { 38271 _fnClearTable( settings ); 38272 38273 var data = _fnAjaxDataSrc( settings, json ); 38274 for ( var i=0, ien=data.length ; i<ien ; i++ ) { 38275 _fnAddData( settings, data[i] ); 38276 } 38277 38278 _fnReDraw( settings, holdPosition ); 38279 _fnProcessingDisplay( settings, false ); 38280 } ); 38281 } 38282 }; 38283 38284 38285 /** 38286 * Get the JSON response from the last Ajax request that DataTables made to the 38287 * server. Note that this returns the JSON from the first table in the current 38288 * context. 38289 * 38290 * @return {object} JSON received from the server. 38291 */ 38292 _api_register( 'ajax.json()', function () { 38293 var ctx = this.context; 38294 38295 if ( ctx.length > 0 ) { 38296 return ctx[0].json; 38297 } 38298 38299 // else return undefined; 38300 } ); 38301 38302 38303 /** 38304 * Get the data submitted in the last Ajax request 38305 */ 38306 _api_register( 'ajax.params()', function () { 38307 var ctx = this.context; 38308 38309 if ( ctx.length > 0 ) { 38310 return ctx[0].oAjaxData; 38311 } 38312 38313 // else return undefined; 38314 } ); 38315 38316 38317 /** 38318 * Reload tables from the Ajax data source. Note that this function will 38319 * automatically re-draw the table when the remote data has been loaded. 38320 * 38321 * @param {boolean} [reset=true] Reset (default) or hold the current paging 38322 * position. A full re-sort and re-filter is performed when this method is 38323 * called, which is why the pagination reset is the default action. 38324 * @returns {DataTables.Api} this 38325 */ 38326 _api_register( 'ajax.reload()', function ( callback, resetPaging ) { 38327 return this.iterator( 'table', function (settings) { 38328 __reload( settings, resetPaging===false, callback ); 38329 } ); 38330 } ); 38331 38332 38333 /** 38334 * Get the current Ajax URL. Note that this returns the URL from the first 38335 * table in the current context. 38336 * 38337 * @return {string} Current Ajax source URL 38338 *//** 38339 * Set the Ajax URL. Note that this will set the URL for all tables in the 38340 * current context. 38341 * 38342 * @param {string} url URL to set. 38343 * @returns {DataTables.Api} this 38344 */ 38345 _api_register( 'ajax.url()', function ( url ) { 38346 var ctx = this.context; 38347 38348 if ( url === undefined ) { 38349 // get 38350 if ( ctx.length === 0 ) { 38351 return undefined; 38352 } 38353 ctx = ctx[0]; 38354
38355 return ctx.ajax ? 38356 $.isPlainObject( ctx.ajax ) ? 38357 ctx.ajax.url : 38358 ctx.ajax : 38359 ctx.sAjaxSource; 38360 } 38361 38362 // set 38363 return this.iterator( 'table', function ( settings ) { 38364 if ( $.isPlainObject( settings.ajax ) ) { 38365 settings.ajax.url = url; 38366 } 38367 else { 38368 settings.ajax = url; 38369 } 38370 // No need to consider sAjaxSource here since DataTables gives priority 38371 // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any 38372 // value of `sAjaxSource` redundant. 38373 } ); 38374 } ); 38375 38376 38377 /** 38378 * Load data from the newly set Ajax URL. Note that this method is only 38379 * available when `ajax.url()` is used to set a URL. Additionally, this method 38380 * has the same effect as calling `ajax.reload()` but is provided for 38381 * convenience when setting a new URL. Like `ajax.reload()` it will 38382 * automatically redraw the table once the remote data has been loaded. 38383 * 38384 * @returns {DataTables.Api} this 38385 */ 38386 _api_register( 'ajax.url().load()', function ( callback, resetPaging ) { 38387 // Same as a reload, but makes sense to present it for easy access after a 38388 // url change 38389 return this.iterator( 'table', function ( ctx ) { 38390 __reload( ctx, resetPaging===false, callback ); 38391 } ); 38392 } ); 38393 38394 38395 38396 38397 var _selector_run = function ( type, selector, selectFn, settings, opts ) 38398 { 38399 var 38400 out = [], res, 38401 a, i, ien, j, jen, 38402 selectorType = typeof selector; 38403 38404 // Can't just check for isArray here, as an API or jQuery instance might be 38405 // given with their array like look 38406 if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) { 38407 selector = [ selector ]; 38408 } 38409 38410 for ( i=0, ien=selector.length ; i<ien ; i++ ) { 38411 a = selector[i] && selector[i].split ? 38412 selector[i].split(',') : 38413 [ selector[i] ]; 38414 38415 for ( j=0, jen=a.length ; j<jen ; j++ ) { 38416 res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] ); 38417 38418 if ( res && res.length ) { 38419 out = out.concat( res ); 38420 } 38421 } 38422 } 38423 38424 // selector extensions 38425 var ext = _ext.selector[ type ]; 38426 if ( ext.length ) { 38427 for ( i=0, ien=ext.length ; i<ien ; i++ ) { 38428 out = ext[i]( settings, opts, out ); 38429 } 38430 } 38431 38432 return _unique( out ); 38433 }; 38434 38435 38436 var _selector_opts = function ( opts ) 38437 { 38438 if ( ! opts ) { 38439 opts = {}; 38440 } 38441 38442 // Backwards compatibility for 1.9- which used the terminology filter rather 38443 // than search 38444 if ( opts.filter && opts.search === undefined ) { 38445 opts.search = opts.filter; 38446 } 38447 38448 return $.extend( { 38449 search: 'none', 38450 order: 'current', 38451 page: 'all' 38452 }, opts ); 38453 }; 38454 38455 38456 var _selector_first = function ( inst ) 38457 { 38458 // Reduce the API instance to the first item found 38459 for ( var i=0, ien=inst.length ; i<ien ; i++ ) { 38460 if ( inst[i].length > 0 ) { 38461 // Assign the first element to the first item in the instance 38462 // and truncate the instance and context 38463 inst[0] = inst[i]; 38464 inst[0].length = 1; 38465 inst.length = 1; 38466 inst.context = [ inst.context[i] ]; 38467 38468 return inst; 38469 } 38470 } 38471 38472 // Not found - return an empty instance 38473 inst.length = 0; 38474 return inst; 38475 }; 38476 38477 38478 var _selector_row_indexes = function ( settings, opts ) 38479 { 38480 var 38481 i, ien, tmp, a=[], 38482 displayFiltered = settings.aiDisplay, 38483 displayMaster = settings.aiDisplayMaster; 38484 38485 var 38486 search = opts.search, // none, applied, removed 38487 order = opts.order, // applied, current, index (original - compatibility with 1.9) 38488 page = opts.page; // all, current 38489 38490 if ( _fnDataSource( settings ) == 'ssp' ) { 38491 // In server-side processing mode, most options are irrelevant since 38492 // rows not shown don't exist and the index order is the applied order 38493 // Removed is a special case - for consistency just return an empty 38494 // array 38495 return search === 'removed' ? 38496 [] : 38497 _range( 0, displayMaster.length ); 38498 } 38499 else if ( page == 'current' ) { 38500 // Current page implies that order=current and fitler=applied, since it is 38501 // fairly senseless otherwise, regardless of what order and search actually 38502 // are 38503 for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) { 38504 a.push( displayFiltered[i] ); 38505 } 38506 } 38507 else if ( order == 'current' || order == 'applied' ) { 38508 a = search == 'none' ? 38509 displayMaster.slice() : // no search 38510 search == 'applied' ? 38511 displayFiltered.slice() : // applied search 38512 $.map( displayMaster, function (el, i) { // removed search 38513 return $.inArray( el, displayFiltered ) === -1 ? el : null; 38514 } ); 38515 } 38516 else if ( order == 'index' || order == 'original' ) { 38517 for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) { 38518 if ( search == 'none' ) { 38519 a.push( i ); 38520 } 38521 else { // applied | removed 38522 tmp = $.inArray( i, displayFiltered ); 38523 38524 if ((tmp === -1 && search == 'removed') || 38525 (tmp >= 0 && search == 'applied') ) 38526 { 38527 a.push( i ); 38528 } 38529 } 38530 } 38531 } 38532 38533 return a; 38534 }; 38535 38536 38537 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 38538 * Rows 38539 * 38540 * {} - no selector - use all available rows 38541 * {integer} - row aoData index 38542 * {node} - TR node 38543 * {string} - jQuery selector to apply to the TR elements 38544 * {array} - jQuery array of nodes, or simply an array of TR nodes 38545 * 38546 */ 38547 38548 38549 var __row_selector = function ( settings, selector, opts ) 38550 { 38551 var run = function ( sel ) { 38552 var selInt = _intVal( sel ); 38553 var i, ien; 38554 38555 // Short cut - selector is a number and no options provided (default is 38556 // all records, so no need to check if the index is in there, since it 38557 // must be - dev error if the index doesn't exist). 38558 if ( selInt !== null && ! opts ) { 38559 return [ selInt ]; 38560 } 38561 38562 var rows = _selector_row_indexes( settings, opts ); 38563 38564 if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) { 38565 // Selector - integer 38566 return [ selInt ]; 38567 } 38568 else if ( ! sel ) { 38569 // Selector - none 38570 return rows; 38571 } 38572 38573 // Selector - function 38574 if ( typeof sel === 'function' ) { 38575 return $.map( rows, function (idx) { 38576 var row = settings.aoData[ idx ]; 38577 return sel( idx, row._aData, row.nTr ) ? idx : null; 38578 } ); 38579 } 38580
38581 // Get nodes in the order from the `rows` array with null values removed 38582 var nodes = _removeEmpty( 38583 _pluck_order( settings.aoData, rows, 'nTr' ) 38584 ); 38585 38586 // Selector - node 38587 if ( sel.nodeName ) { 38588 if ( $.inArray( sel, nodes ) !== -1 ) { 38589 return [ sel._DT_RowIndex ]; // sel is a TR node that is in the table 38590 // and DataTables adds a prop for fast lookup 38591 } 38592 } 38593 38594 // ID selector. Want to always be able to select rows by id, regardless 38595 // of if the tr element has been created or not, so can't rely upon 38596 // jQuery here - hence a custom implementation. This does not match 38597 // Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything, 38598 // but to select it using a CSS selector engine (like Sizzle or 38599 // querySelect) it would need to need to be escaped for some characters. 38600 // DataTables simplifies this for row selectors since you can select 38601 // only a row. A # indicates an id any anything that follows is the id - 38602 // unescaped. 38603 if ( typeof sel === 'string' && sel.charAt(0) === '#' ) { 38604 // get row index from id 38605 var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ]; 38606 if ( rowObj !== undefined ) { 38607 return [ rowObj.idx ]; 38608 } 38609 38610 // need to fall through to jQuery in case there is DOM id that 38611 // matches 38612 } 38613 38614 // Selector - jQuery selector string, array of nodes or jQuery object/ 38615 // As jQuery's .filter() allows jQuery objects to be passed in filter, 38616 // it also allows arrays, so this will cope with all three options 38617 return $(nodes) 38618 .filter( sel ) 38619 .map( function () { 38620 return this._DT_RowIndex; 38621 } ) 38622 .toArray(); 38623 }; 38624 38625 return _selector_run( 'row', selector, run, settings, opts ); 38626 }; 38627 38628 38629 _api_register( 'rows()', function ( selector, opts ) { 38630 // argument shifting 38631 if ( selector === undefined ) { 38632 selector = ''; 38633 } 38634 else if ( $.isPlainObject( selector ) ) { 38635 opts = selector; 38636 selector = ''; 38637 } 38638 38639 opts = _selector_opts( opts ); 38640 38641 var inst = this.iterator( 'table', function ( settings ) { 38642 return __row_selector( settings, selector, opts ); 38643 }, 1 ); 38644 38645 // Want argument shifting here and in __row_selector? 38646 inst.selector.rows = selector; 38647 inst.selector.opts = opts; 38648 38649 return inst; 38650 } ); 38651 38652 _api_register( 'rows().nodes()', function () { 38653 return this.iterator( 'row', function ( settings, row ) { 38654 return settings.aoData[ row ].nTr || undefined; 38655 }, 1 ); 38656 } ); 38657 38658 _api_register( 'rows().data()', function () { 38659 return this.iterator( true, 'rows', function ( settings, rows ) { 38660 return _pluck_order( settings.aoData, rows, '_aData' ); 38661 }, 1 ); 38662 } ); 38663 38664 _api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) { 38665 return this.iterator( 'row', function ( settings, row ) { 38666 var r = settings.aoData[ row ]; 38667 return type === 'search' ? r._aFilterData : r._aSortData; 38668 }, 1 ); 38669 } ); 38670 38671 _api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) { 38672 return this.iterator( 'row', function ( settings, row ) { 38673 _fnInvalidate( settings, row, src ); 38674 } ); 38675 } ); 38676 38677 _api_registerPlural( 'rows().indexes()', 'row().index()', function () { 38678 return this.iterator( 'row', function ( settings, row ) { 38679 return row; 38680 }, 1 ); 38681 } ); 38682 38683 _api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) { 38684 var a = []; 38685 var context = this.context; 38686 38687 // `iterator` will drop undefined values, but in this case we want them 38688 for ( var i=0, ien=context.length ; i<ien ; i++ ) { 38689 for ( var j=0, jen=this[i].length ; j<jen ; j++ ) { 38690 var id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData ); 38691 a.push( (hash === true ? '#' : '' )+ id ); 38692 } 38693 } 38694 38695 return new _Api( context, a ); 38696 } ); 38697 38698 _api_registerPlural( 'rows().remove()', 'row().remove()', function () { 38699 var that = this; 38700 38701 this.iterator( 'row', function ( settings, row, thatIdx ) { 38702 var data = settings.aoData; 38703 var rowData = data[ row ]; 38704 38705 data.splice( row, 1 ); 38706 38707 // Update the _DT_RowIndex parameter on all rows in the table 38708 for ( var i=0, ien=data.length ; i<ien ; i++ ) { 38709 if ( data[i].nTr !== null ) { 38710 data[i].nTr._DT_RowIndex = i; 38711 } 38712 } 38713 38714 // Delete from the display arrays 38715 _fnDeleteIndex( settings.aiDisplayMaster, row ); 38716 _fnDeleteIndex( settings.aiDisplay, row ); 38717 _fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes 38718 38719 // Check for an 'overflow' they case for displaying the table 38720 _fnLengthOverflow( settings ); 38721 38722 // Remove the row's ID reference if there is one 38723 var id = settings.rowIdFn( rowData._aData ); 38724 if ( id !== undefined ) { 38725 delete settings.aIds[ id ]; 38726 } 38727 } ); 38728 38729 this.iterator( 'table', function ( settings ) { 38730 for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) { 38731 settings.aoData[i].idx = i; 38732 } 38733 } ); 38734 38735 return this; 38736 } ); 38737 38738 38739 _api_register( 'rows.add()', function ( rows ) { 38740 var newRows = this.iterator( 'table', function ( settings ) { 38741 var row, i, ien; 38742 var out = []; 38743 38744 for ( i=0, ien=rows.length ; i<ien ; i++ ) {
38745 row = rows[i]; 38746 38747 if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) { 38748 out.push( _fnAddTr( settings, row )[0] ); 38749 } 38750 else { 38751 out.push( _fnAddData( settings, row ) ); 38752 } 38753 } 38754 38755 return out; 38756 }, 1 ); 38757 38758 // Return an Api.rows() extended instance, so rows().nodes() etc can be used 38759 var modRows = this.rows( -1 ); 38760 modRows.pop(); 38761 $.merge( modRows, newRows ); 38762 38763 return modRows; 38764 } ); 38765 38766 38767 38768 38769 38770 /** 38771 * 38772 */ 38773 _api_register( 'row()', function ( selector, opts ) { 38774 return _selector_first( this.rows( selector, opts ) ); 38775 } ); 38776 38777 38778 _api_register( 'row().data()', function ( data ) { 38779 var ctx = this.context; 38780 38781 if ( data === undefined ) { 38782 // Get 38783 return ctx.length && this.length ? 38784 ctx[0].aoData[ this[0] ]._aData : 38785 undefined; 38786 } 38787 38788 // Set 38789 ctx[0].aoData[ this[0] ]._aData = data; 38790 38791 // Automatically invalidate 38792 _fnInvalidate( ctx[0], this[0], 'data' ); 38793 38794 return this; 38795 } ); 38796 38797 38798 _api_register( 'row().node()', function () { 38799 var ctx = this.context; 38800 38801 return ctx.length && this.length ? 38802 ctx[0].aoData[ this[0] ].nTr || null : 38803 null; 38804 } ); 38805 38806 38807 _api_register( 'row.add()', function ( row ) { 38808 // Allow a jQuery object to be passed in - only a single row is added from 38809 // it though - the first element in the set 38810 if ( row instanceof $ && row.length ) { 38811 row = row[0]; 38812 } 38813 38814 var rows = this.iterator( 'table', function ( settings ) { 38815 if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) { 38816 return _fnAddTr( settings, row )[0]; 38817 } 38818 return _fnAddData( settings, row ); 38819 } ); 38820 38821 // Return an Api.rows() extended instance, with the newly added row selected 38822 return this.row( rows[0] ); 38823 } ); 38824 38825 38826 38827 var __details_add = function ( ctx, row, data, klass ) 38828 { 38829 // Convert to array of TR elements 38830 var rows = []; 38831 var addRow = function ( r, k ) { 38832 // Recursion to allow for arrays of jQuery objects 38833 if ( $.isArray( r ) || r instanceof $ ) { 38834 for ( var i=0, ien=r.length ; i<ien ; i++ ) { 38835 addRow( r[i], k ); 38836 } 38837 return; 38838 } 38839 38840 // If we get a TR element, then just add it directly - up to the dev 38841 // to add the correct number of columns etc 38842 if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) { 38843 rows.push( r ); 38844 } 38845 else { 38846 // Otherwise create a row with a wrapper 38847 var created = $('<tr><td/></tr>').addClass( k ); 38848 $('td', created) 38849 .addClass( k ) 38850 .html( r ) 38851 [0].colSpan = _fnVisbleColumns( ctx ); 38852 38853 rows.push( created[0] ); 38854 } 38855 }; 38856 38857 addRow( data, klass ); 38858 38859 if ( row._details ) { 38860 row._details.remove(); 38861 } 38862 38863 row._details = $(rows); 38864 38865 // If the children were already shown, that state should be retained 38866 if ( row._detailsShow ) { 38867 row._details.insertAfter( row.nTr ); 38868 } 38869 }; 38870 38871 38872 var __details_remove = function ( api, idx ) 38873 { 38874 var ctx = api.context; 38875 38876 if ( ctx.length ) { 38877 var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ]; 38878 38879 if ( row && row._details ) { 38880 row._details.remove(); 38881 38882 row._detailsShow = undefined; 38883 row._details = undefined; 38884 } 38885 } 38886 }; 38887 38888 38889 var __details_display = function ( api, show ) { 38890 var ctx = api.context; 38891 38892 if ( ctx.length && api.length ) { 38893 var row = ctx[0].aoData[ api[0] ]; 38894 38895 if ( row._details ) { 38896 row._detailsShow = show; 38897 38898 if ( show ) { 38899 row._details.insertAfter( row.nTr ); 38900 } 38901 else { 38902 row._details.detach(); 38903 } 38904 38905 __details_events( ctx[0] ); 38906 } 38907 } 38908 }; 38909 38910 38911 var __details_events = function ( settings ) 38912 { 38913 var api = new _Api( settings ); 38914 var namespace = '.dt.DT_details'; 38915 var drawEvent = 'draw'+namespace; 38916 var colvisEvent = 'column-visibility'+namespace; 38917 var destroyEvent = 'destroy'+namespace; 38918 var data = settings.aoData; 38919 38920 api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent ); 38921 38922 if ( _pluck( data, '_details' ).length > 0 ) { 38923 // On each draw, insert the required elements into the document 38924 api.on( drawEvent, function ( e, ctx ) { 38925 if ( settings !== ctx ) { 38926 return; 38927 } 38928 38929 api.rows( {page:'current'} ).eq(0).each( function (idx) { 38930 // Internal data grab 38931 var row = data[ idx ]; 38932 38933 if ( row._detailsShow ) { 38934 row._details.insertAfter( row.nTr ); 38935 } 38936 } ); 38937 } ); 38938 38939 // Column visibility change - update the colspan 38940 api.on( colvisEvent, function ( e, ctx, idx, vis ) { 38941 if ( settings !== ctx ) { 38942 return; 38943 } 38944 38945 // Update the colspan for the details rows (note, only if it already has 38946 // a colspan) 38947 var row, visible = _fnVisbleColumns( ctx ); 38948 38949 for ( var i=0, ien=data.length ; i<ien ; i++ ) {
38950 row = data[i]; 38951 38952 if ( row._details ) { 38953 row._details.children('td[colspan]').attr('colspan', visible ); 38954 } 38955 } 38956 } ); 38957 38958 // Table destroyed - nuke any child rows 38959 api.on( destroyEvent, function ( e, ctx ) { 38960 if ( settings !== ctx ) { 38961 return; 38962 } 38963 38964 for ( var i=0, ien=data.length ; i<ien ; i++ ) { 38965 if ( data[i]._details ) { 38966 __details_remove( api, i ); 38967 } 38968 } 38969 } ); 38970 } 38971 }; 38972 38973 // Strings for the method names to help minification 38974 var _emp = ''; 38975 var _child_obj = _emp+'row().child'; 38976 var _child_mth = _child_obj+'()'; 38977 38978 // data can be: 38979 // tr 38980 // string 38981 // jQuery or array of any of the above 38982 _api_register( _child_mth, function ( data, klass ) { 38983 var ctx = this.context; 38984 38985 if ( data === undefined ) { 38986 // get 38987 return ctx.length && this.length ? 38988 ctx[0].aoData[ this[0] ]._details : 38989 undefined; 38990 } 38991 else if ( data === true ) { 38992 // show 38993 this.child.show(); 38994 } 38995 else if ( data === false ) { 38996 // remove 38997 __details_remove( this ); 38998 } 38999 else if ( ctx.length && this.length ) { 39000 // set 39001 __details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass ); 39002 } 39003 39004 return this; 39005 } ); 39006 39007 39008 _api_register( [ 39009 _child_obj+'.show()', 39010 _child_mth+'.show()' // only when `child()` was called with parameters (without 39011 ], function ( show ) { // it returns an object and this method is not executed) 39012 __details_display( this, true ); 39013 return this; 39014 } ); 39015 39016 39017 _api_register( [ 39018 _child_obj+'.hide()', 39019 _child_mth+'.hide()' // only when `child()` was called with parameters (without 39020 ], function () { // it returns an object and this method is not executed) 39021 __details_display( this, false ); 39022 return this; 39023 } ); 39024 39025 39026 _api_register( [ 39027 _child_obj+'.remove()', 39028 _child_mth+'.remove()' // only when `child()` was called with parameters (without 39029 ], function () { // it returns an object and this method is not executed) 39030 __details_remove( this ); 39031 return this; 39032 } ); 39033 39034 39035 _api_register( _child_obj+'.isShown()', function () { 39036 var ctx = this.context; 39037 39038 if ( ctx.length && this.length ) { 39039 // _detailsShown as false or undefined will fall through to return false 39040 return ctx[0].aoData[ this[0] ]._detailsShow || false; 39041 } 39042 return false; 39043 } ); 39044 39045 39046 39047 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 39048 * Columns 39049 * 39050 * {integer} - column index (>=0 count from left, <0 count from right) 39051 * "{integer}:visIdx" - visible column index (i.e. translate to column index) (>=0 count from left, <0 count from right) 39052 * "{integer}:visible" - alias for {integer}:visIdx (>=0 count from left, <0 count from right) 39053 * "{string}:name" - column name 39054 * "{string}" - jQuery selector on column header nodes 39055 * 39056 */ 39057 39058 // can be an array of these items, comma separated list, or an array of comma 39059 // separated lists 39060 39061 var __re_column_selector = /^(.+):(name|visIdx|visible)$/; 39062 39063 39064 // r1 and r2 are redundant - but it means that the parameters match for the 39065 // iterator callback in columns().data() 39066 var __columnData = function ( settings, column, r1, r2, rows ) { 39067 var a = []; 39068 for ( var row=0, ien=rows.length ; row<ien ; row++ ) { 39069 a.push( _fnGetCellData( settings, rows[row], column ) ); 39070 } 39071 return a; 39072 }; 39073 39074 39075 var __column_selector = function ( settings, selector, opts ) 39076 { 39077 var 39078 columns = settings.aoColumns, 39079 names = _pluck( columns, 'sName' ), 39080 nodes = _pluck( columns, 'nTh' ); 39081 39082 var run = function ( s ) { 39083 var selInt = _intVal( s ); 39084 39085 // Selector - all 39086 if ( s === '' ) { 39087 return _range( columns.length ); 39088 } 39089 39090 // Selector - index 39091 if ( selInt !== null ) { 39092 return [ selInt >= 0 ? 39093 selInt : // Count from left 39094 columns.length + selInt // Count from right (+ because its a negative value) 39095 ]; 39096 } 39097 39098 // Selector = function 39099 if ( typeof s === 'function' ) { 39100 var rows = _selector_row_indexes( settings, opts ); 39101 39102 return $.map( columns, function (col, idx) { 39103 return s( 39104 idx, 39105 __columnData( settings, idx, 0, 0, rows ), 39106 nodes[ idx ] 39107 ) ? idx : null; 39108 } ); 39109 } 39110 39111 // jQuery or string selector 39112 var match = typeof s === 'string' ? 39113 s.match( __re_column_selector ) : 39114 ''; 39115 39116 if ( match ) { 39117 switch( match[2] ) { 39118 case 'visIdx': 39119 case 'visible': 39120 var idx = parseInt( match[1], 10 ); 39121 // Visible index given, convert to column index 39122 if ( idx < 0 ) { 39123 // Counting from the right 39124 var visColumns = $.map( columns, function (col,i) { 39125 return col.bVisible ? i : null; 39126 } ); 39127 return [ visColumns[ visColumns.length + idx ] ]; 39128 } 39129 // Counting from the left 39130 return [ _fnVisibleToColumnIndex( settings, idx ) ]; 39131 39132 case 'name': 39133 // match by name. `names` is column index complete and in order 39134 return $.map( names, function (name, i) { 39135 return name === match[1] ? i : null; 39136 } ); 39137 } 39138 } 39139 else { 39140 // jQuery selector on the TH elements for the columns 39141 return $( nodes ) 39142 .filter( s ) 39143 .map( function () { 39144 return $.inArray( this, nodes ); // `nodes` is column index complete and in order 39145 } ) 39146 .toArray(); 39147 } 39148 }; 39149 39150 return _selector_run( 'column', selector, run, settings, opts ); 39151 }; 39152 39153 39154 var __setColumnVis = function ( settings, column, vis, recalc ) { 39155 var 39156 cols = settings.aoColumns, 39157 col = cols[ column ], 39158 data = settings.aoData, 39159 row, cells, i, ien, tr; 39160 39161 // Get 39162 if ( vis === undefined ) { 39163 return col.bVisible; 39164 } 39165 39166 // Set 39167 // No change 39168 if ( col.bVisible === vis ) { 39169 return; 39170 } 39171 39172 if ( vis ) { 39173 // Insert column 39174 // Need to decide if we should use appendChild or insertBefore
39175 var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 ); 39176 39177 for ( i=0, ien=data.length ; i<ien ; i++ ) { 39178 tr = data[i].nTr; 39179 cells = data[i].anCells; 39180 39181 if ( tr ) { 39182 // insertBefore can act like appendChild if 2nd arg is null 39183 tr.insertBefore( cells[ column ], cells[ insertBefore ] || null ); 39184 } 39185 } 39186 } 39187 else { 39188 // Remove column 39189 $( _pluck( settings.aoData, 'anCells', column ) ).detach(); 39190 } 39191 39192 // Common actions 39193 col.bVisible = vis; 39194 _fnDrawHead( settings, settings.aoHeader ); 39195 _fnDrawHead( settings, settings.aoFooter ); 39196 39197 if ( recalc === undefined || recalc ) { 39198 // Automatically adjust column sizing 39199 _fnAdjustColumnSizing( settings ); 39200 39201 // Realign columns for scrolling 39202 if ( settings.oScroll.sX || settings.oScroll.sY ) { 39203 _fnScrollDraw( settings ); 39204 } 39205 } 39206 39207 _fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis] ); 39208 39209 _fnSaveState( settings ); 39210 }; 39211 39212 39213 _api_register( 'columns()', function ( selector, opts ) { 39214 // argument shifting 39215 if ( selector === undefined ) { 39216 selector = ''; 39217 } 39218 else if ( $.isPlainObject( selector ) ) { 39219 opts = selector; 39220 selector = ''; 39221 } 39222 39223 opts = _selector_opts( opts ); 39224 39225 var inst = this.iterator( 'table', function ( settings ) { 39226 return __column_selector( settings, selector, opts ); 39227 }, 1 ); 39228 39229 // Want argument shifting here and in _row_selector? 39230 inst.selector.cols = selector; 39231 inst.selector.opts = opts; 39232 39233 return inst; 39234 } ); 39235 39236 _api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) { 39237 return this.iterator( 'column', function ( settings, column ) { 39238 return settings.aoColumns[column].nTh; 39239 }, 1 ); 39240 } ); 39241 39242 _api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) { 39243 return this.iterator( 'column', function ( settings, column ) { 39244 return settings.aoColumns[column].nTf; 39245 }, 1 ); 39246 } ); 39247 39248 _api_registerPlural( 'columns().data()', 'column().data()', function () { 39249 return this.iterator( 'column-rows', __columnData, 1 ); 39250 } ); 39251 39252 _api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () { 39253 return this.iterator( 'column', function ( settings, column ) { 39254 return settings.aoColumns[column].mData; 39255 }, 1 ); 39256 } ); 39257 39258 _api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) { 39259 return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) { 39260 return _pluck_order( settings.aoData, rows, 39261 type === 'search' ? '_aFilterData' : '_aSortData', column 39262 ); 39263 }, 1 ); 39264 } ); 39265 39266 _api_registerPlural( 'columns().nodes()', 'column().nodes()', function () { 39267 return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) { 39268 return _pluck_order( settings.aoData, rows, 'anCells', column ) ; 39269 }, 1 ); 39270 } ); 39271 39272 _api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) { 39273 return this.iterator( 'column', function ( settings, column ) { 39274 if ( vis === undefined ) { 39275 return settings.aoColumns[ column ].bVisible; 39276 } // else 39277 __setColumnVis( settings, column, vis, calc ); 39278 } ); 39279 } ); 39280 39281 _api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) { 39282 return this.iterator( 'column', function ( settings, column ) { 39283 return type === 'visible' ? 39284 _fnColumnIndexToVisible( settings, column ) : 39285 column; 39286 }, 1 ); 39287 } ); 39288 39289 _api_register( 'columns.adjust()', function () { 39290 return this.iterator( 'table', function ( settings ) { 39291 _fnAdjustColumnSizing( settings ); 39292 }, 1 ); 39293 } ); 39294 39295 _api_register( 'column.index()', function ( type, idx ) { 39296 if ( this.context.length !== 0 ) { 39297 var ctx = this.context[0]; 39298 39299 if ( type === 'fromVisible' || type === 'toData' ) { 39300 return _fnVisibleToColumnIndex( ctx, idx ); 39301 } 39302 else if ( type === 'fromData' || type === 'toVisible' ) { 39303 return _fnColumnIndexToVisible( ctx, idx ); 39304 } 39305 } 39306 } ); 39307 39308 _api_register( 'column()', function ( selector, opts ) { 39309 return _selector_first( this.columns( selector, opts ) ); 39310 } ); 39311 39312 39313 39314 39315 var __cell_selector = function ( settings, selector, opts ) 39316 { 39317 var data = settings.aoData; 39318 var rows = _selector_row_indexes( settings, opts ); 39319 var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) ); 39320 var allCells = $( [].concat.apply([], cells) ); 39321 var row; 39322 var columns = settings.aoColumns.length; 39323 var a, i, ien, j, o, host; 39324 39325 var run = function ( s ) { 39326 var fnSelector = typeof s === 'function'; 39327 39328 if ( s === null || s === undefined || fnSelector ) { 39329 // All cells and function selectors 39330 a = []; 39331 39332 for ( i=0, ien=rows.length ; i<ien ; i++ ) {
39333 row = rows[i]; 39334 39335 for ( j=0 ; j<columns ; j++ ) { 39336 o = { 39337 row: row, 39338 column: j 39339 }; 39340 39341 if ( fnSelector ) { 39342 // Selector - function 39343 host = data[ row ]; 39344 39345 if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) { 39346 a.push( o ); 39347 } 39348 } 39349 else { 39350 // Selector - all 39351 a.push( o ); 39352 } 39353 } 39354 } 39355 39356 return a; 39357 } 39358 39359 // Selector - index 39360 if ( $.isPlainObject( s ) ) { 39361 return [s]; 39362 } 39363 39364 // Selector - jQuery filtered cells 39365 return allCells 39366 .filter( s ) 39367 .map( function (i, el) { 39368 if ( el.parentNode ) { 39369 row = el.parentNode._DT_RowIndex; 39370 } 39371 else { 39372 // If no parent node, then the cell is hidden and we'll need 39373 // to traverse the array to find it 39374 for ( i=0, ien=data.length ; i<ien ; i++ ) { 39375 if ( $.inArray( el, data[i].anCells ) !== -1 ) { 39376 row = i; 39377 break; 39378 } 39379 } 39380 } 39381 39382 return { 39383 row: row, 39384 column: $.inArray( el, data[ row ].anCells ) 39385 }; 39386 } ) 39387 .toArray(); 39388 }; 39389 39390 return _selector_run( 'cell', selector, run, settings, opts ); 39391 }; 39392 39393 39394 39395 39396 _api_register( 'cells()', function ( rowSelector, columnSelector, opts ) { 39397 // Argument shifting 39398 if ( $.isPlainObject( rowSelector ) ) { 39399 // Indexes 39400 if ( rowSelector.row === undefined ) { 39401 // Selector options in first parameter 39402 opts = rowSelector; 39403 rowSelector = null; 39404 } 39405 else { 39406 // Cell index objects in first parameter 39407 opts = columnSelector; 39408 columnSelector = null; 39409 } 39410 } 39411 if ( $.isPlainObject( columnSelector ) ) { 39412 opts = columnSelector; 39413 columnSelector = null; 39414 } 39415 39416 // Cell selector 39417 if ( columnSelector === null || columnSelector === undefined ) { 39418 return this.iterator( 'table', function ( settings ) { 39419 return __cell_selector( settings, rowSelector, _selector_opts( opts ) ); 39420 } ); 39421 } 39422 39423 // Row + column selector 39424 var columns = this.columns( columnSelector, opts ); 39425 var rows = this.rows( rowSelector, opts ); 39426 var a, i, ien, j, jen; 39427 39428 var cells = this.iterator( 'table', function ( settings, idx ) { 39429 a = []; 39430 39431 for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) { 39432 for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) { 39433 a.push( { 39434 row: rows[idx][i], 39435 column: columns[idx][j] 39436 } ); 39437 } 39438 } 39439 39440 return a; 39441 }, 1 ); 39442 39443 $.extend( cells.selector, { 39444 cols: columnSelector, 39445 rows: rowSelector, 39446 opts: opts 39447 } ); 39448 39449 return cells; 39450 } ); 39451 39452 39453 _api_registerPlural( 'cells().nodes()', 'cell().node()', function () { 39454 return this.iterator( 'cell', function ( settings, row, column ) { 39455 var cells = settings.aoData[ row ].anCells; 39456 return cells ? 39457 cells[ column ] : 39458 undefined; 39459 }, 1 ); 39460 } ); 39461 39462 39463 _api_register( 'cells().data()', function () { 39464 return this.iterator( 'cell', function ( settings, row, column ) { 39465 return _fnGetCellData( settings, row, column ); 39466 }, 1 ); 39467 } ); 39468 39469 39470 _api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) { 39471 type = type === 'search' ? '_aFilterData' : '_aSortData'; 39472 39473 return this.iterator( 'cell', function ( settings, row, column ) { 39474 return settings.aoData[ row ][ type ][ column ]; 39475 }, 1 ); 39476 } ); 39477 39478 39479 _api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) { 39480 return this.iterator( 'cell', function ( settings, row, column ) { 39481 return _fnGetCellData( settings, row, column, type ); 39482 }, 1 ); 39483 } ); 39484 39485 39486 _api_registerPlural( 'cells().indexes()', 'cell().index()', function () { 39487 return this.iterator( 'cell', function ( settings, row, column ) { 39488 return { 39489 row: row, 39490 column: column, 39491 columnVisible: _fnColumnIndexToVisible( settings, column ) 39492 }; 39493 }, 1 ); 39494 } ); 39495 39496 39497 _api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) { 39498 return this.iterator( 'cell', function ( settings, row, column ) { 39499 _fnInvalidate( settings, row, src, column ); 39500 } ); 39501 } ); 39502 39503 39504 39505 _api_register( 'cell()', function ( rowSelector, columnSelector, opts ) { 39506 return _selector_first( this.cells( rowSelector, columnSelector, opts ) ); 39507 } ); 39508 39509 39510 _api_register( 'cell().data()', function ( data ) { 39511 var ctx = this.context; 39512 var cell = this[0]; 39513 39514 if ( data === undefined ) { 39515 // Get 39516 return ctx.length && cell.length ? 39517 _fnGetCellData( ctx[0], cell[0].row, cell[0].column ) : 39518 undefined; 39519 } 39520 39521 // Set 39522 _fnSetCellData( ctx[0], cell[0].row, cell[0].column, data ); 39523 _fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column ); 39524 39525 return this; 39526 } ); 39527 39528 39529 39530 /** 39531 * Get current ordering (sorting) that has been applied to the table. 39532 * 39533 * @returns {array} 2D array containing the sorting information for the first 39534 * table in the current context. Each element in the parent array represents 39535 * a column being sorted upon (i.e. multi-sorting with two columns would have 39536 * 2 inner arrays). The inner arrays may have 2 or 3 elements. The first is 39537 * the column index that the sorting condition applies to, the second is the 39538 * direction of the sort (`desc` or `asc`) and, optionally, the third is the 39539 * index of the sorting order from the `column.sorting` initialisation array.
39540 *//** 39541 * Set the ordering for the table. 39542 * 39543 * @param {integer} order Column index to sort upon. 39544 * @param {string} direction Direction of the sort to be applied (`asc` or `desc`) 39545 * @returns {DataTables.Api} this 39546 *//** 39547 * Set the ordering for the table. 39548 * 39549 * @param {array} order 1D array of sorting information to be applied. 39550 * @param {array} [...] Optional additional sorting conditions 39551 * @returns {DataTables.Api} this 39552 *//** 39553 * Set the ordering for the table. 39554 * 39555 * @param {array} order 2D array of sorting information to be applied. 39556 * @returns {DataTables.Api} this 39557 */ 39558 _api_register( 'order()', function ( order, dir ) { 39559 var ctx = this.context; 39560 39561 if ( order === undefined ) { 39562 // get 39563 return ctx.length !== 0 ? 39564 ctx[0].aaSorting : 39565 undefined; 39566 } 39567 39568 // set 39569 if ( typeof order === 'number' ) { 39570 // Simple column / direction passed in 39571 order = [ [ order, dir ] ]; 39572 } 39573 else if ( ! $.isArray( order[0] ) ) { 39574 // Arguments passed in (list of 1D arrays) 39575 order = Array.prototype.slice.call( arguments ); 39576 } 39577 // otherwise a 2D array was passed in 39578 39579 return this.iterator( 'table', function ( settings ) { 39580 settings.aaSorting = order.slice(); 39581 } ); 39582 } ); 39583 39584 39585 /** 39586 * Attach a sort listener to an element for a given column 39587 * 39588 * @param {node|jQuery|string} node Identifier for the element(s) to attach the 39589 * listener to. This can take the form of a single DOM node, a jQuery 39590 * collection of nodes or a jQuery selector which will identify the node(s). 39591 * @param {integer} column the column that a click on this node will sort on 39592 * @param {function} [callback] callback function when sort is run 39593 * @returns {DataTables.Api} this 39594 */ 39595 _api_register( 'order.listener()', function ( node, column, callback ) { 39596 return this.iterator( 'table', function ( settings ) { 39597 _fnSortAttachListener( settings, node, column, callback ); 39598 } ); 39599 } ); 39600 39601 39602 // Order by the selected column(s) 39603 _api_register( [ 39604 'columns().order()', 39605 'column().order()' 39606 ], function ( dir ) { 39607 var that = this; 39608 39609 return this.iterator( 'table', function ( settings, i ) { 39610 var sort = []; 39611 39612 $.each( that[i], function (j, col) { 39613 sort.push( [ col, dir ] ); 39614 } ); 39615 39616 settings.aaSorting = sort; 39617 } ); 39618 } ); 39619 39620 39621 39622 _api_register( 'search()', function ( input, regex, smart, caseInsen ) { 39623 var ctx = this.context; 39624 39625 if ( input === undefined ) { 39626 // get 39627 return ctx.length !== 0 ? 39628 ctx[0].oPreviousSearch.sSearch : 39629 undefined; 39630 } 39631 39632 // set 39633 return this.iterator( 'table', function ( settings ) { 39634 if ( ! settings.oFeatures.bFilter ) { 39635 return; 39636 } 39637 39638 _fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, { 39639 "sSearch": input+"", 39640 "bRegex": regex === null ? false : regex, 39641 "bSmart": smart === null ? true : smart, 39642 "bCaseInsensitive": caseInsen === null ? true : caseInsen 39643 } ), 1 ); 39644 } ); 39645 } ); 39646 39647 39648 _api_registerPlural( 39649 'columns().search()', 39650 'column().search()', 39651 function ( input, regex, smart, caseInsen ) { 39652 return this.iterator( 'column', function ( settings, column ) { 39653 var preSearch = settings.aoPreSearchCols; 39654 39655 if ( input === undefined ) { 39656 // get 39657 return preSearch[ column ].sSearch; 39658 } 39659 39660 // set 39661 if ( ! settings.oFeatures.bFilter ) { 39662 return; 39663 } 39664 39665 $.extend( preSearch[ column ], { 39666 "sSearch": input+"", 39667 "bRegex": regex === null ? false : regex, 39668 "bSmart": smart === null ? true : smart, 39669 "bCaseInsensitive": caseInsen === null ? true : caseInsen 39670 } ); 39671 39672 _fnFilterComplete( settings, settings.oPreviousSearch, 1 ); 39673 } ); 39674 } 39675 ); 39676 39677 /* 39678 * State API methods 39679 */ 39680 39681 _api_register( 'state()', function () { 39682 return this.context.length ? 39683 this.context[0].oSavedState : 39684 null; 39685 } ); 39686 39687 39688 _api_register( 'state.clear()', function () { 39689 return this.iterator( 'table', function ( settings ) { 39690 // Save an empty object 39691 settings.fnStateSaveCallback.call( settings.oInstance, settings, {} ); 39692 } ); 39693 } ); 39694 39695 39696 _api_register( 'state.loaded()', function () { 39697 return this.context.length ? 39698 this.context[0].oLoadedState : 39699 null; 39700 } ); 39701 39702 39703 _api_register( 'state.save()', function () { 39704 return this.iterator( 'table', function ( settings ) { 39705 _fnSaveState( settings ); 39706 } ); 39707 } ); 39708 39709 39710 39711 /**
39712 * Provide a common method for plug-ins to check the version of DataTables being 39713 * used, in order to ensure compatibility. 39714 * 39715 * @param {string} version Version string to check for, in the format "X.Y.Z". 39716 * Note that the formats "X" and "X.Y" are also acceptable. 39717 * @returns {boolean} true if this version of DataTables is greater or equal to 39718 * the required version, or false if this version of DataTales is not 39719 * suitable 39720 * @static 39721 * @dtopt API-Static 39722 * 39723 * @example 39724 * alert( $.fn.dataTable.versionCheck( '1.9.0' ) ); 39725 */ 39726 DataTable.versionCheck = DataTable.fnVersionCheck = function( version ) 39727 { 39728 var aThis = DataTable.version.split('.'); 39729 var aThat = version.split('.'); 39730 var iThis, iThat; 39731 39732 for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) { 39733 iThis = parseInt( aThis[i], 10 ) || 0; 39734 iThat = parseInt( aThat[i], 10 ) || 0; 39735 39736 // Parts are the same, keep comparing 39737 if (iThis === iThat) { 39738 continue; 39739 } 39740 39741 // Parts are different, return immediately 39742 return iThis > iThat; 39743 } 39744 39745 return true; 39746 }; 39747 39748 39749 /** 39750 * Check if a `<table>` node is a DataTable table already or not. 39751 * 39752 * @param {node|jquery|string} table Table node, jQuery object or jQuery 39753 * selector for the table to test. Note that if more than more than one 39754 * table is passed on, only the first will be checked 39755 * @returns {boolean} true the table given is a DataTable, or false otherwise 39756 * @static 39757 * @dtopt API-Static 39758 * 39759 * @example 39760 * if ( ! $.fn.DataTable.isDataTable( '#example' ) ) { 39761 * $('#example').dataTable(); 39762 * } 39763 */ 39764 DataTable.isDataTable = DataTable.fnIsDataTable = function ( table ) 39765 { 39766 var t = $(table).get(0); 39767 var is = false; 39768 39769 $.each( DataTable.settings, function (i, o) { 39770 var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null; 39771 var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null; 39772 39773 if ( o.nTable === t || head === t || foot === t ) { 39774 is = true; 39775 } 39776 } ); 39777 39778 return is; 39779 }; 39780 39781 39782 /** 39783 * Get all DataTable tables that have been initialised - optionally you can 39784 * select to get only currently visible tables. 39785 * 39786 * @param {boolean} [visible=false] Flag to indicate if you want all (default) 39787 * or visible tables only. 39788 * @returns {array} Array of `table` nodes (not DataTable instances) which are 39789 * DataTables 39790 * @static 39791 * @dtopt API-Static 39792 * 39793 * @example 39794 * $.each( $.fn.dataTable.tables(true), function () { 39795 * $(table).DataTable().columns.adjust(); 39796 * } ); 39797 */ 39798 DataTable.tables = DataTable.fnTables = function ( visible ) 39799 { 39800 var api = false; 39801 39802 if ( $.isPlainObject( visible ) ) { 39803 api = visible.api; 39804 visible = visible.visible; 39805 } 39806 39807 var a = $.map( DataTable.settings, function (o) { 39808 if ( !visible || (visible && $(o.nTable).is(':visible')) ) { 39809 return o.nTable; 39810 } 39811 } ); 39812 39813 return api ? 39814 new _Api( a ) : 39815 a; 39816 }; 39817 39818 39819 /** 39820 * DataTables utility methods 39821 * 39822 * This namespace provides helper methods that DataTables uses internally to 39823 * create a DataTable, but which are not exclusively used only for DataTables. 39824 * These methods can be used by extension authors to save the duplication of 39825 * code. 39826 * 39827 * @namespace 39828 */ 39829 DataTable.util = { 39830 /** 39831 * Throttle the calls to a function. Arguments and context are maintained 39832 * for the throttled function. 39833 * 39834 * @param {function} fn Function to be called 39835 * @param {integer} freq Call frequency in mS 39836 * @return {function} Wrapped function 39837 */ 39838 throttle: _fnThrottle, 39839 39840 39841 /** 39842 * Escape a string such that it can be used in a regular expression 39843 * 39844 * @param {string} sVal string to escape 39845 * @returns {string} escaped string 39846 */ 39847 escapeRegex: _fnEscapeRegex 39848 }; 39849 39850 39851 /** 39852 * Convert from camel case parameters to Hungarian notation. This is made public 39853 * for the extensions to provide the same ability as DataTables core to accept 39854 * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase 39855 * parameters. 39856 * 39857 * @param {object} src The model object which holds all parameters that can be 39858 * mapped. 39859 * @param {object} user The object to convert from camel case to Hungarian. 39860 * @param {boolean} force When set to `true`, properties which already have a 39861 * Hungarian value in the `user` object will be overwritten. Otherwise they 39862 * won't be. 39863 */ 39864 DataTable.camelToHungarian = _fnCamelToHungarian; 39865 39866 39867 39868 /** 39869 * 39870 */ 39871 _api_register( '$()', function ( selector, opts ) { 39872 var 39873 rows = this.rows( opts ).nodes(), // Get all rows 39874 jqRows = $(rows); 39875 39876 return $( [].concat( 39877 jqRows.filter( selector ).toArray(), 39878 jqRows.find( selector ).toArray() 39879 ) ); 39880 } ); 39881 39882 39883 // jQuery functions to operate on the tables 39884 $.each( [ 'on', 'one', 'off' ], function (i, key) { 39885 _api_register( key+'()', function ( /* event, handler */ ) { 39886 var args = Array.prototype.slice.call(arguments); 39887 39888 // Add the `dt` namespace automatically if it isn't already present 39889 if ( ! args[0].match(/\.dt\b/) ) { 39890 args[0] += '.dt'; 39891 } 39892 39893 var inst = $( this.tables().nodes() ); 39894 inst[key].apply( inst, args ); 39895 return this; 39896 } ); 39897 } ); 39898 39899 39900 _api_register( 'clear()', function () { 39901 return this.iterator( 'table', function ( settings ) { 39902 _fnClearTable( settings ); 39903 } ); 39904 } ); 39905 39906 39907 _api_register( 'settings()', function () { 39908 return new _Api( this.context, this.context ); 39909 } ); 39910 39911 39912 _api_register( 'init()', function () { 39913 var ctx = this.context; 39914 return ctx.length ? ctx[0].oInit : null; 39915 } ); 39916 39917 39918 _api_register( 'data()', function () { 39919 return this.iterator( 'table', function ( settings ) { 39920 return _pluck( settings.aoData, '_aData' ); 39921 } ).flatten(); 39922 } ); 39923 39924 39925 _api_register( 'destroy()', function ( remove ) { 39926 remove = remove || false; 39927 39928 return this.iterator( 'table', function ( settings ) { 39929 var orig = settings.nTableWrapper.parentNode; 39930 var classes = settings.oClasses; 39931 var table = settings.nTable; 39932 var tbody = settings.nTBody; 39933 var thead = settings.nTHead; 39934 var tfoot = settings.nTFoot; 39935 var jqTable = $(table); 39936 var jqTbody = $(tbody); 39937 var jqWrapper = $(settings.nTableWrapper); 39938 var rows = $.map( settings.aoData, function (r) { return r.nTr; } ); 39939 var i, ien; 39940 39941 // Flag to note that the table is currently being destroyed - no action 39942 // should be taken 39943 settings.bDestroying = true; 39944
39945 // Fire off the destroy callbacks for plug-ins etc 39946 _fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] ); 39947 39948 // If not being removed from the document, make all columns visible 39949 if ( ! remove ) { 39950 new _Api( settings ).columns().visible( true ); 39951 } 39952 39953 // Blitz all `DT` namespaced events (these are internal events, the 39954 // lowercase, `dt` events are user subscribed and they are responsible 39955 // for removing them 39956 jqWrapper.unbind('.DT').find(':not(tbody *)').unbind('.DT'); 39957 $(window).unbind('.DT-'+settings.sInstance); 39958 39959 // When scrolling we had to break the table up - restore it 39960 if ( table != thead.parentNode ) { 39961 jqTable.children('thead').detach(); 39962 jqTable.append( thead ); 39963 } 39964 39965 if ( tfoot && table != tfoot.parentNode ) { 39966 jqTable.children('tfoot').detach(); 39967 jqTable.append( tfoot ); 39968 } 39969 39970 settings.aaSorting = []; 39971 settings.aaSortingFixed = []; 39972 _fnSortingClasses( settings ); 39973 39974 $( rows ).removeClass( settings.asStripeClasses.join(' ') ); 39975 39976 $('th, td', thead).removeClass( classes.sSortable+' '+ 39977 classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone 39978 ); 39979 39980 if ( settings.bJUI ) { 39981 $('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).detach(); 39982 $('th, td', thead).each( function () { 39983 var wrapper = $('div.'+classes.sSortJUIWrapper, this); 39984 $(this).append( wrapper.contents() ); 39985 wrapper.detach(); 39986 } ); 39987 } 39988 39989 // Add the TR elements back into the table in their original order 39990 jqTbody.children().detach(); 39991 jqTbody.append( rows ); 39992 39993 // Remove the DataTables generated nodes, events and classes 39994 var removedMethod = remove ? 'remove' : 'detach'; 39995 jqTable[ removedMethod ](); 39996 jqWrapper[ removedMethod ](); 39997 39998 // If we need to reattach the table to the document 39999 if ( ! remove && orig ) { 40000 // insertBefore acts like appendChild if !arg[1] 40001 orig.insertBefore( table, settings.nTableReinsertBefore ); 40002 40003 // Restore the width of the original table - was read from the style property, 40004 // so we can restore directly to that 40005 jqTable 40006 .css( 'width', settings.sDestroyWidth ) 40007 .removeClass( classes.sTable ); 40008 40009 // If the were originally stripe classes - then we add them back here. 40010 // Note this is not fool proof (for example if not all rows had stripe 40011 // classes - but it's a good effort without getting carried away 40012 ien = settings.asDestroyStripes.length; 40013 40014 if ( ien ) { 40015 jqTbody.children().each( function (i) { 40016 $(this).addClass( settings.asDestroyStripes[i % ien] ); 40017 } ); 40018 } 40019 } 40020 40021 /* Remove the settings object from the settings array */ 40022 var idx = $.inArray( settings, DataTable.settings ); 40023 if ( idx !== -1 ) { 40024 DataTable.settings.splice( idx, 1 ); 40025 } 40026 } ); 40027 } ); 40028 40029 40030 // Add the `every()` method for rows, columns and cells in a compact form 40031 $.each( [ 'column', 'row', 'cell' ], function ( i, type ) { 40032 _api_register( type+'s().every()', function ( fn ) { 40033 return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) { 40034 // Rows and columns: 40035 // arg1 - index 40036 // arg2 - table counter 40037 // arg3 - loop counter 40038 // arg4 - undefined 40039 // Cells: 40040 // arg1 - row index 40041 // arg2 - column index 40042 // arg3 - table counter 40043 // arg4 - loop counter 40044 fn.call( 40045 new _Api( settings )[ type ]( arg1, type==='cell' ? arg2 : undefined ), 40046 arg1, arg2, arg3, arg4 40047 ); 40048 } ); 40049 } ); 40050 } ); 40051 40052 40053 // i18n method for extensions to be able to use the language object from the 40054 // DataTable 40055 _api_register( 'i18n()', function ( token, def, plural ) { 40056 var ctx = this.context[0]; 40057 var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage ); 40058 40059 if ( resolved === undefined ) { 40060 resolved = def; 40061 } 40062 40063 if ( plural !== undefined && $.isPlainObject( resolved ) ) { 40064 resolved = resolved[ plural ] !== undefined ? 40065 resolved[ plural ] : 40066 resolved._; 40067 } 40068 40069 return resolved.replace( '%d', plural ); // nb: plural might be undefined, 40070 } ); 40071 40072 /** 40073 * Version string for plug-ins to check compatibility. Allowed format is 40074 * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used 40075 * only for non-release builds. See http://semver.org/ for more information. 40076 * @member 40077 * @type string 40078 * @default Version number 40079 */
40080 DataTable.version = "1.10.9"; 40081 40082 /** 40083 * Private data store, containing all of the settings objects that are 40084 * created for the tables on a given page. 40085 * 40086 * Note that the `DataTable.settings` object is aliased to 40087 * `jQuery.fn.dataTableExt` through which it may be accessed and 40088 * manipulated, or `jQuery.fn.dataTable.settings`. 40089 * @member 40090 * @type array 40091 * @default [] 40092 * @private 40093 */ 40094 DataTable.settings = []; 40095 40096 /** 40097 * Object models container, for the various models that DataTables has 40098 * available to it. These models define the objects that are used to hold 40099 * the active state and configuration of the table. 40100 * @namespace 40101 */ 40102 DataTable.models = {}; 40103 40104 40105 40106 /** 40107 * Template object for the way in which DataTables holds information about 40108 * search information for the global filter and individual column filters. 40109 * @namespace 40110 */ 40111 DataTable.models.oSearch = { 40112 /** 40113 * Flag to indicate if the filtering should be case insensitive or not 40114 * @type boolean 40115 * @default true 40116 */ 40117 "bCaseInsensitive": true, 40118 40119 /** 40120 * Applied search term 40121 * @type string 40122 * @default <i>Empty string</i> 40123 */ 40124 "sSearch": "", 40125 40126 /** 40127 * Flag to indicate if the search term should be interpreted as a 40128 * regular expression (true) or not (false) and therefore and special 40129 * regex characters escaped. 40130 * @type boolean 40131 * @default false 40132 */ 40133 "bRegex": false, 40134 40135 /** 40136 * Flag to indicate if DataTables is to use its smart filtering or not. 40137 * @type boolean 40138 * @default true 40139 */ 40140 "bSmart": true 40141 }; 40142 40143 40144 40145 40146 /** 40147 * Template object for the way in which DataTables holds information about 40148 * each individual row. This is the object format used for the settings 40149 * aoData array. 40150 * @namespace 40151 */ 40152 DataTable.models.oRow = { 40153 /** 40154 * TR element for the row 40155 * @type node 40156 * @default null 40157 */ 40158 "nTr": null, 40159 40160 /** 40161 * Array of TD elements for each row. This is null until the row has been 40162 * created. 40163 * @type array nodes 40164 * @default [] 40165 */ 40166 "anCells": null, 40167 40168 /** 40169 * Data object from the original data source for the row. This is either 40170 * an array if using the traditional form of DataTables, or an object if 40171 * using mData options. The exact type will depend on the passed in 40172 * data from the data source, or will be an array if using DOM a data 40173 * source. 40174 * @type array|object 40175 * @default [] 40176 */ 40177 "_aData": [], 40178 40179 /** 40180 * Sorting data cache - this array is ostensibly the same length as the 40181 * number of columns (although each index is generated only as it is 40182 * needed), and holds the data that is used for sorting each column in the 40183 * row. We do this cache generation at the start of the sort in order that 40184 * the formatting of the sort data need be done only once for each cell 40185 * per sort. This array should not be read from or written to by anything 40186 * other than the master sorting methods. 40187 * @type array 40188 * @default null 40189 * @private 40190 */ 40191 "_aSortData": null, 40192 40193 /** 40194 * Per cell filtering data cache. As per the sort data cache, used to 40195 * increase the performance of the filtering in DataTables 40196 * @type array 40197 * @default null 40198 * @private 40199 */ 40200 "_aFilterData": null, 40201 40202 /** 40203 * Filtering data cache. This is the same as the cell filtering cache, but 40204 * in this case a string rather than an array. This is easily computed with 40205 * a join on `_aFilterData`, but is provided as a cache so the join isn't 40206 * needed on every search (memory traded for performance) 40207 * @type array 40208 * @default null 40209 * @private 40210 */ 40211 "_sFilterRow": null, 40212 40213 /** 40214 * Cache of the class name that DataTables has applied to the row, so we 40215 * can quickly look at this variable rather than needing to do a DOM check 40216 * on className for the nTr property. 40217 * @type string 40218 * @default <i>Empty string</i> 40219 * @private 40220 */ 40221 "_sRowStripe": "", 40222 40223 /** 40224 * Denote if the original data source was from the DOM, or the data source 40225 * object. This is used for invalidating data, so DataTables can 40226 * automatically read data from the original source, unless uninstructed 40227 * otherwise. 40228 * @type string 40229 * @default null 40230 * @private 40231 */ 40232 "src": null, 40233 40234 /** 40235 * Index in the aoData array. This saves an indexOf lookup when we have the 40236 * object, but want to know the index 40237 * @type integer 40238 * @default -1 40239 * @private 40240 */ 40241 "idx": -1 40242 }; 40243 40244 40245 /** 40246 * Template object for the column information object in DataTables. This object 40247 * is held in the settings aoColumns array and contains all the information that 40248 * DataTables needs about each individual column. 40249 * 40250 * Note that this object is related to {@link DataTable.defaults.column} 40251 * but this one is the internal data store for DataTables's cache of columns. 40252 * It should NOT be manipulated outside of DataTables. Any configuration should 40253 * be done through the initialisation options. 40254 * @namespace 40255 */ 40256 DataTable.models.oColumn = { 40257 /** 40258 * Column index. This could be worked out on-the-fly with $.inArray, but it 40259 * is faster to just hold it as a variable 40260 * @type integer 40261 * @default null 40262 */ 40263 "idx": null, 40264 40265 /** 40266 * A list of the columns that sorting should occur on when this column 40267 * is sorted. That this property is an array allows multi-column s
40267orting 40268 * to be defined for a column (for example first name / last name columns 40269 * would benefit from this). The values are integers pointing to the 40270 * columns to be sorted on (typically it will be a single integer pointing 40271 * at itself, but that doesn't need to be the case). 40272 * @type array 40273 */ 40274 "aDataSort": null, 40275 40276 /** 40277 * Define the sorting directions that are applied to the column, in sequence 40278 * as the column is repeatedly sorted upon - i.e. the first value is used 40279 * as the sorting direction when the column if first sorted (clicked on). 40280 * Sort it again (click again) and it will move on to the next index. 40281 * Repeat until loop. 40282 * @type array 40283 */ 40284 "asSorting": null, 40285 40286 /** 40287 * Flag to indicate if the column is searchable, and thus should be included 40288 * in the filtering or not. 40289 * @type boolean 40290 */ 40291 "bSearchable": null, 40292 40293 /** 40294 * Flag to indicate if the column is sortable or not. 40295 * @type boolean 40296 */ 40297 "bSortable": null, 40298 40299 /** 40300 * Flag to indicate if the column is currently visible in the table or not 40301 * @type boolean 40302 */ 40303 "bVisible": null, 40304 40305 /** 40306 * Store for manual type assignment using the `column.type` option. This 40307 * is held in store so we can manipulate the column's `sType` property. 40308 * @type string 40309 * @default null 40310 * @private 40311 */ 40312 "_sManualType": null, 40313 40314 /** 40315 * Flag to indicate if HTML5 data attributes should be used as the data 40316 * source for filtering or sorting. True is either are. 40317 * @type boolean 40318 * @default false 40319 * @private 40320 */ 40321 "_bAttrSrc": false, 40322 40323 /** 40324 * Developer definable function that is called whenever a cell is created (Ajax source, 40325 * etc) or processed for input (DOM source). This can be used as a compliment to mRender 40326 * allowing you to modify the DOM element (add background colour for example) when the 40327 * element is available. 40328 * @type function 40329 * @param {element} nTd The TD node that has been created 40330 * @param {*} sData The Data for the cell 40331 * @param {array|object} oData The data for the whole row 40332 * @param {int} iRow The row index for the aoData data store 40333 * @default null 40334 */ 40335 "fnCreatedCell": null, 40336 40337 /** 40338 * Function to get data from a cell in a column. You should <b>never</b> 40339 * access data directly through _aData internally in DataTables - always use 40340 * the method attached to this property. It allows mData to function as 40341 * required. This function is automatically assigned by the column 40342 * initialisation method 40343 * @type function 40344 * @param {array|object} oData The data array/object for the array 40345 * (i.e. aoData[]._aData) 40346 * @param {string} sSpecific The specific data type you want to get - 40347 * 'display', 'type' 'filter' 'sort' 40348 * @returns {*} The data for the cell from the given row's data 40349 * @default null 40350 */ 40351 "fnGetData": null, 40352 40353 /** 40354 * Function to set data for a cell in the column. You should <b>never</b> 40355 * set the data directly to _aData internally in DataTables - always use 40356 * this method. It allows mData to function as required. This function 40357 * is automatically assigned by the column initialisation method 40358 * @type function 40359 * @param {array|object} oData The data array/object for the array 40360 * (i.e. aoData[]._aData) 40361 * @param {*} sValue Value to set 40362 * @default null 40363 */ 40364 "fnSetData": null, 40365 40366 /** 40367 * Property to read the value for the cells in the column from the data 40368 * source array / object. If null, then the default content is used, if a 40369 * function is given then the return from the function is used. 40370 * @type function|int|string|null 40371 * @default null 40372 */ 40373 "mData": null, 40374 40375 /** 40376 * Partner property to mData which is used (only when defined) to get 40377 * the data - i.e. it is basically the same as mData, but without the 40378 * 'set' option, and also the data fed to it is the result from mData. 40379 * This is the rendering method to match the data method of mData. 40380 * @type function|int|string|null 40381 * @default null 40382 */ 40383 "mRender": null, 40384 40385 /** 40386 * Unique header TH/TD element for this column - this is what the sorting 40387 * listener is attached to (if sorting is enabled.) 40388 * @type node 40389 * @default null 40390 */ 40391 "nTh": null, 40392 40393 /** 40394 * Unique footer TH/TD element for this column (if there is one). Not used
40395 * in DataTables as such, but can be used for plug-ins to reference the 40396 * footer for each column. 40397 * @type node 40398 * @default null 40399 */ 40400 "nTf": null, 40401 40402 /** 40403 * The class to apply to all TD elements in the table's TBODY for the column 40404 * @type string 40405 * @default null 40406 */ 40407 "sClass": null, 40408 40409 /** 40410 * When DataTables calculates the column widths to assign to each column, 40411 * it finds the longest string in each column and then constructs a 40412 * temporary table and reads the widths from that. The problem with this 40413 * is that "mmm" is much wider then "iiii", but the latter is a longer 40414 * string - thus the calculation can go wrong (doing it properly and putting 40415 * it into an DOM object and measuring that is horribly(!) slow). Thus as 40416 * a "work around" we provide this option. It will append its value to the 40417 * text that is found to be the longest string for the column - i.e. padding. 40418 * @type string 40419 */ 40420 "sContentPadding": null, 40421 40422 /** 40423 * Allows a default value to be given for a column's data, and will be used 40424 * whenever a null data source is encountered (this can be because mData 40425 * is set to null, or because the data source itself is null). 40426 * @type string 40427 * @default null 40428 */ 40429 "sDefaultContent": null, 40430 40431 /** 40432 * Name for the column, allowing reference to the column by name as well as 40433 * by index (needs a lookup to work by name). 40434 * @type string 40435 */ 40436 "sName": null, 40437 40438 /** 40439 * Custom sorting data type - defines which of the available plug-ins in 40440 * afnSortData the custom sorting will use - if any is defined. 40441 * @type string 40442 * @default std 40443 */ 40444 "sSortDataType": 'std', 40445 40446 /** 40447 * Class to be applied to the header element when sorting on this column 40448 * @type string 40449 * @default null 40450 */ 40451 "sSortingClass": null, 40452 40453 /** 40454 * Class to be applied to the header element when sorting on this column - 40455 * when jQuery UI theming is used. 40456 * @type string 40457 * @default null 40458 */ 40459 "sSortingClassJUI": null, 40460 40461 /** 40462 * Title of the column - what is seen in the TH element (nTh). 40463 * @type string 40464 */ 40465 "sTitle": null, 40466 40467 /** 40468 * Column sorting and filtering type 40469 * @type string 40470 * @default null 40471 */ 40472 "sType": null, 40473 40474 /** 40475 * Width of the column 40476 * @type string 40477 * @default null 40478 */ 40479 "sWidth": null, 40480 40481 /** 40482 * Width of the column when it was first "encountered" 40483 * @type string 40484 * @default null 40485 */ 40486 "sWidthOrig": null 40487 }; 40488 40489 40490 /* 40491 * Developer note: The properties of the object below are given in Hungarian 40492 * notation, that was used as the interface for DataTables prior to v1.10, however 40493 * from v1.10 onwards the primary interface is camel case. In order to avoid 40494 * breaking backwards compatibility utterly with this change, the Hungarian 40495 * version is still, internally the primary interface, but is is not documented 40496 * - hence the @name tags in each doc comment. This allows a Javascript function 40497 * to create a map from Hungarian notation to camel case (going the other direction 40498 * would require each property to be listed, which would at around 3K to the size 40499 * of DataTables, while this method is about a 0.5K hit. 40500 * 40501 * Ultimately this does pave the way for Hungarian notation to be dropped 40502 * completely, but that is a massive amount of work and will break current 40503 * installs (therefore is on-hold until v2). 40504 */ 40505 40506 /** 40507 * Initialisation options that can be given to DataTables at initialisation 40508 * time. 40509 * @namespace 40510 */ 40511 DataTable.defaults = { 40512 /** 40513 * An array of data to use for the table, passed in at initialisation which 40514 * will be used in preference to any data which is already in the DOM. This is 40515 * particularly useful for constructing tables purely in Javascript, for 40516 * example with a custom Ajax call. 40517 * @type array 40518 * @default null 40519 * 40520 * @dtopt Option 40521 * @name DataTable.defaults.data 40522 * 40523 * @example 40524 * // Using a 2D array data source 40525 * $(document).ready( function () { 40526 * $('#example').dataTable( { 40527 * "data": [ 40528 * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'], 40529 * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'], 40530 * ], 40531 * "columns": [ 40532 * { "title": "Engine" }, 40533 * { "title": "Browser" }, 40534 * { "title": "Platform" }, 40535 * { "title": "Version" }, 40536 * { "title": "Grade" } 40537 * ] 40538 * } ); 40539 * } ); 40540 * 40541 * @example 40542 * // Using an array of objects as a data source (`data`) 40543 * $(document).ready( function () { 40544 * $('#example').dataTable( { 40545 * "data": [ 40546 * {
40547 * "engine": "Trident", 40548 * "browser": "Internet Explorer 4.0", 40549 * "platform": "Win 95+", 40550 * "version": 4, 40551 * "grade": "X" 40552 * }, 40553 * { 40554 * "engine": "Trident", 40555 * "browser": "Internet Explorer 5.0", 40556 * "platform": "Win 95+", 40557 * "version": 5, 40558 * "grade": "C" 40559 * } 40560 * ], 40561 * "columns": [ 40562 * { "title": "Engine", "data": "engine" }, 40563 * { "title": "Browser", "data": "browser" }, 40564 * { "title": "Platform", "data": "platform" }, 40565 * { "title": "Version", "data": "version" }, 40566 * { "title": "Grade", "data": "grade" } 40567 * ] 40568 * } ); 40569 * } ); 40570 */ 40571 "aaData": null, 40572 40573 40574 /** 40575 * If ordering is enabled, then DataTables will perform a first pass sort on 40576 * initialisation. You can define which column(s) the sort is performed 40577 * upon, and the sorting direction, with this variable. The `sorting` array 40578 * should contain an array for each column to be sorted initially containing 40579 * the column's index and a direction string ('asc' or 'desc'). 40580 * @type array 40581 * @default [[0,'asc']] 40582 * 40583 * @dtopt Option 40584 * @name DataTable.defaults.order 40585 * 40586 * @example 40587 * // Sort by 3rd column first, and then 4th column 40588 * $(document).ready( function() { 40589 * $('#example').dataTable( { 40590 * "order": [[2,'asc'], [3,'desc']] 40591 * } ); 40592 * } ); 40593 * 40594 * // No initial sorting 40595 * $(document).ready( function() { 40596 * $('#example').dataTable( { 40597 * "order": [] 40598 * } ); 40599 * } ); 40600 */ 40601 "aaSorting": [[0,'asc']], 40602 40603 40604 /** 40605 * This parameter is basically identical to the `sorting` parameter, but 40606 * cannot be overridden by user interaction with the table. What this means 40607 * is that you could have a column (visible or hidden) which the sorting 40608 * will always be forced on first - any sorting after that (from the user) 40609 * will then be performed as required. This can be useful for grouping rows 40610 * together. 40611 * @type array 40612 * @default null 40613 * 40614 * @dtopt Option 40615 * @name DataTable.defaults.orderFixed 40616 * 40617 * @example 40618 * $(document).ready( function() { 40619 * $('#example').dataTable( { 40620 * "orderFixed": [[0,'asc']] 40621 * } ); 40622 * } ) 40623 */ 40624 "aaSortingFixed": [], 40625 40626 40627 /** 40628 * DataTables can be instructed to load data to display in the table from a 40629 * Ajax source. This option defines how that Ajax call is made and where to. 40630 * 40631 * The `ajax` property has three different modes of operation, depending on 40632 * how it is defined. These are: 40633 * 40634 * * `string` - Set the URL from where the data should be loaded from. 40635 * * `object` - Define properties for `jQuery.ajax`. 40636 * * `function` - Custom data get function 40637 * 40638 * `string` 40639 * -------- 40640 * 40641 * As a string, the `ajax` property simply defines the URL from which 40642 * DataTables will load data. 40643 * 40644 * `object` 40645 * -------- 40646 * 40647 * As an object, the parameters in the object are passed to 40648 * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control 40649 * of the Ajax request. DataTables has a number of default parameters which 40650 * you can override using this option. Please refer to the jQuery 40651 * documentation for a full description of the options available, although 40652 * the following parameters provide additional options in DataTables or 40653 * require special consideration: 40654 * 40655 * * `data` - As with jQuery, `data` can be provided as an object, but it 40656 * can also be used as a function to manipulate the data DataTables sends 40657 * to the server. The function takes a single parameter, an object of 40658 * parameters with the values that DataTables has readied for sending. An 40659 * object may be returned which will be merged into the DataTables 40660 * defaults, or you can add the items to the object that was passed in and 40661 * not return anything from the function. This supersedes `fnServerParams` 40662 * from DataTables 1.9-. 40663 * 40664 * * `dataSrc` - By default DataTables will look for the property `data` (or 40665 * `aaData` for compatibility with DataTables 1.9-) when obtaining data 40666 * from an Ajax source or for server-side processing - this parameter 40667 * allows that property to be changed. You can use Javascript dotted 40668 * object notation to get a data source for multiple levels of nesting, or 40669 * it my be used as a function. As a function it takes a single parameter, 40670 * the JSON returned from the server, which can be manipulated as 40671 * required, with the returned value being that used by DataTables as the 40672 * data source for the table. This supersedes `sAjaxDataProp` from 40673 * DataTables 1.9-. 40674 * 40675 * * `success` - Should not be overridden it is used internally in 40676 * DataTables. To manipulate / transform the data returned by the server 40677 * use `ajax.dataSrc`, or use `ajax` as a function (see below). 40678 * 40679 * `function` 40680 * ---------- 40681 * 40682 * As a function, making the Ajax call is left up to yourself allowing 40683 * complete control of the Ajax request. Indeed, if desired, a method other 40684 * than Ajax could be used to obtain the required data, such as Web storage 40685 * or an AIR database. 40686 * 40687 * The function is given four parameters and no return is required. The 40688 * parameters are: 40689 * 40690 * 1. _object_ - Data to send to the server 40691 * 2. _function_ - Callback function that must be executed when the required 40692 * data has been obtained. That data should be passed into the callback 40693 * as the only parameter 40694 * 3. _object_ - DataTables settings object for the table 40695 * 40696 * Note that this supersedes `fnServerData` from DataTables 1.9-. 40697 * 40698 * @type string|object|function 40699 * @default null 40700 * 40701 * @dtopt Option 40702 * @name DataTable.defaults.ajax
40703 * @since 1.10.0 40704 * 40705 * @example 40706 * // Get JSON data from a file via Ajax. 40707 * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default). 40708 * $('#example').dataTable( { 40709 * "ajax": "data.json" 40710 * } ); 40711 * 40712 * @example 40713 * // Get JSON data from a file via Ajax, using `dataSrc` to change 40714 * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`) 40715 * $('#example').dataTable( { 40716 * "ajax": { 40717 * "url": "data.json", 40718 * "dataSrc": "tableData" 40719 * } 40720 * } ); 40721 * 40722 * @example 40723 * // Get JSON data from a file via Ajax, using `dataSrc` to read data 40724 * // from a plain array rather than an array in an object 40725 * $('#example').dataTable( { 40726 * "ajax": { 40727 * "url": "data.json", 40728 * "dataSrc": "" 40729 * } 40730 * } ); 40731 * 40732 * @example 40733 * // Manipulate the data returned from the server - add a link to data 40734 * // (note this can, should, be done using `render` for the column - this 40735 * // is just a simple example of how the data can be manipulated). 40736 * $('#example').dataTable( { 40737 * "ajax": { 40738 * "url": "data.json", 40739 * "dataSrc": function ( json ) { 40740 * for ( var i=0, ien=json.length ; i<ien ; i++ ) { 40741 * json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>'; 40742 * } 40743 * return json; 40744 * } 40745 * } 40746 * } ); 40747 * 40748 * @example 40749 * // Add data to the request 40750 * $('#example').dataTable( { 40751 * "ajax": { 40752 * "url": "data.json", 40753 * "data": function ( d ) { 40754 * return { 40755 * "extra_search": $('#extra').val() 40756 * }; 40757 * } 40758 * } 40759 * } ); 40760 * 40761 * @example 40762 * // Send request as POST 40763 * $('#example').dataTable( { 40764 * "ajax": { 40765 * "url": "data.json", 40766 * "type": "POST" 40767 * } 40768 * } ); 40769 * 40770 * @example 40771 * // Get the data from localStorage (could interface with a form for 40772 * // adding, editing and removing rows). 40773 * $('#example').dataTable( { 40774 * "ajax": function (data, callback, settings) { 40775 * callback( 40776 * JSON.parse( localStorage.getItem('dataTablesData') ) 40777 * ); 40778 * } 40779 * } ); 40780 */ 40781 "ajax": null, 40782 40783 40784 /** 40785 * This parameter allows you to readily specify the entries in the length drop 40786 * down menu that DataTables shows when pagination is enabled. It can be 40787 * either a 1D array of options which will be used for both the displayed 40788 * option and the value, or a 2D array which will use the array in the first 40789 * position as the value, and the array in the second position as the 40790 * displayed options (useful for language strings such as 'All'). 40791 * 40792 * Note that the `pageLength` property will be automatically set to the 40793 * first value given in this array, unless `pageLength` is also provided. 40794 * @type array 40795 * @default [ 10, 25, 50, 100 ] 40796 * 40797 * @dtopt Option 40798 * @name DataTable.defaults.lengthMenu 40799 * 40800 * @example 40801 * $(document).ready( function() { 40802 * $('#example').dataTable( { 40803 * "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]] 40804 * } ); 40805 * } ); 40806 */ 40807 "aLengthMenu": [ 10, 25, 50, 100 ], 40808 40809 40810 /** 40811 * The `columns` option in the initialisation parameter allows you to define 40812 * details about the way individual columns behave. For a full list of 40813 * column options that can be set, please see 40814 * {@link DataTable.defaults.column}. Note that if you use `columns` to 40815 * define your columns, you must have an entry in the array for every single 40816 * column that you have in your table (these can be null if you don't which 40817 * to specify any options). 40818 * @member 40819 * 40820 * @name DataTable.defaults.column 40821 */ 40822 "aoColumns": null, 40823 40824 /** 40825 * Very similar to `columns`, `columnDefs` allows you to target a specific 40826 * column, multiple columns, or all columns, using the `targets` property of 40827 * each object in the array. This allows great flexibility when creating 40828 * tables, as the `columnDefs` arrays can be of any length, targeting the 40829 * columns you specifically want. `columnDefs` may use any of the column 40830 * options available: {@link DataTable.defaults.column}, but it _must_ 40831 * have `targets` defined in each object in the array. Values in the `targets` 40832 * array may be: 40833 * <ul> 40834 * <li>
40834a string - class name will be matched on the TH for the column</li> 40835 * <li>0 or a positive integer - column index counting from the left</li> 40836 * <li>a negative integer - column index counting from the right</li> 40837 * <li>the string "_all" - all columns (i.e. assign a default)</li> 40838 * </ul> 40839 * @member 40840 * 40841 * @name DataTable.defaults.columnDefs 40842 */ 40843 "aoColumnDefs": null, 40844 40845 40846 /** 40847 * Basically the same as `search`, this parameter defines the individual column 40848 * filtering state at initialisation time. The array must be of the same size 40849 * as the number of columns, and each element be an object with the parameters 40850 * `search` and `escapeRegex` (the latter is optional). 'null' is also 40851 * accepted and the default will be used. 40852 * @type array 40853 * @default [] 40854 * 40855 * @dtopt Option 40856 * @name DataTable.defaults.searchCols 40857 * 40858 * @example 40859 * $(document).ready( function() { 40860 * $('#example').dataTable( { 40861 * "searchCols": [ 40862 * null, 40863 * { "search": "My filter" }, 40864 * null, 40865 * { "search": "^[0-9]", "escapeRegex": false } 40866 * ] 40867 * } ); 40868 * } ) 40869 */ 40870 "aoSearchCols": [], 40871 40872 40873 /** 40874 * An array of CSS classes that should be applied to displayed rows. This 40875 * array may be of any length, and DataTables will apply each class 40876 * sequentially, looping when required. 40877 * @type array 40878 * @default null <i>
40878Will take the values determined by the `oClasses.stripe*` 40879 * options</i> 40880 * 40881 * @dtopt Option 40882 * @name DataTable.defaults.stripeClasses 40883 * 40884 * @example 40885 * $(document).ready( function() { 40886 * $('#example').dataTable( { 40887 * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ] 40888 * } ); 40889 * } ) 40890 */ 40891 "asStripeClasses": null, 40892 40893 40894 /** 40895 * Enable or disable automatic column width calculation. This can be disabled 40896 * as an optimisation (it takes some time to calculate the widths) if the 40897 * tables widths are passed in using `columns`. 40898 * @type boolean 40899 * @default true 40900 * 40901 * @dtopt Features 40902 * @name DataTable.defaults.autoWidth 40903 * 40904 * @example 40905 * $(document).ready( function () { 40906 * $('#example').dataTable( { 40907 * "autoWidth": false 40908 * } ); 40909 * } ); 40910 */ 40911 "bAutoWidth": true, 40912 40913 40914 /** 40915 * Deferred rendering can provide DataTables with a huge speed boost when you 40916 * are using an Ajax or JS data source for the table. This option, when set to 40917 * true, will cause DataTables to defer the creation of the table elements for 40918 * each row until they are needed for a draw - saving a significant amount of 40919 * time. 40920 * @type boolean 40921 * @default false 40922 * 40923 * @dtopt Features 40924 * @name DataTable.defaults.deferRender 40925 * 40926 * @example 40927 * $(document).ready( function() { 40928 * $('#example').dataTable( { 40929 * "ajax": "sources/arrays.txt", 40930 * "deferRender": true 40931 * } ); 40932 * } ); 40933 */ 40934 "bDeferRender": false, 40935 40936 40937 /** 40938 * Replace a DataTable which matches the given selector and replace it with 40939 * one which has the properties of the new initialisation object passed. If no 40940 * table matches the selector, then the new DataTable will be constructed as 40941 * per normal. 40942 * @type boolean 40943 * @default false 40944 * 40945 * @dtopt Options 40946 * @name DataTable.defaults.destroy 40947 * 40948 * @example 40949 * $(document).ready( function() { 40950 * $('#example').dataTable( { 40951 * "srollY": "200px", 40952 * "paginate": false 40953 * } ); 40954 * 40955 * // Some time later.... 40956 * $('#example').dataTable( { 40957 * "filter": false, 40958 * "destroy": true 40959 * } ); 40960 * } ); 40961 */ 40962 "bDestroy": false, 40963 40964 40965 /** 40966 * Enable or disable filtering of data. Filtering in DataTables is "smart" in 40967 * that it allows the end user to input multiple words (space separated) and 40968 * will match a row containing those words, even if not in the order that was 40969 * specified (this allow matching across multiple columns). Note that if you 40970 * wish to use filtering in DataTables this must remain 'true' - to remove the 40971 * default filtering input box and retain filtering abilities, please use 40972 * {@link DataTable.defaults.dom}. 40973 * @type boolean 40974 * @default true 40975 * 40976 * @dtopt Features 40977 * @name DataTable.defaults.searching 40978 * 40979 * @example 40980 * $(document).ready( function () { 40981 * $('#example').dataTable( { 40982 * "searching": false 40983 * } ); 40984 * } ); 40985 */ 40986 "bFilter": true, 40987 40988 40989 /** 40990 * Enable or disable the table information display. This shows information 40991 * about the data that is currently visible on the page, including information 40992 * about filtered data if that action is being performed. 40993 * @type boolean 40994 * @default true 40995 * 40996 * @dtopt Features 40997 * @name DataTable.defaults.info 40998 * 40999 * @example 41000 * $(document).ready( function () { 41001 * $('#example').dataTable( { 41002 * "info": false 41003 * } ); 41004 * } ); 41005 */ 41006 "bInfo": true, 41007 41008 41009 /** 41010 * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some 41011 * slightly different and additional mark-up from what DataTables has 41012 * traditionally used). 41013 * @type boolean 41014 * @default false 41015 * 41016 * @dtopt Features 41017 * @name DataTable.defaults.jQueryUI 41018 * 41019 * @example 41020 * $(document).ready( function() { 41021 * $('#example').dataTable( { 41022 * "jQueryUI": true 41023 * } ); 41024 * } ); 41025 */ 41026 "bJQueryUI": false, 41027 41028 41029 /** 41030 * Allows the end user to select the size of a formatted page from a select 41031 * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`). 41032 * @type boolean 41033 * @default true 41034 * 41035 * @dtopt Features 41036 * @name DataTable.defaults.lengthChange 41037 * 41038 * @example 41039 * $(document).ready( function () { 41040 * $('#example').dataTable( { 41041 * "lengthChange": false 41042 * } ); 41043 * } ); 41044 */ 41045 "bLengthChange": true, 41046 41047 41048 /** 41049 * Enable or disable pagination. 41050 * @type boolean 41051 * @default true 41052 * 41053 * @dtopt Features 41054 * @name DataTable.defaults.paging 41055 * 41056 * @example 41057 * $(document).ready( function () { 41058 * $('#example').dataTable( { 41059 * "paging": false 41060 * } ); 41061 * } ); 41062 */ 41063 "bPaginate": true, 41064 41065 41066 /** 41067 * Enable or disable the display of a 'processing' indicator when the table is 41068 * being processed (e.g. a sort). This is particularly useful for tables with 41069 * large amounts of data where it can take a noticeable amount of time to sort 41070 * the entries. 41071 * @type boolean 41072 * @default false 41073 * 41074 * @dtopt Features 41075 * @name DataTable.defaults.processing 41076 * 41077 * @example 41078 * $(document).ready( function () { 41079 * $('#example').dataTable( { 41080 * "processing": true 41081 * } ); 41082 * } ); 41083 */ 41084 "bProcessing": false, 41085 41086 41087 /** 41088 * Retrieve the DataTables object for the given selector. Note that if the 41089 * table has already been initialised, this parameter will cause DataTables 41090 * to simply return the object that has already been set up - it will not take 41091 * account of any changes you might have made to the initialisation object 41092 * passed to DataTables (setting this parameter to true is an acknowledgement 41093 * that you understand this). `destroy` can be used to reinitialise a table if 41094 * you need. 41095 * @type boolean 41096 * @default false 41097 * 41098 * @dtopt Options 41099 * @name DataTable.defaults.retrieve 41100 * 41101 * @example 41102 * $(document).ready( function() { 41103 * initTable(); 41104 * tableActions(); 41105 * } ); 41106 * 41107 * function initTable () 41108 * { 41109 * return $('#example').dataTable( { 41110 * "scrollY": "200px", 41111 * "paginate": false, 41112 * "retrieve": true 41113 * } ); 41114 * } 41115 * 41116 * function tableActions () 41117 * { 41118 * var table = initTable(); 41119 * // perform API operations with oTable 41120 * } 41121 */ 41122 "bRetrieve": false, 41123 41124 41125 /** 41126 * When vertical (y) scrolling is enabled, DataTables will force the height of
41127 * the table's viewport to the given height at all times (useful for layout). 41128 * However, this can look odd when filtering data down to a small data set, 41129 * and the footer is left "floating" further down. This parameter (when 41130 * enabled) will cause DataTables to collapse the table's viewport down when 41131 * the result set will fit within the given Y height. 41132 * @type boolean 41133 * @default false 41134 * 41135 * @dtopt Options 41136 * @name DataTable.defaults.scrollCollapse 41137 * 41138 * @example 41139 * $(document).ready( function() { 41140 * $('#example').dataTable( { 41141 * "scrollY": "200", 41142 * "scrollCollapse": true 41143 * } ); 41144 * } ); 41145 */ 41146 "bScrollCollapse": false, 41147 41148 41149 /** 41150 * Configure DataTables to use server-side processing. Note that the 41151 * `ajax` parameter must also be given in order to give DataTables a 41152 * source to obtain the required data for each draw. 41153 * @type boolean 41154 * @default false 41155 * 41156 * @dtopt Features 41157 * @dtopt Server-side 41158 * @name DataTable.defaults.serverSide 41159 * 41160 * @example 41161 * $(document).ready( function () { 41162 * $('#example').dataTable( { 41163 * "serverSide": true, 41164 * "ajax": "xhr.php" 41165 * } ); 41166 * } ); 41167 */ 41168 "bServerSide": false, 41169 41170 41171 /** 41172 * Enable or disable sorting of columns. Sorting of individual columns can be 41173 * disabled by the `sortable` option for each column. 41174 * @type boolean 41175 * @default true 41176 * 41177 * @dtopt Features 41178 * @name DataTable.defaults.ordering 41179 * 41180 * @example 41181 * $(document).ready( function () { 41182 * $('#example').dataTable( { 41183 * "ordering": false 41184 * } ); 41185 * } ); 41186 */ 41187 "bSort": true, 41188 41189 41190 /** 41191 * Enable or display DataTables' ability to sort multiple columns at the 41192 * same time (activated by shift-click by the user). 41193 * @type boolean 41194 * @default true 41195 * 41196 * @dtopt Options 41197 * @name DataTable.defaults.orderMulti 41198 * 41199 * @example 41200 * // Disable multiple column sorting ability 41201 * $(document).ready( function () { 41202 * $('#example').dataTable( { 41203 * "orderMulti": false 41204 * } ); 41205 * } ); 41206 */ 41207 "bSortMulti": true, 41208 41209 41210 /** 41211 * Allows control over whether DataTables should use the top (true) unique 41212 * cell that is found for a single column, or the bottom (false - default). 41213 * This is useful when using complex headers. 41214 * @type boolean 41215 * @default false 41216 * 41217 * @dtopt Options 41218 * @name DataTable.defaults.orderCellsTop 41219 * 41220 * @example 41221 * $(document).ready( function() { 41222 * $('#example').dataTable( { 41223 * "orderCellsTop": true 41224 * } ); 41225 * } ); 41226 */ 41227 "bSortCellsTop": false, 41228 41229 41230 /** 41231 * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and 41232 * `sorting\_3` to the columns which are currently being sorted on. This is 41233 * presented as a feature switch as it can increase processing time (while 41234 * classes are removed and added) so for large data sets you might want to 41235 * turn this off. 41236 * @type boolean 41237 * @default true 41238 * 41239 * @dtopt Features 41240 * @name DataTable.defaults.orderClasses 41241 * 41242 * @example 41243 * $(document).ready( function () { 41244 * $('#example').dataTable( { 41245 * "orderClasses": false 41246 * } ); 41247 * } ); 41248 */ 41249 "bSortClasses": true, 41250 41251 41252 /** 41253 * Enable or disable state saving. When enabled HTML5 `localStorage` will be 41254 * used to save table display information such as pagination information, 41255 * display length, filtering and sorting. As such when the end user reloads 41256 * the page the display display will match what thy had previously set up. 41257 * 41258 * Due to the use of `localStorage` the default state saving is not supported 41259 * in IE6 or 7. If state saving is required in those browsers, use 41260 * `stateSaveCallback` to provide a storage solution such as cookies. 41261 * @type boolean 41262 * @default false 41263 * 41264 * @dtopt Features 41265 * @name DataTable.defaults.stateSave 41266 * 41267 * @example 41268 * $(document).ready( function () { 41269 * $('#example').dataTable( { 41270 * "stateSave": true 41271 * } ); 41272 * } ); 41273 */ 41274 "bStateSave": false, 41275 41276 41277 /** 41278 * This function is called when a TR element is created (and all TD child 41279 * elements have been inserted), or registered if using a DOM source, allowing 41280 * manipulation of the TR element (adding classes etc). 41281 * @type function 41282 * @param {node} row "TR" element for the current row 41283 * @param {array} data Raw data array for this row 41284 * @param {int} dataIndex The index of this row in the internal aoData array 41285 * 41286 * @dtopt Callbacks 41287 * @name DataTable.defaults.createdRow 41288 * 41289 * @example 41290 * $(document).ready( function() { 41291 * $('#example').dataTable( { 41292 * "createdRow": function( row, data, dataIndex ) { 41293 * // Bold the grade for all 'A' grade browsers 41294 * if ( data[4] == "A" ) 41295 * { 41296 * $('td:eq(4)', row).html( '<b>A</b>' ); 41297 * } 41298 * } 41299 * } ); 41300 * } ); 41301 */ 41302 "fnCreatedRow": null, 41303 41304 41305 /** 41306 * This function is called on every 'draw' event, and allows you to 41307 * dynamically modify any aspect you want about the created DOM. 41308 * @type function 41309 * @param {object} settings DataTables settings object 41310 * 41311 * @dtopt Callbacks 41312 * @name DataTable.defaults.drawCallback 41313 * 41314 * @example 41315 * $(document).ready( function() { 41316 * $('#example').dataTable( { 41317 * "drawCallback": function( settings ) { 41318 * alert( 'DataTables has redrawn the table' ); 41319 * } 41320 * } ); 41321 * } ); 41322 */ 41323 "fnDrawCallback": null, 41324 41325 41326 /** 41327 * Identical to fnHeaderCallback() but for the table footer this function 41328 * allows you to modify the table footer on every 'draw' event. 41329 * @type function 41330 * @param {node} foot "TR" element for the footer 41331 * @param {array} data Full table data (as derived from the original HTML) 41332 * @param {int} start Index for the current display starting point in the 41333 * display array 41334 * @param {int} end Index for the current display ending point in the 41335 * display array 41336 * @param {array int} display Index array to translate the visual position 41337 * to the full data array 41338 * 41339 * @dtopt Callbacks 41340 * @name DataTable.defaults.footerCallback 41341 * 41342 * @example 41343 * $(document).ready( function() { 41344 * $('#example').dataTable( { 41345 * "footerCallback": function( tfoot, data, start, end, display ) { 41346 * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start; 41347 * } 41348 * } ); 41349 * } ) 41350 */ 41351 "fnFooterCallback": null, 41352 41353 41354 /** 41355 * When rendering large numbers in the information element for the table 41356 * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers 41357 * to have a comma separator for the 'thousands' units (e.g. 1 million is 41358 * rendered as "1,000,000") to help readability for the end user. This 41359 * function will override the default method DataTables uses. 41360 * @type function 41361 * @member 41362 * @param {int} toFormat number to be formatted 41363 * @returns {string} formatted string for DataTables to show the number 41364 * 41365 * @dtopt Callbacks 41366 * @name DataTable.defaults.formatNumber 41367 * 41368 * @example 41369 * // Format a number using a single quote for the separator (note that
41370 * // this can also be done with the language.thousands option) 41371 * $(document).ready( function() { 41372 * $('#example').dataTable( { 41373 * "formatNumber": function ( toFormat ) { 41374 * return toFormat.toString().replace( 41375 * /\B(?=(\d{3})+(?!\d))/g, "'" 41376 * ); 41377 * }; 41378 * } ); 41379 * } ); 41380 */ 41381 "fnFormatNumber": function ( toFormat ) { 41382 return toFormat.toString().replace( 41383 /\B(?=(\d{3})+(?!\d))/g, 41384 this.oLanguage.sThousands 41385 ); 41386 }, 41387 41388 41389 /** 41390 * This function is called on every 'draw' event, and allows you to 41391 * dynamically modify the header row. This can be used to calculate and 41392 * display useful information about the table. 41393 * @type function 41394 * @param {node} head "TR" element for the header 41395 * @param {array} data Full table data (as derived from the original HTML) 41396 * @param {int} start Index for the current display starting point in the 41397 * display array 41398 * @param {int} end Index for the current display ending point in the 41399 * display array 41400 * @param {array int} display Index array to translate the visual position 41401 * to the full data array 41402 * 41403 * @dtopt Callbacks 41404 * @name DataTable.defaults.headerCallback 41405 * 41406 * @example 41407 * $(document).ready( function() { 41408 * $('#example').dataTable( { 41409 * "fheaderCallback": function( head, data, start, end, display ) { 41410 * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records"; 41411 * } 41412 * } ); 41413 * } ) 41414 */ 41415 "fnHeaderCallback": null, 41416 41417 41418 /** 41419 * The information element can be used to convey information about the current 41420 * state of the table. Although the internationalisation options presented by 41421 * DataTables are quite capable of dealing with most customisations, there may 41422 * be times where you wish to customise the string further. This callback 41423 * allows you to do exactly that. 41424 * @type function 41425 * @param {object} oSettings DataTables settings object 41426 * @param {int} start Starting position in data for the draw 41427 * @param {int} end End position in data for the draw 41428 * @param {int} max Total number of rows in the table (regardless of 41429 * filtering) 41430 * @param {int} total Total number of rows in the data set, after filtering 41431 * @param {string} pre The string that DataTables has formatted using it's 41432 * own rules 41433 * @returns {string} The string to be displayed in the information element. 41434 * 41435 * @dtopt Callbacks 41436 * @name DataTable.defaults.infoCallback 41437 * 41438 * @example 41439 * $('#example').dataTable( { 41440 * "infoCallback": function( settings, start, end, max, total, pre ) { 41441 * return start +" to "+ end; 41442 * } 41443 * } ); 41444 */ 41445 "fnInfoCallback": null, 41446 41447 41448 /** 41449 * Called when the table has been initialised. Normally DataTables will 41450 * initialise sequentially and there will be no need for this function, 41451 * however, this does not hold true when using external language information 41452 * since that is obtained using an async XHR call. 41453 * @type function 41454 * @param {object} settings DataTables settings object 41455 * @param {object} json The JSON object request from the server - only 41456 * present if client-side Ajax sourced data is used 41457 * 41458 * @dtopt Callbacks 41459 * @name DataTable.defaults.initComplete 41460 * 41461 * @example 41462 * $(document).ready( function() { 41463 * $('#example').dataTable( { 41464 * "initComplete": function(settings, json) { 41465 * alert( 'DataTables has finished its initialisation.' ); 41466 * } 41467 * } ); 41468 * } ) 41469 */ 41470 "fnInitComplete": null, 41471 41472 41473 /** 41474 * Called at the very start of each table draw and can be used to cancel the 41475 * draw by returning false, any other return (including undefined) results in 41476 * the full draw occurring). 41477 * @type function 41478 * @param {object} settings DataTables settings object 41479 * @returns {boolean} False will cancel the draw, anything else (including no 41480 * return) will allow it to complete. 41481 * 41482 * @dtopt Callbacks 41483 * @name DataTable.defaults.preDrawCallback 41484 * 41485 * @example 41486 * $(document).ready( function() { 41487 * $('#example').dataTable( { 41488 * "preDrawCallback": function( settings ) { 41489 * if ( $('#test').val() == 1 ) { 41490 * return false;
41491 * } 41492 * } 41493 * } ); 41494 * } ); 41495 */ 41496 "fnPreDrawCallback": null, 41497 41498 41499 /** 41500 * This function allows you to 'post process' each row after it have been 41501 * generated for each table draw, but before it is rendered on screen. This 41502 * function might be used for setting the row class name etc. 41503 * @type function 41504 * @param {node} row "TR" element for the current row 41505 * @param {array} data Raw data array for this row 41506 * @param {int} displayIndex The display index for the current table draw 41507 * @param {int} displayIndexFull The index of the data in the full list of 41508 * rows (after filtering) 41509 * 41510 * @dtopt Callbacks 41511 * @name DataTable.defaults.rowCallback 41512 * 41513 * @example 41514 * $(document).ready( function() { 41515 * $('#example').dataTable( { 41516 * "rowCallback": function( row, data, displayIndex, displayIndexFull ) { 41517 * // Bold the grade for all 'A' grade browsers 41518 * if ( data[4] == "A" ) { 41519 * $('td:eq(4)', row).html( '<b>A</b>' ); 41520 * } 41521 * } 41522 * } ); 41523 * } ); 41524 */ 41525 "fnRowCallback": null, 41526 41527 41528 /** 41529 * __Deprecated__ The functionality provided by this parameter has now been 41530 * superseded by that provided through `ajax`, which should be used instead. 41531 * 41532 * This parameter allows you to override the default function which obtains 41533 * the data from the server so something more suitable for your application. 41534 * For example you could use POST data, or pull information from a Gears or 41535 * AIR database. 41536 * @type function 41537 * @member 41538 * @param {string} source HTTP source to obtain the data from (`ajax`) 41539 * @param {array} data A key/value pair object containing the data to send 41540 * to the server 41541 * @param {function} callback to be called on completion of the data get 41542 * process that will draw the data on the page. 41543 * @param {object} settings DataTables settings object 41544 * 41545 * @dtopt Callbacks 41546 * @dtopt Server-side 41547 * @name DataTable.defaults.serverData 41548 * 41549 * @deprecated 1.10. Please use `ajax` for this functionality now. 41550 */ 41551 "fnServerData": null, 41552 41553 41554 /** 41555 * __Deprecated__ The functionality provided by this parameter has now been 41556 * superseded by that provided through `ajax`, which should be used instead. 41557 * 41558 * It is often useful to send extra data to the server when making an Ajax 41559 * request - for example custom filtering information, and this callback 41560 * function makes it trivial to send extra information to the server. The 41561 * passed in parameter is the data set that has been constructed by 41562 * DataTables, and you can add to this or modify it as you require. 41563 * @type function 41564 * @param {array} data Data array (array of objects which are name/value 41565 * pairs) that has been constructed by DataTables and will be sent to the 41566 * server. In the case of Ajax sourced data with server-side processing 41567 * this will be an empty array, for server-side processing there will be a 41568 * significant number of parameters! 41569 * @returns {undefined} Ensure that you modify the data array passed in, 41570 * as this is passed by reference. 41571 * 41572 * @dtopt Callbacks 41573 * @dtopt Server-side 41574 * @name DataTable.defaults.serverParams 41575 * 41576 * @deprecated 1.10. Please use `ajax` for this functionality now. 41577 */ 41578 "fnServerParams": null, 41579 41580 41581 /** 41582 * Load the table state. With this function you can define from where, and how, the 41583 * state of a table is loaded. By default DataTables will load from `localStorage` 41584 * but you might wish to use a server-side database or cookies. 41585 * @type function 41586 * @member 41587 * @param {object} settings DataTables settings object 41588 * @return {object} The DataTables state object to be loaded 41589 * 41590 * @dtopt Callbacks 41591 * @name DataTable.defaults.stateLoadCallback 41592 * 41593 * @example 41594 * $(document).ready( function() { 41595 * $('#example').dataTable( { 41596 * "stateSave": true, 41597 * "stateLoadCallback": function (settings) { 41598 * var o; 41599 * 41600 * // Send an Ajax request to the server to get the data. Note that 41601 * // this is a synchronous request. 41602 * $.ajax( { 41603 * "url": "/state_load", 41604 * "async": false, 41605 * "dataType": "json", 41606 * "success": function (json) { 41607 * o = json; 41608 * } 41609 * } ); 41610 * 41611 * return o; 41612 * } 41613 * } ); 41614 * } ); 41615 */ 41616 "fnStateLoadCallback": function ( settings ) { 41617 try { 41618 return JSON.parse(
41619 (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem( 41620 'DataTables_'+settings.sInstance+'_'+location.pathname 41621 ) 41622 ); 41623 } catch (e) {} 41624 }, 41625 41626 41627 /** 41628 * Callback which allows modification of the saved state prior to loading that state. 41629 * This callback is called when the table is loading state from the stored data, but 41630 * prior to the settings object being modified by the saved state. Note that for 41631 * plug-in authors, you should use the `stateLoadParams` event to load parameters for 41632 * a plug-in. 41633 * @type function 41634 * @param {object} settings DataTables settings object 41635 * @param {object} data The state object that is to be loaded 41636 * 41637 * @dtopt Callbacks 41638 * @name DataTable.defaults.stateLoadParams 41639 * 41640 * @example 41641 * // Remove a saved filter, so filtering is never loaded 41642 * $(document).ready( function() { 41643 * $('#example').dataTable( { 41644 * "stateSave": true, 41645 * "stateLoadParams": function (settings, data) { 41646 * data.oSearch.sSearch = ""; 41647 * } 41648 * } ); 41649 * } ); 41650 * 41651 * @example 41652 * // Disallow state loading by returning false 41653 * $(document).ready( function() { 41654 * $('#example').dataTable( { 41655 * "stateSave": true, 41656 * "stateLoadParams": function (settings, data) { 41657 * return false; 41658 * } 41659 * } ); 41660 * } ); 41661 */ 41662 "fnStateLoadParams": null, 41663 41664 41665 /** 41666 * Callback that is called when the state has been loaded from the state saving method 41667 * and the DataTables settings object has been modified as a result of the loaded state. 41668 * @type function 41669 * @param {object} settings DataTables settings object 41670 * @param {object} data The state object that was loaded 41671 * 41672 * @dtopt Callbacks 41673 * @name DataTable.defaults.stateLoaded 41674 * 41675 * @example 41676 * // Show an alert with the filtering value that was saved 41677 * $(document).ready( function() { 41678 * $('#example').dataTable( { 41679 * "stateSave": true, 41680 * "stateLoaded": function (settings, data) { 41681 * alert( 'Saved filter was: '+data.oSearch.sSearch ); 41682 * } 41683 * } ); 41684 * } ); 41685 */ 41686 "fnStateLoaded": null, 41687 41688 41689 /** 41690 * Save the table state. This function allows you to define where and how the state 41691 * information for the table is stored By default DataTables will use `localStorage` 41692 * but you might wish to use a server-side database or cookies. 41693 * @type function 41694 * @member 41695 * @param {object} settings DataTables settings object 41696 * @param {object} data The state object to be saved 41697 * 41698 * @dtopt Callbacks 41699 * @name DataTable.defaults.stateSaveCallback 41700 * 41701 * @example 41702 * $(document).ready( function() { 41703 * $('#example').dataTable( { 41704 * "stateSave": true, 41705 * "stateSaveCallback": function (settings, data) { 41706 * // Send an Ajax request to the server with the state object 41707 * $.ajax( { 41708 * "url": "/state_save", 41709 * "data": data, 41710 * "dataType": "json", 41711 * "method": "POST" 41712 * "success": function () {} 41713 * } ); 41714 * } 41715 * } ); 41716 * } ); 41717 */ 41718 "fnStateSaveCallback": function ( settings, data ) { 41719 try { 41720 (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem( 41721 'DataTables_'+settings.sInstance+'_'+location.pathname, 41722 JSON.stringify( data ) 41723 ); 41724 } catch (e) {} 41725 }, 41726 41727 41728 /** 41729 * Callback which allows modification of the state to be saved. Called when the table 41730 * has changed state a new state save is required. This method allows modification of 41731 * the state saving object prior to actually doing the save, including addition or 41732 * other state properties or modification. Note that for plug-in authors, you should 41733 * use the `stateSaveParams` event to save parameters for a plug-in. 41734 * @type function 41735 * @param {object} settings DataTables settings object 41736 * @param {object} data The state object to be saved 41737 * 41738 * @dtopt Callbacks 41739 * @name DataTable.defaults.stateSaveParams 41740 * 41741 * @example 41742 * // Remove a saved filter, so filtering is never saved 41743 * $(document).ready( function() { 41744 * $('#example').dataTable( { 41745 * "stateSave": true, 41746 * "stateSaveParams": function (settings, data) { 41747 * data.oSearch.sSearch = ""; 41748 * } 41749 * } ); 41750 * } ); 41751 */ 41752 "fnStateSaveParams": null, 41753 41754 41755 /** 41756 * Duration for which the saved state information is considered valid. After this period 41757 * has elapsed the state will be returned to the default. 41758 * Value is given in seconds. 41759 * @type int 41760 * @default 7200 <i>(2 hours)</i> 41761 * 41762 * @dtopt Options 41763 * @name DataTable.defaults.stateDuration 41764 * 41765 * @example 41766 * $(document).ready( function() { 41767 * $('#example').dataTable( { 41768 * "stateDuration": 60*60*24; // 1 day 41769 * } ); 41770 * } ) 41771 */ 41772 "iStateDuration": 7200, 41773 41774 41775 /** 41776 * When enabled DataTables will not make a request to the server for the first 41777 * page draw - rather it will use the data already on the page (no sorting etc 41778 * will be applied to it), thus saving on an XHR at load time. `deferLoading` 41779 * is used to indicate that deferred loading is required, but it is also used
41780 * to tell DataTables how many records there are in the full table (allowing 41781 * the information element and pagination to be displayed correctly). In the case 41782 * where a filtering is applied to the table on initial load, this can be 41783 * indicated by giving the parameter as an array, where the first element is 41784 * the number of records available after filtering and the second element is the 41785 * number of records without filtering (allowing the table information element 41786 * to be shown correctly). 41787 * @type int | array 41788 * @default null 41789 * 41790 * @dtopt Options 41791 * @name DataTable.defaults.deferLoading 41792 * 41793 * @example 41794 * // 57 records available in the table, no filtering applied 41795 * $(document).ready( function() { 41796 * $('#example').dataTable( { 41797 * "serverSide": true, 41798 * "ajax": "scripts/server_processing.php", 41799 * "deferLoading": 57 41800 * } ); 41801 * } ); 41802 * 41803 * @example 41804 * // 57 records after filtering, 100 without filtering (an initial filter applied) 41805 * $(document).ready( function() { 41806 * $('#example').dataTable( { 41807 * "serverSide": true, 41808 * "ajax": "scripts/server_processing.php", 41809 * "deferLoading": [ 57, 100 ], 41810 * "search": { 41811 * "search": "my_filter" 41812 * } 41813 * } ); 41814 * } ); 41815 */ 41816 "iDeferLoading": null, 41817 41818 41819 /** 41820 * Number of rows to display on a single page when using pagination. If 41821 * feature enabled (`lengthChange`) then the end user will be able to override 41822 * this to a custom setting using a pop-up menu. 41823 * @type int 41824 * @default 10 41825 * 41826 * @dtopt Options 41827 * @name DataTable.defaults.pageLength 41828 * 41829 * @example 41830 * $(document).ready( function() { 41831 * $('#example').dataTable( { 41832 * "pageLength": 50 41833 * } ); 41834 * } ) 41835 */ 41836 "iDisplayLength": 10, 41837 41838 41839 /** 41840 * Define the starting point for data display when using DataTables with 41841 * pagination. Note that this parameter is the number of records, rather than 41842 * the page number, so if you have 10 records per page and want to start on 41843 * the third page, it should be "20". 41844 * @type int 41845 * @default 0 41846 * 41847 * @dtopt Options 41848 * @name DataTable.defaults.displayStart 41849 * 41850 * @example 41851 * $(document).ready( function() { 41852 * $('#example').dataTable( { 41853 * "displayStart": 20 41854 * } ); 41855 * } ) 41856 */ 41857 "iDisplayStart": 0, 41858 41859 41860 /** 41861 * By default DataTables allows keyboard navigation of the table (sorting, paging, 41862 * and filtering) by adding a `tabindex` attribute to the required elements. This 41863 * allows you to tab through the controls and press the enter key to activate them. 41864 * The tabindex is default 0, meaning that the tab follows the flow of the document. 41865 * You can overrule this using this parameter if you wish. Use a value of -1 to 41866 * disable built-in keyboard navigation. 41867 * @type int 41868 * @default 0 41869 * 41870 * @dtopt Options 41871 * @name DataTable.defaults.tabIndex 41872 * 41873 * @example 41874 * $(document).ready( function() { 41875 * $('#example').dataTable( { 41876 * "tabIndex": 1 41877 * } ); 41878 * } ); 41879 */ 41880 "iTabIndex": 0, 41881 41882 41883 /** 41884 * Classes that DataTables assigns to the various components and features 41885 * that it adds to the HTML table. This allows classes to be configured 41886 * during initialisation in addition to through the static 41887 * {@link DataTable.ext.oStdClasses} object). 41888 * @namespace 41889 * @name DataTable.defaults.classes 41890 */ 41891 "oClasses": {}, 41892 41893 41894 /** 41895 * All strings that DataTables uses in the user interface that it creates 41896 * are defined in this object, allowing you to modified them individually or 41897 * completely replace them all as required. 41898 * @namespace 41899 * @name DataTable.defaults.language 41900 */ 41901 "oLanguage": { 41902 /** 41903 * Strings that are used for WAI-ARIA labels and controls only (these are not 41904 * actually visible on the page, but will be read by screenreaders, and thus 41905 * must be internationalised as well). 41906 * @namespace 41907 * @name DataTable.defaults.language.aria 41908 */ 41909 "oAria": { 41910 /** 41911 * ARIA label that is added to the table headers when the column may be 41912 * sorted ascending by activing the column (click or return when focu
41912sed). 41913 * Note that the column header is prefixed to this string. 41914 * @type string 41915 * @default : activate to sort column ascending 41916 * 41917 * @dtopt Language 41918 * @name DataTable.defaults.language.aria.sortAscending 41919 * 41920 * @example 41921 * $(document).ready( function() { 41922 * $('#example').dataTable( { 41923 * "language": { 41924 * "aria": { 41925 * "sortAscending": " - click/return to sort ascending" 41926 * } 41927 * } 41928 * } ); 41929 * } ); 41930 */ 41931 "sSortAscending": ": activate to sort column ascending", 41932 41933 /** 41934 * ARIA label that is added to the table headers when the column may be 41935 * sorted descending by activing the column (click or return when focused). 41936 * Note that the column header is prefixed to this string. 41937 * @type string 41938 * @default : activate to sort column ascending 41939 * 41940 * @dtopt Language 41941 * @name DataTable.defaults.language.aria.sortDescending 41942 * 41943 * @example 41944 * $(document).ready( function() { 41945 * $('#example').dataTable( { 41946 * "language": { 41947 * "aria": { 41948 * "sortDescending": " - click/return to sort descending" 41949 * } 41950 * } 41951 * } ); 41952 * } ); 41953 */ 41954 "sSortDescending": ": activate to sort column descending" 41955 }, 41956 41957 /** 41958 * Pagination string used by DataTables for the built-in pagination 41959 * control types. 41960 * @namespace 41961 * @name DataTable.defaults.language.paginate 41962 */ 41963 "oPaginate": { 41964 /** 41965 * Text to use when using the 'full_numbers' type of pagination for the 41966 * button to take the user to the first page. 41967 * @type string 41968 * @default First 41969 * 41970 * @dtopt Language 41971 * @name DataTable.defaults.language.paginate.first 41972 * 41973 * @example 41974 * $(document).ready( function() { 41975 * $('#example').dataTable( { 41976 * "language": { 41977 * "paginate": { 41978 * "first": "First page" 41979 * } 41980 * } 41981 * } ); 41982 * } ); 41983 */ 41984 "sFirst": "First", 41985 41986 41987 /** 41988 * Text to use when using the 'full_numbers' type of pagination for the 41989 * button to take the user to the last page. 41990 * @type string 41991 * @default Last 41992 * 41993 * @dtopt Language 41994 * @name DataTable.defaults.language.paginate.last 41995 * 41996 * @example 41997 * $(document).ready( function() { 41998 * $('#example').dataTable( { 41999 * "language": { 42000 * "paginate": { 42001 * "last": "Last page" 42002 * } 42003 * } 42004 * } ); 42005 * } ); 42006 */ 42007 "sLast": "Last", 42008 42009 42010 /** 42011 * Text to use for the 'next' pagination button (to take the user to the 42012 * next page). 42013 * @type string 42014 * @default Next 42015 * 42016 * @dtopt Language 42017 * @name DataTable.defaults.language.paginate.next 42018 * 42019 * @example 42020 * $(document).ready( function() { 42021 * $('#example').dataTable( { 42022 * "language": { 42023 * "paginate": { 42024 * "next": "Next page" 42025 * } 42026 * } 42027 * } ); 42028 * } ); 42029 */ 42030 "sNext": "Next", 42031 42032 42033 /** 42034 * Text to use for the 'previous' pagination button (to take the user to 42035 * the previous page). 42036 * @type string 42037 * @default Previous 42038 * 42039 * @dtopt Language 42040 * @name DataTable.defaults.language.paginate.previous 42041 * 42042 * @example 42043 * $(document).ready( function() { 42044 * $('#example').dataTable( { 42045 * "language": { 42046 * "paginate": { 42047 * "previous": "Previous page" 42048 * } 42049 * } 42050 * } ); 42051 * } ); 42052 */ 42053 "sPrevious": "Previous" 42054 }, 42055 42056 /** 42057 * This string is shown in preference to `zeroRecords` when the table is 42058 * empty of data (regardless of filtering). Note that this is an optional 42059 * parameter - if it is not given, the value of `zeroRecords` will be used 42060 * instead (either the default or given value). 42061 * @type string 42062 * @default No data available in table 42063 * 42064 * @dtopt Language 42065 * @name DataTable.defaults.language.emptyTable 42066 * 42067 * @example 42068 * $(document).ready( function() { 42069 * $('#example').dataTable( { 42070 * "language": { 42071 * "emptyTable": "No data available in table" 42072 * } 42073 * } ); 42074 * } ); 42075 */ 42076 "sEmptyTable": "No data available in table", 42077 42078 42079 /** 42080 * This string gives information to the end user about the information 42081 * that is current on display on the page. The following tokens can be 42082 * used in the string and will be dynamically replaced as the table 42083 * display updates. This tokens can be placed anywhere in the string, or 42084 * removed as needed by the language requires: 42085 * 42086 * * `\_START\_` - Display index of the first record on the current page 42087 * * `\_END\_` - Display index of the last record on the current page 42088 * * `\_TOTAL\_` - Number of records in the table after filtering 42089 * * `\_MAX\_` - Number of records in the table without filtering 42090 * * `\_PAGE\_` - Current page number 42091 * * `\_PAGES\_` - Total number of pages of data in the table 42092 * 42093 * @type string 42094 * @default Showing _START_ to _END_ of _TOTAL_ entries 42095 * 42096 * @dtopt Language 42097 * @name DataTable.defaults.language.info 42098 * 42099 * @example 42100 * $(document).ready( function() { 42101 * $('#example').dataTable( { 42102 * "language": { 42103 * "info": "Showing page _PAGE_ of _PAGES_" 42104 * } 42105 * } ); 42106 * } ); 42107 */ 42108 "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries", 42109 42110 42111 /**
42112 * Display information string for when the table is empty. Typically the 42113 * format of this string should match `info`. 42114 * @type string 42115 * @default Showing 0 to 0 of 0 entries 42116 * 42117 * @dtopt Language 42118 * @name DataTable.defaults.language.infoEmpty 42119 * 42120 * @example 42121 * $(document).ready( function() { 42122 * $('#example').dataTable( { 42123 * "language": { 42124 * "infoEmpty": "No entries to show" 42125 * } 42126 * } ); 42127 * } ); 42128 */ 42129 "sInfoEmpty": "Showing 0 to 0 of 0 entries", 42130 42131 42132 /** 42133 * When a user filters the information in a table, this string is appended 42134 * to the information (`info`) to give an idea of how strong the filtering 42135 * is. The variable _MAX_ is dynamically updated. 42136 * @type string 42137 * @default (filtered from _MAX_ total entries) 42138 * 42139 * @dtopt Language 42140 * @name DataTable.defaults.language.infoFiltered 42141 * 42142 * @example 42143 * $(document).ready( function() { 42144 * $('#example').dataTable( { 42145 * "language": { 42146 * "infoFiltered": " - filtering from _MAX_ records" 42147 * } 42148 * } ); 42149 * } ); 42150 */ 42151 "sInfoFiltered": "(filtered from _MAX_ total entries)", 42152 42153 42154 /** 42155 * If can be useful to append extra information to the info string at times, 42156 * and this variable does exactly that. This information will be appended to 42157 * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are 42158 * being used) at all times. 42159 * @type string 42160 * @default <i>Empty string</i> 42161 * 42162 * @dtopt Language 42163 * @name DataTable.defaults.language.infoPostFix 42164 * 42165 * @example 42166 * $(document).ready( function() { 42167 * $('#example').dataTable( { 42168 * "language": { 42169 * "infoPostFix": "All records shown are derived from real information." 42170 * } 42171 * } ); 42172 * } ); 42173 */ 42174 "sInfoPostFix": "", 42175 42176 42177 /** 42178 * This decimal place operator is a little different from the other 42179 * language options since DataTables doesn't output floating point 42180 * numbers, so it won't ever use this for display of a number. Rather, 42181 * what this parameter does is modify the sort methods of the table so 42182 * that numbers which are in a format which has a character other than 42183 * a period (`.`) as a decimal place will be sorted numerically. 42184 * 42185 * Note that numbers with different decimal places cannot be shown in 42186 * the same table and still be sortable, the table must be consistent. 42187 * However, multiple different tables on the page can use different 42188 * decimal place characters. 42189 * @type string 42190 * @default 42191 * 42192 * @dtopt Language 42193 * @name DataTable.defaults.language.decimal 42194 * 42195 * @example 42196 * $(document).ready( function() { 42197 * $('#example').dataTable( { 42198 * "language": { 42199 * "decimal": "," 42200 * "thousands": "." 42201 * } 42202 * } ); 42203 * } ); 42204 */ 42205 "sDecimal": "", 42206 42207 42208 /** 42209 * DataTables has a build in number formatter (`formatNumber`) which is 42210 * used to format large numbers that are used in the table information. 42211 * By default a comma is used, but this can be trivially changed to any 42212 * character you wish with this parameter. 42213 * @type string 42214 * @default , 42215 * 42216 * @dtopt Language 42217 * @name DataTable.defaults.language.thousands 42218 * 42219 * @example 42220 * $(document).ready( function() { 42221 * $('#example').dataTable( { 42222 * "language": { 42223 * "thousands": "'" 42224 * } 42225 * } ); 42226 * } ); 42227 */ 42228 "sThousands": ",", 42229 42230 42231 /** 42232 * Detail the action that will be taken when the drop down menu for the 42233 * pagination length option is changed. The '_MENU_' variable is replaced 42234 * with a default select list of 10, 25, 50 and 100, and can be replaced 42235 * with a custom select box if required. 42236 * @type string 42237 * @default Show _MENU_ entries 42238 * 42239 * @dtopt Language 42240 * @name DataTable.defaults.language.lengthMenu 42241 * 42242 * @example 42243 * // Language change only 42244 * $(document).ready( function() { 42245 * $('#example').dataTable( { 42246 * "language": {
42247 * "lengthMenu": "Display _MENU_ records" 42248 * } 42249 * } ); 42250 * } ); 42251 * 42252 * @example 42253 * // Language and options change 42254 * $(document).ready( function() { 42255 * $('#example').dataTable( { 42256 * "language": { 42257 * "lengthMenu": 'Display <select>'+ 42258 * '<option value="10">10</option>'+ 42259 * '<option value="20">20</option>'+ 42260 * '<option value="30">30</option>'+ 42261 * '<option value="40">40</option>'+ 42262 * '<option value="50">50</option>'+ 42263 * '<option value="-1">All</option>'+ 42264 * '</select> records' 42265 * } 42266 * } ); 42267 * } ); 42268 */ 42269 "sLengthMenu": "Show _MENU_ entries", 42270 42271 42272 /** 42273 * When using Ajax sourced data and during the first draw when DataTables is 42274 * gathering the data, this message is shown in an empty row in the table to 42275 * indicate to the end user the the data is being loaded. Note that this 42276 * parameter is not used when loading data by server-side processing, just 42277 * Ajax sourced data with client-side processing. 42278 * @type string 42279 * @default Loading... 42280 * 42281 * @dtopt Language 42282 * @name DataTable.defaults.language.loadingRecords 42283 * 42284 * @example 42285 * $(document).ready( function() { 42286 * $('#example').dataTable( { 42287 * "language": { 42288 * "loadingRecords": "Please wait - loading..." 42289 * } 42290 * } ); 42291 * } ); 42292 */ 42293 "sLoadingRecords": "Loading...", 42294 42295 42296 /** 42297 * Text which is displayed when the table is processing a user action 42298 * (usually a sort command or similar). 42299 * @type string 42300 * @default Processing... 42301 * 42302 * @dtopt Language 42303 * @name DataTable.defaults.language.processing 42304 * 42305 * @example 42306 * $(document).ready( function() { 42307 * $('#example').dataTable( { 42308 * "language": { 42309 * "processing": "DataTables is currently busy" 42310 * } 42311 * } ); 42312 * } ); 42313 */ 42314 "sProcessing": "Processing...", 42315 42316 42317 /** 42318 * Details the actions that will be taken when the user types into the 42319 * filtering input text box. The variable "_INPUT_", if used in the string, 42320 * is replaced with the HTML text box for the filtering input allowing 42321 * control over where it appears in the string. If "_INPUT_" is not given 42322 * then the input box is appended to the string automatically. 42323 * @type string 42324 * @default Search: 42325 * 42326 * @dtopt Language 42327 * @name DataTable.defaults.language.search 42328 * 42329 * @example 42330 * // Input text box will be appended at the end automatically 42331 * $(document).ready( function() { 42332 * $('#example').dataTable( { 42333 * "language": { 42334 * "search": "Filter records:" 42335 * } 42336 * } ); 42337 * } ); 42338 * 42339 * @example 42340 * // Specify where the filter should appear 42341 * $(document).ready( function() { 42342 * $('#example').dataTable( { 42343 * "language": { 42344 * "search": "Apply filter _INPUT_ to table" 42345 * } 42346 * } ); 42347 * } ); 42348 */ 42349 "sSearch": "Search:", 42350 42351 42352 /** 42353 * Assign a `placeholder` attribute to the search `input` element 42354 * @type string 42355 * @default 42356 * 42357 * @dtopt Language 42358 * @name DataTable.defaults.language.searchPlaceholder 42359 */ 42360 "sSearchPlaceholder": "", 42361 42362 42363 /** 42364 * All of the language information can be stored in a file on the 42365 * server-side, which DataTables will look up if this parameter is passed. 42366 * It must store the URL of the language file, which is in a JSON format, 42367 * and the object has the same properties as the oLanguage object in the 42368 * initialiser object (i.e. the above parameters). Please refer to one of 42369 * the example language files to see how this works in action. 42370 * @type string 42371 * @default <i>Empty string - i.e. disabled</i> 42372 * 42373 * @dtopt Language 42374 * @name DataTable.defaults.language.url 42375 * 42376 * @example 42377 * $(document).ready( function() { 42378 * $('#example').dataTable( { 42379 * "language": { 42380 * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt" 42381 * } 42382 * } ); 42383 * } ); 42384 */ 42385 "sUrl": "", 42386 42387 42388 /** 42389 * Text shown inside the table records when the is no information to be 42390 * displayed after filtering. `emptyTable` is shown when there is simply no 42391 * information in the table at all (regardless of filtering). 42392 * @type string
42393 * @default No matching records found 42394 * 42395 * @dtopt Language 42396 * @name DataTable.defaults.language.zeroRecords 42397 * 42398 * @example 42399 * $(document).ready( function() { 42400 * $('#example').dataTable( { 42401 * "language": { 42402 * "zeroRecords": "No records to display" 42403 * } 42404 * } ); 42405 * } ); 42406 */ 42407 "sZeroRecords": "No matching records found" 42408 }, 42409 42410 42411 /** 42412 * This parameter allows you to have define the global filtering state at 42413 * initialisation time. As an object the `search` parameter must be 42414 * defined, but all other parameters are optional. When `regex` is true, 42415 * the search string will be treated as a regular expression, when false 42416 * (default) it will be treated as a straight string. When `smart` 42417 * DataTables will use it's smart filtering methods (to word match at 42418 * any point in the data), when false this will not be done. 42419 * @namespace 42420 * @extends DataTable.models.oSearch 42421 * 42422 * @dtopt Options 42423 * @name DataTable.defaults.search 42424 * 42425 * @example 42426 * $(document).ready( function() { 42427 * $('#example').dataTable( { 42428 * "search": {"search": "Initial search"} 42429 * } ); 42430 * } ) 42431 */ 42432 "oSearch": $.extend( {}, DataTable.models.oSearch ), 42433 42434 42435 /** 42436 * __Deprecated__ The functionality provided by this parameter has now been 42437 * superseded by that provided through `ajax`, which should be used instead. 42438 * 42439 * By default DataTables will look for the property `data` (or `aaData` for 42440 * compatibility with DataTables 1.9-) when obtaining data from an Ajax 42441 * source or for server-side processing - this parameter allows that 42442 * property to be changed. You can use Javascript dotted object notation to 42443 * get a data source for multiple levels of nesting. 42444 * @type string 42445 * @default data 42446 * 42447 * @dtopt Options 42448 * @dtopt Server-side 42449 * @name DataTable.defaults.ajaxDataProp 42450 * 42451 * @deprecated 1.10. Please use `ajax` for this functionality now. 42452 */ 42453 "sAjaxDataProp": "data", 42454 42455 42456 /** 42457 * __Deprecated__ The functionality provided by this parameter has now been 42458 * superseded by that provided through `ajax`, which should be used instead. 42459 * 42460 * You can instruct DataTables to load data from an external 42461 * source using this parameter (use aData if you want to pass data in you 42462 * already have). Simply provide a url a JSON object can be obtained from. 42463 * @type string 42464 * @default null 42465 * 42466 * @dtopt Options 42467 * @dtopt Server-side 42468 * @name DataTable.defaults.ajaxSource 42469 * 42470 * @deprecated 1.10. Please use `ajax` for this functionality now. 42471 */ 42472 "sAjaxSource": null, 42473 42474 42475 /** 42476 * This initialisation variable allows you to specify exactly where in the 42477 * DOM you want DataTables to inject the various controls it adds to the page 42478 * (for example you might want the pagination controls at the top of the 42479 * table). DIV elements (with or without a custom class) can also be added to 42480 * aid styling. The follow syntax is used: 42481 * <ul> 42482 * <li>The following options are allowed: 42483 * <ul> 42484 * <li>'l' - Length changing</li> 42485 * <li>'f' - Filtering input</li> 42486 * <li>'t' - The table!</li> 42487 * <li>'i' - Information</li> 42488 * <li>'p' - Pagination</li> 42489 * <li>'r' - pRocessing</li> 42490 * </ul> 42491 * </li> 42492 * <li>The following constants are allowed: 42493 * <ul> 42494 * <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li> 42495 * <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li> 42496 * </ul> 42497 * </li> 42498 * <li>The following syntax is expected: 42499 * <ul> 42500 * <li>'<' and '>' - div elements</li> 42501 * <li>'<"class" and '>' - div with a class</li> 42502 * <li>'<"#id" and '>' - div with an ID</li> 42503 * </ul> 42504 * </li> 42505 * <li>Examples: 42506 * <ul> 42507 * <li>'<"wrapper"flipt>'</li> 42508 * <li>'<lf<t>ip>'</li> 42509 * </ul> 42510 * </li> 42511 * </ul> 42512 * @type string 42513 * @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b> 42514 * <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i> 42515 * 42516 * @dtopt Options 42517 * @name DataTable.defaults.dom 42518 * 42519 * @example 42520 * $(document).ready( function() { 42521 * $('#example').dataTable( { 42522 * "dom": '<"top"i>rt<"bottom"flp><"clear">' 42523 * } ); 42524 * } ); 42525 */ 42526 "sDom": "lfrtip", 42527 42528 42529 /** 42530 * Search delay option. This will throttle full table searches that use the 42531 * DataTables provided search input element (it does not effect calls to 42532 * `dt-api search()`, providing a delay before the search is made. 42533 * @type integer 42534 * @default 0 42535 * 42536 * @dtopt Options 42537 * @name DataTable.defaults.searchDelay 42538 * 42539 * @example 42540 * $(document).ready( function() { 42541 * $('#example').dataTable( { 42542 * "searchDelay": 200 42543 * } ); 42544 * } ) 42545 */ 42546 "searchDelay": null, 42547 42548 42549 /** 42550 * DataTables features four different built-in options for the buttons to 42551 * display for pagination control: 42552 * 42553 * * `simple` - 'Previous' and 'Next' buttons only 42554 * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers 42555 * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons 42556 * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus 42557 * page numbers 42558 * 42559 * Further methods can be added using {@link DataTable.ext.oPagination}. 42560 * @type string 42561 * @default simple_numbers 42562 * 42563 * @dtopt Options 42564 * @name DataTable.defaults.pagingType 42565 * 42566 * @example 42567 * $(document).ready( function() { 42568 * $('#example').dataTable( { 42569 * "pagingType": "full_numbers" 42570 * } ); 42571 * } ) 42572 */ 42573 "sPaginationType": "simple_numbers", 42574 42575 42576 /** 42577 * Enable horizontal scrolling. When a table is too wide to fit into a 42578 * certain layout, or you have a large number of columns in the table, you 42579 * can enable x-scrolling to show the table in a viewport, which can be 42580 * scrolled. This property can be `true` which will allow the table to 42581 * scroll horizontally when needed, or any CSS unit, or a number (in which 42582 * case it will be treated as a pixel measurement). Setting as simply `true` 42583 * is recommended.
42584 * @type boolean|string 42585 * @default <i>blank string - i.e. disabled</i> 42586 * 42587 * @dtopt Features 42588 * @name DataTable.defaults.scrollX 42589 * 42590 * @example 42591 * $(document).ready( function() { 42592 * $('#example').dataTable( { 42593 * "scrollX": true, 42594 * "scrollCollapse": true 42595 * } ); 42596 * } ); 42597 */ 42598 "sScrollX": "", 42599 42600 42601 /** 42602 * This property can be used to force a DataTable to use more width than it 42603 * might otherwise do when x-scrolling is enabled. For example if you have a 42604 * table which requires to be well spaced, this parameter is useful for 42605 * "over-sizing" the table, and thus forcing scrolling. This property can by 42606 * any CSS unit, or a number (in which case it will be treated as a pixel 42607 * measurement). 42608 * @type string 42609 * @default <i>blank string - i.e. disabled</i> 42610 * 42611 * @dtopt Options 42612 * @name DataTable.defaults.scrollXInner 42613 * 42614 * @example 42615 * $(document).ready( function() { 42616 * $('#example').dataTable( { 42617 * "scrollX": "100%", 42618 * "scrollXInner": "110%" 42619 * } ); 42620 * } ); 42621 */ 42622 "sScrollXInner": "", 42623 42624 42625 /** 42626 * Enable vertical scrolling. Vertical scrolling will constrain the DataTable 42627 * to the given height, and enable scrolling for any data which overflows the 42628 * current viewport. This can be used as an alternative to paging to display 42629 * a lot of data in a small area (although paging and scrolling can both be 42630 * enabled at the same time). This property can be any CSS unit, or a number 42631 * (in which case it will be treated as a pixel measurement). 42632 * @type string 42633 * @default <i>blank string - i.e. disabled</i> 42634 * 42635 * @dtopt Features 42636 * @name DataTable.defaults.scrollY 42637 * 42638 * @example 42639 * $(document).ready( function() { 42640 * $('#example').dataTable( { 42641 * "scrollY": "200px", 42642 * "paginate": false 42643 * } ); 42644 * } ); 42645 */ 42646 "sScrollY": "", 42647 42648 42649 /** 42650 * __Deprecated__ The functionality provided by this parameter has now been 42651 * superseded by that provided through `ajax`, which should be used instead. 42652 * 42653 * Set the HTTP method that is used to make the Ajax call for server-side 42654 * processing or Ajax sourced data. 42655 * @type string 42656 * @default GET 42657 * 42658 * @dtopt Options 42659 * @dtopt Server-side 42660 * @name DataTable.defaults.serverMethod 42661 * 42662 * @deprecated 1.10. Please use `ajax` for this functionality now. 42663 */ 42664 "sServerMethod": "GET", 42665 42666 42667 /** 42668 * DataTables makes use of renderers when displaying HTML elements for 42669 * a table. These renderers can be added or modified by plug-ins to 42670 * generate suitable mark-up for a site. For example the Bootstrap 42671 * integration plug-in for DataTables uses a paging button renderer to 42672 * display pagination buttons in the mark-up required by Bootstrap. 42673 * 42674 * For further information about the renderers available see 42675 * DataTable.ext.renderer 42676 * @type string|object 42677 * @default null 42678 * 42679 * @name DataTable.defaults.renderer 42680 * 42681 */ 42682 "renderer": null, 42683 42684 42685 /** 42686 * Set the data property name that DataTables should use to get a row's id 42687 * to set as the `id` property in the node. 42688 * @type string 42689 * @default DT_RowId 42690 * 42691 * @name DataTable.defaults.rowId 42692 */ 42693 "rowId": "DT_RowId" 42694 }; 42695 42696 _fnHungarianMap( DataTable.defaults ); 42697 42698 42699 42700 /* 42701 * Developer note - See note in model.defaults.js about the use of Hungarian 42702 * notation and camel case. 42703 */ 42704 42705 /** 42706 * Column options that can be given to DataTables at initialisation time. 42707 * @namespace 42708 */ 42709 DataTable.defaults.column = { 42710 /** 42711 * Define which column(s) an order will occur on for this column. This 42712 * allows a column's ordering to take multiple columns into account when 42713 * doing a sort or use the data from a different column. For example first 42714 * name / last name columns make sense to do a multi-column sort over the 42715 * two columns. 42716 * @type array|int 42717 * @default null <i>Takes the value of the column index automatically</i> 42718 * 42719 * @name DataTable.defaults.column.orderData 42720 * @dtopt Columns 42721 * 42722 * @example 42723 * // Using `columnDefs` 42724 * $(document).ready( function() { 42725 * $('#example').dataTable( { 42726 * "columnDefs": [ 42727 * { "orderData": [ 0, 1 ], "targets": [ 0 ] }, 42728 * { "orderData": [ 1, 0 ], "targets": [ 1 ] }, 42729 * { "orderData": 2, "targets": [ 2 ] } 42730 * ] 42731 * } ); 42732 * } ); 42733 * 42734 * @example 42735 * // Using `columns` 42736 * $(document).ready( function() { 42737 * $('#example').dataTable( { 42738 * "columns": [ 42739 * { "orderData": [ 0, 1 ] }, 42740 * { "orderData": [ 1, 0 ] }, 42741 * { "orderData": 2 }, 42742 * null, 42743 * null 42744 * ] 42745 * } ); 42746 * } ); 42747 */ 42748 "aDataSort": null, 42749 "iDataSort": -1, 42750 42751 42752 /** 42753 * You can control the default ordering direction, and even alter the 42754 * behaviour of the sort handler (i.e. only allow ascending ordering etc) 42755 * using this parameter. 42756 * @type array 42757 * @default [ 'asc', 'desc' ] 42758 * 42759 * @name DataTable.defaults.column.orderSequence 42760 * @dtopt Columns 42761 * 42762 * @example 42763 * // Using `columnDefs` 42764 * $(document).ready( function() { 42765 * $('#example').dataTable( { 42766 * "columnDefs": [ 42767 * { "orderSequence": [ "asc" ], "targets": [ 1 ] }, 42768 * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] }, 42769 * { "orderSequence": [ "desc" ], "targets": [ 3 ] } 42770 * ] 42771 * } ); 42772 * } ); 42773 * 42774 * @example 42775 * // Using `columns` 42776 * $(document).ready( function() { 42777 * $('#example').dataTable( { 42778 * "columns": [ 42779 * null, 42780 * { "orderSequence": [ "asc" ] }, 42781 * { "orderSequence": [ "desc", "asc", "asc" ] }, 42782 * { "orderSequence": [ "desc" ] }, 42783 * null 42784 * ] 42785 * } ); 42786 * } ); 42787 */ 42788 "asSorting": [ 'asc', 'desc' ], 42789 42790 42791 /** 42792 * Enable or disable filtering on the data in this column. 42793 * @type boolean 42794 * @default true 42795 * 42796 * @name DataTable.defaults.column.searchable 42797 * @dtopt Columns 42798 * 42799 * @example 42800 * // Using `columnDefs` 42801 * $(document).ready( function() { 42802 * $('#example').dataTable( { 42803 * "columnDefs": [ 42804 * { "searchable": false, "targets": [ 0 ] } 42805 * ] } ); 42806 * } ); 42807 * 42808 * @example 42809 * // Using `columns` 42810 * $(document).ready( function() { 42811 * $('#example').dataTable( { 42812 * "columns": [ 42813 * { "searchable": false }, 42814 * null, 42815 * null, 42816 * null, 42817 * null 42818 * ] } ); 42819 * } ); 42820 */ 42821 "bSearchable": true, 42822 42823 42824 /** 42825 * Enable or disable ordering on this column. 42826 * @type boolean 42827 * @default true 42828 * 42829 * @name DataTable.defaults.column.orderable 42830 * @dtopt Columns 42831 * 42832 * @example 42833 * // Using `columnDefs` 42834 * $(document).ready( function() { 42835 * $('#example').dataTable( { 42836 * "columnDefs": [ 42837 * { "orderable": false, "targets": [ 0 ] } 42838 * ] } ); 42839 * } ); 42840 * 42841 * @example 42842 * // Using `columns` 42843 * $(document).ready( function() { 42844 * $('#example').dataTable( { 42845 * "columns": [ 42846 * { "orderable": false }, 42847 * null, 42848 * null, 42849 * null, 42850 * null 42851 * ] } ); 42852 * } ); 42853 */ 42854 "bSortable": true, 42855 42856 42857 /** 42858 * Enable or disable the display of this column. 42859 * @type boolean 42860 * @default true 42861 * 42862 * @name DataTable.defaults.column.visible 42863 * @dtopt Columns 42864 * 42865 * @example 42866 * // Using `columnDefs` 42867 * $(document).ready( function() { 42868 * $('#example').dataTable( { 42869 * "columnDefs": [ 42870 * { "visible": false, "targets": [ 0 ] } 42871 * ] } ); 42872 * } ); 42873 * 42874 * @example 42875 * // Using `columns` 42876 * $(document).ready( function() { 42877 * $('#example').dataTable( { 42878 * "columns": [ 42879 * { "visible": false }, 42880 * null, 42881 * null, 42882 * null, 42883 * null 42884 * ] } ); 42885 * } ); 42886 */ 42887 "bVisible": true, 42888 42889 42890 /** 42891 * Developer definable function that is called whenever a cell is created (Ajax source, 42892 * etc) or processed for input (DOM source). This can be used as a compliment to mRender 42893 * allowing you to modify the DOM element (add background colour for example) when the 42894 * element is available. 42895 * @type function 42896 * @param {element} td The TD node that has been created 42897 * @param {*} cellData The Data for the cell 42898 * @param {array|object} rowData The data for the whole row 42899 * @param {int} row The row index for the aoData data store 42900 * @param {int} col The column index for aoColumns 42901 * 42902 * @name DataTable.defaults.column.createdCell 42903 * @dtopt Columns 42904 * 42905 * @example 42906 * $(document).ready( function() { 42907 * $('#example').dataTable( { 42908 * "columnDefs": [ { 42909 * "targets": [3], 42910 * "createdCell": function (td, cellData, rowData, row, c
42910ol) { 42911 * if ( cellData == "1.7" ) { 42912 * $(td).css('color', 'blue') 42913 * } 42914 * } 42915 * } ] 42916 * }); 42917 * } ); 42918 */ 42919 "fnCreatedCell": null, 42920 42921 42922 /** 42923 * This parameter has been replaced by `data` in DataTables to ensure naming 42924 * consistency. `dataProp` can still be used, as there is backwards 42925 * compatibility in DataTables for this option, but it is strongly 42926 * recommended that you use `data` in preference to `dataProp`. 42927 * @name DataTable.defaults.column.dataProp 42928 */ 42929 42930 42931 /** 42932 * This property can be used to read data from any data source property, 42933 * including deeply nested objects / properties. `data` can be given in a 42934 * number of different ways which effect its behaviour: 42935 * 42936 * * `integer` - treated as an array index for the data source. This is the 42937 * default that DataTables uses (incrementally increased for each column). 42938 * * `string` - read an object property from the data source. There are 42939 * three 'special' options that can be used in the string to alter how 42940 * DataTables reads the data from the source object: 42941 * * `.` - Dotted Javascript notation. Just as you use a `.` in 42942 * Javascript to read from nested objects, so to can the options 42943 * specified in `data`. For example: `browser.version` or 42944 * `browser.name`. If your object parameter name contains a period, use 42945 * `\\` to escape it - i.e. `first\\.name`. 42946 * * `[]` - Array notation. DataTables can automatically combine data 42947 * from and array source, joining the data with the characters provided 42948 * between the two brackets. For example: `name[, ]` would provide a 42949 * comma-space separated list from the source array. If no characters 42950 * are provided between the brackets, the original array source is 42951 * returned. 42952 * * `()` - Function notation. Adding `()` to the end of a parameter will 42953 * execute a function of the name given. For example: `browser()` for a 42954 * simple function on the data source, `browser.version()` for a 42955 * function in a nested property or even `browser().version` to get an 42956 * object property if the function called returns an object. Note that 42957 * function notation is recommended for use in `render` rather than 42958 * `data` as it is much simpler to use as a renderer. 42959 * * `null` - use the original data source for the row rather than plucking 42960 * data directly from it. This action has effects on two other 42961 * initialisation options: 42962 * * `defaultContent` - When null is given as the `data` option and 42963 * `defaultContent` is specified for the column, the value defined by 42964 * `defaultContent` will be used for the cell. 42965 * * `render` - When null is used for the `data` option and the `render` 42966 * option is specified for the column, the whole data source for the 42967 * row is used for the renderer. 42968 * * `function` - the function given will be executed whenever DataTables 42969 * needs to set or get the data for a cell in the column. The function 42970 * takes three parameters: 42971 * * Parameters: 42972 * * `{array|object}` The data source for the row 42973 * * `{string}` The type call data requested - this will be 'set' when 42974 * setting data or 'filter', 'display', 'type', 'sort' or undefined 42975 * when gathering data. Note that when `undefined` is given for the 42976 * type DataTables expects to get the raw data for the object back< 42977 * * `{*}` Data to set when the second parameter is 'set'. 42978 * * Return: 42979 * * The return value from the function is not required when 'set' is 42980 * the type of call, but otherwise the return is what will be used 42981 * for the data requested. 42982 * 42983 * Note that `data` is a getter and setter option. If you just require 42984 * formatting of data for output, you will likely want to use `render` which 42985 * is simply a getter and thus simpler to use. 42986 * 42987 * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The 42988 * name change reflects the flexibility of this property and is consistent 42989 * with the naming of mRender. If 'mDataProp' is given, then it will still 42990 * be used by DataTables, as it automatically maps the old name to the new 42991 * if required. 42992 * 42993 * @type string|int|function|null 42994 * @default null <i>Use automatically calculated column index</i> 42995 * 42996 * @name DataTable.defaults.column.data 42997 * @dtopt Columns 42998 * 42999 * @example 43000 * // Read table data from objects 43001 * // JSON structure for each row: 43002 * // { 43003 * // "engine": {value}, 43004 * // "browser": {value}, 43005 * // "platform": {value}, 43006 * // "version": {value}, 43007 * // "grade": {value} 43008 * // } 43009 * $(document).ready( function() { 43010 * $('#example').dataTable( { 43011 * "ajaxSource": "sources/objects.txt", 43012 * "columns": [ 43013 * { "data": "engine" }, 43014 * { "data": "browser" }, 43015 * { "data": "platform" }, 43016 * { "data": "version" }, 43017 * { "data": "grade" } 43018 * ] 43019 * } ); 43020 * } ); 43021 * 43022 * @example 43023 * // Read information from deeply nested objects 43024 * // JSON structure for each row: 43025 * // { 43026 * // "engine": {value}, 43027 * // "browser": {value}, 43028 * // "platform": { 43029 * // "inner": {value} 43030 * // }, 43031 * // "details": [ 43032 * // {value}, {value} 43033 * // ] 43034 * // } 43035 * $(document).ready( function() { 43036 * $('#example').dataTable( { 43037 * "ajaxSource": "sources/deep.txt", 43038 * "columns": [ 43039 * { "data": "engine" }, 43040 * { "data": "browser" }, 43041 * { "data": "platform.inner" }, 43042 * { "data": "platform.details.0" }, 43043 * { "data": "platform.details.1" } 43044 * ] 43045 * } ); 43046 * } ); 43047 * 43048 * @example 43049 * // Using `data` as a function to provide different information for 43050 * // sorting, filtering and display. In this case, currency (price) 43051 * $(document).ready( function() { 43052 * $('#example').dataTable( { 43053 * "columnDefs": [ { 43054 * "targets": [ 0 ], 43055 * "data": function ( source, type, val ) { 43056 * if (type === 'set') { 43057 * source.price = val; 43058 * // Store the computed dislay and filter values for efficiency 43059 * source.price_display = val=="" ? "" : "$"+numberFormat(val); 43060 * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val; 43061 * return; 43062 * } 43063 * else if (type === 'display') { 43064 * return source.price_display; 43065 * } 43066 * else if (type === 'filter') { 43067 * return source.price_filter; 43068 * } 43069 * // 'sort', 'type' and undefined all just use the integer 43070 * return source.price; 43071 * } 43072 * } ] 43073 * } ); 43074 * } ); 43075 * 43076 * @example 43077 * // Using default content 43078 * $(document).ready( function() { 43079 * $('#example').dataTable( { 43080 * "columnDefs": [ { 43081 * "targets": [ 0 ], 43082 * "data": null, 43083 * "defaultContent": "Click to edit" 43084 * } ] 43085 * } ); 43086 * } ); 43087 * 43088 * @example 43089 * // Using array notation - outputting a list from an array 43090 * $(document).ready( function() { 43091 * $('#example').dataTable( { 43092 * "columnDefs": [ { 43093 * "targets": [ 0 ], 43094 * "data": "name[, ]" 43095 * } ] 43096 * } ); 43097 * } ); 43098 * 43099 */ 43100 "mData": null, 43101 43102 43103 /** 43104 * This property is the rendering partner to `data` and it is suggested that 43105 * when you want to manipulate data for display (including filtering, 43106 * sorting etc) without altering the underlying data for the table, use this 43107 * property. `render` can be considered to be the the read only companion to 43108 * `data` which is read / write (then as such more complex). Like `data` 43109 * this option can be given in a number of different ways to effect its 43110 * behaviour: 43111 * 43112 * * `integer` - treated as an array index for the data source. This is the 43113 * default that DataTables uses (incrementally increased for each column). 43114 * * `string` - read an object property from the data source. There are 43115 * three 'special' options that can be used in the string to alter how 43116 * DataTables reads the data from the source object: 43117 * * `.` - Dotted Javascript notation. Just as you use a `.` in 43118 * Javascript to read from nested objects, so to can the options 43119 * specified in `data`. For example: `browser.version` or 43120 * `browser.name`. If your object parameter name contains a period, use 43121 * `\\` to escape it - i.e. `first\\.name`. 43122 * * `[]` - Array notation. DataTables can automatically combine data 43123 * from and array source, joining the data with the characters provided 43124 * between the two brackets. For example: `name[, ]` would provide a 43125 * comma-space separated list from the source array. If no characters 43126 * are provided between the brackets, the original array source is 43127 * returned. 43128 * * `()` - Function notation. Adding `()` to the end of a parameter will 43129 * execute a function of the name given. For example: `browser()` for a 43130 * simple function on the data source, `browser.version()` for a 43131 * function in a nested property or even `browser().version` to get an 43132 * object property if the function called returns an object. 43133 * * `object` - use different data for the different data types requested by 43134 * DataTables ('filter', 'display', 'type' or 'sort'). The property names 43135 * of the object is the data type the property refers to and the value can 43136 * defined using an integer, string or function using the same rules as 43137 * `render` normally does. Note that an `_` option _must_ be specified. 43138 * This is the default value to use if you haven't specified a value for 43139 * the data type requested by DataTables. 43140 * * `function` - the function given will be executed whenever DataTables 43141 * needs to set or get the data for a cell in the column. The function 43142 * takes three parameters: 43143 * * Parameters: 43144 * * {array|object} The data source for the row (based on `data`) 43145 * * {string} The type call data requested - this will be 'filter', 43146 * 'display', 'type' or 'sort'. 43147 * * {array|object} The full data source for the row (not based on 43148 * `data`) 43149 * * Return: 43150 * * The return value from the function is what will be used for the 43151 * data requested. 43152 * 43153 * @type string|int|function|object|null 43154 * @default null Use the data source value. 43155 * 43156 * @name DataTable.defaults.column.render 43157 * @dtopt Columns 43158 * 43159 * @example 43160 * // Create a comma separated list from an array of objects 43161 * $(document).ready( function() { 43162 * $('#example').dataTable( { 43163 * "ajaxSource": "sources/deep.txt", 43164 * "columns": [ 43165 * { "data": "engine" }, 43166 * { "data": "browser" }, 43167 * { 43168 * "data": "platform", 43169 * "render": "[, ].name" 43170 * } 43171 * ] 43172 * } ); 43173 * } ); 43174 * 43175 * @example 43176 * // Execute a function to obtain data 43177 * $(document).ready( function() { 43178 * $('#example').dataTable( { 43179 * "columnDefs": [ { 43180 * "targets": [ 0 ], 43181 * "data": null, // Use the full data source object for the renderer's source 43182 * "render": "browserName()" 43183 * } ] 43184 * } ); 43185 * } ); 43186 * 43187 * @example 43188 * // As an object, extracting different data for the different types 43189 * // This would be used with a data source such as: 43190 * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" } 43191 * // Here the `phone` integer is used for sorting and type detection, while `phone_filter` 43192 * // (which has both forms) is used for filtering for if a user inputs either format, while 43193 * // the formatted phone number is the one that is shown in the table. 43194 * $(document).ready( function() { 43195 * $('#example').dataTable( { 43196 * "columnDefs": [ { 43197 * "targets": [ 0 ], 43198 * "data": null, // Use the full data source object for the renderer's source 43199 * "render": { 43200 * "_": "phone", 43201 * "filter": "phone_filter", 43202 * "display": "phone_display" 43203 * } 43204 * } ] 43205 * } ); 43206 * } ); 43207 * 43208 * @example 43209 * // Use as a function to create a link from the data source 43210 * $(document).ready( function() { 43211 * $('#example').dataTable( { 43212 * "columnDefs": [ { 43213 * "targets": [ 0 ], 43214 * "data": "download_link", 43215 * "render": function ( data, type, full ) { 43216 * return '<a href="'+data+'">Download</a>'; 43217 * } 43218 * } ] 43219 * } ); 43220 * } ); 43221 */
43222 "mRender": null, 43223 43224 43225 /** 43226 * Change the cell type created for the column - either TD cells or TH cells. This 43227 * can be useful as TH cells have semantic meaning in the table body, allowing them 43228 * to act as a header for a row (you may wish to add scope='row' to the TH elements). 43229 * @type string 43230 * @default td 43231 * 43232 * @name DataTable.defaults.column.cellType 43233 * @dtopt Columns 43234 * 43235 * @example 43236 * // Make the first column use TH cells 43237 * $(document).ready( function() { 43238 * $('#example').dataTable( { 43239 * "columnDefs": [ { 43240 * "targets": [ 0 ], 43241 * "cellType": "th" 43242 * } ] 43243 * } ); 43244 * } ); 43245 */ 43246 "sCellType": "td", 43247 43248 43249 /** 43250 * Class to give to each cell in this column. 43251 * @type string 43252 * @default <i>Empty string</i> 43253 * 43254 * @name DataTable.defaults.column.class 43255 * @dtopt Columns 43256 * 43257 * @example 43258 * // Using `columnDefs` 43259 * $(document).ready( function() { 43260 * $('#example').dataTable( { 43261 * "columnDefs": [ 43262 * { "class": "my_class", "targets": [ 0 ] } 43263 * ] 43264 * } ); 43265 * } ); 43266 * 43267 * @example 43268 * // Using `columns` 43269 * $(document).ready( function() { 43270 * $('#example').dataTable( { 43271 * "columns": [ 43272 * { "class": "my_class" }, 43273 * null, 43274 * null, 43275 * null, 43276 * null 43277 * ] 43278 * } ); 43279 * } ); 43280 */ 43281 "sClass": "", 43282 43283 /** 43284 * When DataTables calculates the column widths to assign to each column, 43285 * it finds the longest string in each column and then constructs a 43286 * temporary table and reads the widths from that. The problem with this 43287 * is that "mmm" is much wider then "iiii", but the latter is a longer 43288 * string - thus the calculation can go wrong (doing it properly and putting 43289 * it into an DOM object and measuring that is horribly(!) slow). Thus as 43290 * a "work around" we provide this option. It will append its value to the 43291 * text that is found to be the longest string for the column - i.e. padding. 43292 * Generally you shouldn't need this! 43293 * @type string 43294 * @default <i>Empty string<i> 43295 * 43296 * @name DataTable.defaults.column.contentPadding 43297 * @dtopt Columns 43298 * 43299 * @example 43300 * // Using `columns` 43301 * $(document).ready( function() { 43302 * $('#example').dataTable( { 43303 * "columns": [ 43304 * null, 43305 * null, 43306 * null, 43307 * { 43308 * "contentPadding": "mmm" 43309 * } 43310 * ] 43311 * } ); 43312 * } ); 43313 */ 43314 "sContentPadding": "", 43315 43316 43317 /** 43318 * Allows a default value to be given for a column's data, and will be used 43319 * whenever a null data source is encountered (this can be because `data` 43320 * is set to null, or because the data source itself is null). 43321 * @type string 43322 * @default null 43323 * 43324 * @name DataTable.defaults.column.defaultContent 43325 * @dtopt Columns 43326 * 43327 * @example 43328 * // Using `columnDefs` 43329 * $(document).ready( function() { 43330 * $('#example').dataTable( { 43331 * "columnDefs": [ 43332 * { 43333 * "data": null, 43334 * "defaultContent": "Edit", 43335 * "targets": [ -1 ] 43336 * } 43337 * ] 43338 * } ); 43339 * } ); 43340 * 43341 * @example 43342 * // Using `columns` 43343 * $(document).ready( function() { 43344 * $('#example').dataTable( { 43345 * "columns": [ 43346 * null, 43347 * null, 43348 * null, 43349 * { 43350 * "data": null, 43351 * "defaultContent": "Edit" 43352 * } 43353 * ] 43354 * } ); 43355 * } ); 43356 */ 43357 "sDefaultContent": null, 43358 43359 43360 /** 43361 * This parameter is only used in DataTables' server-side processing. It can 43362 * be exceptionally useful to know what columns are being displayed on the 43363 * client side, and to map these to database fields. When defined, the names 43364 * also allow DataTables to reorder information from the server if it comes 43365 * back in an unexpected order (i.e. if you switch your columns around on the 43366 * client-side, your server-side code does not also need updating). 43367 * @type string 43368 * @default <i>Empty string</i> 43369 * 43370 * @name DataTable.defaults.column.name 43371 * @dtopt Columns 43372 * 43373 * @example 43374 * // Using `columnDefs` 43375 * $(document).ready( function() { 43376 * $('#example').dataTable( { 43377 * "columnDefs": [ 43378 * { "name": "engine", "targets": [ 0 ] }, 43379 * { "name": "browser", "targets": [ 1 ] }, 43380 * { "name": "platform", "targets": [ 2 ] }, 43381 * { "name": "version", "targets": [ 3 ] }, 43382 * { "name": "grade", "targets": [ 4 ] } 43383 * ] 43384 * } ); 43385 * } ); 43386 * 43387 * @example 43388 * // Using `columns` 43389 * $(document).ready( function() { 43390 * $('#example').dataTable( { 43391 * "columns": [ 43392 * { "name": "engine" }, 43393 * { "name": "browser" }, 43394 * { "name": "platform" }, 43395 * { "name": "version" }, 43396 * { "name": "grade" } 43397 * ] 43398 * } ); 43399 * } ); 43400 */ 43401 "sName": "", 43402 43403 43404 /** 43405 * Defines a data source type for the ordering which can be used to read 43406 * real-time information from the table (updating the internally cached 43407 * version) prior to ordering. This allows ordering to occur on user 43408 * editable elements such as form inputs. 43409 * @type string 43410 * @default std 43411 * 43412 * @name DataTable.defaults.column.orderDataType 43413 * @dtopt Columns 43414 * 43415 * @example 43416 * // Using `columnDefs` 43417 * $(document).ready( function() { 43418 * $('#example').dataTable( { 43419 * "columnDefs": [ 43420 * { "orderDataType": "dom-text", "targets": [ 2, 3 ] }, 43421 * { "type": "numeric", "targets": [ 3 ] }, 43422 * { "orderDataType": "dom-select", "targets": [ 4 ] }, 43423 * { "orderDataType": "dom-checkbox", "targets": [ 5 ] } 43424 * ] 43425 * } ); 43426 * } ); 43427 * 43428 * @example 43429 * // Using `columns` 43430 * $(document).ready( function() { 43431 * $('#example').dataTable( { 43432 * "columns": [ 43433 * null, 43434 * null, 43435 * { "orderDataType": "dom-text" }, 43436 * { "orderDataType": "dom-text", "type": "numeric" }, 43437 * { "orderDataType": "dom-select" }, 43438 * { "orderDataType": "dom-checkbox" } 43439 * ] 43440 * } ); 43441 * } ); 43442 */ 43443 "sSortDataType": "std", 43444 43445 43446 /** 43447 * The title of this column. 43448 * @type string 43449 * @default null <i>Derived from the 'TH' value for this column in the 43450 * original HTML table.</i> 43451 * 43452 * @name DataTable.defaults.column.title 43453 * @dtopt Columns 43454 * 43455 * @example 43456 * // Using `columnDefs` 43457 * $(document).ready( function() { 43458 * $('#example').dataTable( { 43459 * "columnDefs": [ 43460 * { "title": "My column title", "targets": [ 0 ] } 43461 * ] 43462 * } ); 43463 * } ); 43464 * 43465 * @example 43466 * // Using `columns` 43467 * $(document).ready( function() { 43468 * $('#example').dataTable( { 43469 * "columns": [ 43470 * { "title": "My column title" }, 43471 * null, 43472 * null, 43473 * null, 43474 * null 43475 * ] 43476 * } ); 43477 * } ); 43478 */ 43479 "sTitle": null, 43480 43481 43482 /** 43483 * The type allows you to specify how the data for this column will be
43484 * ordered. Four types (string, numeric, date and html (which will strip 43485 * HTML tags before ordering)) are currently available. Note that only date 43486 * formats understood by Javascript's Date() object will be accepted as type 43487 * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string', 43488 * 'numeric', 'date' or 'html' (by default). Further types can be adding 43489 * through plug-ins. 43490 * @type string 43491 * @default null <i>Auto-detected from raw data</i> 43492 * 43493 * @name DataTable.defaults.column.type 43494 * @dtopt Columns 43495 * 43496 * @example 43497 * // Using `columnDefs` 43498 * $(document).ready( function() { 43499 * $('#example').dataTable( { 43500 * "columnDefs": [ 43501 * { "type": "html", "targets": [ 0 ] } 43502 * ] 43503 * } ); 43504 * } ); 43505 * 43506 * @example 43507 * // Using `columns` 43508 * $(document).ready( function() { 43509 * $('#example').dataTable( { 43510 * "columns": [ 43511 * { "type": "html" }, 43512 * null, 43513 * null, 43514 * null, 43515 * null 43516 * ] 43517 * } ); 43518 * } ); 43519 */ 43520 "sType": null, 43521 43522 43523 /** 43524 * Defining the width of the column, this parameter may take any CSS value 43525 * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not 43526 * been given a specific width through this interface ensuring that the table 43527 * remains readable. 43528 * @type string 43529 * @default null <i>Automatic</i> 43530 * 43531 * @name DataTable.defaults.column.width 43532 * @dtopt Columns 43533 * 43534 * @example 43535 * // Using `columnDefs` 43536 * $(document).ready( function() { 43537 * $('#example').dataTable( { 43538 * "columnDefs": [ 43539 * { "width": "20%", "targets": [ 0 ] } 43540 * ] 43541 * } ); 43542 * } ); 43543 * 43544 * @example 43545 * // Using `columns` 43546 * $(document).ready( function() { 43547 * $('#example').dataTable( { 43548 * "columns": [ 43549 * { "width": "20%" }, 43550 * null, 43551 * null, 43552 * null, 43553 * null 43554 * ] 43555 * } ); 43556 * } ); 43557 */ 43558 "sWidth": null 43559 }; 43560 43561 _fnHungarianMap( DataTable.defaults.column ); 43562 43563 43564 43565 /** 43566 * DataTables settings object - this holds all the information needed for a 43567 * given table, including configuration, data and current application of the 43568 * table options. DataTables does not have a single instance for each DataTable 43569 * with the settings attached to that instance, but rather instances of the 43570 * DataTable "class" are created on-the-fly as needed (typically by a 43571 * $().dataTable() call) and the settings object is then applied to that 43572 * instance. 43573 * 43574 * Note that this object is related to {@link DataTable.defaults} but this 43575 * one is the internal data store for DataTables's cache of columns. It should 43576 * NOT be manipulated outside of DataTables. Any configuration should be done 43577 * through the initialisation options. 43578 * @namespace 43579 * @todo Really should attach the settings object to individual instances so we 43580 * don't need to create new instances on each $().dataTable() call (if the 43581 * table already exists). It would also save passing oSettings around and 43582 * into every single function. However, this is a very significant 43583 * architecture change for DataTables and will almost certainly break 43584 * backwards compatibility with older installations. This is something that 43585 * will be done in 2.0. 43586 */ 43587 DataTable.models.oSettings = { 43588 /** 43589 * Primary features of DataTables and their enablement state. 43590 * @namespace 43591 */ 43592 "oFeatures": { 43593 43594 /** 43595 * Flag to say if DataTables should automatically try to calculate the 43596 * optimum table and columns widths (true) or not (false). 43597 * Note that this parameter will be set by the initialisation routine. To 43598 * set a default use {@link DataTable.defaults}. 43599 * @type boolean 43600 */ 43601 "bAutoWidth": null, 43602 43603 /** 43604 * Delay the creation of TR and TD elements until they are actually 43605 * needed by a driven page draw. This can give a significant speed 43606 * increase for Ajax source and Javascript source data, but makes no 43607 * difference at all fro DOM and server-side processing tables. 43608 * Note that this parameter will be set by the initialisation routine. To 43609 * set a default use {@link DataTable.defaults}. 43610 * @type boolean 43611 */ 43612 "bDeferRender": null, 43613 43614 /** 43615 * Enable filtering on the table or not. Note that if this is disabled 43616 * then there is no filtering at all on the table, including fnFilter. 43617 * To just remove the filtering input use sDom and remove the 'f' option. 43618 * Note that this parameter will be set by the initialisation routine. To 43619 * set a default use {@link DataTable.defaults}. 43620 * @type boolean 43621 */ 43622 "bFilter": null, 43623 43624 /** 43625 * Table information element (the 'Showing x of y records' div) enable 43626 * flag. 43627 * Note that this parameter will be set by the initialisation routine. To 43628 * set a default use {@link DataTable.defaults}. 43629 * @type boolean 43630 */ 43631 "bInfo": null, 43632 43633 /** 43634 * Present a user control allowing the end user to change the page size 43635 * when pagination is enabled. 43636 * Note that this parameter will be set by the initialisation routine. To 43637 * set a default use {@link DataTable.defaults}. 43638 * @type boolean 43639 */ 43640 "bLengthChange": null, 43641 43642 /** 43643 * Pagination enabled or not. Note that if this is disabled then length 43644 * changing must also be disabled. 43645 * Note that this parameter will be set by the initialisation routine. To 43646 * set a default use {@link DataTable.defaults}. 43647 * @type boolean 43648 */ 43649 "bPaginate": null, 43650 43651 /** 43652 * Processing indicator enable flag whenever DataTables is enacting a 43653 * user request - typically an Ajax request for server-side processing. 43654 * Note that this parameter will be set by the initialisation routine. To 43655 * set a default use {@link DataTable.defaults}. 43656 * @type boolean 43657 */ 43658 "bProcessing": null, 43659 43660 /** 43661 * Server-side processing enabled flag - when enabled DataTables will 43662 * get all data from the server for every draw - there is no filtering, 43663 * sorting or paging done on the client-side. 43664 * Note that this parameter will be set by the initialisation routine. To 43665 * set a default use {@link DataTable.defaults}. 43666 * @type boolean 43667 */ 43668 "bServerSide": null, 43669 43670 /** 43671 * Sorting enablement flag. 43672 * Note that this parameter will be set by the initialisation routine. To 43673 * set a default use {@link DataTable.defaults}. 43674 * @type boolean 43675 */ 43676 "bSort": null, 43677 43678 /**
43679 * Multi-column sorting 43680 * Note that this parameter will be set by the initialisation routine. To 43681 * set a default use {@link DataTable.defaults}. 43682 * @type boolean 43683 */ 43684 "bSortMulti": null, 43685 43686 /** 43687 * Apply a class to the columns which are being sorted to provide a 43688 * visual highlight or not. This can slow things down when enabled since 43689 * there is a lot of DOM interaction. 43690 * Note that this parameter will be set by the initialisation routine. To 43691 * set a default use {@link DataTable.defaults}. 43692 * @type boolean 43693 */ 43694 "bSortClasses": null, 43695 43696 /** 43697 * State saving enablement flag. 43698 * Note that this parameter will be set by the initialisation routine. To 43699 * set a default use {@link DataTable.defaults}. 43700 * @type boolean 43701 */ 43702 "bStateSave": null 43703 }, 43704 43705 43706 /** 43707 * Scrolling settings for a table. 43708 * @namespace 43709 */ 43710 "oScroll": { 43711 /** 43712 * When the table is shorter in height than sScrollY, collapse the 43713 * table container down to the height of the table (when true). 43714 * Note that this parameter will be set by the initialisation routine. To 43715 * set a default use {@link DataTable.defaults}. 43716 * @type boolean 43717 */ 43718 "bCollapse": null, 43719 43720 /** 43721 * Width of the scrollbar for the web-browser's platform. Calculated 43722 * during table initialisation. 43723 * @type int 43724 * @default 0 43725 */ 43726 "iBarWidth": 0, 43727 43728 /** 43729 * Viewport width for horizontal scrolling. Horizontal scrolling is 43730 * disabled if an empty string. 43731 * Note that this parameter will be set by the initialisation routine. To 43732 * set a default use {@link DataTable.defaults}. 43733 * @type string 43734 */ 43735 "sX": null, 43736 43737 /** 43738 * Width to expand the table to when using x-scrolling. Typically you 43739 * should not need to use this. 43740 * Note that this parameter will be set by the initialisation routine. To 43741 * set a default use {@link DataTable.defaults}. 43742 * @type string 43743 * @deprecated 43744 */ 43745 "sXInner": null, 43746 43747 /** 43748 * Viewport height for vertical scrolling. Vertical scrolling is disabled 43749 * if an empty string. 43750 * Note that this parameter will be set by the initialisation routine. To 43751 * set a default use {@link DataTable.defaults}. 43752 * @type string 43753 */ 43754 "sY": null 43755 }, 43756 43757 /** 43758 * Language information for the table. 43759 * @namespace 43760 * @extends DataTable.defaults.oLanguage 43761 */ 43762 "oLanguage": { 43763 /** 43764 * Information callback function. See 43765 * {@link DataTable.defaults.fnInfoCallback} 43766 * @type function 43767 * @default null 43768 */ 43769 "fnInfoCallback": null 43770 }, 43771 43772 /** 43773 * Browser support parameters 43774 * @namespace 43775 */ 43776 "oBrowser": { 43777 /** 43778 * Indicate if the browser incorrectly calculates width:100% inside a 43779 * scrolling element (IE6/7) 43780 * @type boolean 43781 * @default false 43782 */ 43783 "bScrollOversize": false, 43784 43785 /** 43786 * Determine if the vertical scrollbar is on the right or left of the 43787 * scrolling container - needed for rtl language layout, although not 43788 * all browsers move the scrollbar (Safari). 43789 * @type boolean 43790 * @default false 43791 */ 43792 "bScrollbarLeft": false, 43793 43794 /** 43795 * Flag for if `getBoundingClientRect` is fully supported or not 43796 * @type boolean 43797 * @default false 43798 */ 43799 "bBounding": false, 43800 43801 /** 43802 * Browser scrollbar width 43803 * @type integer 43804 * @default 0 43805 */ 43806 "barWidth": 0 43807 }, 43808 43809 43810 "ajax": null, 43811 43812 43813 /** 43814 * Array referencing the nodes which are used for the features. The 43815 * parameters of this object match what is allowed by sDom - i.e. 43816 * <ul> 43817 * <li>'l' - Length changing</li> 43818 * <li>'f' - Filtering input</li> 43819 * <li>'t' - The table!</li> 43820 * <li>'i' - Information</li> 43821 * <li>'p' - Pagination</li> 43822 * <li>'r' - pRocessing</li> 43823 * </ul> 43824 * @type array 43825 * @default [] 43826 */ 43827 "aanFeatures": [], 43828 43829 /** 43830 * Store data information - see {@link DataTable.models.oRow} for detailed 43831 * information. 43832 * @type array 43833 * @default [] 43834 */ 43835 "aoData": [], 43836 43837 /** 43838 * Array of indexes which are in the current display (after filtering etc) 43839 * @type array 43840 * @default [] 43841 */ 43842 "aiDisplay": [], 43843 43844 /** 43845 * Array of indexes for display - no filtering 43846 * @type array 43847 * @default [] 43848 */ 43849 "aiDisplayMaster": [], 43850 43851 /** 43852 * Map of row ids to data indexes 43853 * @type object 43854 * @default {} 43855 */ 43856 "aIds": {}, 43857 43858 /** 43859 * Store information about each column that is in use 43860 * @type array 43861 * @default [] 43862 */ 43863 "aoColumns": [], 43864 43865 /** 43866 * Store information about the table's header 43867 * @type array 43868 * @default [] 43869 */ 43870 "aoHeader": [], 43871 43872 /** 43873 * Store information about the table's footer 43874 * @type array 43875 * @default [] 43876 */ 43877 "aoFooter": [], 43878 43879 /** 43880 * Store the applied global search information in case we want to force a 43881 * research or compare the old search to a new one. 43882 * Note that this parameter will be set by the initialisation routine. To 43883 * set a default use {@link DataTable.defaults}. 43884 * @namespace 43885 * @extends DataTable.models.oSearch 43886 */ 43887 "oPreviousSearch": {}, 43888 43889 /** 43890 * Store the applied search for each column - see 43891 * {@link DataTable.models.oSearch} for the format that is used for the 43892 * filtering information for each column. 43893 * @type array 43894 * @default [] 43895 */ 43896 "aoPreSearchCols": [], 43897 43898 /** 43899 * Sorting that is applied to the table. Note that the inner arrays are 43900 * used in the following manner: 43901 * <ul> 43902 * <li>Index 0 - column number</li> 43903 * <li>Index 1 - current sorting direction</li> 43904 * </ul> 43905 * Note that this parameter will be set by the initialisation routine. To 43906 * set a default use {@link DataTable.defaults}. 43907 * @type array 43908 * @todo These inner arrays should really be objects 43909 */ 43910 "aaSorting": null, 43911 43912 /** 43913 * Sorting that is always applied to the table (i.e. prefixed in front of 43914 * aaSorting). 43915 * Note that this parameter will be set by the initialisation routine. To 43916 * set a default use {@link DataTable.defaults}. 43917 * @type array 43918 * @default [] 43919 */ 43920 "aaSortingFixed": [], 43921 43922 /** 43923 * Classes to use for the striping of a table. 43924 * Note that this parameter will be set by the initialisation routine. To 43925 * set a default use {@link DataTable.defaults}. 43926 * @type array 43927 * @default [] 43928 */ 43929 "asStripeClasses": null, 43930 43931 /** 43932 * If restoring a table - we should restore its striping classes as well 43933 * @type array 43934 * @default [] 43935 */ 43936 "asDestroyStripes": [], 43937 43938 /** 43939 * If restoring a table - we should restore its width 43940 * @type int 43941 * @default 0 43942 */ 43943 "sDestroyWidth": 0, 43944 43945 /** 43946 * Callback functions array for every time a row is inserted (i.e. on a draw). 43947 * @type array 43948 * @default [] 43949 */ 43950 "aoRowCallback": [], 43951 43952 /** 43953 * Callback functions for the header on each draw. 43954 * @type array 43955 * @default [] 43956 */ 43957 "aoHeaderCallback": [], 43958 43959 /** 43960 * Callback function for the footer on each draw. 43961 * @type array 43962 * @default [] 43963 */ 43964 "aoFooterCallback": [], 43965 43966 /** 43967 * Array of callback functions for draw callback functions 43968 * @type array 43969 * @default [] 43970 */ 43971 "aoDrawCallback": [], 43972 43973 /** 43974 * Array of callback functions for row created function 43975 * @type array 43976 * @default [] 43977 */ 43978 "aoRowCreatedCallback": [], 43979 43980 /** 43981 * Callback functions for just before the table is redrawn. A return of 43982 * false will be used to cancel the draw. 43983 * @type array 43984 * @default [] 43985 */ 43986 "aoPreDrawCallback": [], 43987 43988 /** 43989 * Callback functions for when the table has been initialised. 43990 * @type array 43991 * @default [] 43992 */ 43993 "aoInitComplete": [], 43994 43995 43996 /** 43997 * Callbacks for modifying the settings to be stored for state saving, prior to 43998 * saving state. 43999 * @type array 44000 * @default [] 44001 */ 44002 "aoStateSaveParams": [], 44003 44004 /** 44005 * Callbacks for modifying the settings that have been stored for state saving 44006 * prior to using the stored values to restore the state. 44007 * @type array 44008 * @default [] 44009 */ 44010 "aoStateLoadParams": [], 44011 44012 /** 44013 * Callbacks for operating on the settings object once the saved state has been 44014 * loaded 44015 * @type array 44016 * @default [] 44017 */ 44018 "aoStateLoaded": [], 44019 44020 /** 44021 * Cache the table ID for quick access 44022 * @type string 44023 * @default <i>Empty string</i> 44024 */ 44025 "sTableId": "", 44026 44027 /** 44028 * The TABLE node for the main table 44029 * @type node 44030 * @default null 44031 */ 44032 "nTable": null, 44033 44034 /** 44035 * Permanent ref to the thead element 44036 * @type node 44037 * @default null 44038 */ 44039 "nTHead": null, 44040 44041 /** 44042 * Permanent ref to the tfoot element - if it exists 44043 * @type node 44044 * @default null 44045 */ 44046 "nTFoot": null, 44047 44048 /** 44049 * Permanent ref to the tbody element 44050 * @type node 44051 * @default null 44052 */ 44053 "nTBody": null, 44054 44055 /** 44056 * Cache the wrapper node (contains all DataTables controlled elements) 44057 * @type node 44058 * @default null 44059 */ 44060 "nTableWrapper": null, 44061 44062 /** 44063 * Indicate if when using server-side processing the loading of data 44064 * should be deferred until the second draw. 44065 * Note that this parameter will be set by the initialisation routine. To 44066 * set a default use {@link DataTable.defaults}. 44067 * @type boolean 44068 * @default false 44069 */ 44070 "bDeferLoading": false, 44071 44072 /** 44073 * Indicate if all required information has been read in 44074 * @type boolean 44075 * @default false 44076 */ 44077 "bInitialised": false, 44078 44079 /** 44080 * Information about open rows. Each object in the array has the parameters 44081 * 'nTr' and 'nParent' 44082 * @type array 44083 * @default [] 44084 */ 44085 "aoOpenRows": [], 44086 44087 /**
44088 * Dictate the positioning of DataTables' control elements - see 44089 * {@link DataTable.model.oInit.sDom}. 44090 * Note that this parameter will be set by the initialisation routine. To 44091 * set a default use {@link DataTable.defaults}. 44092 * @type string 44093 * @default null 44094 */ 44095 "sDom": null, 44096 44097 /** 44098 * Search delay (in mS) 44099 * @type integer 44100 * @default null 44101 */ 44102 "searchDelay": null, 44103 44104 /** 44105 * Which type of pagination should be used. 44106 * Note that this parameter will be set by the initialisation routine. To 44107 * set a default use {@link DataTable.defaults}. 44108 * @type string 44109 * @default two_button 44110 */ 44111 "sPaginationType": "two_button", 44112 44113 /** 44114 * The state duration (for `stateSave`) in seconds. 44115 * Note that this parameter will be set by the initialisation routine. To 44116 * set a default use {@link DataTable.defaults}. 44117 * @type int 44118 * @default 0 44119 */ 44120 "iStateDuration": 0, 44121 44122 /** 44123 * Array of callback functions for state saving. Each array element is an 44124 * object with the following parameters: 44125 * <ul> 44126 * <li>function:fn - function to call. Takes two parameters, oSettings 44127 * and the JSON string to save that has been thus far created. Returns 44128 * a JSON string to be inserted into a json object 44129 * (i.e. '"param": [ 0, 1, 2]')</li> 44130 * <li>string:sName - name of callback</li> 44131 * </ul> 44132 * @type array 44133 * @default [] 44134 */ 44135 "aoStateSave": [], 44136 44137 /** 44138 * Array of callback functions for state loading. Each array element is an 44139 * object with the following parameters: 44140 * <ul> 44141 * <li>function:fn - function to call. Takes two parameters, oSettings 44142 * and the object stored. May return false to cancel state loading</li> 44143 * <li>string:sName - name of callback</li> 44144 * </ul> 44145 * @type array 44146 * @default [] 44147 */ 44148 "aoStateLoad": [], 44149 44150 /** 44151 * State that was saved. Useful for back reference 44152 * @type object 44153 * @default null 44154 */ 44155 "oSavedState": null, 44156 44157 /** 44158 * State that was loaded. Useful for back reference 44159 * @type object 44160 * @default null 44161 */ 44162 "oLoadedState": null, 44163 44164 /** 44165 * Source url for AJAX data for the table. 44166 * Note that this parameter will be set by the initialisation routine. To 44167 * set a default use {@link DataTable.defaults}. 44168 * @type string 44169 * @default null 44170 */ 44171 "sAjaxSource": null, 44172 44173 /** 44174 * Property from a given object from which to read the table data from. This 44175 * can be an empty string (when not server-side processing), in which case 44176 * it is assumed an an array is given directly. 44177 * Note that this parameter will be set by the initialisation routine. To 44178 * set a default use {@link DataTable.defaults}. 44179 * @type string 44180 */ 44181 "sAjaxDataProp": null, 44182 44183 /** 44184 * Note if draw should be blocked while getting data 44185 * @type boolean 44186 * @default true 44187 */ 44188 "bAjaxDataGet": true, 44189 44190 /** 44191 * The last jQuery XHR object that was used for server-side data gathering. 44192 * This can be used for working with the XHR information in one of the 44193 * callbacks 44194 * @type object 44195 * @default null 44196 */ 44197 "jqXHR": null, 44198 44199 /** 44200 * JSON returned from the server in the last Ajax request 44201 * @type object 44202 * @default undefined 44203 */ 44204 "json": undefined, 44205 44206 /** 44207 * Data submitted as part of the last Ajax request 44208 * @type object 44209 * @default undefined 44210 */ 44211 "oAjaxData": undefined, 44212 44213 /** 44214 * Function to get the server-side data. 44215 * Note that this parameter will be set by the initialisation routine. To 44216 * set a default use {@link DataTable.defaults}. 44217 * @type function 44218 */ 44219 "fnServerData": null, 44220 44221 /** 44222 * Functions which are called prior to sending an Ajax request so extra 44223 * parameters can easily be sent to the server 44224 * @type array 44225 * @default [] 44226 */ 44227 "aoServerParams": [], 44228 44229 /** 44230 * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if 44231 * required). 44232 * Note that this parameter will be set by the initialisation routine. To 44233 * set a default use {@link DataTable.defaults}. 44234 * @type string 44235 */ 44236 "sServerMethod": null, 44237 44238 /** 44239 * Format numbers for display. 44240 * Note that this parameter will be set by the initialisation routine. To 44241 * set a default use {@link DataTable.defaults}. 44242 * @type function 44243 */ 44244 "fnFormatNumber": null, 44245 44246 /** 44247 * List of options that can be used for the user selectable length menu. 44248 * Note that this parameter will be set by the initialisation routine. To 44249 * set a default use {@link DataTable.defaults}. 44250 * @type array 44251 * @default [] 44252 */ 44253 "aLengthMenu": null, 44254 44255 /** 44256 * Counter for the draws that the table does. Also used as a tracker for 44257 * server-side processing 44258 * @type int 44259 * @default 0 44260 */ 44261 "iDraw": 0, 44262 44263 /** 44264 * Indicate if a redraw is being done - useful for Ajax 44265 * @type boolean 44266 * @default false 44267 */ 44268 "bDrawing": false, 44269 44270 /** 44271 * Draw index (iDraw) of the last error when parsing the returned data 44272 * @type int 44273 * @default -1 44274 */ 44275 "iDrawError": -1, 44276 44277 /** 44278 * Paging display length 44279 * @type int 44280 * @default 10 44281 */ 44282 "_iDisplayLength": 10, 44283 44284 /** 44285 * Paging start point - aiDisplay index 44286 * @type int 44287 * @default 0 44288 */ 44289 "_iDisplayStart": 0, 44290 44291 /** 44292 * Server-side processing - number of records in the result set 44293 * (i.e. before filtering), Use fnRecordsTotal rather than 44294 * this property to get the value of the number of records, regardless of 44295 * the server-side processing setting. 44296 * @type int 44297 * @default 0 44298 * @private 44299 */ 44300 "_iRecordsTotal": 0, 44301 44302 /** 44303 * Server-side processing - number of records in the current display set 44304 * (i.e. after filtering). Use fnRecordsDisplay rather than 44305 * this property to get the value of the number of records, regardless of 44306 * the server-side processing setting. 44307 * @type boolean 44308 * @default 0 44309 * @private 44310 */ 44311 "_iRecordsDisplay": 0, 44312 44313 /** 44314 * Flag to indicate if jQuery UI marking and classes should be used. 44315 * Note that this parameter will be set by the initialisation routine. To 44316 * set a default use {@link DataTable.defaults}. 44317 * @type boolean 44318 */ 44319 "bJUI": null, 44320 44321 /** 44322 * The classes to use for the table 44323 * @type object 44324 * @default {} 44325 */
44326 "oClasses": {}, 44327 44328 /** 44329 * Flag attached to the settings object so you can check in the draw 44330 * callback if filtering has been done in the draw. Deprecated in favour of 44331 * events. 44332 * @type boolean 44333 * @default false 44334 * @deprecated 44335 */ 44336 "bFiltered": false, 44337 44338 /** 44339 * Flag attached to the settings object so you can check in the draw 44340 * callback if sorting has been done in the draw. Deprecated in favour of 44341 * events. 44342 * @type boolean 44343 * @default false 44344 * @deprecated 44345 */ 44346 "bSorted": false, 44347 44348 /** 44349 * Indicate that if multiple rows are in the header and there is more than 44350 * one unique cell per column, if the top one (true) or bottom one (false) 44351 * should be used for sorting / title by DataTables. 44352 * Note that this parameter will be set by the initialisation routine. To 44353 * set a default use {@link DataTable.defaults}. 44354 * @type boolean 44355 */ 44356 "bSortCellsTop": null, 44357 44358 /** 44359 * Initialisation object that is used for the table 44360 * @type object 44361 * @default null 44362 */ 44363 "oInit": null, 44364 44365 /** 44366 * Destroy callback functions - for plug-ins to attach themselves to the 44367 * destroy so they can clean up markup and events. 44368 * @type array 44369 * @default [] 44370 */ 44371 "aoDestroyCallback": [], 44372 44373 44374 /** 44375 * Get the number of records in the current record set, before filtering 44376 * @type function 44377 */ 44378 "fnRecordsTotal": function () 44379 { 44380 return _fnDataSource( this ) == 'ssp' ? 44381 this._iRecordsTotal * 1 : 44382 this.aiDisplayMaster.length; 44383 }, 44384 44385 /** 44386 * Get the number of records in the current record set, after filtering 44387 * @type function 44388 */ 44389 "fnRecordsDisplay": function () 44390 { 44391 return _fnDataSource( this ) == 'ssp' ? 44392 this._iRecordsDisplay * 1 : 44393 this.aiDisplay.length; 44394 }, 44395 44396 /** 44397 * Get the display end point - aiDisplay index 44398 * @type function 44399 */ 44400 "fnDisplayEnd": function () 44401 { 44402 var 44403 len = this._iDisplayLength, 44404 start = this._iDisplayStart, 44405 calc = start + len, 44406 records = this.aiDisplay.length, 44407 features = this.oFeatures, 44408 paginate = features.bPaginate; 44409 44410 if ( features.bServerSide ) { 44411 return paginate === false || len === -1 ? 44412 start + records : 44413 Math.min( start+len, this._iRecordsDisplay ); 44414 } 44415 else { 44416 return ! paginate || calc>records || len===-1 ? 44417 records : 44418 calc; 44419 } 44420 }, 44421 44422 /** 44423 * The DataTables object for this table 44424 * @type object 44425 * @default null 44426 */ 44427 "oInstance": null, 44428 44429 /** 44430 * Unique identifier for each instance of the DataTables object. If there 44431 * is an ID on the table node, then it takes that value, otherwise an 44432 * incrementing internal counter is used. 44433 * @type string 44434 * @default null 44435 */ 44436 "sInstance": null, 44437 44438 /** 44439 * tabindex attribute value that is added to DataTables control elements, allowing 44440 * keyboard navigation of the table and its controls. 44441 */ 44442 "iTabIndex": 0, 44443 44444 /** 44445 * DIV container for the footer scrolling table if scrolling 44446 */ 44447 "nScrollHead": null, 44448 44449 /** 44450 * DIV container for the footer scrolling table if scrolling 44451 */ 44452 "nScrollFoot": null, 44453 44454 /** 44455 * Last applied sort 44456 * @type array 44457 * @default [] 44458 */ 44459 "aLastSort": [], 44460 44461 /** 44462 * Stored plug-in instances 44463 * @type object 44464 * @default {} 44465 */ 44466 "oPlugins": {}, 44467 44468 /** 44469 * Function used to get a row's id from the row's data 44470 * @type function 44471 * @default null 44472 */ 44473 "rowIdFn": null, 44474 44475 /** 44476 * Data location where to store a row's id 44477 * @type string 44478 * @default null 44479 */ 44480 "rowId": null 44481 }; 44482 44483 /** 44484 * Extension object for DataTables that is used to provide all extension 44485 * options. 44486 * 44487 * Note that the `DataTable.ext` object is available through 44488 * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is 44489 * also aliased to `jQuery.fn.dataTableExt` for historic reasons. 44490 * @namespace 44491 * @extends DataTable.models.ext 44492 */ 44493 44494 44495 /** 44496 * DataTables extensions 44497 * 44498 * This namespace acts as a collection area for plug-ins that can be used to 44499 * extend DataTables capabilities. Indeed many of the build in methods 44500 * use this method to provide their own capabilities (sorting methods for 44501 * example). 44502 * 44503 * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy 44504 * reasons 44505 * 44506 * @namespace 44507 */ 44508 DataTable.ext = _ext = { 44509 /** 44510 * Buttons. For use with the Buttons extension for DataTables. This is 44511 * defined here so other extensions can define buttons regardless of load 44512 * order. It is _not_ used by DataTables core. 44513 * 44514 * @type object 44515 * @default {} 44516 */ 44517 buttons: {}, 44518 44519 44520 /** 44521 * Element class names 44522 * 44523 * @type object 44524 * @default {} 44525 */ 44526 classes: {}, 44527 44528 44529 /** 44530 * Error reporting. 44531 * 44532 * How should DataTables report an error. Can take the value 'alert', 44533 * 'throw', 'none' or a function. 44534 * 44535 * @type string|function 44536 * @default alert 44537 */ 44538 errMode: "alert", 44539 44540 44541 /**
44542 * Feature plug-ins. 44543 * 44544 * This is an array of objects which describe the feature plug-ins that are 44545 * available to DataTables. These feature plug-ins are then available for 44546 * use through the `dom` initialisation option. 44547 * 44548 * Each feature plug-in is described by an object which must have the 44549 * following properties: 44550 * 44551 * * `fnInit` - function that is used to initialise the plug-in, 44552 * * `cFeature` - a character so the feature can be enabled by the `dom` 44553 * instillation option. This is case sensitive. 44554 * 44555 * The `fnInit` function has the following input parameters: 44556 * 44557 * 1. `{object}` DataTables settings object: see 44558 * {@link DataTable.models.oSettings} 44559 * 44560 * And the following return is expected: 44561 * 44562 * * {node|null} The element which contains your feature. Note that the 44563 * return may also be void if your plug-in does not require to inject any 44564 * DOM elements into DataTables control (`dom`) - for example this might 44565 * be useful when developing a plug-in which allows table control via 44566 * keyboard entry 44567 * 44568 * @type array 44569 * 44570 * @example 44571 * $.fn.dataTable.ext.features.push( { 44572 * "fnInit": function( oSettings ) { 44573 * return new TableTools( { "oDTSettings": oSettings } ); 44574 * }, 44575 * "cFeature": "T" 44576 * } ); 44577 */ 44578 feature: [], 44579 44580 44581 /** 44582 * Row searching. 44583 * 44584 * This method of searching is complimentary to the default type based 44585 * searching, and a lot more comprehensive as it allows you complete control 44586 * over the searching logic. Each element in this array is a function 44587 * (parameters described below) that is called for every row in the table, 44588 * and your logic decides if it should be included in the searching data set 44589 * or not. 44590 * 44591 * Searching functions have the following input parameters: 44592 * 44593 * 1. `{object}` DataTables settings object: see 44594 * {@link DataTable.models.oSettings} 44595 * 2. `{array|object}` Data for the row to be processed (same as the 44596 * original format that was passed in as the data source, or an array 44597 * from a DOM data source 44598 * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which 44599 * can be useful to retrieve the `TR` element if you need DOM interaction. 44600 * 44601 * And the following return is expected: 44602 * 44603 * * {boolean} Include the row in the searched result set (true) or not 44604 * (false) 44605 * 44606 * Note that as with the main search ability in DataTables, technically this 44607 * is "filtering", since it is subtractive. However, for consistency in 44608 * naming we call it searching here. 44609 * 44610 * @type array 44611 * @default [] 44612 * 44613 * @example 44614 * // The following example shows custom search being applied to the 44615 * // fourth column (i.e. the data[3] index) based on two input values 44616 * // from the end-user, matching the data in a certain range. 44617 * $.fn.dataTable.ext.search.push( 44618 * function( settings, data, dataIndex ) { 44619 * var min = document.getElementById('min').value * 1; 44620 * var max = document.getElementById('max').value * 1; 44621 * var version = data[3] == "-" ? 0 : data[3]*1; 44622 * 44623 * if ( min == "" && max == "" ) { 44624 * return true; 44625 * } 44626 * else if ( min == "" && version < max ) { 44627 * return true; 44628 * } 44629 * else if ( min < version && "" == max ) { 44630 * return true; 44631 * } 44632 * else if ( min < version && version < max ) { 44633 * return true; 44634 * } 44635 * return false; 44636 * } 44637 * ); 44638 */ 44639 search: [], 44640 44641 44642 /** 44643 * Selector extensions 44644 * 44645 * The `selector` option can be used to extend the options available for the 44646 * selector modifier options (`selector-modifier` object data type) that 44647 * each of the three built in selector types offer (row, column and cell + 44648 * their plural counterparts). For example the Select extension uses this 44649 * mechanism to provide an option to select only rows, columns and cells 44650 * that have been marked as selected by the end user (`{selected: true}`), 44651 * which can be used in conjunction with the existing built in selector 44652 * options. 44653 * 44654 * Each property is an array to which functions can be pushed. The functions 44655 * take three attributes: 44656 * 44657 * * Settings object for the host table 44658 * * Options object (`selector-modifier` object type) 44659 * * Array of selected item indexes 44660 * 44661 * The return is an array of the resulting item indexes after the custom 44662 * selector has been applied. 44663 * 44664 * @type object 44665 */ 44666 selector: { 44667 cell: [], 44668 column: [], 44669 row: [] 44670 }, 44671 44672 44673 /** 44674 * Internal functions, exposed for used in plug-ins. 44675 * 44676 * Please note that you should not need to use the internal methods for 44677 * anything other than a plug-in (and even then, try to avoid if possible). 44678 * The internal function may change between releases. 44679 * 44680 * @type object 44681 * @default {} 44682 */ 44683 internal: {}, 44684 44685 44686 /** 44687 * Legacy configuration options. Enable and disable legacy options that 44688 * are available in DataTables. 44689 * 44690 * @type object 44691 */ 44692 legacy: { 44693 /** 44694 * Enable / disable DataTables 1.9 compatible server-side processing 44695 * requests 44696 * 44697 * @type boolean 44698 * @default null 44699 */ 44700 ajax: null 44701 }, 44702 44703 44704 /** 44705 * Pagination plug-in methods. 44706 * 44707 * Each entry in this object is a function and defines which buttons should 44708 * be shown by the pagination rendering method that is used for the table: 44709 * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the 44710 * buttons are displayed in the document, while the functions here tell it 44711 * what buttons to display. This is done by returning an array of button 44712 * descriptions (what each button will do). 44713 * 44714 * Pagination types (the four built in options and any additional plug-in 44715 * options defined here) can be used through the `paginationType` 44716 * initialisation parameter. 44717 * 44718 * The functions defined take two parameters: 44719 * 44720 * 1. `{int} page` The current page index 44721 * 2. `{int} pages` The number of pages in the table 44722 * 44723 * Each function is expected to return an array where each element of the 44724 * array can be one of: 44725 * 44726 * * `first` - Jump to first page when activated 44727 * * `last` - Jump to last page when activated 44728 * * `previous` - Show previous page when activated 44729 * * `next` - Show next page when activated 44730 * * `{int}` - Show page of the index given 44731 * * `{array}` - A nested array containing the above elements to add a 44732 * containing 'DIV' element (might be useful for styling). 44733 * 44734 * Note that DataTables v1.9- used this object slightly differently whereby 44735 * an object with two functions would be defined for each plug-in. That 44736 * ability is still supported by DataTables 1.10+ to provide backwards 44737 * compatibility, but this option of use is now decremented and no longer 44738 * documented in DataTables 1.10+. 44739 * 44740 * @type object 44741 * @default {} 44742 * 44743 * @example 44744 * // Show previous, next and current page buttons only 44745 * $.fn.dataTableExt.oPagination.current = function ( page, pages ) { 44746 * return [ 'previous', page, 'next' ]; 44747 * }; 44748 */ 44749 pager: {}, 44750 44751 44752 renderer: { 44753 pageButton: {}, 44754 header: {} 44755 }, 44756 44757 44758 /** 44759 * Ordering plug-ins - custom data source 44760 *
44761 * The extension options for ordering of data available here is complimentary 44762 * to the default type based ordering that DataTables typically uses. It 44763 * allows much greater control over the the data that is being used to 44764 * order a column, but is necessarily therefore more complex. 44765 * 44766 * This type of ordering is useful if you want to do ordering based on data 44767 * live from the DOM (for example the contents of an 'input' element) rather 44768 * than just the static string that DataTables knows of. 44769 * 44770 * The way these plug-ins work is that you create an array of the values you 44771 * wish to be ordering for the column in question and then return that 44772 * array. The data in the array much be in the index order of the rows in 44773 * the table (not the currently ordering order!). Which order data gathering 44774 * function is run here depends on the `dt-init columns.orderDataType` 44775 * parameter that is used for the column (if any). 44776 * 44777 * The functions defined take two parameters: 44778 * 44779 * 1. `{object}` DataTables settings object: see 44780 * {@link DataTable.models.oSettings} 44781 * 2. `{int}` Target column index 44782 * 44783 * Each function is expected to return an array: 44784 * 44785 * * `{array}` Data for the column to be ordering upon 44786 * 44787 * @type array 44788 * 44789 * @example 44790 * // Ordering using `input` node values 44791 * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col ) 44792 * { 44793 * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) { 44794 * return $('input', td).val(); 44795 * } ); 44796 * } 44797 */ 44798 order: {}, 44799 44800 44801 /** 44802 * Type based plug-ins. 44803 * 44804 * Each column in DataTables has a type assigned to it, either by automatic 44805 * detection or by direct assignment using the `type` option for the column. 44806 * The type of a column will effect how it is ordering and search (plug-ins 44807 * can also make use of the column type if required). 44808 * 44809 * @namespace 44810 */ 44811 type: { 44812 /** 44813 * Type detection functions. 44814 * 44815 * The functions defined in this object are used to automatically detect 44816 * a column's type, making initialisation of DataTables super easy, even 44817 * when complex data is in the table. 44818 * 44819 * The functions defined take two parameters: 44820 * 44821 * 1. `{*}` Data from the column cell to be analysed 44822 * 2. `{settings}` DataTables settings object. This can be used to 44823 * perform context specific type detection - for example detection 44824 * based on language settings such as using a comma for a decimal 44825 * place. Generally speaking the options from the settings will not 44826 * be required 44827 * 44828 * Each function is expected to return: 44829 * 44830 * * `{string|null}` Data type detected, or null if unknown (and thus 44831 * pass it on to the other type detection functions. 44832 * 44833 * @type array 44834 * 44835 * @example 44836 * // Currency type detection plug-in: 44837 * $.fn.dataTable.ext.type.detect.push( 44838 * function ( data, settings ) { 44839 * // Check the numeric part 44840 * if ( ! $.isNumeric( data.substring(1) ) ) { 44841 * return null; 44842 * } 44843 * 44844 * // Check prefixed by currency 44845 * if ( data.charAt(0) == '$' || data.charAt(0) == '£' ) { 44846 * return 'currency'; 44847 * } 44848 * return null; 44849 * } 44850 * ); 44851 */ 44852 detect: [], 44853 44854 44855 /** 44856 * Type based search formatting. 44857 * 44858 * The type based searching functions can be used to pre-format the 44859 * data to be search on. For example, it can be used to strip HTML 44860 * tags or to de-format telephone numbers for numeric only searching. 44861 * 44862 * Note that is a search is not defined for a column of a given type, 44863 * no search formatting will be performed. 44864 * 44865 * Pre-processing of searching data plug-ins - When you assign the sType 44866 * for a column (or have it automatically detected for you by DataTables 44867 * or a type detection plug-in), you will typically be using this for 44868 * custom sorting, but it can also be used to provide custom searching 44869 * by allowing you to pre-processing the data and returning the data in 44870 * the format that should be searched upon. This is done by adding 44871 * functions this object with a parameter name which matches the sType 44872 * for that target column. This is the corollary of <i>afnSortData</i> 44873 * for searching data. 44874 * 44875 * The functions defined take a single parameter: 44876 * 44877 * 1. `{*}` Data from the column cell to be prepared for searching 44878 *
44879 * Each function is expected to return: 44880 * 44881 * * `{string|null}` Formatted string that will be used for the searching. 44882 * 44883 * @type object 44884 * @default {} 44885 * 44886 * @example 44887 * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) { 44888 * return d.replace(/\n/g," ").replace( /<.*?>/g, "" ); 44889 * } 44890 */ 44891 search: {}, 44892 44893 44894 /** 44895 * Type based ordering. 44896 * 44897 * The column type tells DataTables what ordering to apply to the table 44898 * when a column is sorted upon. The order for each type that is defined, 44899 * is defined by the functions available in this object. 44900 * 44901 * Each ordering option can be described by three properties added to 44902 * this object: 44903 * 44904 * * `{type}-pre` - Pre-formatting function 44905 * * `{type}-asc` - Ascending order function 44906 * * `{type}-desc` - Descending order function 44907 * 44908 * All three can be used together, only `{type}-pre` or only 44909 * `{type}-asc` and `{type}-desc` together. It is generally recommended 44910 * that only `{type}-pre` is used, as this provides the optimal 44911 * implementation in terms of speed, although the others are provided 44912 * for compatibility with existing Javascript sort functions. 44913 * 44914 * `{type}-pre`: Functions defined take a single parameter: 44915 * 44916 * 1. `{*}` Data from the column cell to be prepared for ordering 44917 * 44918 * And return: 44919 * 44920 * * `{*}` Data to be sorted upon 44921 * 44922 * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort 44923 * functions, taking two parameters: 44924 * 44925 * 1. `{*}` Data to compare to the second parameter 44926 * 2. `{*}` Data to compare to the first parameter 44927 * 44928 * And returning: 44929 * 44930 * * `{*}` Ordering match: <0 if first parameter should be sorted lower 44931 * than the second parameter, ===0 if the two parameters are equal and 44932 * >0 if the first parameter should be sorted height than the second 44933 * parameter. 44934 * 44935 * @type object 44936 * @default {} 44937 * 44938 * @example 44939 * // Numeric ordering of formatted numbers with a pre-formatter 44940 * $.extend( $.fn.dataTable.ext.type.order, { 44941 * "string-pre": function(x) { 44942 * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" ); 44943 * return parseFloat( a ); 44944 * } 44945 * } ); 44946 * 44947 * @example 44948 * // Case-sensitive string ordering, with no pre-formatting method 44949 * $.extend( $.fn.dataTable.ext.order, { 44950 * "string-case-asc": function(x,y) { 44951 * return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 44952 * }, 44953 * "string-case-desc": function(x,y) { 44954 * return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 44955 * } 44956 * } ); 44957 */ 44958 order: {} 44959 }, 44960 44961 /** 44962 * Unique DataTables instance counter 44963 * 44964 * @type int 44965 * @private 44966 */ 44967 _unique: 0, 44968 44969 44970 // 44971 // Depreciated 44972 // The following properties are retained for backwards compatiblity only. 44973 // The should not be used in new projects and will be removed in a future 44974 // version 44975 // 44976 44977 /** 44978 * Version check function. 44979 * @type function 44980 * @depreciated Since 1.10 44981 */ 44982 fnVersionCheck: DataTable.fnVersionCheck, 44983 44984 44985 /** 44986 * Index for what 'this' index API functions should use 44987 * @type int 44988 * @deprecated Since v1.10 44989 */ 44990 iApiIndex: 0, 44991 44992 44993 /** 44994 * jQuery UI class container 44995 * @type object 44996 * @deprecated Since v1.10 44997 */ 44998 oJUIClasses: {}, 44999 45000 45001 /** 45002 * Software version 45003 * @type string 45004 * @deprecated Since v1.10 45005 */ 45006 sVersion: DataTable.version 45007 }; 45008 45009 45010 // 45011 // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts 45012 // 45013 $.extend( _ext, { 45014 afnFiltering: _ext.search, 45015 aTypes: _ext.type.detect, 45016 ofnSearch: _ext.type.search, 45017 oSort: _ext.type.order, 45018 afnSortData: _ext.order, 45019 aoFeatures: _ext.feature, 45020 oApi: _ext.internal, 45021 oStdClasses: _ext.classes, 45022 oPagination: _ext.pager 45023 } ); 45024 45025 45026 $.extend( DataTable.ext.classes, { 45027 "sTable": "dataTable", 45028 "sNoFooter": "no-footer", 45029 45030 /* Paging buttons */ 45031 "sPageButton": "paginate_button", 45032 "sPageButtonActive": "current", 45033 "sPageButtonDisabled": "disabled", 45034 45035 /* Striping classes */ 45036 "sStripeOdd": "odd", 45037 "sStripeEven": "even", 45038 45039 /* Empty row */ 45040 "sRowEmpty": "dataTables_empty", 45041 45042 /* Features */ 45043 "sWrapper": "dataTables_wrapper", 45044 "sFilter": "dataTables_filter", 45045 "sInfo": "dataTables_info", 45046 "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */ 45047 "sLength": "dataTables_length", 45048 "sProcessing": "dataTables_processing", 45049 45050 /* Sorting */ 45051 "sSortAsc": "sorting_asc", 45052 "sSortDesc": "sorting_desc", 45053 "sSortable": "sorting", /* Sortable in both directions */ 45054 "sSortableAsc": "sorting_asc_disabled", 45055 "sSortableDesc": "sorting_desc_disabled", 45056 "sSortableNone": "sorting_disabled", 45057 "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */ 45058 45059 /* Filtering */ 45060 "sFilterInput": "", 45061 45062 /* Page length */ 45063 "sLengthSelect": "", 45064 45065 /* Scrolling */ 45066 "sScrollWrapper": "dataTables_scroll", 45067 "sScrollHead": "dataTables_scrollHead", 45068 "sScrollHeadInner": "dataTables_scrollHeadInner", 45069 "sScrollBody": "dataTables_scrollBody", 45070 "sScrollFoot": "dataTables_scrollFoot", 45071 "sScrollFootInner": "dataTables_scrollFootInner", 45072 45073 /* Misc */ 45074 "sHeaderTH": "", 45075 "sFooterTH": "", 45076 45077 // Deprecated 45078 "sSortJUIAsc": "", 45079 "sSortJUIDesc": "", 45080 "sSortJUI": "", 45081 "sSortJUIAscAllowed": "", 45082 "sSortJUIDescAllowed": "", 45083 "sSortJUIWrapper": "", 45084 "sSortIcon": "", 45085 "sJUIHeader": "", 45086 "sJUIFooter": "" 45087 } ); 45088 45089 45090 (function() { 45091 45092 // Reused strings for better compression. Closure compiler appears to have a
45093 // weird edge case where it is trying to expand strings rather than use the 45094 // variable version. This results in about 200 bytes being added, for very 45095 // little preference benefit since it this run on script load only. 45096 var _empty = ''; 45097 _empty = ''; 45098 45099 var _stateDefault = _empty + 'ui-state-default'; 45100 var _sortIcon = _empty + 'css_right ui-icon ui-icon-'; 45101 var _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix'; 45102 45103 $.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, { 45104 /* Full numbers paging buttons */ 45105 "sPageButton": "fg-button ui-button "+_stateDefault, 45106 "sPageButtonActive": "ui-state-disabled", 45107 "sPageButtonDisabled": "ui-state-disabled", 45108 45109 /* Features */ 45110 "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+ 45111 "ui-buttonset-multi paging_", /* Note that the type is postfixed */ 45112 45113 /* Sorting */ 45114 "sSortAsc": _stateDefault+" sorting_asc", 45115 "sSortDesc": _stateDefault+" sorting_desc", 45116 "sSortable": _stateDefault+" sorting", 45117 "sSortableAsc": _stateDefault+" sorting_asc_disabled", 45118 "sSortableDesc": _stateDefault+" sorting_desc_disabled", 45119 "sSortableNone": _stateDefault+" sorting_disabled", 45120 "sSortJUIAsc": _sortIcon+"triangle-1-n", 45121 "sSortJUIDesc": _sortIcon+"triangle-1-s", 45122 "sSortJUI": _sortIcon+"carat-2-n-s", 45123 "sSortJUIAscAllowed": _sortIcon+"carat-1-n", 45124 "sSortJUIDescAllowed": _sortIcon+"carat-1-s", 45125 "sSortJUIWrapper": "DataTables_sort_wrapper", 45126 "sSortIcon": "DataTables_sort_icon", 45127 45128 /* Scrolling */ 45129 "sScrollHead": "dataTables_scrollHead "+_stateDefault, 45130 "sScrollFoot": "dataTables_scrollFoot "+_stateDefault, 45131 45132 /* Misc */ 45133 "sHeaderTH": _stateDefault, 45134 "sFooterTH": _stateDefault, 45135 "sJUIHeader": _headerFooter+" ui-corner-tl ui-corner-tr", 45136 "sJUIFooter": _headerFooter+" ui-corner-bl ui-corner-br" 45137 } ); 45138 45139 }()); 45140 45141 45142 45143 var extPagination = DataTable.ext.pager; 45144 45145 function _numbers ( page, pages ) { 45146 var 45147 numbers = [], 45148 buttons = extPagination.numbers_length, 45149 half = Math.floor( buttons / 2 ), 45150 i = 1; 45151 45152 if ( pages <= buttons ) { 45153 numbers = _range( 0, pages ); 45154 } 45155 else if ( page <= half ) { 45156 numbers = _range( 0, buttons-2 ); 45157 numbers.push( 'ellipsis' ); 45158 numbers.push( pages-1 ); 45159 } 45160 else if ( page >= pages - 1 - half ) { 45161 numbers = _range( pages-(buttons-2), pages ); 45162 numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6 45163 numbers.splice( 0, 0, 0 ); 45164 } 45165 else { 45166 numbers = _range( page-half+2, page+half-1 ); 45167 numbers.push( 'ellipsis' ); 45168 numbers.push( pages-1 ); 45169 numbers.splice( 0, 0, 'ellipsis' ); 45170 numbers.splice( 0, 0, 0 ); 45171 } 45172 45173 numbers.DT_el = 'span'; 45174 return numbers; 45175 } 45176 45177 45178 $.extend( extPagination, { 45179 simple: function ( page, pages ) { 45180 return [ 'previous', 'next' ]; 45181 }, 45182 45183 full: function ( page, pages ) { 45184 return [ 'first', 'previous', 'next', 'last' ]; 45185 }, 45186 45187 numbers: function ( page, pages ) { 45188 return [ _numbers(page, pages) ]; 45189 }, 45190 45191 simple_numbers: function ( page, pages ) { 45192 return [ 'previous', _numbers(page, pages), 'next' ]; 45193 }, 45194 45195 full_numbers: function ( page, pages ) { 45196 return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ]; 45197 }, 45198 45199 // For testing and plug-ins to use 45200 _numbers: _numbers, 45201 45202 // Number of number buttons (including ellipsis) to show. _Must be odd!_ 45203 numbers_length: 7 45204 } ); 45205 45206 45207 $.extend( true, DataTable.ext.renderer, { 45208 pageButton: { 45209 _: function ( settings, host, idx, buttons, page, pages ) { 45210 var classes = settings.oClasses; 45211 var lang = settings.oLanguage.oPaginate; 45212 var btnDisplay, btnClass, counter=0; 45213 45214 var attach = function( container, buttons ) { 45215 var i, ien, node, button; 45216 var clickHandler = function ( e ) { 45217 _fnPageChange( settings, e.data.action, true ); 45218 }; 45219 45220 for ( i=0, ien=buttons.length ; i<ien ; i++ ) { 45221 button = buttons[i]; 45222 45223 if ( $.isArray( button ) ) { 45224 var inner = $( '<'+(button.DT_el || 'div')+'/>' ) 45225 .appendTo( container ); 45226 attach( inner, button ); 45227 } 45228 else { 45229 btnDisplay = null; 45230 btnClass = ''; 45231 45232 switch ( button ) { 45233 case 'ellipsis': 45234 container.append('<span class="ellipsis">…
45234</span>'); 45235 break; 45236 45237 case 'first': 45238 btnDisplay = lang.sFirst; 45239 btnClass = button + (page > 0 ? 45240 '' : ' '+classes.sPageButtonDisabled); 45241 break; 45242 45243 case 'previous': 45244 btnDisplay = lang.sPrevious; 45245 btnClass = button + (page > 0 ? 45246 '' : ' '+classes.sPageButtonDisabled); 45247 break; 45248 45249 case 'next': 45250 btnDisplay = lang.sNext; 45251 btnClass = button + (page < pages-1 ? 45252 '' : ' '+classes.sPageButtonDisabled); 45253 break; 45254 45255 case 'last': 45256 btnDisplay = lang.sLast; 45257 btnClass = button + (page < pages-1 ? 45258 '' : ' '+classes.sPageButtonDisabled); 45259 break; 45260 45261 default: 45262 btnDisplay = button + 1; 45263 btnClass = page === button ? 45264 classes.sPageButtonActive : ''; 45265 break; 45266 } 45267 45268 if ( btnDisplay !== null ) { 45269 node = $('<a>', { 45270 'class': classes.sPageButton+' '+btnClass, 45271 'aria-controls': settings.sTableId, 45272 'data-dt-idx': counter, 45273 'tabindex': settings.iTabIndex, 45274 'id': idx === 0 && typeof button === 'string' ? 45275 settings.sTableId +'_'+ button : 45276 null 45277 } ) 45278 .html( btnDisplay ) 45279 .appendTo( container ); 45280 45281 _fnBindAction( 45282 node, {action: button}, clickHandler 45283 ); 45284 45285 counter++; 45286 } 45287 } 45288 } 45289 }; 45290 45291 // IE9 throws an 'unknown error' if document.activeElement is used 45292 // inside an iframe or frame. Try / catch the error. Not good for 45293 // accessibility, but neither are frames. 45294 var activeEl; 45295 45296 try { 45297 // Because this approach is destroying and recreating the paging 45298 // elements, focus is lost on the select button which is bad for 45299 // accessibility. So we want to restore focus once the draw has 45300 // completed 45301 activeEl = $(host).find(document.activeElement).data('dt-idx'); 45302 } 45303 catch (e) {} 45304 45305 attach( $(host).empty(), buttons ); 45306 45307 if ( activeEl ) { 45308 $(host).find( '[data-dt-idx='+activeEl+']' ).focus(); 45309 } 45310 } 45311 } 45312 } ); 45313 45314 45315 45316 // Built in type detection. See model.ext.aTypes for information about 45317 // what is required from this methods. 45318 $.extend( DataTable.ext.type.detect, [ 45319 // Plain numbers - first since V8 detects some plain numbers as dates 45320 // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...). 45321 function ( d, settings ) 45322 { 45323 var decimal = settings.oLanguage.sDecimal; 45324 return _isNumber( d, decimal ) ? 'num'+decimal : null; 45325 }, 45326 45327 // Dates (only those recognised by the browser's Date.parse) 45328 function ( d, settings ) 45329 { 45330 // V8 will remove any unknown characters at the start and end of the 45331 // expression, leading to false matches such as `$245.12` or `10%` being 45332 // a valid date. See forum thread 18941 for detail. 45333 if ( d && !(d instanceof Date) && ( ! _re_date_start.test(d) || ! _re_date_end.test(d) ) ) { 45334 return null; 45335 } 45336 var parsed = Date.parse(d); 45337 return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null; 45338 }, 45339 45340 // Formatted numbers 45341 function ( d, settings ) 45342 { 45343 var decimal = settings.oLanguage.sDecimal; 45344 return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null; 45345 }, 45346 45347 // HTML numeric 45348 function ( d, settings ) 45349 { 45350 var decimal = settings.oLanguage.sDecimal; 45351 return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null; 45352 }, 45353 45354 // HTML numeric, formatted 45355 function ( d, settings ) 45356 { 45357 var decimal = settings.oLanguage.sDecimal; 45358 return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null; 45359 }, 45360 45361 // HTML (this is strict checking - there must be html) 45362 function ( d, settings ) 45363 { 45364 return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ? 45365 'html' : null; 45366 } 45367 ] ); 45368 45369 45370 45371 // Filter formatting functions. See model.ext.ofnSearch for information about 45372 // what is required from these methods. 45373 // 45374 // Note that additional search methods are added for the html numbers and 45375 // html formatted numbers by `_addNumericSort()` when we know what the decimal 45376 // place is 45377 45378 45379 $.extend( DataTable.ext.type.search, { 45380 html: function ( data ) { 45381 return _empty(data) ? 45382 data : 45383 typeof data === 'string' ? 45384 data 45385 .replace( _re_new_lines, " " ) 45386 .replace( _re_html, "" ) : 45387 ''; 45388 }, 45389 45390 string: function ( data ) { 45391 return _empty(data) ? 45392 data : 45393 typeof data === 'string' ? 45394 data.replace( _re_new_lines, " " ) : 45395 data; 45396 } 45397 } ); 45398 45399 45400 45401 var __numericReplace = function ( d, decimalPlace, re1, re2 ) { 45402 if ( d !== 0 && (!d || d === '-') ) { 45403 return -Infinity; 45404 } 45405 45406 // If a decimal place other than `.` is used, it needs to be given to the 45407 // function so we can detect it and replace with a `.` which is the only 45408 // decimal place Javascript recognises - it is not locale aware. 45409 if ( decimalPlace ) { 45410 d = _numToDecimal( d, decimalPlace ); 45411 } 45412 45413 if ( d.replace ) { 45414 if ( re1 ) { 45415 d = d.replace( re1, '' ); 45416 } 45417 45418 if ( re2 ) { 45419 d = d.replace( re2, '' ); 45420 } 45421 } 45422 45423 return d * 1; 45424 }; 45425 45426 45427 // Add the numeric 'deformatting' functions for sorting and search. This is done 45428 // in a function to provide an easy ability for the language options to add 45429 // additional methods if a non-period decimal place is used. 45430 function _addNumericSort ( decimalPlace ) { 45431 $.each( 45432 { 45433 // Plain numbers 45434 "num": function ( d ) { 45435 return __numericReplace( d, decimalPlace ); 45436 }, 45437 45438 // Formatted numbers 45439 "num-fmt": function ( d ) { 45440 return __numericReplace( d, decimalPlace, _re_formatted_numeric ); 45441 }, 45442 45443 // HTML numeric 45444 "html-num": function ( d ) { 45445 return __numericReplace( d, decimalPlace, _re_html ); 45446 }, 45447 45448 // HTML numeric, formatted 45449 "html-num-fmt": function ( d ) { 45450 return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric ); 45451 } 45452 }, 45453 function ( key, fn ) { 45454 // Add the ordering method 45455 _ext.type.order[ key+decimalPlace+'-pre' ] = fn; 45456 45457 // For HTML types add a search formatter that will strip the HTML 45458 if ( key.match(/^html\-/) ) { 45459 _ext.type.search[ key+decimalPlace ] = _ext.type.search.html; 45460 } 45461 } 45462 ); 45463 } 45464 45465 45466 // Default sort methods 45467 $.extend( _ext.type.order, { 45468 // Dates 45469 "date-pre": function ( d ) { 45470 return Date.parse( d ) || 0; 45471 }, 45472 45473 // html 45474 "html-pre": function ( a ) { 45475 return _empty(a) ? 45476 '' : 45477 a.replace ? 45478 a.replace( /<.*?>/g, "" ).toLowerCase() : 45479 a+''; 45480 }, 45481 45482 // string 45483 "string-pre": function ( a ) { 45484 // This is a little complex, but faster than always calling toString, 45485 // http://jsperf.com/tostring-v-check 45486 return _empty(a) ? 45487 '' : 45488 typeof a === 'string' ? 45489 a.toLowerCase() : 45490 ! a.toString ? 45491 '' : 45492 a.toString(); 45493 }, 45494 45495 // string-asc and -desc are retained only for compatibility with the old 45496 // sort methods 45497 "string-asc": function ( x, y ) { 45498 return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 45499 }, 45500 45501 "string-desc": function ( x, y ) { 45502 return ((x < y) ? 1 : ((x > y) ? -1 : 0)); 45503 } 45504 } ); 45505 45506 45507 // Numeric sorting types - order doesn't matter here 45508 _addNumericSort( '' ); 45509 45510 45511 $.extend( true, DataTable.ext.renderer, { 45512 header: { 45513 _: function ( settings, cell, column, classes ) { 45514 // No additional mark-up required
45515 // Attach a sort listener to update on sort - note that using the 45516 // `DT` namespace will allow the event to be removed automatically 45517 // on destroy, while the `dt` namespaced event is the one we are 45518 // listening for 45519 $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { 45520 if ( settings !== ctx ) { // need to check this this is the host 45521 return; // table, not a nested one 45522 } 45523 45524 var colIdx = column.idx; 45525 45526 cell 45527 .removeClass( 45528 column.sSortingClass +' '+ 45529 classes.sSortAsc +' '+ 45530 classes.sSortDesc 45531 ) 45532 .addClass( columns[ colIdx ] == 'asc' ? 45533 classes.sSortAsc : columns[ colIdx ] == 'desc' ? 45534 classes.sSortDesc : 45535 column.sSortingClass 45536 ); 45537 } ); 45538 }, 45539 45540 jqueryui: function ( settings, cell, column, classes ) { 45541 $('<div/>') 45542 .addClass( classes.sSortJUIWrapper ) 45543 .append( cell.contents() ) 45544 .append( $('<span/>') 45545 .addClass( classes.sSortIcon+' '+column.sSortingClassJUI ) 45546 ) 45547 .appendTo( cell ); 45548 45549 // Attach a sort listener to update on sort 45550 $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) { 45551 if ( settings !== ctx ) { 45552 return; 45553 } 45554 45555 var colIdx = column.idx; 45556 45557 cell 45558 .removeClass( classes.sSortAsc +" "+classes.sSortDesc ) 45559 .addClass( columns[ colIdx ] == 'asc' ? 45560 classes.sSortAsc : columns[ colIdx ] == 'desc' ? 45561 classes.sSortDesc : 45562 column.sSortingClass 45563 ); 45564 45565 cell 45566 .find( 'span.'+classes.sSortIcon ) 45567 .removeClass( 45568 classes.sSortJUIAsc +" "+ 45569 classes.sSortJUIDesc +" "+ 45570 classes.sSortJUI +" "+ 45571 classes.sSortJUIAscAllowed +" "+ 45572 classes.sSortJUIDescAllowed 45573 ) 45574 .addClass( columns[ colIdx ] == 'asc' ? 45575 classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ? 45576 classes.sSortJUIDesc : 45577 column.sSortingClassJUI 45578 ); 45579 } ); 45580 } 45581 } 45582 } ); 45583 45584 /* 45585 * Public helper functions. These aren't used internally by DataTables, or 45586 * called by any of the options passed into DataTables, but they can be used 45587 * externally by developers working with DataTables. They are helper functions 45588 * to make working with DataTables a little bit easier. 45589 */ 45590 45591 /** 45592 * Helpers for `columns.render`. 45593 * 45594 * The options defined here can be used with the `columns.render` initialisation 45595 * option to provide a display renderer. The following functions are defined: 45596 * 45597 * * `number` - Will format numeric data (defined by `columns.data`) for 45598 * display, retaining the original unformatted data for sorting and filtering. 45599 * It takes 5 parameters: 45600 * * `string` - Thousands grouping separator 45601 * * `string` - Decimal point indicator 45602 * * `integer` - Number of decimal points to show 45603 * * `string` (optional) - Prefix. 45604 * * `string` (optional) - Postfix (/suffix). 45605 * 45606 * @example 45607 * // Column definition using the number renderer 45608 * { 45609 * data: "salary", 45610 * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' ) 45611 * } 45612 * 45613 * @namespace 45614 */ 45615 DataTable.render = { 45616 number: function ( thousands, decimal, precision, prefix, postfix ) { 45617 return { 45618 display: function ( d ) { 45619 if ( typeof d !== 'number' && typeof d !== 'string' ) { 45620 return d; 45621 } 45622 45623 var negative = d < 0 ? '-' : ''; 45624 d = Math.abs( parseFloat( d ) ); 45625 45626 var intPart = parseInt( d, 10 ); 45627 var floatPart = precision ? 45628 decimal+(d - intPart).toFixed( precision ).substring( 2 ): 45629 ''; 45630 45631 return negative + (prefix||'') + 45632 intPart.toString().replace( 45633 /\B(?=(\d{3})+(?!\d))/g, thousands 45634 ) + 45635 floatPart + 45636 (postfix||''); 45637 } 45638 }; 45639 } 45640 }; 45641 45642 45643 /* 45644 * This is really a good bit rubbish this method of exposing the internal methods 45645 * publicly... - To be fixed in 2.0 using methods on the prototype 45646 */ 45647 45648 45649 /** 45650 * Create a wrapper function for exporting an internal functions to an external API. 45651 * @param {string} fn API function name 45652 * @returns {function} wrapped function 45653 * @memberof DataTable#internal 45654 */ 45655 function _fnExternApiFunc (fn) 45656 { 45657 return function() { 45658 var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat( 45659 Array.prototype.slice.call(arguments) 45660 ); 45661 return DataTable.ext.internal[fn].apply( this, args ); 45662 }; 45663 } 45664 45665 45666 /** 45667 * Reference to internal functions for use by plug-in developers. Note that 45668 * these methods are references to internal functions and are considered to be 45669 * private. If you use these methods, be aware that they are liable to change 45670 * between versions. 45671 * @namespace 45672 */ 45673 $.extend( DataTable.ext.internal, { 45674 _fnExternApiFunc: _fnExternApiFunc, 45675 _fnBuildAjax: _fnBuildAjax, 45676 _fnAjaxUpdate: _fnAjaxUpdate, 45677 _fnAjaxParameters: _fnAjaxParameters, 45678 _fnAjaxUpdateDraw: _fnAjaxUpdateDraw, 45679 _fnAjaxDataSrc: _fnAjaxDataSrc, 45680 _fnAddColumn: _fnAddColumn, 45681 _fnColumnOptions: _fnColumnOptions, 45682 _fnAdjustColumnSizing: _fnAdjustColumnSizing, 45683 _fnVisibleToColumnIndex: _fnVisibleToColumnIndex, 45684 _fnColumnIndexToVisible: _fnColumnIndexToVisible, 45685 _fnVisbleColumns: _fnVisbleColumns, 45686 _fnGetColumns: _fnGetColumns, 45687 _fnColumnTypes: _fnColumnTypes, 45688 _fnApplyColumnDefs: _fnApplyColumnDefs, 45689 _fnHungarianMap: _fnHungarianMap, 45690 _fnCamelToHungarian: _fnCamelToHungarian, 45691 _fnLanguageCompat: _fnLanguageCompat, 45692 _fnBrowserDetect: _fnBrowserDetect, 45693 _fnAddData: _fnAddData, 45694 _fnAddTr: _fnAddTr, 45695 _fnNodeToDataIndex: _fnNodeToDataIndex, 45696 _fnNodeToColumnIndex: _fnNodeToColumnIndex, 45697 _fnGetCellData: _fnGetCellData, 45698 _fnSetCellData: _fnSetCellData, 45699 _fnSplitObjNotation: _fnSplitObjNotation, 45700 _fnGetObjectDataFn: _fnGetObjectDataFn, 45701 _fnSetObjectDataFn: _fnSetObjectDataFn, 45702 _fnGetDataMaster: _fnGetDataMaster, 45703 _fnClearTable: _fnClearTable, 45704 _fnDeleteIndex: _fnDeleteIndex, 45705 _fnInvalidate: _fnInvalidate, 45706 _fnGetRowElements: _fnGetRowElements, 45707 _fnCreateTr: _fnCreateTr, 45708 _fnBuildHead: _fnBuildHead, 45709 _fnDrawHead: _fnDrawHead, 45710 _fnDraw: _fnDraw, 45711 _fnReDraw: _fnReDraw, 45712 _fnAddOptionsHtml: _fnAddOptionsHtml, 45713 _fnDetectHeader: _fnDetectHeader, 45714 _fnGetUniqueThs: _fnGetUniqueThs, 45715 _fnFeatureHtmlFilter: _fnFeatureHtmlFilter, 45716 _fnFilterComplete: _fnFilterComplete, 45717 _fnFilterCustom: _fnFilterCustom, 45718 _fnFilterColumn: _fnFilterColumn, 45719 _fnFilter: _fnFilter, 45720 _fnFilterCreateSearch: _fnFilterCreateSearch, 45721 _fnEscapeRegex: _fnEscapeRegex, 45722 _fnFilterData: _fnFilterData, 45723 _fnFeatureHtmlInfo: _fnFeatureHtmlInfo, 45724 _fnUpdateInfo: _fnUpdateInfo, 45725 _fnInfoMacros: _fnInfoMacros, 45726 _fnInitialise: _fnInitialise, 45727 _fnInitComplete: _fnInitComplete, 45728 _fnLengthChange: _fnLengthChange, 45729 _fnFeatureHtmlLength: _fnFeatureHtmlLength, 45730 _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate, 45731 _fnPageChange: _fnPageChange, 45732 _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing, 45733 _fnProcessingDisplay: _fnProcessingDisplay, 45734 _fnFeatureHtmlTable: _fnFeatureHtmlTable, 45735 _fnScrollDraw: _fnScrollDraw, 45736 _fnApplyToChildren: _fnApplyToChildren, 45737 _fnCalculateColumnWidths: _fnCalculateColumnWidths, 45738 _fnThrottle: _fnThrottle, 45739 _fnConvertToWidth: _fnConvertToWidth, 45740 _fnGetWidestNode: _fnGetWidestNode, 45741 _fnGetMaxLenString: _fnGetMaxLenString, 45742 _fnStringToCss: _fnStringToCss, 45743 _fnSortFlatten: _fnSortFlatten, 45744 _fnSort: _fnSort, 45745 _fnSortAria: _fnSortAria, 45746 _fnSortListener: _fnSortListener, 45747 _fnSortAttachListener: _fnSortAttachListener, 45748 _fnSortingClasses: _fnSortingClasses, 45749 _fnSortData: _fnSortData, 45750 _fnSaveState: _fnSaveState, 45751 _fnLoadState: _fnLoadState, 45752 _fnSettingsFromNode: _fnSettingsFromNode, 45753 _fnLog: _fnLog, 45754 _fnMap: _fnMap, 45755 _fnBindAction: _fnBindAction, 45756 _fnCallbackReg: _fnCallbackReg, 45757 _fnCallbackFire: _fnCallbackFire, 45758 _fnLengthOverflow: _fnLengthOverflow, 45759 _fnRenderer: _fnRenderer, 45760 _fnDataSource: _fnDataSource, 45761 _fnRowAttributes: _fnRowAttributes, 45762 _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant 45763 // in 1.10, so this dead-end function is 45764 // added to prevent errors 45765 } ); 45766 45767 45768 // jQuery access 45769 $.fn.dataTable = DataTable; 45770 45771 // Legacy aliases 45772 $.fn.dataTableSettings = DataTable.settings; 45773 $.fn.dataTableExt = DataTable.ext; 45774 45775 // With a capital `D` we return a DataTables API instance rather than a 45776 // jQuery object 45777 $.fn.DataTable = function ( opts ) { 45778 return $(this).dataTable( opts ).api(); 45779 }; 45780 45781 // All properties that are available to $.fn.dataTable should also be 45782 // available on $.fn.DataTable 45783 $.each( DataTable, function ( prop, val ) { 45784 $.fn.DataTable[ prop ] = val; 45785 } ); 45786 45787 45788 // Information about events fired by DataTables - for documentation. 45789 /** 45790 * Draw event, fired whenever the table is redrawn on the page, at the same 45791 * point as fnDrawCallback. This may be useful for binding events or 45792 * performing calculations when the table is altered at all. 45793 * @name DataTable#draw.dt 45794 * @event 45795 * @param {event} e jQuery event object 45796 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45797 */ 45798 45799 /** 45800 * Search event, fired when the searching applied to the table (using the 45801 * built-in global search, or column filters) is altered. 45802 * @name DataTable#search.dt 45803 * @event 45804 * @param {event} e jQuery event object 45805 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45806 */ 45807 45808 /** 45809 * Page change event, fired when the paging of the table is altered. 45810 * @name DataTable#page.dt 45811 * @event 45812 * @param {event} e jQuery event object 45813 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45814 */ 45815 45816 /** 45817 * Order event, fired when the ordering applied to the table is altered. 45818 * @name DataTable#order.dt 45819 * @event 45820 * @param {event} e jQuery event object 45821 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45822 */ 45823 45824 /** 45825 * DataTables initialisation complete event, fired when the table is fully 45826 * drawn, including Ajax data loaded, if Ajax data is required. 45827 * @name DataTable#init.dt 45828 * @event 45829 * @param {event} e jQuery event object 45830 * @param {object} oSettings DataTables settings object 45831 * @param {object} json The JSON object request from the server - only 45832 * present if client-side Ajax sourced data is used</li></ol> 45833 */ 45834 45835 /** 45836 * State save event, fired when the table has changed state a new state save 45837 * is required. This event allows modification of the state saving object 45838 * prior to actually doing the save, including addition or other state 45839 * properties (for plug-ins) or modification of a DataTables core property. 45840 * @name DataTable#stateSaveParams.dt 45841 * @event 45842 * @param {event} e jQuery event object 45843 * @param {object} oSettings DataTables settings object 45844 * @param {object} json The state information to be saved 45845 */ 45846 45847 /** 45848 * State load event, fired when the table is loading state from the stored 45849 * data, but prior to the settings object being modified by the saved state 45850 * - allowing modification of the saved state is required or loading of 45851 * state for a plug-in. 45852 * @name DataTable#stateLoadParams.dt 45853 * @event 45854 * @param {event} e jQuery event object 45855 * @param {object} oSettings DataTables settings object 45856 * @param {object} json The saved state information 45857 */ 45858 45859 /** 45860 * State loaded event, fired when state has been loaded from stored data and 45861 * the settings object has been modified by the loaded data. 45862 * @name DataTable#stateLoaded.dt 45863 * @event 45864 * @param {event} e jQuery event object 45865 * @param {object} oSettings DataTables settings object 45866 * @param {object} json The saved state information 45867 */ 45868 45869 /** 45870 * Processing event, fired when DataTables is doing some kind of processing 45871 * (be it, order, searcg or anything else). It can be used to indicate to 45872 * the end user that there is something happening, or that something has 45873 * finished. 45874 * @name DataTable#processing.dt 45875 * @event 45876 * @param {event} e jQuery event object 45877 * @param {object} oSettings DataTables settings object 45878 * @param {boolean} bShow Flag for if DataTables is doing processing or not 45879 */ 45880 45881 /** 45882 * Ajax (XHR) event, fired whenever an Ajax request is completed from a 45883 * request to made to the server for new data. This event is called before 45884 * DataTables processed the returned data, so it can also be used to pre- 45885 * process the data returned from the server, if needed. 45886 *
45887 * Note that this trigger is called in `fnServerData`, if you override 45888 * `fnServerData` and which to use this event, you need to trigger it in you 45889 * success function. 45890 * @name DataTable#xhr.dt 45891 * @event 45892 * @param {event} e jQuery event object 45893 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45894 * @param {object} json JSON returned from the server 45895 * 45896 * @example 45897 * // Use a custom property returned from the server in another DOM element 45898 * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { 45899 * $('#status').html( json.status ); 45900 * } ); 45901 * 45902 * @example 45903 * // Pre-process the data returned from the server 45904 * $('#table').dataTable().on('xhr.dt', function (e, settings, json) { 45905 * for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) { 45906 * json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two; 45907 * } 45908 * // Note no return - manipulate the data directly in the JSON object. 45909 * } ); 45910 */ 45911 45912 /** 45913 * Destroy event, fired when the DataTable is destroyed by calling fnDestroy 45914 * or passing the bDestroy:true parameter in the initialisation object. This 45915 * can be used to remove bound events, added DOM nodes, etc. 45916 * @name DataTable#destroy.dt 45917 * @event 45918 * @param {event} e jQuery event object 45919 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45920 */ 45921 45922 /** 45923 * Page length change event, fired when number of records to show on each 45924 * page (the length) is changed. 45925 * @name DataTable#length.dt 45926 * @event 45927 * @param {event} e jQuery event object 45928 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45929 * @param {integer} len New length 45930 */ 45931 45932 /** 45933 * Column sizing has changed. 45934 * @name DataTable#column-sizing.dt 45935 * @event 45936 * @param {event} e jQuery event object 45937 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45938 */ 45939 45940 /** 45941 * Column visibility has changed. 45942 * @name DataTable#column-visibility.dt 45943 * @event 45944 * @param {event} e jQuery event object 45945 * @param {object} o DataTables settings object {@link DataTable.models.oSettings} 45946 * @param {int} column Column index 45947 * @param {bool} vis `false` if column now hidden, or `true` if visible 45948 */ 45949 45950 return $.fn.dataTable; 45951})); 45952 45953}(window, document)); 45954 45955 45956/* 45957custom changes: 459581) used original $.fn.dataTable for FixedColumns function (91, 92) and then restored the behavior (320), since our customization in datatable.ext.js breaks this code 45959*/ 45960 45961/*! FixedColumns 3.3.3 45962 * �2010-2021 SpryMedia Ltd - datatables.net/license 45963 */ 45964 45965/** 45966 * @summary FixedColumns 45967 * @description Freeze columns in place on a scrolling DataTable 45968 * @version 3.3.3 45969 * @file dataTables.fixedColumns.js 45970 * @author SpryMedia Ltd (www.sprymedia.co.uk) 45971 * @contact www.sprymedia.co.uk/contact 45972 * @copyright Copyright 2010-2021 SpryMedia Ltd. 45973 * 45974 * This source file is free software, available under the following license: 45975 * MIT license - http://datatables.net/license/mit 45976 * 45977 * This source file is distributed in the hope that it will be useful, but 45978 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 45979 * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. 45980 * 45981 * For details please refer to: http://www.datatables.net 45982 */ 45983(function( factory ){ 45984 if ( typeof define === 'function' && define.amd ) { 45985 // AMD 45986 define( ['jquery', 'datatables.net'], function ( $ ) { 45987 return factory( $, window, document ); 45988 } ); 45989 } 45990 else if ( typeof exports === 'object' ) { 45991 // CommonJS 45992 module.exports = function (root, $) { 45993 if ( ! root ) { 45994 root = window; 45995 } 45996 45997 if ( ! $ || ! $.fn.dataTable ) { 45998 $ = require('datatables.net')(root, $).$; 45999 } 46000 46001 return factory( $, root, root.document ); 46002 }; 46003 } 46004 else { 46005 // Browser 46006 factory( jQuery, window, document ); 46007 } 46008}(function( $, window, document, undefined ) { 46009'use strict'; 46010var DataTable = $.fn.dataTable; 46011var _firefoxScroll; 46012 46013/** 46014 * When making use of DataTables' x-axis scrolling feature, you may wish to 46015 * fix the left most column in place. This plug-in for DataTables provides 46016 * exactly this option (note for non-scrolling tables, please use the 46017 * FixedHeader plug-in, which can fix headers and footers). Key 46018 * features include: 46019 * 46020 * * Freezes the left or right most columns to the side of the table
46021 * * Option to freeze two or more columns 46022 * * Full integration with DataTables' scrolling options 46023 * * Speed - FixedColumns is fast in its operation 46024 * 46025 * @class 46026 * @constructor 46027 * @global 46028 * @param {object} dt DataTables instance. With DataTables 1.10 this can also 46029 * be a jQuery collection, a jQuery selector, DataTables API instance or 46030 * settings object. 46031 * @param {object} [init={}] Configuration object for FixedColumns. Options are 46032 * defined by {@link FixedColumns.defaults} 46033 * 46034 * @requires jQuery 1.7+ 46035 * @requires DataTables 1.8.0+ 46036 * 46037 * @example 46038 * var table = $('#example').dataTable( { 46039 * "scrollX": "100%" 46040 * } ); 46041 * new $.fn.dataTable.fixedColumns( table ); 46042 */ 46043var FixedColumns = function ( dt, init ) { 46044 var that = this; 46045 46046 var dataTableExt = $.fn.dataTable; 46047 $.fn.dataTable = DataTable; 46048 46049 /* Sanity check - you just know it will happen */ 46050 if ( ! ( this instanceof FixedColumns ) ) { 46051 alert( "FixedColumns warning: FixedColumns must be initialised with the 'new' keyword." ); 46052 return; 46053 } 46054 46055 if ( init === undefined || init === true ) { 46056 init = {}; 46057 } 46058 46059 // Use the DataTables Hungarian notation mapping method, if it exists to 46060 // provide forwards compatibility for camel case variables 46061 var camelToHungarian = $.fn.dataTable.camelToHungarian; 46062 if ( camelToHungarian ) { 46063 camelToHungarian( FixedColumns.defaults, FixedColumns.defaults, true ); 46064 camelToHungarian( FixedColumns.defaults, init ); 46065 } 46066 46067 // v1.10 allows the settings object to be got form a number of sources 46068 var dtSettings = new $.fn.dataTable.Api( dt ).settings()[0]; 46069 46070 /** 46071 * Settings object which contains customisable information for FixedColumns instance 46072 * @namespace 46073 * @extends FixedColumns.defaults 46074 * @private 46075 */ 46076 this.s = { 46077 /** 46078 * DataTables settings objects 46079 * @type object 46080 * @default Obtained from DataTables instance 46081 */ 46082 "dt": dtSettings, 46083 46084 /** 46085 * Number of columns in the DataTable - stored for quick access 46086 * @type int 46087 * @default Obtained from DataTables instance 46088 */ 46089 "iTableColumns": dtSettings.aoColumns.length, 46090 46091 /** 46092 * Original outer widths of the columns as rendered by DataTables - used to calculate 46093 * the FixedColumns grid bounding box 46094 * @type array.<int> 46095 * @default [] 46096 */ 46097 "aiOuterWidths": [], 46098 46099 /** 46100 * Original inner widths of the columns as rendered by DataTables - used to apply widths 46101 * to the columns 46102 * @type array.<int> 46103 * @default [] 46104 */ 46105 "aiInnerWidths": [], 46106 46107 46108 /** 46109 * Is the document layout right-to-left 46110 * @type boolean 46111 */ 46112 rtl: $(dtSettings.nTable).css('direction') === 'rtl' 46113 }; 46114 46115 46116 /** 46117 * DOM elements used by the class instance 46118 * @namespace 46119 * @private 46120 * 46121 */ 46122 this.dom = { 46123 /** 46124 * DataTables scrolling element 46125 * @type node 46126 * @default null 46127 */ 46128 "scroller": null, 46129 46130 /** 46131 * DataTables header table 46132 * @type node 46133 * @default null 46134 */ 46135 "header": null, 46136 46137 /** 46138 * DataTables body table 46139 * @type node 46140 * @default null 46141 */ 46142 "body": null, 46143 46144 /** 46145 * DataTables footer table 46146 * @type node 46147 * @default null 46148 */ 46149 "footer": null, 46150 46151 /** 46152 * Display grid elements 46153 * @namespace 46154 */ 46155 "grid": { 46156 /** 46157 * Grid wrapper. This is the container element for the 3x3 grid 46158 * @type node 46159 * @default null 46160 */ 46161 "wrapper": null, 46162 46163 /** 46164 * DataTables scrolling element. This element is the DataTables 46165 * component in the display grid (making up the main table - i.e. 46166 * not the fixed columns). 46167 * @type node 46168 * @default null 46169 */ 46170 "dt": null, 46171 46172 /** 46173 * Left fixed column grid components 46174 * @namespace 46175 */ 46176 "left": { 46177 "wrapper": null, 46178 "head": null, 46179 "body": null, 46180 "foot": null 46181 }, 46182 46183 /** 46184 * Right fixed column grid components 46185 * @namespace 46186 */ 46187 "right": { 46188 "wrapper": null, 46189 "head": null, 46190 "body": null, 46191 "foot": null 46192 } 46193 }, 46194 46195 /** 46196 * Cloned table nodes 46197 * @namespace 46198 */ 46199 "clone": { 46200 /** 46201 * Left column cloned table nodes 46202 * @namespace 46203 */ 46204 "left": { 46205 /** 46206 * Cloned header table 46207 * @type node 46208 * @default null 46209 */ 46210 "header": null, 46211 46212 /** 46213 * Cloned body table 46214 * @type node 46215 * @default null 46216 */ 46217 "body": null, 46218 46219 /** 46220 * Cloned footer table 46221 * @type node 46222 * @default null 46223 */ 46224 "footer": null 46225 }, 46226 46227 /** 46228 * Right column cloned table nodes 46229 * @namespace 46230 */ 46231 "right": { 46232 /** 46233 * Cloned header table 46234 * @type node 46235 * @default null 46236 */ 46237 "header": null, 46238 46239 /** 46240 * Cloned body table 46241 * @type node 46242 * @default null 46243 */ 46244 "body": null, 46245 46246 /** 46247 * Cloned footer table 46248 * @type node 46249 * @default null 46250 */ 46251 "footer": null 46252 } 46253 } 46254 }; 46255 46256 if ( dtSettings._oFixedColumns ) { 46257 throw 'FixedColumns already initialised on this table'; 46258 } 46259 46260 /* Attach the instance to the DataTables instance so it can be accessed easily */ 46261 dtSettings._oFixedColumns = this; 46262 46263 /* Let's do it */ 46264 if ( ! dtSettings._bInitComplete ) 46265 { 46266 dtSettings.oApi._fnCallbackReg( dtSettings, 'aoInitComplete', function () { 46267 that._fnConstruct( init ); 46268 }, 'FixedColumns' ); 46269 } 46270 else 46271 { 46272 this._fnConstruct( init ); 46273 } 46274 46275 $.fn.dataTable = dataTableExt; 46276}; 46277 46278 46279 46280$.extend( FixedColumns.prototype , { 46281 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 46282 * Public methods 46283 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 46284 46285 /** 46286 * Update the fixed columns - including headers and footers. Note that FixedColumns will 46287 * automatically update the display whenever the host DataTable redraws. 46288 * @returns {void} 46289 * @example 46290 * var table = $('#example').dataTable( { 46291 * "scrollX": "100%" 46292 * } ); 46293 * var fc = new $.fn.dataTable.fixedColumns( table ); 46294 * 46295 * // at some later point when the table has been manipulated.... 46296 * fc.fnUpdate(); 46297 */ 46298 "fnUpdate": function () 46299 { 46300 this._fnDraw( true ); 46301 }, 46302 46303 46304 /** 46305 * Recalculate the resizes of the 3x3 grid that FixedColumns uses for display of the table. 46306 * This is useful if you update the width of the table container. Note that FixedColumns will 46307 * perform this function automatically when the window.resize event is fired. 46308 * @returns {void} 46309 * @example 46310 * var table = $('#example').dataTable( { 46311 * "scrollX": "100%" 46312 * } ); 46313 * var fc = new $.fn.dataTable.fixedColumns( table ); 46314 * 46315 * // Resize the table container and then have FixedColumns adjust its layout.... 46316 * $('#content').width( 1200 ); 46317 * fc.fnRedrawLayout(); 46318 */ 46319 "fnRedrawLayout": function () 46320 { 46321 this._fnColCalc(); 46322 this._fnGridLayout(); 46323 this.fnUpdate(); 46324 }, 46325 46326 46327 /** 46328 * Mark a row such that it's height should be recalculated when using 'semiauto' row 46329 * height matching. This function will have no effect when 'none' or 'auto' row height 46330 * matching is used. 46331 * @param {Node} nTr TR element that should have it's height recalculated 46332 * @returns {void} 46333 * @example 46334 * var table = $('#example').dataTable( { 46335 * "scrollX": "100%" 46336 * } ); 46337 * var fc = new $.fn.dataTable.fixedColumns( table ); 46338 * 46339 * // manipulate the table - mark the row as needing an update then update the table 46340 * // this allows the redraw performed by DataTables fnUpdate to re
46340calculate the row 46341 * // height 46342 * fc.fnRecalculateHeight(); 46343 * table.fnUpdate( $('#example tbody tr:eq(0)')[0], ["insert date", 1, 2, 3 ... ]); 46344 */ 46345 "fnRecalculateHeight": function ( nTr ) 46346 { 46347 delete nTr._DTTC_iHeight; 46348 nTr.style.height = 'auto'; 46349 }, 46350 46351 46352 /** 46353 * Set the height of a given row - provides cross browser compatibility 46354 * @param {Node} nTarget TR element that should have it's height recalculated 46355 * @param {int} iHeight Height in pixels to set 46356 * @returns {void} 46357 * @example 46358 * var table = $('#example').dataTable( { 46359 * "scrollX": "100%" 46360 * } ); 46361 * var fc = new $.fn.dataTable.fixedColumns( table ); 46362 * 46363 * // You may want to do this after manipulating a row in the fixed column 46364 * fc.fnSetRowHeight( $('#example tbody tr:eq(0)')[0], 50 ); 46365 */ 46366 "fnSetRowHeight": function ( nTarget, iHeight ) 46367 { 46368 nTarget.style.height = iHeight+"px"; 46369 }, 46370 46371 46372 /** 46373 * Get data index information about a row or cell in the table body. 46374 * This function is functionally identical to fnGetPosition in DataTables, 46375 * taking the same parameter (TH, TD or TR node) and returning exactly the 46376 * the same information (data index information). THe difference between 46377 * the two is that this method takes into account the fixed columns in the 46378 * table, so you can pass in nodes from the master table, or the cloned 46379 * tables and get the index position for the data in the main table. 46380 * @param {node} node TR, TH or TD element to get the information about 46381 * @returns {int} If nNode is given as a TR, then a single index is 46382 * returned, or if given as a cell, an array of [row index, column index 46383 * (visible), column index (all)] is given. 46384 */ 46385 "fnGetPosition": function ( node ) 46386 { 46387 var idx; 46388 var inst = this.s.dt.oInstance; 46389 46390 if ( ! $(node).parents('.DTFC_Cloned').length ) 46391 { 46392 // Not in a cloned table 46393 return inst.fnGetPosition( node ); 46394 } 46395 else 46396 { 46397 // Its in the cloned table, so need to look up position 46398 if ( node.nodeName.toLowerCase() === 'tr' ) { 46399 idx = $(node).index(); 46400 return inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] ); 46401 } 46402 else 46403 { 46404 var colIdx = $(node).index(); 46405 idx = $(node.parentNode).index(); 46406 var row = inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] ); 46407 46408 return [ 46409 row, 46410 colIdx, 46411 inst.oApi._fnVisibleToColumnIndex( this.s.dt, colIdx ) 46412 ]; 46413 } 46414 } 46415 }, 46416 46417 fnToFixedNode: function ( rowIdx, colIdx ) 46418 { 46419 var found; 46420 46421 if ( colIdx < this.s.iLeftColumns ) { 46422 found = $(this.dom.clone.left.body).find('[data-dt-row='+rowIdx+'][data-dt-column='+colIdx+']'); 46423 } 46424 else if ( colIdx >= this.s.iRightColumns ) { 46425 found = $(this.dom.clone.right.body).find('[data-dt-row='+rowIdx+'][data-dt-column='+colIdx+']'); 46426 } 46427 46428 if ( found && found.length ) { 46429 return found[0]; 46430 } 46431 46432 // Fallback - non-fixed node 46433 var table = new $.fn.dataTable.Api(this.s.dt); 46434 return table.cell(rowIdx, colIdx).node(); 46435 }, 46436 46437 46438 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 46439 * Private methods (they are of course public in JS, but recommended as private) 46440 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 46441 46442 /** 46443 * Initialisation for FixedColumns 46444 * @param {Object} oInit User settings for initialisation 46445 * @returns {void} 46446 * @private 46447 */ 46448 "_fnConstruct": function ( oInit ) 46449 { 46450 var i, iLen, iWidth, 46451 that = this; 46452 46453 /* Sanity checking */ 46454 if ( typeof this.s.dt.oInstance.fnVersionCheck != 'function' || 46455 this.s.dt.oInstance.fnVersionCheck( '1.8.0' ) !== true ) 46456 { 46457 alert( "FixedColumns "+FixedColumns.VERSION+" required DataTables 1.8.0 or later. "+ 46458 "Please upgrade your DataTables installation" ); 46459 return; 46460 } 46461 46462 if ( this.s.dt.oScroll.sX === "" ) 46463 { 46464 this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "FixedColumns is not needed (no "+ 46465 "x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for "+ 46466 "column fixing when scrolling is not enabled" ); 46467 return; 46468 } 46469 46470 /* Apply the settings from the user / defaults */ 46471 this.s = $.extend( true, this.s, FixedColumns.defaults, oInit ); 46472 46473 /* Set up the DOM as we need it and cache nodes */
46474 var classes = this.s.dt.oClasses; 46475 this.dom.grid.dt = $(this.s.dt.nTable).parents('div.'+classes.sScrollWrapper)[0]; 46476 this.dom.scroller = $('div.'+classes.sScrollBody, this.dom.grid.dt )[0]; 46477 46478 /* Set up the DOM that we want for the fixed column layout grid */ 46479 this._fnColCalc(); 46480 this._fnGridSetup(); 46481 46482 /* Event handlers */ 46483 var mouseController; 46484 var mouseDown = false; 46485 46486 // When the mouse is down (drag scroll) the mouse controller cannot 46487 // change, as the browser keeps the original element as the scrolling one 46488 $(this.s.dt.nTableWrapper).on( 'mousedown.DTFC', function (e) { 46489 if ( e.button === 0 ) { 46490 mouseDown = true; 46491 46492 $(document).one( 'mouseup', function () { 46493 mouseDown = false; 46494 } ); 46495 } 46496 } ); 46497 46498 // When the body is scrolled - scroll the left and right columns 46499 $(this.dom.scroller) 46500 .on( 'mouseover.DTFC touchstart.DTFC', function () { 46501 if ( ! mouseDown ) { 46502 mouseController = 'main'; 46503 } 46504 } ) 46505 .on( 'scroll.DTFC', function (e) { 46506 if ( ! mouseController && e.originalEvent ) { 46507 mouseController = 'main'; 46508 } 46509 46510 if ( mouseController === 'main' || mouseController === 'key' ) { 46511 if ( that.s.iLeftColumns > 0 ) { 46512 that.dom.grid.left.liner.scrollTop = that.dom.scroller.scrollTop; 46513 } 46514 if ( that.s.iRightColumns > 0 ) { 46515 that.dom.grid.right.liner.scrollTop = that.dom.scroller.scrollTop; 46516 } 46517 } 46518 } ); 46519 46520 var wheelType = 'onwheel' in document.createElement('div') ? 46521 'wheel.DTFC' : 46522 'mousewheel.DTFC'; 46523 46524 if ( that.s.iLeftColumns > 0 ) { 46525 // When scrolling the left column, scroll the body and right column 46526 $(that.dom.grid.left.liner) 46527 .on( 'mouseover.DTFC touchstart.DTFC', function () { 46528 if ( ! mouseDown && mouseController !== 'key' ) { 46529 mouseController = 'left'; 46530 } 46531 } ) 46532 .on( 'scroll.DTFC', function ( e ) { 46533 if ( ! mouseController && e.originalEvent ) { 46534 mouseController = 'left'; 46535 } 46536 46537 if ( mouseController === 'left' ) { 46538 that.dom.scroller.scrollTop = that.dom.grid.left.liner.scrollTop; 46539 if ( that.s.iRightColumns > 0 ) { 46540 that.dom.grid.right.liner.scrollTop = that.dom.grid.left.liner.scrollTop; 46541 } 46542 } 46543 } ) 46544 .on( wheelType, function(e) { 46545 mouseController = 'left'; 46546 46547 // Pass horizontal scrolling through 46548 var xDelta = e.type === 'wheel' ? 46549 -e.originalEvent.deltaX : 46550 e.originalEvent.wheelDeltaX; 46551 that.dom.scroller.scrollLeft -= xDelta; 46552 } ); 46553 46554 // Header will not trigger scroll on left column, but might on `main` (sorting) 46555 $(that.dom.grid.left.head).on( 'mouseover.DTFC touchstart.DTFC', function () { 46556 mouseController = 'main'; 46557 }); 46558 } 46559 46560 if ( that.s.iRightColumns > 0 ) { 46561 // When scrolling the right column, scroll the body and the left column 46562 $(that.dom.grid.right.liner) 46563 .on( 'mouseover.DTFC touchstart.DTFC', function () { 46564 if ( ! mouseDown && mouseController !== 'key' ) { 46565 mouseController = 'right'; 46566 } 46567 } ) 46568 .on( 'scroll.DTFC', function ( e ) { 46569 if ( ! mouseController && e.originalEvent ) { 46570 mouseController = 'right'; 46571 } 46572 46573 if ( mouseController === 'right' ) { 46574 that.dom.scroller.scrollTop = that.dom.grid.right.liner.scrollTop; 46575 if ( that.s.iLeftColumns > 0 ) { 46576 that.dom.grid.left.liner.scrollTop = that.dom.grid.right.liner.scrollTop; 46577 } 46578 } 46579 } ) 46580 .on( wheelType, function(e) { 46581 mouseController = 'right'; 46582 46583 // Pass horizontal scrolling through 46584 var xDelta = e.type === 'wheel' ? 46585 -e.originalEvent.deltaX : 46586 e.originalEvent.wheelDeltaX; 46587 that.dom.scroller.scrollLeft -= xDelta; 46588 } ); 46589 46590 $(that.dom.grid.right.head).on( 'mouseover.DTFC touchstart.DTFC', function () { 46591 mouseController = 'main'; 46592 }); 46593 } 46594 46595 $(window).on( 'resize.DTFC', function () { 46596 that._fnGridLayout.call( that ); 46597 } ); 46598 46599 var bFirstDraw = true; 46600 var jqTable = $(this.s.dt.nTable); 46601 46602 jqTable 46603 .on( 'draw.dt.DTFC', function () { 46604 that._fnColCalc(); 46605 that._fnDraw.call( that, bFirstDraw ); 46606 bFirstDraw = false; 46607 } ) 46608 .on('key-focus.dt.DTFC', function () { 46609 // KeyTable navigation needs to be main focused 46610 mouseController = 'key'; 46611 }) 46612 .on( 'column-sizing.dt.DTFC', function () { 46613 that._fnColCalc(); 46614 that._fnGridLayout( that ); 46615 } ) 46616 .on( 'column-visibility.dt.DTFC', function ( e, settings, column, vis, recalc ) { 46617 if ( recalc === undefined || recalc ) { 46618 that._fnColCalc(); 46619 that._fnGridLayout( that ); 46620 that._fnDraw( true ); 46621 } 46622 } ) 46623 .on( 'select.dt.DTFC deselect.dt.DTFC', function ( e, dt, type, indexes ) { 46624 if ( e.namespace === 'dt' ) { 46625 that._fnDraw( false ); 46626 } 46627 } ) 46628 .on( 'position.dts.dt.DTFC', function (e, tableTop) { 46629 // Sync up with Scroller 46630 if (that.dom.grid.left.body) { 46631 $(that.dom.grid.left.body).find('table').eq(0).css('top', tableTop); 46632 } 46633 46634 if (that.dom.grid.right.body) { 46635 $(that.dom.grid.right.body).find('table').eq(0).css('top', tableTop); 46636 } 46637 } ) 46638 .on( 'destroy.dt.DTFC', function () { 46639 jqTable.off( '.DTFC' ); 46640 46641 $(that.dom.scroller).off( '.DTFC' ); 46642 $(window).off( '.DTFC' ); 46643 $(that.s.dt.nTableWrapper).off( '.DTFC' ); 46644 46645 $(that.dom.grid.left.liner).off( '.DTFC '+wheelType ); 46646 $(that.dom.grid.left.wrapper).remove(); 46647 46648 $(that.dom.grid.right.liner).off( '.DTFC '+wheelType ); 46649 $(that.dom.grid.right.wrapper).remove(); 46650 } ); 46651 46652 /* Get things right to start with - note that due to adjusting the columns, there must be 46653 * another redraw of the main table. It doesn't need to be a full redraw however. 46654 */ 46655 this._fnGridLayout(); 46656 this.s.dt.oInstance.fnDraw(false); 46657 }, 46658 46659 46660 /** 46661 * Calculate the column widths for the grid layout 46662 * @returns {void} 46663 * @private 46664 */ 46665 "_fnColCalc": function () 46666 { 46667 var that = this; 46668 var iLeftWidth = 0; 46669 var iRightWidth = 0; 46670 46671 this.s.aiInnerWidths = []; 46672 this.s.aiOuterWidths = []; 46673 46674 $.each( this.s.dt.aoColumns, function (i, col) { 46675 var th = $(col.nTh); 46676 var border; 46677 46678 if ( ! th.filter(':visible').length ) { 46679 that.s.aiInnerWidths.push( 0 ); 46680 that.s.aiOuterWidths.push( 0 ); 46681 } 46682 else 46683 {
46684 // Inner width is used to assign widths to cells 46685 // Outer width is used to calculate the container 46686 var iWidth = th.outerWidth(); 46687 46688 // When working with the left most-cell, need to add on the 46689 // table's border to the outerWidth, since we need to take 46690 // account of it, but it isn't in any cell 46691 if ( that.s.aiOuterWidths.length === 0 ) { 46692 border = $(that.s.dt.nTable).css('border-left-width'); 46693 iWidth += typeof border === 'string' && border.indexOf('px') === -1 ? 46694 1 : 46695 parseInt( border, 10 ); 46696 } 46697 46698 // Likewise with the final column on the right 46699 if ( that.s.aiOuterWidths.length === that.s.dt.aoColumns.length-1 ) { 46700 border = $(that.s.dt.nTable).css('border-right-width'); 46701 iWidth += typeof border === 'string' && border.indexOf('px') === -1 ? 46702 1 : 46703 parseInt( border, 10 ); 46704 } 46705 46706 that.s.aiOuterWidths.push( iWidth ); 46707 that.s.aiInnerWidths.push( th.width() ); 46708 46709 if ( i < that.s.iLeftColumns ) 46710 { 46711 iLeftWidth += iWidth; 46712 } 46713 46714 if ( that.s.iTableColumns-that.s.iRightColumns <= i ) 46715 { 46716 iRightWidth += iWidth; 46717 } 46718 } 46719 } ); 46720 46721 this.s.iLeftWidth = iLeftWidth; 46722 this.s.iRightWidth = iRightWidth; 46723 }, 46724 46725 46726 /** 46727 * Set up the DOM for the fixed column. The way the layout works is to create a 1x3 grid 46728 * for the left column, the DataTable (for which we just reuse the scrolling element DataTable 46729 * puts into the DOM) and the right column. In each of he two fixed column elements there is a 46730 * grouping wrapper element and then a head, body and footer wrapper. In each of these we then 46731 * place the cloned header, body or footer tables. This effectively gives as 3x3 grid structure. 46732 * @returns {void} 46733 * @private 46734 */ 46735 "_fnGridSetup": function () 46736 { 46737 var that = this; 46738 var oOverflow = this._fnDTOverflow(); 46739 var block; 46740 46741 this.dom.body = this.s.dt.nTable; 46742 this.dom.header = this.s.dt.nTHead.parentNode; 46743 this.dom.header.parentNode.parentNode.style.position = "relative"; 46744 46745 var nSWrapper = 46746 $('<div class="DTFC_ScrollWrapper" style="position:relative; clear:both;">'+ 46747 '<div class="DTFC_LeftWrapper" style="position:absolute; top:0; left:0;" aria-hidden="true">'+ 46748 '<div class="DTFC_LeftHeadWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+ 46749 '<div class="DTFC_LeftBodyWrapper" style="position:relative; top:0; left:0; height:0; overflow:hidden;">'+ 46750 '<div class="DTFC_LeftBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+ 46751 '</div>'+ 46752 '<div class="DTFC_LeftFootWrapper" style="position:relative; top:0; left:0; overflow:hidden;"></div>'+ 46753 '</div>'+ 46754 '<div class="DTFC_RightWrapper" style="position:absolute; top:0; right:0;" aria-hidden="true">'+ 46755 '<div class="DTFC_RightHeadWrapper" style="position:relative; top:0; left:0;">'+ 46756 '<div class="DTFC_RightHeadBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+ 46757 '</div>'+ 46758 '<div class="DTFC_RightBodyWrapper" style="position:relative; top:0; left:0; height:0; overflow:hidden;">'+ 46759 '<div class="DTFC_RightBodyLiner" style="position:relative; top:0; left:0; overflow-y:scroll;"></div>'+ 46760 '</div>'+ 46761 '<div class="DTFC_RightFootWrapper" style="position:relative; top:0; left:0;">'+ 46762 '<div class="DTFC_RightFootBlocker DTFC_Blocker" style="position:absolute; top:0; bottom:0;"></div>'+ 46763 '</div>'+ 46764 '</div>'+ 46765 '</div>')[0]; 46766 var nLeft = nSWrapper.childNodes[0]; 46767 var nRight = nSWrapper.childNodes[1]; 46768 46769 this.dom.grid.dt.parentNode.insertBefore( nSWrapper, this.dom.grid.dt ); 46770 nSWrapper.appendChild( this.dom.grid.dt ); 46771 46772 this.dom.grid.wrapper = nSWrapper; 46773 46774 if ( this.s.iLeftColumns > 0 ) 46775 { 46776 this.dom.grid.left.wrapper = nLeft; 46777 this.dom.grid.left.head = nLeft.childNodes[0]; 46778 this.dom.grid.left.body = nLeft.childNodes[1]; 46779 this.dom.grid.left.liner = $('div.DTFC_LeftBodyLiner', nSWrapper)[0]; 46780 46781 nSWrapper.appendChild( nLeft ); 46782 } 46783 46784 if ( this.s.iRightColumns > 0 ) 46785 { 46786 this.dom.grid.right.wrapper = nRight; 46787 this.dom.grid.right.head = nRight.childNodes[0]; 46788 this.dom.grid.right.body = nRight.childNodes[1]; 46789 this.dom.grid.right.liner = $('div.DTFC_RightBodyLiner', nSWrapper)[0]; 46790 46791 nRight.style.right = oOverflow.bar+"px"; 46792 46793 block = $('div.DTFC_RightHeadBlocker', nSWrapper)[0]; 46794 block.style.width = oOverflow.bar+"px"; 46795 block.style.right = -oOverflow.bar+"px"; 46796 this.dom.grid.right.headBlock = block; 46797 46798 block = $('div.DTFC_RightFootBlocker', nSWrapper)[0]; 46799 block.style.width = oOverflow.bar+"px"; 46800 block.style.right = -oOverflow.bar+"px"; 46801 this.dom.grid.right.footBlock = block; 46802 46803 nSWrapper.appendChild( nRight ); 46804 } 46805 46806 if ( this.s.dt.nTFoot ) 46807 { 46808 this.dom.footer = this.s.dt.nTFoot.parentNode; 46809 if ( this.s.iLeftColumns > 0 ) 46810 { 46811 this.dom.grid.left.foot = nLeft.childNodes[2]; 46812 } 46813 if ( this.s.iRightColumns > 0 ) 46814 { 46815 this.dom.grid.right.foot = nRight.childNodes[2]; 46816 } 46817 } 46818 46819 // RTL support - swap the position of the left and right columns (#48) 46820 if ( this.s.rtl ) { 46821 $('div.DTFC_RightHeadBlocker', nSWrapper).css( { 46822 left: -oOverflow.bar+'px', 46823 right: '' 46824 } ); 46825 } 46826 }, 46827 46828 46829 /** 46830 * Style and position the grid used for the FixedColumns layout 46831 * @returns {void} 46832 * @private 46833 */ 46834 "_fnGridLayout": function () 46835 { 46836 var that = this; 46837 var oGrid = this.dom.grid; 46838 var iWidth = $(oGrid.wrapper).width(); 46839 var iBodyHeight = this.s.dt.nTable.parentNode.offsetHeight; 46840 var iFullHeight = this.s.dt.nTable.parentNode.parentNode.offsetHeight; 46841 var oOverflow = this._fnDTOverflow(); 46842 var iLeftWidth = this.s.iLeftWidth; 46843 var iRightWidth = this.s.iRightWidth; 46844 var rtl = $(this.dom.body).css('direction') === 'rtl'; 46845 var wrapper; 46846 var scrollbarAdjust = function ( node, width ) { 46847 if ( ! oOverflow.bar ) { 46848 // If there is no scrollbar (Macs) we need to hide the auto scrollbar 46849 node.style.width = (width+20)+"px"; 46850 node.style.paddingRight = "20px"; 46851 node.style.boxSizing = "border-box"; 46852 } 46853 else if ( that._firefoxScrollError() ) { 46854 // See the above function for why this is required 46855 if ( $(node).height() > 34 ) { 46856 node.style.width = (width+oOverflow.bar)+"px"; 46857 } 46858 } 46859 else { 46860 // Otherwise just overflow by the scrollbar 46861 node.style.width = (width+oOverflow.bar)+"px"; 46862 } 46863 }; 46864 46865 // When x scrolling - don't paint the fixed columns over the x scrollbar 46866 if ( oOverflow.x ) 46867 { 46868 iBodyHeight -= oOverflow.bar; 46869 } 46870 46871 oGrid.wrapper.style.height = iFullHeight+"px"; 46872 46873 if ( this.s.iLeftColumns > 0 ) 46874 { 46875 wrapper = oGrid.left.wrapper; 46876 wrapper.style.width = iLeftWidth+'px'; 46877 wrapper.style.height = '1px'; 46878 46879 // Swap the position of the left and right columns for rtl (#48) 46880 // This is always up against the edge, scrollbar on the far side 46881 if ( rtl ) { 46882 wrapper.style.left = ''; 46883 wrapper.style.right = 0; 46884 } 46885 else { 46886 wrapper.style.left = 0; 46887 wrapper.style.right = ''; 46888 } 46889 46890 oGrid.left.body.style.height = iBodyHeight+"px"; 46891 if ( oGrid.left.foot ) { 46892 oGrid.left.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; // shift footer for scrollbar 46893 } 46894
46895 scrollbarAdjust( oGrid.left.liner, iLeftWidth ); 46896 oGrid.left.liner.style.height = iBodyHeight+"px"; 46897 oGrid.left.liner.style.maxHeight = iBodyHeight+"px"; 46898 } 46899 46900 if ( this.s.iRightColumns > 0 ) 46901 { 46902 wrapper = oGrid.right.wrapper; 46903 wrapper.style.width = iRightWidth+'px'; 46904 wrapper.style.height = '1px'; 46905 46906 // Need to take account of the vertical scrollbar 46907 if ( this.s.rtl ) { 46908 wrapper.style.left = oOverflow.y ? oOverflow.bar+'px' : 0; 46909 wrapper.style.right = ''; 46910 } 46911 else { 46912 wrapper.style.left = ''; 46913 wrapper.style.right = oOverflow.y ? oOverflow.bar+'px' : 0; 46914 } 46915 46916 oGrid.right.body.style.height = iBodyHeight+"px"; 46917 if ( oGrid.right.foot ) { 46918 oGrid.right.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; 46919 } 46920 46921 scrollbarAdjust( oGrid.right.liner, iRightWidth ); 46922 oGrid.right.liner.style.height = iBodyHeight+"px"; 46923 oGrid.right.liner.style.maxHeight = iBodyHeight+"px"; 46924 46925 oGrid.right.headBlock.style.display = oOverflow.y ? 'block' : 'none'; 46926 oGrid.right.footBlock.style.display = oOverflow.y ? 'block' : 'none'; 46927 } 46928 }, 46929 46930 46931 /** 46932 * Get information about the DataTable's scrolling state - specifically if the table is scrolling 46933 * on either the x or y axis, and also the scrollbar width. 46934 * @returns {object} Information about the DataTables scrolling state with the properties: 46935 * 'x', 'y' and 'bar' 46936 * @private 46937 */ 46938 "_fnDTOverflow": function () 46939 { 46940 var nTable = this.s.dt.nTable; 46941 var nTableScrollBody = nTable.parentNode; 46942 var out = { 46943 "x": false, 46944 "y": false, 46945 "bar": this.s.dt.oScroll.iBarWidth 46946 }; 46947 46948 if ( nTable.offsetWidth > nTableScrollBody.clientWidth ) 46949 { 46950 out.x = true; 46951 } 46952 46953 if ( nTable.offsetHeight > nTableScrollBody.clientHeight ) 46954 { 46955 out.y = true; 46956 } 46957 46958 return out; 46959 }, 46960 46961 46962 /** 46963 * Clone and position the fixed columns 46964 * @returns {void} 46965 * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) 46966 * @private 46967 */ 46968 "_fnDraw": function ( bAll ) 46969 { 46970 this._fnGridLayout(); 46971 this._fnCloneLeft( bAll ); 46972 this._fnCloneRight( bAll ); 46973 46974 $(this.dom.scroller).trigger('scroll'); 46975 46976 /* Draw callback function */ 46977 if ( this.s.fnDrawCallback !== null ) 46978 { 46979 this.s.fnDrawCallback.call( this, this.dom.clone.left, this.dom.clone.right ); 46980 } 46981 46982 /* Event triggering */ 46983 $(this).trigger( 'draw.dtfc', { 46984 "leftClone": this.dom.clone.left, 46985 "rightClone": this.dom.clone.right 46986 } ); 46987 }, 46988 46989 46990 /** 46991 * Clone the right columns 46992 * @returns {void} 46993 * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) 46994 * @private 46995 */ 46996 "_fnCloneRight": function ( bAll ) 46997 { 46998 if ( this.s.iRightColumns <= 0 ) { 46999 return; 47000 } 47001 47002 var that = this, 47003 i, jq, 47004 aiColumns = []; 47005 47006 for ( i=this.s.iTableColumns-this.s.iRightColumns ; i<this.s.iTableColumns ; i++ ) { 47007 if ( this.s.dt.aoColumns[i].bVisible ) { 47008 aiColumns.push( i ); 47009 } 47010 } 47011 47012 this._fnClone( this.dom.clone.right, this.dom.grid.right, aiColumns, bAll ); 47013 }, 47014 47015 47016 /** 47017 * Clone the left columns 47018 * @returns {void} 47019 * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) 47020 * @private 47021 */ 47022 "_fnCloneLeft": function ( bAll ) 47023 { 47024 if ( this.s.iLeftColumns <= 0 ) { 47025 return; 47026 } 47027 47028 var that = this, 47029 i, jq, 47030 aiColumns = []; 47031 47032 for ( i=0 ; i<this.s.iLeftColumns ; i++ ) { 47033 if ( this.s.dt.aoColumns[i].bVisible ) { 47034 aiColumns.push( i ); 47035 } 47036 } 47037 47038 this._fnClone( this.dom.clone.left, this.dom.grid.left, aiColumns, bAll ); 47039 }, 47040 47041 47042 /** 47043 * Make a copy of the layout object for a header or footer element from DataTables. Note that 47044 * this method will clone the nodes in the layout object. 47045 * @returns {Array} Copy of the layout array 47046 * @param {Object} aoOriginal Layout array from DataTables (aoHeader or aoFooter) 47047 * @param {Object} aiColumns Columns to copy 47048 * @param {boolean} events Copy cell events or not 47049 * @private 47050 */ 47051 "_fnCopyLayout": function ( aoOriginal, aiColumns, events ) 47052 { 47053 var aReturn = []; 47054 var aClones = []; 47055 var aCloned = []; 47056 47057 for ( var i=0, iLen=aoOriginal.length ; i<iLen ; i++ ) 47058 { 47059 var aRow = []; 47060 aRow.nTr = $(aoOriginal[i].nTr).clone(events, false)[0]; 47061 47062 for ( var j=0, jLen=this.s.iTableColumns ; j<jLen ; j++ ) 47063 { 47064 if ( $.inArray( j, aiColumns ) === -1 ) 47065 { 47066 continue; 47067 } 47068 47069 var iCloned = $.inArray( aoOriginal[i][j].cell, aCloned ); 47070 if ( iCloned === -1 ) 47071 { 47072 var nClone = $(aoOriginal[i][j].cell).clone(events, false)[0]; 47073 aClones.push( nClone ); 47074 aCloned.push( aoOriginal[i][j].cell ); 47075 47076 aRow.push( { 47077 "cell": nClone, 47078 "unique": aoOriginal[i][j].unique 47079 } ); 47080 } 47081 else 47082 { 47083 aRow.push( {
47084 "cell": aClones[ iCloned ], 47085 "unique": aoOriginal[i][j].unique 47086 } ); 47087 } 47088 } 47089 47090 aReturn.push( aRow ); 47091 } 47092 47093 return aReturn; 47094 }, 47095 47096 47097 /** 47098 * Clone the DataTable nodes and place them in the DOM (sized correctly) 47099 * @returns {void} 47100 * @param {Object} oClone Object containing the header, footer and body cloned DOM elements 47101 * @param {Object} oGrid Grid object containing the display grid elements for the cloned 47102 * column (left or right) 47103 * @param {Array} aiColumns Column indexes which should be operated on from the DataTable 47104 * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) 47105 * @private 47106 */ 47107 "_fnClone": function ( oClone, oGrid, aiColumns, bAll ) 47108 { 47109 var that = this, 47110 i, iLen, j, jLen, jq, nTarget, iColumn, nClone, iIndex, aoCloneLayout, 47111 jqCloneThead, aoFixedHeader, 47112 dt = this.s.dt; 47113 47114 /* 47115 * Header 47116 */ 47117 if ( bAll ) 47118 { 47119 $(oClone.header).remove(); 47120 47121 oClone.header = $(this.dom.header).clone(true, false)[0]; 47122 oClone.header.className += " DTFC_Cloned"; 47123 oClone.header.style.width = "100%"; 47124 oGrid.head.appendChild( oClone.header ); 47125 47126 /* Copy the DataTables layout cache for the header for our floating column */ 47127 aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns, true ); 47128 jqCloneThead = $('>thead', oClone.header); 47129 jqCloneThead.empty(); 47130 47131 /* Add the created cloned TR elements to the table */ 47132 for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ ) 47133 { 47134 jqCloneThead[0].appendChild( aoCloneLayout[i].nTr ); 47135 } 47136 47137 /* Use the handy _fnDrawHead function in DataTables to do the rowspan/colspan 47138 * calculations for us 47139 */ 47140 dt.oApi._fnDrawHead( dt, aoCloneLayout, true ); 47141 } 47142 else 47143 { 47144 /* To ensure that we copy cell classes exactly, regardless of colspan, multiple rows 47145 * etc, we make a copy of the header from the DataTable again, but don't insert the 47146 * cloned cells, just copy the classes across. To get the matching layout for the 47147 * fixed component, we use the DataTables _fnDetectHeader method, allowing 1:1 mapping 47148 */ 47149 aoCloneLayout = this._fnCopyLayout( dt.aoHeader, aiColumns, false ); 47150 aoFixedHeader=[]; 47151 47152 dt.oApi._fnDetectHeader( aoFixedHeader, $('>thead', oClone.header)[0] ); 47153 47154 for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ ) 47155 { 47156 for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ ) 47157 { 47158 aoFixedHeader[i][j].cell.className = aoCloneLayout[i][j].cell.className; 47159 47160 // If jQuery UI theming is used we need to copy those elements as well 47161 $('span.DataTables_sort_icon', aoFixedHeader[i][j].cell).each( function () { 47162 this.className = $('span.DataTables_sort_icon', aoCloneLayout[i][j].cell)[0].className; 47163 } ); 47164 } 47165 } 47166 } 47167 this._fnEqualiseHeights( 'thead', this.dom.header, oClone.header ); 47168 47169 /* 47170 * Body 47171 */ 47172 if ( this.s.sHeightMatch == 'auto' ) 47173 { 47174 /* Remove any heights which have been applied already and let the browser figure it out */ 47175 $('>tbody>tr', that.dom.body).css('height', 'auto'); 47176 } 47177 47178 if ( oClone.body !== null ) 47179 { 47180 $(oClone.body).remove(); 47181 oClone.body = null; 47182 } 47183 47184 oClone.body = $(this.dom.body).clone(true)[0]; 47185 oClone.body.className += " DTFC_Cloned"; 47186 oClone.body.style.paddingBottom = dt.oScroll.iBarWidth+"px"; 47187 oClone.body.style.marginBottom = (dt.oScroll.iBarWidth*2)+"px"; /* For IE */ 47188 if ( oClone.body.getAttribute('id') !== null ) 47189 { 47190 oClone.body.removeAttribute('id'); 47191 } 47192 47193 $('>thead>tr', oClone.body).empty(); 47194 $('>tfoot', oClone.body).remove(); 47195 47196 var nBody = $('tbody', oClone.body)[0]; 47197 $(nBody).empty(); 47198 if ( dt.aiDisplay.length > 0 ) 47199 { 47200 /* Copy the DataTables' header elements to force the column width in exactly the 47201 * same way that DataTables does it - have the header element, apply the width and 47202 * colapse it down 47203 */ 47204 var nInnerThead = $('>thead>tr', oClone.body)[0]; 47205 for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ ) 47206 { 47207 iColumn = aiColumns[iIndex]; 47208 47209 nClone = $(dt.aoColumns[iColumn].nTh).clone(true)[0]; 47210 nClone.innerHTML = ""; 47211 47212 var oStyle = nClone.style; 47213 oStyle.paddingTop = "0"; 47214 oStyle.paddingBottom = "0"; 47215 oStyle.borderTopWidth = "0"; 47216 oStyle.borderBottomWidth = "0"; 47217 oStyle.height = 0; 47218 oStyle.width = that.s.aiInnerWidths[iColumn]+"px"; 47219 47220 nInnerThead.appendChild( nClone ); 47221 } 47222 47223 /* Add in the tbody elements, cloning form the master table */ 47224 $('>tbody>tr', that.dom.body).each( function (z) { 47225 var i = that.s.dt.oFeatures.bServerSide===false ? 47226 that.s.dt.aiDisplay[ that.s.dt._iDisplayStart+z ] : z; 47227 var aTds = that.s.dt.aoData[ i ].anCells || $(this).children('td, th'); 47228 47229 var n = this.cloneNode(false); 47230 n.removeAttribute('id'); 47231 n.setAttribute( 'data-dt-row', i ); 47232 47233 for ( iIndex=0 ; iIndex<aiColumns.length ; iIndex++ ) 47234 { 47235 iColumn = aiColumns[iIndex]; 47236 47237 if ( aTds.length > 0 ) 47238 { 47239 nClone = $( aTds[iColumn] ).clone(true, true)[0]; 47240 nClone.removeAttribute( 'id' ); 47241 nClone.setAttribute( 'data-dt-row', i ); 47242 nClone.setAttribute( 'data-dt-column', iColumn ); 47243 n.appendChild( nClone ); 47244 } 47245 }
47246 nBody.appendChild( n ); 47247 } ); 47248 } 47249 else 47250 { 47251 $('>tbody>tr', that.dom.body).each( function (z) { 47252 nClone = this.cloneNode(true); 47253 nClone.className += ' DTFC_NoData'; 47254 $('td', nClone).html(''); 47255 nBody.appendChild( nClone ); 47256 } ); 47257 } 47258 47259 oClone.body.style.width = "100%"; 47260 oClone.body.style.margin = "0"; 47261 oClone.body.style.padding = "0"; 47262 47263 // Interop with Scroller - need to use a height forcing element in the 47264 // scrolling area in the same way that Scroller does in the body scroll. 47265 if ( dt.oScroller !== undefined ) 47266 { 47267 var scrollerForcer = dt.oScroller.dom.force; 47268 47269 if ( ! oGrid.forcer ) { 47270 oGrid.forcer = scrollerForcer.cloneNode( true ); 47271 oGrid.liner.appendChild( oGrid.forcer ); 47272 } 47273 else { 47274 oGrid.forcer.style.height = scrollerForcer.style.height; 47275 } 47276 } 47277 47278 oGrid.liner.appendChild( oClone.body ); 47279 47280 this._fnEqualiseHeights( 'tbody', that.dom.body, oClone.body ); 47281 47282 /* 47283 * Footer 47284 */ 47285 if ( dt.nTFoot !== null ) 47286 { 47287 if ( bAll ) 47288 { 47289 if ( oClone.footer !== null ) 47290 { 47291 oClone.footer.parentNode.removeChild( oClone.footer ); 47292 } 47293 oClone.footer = $(this.dom.footer).clone(true, true)[0]; 47294 oClone.footer.className += " DTFC_Cloned"; 47295 oClone.footer.style.width = "100%"; 47296 oGrid.foot.appendChild( oClone.footer ); 47297 47298 /* Copy the footer just like we do for the header */ 47299 aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns, true ); 47300 var jqCloneTfoot = $('>tfoot', oClone.footer); 47301 jqCloneTfoot.empty(); 47302 47303 for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ ) 47304 { 47305 jqCloneTfoot[0].appendChild( aoCloneLayout[i].nTr ); 47306 } 47307 dt.oApi._fnDrawHead( dt, aoCloneLayout, true ); 47308 } 47309 else 47310 { 47311 aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns, false ); 47312 var aoCurrFooter=[]; 47313 47314 dt.oApi._fnDetectHeader( aoCurrFooter, $('>tfoot', oClone.footer)[0] ); 47315 47316 for ( i=0, iLen=aoCloneLayout.length ; i<iLen ; i++ ) 47317 { 47318 for ( j=0, jLen=aoCloneLayout[i].length ; j<jLen ; j++ ) 47319 { 47320 aoCurrFooter[i][j].cell.className = aoCloneLayout[i][j].cell.className; 47321 } 47322 } 47323 } 47324 this._fnEqualiseHeights( 'tfoot', this.dom.footer, oClone.footer ); 47325 } 47326 47327 /* Equalise the column widths between the header footer and body - body get's priority */ 47328 var anUnique = dt.oApi._fnGetUniqueThs( dt, $('>thead', oClone.header)[0] ); 47329 $(anUnique).each( function (i) { 47330 iColumn = aiColumns[i]; 47331 this.style.width = that.s.aiInnerWidths[iColumn]+"px"; 47332 } ); 47333 47334 if ( that.s.dt.nTFoot !== null ) 47335 { 47336 anUnique = dt.oApi._fnGetUniqueThs( dt, $('>tfoot', oClone.footer)[0] ); 47337 $(anUnique).each( function (i) { 47338 iColumn = aiColumns[i]; 47339 this.style.width = that.s.aiInnerWidths[iColumn]+"px"; 47340 } ); 47341 } 47342 }, 47343 47344 47345 /** 47346 * From a given table node (THEAD etc), get a list of TR direct child elements 47347 * @param {Node} nIn Table element to search for TR elements (THEAD, TBODY or TFOOT element) 47348 * @returns {Array} List of TR elements found 47349 * @private 47350 */ 47351 "_fnGetTrNodes": function ( nIn ) 47352 { 47353 var aOut = []; 47354 for ( var i=0, iLen=nIn.childNodes.length ; i<iLen ; i++ ) 47355 { 47356 if ( nIn.childNodes[i].nodeName.toUpperCase() == "TR" ) 47357 { 47358 aOut.push( nIn.childNodes[i] ); 47359 } 47360 } 47361 return aOut; 47362 }, 47363 47364 47365 /** 47366 * Equalise the heights of the rows in a given table node in a cross browser way 47367 * @returns {void} 47368 * @param {String} nodeName Node type - thead, tbody or tfoot 47369 * @param {Node} original Original node to take the heights from 47370 * @param {Node} clone Copy the heights to 47371 * @private 47372 */ 47373 "_fnEqualiseHeights": function ( nodeName, original, clone ) 47374 { 47375 if ( this.s.sHeightMatch == 'none' && nodeName !== 'thead' && nodeName !== 'tfoot' ) 47376 { 47377 return; 47378 } 47379 47380 var that = this, 47381 i, iLen, iHeight, iHeight2, iHeightOriginal, iHeightClone, 47382 rootOriginal = original.getElementsByTagName(nodeName)[0], 47383 rootClone = clone.getElementsByTagName(nodeName)[0], 47384 jqBoxHack = $('>'+nodeName+'>tr:eq(0)', original).children(':first'), 47385 iBoxHack = jqBoxHack.outerHeight() - jqBoxHack.height(), 47386 anOriginal = this._fnGetTrNodes( rootOriginal ), 47387 anClone = this._fnGetTrNodes( rootClone ), 47388 heights = []; 47389 47390 for ( i=0, iLen=anClone.length ; i<iLen ; i++ ) 47391 { 47392 iHeightOriginal = anOriginal[i].offsetHeight;
47393 iHeightClone = anClone[i].offsetHeight; 47394 iHeight = iHeightClone > iHeightOriginal ? iHeightClone : iHeightOriginal; 47395 47396 if ( this.s.sHeightMatch == 'semiauto' ) 47397 { 47398 anOriginal[i]._DTTC_iHeight = iHeight; 47399 } 47400 47401 heights.push( iHeight ); 47402 } 47403 47404 for ( i=0, iLen=anClone.length ; i<iLen ; i++ ) 47405 { 47406 anClone[i].style.height = heights[i]+"px"; 47407 anOriginal[i].style.height = heights[i]+"px"; 47408 } 47409 }, 47410 47411 /** 47412 * Determine if the UA suffers from Firefox's overflow:scroll scrollbars 47413 * not being shown bug. 47414 * 47415 * Firefox doesn't draw scrollbars, even if it is told to using 47416 * overflow:scroll, if the div is less than 34px height. See bugs 292284 and 47417 * 781885. Using UA detection here since this is particularly hard to detect 47418 * using objects - its a straight up rendering error in Firefox. 47419 * 47420 * @return {boolean} True if Firefox error is present, false otherwise 47421 */ 47422 _firefoxScrollError: function () { 47423 if ( _firefoxScroll === undefined ) { 47424 var test = $('<div/>') 47425 .css( { 47426 position: 'absolute', 47427 top: 0, 47428 left: 0, 47429 height: 10, 47430 width: 50, 47431 overflow: 'scroll' 47432 } ) 47433 .appendTo( 'body' ); 47434 47435 // Make sure this doesn't apply on Macs with 0 width scrollbars 47436 _firefoxScroll = ( 47437 test[0].clientWidth === test[0].offsetWidth && this._fnDTOverflow().bar !== 0 47438 ); 47439 47440 test.remove(); 47441 } 47442 47443 return _firefoxScroll; 47444 } 47445} ); 47446 47447 47448 47449/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 47450 * Statics 47451 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 47452 47453/** 47454 * FixedColumns default settings for initialisation 47455 * @name FixedColumns.defaults 47456 * @namespace 47457 * @static 47458 */ 47459FixedColumns.defaults = /** @lends FixedColumns.defaults */{ 47460 /** 47461 * Number of left hand columns to fix in position 47462 * @type int 47463 * @default 1 47464 * @static 47465 * @example 47466 * var = $('#example').dataTable( { 47467 * "scrollX": "100%" 47468 * } ); 47469 * new $.fn.dataTable.fixedColumns( table, { 47470 * "leftColumns": 2 47471 * } ); 47472 */ 47473 "iLeftColumns": 1, 47474 47475 /** 47476 * Number of right hand columns to fix in position 47477 * @type int 47478 * @default 0 47479 * @static 47480 * @example 47481 * var table = $('#example').dataTable( { 47482 * "scrollX": "100%" 47483 * } ); 47484 * new $.fn.dataTable.fixedColumns( table, { 47485 * "rightColumns": 1 47486 * } ); 47487 */ 47488 "iRightColumns": 0, 47489 47490 /** 47491 * Draw callback function which is called when FixedColumns has redrawn the fixed assets 47492 * @type function(object, object):void 47493 * @default null 47494 * @static 47495 * @example 47496 * var table = $('#example').dataTable( { 47497 * "scrollX": "100%" 47498 * } ); 47499 * new $.fn.dataTable.fixedColumns( table, { 47500 * "drawCallback": function () { 47501 * alert( "FixedColumns redraw" ); 47502 * } 47503 * } ); 47504 */ 47505 "fnDrawCallback": null, 47506 47507 /** 47508 * Height matching algorthim to use. This can be "none" which will result in no height 47509 * matching being applied by FixedColumns (height matching could be forced by CSS in this 47510 * case), "semiauto" whereby the height calculation will be performed once, and the result 47511 * cached to be used again (fnRecalculateHeight can be used to force recalculation), or 47512 * "auto" when height matching is performed on every draw (slowest but must accurate) 47513 * @type string 47514 * @default semiauto 47515 * @static 47516 * @example 47517 * var table = $('#example').dataTable( { 47518 * "scrollX": "100%" 47519 * } ); 47520 * new $.fn.dataTable.fixedColumns( table, { 47521 * "heightMatch": "auto" 47522 * } ); 47523 */ 47524 "sHeightMatch": "semiauto" 47525}; 47526 47527 47528 47529 47530/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 47531 * Constants 47532 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 47533 47534/** 47535 * FixedColumns version 47536 * @name FixedColumns.version 47537 * @type String 47538 * @default See code 47539 * @static 47540 */ 47541FixedColumns.version = "3.3.3"; 47542 47543 47544 47545/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 47546 * DataTables API integration 47547 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 47548 47549DataTable.Api.register( 'fixedColumns()', function () { 47550 return this; 47551} ); 47552 47553DataTable.Api.register( 'fixedColumns().update()', function () { 47554 return this.iterator( 'table', function ( ctx ) { 47555 if ( ctx._oFixedColumns ) { 47556 ctx._oFixedColumns.fnUpdate(); 47557 } 47558 } ); 47559} ); 47560 47561DataTable.Api.register( 'fixedColumns().relayout()', function () { 47562 return this.iterator( 'table', function ( ctx ) { 47563 if ( ctx._oFixedColumns ) { 47564 ctx._oFixedColumns.fnRedrawLayout(); 47565 } 47566 } ); 47567} ); 47568 47569DataTable.Api.register( 'rows().recalcHeight()', function () { 47570 return this.iterator( 'row', function ( ctx, idx ) { 47571 if ( ctx._oFixedColumns ) { 47572 ctx._oFixedColumns.fnRecalculateHeight( this.row(idx).node() ); 47573 } 47574 } ); 47575} ); 47576 47577DataTable.Api.register( 'fixedColumns().rowIndex()', function ( row ) { 47578 row = $(row); 47579 47580 return row.parents('.DTFC_Cloned').length ? 47581 this.rows( { page: 'current' } ).indexes()[ row.index() ] : 47582 this.row( row ).index(); 47583} ); 47584 47585DataTable.Api.register( 'fixedColumns().cellIndex()', function ( cell ) { 47586 cell = $(cell); 47587 47588 if ( cell.parents('.DTFC_Cloned').length ) { 47589 var rowClonedIdx = cell.parent().index(); 47590 var rowIdx = this.rows( { page: 'current' } ).indexes()[ rowClonedIdx ]; 47591 var columnIdx; 47592 47593 if ( cell.parents('.DTFC_LeftWrapper').length ) { 47594 columnIdx = cell.index(); 47595 } 47596 else { 47597 var columns = this.columns().flatten().length; 47598 columnIdx = columns - this.context[0]._oFixedColumns.s.iRightColumns + cell.index(); 47599 } 47600 47601 return { 47602 row: rowIdx, 47603 column: this.column.index( 'toData', columnIdx ),
47604 columnVisible: columnIdx 47605 }; 47606 } 47607 else { 47608 return this.cell( cell ).index(); 47609 } 47610} ); 47611 47612DataTable.Api.registerPlural( 'cells().fixedNodes()', 'cell().fixedNode()', function () { 47613 return this.iterator( 'cell', function ( settings, row, column ) { 47614 return settings._oFixedColumns 47615 ? settings._oFixedColumns.fnToFixedNode( row, column ) 47616 : this.cell(row, column).node(); 47617 }, 1 ); 47618} ); 47619 47620 47621 47622 47623/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 47624 * Initialisation 47625 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 47626 47627// Attach a listener to the document which listens for DataTables initialisation 47628// events so we can automatically initialise 47629$(document).on( 'init.dt.fixedColumns', function (e, settings) { 47630 if ( e.namespace !== 'dt' ) { 47631 return; 47632 } 47633 47634 var init = settings.oInit.fixedColumns; 47635 var defaults = DataTable.defaults.fixedColumns; 47636 47637 if ( init || defaults ) { 47638 var opts = $.extend( {}, init, defaults ); 47639 47640 if ( init !== false ) { 47641 new FixedColumns( settings, opts ); 47642 } 47643 } 47644} ); 47645 47646 47647 47648// Make FixedColumns accessible from the DataTables instance 47649$.fn.dataTable.FixedColumns = FixedColumns; 47650$.fn.DataTable.FixedColumns = FixedColumns; 47651 47652return FixedColumns; 47653})); 47654/* 47655* File: jquery.dataTables.columnFilter.js 47656* Version: 1.0.0 47657* Author: Jovan Popovic 47658* 47659* Copyright 2011 Jovan Popovic, all rights reserved. 47660* 47661* This source file is free software, under either the GPL v2 license or a 47662* BSD style license, as supplied with this software. 47663* 47664* This source file is distributed in the hope that it will be useful, but 47665* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 47666* or FITNESS FOR A PARTICULAR PURPOSE. 47667* 47668* Parameters:" 47669* @sPlaceHolder String Place where inline filtering function should be placed ("tfoot", "thead:before", "thead:after"). Default is "tfoot" 47670* @sRangeSeparator String Separator that will be used when range values are sent to the server-side. Default value is "~". 47671* @sRangeFormat string Default format of the From ... to ... range inputs. Default is From {from} to {to} 47672* @aoColumns Array Array of the filter settings that will be applied on the columns 47673*/ 47674(function ($) { 47675 47676 var asInitVals, i, label, th; 47677 47678 var sTableId = "table"; 47679 var sRangeFormat = "From {from} to {to}"; 47680 //Array of the functions that will override sSearch_ parameters 47681 var afnSearch_ = new Array(); 47682 var aiCustomSearch_Indexes = new Array(); 47683 47684 var oFunctionTimeout = null; 47685 47686 47687 function fnCreateInput(regex, smart, bIsNumber) { 47688 var sCSSClass = "text_filter"; 47689 if (bIsNumber) 47690 sCSSClass = "number_filter"; 47691 var input = $('<input type="text" class="search_init ' + sCSSClass + '" value="' + label + '"/>'); 47692 th.html(input); 47693 if (bIsNumber) 47694 th.wrapInner('<span class="filter_column filter_number" />'); 47695 else 47696 th.wrapInner('<span class="filter_column filter_text" />'); 47697 asInitVals[i] = label; 47698 var index = i; 47699 47700 if (bIsNumber && !oTable.fnSettings().oFeatures.bServerSide) { 47701 input.keyup(function () { 47702 /* Filter on the column all numbers that starts with the entered value */ 47703 oTable.fnFilter('^' + this.value, index, true, false); 47704 }); 47705 } else { 47706 input.keyup(function () { 47707 /* Filter on the column (the index) of this element */ 47708 oTable.fnFilter(this.value, index, regex, smart); 47709 }); 47710 } 47711 47712 input.focus(function () { 47713 if ($(this).hasClass("search_init")) { 47714 $(this).removeClass("search_init"); 47715 this.value = ""; 47716 } 47717 }); 47718 input.blur(function () { 47719 if (this.value == "") { 47720 $(this).addClass("search_init"); 47721 this.value = asInitVals[index]; 47722 } 47723 }); 47724 } 47725 47726 function fnCreateRangeInput() { 47727 47728 th.html(_fnRangeLabelPart(0)); 47729 var sFromId = sTableId + 'range_from_' + i; 47730 var from = $('<input type="text" class="number_range_filter" id="' + sFromId + '" rel="' + i + '"/>'); 47731 th.append(from); 47732 th.append(_fnRangeLabelPart(1)); 47733 var sToId = sTableId + 'range_to_' + i; 47734 var to = $('<input type="text" class="number_range_filter" id="' + sToId + '" rel="' + i + '"/>'); 47735 th.append(to); 47736 th.append(_fnRangeLabelPart(2)); 47737 th.wrapInner('<span class="filterColumn filter_number_range" />'); 47738 var index = i; 47739 aiCustomSearch_Indexes.push(i); 47740 47741 47742 47743 //------------start range filtering function 47744 47745 47746 /* Custom filtering function which will filter data in column four between two values 47747 * Author: Allan Jardine, Modified by Jovan Popovic 47748 */ 47749 $.fn.dataTableExt.afnFiltering.push( 47750 function (oSettings, aData, iDataIndex) { 47751 var iMin = document.getElementById(sFromId).value * 1; 47752 var iMax = document.getElementById(sToId).value * 1; 47753 var iValue = aData[index] == "-" ? 0 : aData[index] * 1; 47754 if (iMin == "" && iMax == "") { 47755 return true; 47756 } 47757 else if (iMin == "" && iValue < iMax) { 47758 return true; 47759 } 47760 else if (iMin < iValue && "" == iMax) { 47761 return true; 47762 } 47763 else if (iMin < iValue && iValue < iMax) { 47764 return true; 47765 } 47766 return false;
47767 } 47768 ); 47769 //------------end range filtering function 47770 47771 47772 47773 $('#' + sFromId + ',#' + sToId, th).keyup(function () { 47774 47775 var iMin = document.getElementById(sFromId).value * 1; 47776 var iMax = document.getElementById(sToId).value * 1; 47777 if (iMin != 0 && iMax != 0 && iMin > iMax) 47778 return; 47779 47780 oTable.fnDraw(); 47781 47782 }); 47783 47784 47785 } 47786 47787 47788 function fnCreateDateRangeInput() { 47789 47790 th.html(_fnRangeLabelPart(0)); 47791 var sFromId = sTableId + 'range_from_' + i; 47792 var from = $('<input type="text" class="date_range_filter" id="' + sFromId + '" rel="' + i + '"/>'); 47793 from.datepicker(); 47794 th.append(from); 47795 th.append(_fnRangeLabelPart(1)); 47796 var sToId = sTableId + 'range_to_' + i; 47797 var to = $('<input type="text" class="date_range_filter" id="' + sToId + '" rel="' + i + '"/>'); 47798 th.append(to); 47799 th.append(_fnRangeLabelPart(2)); 47800 th.wrapInner('<span class="filterColumn filter_date_range" />'); 47801 to.datepicker(); 47802 var index = i; 47803 aiCustomSearch_Indexes.push(i); 47804 47805 47806 //------------start date range filtering function 47807 47808 $.fn.dataTableExt.afnFiltering.push( 47809 function (oSettings, aData, iDataIndex) { 47810 var dStartDate = from.datepicker("getDate"); 47811 47812 var dEndDate = to.datepicker("getDate"); 47813 47814 var dCellDate = $.datepicker.parseDate($.datepicker.regional[""].dateFormat, aData[index]); 47815 47816 if (dCellDate == null) 47817 return false; 47818 47819 if (dStartDate == null && dEndDate == null) { 47820 return true; 47821 } 47822 else if (dStartDate == null && dCellDate < dEndDate) { 47823 return true; 47824 } 47825 else if (dStartDate < dCellDate && dEndDate == null) { 47826 return true; 47827 } 47828 else if (dStartDate < dCellDate && dCellDate < dEndDate) { 47829 return true; 47830 } 47831 return false; 47832 } 47833 ); 47834 //------------end date range filtering function 47835 47836 $('#' + sFromId + ',#' + sToId, th).change(function () { 47837 oTable.fnDraw(); 47838 }); 47839 } 47840 47841 function fnCreateSelect(aData, selectedValue, bSmart, valueDelimiterInSmartMode, dontUseDefaultValue) { 47842 var index = i; 47843 var select = $('<select class="search_init select_filter">' + 47844 (dontUseDefaultValue ? '' : '<option value="" class="search_init">' + label + '</option>') + 47845 '</select>'), j, iLen = aData.length; 47846 47847 for (j = 0; j < iLen; j++) 47848 { 47849 var item = aData[j]; 47850 var isStringItem = typeof item === "string"; 47851 var itemValue = isStringItem ? item : item.value; 47852 47853 var selectedHtml = itemValue == selectedValue ? 'selected' : ''; 47854 var option = $('<option ' + selectedHtml + ' id="filterOption' + j + '">' + itemValue + '</option>').appendTo(select); 47855 var filterValue = htmlDecode(isStringItem ? item : item.key.toString()); 47856 47857 if (bSmart) 47858 { 47859 if (!isStringItem) 47860 { 47861 // Use item key value instead of spaces in column filter values when bSmart mode is turned on, 47862 // because there are issues with incorrect filtering of values which have similar words which are separated by spaces. 47863 // E.g. we have values "column filter" and "pretty column filter". If we filter data by "column filter", "pretty column filter" won't be filtered out. 47864 filterValue = filterValue.replace(/ /g, item.key); 47865 } 47866 47867 filterValue = filterValue.replace(/[\u00E9\u00C8\u00C4\(\)]/g, " "); 47868 47869 option.data("filterValue", filterValue); 47870 } 47871 else 47872 option.data("filterValue", '^' + filterValue.escapeRegExpSpecialCharacters() + '$'); 47873 } 47874 th.html(select); 47875 th.wrapInner('<span class="filterColumn filter_select" />'); 47876 select.change(function () 47877 { 47878 if ($(this).val() != "") 47879 $(this).removeClass("search_init"); 47880 else 47881 $(this).addClass("search_init"); 47882 47883 var data = $(this).find(":selected").data("filterValue") || ""; 47884 data = _.unescape(data); 47885 47886 if (bSmart && data.length) 47887 { 47888 var escapedValue = data.escapeRegExpSpecialCharacters(); 47889 47890 if (!!valueDelimiterInSmartMode) 47891 { 47892 var escapedDelimiter = valueDelimiterInSmartMode.escapeRegExpSpecialCharacters(); 47893 data = escapedDelimiter + escapedValue + escapedDelimiter; 47894 } 47895 else 47896 data = escapedValue; 47897 } 47898 47899 oTable.fnFilter(data, index, true, bSmart); 47900 }); 47901 47902 select.change(); 47903 } 47904 47905 function _fnRangeLabelPart(iPlace){ 47906 switch(iPlace){ 47907 case 0: 47908 return sRangeFormat.substring(0, sRangeFormat.indexOf("{from}")); 47909 case 1: 47910 return sRangeFormat.substring(sRangeFormat.indexOf("{from}") + 6, sRangeFormat.indexOf("{to}")); 47911 default: 47912 return sRangeFormat.substring(sRangeFormat.indexOf("{to}") + 4); 47913 } 47914 } 47915 47916 47917 $.fn.columnFilter = function (options) { 47918 47919 oTable = this; 47920 47921 var defaults = { 47922 sPlaceHolder: "foot", 47923 sRangeSeparator: "~", 47924 iFilteringDelay: 500, 47925 aoColumns: null, 47926 sRangeFormat: "From {from} to {to}" 47927 47928 }; 47929 47930 properties = $.extend(defaults, options); 47931 47932 return this.each(function () { 47933 47934 asInitVals = new Array(); 47935 var sFilterRow = "tfoot tr"; 47936 if (properties.sPlaceHolder == "head:after") { 47937 sFilterRow = "thead tr:last"; 47938 } else if (properties.sPlaceHolder == "head:before") { 47939 var tr = $("thead tr:last").detach(); 47940 tr.prependTo("thead"); 47941 sFilterRow = "thead tr:first"; 47942 } 47943 47944 $(sFilterRow + " th", oTable).each(function (index) { 47945 i = index; 47946 var aoColumn = { type: "text", 47947 bRegex: false,
47948 bSmart: true 47949 }; 47950 if (properties.aoColumns != null) { 47951 if (properties.aoColumns.length < i || properties.aoColumns[i] == null) 47952 return; 47953 aoColumn = properties.aoColumns[i]; 47954 } 47955 label = $(this).text(); //"Search by " + $(this).text(); 47956 th = $($(this)[0]); 47957 if (aoColumn != null) 47958 { 47959 if (aoColumn.sRangeFormat != null) 47960 sRangeFormat = aoColumn.sRangeFormat; 47961 else 47962 sRangeFormat = properties.sRangeFormat; 47963 switch (aoColumn.type) { 47964 case "number": 47965 fnCreateInput(true, false, true); 47966 break; 47967 case "text": 47968 bRegex = (aoColumn.bRegex == null ? false : aoColumn.bRegex); 47969 bSmart = (aoColumn.bSmart == null ? false : aoColumn.bSmart); 47970 fnCreateInput(bRegex, bSmart, false); 47971 break; 47972 case "select":
47973 bSmart = (aoColumn.bSmart == null ? false : aoColumn.bSmart); 47974 fnCreateSelect(aoColumn.values, aoColumn.selected, bSmart, aoColumn.valueDelimiterInSmartMode, aoColumn.dontUseDefaultValue); 47975 break; 47976 case "number-range": 47977 fnCreateRangeInput(); 47978 break; 47979 case "date-range": 47980 fnCreateDateRangeInput(); 47981 47982 break; 47983 default: 47984 break; 47985 47986 } 47987 } 47988 }); 47989 47990 for (j = 0; j < aiCustomSearch_Indexes.length; j++) { 47991 var index = aiCustomSearch_Indexes[j]; 47992 var fnSearch_ = function () { 47993 return $("#range_from_" + index).val() + properties.sRangeSeparator + $("#range_to_" + index).val() 47994 } 47995 afnSearch_.push(fnSearch_); 47996 } 47997 }); 47998 47999 }; 48000})(jQuery); 48001 48002 48003(function ($) 48004{ 48005 /* 48006 * Function: fnGetColumnData 48007 * Purpose: Return an array of table values from a particular column. 48008 * Returns: array string: 1d data array 48009 * Inputs: object:oSettings - dataTable settings object. This is always the last argument past to the function 48010 * int:iColumn - the id of the column to extract the data from 48011 * bool:bUnique - optional - if set to false duplicated values are not filtered out 48012 * bool:bFiltered - optional - if set to false all the table data is used (not only the filtered) 48013 * bool:bIgnoreEmpty - optional - if set to false empty values are not filtered from the result array 48014 * Author: Benedikt Forchhammer <b.forchhammer /AT\ mind2.de> 48015 */ 48016 $.fn.dataTableExt.oApi.fnGetColumnData = function (oSettings, iColumn, bUnique, bFiltered, bIgnoreEmpty) 48017 { 48018 // check that we have a column id 48019 if (typeof iColumn == "undefined") return new Array(); 48020 48021 // by default we only wany unique data 48022 if (typeof bUnique == "undefined") bUnique = true; 48023 48024 // by default we do want to only look at filtered data 48025 if (typeof bFiltered == "undefined") bFiltered = true; 48026 48027 // by default we do not wany to include empty values 48028 if (typeof bIgnoreEmpty == "undefined") bIgnoreEmpty = true; 48029 48030 // list of rows which we're going to loop through 48031 var aiRows; 48032 48033 // use only filtered rows 48034 if (bFiltered == true) aiRows = oSettings.aiDisplay; 48035 // use all rows 48036 else aiRows = oSettings.aiDisplayMaster; // all row numbers 48037 48038 // set up data array 48039 var asResultData = new Array(); 48040 48041 for (var i = 0, c = aiRows.length; i < c; i++) 48042 { 48043 iRow = aiRows[i]; 48044 var aData = this.fnGetData(iRow); 48045 var sValue = aData[iColumn]; 48046 48047 // ignore empty values? 48048 if (bIgnoreEmpty == true && sValue.length == 0) continue; 48049 48050 // ignore unique values? 48051 else if (bUnique == true && jQuery.inArray(sValue, asResultData) > -1) continue; 48052 48053 // else push the value onto the result data array 48054 else asResultData.push(sValue); 48055 } 48056 48057 return asResultData; 48058 } 48059 48060} (jQuery)); 48061 48062/*! ColReorder 1.3.0 48063 * ©2010-2015 SpryMedia Ltd - datatables.net/license 48064 */ 48065 48066/** 48067 * @summary ColReorder 48068 * @description Provide the ability to reorder columns in a DataTable 48069 * @version 1.3.0 48070 * @file dataTables.colReorder.js 48071 * @author SpryMedia Ltd (www.sprymedia.co.uk) 48072 * @contact www.sprymedia.co.uk/contact 48073 * @copyright Copyright 2010-2014 SpryMedia Ltd. 48074 * 48075 * This source file is free software, available under the following license: 48076 * MIT license - http://datatables.net/license/mit 48077 * 48078 * This source file is distributed in the hope that it will be useful, but 48079 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 48080 * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. 48081 * 48082 * For details please refer to: http://www.datatables.net 48083 */ 48084(function( factory ){ 48085 if ( typeof define === 'function' && define.amd ) { 48086 // AMD 48087 define( ['jquery', 'datatables.net'], function ( $ ) { 48088 return factory( $, window, document ); 48089 } ); 48090 } 48091 else if ( typeof exports === 'object' ) { 48092 // CommonJS 48093 module.exports = function (root, $) { 48094 if ( ! root ) { 48095 root = window; 48096 } 48097 48098 if ( ! $ || ! $.fn.dataTable ) { 48099 $ = require('datatables.net')(root, $).$; 48100 } 48101 48102 return factory( $, root, root.document ); 48103 }; 48104 } 48105 else { 48106 // Browser 48107 factory( jQuery, window, document ); 48108 } 48109}(function( $, window, document, undefined ) { 48110'use strict'; 48111var DataTable = $.fn.dataTable; 48112 48113 48114/** 48115 * Switch the key value pairing of an index array to be value key (i.e. the old value is now the 48116 * key). For example consider [ 2, 0, 1 ] this would be returned as [ 1, 2, 0 ]. 48117 * @method fnInvertKeyValues 48118 * @param array aIn Array to switch around 48119 * @returns array 48120 */ 48121function fnInvertKeyValues( aIn ) 48122{ 48123 var aRet=[]; 48124 for ( var i=0, iLen=aIn.length ; i<iLen ; i++ ) 48125 { 48126 aRet[ aIn[i] ] = i; 48127 } 48128 return aRet; 48129} 48130 48131 48132/** 48133 * Modify an array by switching the position of two elements 48134 * @method fnArraySwitch 48135 * @param array aArray Array to consider, will be modified by reference (i.e. no return) 48136 * @param int iFrom From point 48137 * @param int iTo Insert point 48138 * @returns void 48139 */ 48140function fnArraySwitch( aArray, iFrom, iTo ) 48141{ 48142 var mStore = aArray.splice( iFrom, 1 )[0]; 48143 aArray.splice( iTo, 0, mStore ); 48144} 48145 48146 48147/** 48148 * Switch the positions of nodes in a parent node (note this is specifically designed for 48149 * table rows). Note this function considers all element nodes under the parent! 48150 * @method fnDomSwitch 48151 * @param string sTag Tag to consider 48152 * @param int iFrom Element to move 48153 * @param int Point to element the element to (before this point), can be null for append 48154 * @returns void 48155 */ 48156function fnDomSwitch( nParent, iFrom, iTo ) 48157{ 48158 var anTags = []; 48159 for ( var i=0, iLen=nParent.childNodes.length ; i<iLen ; i++ ) 48160 { 48161 if ( nParent.childNodes[i].nodeType == 1 ) 48162 { 48163 anTags.push( nParent.childNodes[i] ); 48164 } 48165 } 48166 var nStore = anTags[ iFrom ]; 48167 48168 if ( iTo !== null ) 48169 { 48170 nParent.insertBefore( nStore, anTags[iTo] ); 48171 } 48172 else 48173 { 48174 nParent.appendChild( nStore ); 48175 } 48176} 48177 48178 48179/**
48180 * Plug-in for DataTables which will reorder the internal column structure by taking the column 48181 * from one position (iFrom) and insert it into a given point (iTo). 48182 * @method $.fn.dataTableExt.oApi.fnColReorder 48183 * @param object oSettings DataTables settings object - automatically added by DataTables! 48184 * @param int iFrom Take the column to be repositioned from this point 48185 * @param int iTo and insert it into this point 48186 * @param bool drop Indicate if the reorder is the final one (i.e. a drop) 48187 * not a live reorder 48188 * @returns void 48189 */ 48190$.fn.dataTableExt.oApi.fnColReorder = function ( oSettings, iFrom, iTo, drop ) 48191{ 48192 var i, iLen, j, jLen, iCols=oSettings.aoColumns.length, nTrs, oCol; 48193 var attrMap = function ( obj, prop, mapping ) { 48194 if ( ! obj[ prop ] || typeof obj[ prop ] === 'function' ) { 48195 return; 48196 } 48197 48198 var a = obj[ prop ].split('.'); 48199 var num = a.shift(); 48200 48201 if ( isNaN( num*1 ) ) { 48202 return; 48203 } 48204 48205 obj[ prop ] = mapping[ num*1 ]+'.'+a.join('.'); 48206 }; 48207 48208 /* Sanity check in the input */ 48209 if ( iFrom == iTo ) 48210 { 48211 /* Pointless reorder */ 48212 return; 48213 } 48214 48215 if ( iFrom < 0 || iFrom >= iCols ) 48216 { 48217 this.oApi._fnLog( oSettings, 1, "ColReorder 'from' index is out of bounds: "+iFrom ); 48218 return; 48219 } 48220 48221 if ( iTo < 0 || iTo >= iCols ) 48222 { 48223 this.oApi._fnLog( oSettings, 1, "ColReorder 'to' index is out of bounds: "+iTo ); 48224 return; 48225 } 48226 48227 /* 48228 * Calculate the new column array index, so we have a mapping between the old and new 48229 */ 48230 var aiMapping = []; 48231 for ( i=0, iLen=iCols ; i<iLen ; i++ ) 48232 { 48233 aiMapping[i] = i; 48234 } 48235 fnArraySwitch( aiMapping, iFrom, iTo ); 48236 var aiInvertMapping = fnInvertKeyValues( aiMapping ); 48237 48238 48239 /* 48240 * Convert all internal indexing to the new column order indexes 48241 */ 48242 /* Sorting */ 48243 for ( i=0, iLen=oSettings.aaSorting.length ; i<iLen ; i++ ) 48244 { 48245 oSettings.aaSorting[i][0] = aiInvertMapping[ oSettings.aaSorting[i][0] ]; 48246 } 48247 48248 /* Fixed sorting */ 48249 if ( oSettings.aaSortingFixed !== null ) 48250 { 48251 for ( i=0, iLen=oSettings.aaSortingFixed.length ; i<iLen ; i++ ) 48252 { 48253 oSettings.aaSortingFixed[i][0] = aiInvertMapping[ oSettings.aaSortingFixed[i][0] ]; 48254 } 48255 } 48256 48257 /* Data column sorting (the column which the sort for a given column should take place on) */ 48258 for ( i=0, iLen=iCols ; i<iLen ; i++ ) 48259 { 48260 oCol = oSettings.aoColumns[i]; 48261 for ( j=0, jLen=oCol.aDataSort.length ; j<jLen ; j++ ) 48262 { 48263 oCol.aDataSort[j] = aiInvertMapping[ oCol.aDataSort[j] ]; 48264 } 48265 48266 // Update the column indexes 48267 oCol.idx = aiInvertMapping[ oCol.idx ]; 48268 } 48269 48270 // Update 1.10 optimised sort class removal variable 48271 $.each( oSettings.aLastSort, function (i, val) { 48272 oSettings.aLastSort[i].src = aiInvertMapping[ val.src ]; 48273 } ); 48274 48275 /* Update the Get and Set functions for each column */ 48276 for ( i=0, iLen=iCols ; i<iLen ; i++ ) 48277 { 48278 oCol = oSettings.aoColumns[i]; 48279 48280 if ( typeof oCol.mData == 'number' ) { 48281 oCol.mData = aiInvertMapping[ oCol.mData ]; 48282 48283 // regenerate the get / set functions 48284 oSettings.oApi._fnColumnOptions( oSettings, i, {} ); 48285 } 48286 else if ( $.isPlainObject( oCol.mData ) ) { 48287 // HTML5 data sourced 48288 attrMap( oCol.mData, '_', aiInvertMapping ); 48289 attrMap( oCol.mData, 'filter', aiInvertMapping ); 48290 attrMap( oCol.mData, 'sort', aiInvertMapping ); 48291 attrMap( oCol.mData, 'type', aiInvertMapping ); 48292 48293 // regenerate the get / set functions 48294 oSettings.oApi._fnColumnOptions( oSettings, i, {} ); 48295 } 48296 } 48297 48298 48299 /* 48300 * Move the DOM elements 48301 */ 48302 if ( oSettings.aoColumns[iFrom].bVisible ) 48303 { 48304 /* Calculate the current visible index and the point to insert the node before. The insert 48305 * before needs to take into account that there might not be an element to insert before, 48306 * in which case it will be null, and an appendChild should be used 48307 */ 48308 var iVisibleIndex = this.oApi._fnColumnIndexToVisible( oSettings, iFrom ); 48309 var iInsertBeforeIndex = null; 48310 48311 i = iTo < iFrom ? iTo : iTo + 1; 48312 while ( iInsertBeforeIndex === null && i < iCols ) 48313 { 48314 iInsertBeforeIndex = this.oApi._fnColumnIndexToVisible( oSettings, i ); 48315 i++; 48316 } 48317 48318 /* Header */ 48319 nTrs = oSettings.nTHead.getElementsByTagName('tr'); 48320 for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) 48321 { 48322 fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex ); 48323 } 48324 48325 /* Footer */ 48326 if ( oSettings.nTFoot !== null ) 48327 { 48328 nTrs = oSettings.nTFoot.getElementsByTagName('tr'); 48329 for ( i=0, iLen=nTrs.length ; i<iLen ; i++ ) 48330 {
48331 fnDomSwitch( nTrs[i], iVisibleIndex, iInsertBeforeIndex ); 48332 } 48333 } 48334 48335 /* Body */ 48336 for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) 48337 { 48338 if ( oSettings.aoData[i].nTr !== null ) 48339 { 48340 fnDomSwitch( oSettings.aoData[i].nTr, iVisibleIndex, iInsertBeforeIndex ); 48341 } 48342 } 48343 } 48344 48345 /* 48346 * Move the internal array elements 48347 */ 48348 /* Columns */ 48349 fnArraySwitch( oSettings.aoColumns, iFrom, iTo ); 48350 48351 /* Search columns */ 48352 fnArraySwitch( oSettings.aoPreSearchCols, iFrom, iTo ); 48353 48354 /* Array array - internal data anodes cache */ 48355 for ( i=0, iLen=oSettings.aoData.length ; i<iLen ; i++ ) 48356 { 48357 var data = oSettings.aoData[i]; 48358 48359 if ( data.anCells ) { 48360 fnArraySwitch( data.anCells, iFrom, iTo ); 48361 } 48362 48363 // For DOM sourced data, the invalidate will reread the cell into 48364 // the data array, but for data sources as an array, they need to 48365 // be flipped 48366 if ( data.src !== 'dom' && $.isArray( data._aData ) ) { 48367 fnArraySwitch( data._aData, iFrom, iTo ); 48368 } 48369 } 48370 48371 /* Reposition the header elements in the header layout array */ 48372 for ( i=0, iLen=oSettings.aoHeader.length ; i<iLen ; i++ ) 48373 { 48374 fnArraySwitch( oSettings.aoHeader[i], iFrom, iTo ); 48375 } 48376 48377 if ( oSettings.aoFooter !== null ) 48378 { 48379 for ( i=0, iLen=oSettings.aoFooter.length ; i<iLen ; i++ ) 48380 { 48381 fnArraySwitch( oSettings.aoFooter[i], iFrom, iTo ); 48382 } 48383 } 48384 48385 // Invalidate row cached data for sorting, filtering etc 48386 var api = new $.fn.DataTable.Api( oSettings ); 48387 api.rows().invalidate(); 48388 48389 /* 48390 * Update DataTables' event handlers 48391 */ 48392 48393 /* Sort listener */ 48394 for ( i=0, iLen=iCols ; i<iLen ; i++ ) 48395 { 48396 $(oSettings.aoColumns[i].nTh).off('click.DT'); 48397 this.oApi._fnSortAttachListener( oSettings, oSettings.aoColumns[i].nTh, i ); 48398 } 48399 48400 48401 /* Fire an event so other plug-ins can update */ 48402 $(oSettings.oInstance).trigger( 'column-reorder.dt', [ oSettings, { 48403 from: iFrom, 48404 to: iTo, 48405 mapping: aiInvertMapping, 48406 drop: drop, 48407 48408 // Old style parameters for compatibility 48409 iFrom: iFrom, 48410 iTo: iTo, 48411 aiInvertMapping: aiInvertMapping 48412 } ] ); 48413}; 48414 48415 48416/** 48417 * ColReorder provides column visibility control for DataTables 48418 * @class ColReorder 48419 * @constructor 48420 * @param {object} dt DataTables settings object 48421 * @param {object} opts ColReorder options 48422 */ 48423var ColReorder = function( dt, opts ) 48424{ 48425 var settings = new $.fn.DataTable.Api( dt ).settings()[0]; 48426 48427 // Ensure that we can't initialise on the same table twice 48428 if ( settings._colReorder ) { 48429 return settings._colReorder; 48430 } 48431 48432 // Allow the options to be a boolean for defaults 48433 if ( opts === true ) { 48434 opts = {}; 48435 } 48436 48437 // Convert from camelCase to Hungarian, just as DataTables does 48438 var camelToHungarian = $.fn.DataTable.camelToHungarian; 48439 if ( camelToHungarian ) { 48440 camelToHungarian( ColReorder.defaults, ColReorder.defaults, true ); 48441 camelToHungarian( ColReorder.defaults, opts || {} ); 48442 } 48443 48444 48445 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 48446 * Public class variables 48447 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 48448 48449 /** 48450 * @namespace Settings object which contains customisable information for ColReorder instance 48451 */ 48452 this.s = { 48453 /** 48454 * DataTables settings object 48455 * @property dt 48456 * @type Object 48457 * @default null 48458 */ 48459 "dt": null, 48460 48461 /** 48462 * Initialisation object used for this instance 48463 * @property init 48464 * @type object 48465 * @default {} 48466 */ 48467 "init": $.extend( true, {}, ColReorder.defaults, opts ), 48468 48469 /** 48470 * Number of columns to fix (not allow to be reordered) 48471 * @property fixed 48472 * @type int 48473 * @default 0 48474 */ 48475 "fixed": 0, 48476 48477 /** 48478 * Number of columns to fix counting from right (not allow to be reordered) 48479 * @property fixedRight 48480 * @type int 48481 * @default 0 48482 */ 48483 "fixedRight": 0, 48484 48485 /** 48486 * Callback function for once the reorder has been done 48487 * @property reorderCallback 48488 * @type function 48489 * @default null 48490 */ 48491 "reorderCallback": null, 48492 48493 /** 48494 * @namespace Information used for the mouse drag 48495 */ 48496 "mouse": { 48497 "startX": -1, 48498 "startY": -1, 48499 "offsetX": -1, 48500 "offsetY": -1, 48501 "target": -1, 48502 "targetIndex": -1, 48503 "fromIndex": -1 48504 }, 48505 48506 /** 48507 * Information which is used for positioning the insert cusor and knowing where to do the 48508 * insert. Array of objects with the properties: 48509 * x: x-axis position 48510 * to: insert point 48511 * @property aoTargets 48512 * @type array 48513 * @default [] 48514 */ 48515 "aoTargets": [] 48516 }; 48517 48518 48519 /** 48520 * @namespace Common and useful DOM elements for the class instance 48521 */ 48522 this.dom = { 48523 /** 48524 * Dragging element (the one the mouse is moving) 48525 * @property drag 48526 * @type element 48527 * @default null 48528 */ 48529 "drag": null, 48530 48531 /** 48532 * The insert cursor 48533 * @property pointer 48534 * @type element 48535 * @default null 48536 */ 48537 "pointer": null 48538 }; 48539 48540 48541 /* Constructor logic */ 48542 this.s.dt = settings; 48543 this.s.dt._colReorder = this; 48544 this._fnConstruct(); 48545 48546 return this; 48547}; 48548 48549 48550 48551$.extend( ColReorder.prototype, { 48552 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 48553 * Public methods 48554 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 48555 48556 /** 48557 * Reset the column ordering to the original ordering that was detected on 48558 * start up. 48559 * @return {this} Returns `this` for chaining. 48560 * 48561 * @example 48562 * // DataTables initialisation with ColReorder 48563 * var table = $('#example').dataTable( { 48564 * "sDom": 'Rlfrtip' 48565 * } ); 48566 * 48567 * // Add click event to a button to reset the ordering 48568 * $('#resetOrdering').click( function (e) { 48569 * e.preventDefault(); 48570 * $.fn.dataTable.ColReorder( table ).fnReset(); 48571 * } ); 48572 */ 48573 "fnReset": function () 48574 { 48575 this._fnOrderColumns( this.fnOrder() ); 48576 48577 return this; 48578 }, 48579 48580 /** 48581 * `Deprecated` - Get the current order of the columns, as an array.
48582 * @return {array} Array of column identifiers 48583 * @deprecated `fnOrder` should be used in preference to this method. 48584 * `fnOrder` acts as a getter/setter. 48585 */ 48586 "fnGetCurrentOrder": function () 48587 { 48588 return this.fnOrder(); 48589 }, 48590 48591 /** 48592 * Get the current order of the columns, as an array. Note that the values 48593 * given in the array are unique identifiers for each column. Currently 48594 * these are the original ordering of the columns that was detected on 48595 * start up, but this could potentially change in future. 48596 * @return {array} Array of column identifiers 48597 * 48598 * @example 48599 * // Get column ordering for the table 48600 * var order = $.fn.dataTable.ColReorder( dataTable ).fnOrder(); 48601 *//** 48602 * Set the order of the columns, from the positions identified in the 48603 * ordering array given. Note that ColReorder takes a brute force approach 48604 * to reordering, so it is possible multiple reordering events will occur 48605 * before the final order is settled upon. 48606 * @param {array} [set] Array of column identifiers in the new order. Note 48607 * that every column must be included, uniquely, in this array. 48608 * @return {this} Returns `this` for chaining. 48609 * 48610 * @example 48611 * // Swap the first and second columns 48612 * $.fn.dataTable.ColReorder( dataTable ).fnOrder( [1, 0, 2, 3, 4] ); 48613 * 48614 * @example 48615 * // Move the first column to the end for the table `#example` 48616 * var curr = $.fn.dataTable.ColReorder( '#example' ).fnOrder(); 48617 * var first = curr.shift(); 48618 * curr.push( first ); 48619 * $.fn.dataTable.ColReorder( '#example' ).fnOrder( curr ); 48620 * 48621 * @example 48622 * // Reverse the table's order 48623 * $.fn.dataTable.ColReorder( '#example' ).fnOrder( 48624 * $.fn.dataTable.ColReorder( '#example' ).fnOrder().reverse() 48625 * ); 48626 */ 48627 "fnOrder": function ( set, original ) 48628 { 48629 var a = [], i, ien, j, jen; 48630 var columns = this.s.dt.aoColumns; 48631 48632 if ( set === undefined ){ 48633 for ( i=0, ien=columns.length ; i<ien ; i++ ) { 48634 a.push( columns[i]._ColReorder_iOrigCol ); 48635 } 48636 48637 return a; 48638 } 48639 48640 // The order given is based on the original indexes, rather than the 48641 // existing ones, so we need to translate from the original to current 48642 // before then doing the order 48643 if ( original ) { 48644 var order = this.fnOrder(); 48645 48646 for ( i=0, ien=set.length ; i<ien ; i++ ) { 48647 a.push( $.inArray( set[i], order ) ); 48648 } 48649 48650 set = a; 48651 } 48652 48653 this._fnOrderColumns( fnInvertKeyValues( set ) ); 48654 48655 return this; 48656 }, 48657 48658 48659 /** 48660 * Convert from the original column index, to the original 48661 * 48662 * @param {int|array} idx Index(es) to convert 48663 * @param {string} dir Transpose direction - `fromOriginal` / `toCurrent` 48664 * or `'toOriginal` / `fromCurrent` 48665 * @return {int|array} Converted values 48666 */ 48667 fnTranspose: function ( idx, dir ) 48668 { 48669 if ( ! dir ) { 48670 dir = 'toCurrent'; 48671 } 48672 48673 var order = this.fnOrder(); 48674 var columns = this.s.dt.aoColumns; 48675 48676 if ( dir === 'toCurrent' ) { 48677 // Given an original index, want the current 48678 return ! $.isArray( idx ) ? 48679 $.inArray( idx, order ) : 48680 $.map( idx, function ( index ) { 48681 return $.inArray( index, order ); 48682 } ); 48683 } 48684 else { 48685 // Given a current index, want the original 48686 return ! $.isArray( idx ) ? 48687 columns[idx]._ColReorder_iOrigCol : 48688 $.map( idx, function ( index ) { 48689 return columns[index]._ColReorder_iOrigCol; 48690 } ); 48691 } 48692 }, 48693 48694 48695 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 48696 * Private methods (they are of course public in JS, but recommended as private) 48697 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 48698 48699 /** 48700 * Constructor logic 48701 * @method _fnConstruct 48702 * @returns void 48703 * @private 48704 */ 48705 "_fnConstruct": function () 48706 { 48707 var that = this; 48708 var iLen = this.s.dt.aoColumns.length; 48709 var table = this.s.dt.nTable; 48710 var i; 48711 48712 /* Columns discounted from reordering - counting left to right */ 48713 if ( this.s.init.iFixedColumns ) 48714 { 48715 this.s.fixed = this.s.init.iFixedColumns; 48716 } 48717 48718 if ( this.s.init.iFixedColumnsLeft ) 48719 { 48720 this.s.fixed = this.s.init.iFixedColumnsLeft; 48721 } 48722 48723 /* Columns discounted from reordering - counting right to left */ 48724 this.s.fixedRight = this.s.init.iFixedColumnsRight ? 48725 this.s.init.iFixedColumnsRight : 48726 0; 48727 48728 /* Drop callback initialisation option */ 48729 if ( this.s.init.fnReorderCallback ) 48730 { 48731 this.s.reorderCallback = this.s.init.fnReorderCallback; 48732 } 48733 48734 /* Add event handlers for the drag and drop, and also mark the original column order */ 48735 for ( i = 0; i < iLen; i++ ) 48736 { 48737 if ( i > this.s.fixed-1 && i < iLen - this.s.fixedRight ) 48738 { 48739 this._fnMouseListener( i, this.s.dt.aoColumns[i].nTh ); 48740 } 48741 48742 /* Mark the original column order for later reference */ 48743 this.s.dt.aoColumns[i]._ColReorder_iOrigCol = i; 48744 } 48745
48746 /* State saving */ 48747 this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) { 48748 that._fnStateSave.call( that, oData ); 48749 }, "ColReorder_State" ); 48750 48751 /* An initial column order has been specified */ 48752 var aiOrder = null; 48753 if ( this.s.init.aiOrder ) 48754 { 48755 aiOrder = this.s.init.aiOrder.slice(); 48756 } 48757 48758 /* State loading, overrides the column order given */ 48759 if ( this.s.dt.oLoadedState && typeof this.s.dt.oLoadedState.ColReorder != 'undefined' && 48760 this.s.dt.oLoadedState.ColReorder.length == this.s.dt.aoColumns.length ) 48761 { 48762 aiOrder = this.s.dt.oLoadedState.ColReorder; 48763 } 48764 48765 /* If we have an order to apply - do so */ 48766 if ( aiOrder ) 48767 { 48768 /* We might be called during or after the DataTables initialisation. If before, then we need 48769 * to wait until the draw is done, if after, then do what we need to do right away 48770 */ 48771 if ( !that.s.dt._bInitComplete ) 48772 { 48773 var bDone = false; 48774 $(table).on( 'draw.dt.colReorder', function () { 48775 if ( !that.s.dt._bInitComplete && !bDone ) 48776 { 48777 bDone = true; 48778 var resort = fnInvertKeyValues( aiOrder ); 48779 that._fnOrderColumns.call( that, resort ); 48780 } 48781 } ); 48782 } 48783 else 48784 { 48785 var resort = fnInvertKeyValues( aiOrder ); 48786 that._fnOrderColumns.call( that, resort ); 48787 } 48788 } 48789 else { 48790 this._fnSetColumnIndexes(); 48791 } 48792 48793 // Destroy clean up 48794 $(table).on( 'destroy.dt.colReorder', function () { 48795 $(table).off( 'destroy.dt.colReorder draw.dt.colReorder' ); 48796 $(that.s.dt.nTHead).find( '*' ).off( '.ColReorder' ); 48797 48798 $.each( that.s.dt.aoColumns, function (i, column) { 48799 $(column.nTh).removeAttr('data-column-index'); 48800 } ); 48801 48802 that.s.dt._colReorder = null; 48803 that.s = null; 48804 } ); 48805 }, 48806 48807 48808 /** 48809 * Set the column order from an array 48810 * @method _fnOrderColumns 48811 * @param array a An array of integers which dictate the column order that should be applied 48812 * @returns void 48813 * @private 48814 */ 48815 "_fnOrderColumns": function ( a ) 48816 { 48817 var changed = false; 48818 48819 if ( a.length != this.s.dt.aoColumns.length ) 48820 { 48821 this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "ColReorder - array reorder does not "+ 48822 "match known number of columns. Skipping." ); 48823 return; 48824 } 48825 48826 for ( var i=0, iLen=a.length ; i<iLen ; i++ ) 48827 { 48828 var currIndex = $.inArray( i, a ); 48829 if ( i != currIndex ) 48830 { 48831 /* Reorder our switching array */ 48832 fnArraySwitch( a, currIndex, i ); 48833 48834 /* Do the column reorder in the table */ 48835 this.s.dt.oInstance.fnColReorder( currIndex, i, true ); 48836 48837 changed = true; 48838 } 48839 } 48840 48841 this._fnSetColumnIndexes(); 48842 48843 // Has anything actually changed? If not, then nothing else to do 48844 if ( ! changed ) { 48845 return; 48846 } 48847 48848 /* When scrolling we need to recalculate the column sizes to allow for the shift */ 48849 if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" ) 48850 { 48851 this.s.dt.oInstance.fnAdjustColumnSizing( false ); 48852 } 48853 48854 /* Save the state */ 48855 this.s.dt.oInstance.oApi._fnSaveState( this.s.dt ); 48856 48857 if ( this.s.reorderCallback !== null ) 48858 { 48859 this.s.reorderCallback.call( this ); 48860 } 48861 }, 48862 48863 48864 /** 48865 * Because we change the indexes of columns in the table, relative to their starting point 48866 * we need to reorder the state columns to what they are at the starting point so we can 48867 * then rearrange them again on state load! 48868 * @method _fnStateSave 48869 * @param object oState DataTables state 48870 * @returns string JSON encoded cookie string for DataTables 48871 * @private 48872 */ 48873 "_fnStateSave": function ( oState ) 48874 { 48875 var i, iLen, aCopy, iOrigColumn; 48876 var oSettings = this.s.dt; 48877 var columns = oSettings.aoColumns; 48878 48879 oState.ColReorder = []; 48880 48881 /* Sorting */ 48882 if ( oState.aaSorting ) { 48883 // 1.10.0- 48884 for ( i=0 ; i<oState.aaSorting.length ; i++ ) { 48885 oState.aaSorting[i][0] = columns[ oState.aaSorting[i][0] ]._ColReorder_iOrigCol; 48886 } 48887 48888 var aSearchCopy = $.extend( true, [], oState.aoSearchCols ); 48889 48890 for ( i=0, iLen=columns.length ; i<iLen ; i++ ) 48891 { 48892 iOrigColumn = columns[i]._ColReorder_iOrigCol; 48893 48894 /* Column filter */ 48895 oState.aoSearchCols[ iOrigColumn ] = aSearchCopy[i]; 48896 48897 /* Visibility */ 48898 oState.abVisCols[ iOrigColumn ] = columns[i].bVisible; 48899 48900 /* Column reordering */ 48901 oState.ColReorder.push( iOrigColumn ); 48902 } 48903 } 48904 else if ( oState.order ) { 48905 // 1.10.1+ 48906 for ( i=0 ; i<oState.order.length ; i++ ) { 48907 oState.order[i][0] = columns[ oState.order[i][0] ]._ColReorder_iOrigCol; 48908 } 48909 48910 var stateColumnsCopy = $.extend( true, [], oState.columns ); 48911 48912 for ( i=0, iLen=columns.length ; i<iLen ; i++ ) 48913 { 48914 iOrigColumn = columns[i]._ColReorder_iOrigCol; 48915 48916 /* Columns */ 48917 oState.columns[ iOrigColumn ] = stateColumnsCopy[i]; 48918 48919 /* Column reordering */ 48920 oState.ColReorder.push( iOrigColumn ); 48921 } 48922 } 48923 }, 48924 48925 48926 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 48927 * Mouse drop and drag 48928 */ 48929 48930 /** 48931 * Add a mouse down listener to a particluar TH element 48932 * @method _fnMouseListener 48933 * @param int i Column index 48934 * @param element nTh TH element clicked on 48935 * @returns void 48936 * @private 48937 */ 48938 "_fnMouseListener": function ( i, nTh ) 48939 { 48940 var that = this; 48941 $(nTh).on( 'mousedown.ColReorder', function (e) { 48942 e.preventDefault(); 48943 that._fnMouseDown.call( that, e, nTh ); 48944 } ); 48945 }, 48946 48947 48948 /** 48949 * Mouse down on a TH element in the table header 48950 * @method _fnMouseDown 48951 * @param event e Mouse event 48952 * @param element nTh TH element to be dragged 48953 * @returns void 48954 * @private 48955 */ 48956 "_fnMouseDown": function ( e, nTh ) 48957 { 48958 var that = this; 48959 48960 /* Store information about the mouse position */ 48961 var target = $(e.target).closest('th, td'); 48962 var offset = target.offset(); 48963 var idx = parseInt( $(nTh).attr('data-column-index'), 10 ); 48964 48965 if ( idx === undefined ) { 48966 return; 48967 } 48968 48969 this.s.mouse.startX = e.pageX; 48970 this.s.mouse.startY = e.pageY; 48971 this.s.mouse.offsetX = e.pageX - offset.left; 48972 this.s.mouse.offsetY = e.pageY - offset.top; 48973 this.s.mouse.target = this.s.dt.aoColumns[ idx ].nTh;//target[0]; 48974 this.s.mouse.targetIndex = idx; 48975 this.s.mouse.fromIndex = idx; 48976 48977 this._fnRegions(); 48978 48979 /* Add event handlers to the document */ 48980 $(document) 48981 .on( 'mousemove.ColReorder', function (e) { 48982 that._fnMouseMove.call( that, e ); 48983 } ) 48984 .on( 'mouseup.ColReorder', function (e) { 48985 that._fnMouseUp.call( that, e ); 48986 } ); 48987 }, 48988 48989 48990 /** 48991 * Deal with a mouse move event while dragging a node 48992 * @method _fnMouseMove 48993 * @param event e Mouse event 48994 * @returns void 48995 * @private 48996 */ 48997 "_fnMouseMove": function ( e ) 48998 { 48999 var that = this; 49000 49001 if ( this.dom.drag === null ) 49002 { 49003 /* Only create the drag element if the mouse has moved a specific distance from the start 49004 * point - this allows the user to make small mouse movements when sorting and not have a 49005 * possibly confusing drag element showing up 49006 */ 49007 if ( Math.pow( 49008 Math.pow(e.pageX - this.s.mouse.startX, 2) + 49009 Math.pow(e.pageY - this.s.mouse.startY, 2), 0.5 ) < 5 ) 49010 { 49011 return; 49012 } 49013 this._fnCreateDragNode(); 49014 } 49015 49016 /* Position the element - we respect where in the element the click occured */ 49017 this.dom.drag.css( { 49018 left: e.pageX - this.s.mouse.offsetX, 49019 top: e.pageY - this.s.mouse.offsetY 49020 } ); 49021 49022 /* Based on the current mouse position, calculate where the insert should go */ 49023 var bSet = false;
49024 var lastToIndex = this.s.mouse.toIndex; 49025 49026 for ( var i=1, iLen=this.s.aoTargets.length ; i<iLen ; i++ ) 49027 { 49028 if ( e.pageX < this.s.aoTargets[i-1].x + ((this.s.aoTargets[i].x-this.s.aoTargets[i-1].x)/2) ) 49029 { 49030 this.dom.pointer.css( 'left', this.s.aoTargets[i-1].x ); 49031 this.s.mouse.toIndex = this.s.aoTargets[i-1].to; 49032 bSet = true; 49033 break; 49034 } 49035 } 49036 49037 // The insert element wasn't positioned in the array (less than 49038 // operator), so we put it at the end 49039 if ( !bSet ) 49040 { 49041 this.dom.pointer.css( 'left', this.s.aoTargets[this.s.aoTargets.length-1].x ); 49042 this.s.mouse.toIndex = this.s.aoTargets[this.s.aoTargets.length-1].to; 49043 } 49044 49045 // Perform reordering if realtime updating is on and the column has moved 49046 if ( this.s.init.bRealtime && lastToIndex !== this.s.mouse.toIndex ) { 49047 this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex, false ); 49048 this.s.mouse.fromIndex = this.s.mouse.toIndex; 49049 this._fnRegions(); 49050 } 49051 }, 49052 49053 49054 /** 49055 * Finish off the mouse drag and insert the column where needed 49056 * @method _fnMouseUp 49057 * @param event e Mouse event 49058 * @returns void 49059 * @private 49060 */ 49061 "_fnMouseUp": function ( e ) 49062 { 49063 var that = this; 49064 49065 $(document).off( 'mousemove.ColReorder mouseup.ColReorder' ); 49066 49067 if ( this.dom.drag !== null ) 49068 { 49069 /* Remove the guide elements */ 49070 this.dom.drag.remove(); 49071 this.dom.pointer.remove(); 49072 this.dom.drag = null; 49073 this.dom.pointer = null; 49074 49075 /* Actually do the reorder */ 49076 this.s.dt.oInstance.fnColReorder( this.s.mouse.fromIndex, this.s.mouse.toIndex, true ); 49077 this._fnSetColumnIndexes(); 49078 49079 /* When scrolling we need to recalculate the column sizes to allow for the shift */ 49080 if ( this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== "" ) 49081 { 49082 this.s.dt.oInstance.fnAdjustColumnSizing( false ); 49083 } 49084 49085 /* Save the state */ 49086 this.s.dt.oInstance.oApi._fnSaveState( this.s.dt ); 49087 49088 if ( this.s.reorderCallback !== null ) 49089 { 49090 this.s.reorderCallback.call( this ); 49091 } 49092 } 49093 }, 49094 49095 49096 /** 49097 * Calculate a cached array with the points of the column inserts, and the 49098 * 'to' points 49099 * @method _fnRegions 49100 * @returns void 49101 * @private 49102 */ 49103 "_fnRegions": function () 49104 { 49105 var aoColumns = this.s.dt.aoColumns; 49106 49107 this.s.aoTargets.splice( 0, this.s.aoTargets.length ); 49108 49109 this.s.aoTargets.push( { 49110 "x": $(this.s.dt.nTable).offset().left, 49111 "to": 0 49112 } ); 49113 49114 var iToPoint = 0; 49115 var total = $(aoColumns[0].nTh).offset().left; // Offset of the first column 49116 49117 for ( var i=0, iLen=aoColumns.length ; i<iLen ; i++ ) 49118 { 49119 /* For the column / header in question, we want it's position to remain the same if the 49120 * position is just to it's immediate left or right, so we only increment the counter for 49121 * other columns 49122 */ 49123 if ( i != this.s.mouse.fromIndex ) 49124 { 49125 iToPoint++; 49126 } 49127 49128 if ( aoColumns[i].bVisible ) 49129 { 49130 total += $(aoColumns[i].nTh).outerWidth(); 49131 49132 this.s.aoTargets.push( { 49133 "x": total, 49134 "to": iToPoint 49135 } ); 49136 } 49137 } 49138 49139 /* Disallow columns for being reordered by drag and drop, counting right to left */ 49140 if ( this.s.fixedRight !== 0 ) 49141 { 49142 this.s.aoTargets.splice( this.s.aoTargets.length - this.s.fixedRight ); 49143 } 49144 49145 /* Disallow columns for being reordered by drag and drop, counting left to right */ 49146 if ( this.s.fixed !== 0 ) 49147 { 49148 this.s.aoTargets.splice( 0, this.s.fixed ); 49149 } 49150 }, 49151 49152 49153 /** 49154 * Copy the TH element that is being drags so the user has the idea that they are actually 49155 * moving it around the page. 49156 * @method _fnCreateDragNode 49157 * @returns void 49158 * @private 49159 */ 49160 "_fnCreateDragNode": function () 49161 { 49162 var scrolling = this.s.dt.oScroll.sX !== "" || this.s.dt.oScroll.sY !== ""; 49163 49164 var origCell = this.s.dt.aoColumns[ this.s.mouse.targetIndex ].nTh; 49165 var origTr = origCell.parentNode; 49166 var origThead = origTr.parentNode; 49167 var origTable = origThead.parentNode; 49168 var cloneCell = $(origCell).clone(); 49169 49170 // This is a slightly odd combination of jQuery and DOM, but it is the 49171 // fastest and least resource intensive way I could think of cloning 49172 // the table with just a single header cell in it. 49173 this.dom.drag = $(origTable.cloneNode(false)) 49174 .addClass( 'DTCR_clonedTable' ) 49175 .append( 49176 $(origThead.cloneNode(false)).append( 49177 $(origTr.cloneNode(false)).append( 49178 cloneCell[0] 49179 ) 49180 ) 49181 ) 49182 .css( { 49183 position: 'absolute', 49184 top: 0, 49185 left: 0, 49186 width: $(origCell).outerWidth(), 49187 height: $(origCell).outerHeight() 49188 } ) 49189 .appendTo( 'body' ); 49190
49191 this.dom.pointer = $('<div></div>') 49192 .addClass( 'DTCR_pointer' ) 49193 .css( { 49194 position: 'absolute', 49195 top: scrolling ? 49196 $('div.dataTables_scroll', this.s.dt.nTableWrapper).offset().top : 49197 $(this.s.dt.nTable).offset().top, 49198 height : scrolling ? 49199 $('div.dataTables_scroll', this.s.dt.nTableWrapper).height() : 49200 $(this.s.dt.nTable).height() 49201 } ) 49202 .appendTo( 'body' ); 49203 }, 49204 49205 49206 /** 49207 * Add a data attribute to the column headers, so we know the index of 49208 * the row to be reordered. This allows fast detection of the index, and 49209 * for this plug-in to work with FixedHeader which clones the nodes. 49210 * @private 49211 */ 49212 "_fnSetColumnIndexes": function () 49213 { 49214 $.each( this.s.dt.aoColumns, function (i, column) { 49215 $(column.nTh).attr('data-column-index', i); 49216 } ); 49217 } 49218} ); 49219 49220 49221 49222 49223 49224/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 49225 * Static parameters 49226 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 49227 49228 49229/** 49230 * ColReorder default settings for initialisation 49231 * @namespace 49232 * @static 49233 */ 49234ColReorder.defaults = { 49235 /** 49236 * Predefined ordering for the columns that will be applied automatically 49237 * on initialisation. If not specified then the order that the columns are 49238 * found to be in the HTML is the order used. 49239 * @type array 49240 * @default null 49241 * @static 49242 */ 49243 aiOrder: null, 49244 49245 /** 49246 * Redraw the table's column ordering as the end user draws the column 49247 * (`true`) or wait until the mouse is released (`false` - default). Note 49248 * that this will perform a redraw on each reordering, which involves an 49249 * Ajax request each time if you are using server-side processing in 49250 * DataTables. 49251 * @type boolean 49252 * @default false 49253 * @static 49254 */ 49255 bRealtime: true, 49256 49257 /** 49258 * Indicate how many columns should be fixed in position (counting from the 49259 * left). This will typically be 1 if used, but can be as high as you like. 49260 * @type int 49261 * @default 0 49262 * @static 49263 */ 49264 iFixedColumnsLeft: 0, 49265 49266 /** 49267 * As `iFixedColumnsRight` but counting from the right. 49268 * @type int 49269 * @default 0 49270 * @static 49271 */ 49272 iFixedColumnsRight: 0, 49273 49274 /** 49275 * Callback function that is fired when columns are reordered. The `column- 49276 * reorder` event is preferred over this callback 49277 * @type function():void 49278 * @default null 49279 * @static 49280 */ 49281 fnReorderCallback: null 49282}; 49283 49284 49285 49286/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 49287 * Constants 49288 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 49289 49290/** 49291 * ColReorder version 49292 * @constant version 49293 * @type String 49294 * @default As code 49295 */ 49296ColReorder.version = "1.3.0"; 49297 49298 49299 49300/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 49301 * DataTables interfaces 49302 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ 49303 49304// Expose 49305$.fn.dataTable.ColReorder = ColReorder; 49306$.fn.DataTable.ColReorder = ColReorder; 49307 49308 49309// Register a new feature with DataTables 49310if ( typeof $.fn.dataTable == "function" && 49311 typeof $.fn.dataTableExt.fnVersionCheck == "function" && 49312 $.fn.dataTableExt.fnVersionCheck('1.10.8') ) 49313{ 49314 $.fn.dataTableExt.aoFeatures.push( { 49315 "fnInit": function( settings ) { 49316 var table = settings.oInstance; 49317 49318 if ( ! settings._colReorder ) { 49319 var dtInit = settings.oInit; 49320 var opts = dtInit.colReorder || dtInit.oColReorder || {}; 49321 49322 new ColReorder( settings, opts ); 49323 } 49324 else { 49325 table.oApi._fnLog( settings, 1, "ColReorder attempted to initialise twice. Ignoring second" ); 49326 } 49327 49328 return null; /* No node for DataTables to insert */ 49329 }, 49330 "cFeature": "R", 49331 "sFeature": "ColReorder" 49332 } ); 49333} 49334else { 49335 alert( "Warning: ColReorder requires DataTables 1.10.8 or greater - www.datatables.net/download"); 49336} 49337 49338 49339// Attach a listener to the document which listens for DataTables initialisation 49340// events so we can automatically initialise 49341$(document).on( 'preInit.dt.colReorder', function (e, settings) { 49342 if ( e.namespace !== 'dt' ) { 49343 return; 49344 } 49345 49346 var init = settings.oInit.colReorder; 49347 var defaults = DataTable.defaults.colReorder; 49348 49349 if ( init || defaults ) { 49350 var opts = $.extend( {}, init, defaults ); 49351 49352 if ( init !== false ) { 49353 new ColReorder( settings, opts ); 49354 } 49355 } 49356} ); 49357 49358 49359// API augmentation 49360$.fn.DataTable.Api.register( 'colReorder.reset()', function () { 49361 return this.iterator( 'table', function ( ctx ) { 49362 ctx._colReorder.fnReset(); 49363 } ); 49364} ); 49365 49366$.fn.DataTable.Api.register( 'colReorder.order()', function ( set, original ) { 49367 if ( set ) { 49368 return this.iterator( 'table', function ( ctx ) { 49369 ctx._colReorder.fnOrder( set, original ); 49370 } ); 49371 } 49372 49373 return this.context.length ? 49374 this.context[0]._colReorder.fnOrder() : 49375 null; 49376} ); 49377 49378$.fn.DataTable.Api.register( 'colReorder.transpose()', function ( idx, dir ) { 49379 return this.context.length && this.context[0]._colReorder ? 49380 this.context[0]._colReorder.fnTranspose( idx, dir ) : 49381 idx; 49382} ); 49383 49384 49385return ColReorder; 49386})); 49387/*! Buttons for DataTables 1.1.0 49388 * ©2015 SpryMedia Ltd - datatables.net/license 49389 */ 49390 49391(function( factory ){ 49392 if ( typeof define === 'function' && define.amd ) { 49393 // AMD 49394 define( ['jquery', 'datatables.net'], function ( $ ) { 49395 return factory( $, window, document ); 49396 } ); 49397 } 49398 else if ( typeof exports === 'object' ) { 49399 // CommonJS 49400 module.exports = function (root, $) { 49401 if ( ! root ) { 49402 root = window; 49403 } 49404 49405 if ( ! $ || ! $.fn.dataTable ) { 49406 $ = require('datatables.net')(root, $).$; 49407 } 49408 49409 return factory( $, root, root.document ); 49410 }; 49411 } 49412 else { 49413 // Browser 49414 factory( jQuery, window, document ); 49415 } 49416}(function( $, window, document, undefined ) { 49417'use strict'; 49418var DataTable = $.fn.dataTable; 49419 49420 49421// Used for namespacing events added to the document by each instance, so they 49422// can be removed on destroy 49423var _instCounter = 0; 49424 49425// Button namespacing counter for namespacing events on individual buttons 49426var _buttonCounter = 0; 49427 49428var _dtButtons = DataTable.ext.buttons; 49429 49430/** 49431 * [Buttons description] 49432 * @param {[type]} 49433 * @param {[type]} 49434 */ 49435var Buttons = function( dt, config ) 49436{ 49437 // Allow a boolean true for defaults 49438 if ( config === true ) { 49439 config = {}; 49440 } 49441 49442 // For easy configuration of buttons an array can be given 49443 if ( $.isArray( config ) ) { 49444 config = { buttons: config }; 49445 } 49446 49447 this.c = $.extend( true, {}, Buttons.defaults, config ); 49448 49449 // Don't want a deep copy for the buttons 49450 if ( config.buttons ) { 49451 this.c.buttons = config.buttons; 49452 } 49453 49454 this.s = { 49455 dt: new DataTable.Api( dt ), 49456 buttons: [], 49457 subButtons: [], 49458 listenKeys: '', 49459 namespace: 'dtb'+(_instCounter++) 49460 }; 49461 49462 this.dom = { 49463 container: $('<'+this.c.dom.container.tag+'/>') 49464 .addClass( this.c.dom.container.className ) 49465 }; 49466 49467 this._constructor(); 49468}; 49469 49470 49471$.extend( Buttons.prototype, { 49472 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 49473 * Public methods 49474 */ 49475 49476 /** 49477 * Get the action of a button 49478 * @param {int|string} Button index 49479 * @return {function} 49480 *//** 49481 * Set the action of a button 49482 * @param {int|string} Button index 49483 * @param {function} Function to set 49484 * @return {Buttons} Self for chaining 49485 */ 49486 action: function ( idx, action ) 49487 { 49488 var button = this._indexToButton( idx ).conf; 49489 49490 if ( action === undefined ) { 49491 return button.action; 49492 } 49493 49494 button.action = action; 49495 49496 return this; 49497 }, 49498 49499 /** 49500 * Add an active class to the button to make to look active 49501 * @param {int|string} Button index 49502 * @param {boolean} [flag=true] Enable / disable flag 49503 * @return {Buttons} Self for chaining 49504 */ 49505 active: function ( idx, flag ) { 49506 var button = this._indexToButton( idx ); 49507 button.node.toggleClass( 49508 this.c.dom.button.active, 49509 flag === undefined ? true : flag 49510 ); 49511 49512 return this; 49513 }, 49514 49515 /** 49516 * Add a new button 49517 * @param {int|string} Button index for where to insert the button 49518 * @param {object} Button configuration object, base string name or function 49519 * @return {Buttons} Self for chaining 49520 */ 49521 add: function ( idx, config ) 49522 { 49523 if ( typeof idx === 'string' && idx.indexOf('-') !== -1 ) { 49524 var idxs = idx.split('-'); 49525 this.c.buttons[idxs[0]*1].buttons.splice( idxs[1]*1, 0, config ); 49526 } 49527 else { 49528 this.c.buttons.splice( idx*1, 0, config ); 49529 } 49530 49531 this.dom.container.empty(); 49532 this._buildButtons( this.c.buttons ); 49533 49534 return this; 49535 }, 49536 49537 /** 49538 * Get the container node for the buttons 49539 * @return {jQuery} Buttons node 49540 */ 49541 container: function () 49542 { 49543 return this.dom.container; 49544 }, 49545 49546 /** 49547 * Disable a button 49548 * @param {int|string} Button index 49549 * @return {Buttons} Self for chaining 49550 */ 49551 disable: function ( idx ) { 49552 var button = this._indexToButton( idx ); 49553 button.node.addClass( this.c.dom.button.disabled ); 49554 49555 return this; 49556 }, 49557 49558 /** 49559 * Destroy the instance, cleaning up event handlers and removing DOM 49560 * elements 49561 * @return {Buttons} Self for chaining 49562 */ 49563 destroy: function () 49564 { 49565 // Key event listener 49566 $('body').off( 'keyup.'+this.s.namespace ); 49567 49568 // Individual button destroy (so they can remove their own events if 49569 // needed 49570 var buttons = this.s.buttons; 49571 var subButtons = this.s.subButtons; 49572 var i, ien, j, jen; 49573 49574 for ( i=0, ien=buttons.length ; i<ien ; i++ ) { 49575 this.removePrep( i ); 49576 49577 for ( j=0, jen=subButtons[i].length ; j<jen ; j++ ) { 49578 this.removePrep( i+'-'+j ); 49579 } 49580 } 49581 49582 this.removeCommit(); 49583 49584 // Container 49585 this.dom.container.remove(); 49586
49587 // Remove from the settings object collection 49588 var buttonInsts = this.s.dt.settings()[0]; 49589 49590 for ( i=0, ien=buttonInsts.length ; i<ien ; i++ ) { 49591 if ( buttonInsts.inst === this ) { 49592 buttonInsts.splice( i, 1 ); 49593 break; 49594 } 49595 } 49596 49597 return this; 49598 }, 49599 49600 /** 49601 * Enable / disable a button 49602 * @param {int|string} Button index 49603 * @param {boolean} [flag=true] Enable / disable flag 49604 * @return {Buttons} Self for chaining 49605 */ 49606 enable: function ( idx, flag ) 49607 { 49608 if ( flag === false ) { 49609 return this.disable( idx ); 49610 } 49611 49612 var button = this._indexToButton( idx ); 49613 button.node.removeClass( this.c.dom.button.disabled ); 49614 49615 return this; 49616 }, 49617 49618 /** 49619 * Get the instance name for the button set selector 49620 * @return {string} Instance name 49621 */ 49622 name: function () 49623 { 49624 return this.c.name; 49625 }, 49626 49627 /** 49628 * Get a button's node 49629 * @param {int|string} Button index 49630 * @return {jQuery} Button element 49631 */ 49632 node: function ( idx ) 49633 { 49634 var button = this._indexToButton( idx ); 49635 return button.node; 49636 }, 49637 49638 /** 49639 * Tidy up any buttons that have been scheduled for removal. This is 49640 * required so multiple buttons can be removed without upsetting the button 49641 * indexes while removing them. 49642 * @param {int|string} Button index 49643 * @return {Buttons} Self for chaining 49644 */ 49645 removeCommit: function () 49646 { 49647 var buttons = this.s.buttons; 49648 var subButtons = this.s.subButtons; 49649 var i, ien, j; 49650 49651 for ( i=buttons.length-1 ; i>=0 ; i-- ) { 49652 if ( buttons[i] === null ) { 49653 buttons.splice( i, 1 ); 49654 subButtons.splice( i, 1 ); 49655 this.c.buttons.splice( i, 1 ); 49656 } 49657 } 49658 49659 for ( i=0, ien=subButtons.length ; i<ien ; i++ ) { 49660 for ( j=subButtons[i].length-1 ; j>=0 ; j-- ) { 49661 if ( subButtons[i][j] === null ) { 49662 subButtons[i].splice( j, 1 ); 49663 this.c.buttons[i].buttons.splice( j, 1 ); 49664 } 49665 } 49666 } 49667 49668 return this; 49669 }, 49670 49671 /** 49672 * Scheduled a button for removal. This is required so multiple buttons can 49673 * be removed without upsetting the button indexes while removing them. 49674 * @return {Buttons} Self for chaining 49675 */ 49676 removePrep: function ( idx ) 49677 { 49678 var button; 49679 var dt = this.s.dt; 49680 49681 if ( typeof idx === 'number' || idx.indexOf('-') === -1 ) { 49682 // Top level button 49683 button = this.s.buttons[ idx*1 ]; 49684 49685 if ( button.conf.destroy ) { 49686 button.conf.destroy.call( dt.button(idx), dt, button, button.conf ); 49687 } 49688 49689 button.node.remove(); 49690 this._removeKey( button.conf ); 49691 this.s.buttons[ idx*1 ] = null; 49692 } 49693 else { 49694 // Collection button 49695 var idxs = idx.split('-'); 49696 button = this.s.subButtons[ idxs[0]*1 ][ idxs[1]*1 ]; 49697 49698 if ( button.conf.destroy ) { 49699 button.conf.destroy.call( dt.button(idx), dt, button, button.conf ); 49700 } 49701 49702 button.node.remove(); 49703 this._removeKey( button.conf ); 49704 this.s.subButtons[ idxs[0]*1 ][ idxs[1]*1 ] = null; 49705 } 49706 49707 return this; 49708 }, 49709 49710 /** 49711 * Get the text for a button 49712 * @param {int|string} Button index 49713 * @return {string} Button text 49714 *//** 49715 * Set the text for a button 49716 * @param {int|string|function} Button index 49717 * @param {string} Text 49718 * @return {Buttons} Self for chaining 49719 */ 49720 text: function ( idx, label ) 49721 { 49722 var button = this._indexToButton( idx ); 49723 var buttonLiner = this.c.dom.collection.buttonLiner; 49724 var linerTag = typeof idx === 'string' && idx.indexOf( '-' ) !== -1 && buttonLiner && buttonLiner.tag ? 49725 buttonLiner.tag : 49726 this.c.dom.buttonLiner.tag; 49727 var dt = this.s.dt; 49728 var text = function ( opt ) { 49729 return typeof opt === 'function' ? 49730 opt( dt, button.node, button.conf ) : 49731 opt; 49732 }; 49733 49734 if ( label === undefined ) { 49735 return text( button.conf.text ); 49736 } 49737 49738 button.conf.text = label; 49739 49740 if ( linerTag ) { 49741 button.node.children( linerTag ).html( text(label) ); 49742 } 49743 else { 49744 button.node.html( text(label) ); 49745 } 49746 49747 return this; 49748 }, 49749 49750 /** 49751 * Calculate button index from a node 49752 * @param {node} Button node (_not_ a jQuery object) 49753 * @return {string} Index. Undefined if not found 49754 */ 49755 toIndex: function ( node ) 49756 { 49757 var i, ien, j, jen; 49758 var buttons = this.s.buttons; 49759 var subButtons = this.s.subButtons; 49760 49761 // Loop the main buttons first 49762 for ( i=0, ien=buttons.length ; i<ien ; i++ ) { 49763 if ( buttons[i].node[0] === node ) { 49764 return i+''; 49765 } 49766 } 49767 49768 // Then the sub-buttons 49769 for ( i=0, ien=subButtons.length ; i<ien ; i++ ) { 49770 for ( j=0, jen=subButtons[i].length ; j<jen ; j++ ) { 49771 if ( subButtons[i][j].node[0] === node ) { 49772 return i+'-'+j; 49773 } 49774 } 49775 } 49776 }, 49777 49778 49779 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 49780 * Constructor 49781 */ 49782 49783 /** 49784 * Buttons constructor 49785 * @private 49786 */ 49787 _constructor: function () 49788 { 49789 var that = this; 49790 var dt = this.s.dt; 49791 var dtSettings = dt.settings()[0]; 49792 49793 if ( ! dtSettings._buttons ) { 49794 dtSettings._buttons = []; 49795 } 49796 49797 dtSettings._buttons.push( { 49798 inst: this, 49799 name: this.c.name 49800 } ); 49801 49802 this._buildButtons( this.c.buttons ); 49803 49804 dt.on( 'destroy', function () { 49805 that.destroy(); 49806 } ); 49807 49808 // Global key event binding to listen for button keys 49809 $('body').on( 'keyup.'+this.s.namespace, function ( e ) { 49810 if ( ! document.activeElement || document.activeElement === document.body ) { 49811 // SUse a string of characters for fast lookup of if we need to 49812 // handle this 49813 var character = String.fromCharCode(e.keyCode).toLowerCase(); 49814 49815 if ( that.s.listenKeys.toLowerCase().indexOf( character ) !== -1 ) { 49816 that._keypress( character, e ); 49817 } 49818 } 49819 } ); 49820 }, 49821 49822 49823 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 49824 * Private methods 49825 */ 49826 49827 /** 49828 * Add a new button to the key press listener 49829 * @param {object} Resolved button configuration object 49830 * @private 49831 */ 49832 _addKey: function ( conf ) 49833 { 49834 if ( conf.key ) { 49835 this.s.listenKeys += $.isPlainObject( conf.key ) ? 49836 conf.key.key : 49837 conf.key; 49838 } 49839 }, 49840 49841 /** 49842 * Create buttons from an array of buttons 49843 * @param {array} Buttons to create 49844 * @param {jQuery} Container node into which the created button should be 49845 * inserted. 49846 * @param {int} Counter for sub-buttons to be stored in a collection 49847 * @private 49848 */ 49849 _buildButtons: function ( buttons, container, collectionCounter ) 49850 { 49851 var dt = this.s.dt; 49852 49853 if ( ! container ) { 49854 container = this.dom.container; 49855 this.s.buttons = []; 49856 this.s.subButtons = []; 49857 } 49858 49859 for ( var i=0, ien=buttons.length ; i<ien ; i++ ) { 49860 var conf = this._resolveExtends( buttons[i] ); 49861 49862 if ( ! conf ) { 49863 continue; 49864 } 49865 49866 // If the configuration is an array, then expand the buttons at this 49867 // point 49868 if ( $.isArray( conf ) ) { 49869 this._buildButtons( conf, container, collectionCounter ); 49870 continue; 49871 } 49872 49873 var button = this._buildButton( 49874 conf, 49875 collectionCounter!==undefined ? true : false 49876 ); 49877 49878 if ( ! button ) { 49879 continue; 49880 } 49881 49882 var buttonNode = button.node; 49883 container.append( button.inserter ); 49884 49885 if ( collectionCounter === undefined ) { 49886 this.s.buttons.push( { 49887 node: buttonNode, 49888 conf: conf, 49889 inserter: button.inserter 49890 } ); 49891 this.s.subButtons.push( [] ); 49892 } 49893 else { 49894 this.s.subButtons[ collectionCounter ].push( { 49895 node: buttonNode, 49896 conf: conf, 49897 inserter: button.inserter 49898 } ); 49899 } 49900 49901 if ( conf.buttons ) { 49902 var collectionDom = this.c.dom.collection;
49903 conf._collection = $('<'+collectionDom.tag+'/>') 49904 .addClass( collectionDom.className ); 49905 49906 this._buildButtons( conf.buttons, conf._collection, i ); 49907 } 49908 49909 // init call is made here, rather than buildButton as it needs to 49910 // have been added to the buttons / subButtons array first 49911 if ( conf.init ) { 49912 conf.init.call( dt.button( buttonNode ), dt, buttonNode, conf ); 49913 } 49914 } 49915 }, 49916 49917 /** 49918 * Create an individual button 49919 * @param {object} config Resolved button configuration 49920 * @param {boolean} collectionButton `true` if a collection button 49921 * @return {jQuery} Created button node (jQuery) 49922 * @private 49923 */ 49924 _buildButton: function ( config, collectionButton ) 49925 { 49926 var that = this; 49927 var buttonDom = this.c.dom.button; 49928 var linerDom = this.c.dom.buttonLiner; 49929 var collectionDom = this.c.dom.collection; 49930 var dt = this.s.dt; 49931 var text = function ( opt ) { 49932 return typeof opt === 'function' ? 49933 opt( dt, button, config ) : 49934 opt; 49935 }; 49936 49937 if ( collectionButton && collectionDom.button ) { 49938 buttonDom = collectionDom.button; 49939 } 49940 49941 if ( collectionButton && collectionDom.buttonLiner ) { 49942 linerDom = collectionDom.buttonLiner; 49943 } 49944 49945 // Make sure that the button is available based on whatever requirements 49946 // it has. For example, Flash buttons require Flash 49947 if ( config.available && ! config.available( dt, config ) ) { 49948 return false; 49949 } 49950 49951 var button = $('<'+buttonDom.tag+'/>') 49952 .addClass( buttonDom.className ) 49953 .attr( 'tabindex', this.s.dt.settings()[0].iTabIndex ) 49954 .attr( 'aria-controls', this.s.dt.table().node().id ) 49955 .on( 'click.dtb', function (e) { 49956 e.preventDefault(); 49957 49958 if ( ! button.hasClass( buttonDom.disabled ) && config.action ) { 49959 config.action.call( dt.button( button ), e, dt, button, config ); 49960 } 49961 49962 button.blur(); 49963 } ) 49964 .on( 'keyup.dtb', function (e) { 49965 if ( e.keyCode === 13 ) { 49966 if ( ! button.hasClass( buttonDom.disabled ) && config.action ) { 49967 config.action.call( dt.button( button ), e, dt, button, config ); 49968 } 49969 } 49970 } ); 49971 49972 if ( linerDom.tag ) { 49973 button.append( 49974 $('<'+linerDom.tag+'/>') 49975 .html( text( config.text ) ) 49976 .addClass( linerDom.className ) 49977 ); 49978 } 49979 else { 49980 button.html( text( config.text ) ); 49981 } 49982 49983 if ( config.enabled === false ) { 49984 button.addClass( buttonDom.disabled ); 49985 } 49986 49987 if ( config.className ) { 49988 button.addClass( config.className ); 49989 } 49990 49991 if ( config.titleAttr ) { 49992 button.attr( 'title', config.titleAttr ); 49993 } 49994 49995 if ( ! config.namespace ) { 49996 config.namespace = '.dt-button-'+(_buttonCounter++); 49997 } 49998 49999 var buttonContainer = this.c.dom.buttonContainer; 50000 var inserter; 50001 if ( buttonContainer ) { 50002 inserter = $('<'+buttonContainer.tag+'/>') 50003 .addClass( buttonContainer.className ) 50004 .append( button ); 50005 } 50006 else { 50007 inserter = button; 50008 } 50009 50010 this._addKey( config ); 50011 50012 return { 50013 node: button, 50014 inserter: inserter 50015 }; 50016 }, 50017 50018 /** 50019 * Get a button's host information from a button index 50020 * @param {int|string} Button index 50021 * @return {object} Button information - object contains `node` and `conf` 50022 * properties 50023 * @private 50024 */ 50025 _indexToButton: function ( idx ) 50026 { 50027 if ( typeof idx === 'number' || idx.indexOf('-') === -1 ) { 50028 return this.s.buttons[ idx*1 ]; 50029 } 50030 50031 var idxs = idx.split('-'); 50032 return this.s.subButtons[ idxs[0]*1 ][ idxs[1]*1 ]; 50033 }, 50034 50035 /** 50036 * Handle a key press - determine if any button's key configured matches 50037 * what was typed and trigger the action if so. 50038 * @param {string} The character pressed 50039 * @param {object} Key event that triggered this call 50040 * @private 50041 */ 50042 _keypress: function ( character, e ) 50043 { 50044 var i, ien, j, jen; 50045 var buttons = this.s.buttons; 50046 var subButtons = this.s.subButtons; 50047 var run = function ( conf, node ) { 50048 if ( ! conf.key ) { 50049 return; 50050 } 50051 50052 if ( conf.key === character ) { 50053 node.click(); 50054 } 50055 else if ( $.isPlainObject( conf.key ) ) { 50056 if ( conf.key.key !== character ) { 50057 return; 50058 } 50059 50060 if ( conf.key.shiftKey && ! e.shiftKey ) { 50061 return; 50062 } 50063 50064 if ( conf.key.altKey && ! e.altKey ) { 50065 return; 50066 } 50067 50068 if ( conf.key.ctrlKey && ! e.ctrlKey ) { 50069 return; 50070 } 50071 50072 if ( conf.key.metaKey && ! e.metaKey ) { 50073 return; 50074 } 50075 50076 // Made it this far - it is good 50077 node.click(); 50078 } 50079 }; 50080 50081 // Loop the main buttons first 50082 for ( i=0, ien=buttons.length ; i<ien ; i++ ) { 50083 run( buttons[i].conf, buttons[i].node ); 50084 } 50085 50086 // Then the sub-buttons 50087 for ( i=0, ien=subButtons.length ; i<ien ; i++ ) { 50088 for ( j=0, jen=subButtons[i].length ; j<jen ; j++ ) { 50089 run( subButtons[i][j].conf, subButtons[i][j].node ); 50090 } 50091 } 50092 }, 50093 50094 /** 50095 * Remove a key from the key listener for this instance (to be used when a 50096 * button is removed) 50097 * @param {object} Button configuration 50098 */ 50099 _removeKey: function ( conf ) 50100 { 50101 if ( conf.key ) { 50102 var character = $.isPlainObject( conf.key ) ? 50103 conf.key.key : 50104 conf.key; 50105 50106 // Remove only one character, as multiple buttons could have the 50107 // same listening key 50108 var a = this.s.listenKeys.split(''); 50109 var idx = $.inArray( character, a ); 50110 a.splice( idx, 1 ); 50111 this.s.listenKeys = a.join(''); 50112 } 50113 }, 50114 50115 /** 50116 * Resolve a button configuration 50117 * @param {string|function|object} Button config to resolve 50118 * @return {object} Button configuration 50119 */ 50120 _resolveExtends: function ( conf ) 50121 { 50122 var dt = this.s.dt; 50123 var i, ien; 50124 var toConfObject = function ( base ) { 50125 var loop = 0; 50126 50127 // Loop until we have resolved to a button configuration, or an 50128 // array of button configurations (which will be iterated 50129 // separately) 50130 while ( ! $.isPlainObject(base) && ! $.isArray(base) ) { 50131 if ( base === undefined ) { 50132 return; 50133 } 50134 50135 if ( typeof base === 'function' ) { 50136 base = base( dt, conf ); 50137 50138 if ( ! base ) { 50139 return false;
50140 } 50141 } 50142 else if ( typeof base === 'string' ) { 50143 if ( ! _dtButtons[ base ] ) { 50144 throw 'Unknown button type: '+base; 50145 } 50146 50147 base = _dtButtons[ base ]; 50148 } 50149 50150 loop++; 50151 if ( loop > 30 ) { 50152 // Protect against misconfiguration killing the browser 50153 throw 'Buttons: Too many iterations'; 50154 } 50155 } 50156 50157 return $.isArray( base ) ? 50158 base : 50159 $.extend( {}, base ); 50160 }; 50161 50162 conf = toConfObject( conf ); 50163 50164 while ( conf && conf.extend ) { 50165 // Use `toConfObject` in case the button definition being extended 50166 // is itself a string or a function 50167 if ( ! _dtButtons[ conf.extend ] ) { 50168 throw 'Cannot extend unknown button type: '+conf.extend; 50169 } 50170 50171 var objArray = toConfObject( _dtButtons[ conf.extend ] ); 50172 if ( $.isArray( objArray ) ) { 50173 return objArray; 50174 } 50175 else if ( ! objArray ) { 50176 // This is a little brutal as it might be possible to have a 50177 // valid button without the extend, but if there is no extend 50178 // then the host button would be acting in an undefined state 50179 return false; 50180 } 50181 50182 // Stash the current class name 50183 var originalClassName = objArray.className; 50184 50185 conf = $.extend( {}, objArray, conf ); 50186 50187 // The extend will have overwritten the original class name if the 50188 // `conf` object also assigned a class, but we want to concatenate 50189 // them so they are list that is combined from all extended buttons 50190 if ( originalClassName && conf.className !== originalClassName ) { 50191 conf.className = originalClassName+' '+conf.className; 50192 } 50193 50194 // Buttons to be added to a collection -gives the ability to define 50195 // if buttons should be added to the start or end of a collection 50196 var postfixButtons = conf.postfixButtons; 50197 if ( postfixButtons ) { 50198 if ( ! conf.buttons ) { 50199 conf.buttons = []; 50200 } 50201 50202 for ( i=0, ien=postfixButtons.length ; i<ien ; i++ ) { 50203 conf.buttons.push( postfixButtons[i] ); 50204 } 50205 50206 conf.postfixButtons = null; 50207 } 50208 50209 var prefixButtons = conf.prefixButtons; 50210 if ( prefixButtons ) { 50211 if ( ! conf.buttons ) { 50212 conf.buttons = []; 50213 } 50214 50215 for ( i=0, ien=prefixButtons.length ; i<ien ; i++ ) { 50216 conf.buttons.splice( i, 0, prefixButtons[i] ); 50217 } 50218 50219 conf.prefixButtons = null; 50220 } 50221 50222 // Although we want the `conf` object to overwrite almost all of 50223 // the properties of the object being extended, the `extend` 50224 // property should come from the object being extended 50225 conf.extend = objArray.extend; 50226 } 50227 50228 return conf; 50229 } 50230} ); 50231 50232 50233 50234/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 50235 * Statics 50236 */ 50237 50238/** 50239 * Show / hide a background layer behind a collection 50240 * @param {boolean} Flag to indicate if the background should be shown or 50241 * hidden 50242 * @param {string} Class to assign to the background 50243 * @static 50244 */ 50245Buttons.background = function ( show, className, fade ) { 50246 if ( fade === undefined ) { 50247 fade = 400; 50248 } 50249 50250 if ( show ) { 50251 $('<div/>') 50252 .addClass( className ) 50253 .css( 'display', 'none' ) 50254 .appendTo( 'body' ) 50255 .fadeIn( fade ); 50256 } 50257 else { 50258 $('body > div.'+className) 50259 .fadeOut( fade, function () { 50260 $(this).remove(); 50261 } ); 50262 } 50263}; 50264 50265/** 50266 * Instance selector - select Buttons instances based on an instance selector 50267 * value from the buttons assigned to a DataTable. This is only useful if 50268 * multiple instances are attached to a DataTable. 50269 * @param {string|int|array} Instance selector - see `instance-selector` 50270 * documentation on the DataTables site 50271 * @param {array} Button instance array that was attached to the DataTables 50272 * settings object 50273 * @return {array} Buttons instances 50274 * @static 50275 */ 50276Buttons.instanceSelector = function ( group, buttons ) 50277{ 50278 if ( ! group ) { 50279 return $.map( buttons, function ( v ) { 50280 return v.inst; 50281 } ); 50282 } 50283 50284 var ret = []; 50285 var names = $.map( buttons, function ( v ) { 50286 return v.name; 50287 } ); 50288 50289 // Flatten the group selector into an array of single options 50290 var process = function ( input ) { 50291 if ( $.isArray( input ) ) { 50292 for ( var i=0, ien=input.length ; i<ien ; i++ ) { 50293 process( input[i] ); 50294 } 50295 return; 50296 } 50297 50298 if ( typeof input === 'string' ) { 50299 if ( input.indexOf( ',' ) !== -1 ) { 50300 // String selector, list of names 50301 process( input.split(',') ); 50302 } 50303 else { 50304 // String selector individual name 50305 var idx = $.inArray( $.trim(input), names ); 50306 50307 if ( idx !== -1 ) {
50308 ret.push( buttons[ idx ].inst ); 50309 } 50310 } 50311 } 50312 else if ( typeof input === 'number' ) { 50313 // Index selector 50314 ret.push( buttons[ input ].inst ); 50315 } 50316 }; 50317 50318 process( group ); 50319 50320 return ret; 50321}; 50322 50323/** 50324 * Button selector - select one or more buttons from a selector input so some 50325 * operation can be performed on them. 50326 * @param {array} Button instances array that the selector should operate on 50327 * @param {string|int|node|jQuery|array} Button selector - see 50328 * `button-selector` documentation on the DataTables site 50329 * @return {array} Array of objects containing `inst` and `idx` properties of 50330 * the selected buttons so you know which instance each button belongs to. 50331 * @static 50332 */ 50333Buttons.buttonSelector = function ( insts, selector ) 50334{ 50335 var ret = []; 50336 var run = function ( selector, inst ) { 50337 var i, ien, j, jen; 50338 var buttons = []; 50339 50340 $.each( inst.s.buttons, function (i, v) { 50341 if ( v !== null ) { 50342 buttons.push( { 50343 node: v.node[0], 50344 name: v.name 50345 } ); 50346 } 50347 } ); 50348 50349 $.each( inst.s.subButtons, function (i, v) { 50350 $.each( v, function (j, w) { 50351 if ( w !== null ) { 50352 buttons.push( { 50353 node: w.node[0], 50354 name: w.name 50355 } ); 50356 } 50357 } ); 50358 } ); 50359 50360 var nodes = $.map( buttons, function (v) { 50361 return v.node; 50362 } ); 50363 50364 if ( $.isArray( selector ) || selector instanceof $ ) { 50365 for ( i=0, ien=selector.length ; i<ien ; i++ ) { 50366 run( selector[i], inst ); 50367 } 50368 return; 50369 } 50370 50371 if ( selector === null || selector === undefined || selector === '*' ) { 50372 // Select all 50373 for ( i=0, ien=buttons.length ; i<ien ; i++ ) { 50374 ret.push( { 50375 inst: inst, 50376 idx: inst.toIndex( buttons[i].node ) 50377 } ); 50378 } 50379 } 50380 else if ( typeof selector === 'number' ) { 50381 // Main button index selector 50382 ret.push( { 50383 inst: inst, 50384 idx: selector 50385 } ); 50386 } 50387 else if ( typeof selector === 'string' ) { 50388 if ( selector.indexOf( ',' ) !== -1 ) { 50389 // Split 50390 var a = selector.split(','); 50391 50392 for ( i=0, ien=a.length ; i<ien ; i++ ) { 50393 run( $.trim(a[i]), inst ); 50394 } 50395 } 50396 else if ( selector.match( /^\d+(\-\d+)?$/ ) ) { 50397 // Sub-button index selector 50398 ret.push( { 50399 inst: inst, 50400 idx: selector 50401 } ); 50402 } 50403 else if ( selector.indexOf( ':name' ) !== -1 ) { 50404 // Button name selector 50405 var name = selector.replace( ':name', '' ); 50406 50407 for ( i=0, ien=buttons.length ; i<ien ; i++ ) { 50408 if ( buttons[i].name === name ) { 50409 ret.push( { 50410 inst: inst, 50411 idx: inst.toIndex( buttons[i].node ) 50412 } ); 50413 } 50414 } 50415 } 50416 else { 50417 // jQuery selector on the nodes 50418 $( nodes ).filter( selector ).each( function () { 50419 ret.push( { 50420 inst: inst, 50421 idx: inst.toIndex( this ) 50422 } ); 50423 } ); 50424 } 50425 } 50426 else if ( typeof selector === 'object' && selector.nodeName ) { 50427 // Node selector 50428 var idx = $.inArray( selector, nodes ); 50429 50430 if ( idx !== -1 ) { 50431 ret.push( { 50432 inst: inst, 50433 idx: inst.toIndex( nodes[ idx ] ) 50434 } ); 50435 } 50436 } 50437 }; 50438 50439 50440 for ( var i=0, ien=insts.length ; i<ien ; i++ ) { 50441 var inst = insts[i]; 50442 50443 run( selector, inst ); 50444 } 50445 50446 return ret; 50447}; 50448 50449 50450/** 50451 * Buttons defaults. For full documentation, please refer to the docs/option 50452 * directory or the DataTables site. 50453 * @type {Object} 50454 * @static 50455 */ 50456Buttons.defaults = { 50457 buttons: [ 'copy', 'excel', 'csv', 'pdf', 'print' ], 50458 name: 'main', 50459 tabIndex: 0, 50460 dom: { 50461 container: { 50462 tag: 'div', 50463 className: 'dt-buttons' 50464 }, 50465 collection: { 50466 tag: 'div', 50467 className: 'dt-button-collection' 50468 }, 50469 button: { 50470 tag: 'a', 50471 className: 'dt-button', 50472 active: 'active', 50473 disabled: 'disabled' 50474 }, 50475 buttonLiner: { 50476 tag: 'span', 50477 className: '' 50478 } 50479 } 50480}; 50481 50482/** 50483 * Version information 50484 * @type {string} 50485 * @static 50486 */ 50487Buttons.version = '1.1.0'; 50488 50489 50490$.extend( _dtButtons, { 50491 collection: { 50492 text: function ( dt, button, config ) { 50493 return dt.i18n( 'buttons.collection', 'Collection' ); 50494 }, 50495 className: 'buttons-collection', 50496 action: function ( e, dt, button, config ) { 50497 var background; 50498 var host = button; 50499 var hostOffset = host.offset(); 50500 var tableContainer = $( dt.table().container() ); 50501 var multiLevel = false;
50502 50503 // Remove any old collection 50504 if ( $('div.dt-button-background').length ) { 50505 multiLevel = $('div.dt-button-collection').offset(); 50506 $(document).trigger( 'click.dtb-collection' ); 50507 } 50508 50509 config._collection 50510 .addClass( config.collectionLayout ) 50511 .css( 'display', 'none' ) 50512 .appendTo( 'body' ) 50513 .fadeIn( config.fade ); 50514 50515 var position = config._collection.css( 'position' ); 50516 50517 if ( multiLevel && position === 'absolute' ) { 50518 config._collection.css( { 50519 top: multiLevel.top + 5, // magic numbers for a little offset 50520 left: multiLevel.left + 5 50521 } ); 50522 } 50523 else if ( position === 'absolute' ) { 50524 config._collection.css( { 50525 top: hostOffset.top + host.outerHeight(), 50526 left: hostOffset.left 50527 } ); 50528 50529 var listRight = hostOffset.left + config._collection.outerWidth(); 50530 var tableRight = tableContainer.offset().left + tableContainer.width(); 50531 if ( listRight > tableRight ) { 50532 config._collection.css( 'left', hostOffset.left - ( listRight - tableRight ) ); 50533 } 50534 } 50535 else { 50536 // Fix position - centre on screen 50537 var top = config._collection.height() / 2; 50538 if ( top > $(window).height() / 2 ) { 50539 top = $(window).height() / 2; 50540 } 50541 50542 config._collection.css( 'marginTop', top*-1 ); 50543 } 50544 50545 if ( config.background ) { 50546 Buttons.background( true, config.backgroundClassName, config.fade ); 50547 } 50548 50549 // Need to break the 'thread' for the collection button being 50550 // activated by a click - it would also trigger this event 50551 setTimeout( function () { 50552 // This is bonkers, but if we don't have a click listener on the 50553 // background element, iOS Safari will ignore the body click 50554 // listener below. An empty function here is all that is 50555 // required to make it work... 50556 $('div.dt-button-background').on( 'click.dtb-collection', function () {} ); 50557 50558 $('body').on( 'click.dtb-collection', function (e) { 50559 if ( ! $(e.target).parents().andSelf().filter( config._collection ).length ) { 50560 config._collection 50561 .fadeOut( config.fade, function () { 50562 config._collection.detach(); 50563 } ); 50564 50565 $('div.dt-button-background').off( 'click.dtb-collection' ); 50566 Buttons.background( false, config.backgroundClassName, config.fade ); 50567 50568 $('body').off( 'click.dtb-collection' ); 50569 } 50570 } ); 50571 }, 10 ); 50572 }, 50573 background: true, 50574 collectionLayout: '', 50575 backgroundClassName: 'dt-button-background', 50576 fade: 400 50577 }, 50578 copy: function ( dt, conf ) { 50579 if ( _dtButtons.copyHtml5 ) { 50580 return 'copyHtml5'; 50581 } 50582 if ( _dtButtons.copyFlash && _dtButtons.copyFlash.available( dt, conf ) ) { 50583 return 'copyFlash'; 50584 } 50585 }, 50586 csv: function ( dt, conf ) { 50587 // Common option that will use the HTML5 or Flash export buttons 50588 if ( _dtButtons.csvHtml5 && _dtButtons.csvHtml5.available( dt, conf ) ) { 50589 return 'csvHtml5'; 50590 } 50591 if ( _dtButtons.csvFlash && _dtButtons.csvFlash.available( dt, conf ) ) { 50592 return 'csvFlash'; 50593 } 50594 }, 50595 excel: function ( dt, conf ) { 50596 // Common option that will use the HTML5 or Flash export buttons 50597 if ( _dtButtons.excelHtml5 && _dtButtons.excelHtml5.available( dt, conf ) ) { 50598 return 'excelHtml5'; 50599 } 50600 if ( _dtButtons.excelFlash && _dtButtons.excelFlash.available( dt, conf ) ) { 50601 return 'excelFlash'; 50602 } 50603 }, 50604 pdf: function ( dt, conf ) { 50605 // Common option that will use the HTML5 or Flash export buttons 50606 if ( _dtButtons.pdfHtml5 && _dtButtons.pdfHtml5.available( dt, conf ) ) { 50607 return 'pdfHtml5'; 50608 } 50609 if ( _dtButtons.pdfFlash && _dtButtons.pdfFlash.available( dt, conf ) ) { 50610 return 'pdfFlash'; 50611 } 50612 }, 50613 pageLength: function ( dt, conf ) { 50614 var lengthMenu = dt.settings()[0].aLengthMenu; 50615 var vals = $.isArray( lengthMenu[0] ) ? lengthMenu[0] : lengthMenu; 50616 var lang = $.isArray( lengthMenu[0] ) ? lengthMenu[1] : lengthMenu; 50617 var text = function ( dt ) { 50618 return dt.i18n( 'buttons.pageLength', { 50619 "-1": 'Show all rows', 50620 _: 'Show %d rows' 50621 }, dt.page.len() ); 50622 }; 50623 50624 return { 50625 extend: 'collection', 50626 text: text, 50627 className: 'buttons-page-length', 50628 buttons: $.map( vals, function ( val, i ) { 50629 return { 50630 text: lang[i], 50631 action: function ( e, dt, button, conf ) { 50632 dt.page.len( val ).draw(); 50633 }, 50634 init: function ( dt, node, conf ) { 50635 var that = this; 50636 var fn = function () { 50637 that.active( dt.page.len() === val ); 50638 }; 50639 50640 dt.on( 'length.dt'+conf.namespace, fn ); 50641 fn(); 50642 }, 50643 destroy: function ( dt, node, conf ) { 50644 dt.off( 'length.dt'+conf.namespace ); 50645 } 50646 }; 50647 } ), 50648 init: function ( dt, node, conf ) { 50649 var that = this; 50650 dt.on( 'length.dt'+conf.namespace, function () { 50651 that.text( text( dt ) ); 50652 } ); 50653 }, 50654 destroy: function ( dt, node, conf ) { 50655 dt.off( 'length.dt'+conf.namespace ); 50656 } 50657 }; 50658 } 50659} ); 50660 50661 50662/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 50663 * DataTables API 50664 * 50665 * For complete documentation, please refer to the docs/api directory or the 50666 * DataTables site 50667 */ 50668 50669// Buttons group and individual button selector 50670DataTable.Api.register( 'buttons()', function ( group, selector ) { 50671 // Argument shifting 50672 if ( selector === undefined ) { 50673 selector = group; 50674 group = undefined; 50675 } 50676 50677 return this.iterator( true, 'table', function ( ctx ) { 50678 if ( ctx._buttons ) { 50679 return Buttons.buttonSelector( 50680 Buttons.instanceSelector( group, ctx._buttons ), 50681 selector 50682 ); 50683 } 50684 }, true ); 50685} ); 50686 50687// Individual button selector 50688DataTable.Api.register( 'button()', function ( group, selector ) { 50689 // just run buttons() and truncate 50690 var buttons = this.buttons( group, selector ); 50691 50692 if ( buttons.length > 1 ) { 50693 buttons.splice( 1, buttons.length ); 50694 } 50695 50696 return buttons; 50697} ); 50698 50699// Active buttons 50700DataTable.Api.register( ['buttons().active()', 'button().active()'], function ( flag ) { 50701 return this.each( function ( set ) { 50702 set.inst.active( set.idx, flag ); 50703 } ); 50704} ); 50705 50706// Get / set button action 50707DataTable.Api.registerPlural( 'buttons().action()', 'button().action()', function ( action ) { 50708 if ( action === undefined ) { 50709 return this.map( function ( set ) { 50710 return set.inst.action( set.idx ); 50711 } ); 50712 } 50713 50714 return this.each( function ( set ) { 50715 set.inst.action( set.idx, action ); 50716 } ); 50717} ); 50718 50719// Enable / disable buttons 50720DataTable.Api.register( ['buttons().enable()', 'button().enable()'], function ( flag ) { 50721 return this.each( function ( set ) { 50722 set.inst.enable( set.idx, flag ); 50723 } ); 50724} ); 50725 50726// Disable buttons 50727DataTable.Api.register( ['buttons().disable()', 'button().disable()'], function () { 50728 return this.each( function ( set ) { 50729 set.inst.disable( set.idx ); 50730 } ); 50731} ); 50732 50733// Get button nodes 50734DataTable.Api.registerPlural( 'buttons().nodes()', 'button().node()', function () { 50735 var jq = $(); 50736 50737 // jQuery will automatically reduce duplicates to a single entry 50738 $( this.each( function ( set ) { 50739 jq = jq.add( set.inst.node( set.idx ) ); 50740 } ) ); 50741 50742 return jq; 50743} ); 50744 50745// Get / set button text (i.e. the button labels) 50746DataTable.Api.registerPlural( 'buttons().text()', 'button().text()', function ( label ) { 50747 if ( label === undefined ) { 50748 return this.map( function ( set ) { 50749 return set.inst.text( set.idx ); 50750 } ); 50751 } 50752 50753 return this.each( function ( set ) { 50754 set.inst.text( set.idx, label ); 50755 } ); 50756} ); 50757 50758// Trigger a button's action 50759DataTable.Api.registerPlural( 'buttons().trigger()', 'button().trigger()', function () { 50760 return this.each( function ( set ) { 50761 set.inst.node( set.idx ).trigger( 'click' ); 50762 } ); 50763} ); 50764 50765// Get the container elements for the button sets selected 50766DataTable.Api.registerPlural( 'buttons().containers()', 'buttons().container()', function () { 50767 var jq = $(); 50768 50769 // jQuery will automatically reduce duplicates to a single entry 50770 $( this.each( function ( set ) { 50771 jq = jq.add( set.inst.container() ); 50772 } ) ); 50773 50774 return jq; 50775} ); 50776 50777// Add a new button 50778DataTable.Api.register( 'button().add()', function ( idx, conf ) { 50779 if ( this.length === 1 ) { 50780 this[0].inst.add( idx, conf ); 50781 } 50782 50783 return this.button( idx ); 50784} ); 50785
50786// Destroy the button sets selected 50787DataTable.Api.register( 'buttons().destroy()', function ( idx ) { 50788 this.pluck( 'inst' ).unique().each( function ( inst ) { 50789 inst.destroy(); 50790 } ); 50791 50792 return this; 50793} ); 50794 50795// Remove a button 50796DataTable.Api.registerPlural( 'buttons().remove()', 'buttons().remove()', function () { 50797 // Need to split into prep and commit so the indexes remain constant during the remove 50798 this.each( function ( set ) { 50799 set.inst.removePrep( set.idx ); 50800 } ); 50801 50802 this.pluck( 'inst' ).unique().each( function ( inst ) { 50803 inst.removeCommit(); 50804 } ); 50805 50806 return this; 50807} ); 50808 50809// Information box that can be used by buttons 50810var _infoTimer; 50811DataTable.Api.register( 'buttons.info()', function ( title, message, time ) { 50812 var that = this; 50813 50814 if ( title === false ) { 50815 $('#datatables_buttons_info').fadeOut( function () { 50816 $(this).remove(); 50817 } ); 50818 clearTimeout( _infoTimer ); 50819 _infoTimer = null; 50820 50821 return this; 50822 } 50823 50824 if ( _infoTimer ) { 50825 clearTimeout( _infoTimer ); 50826 } 50827 50828 if ( $('#datatables_buttons_info').length ) { 50829 $('#datatables_buttons_info').remove(); 50830 } 50831 50832 title = title ? '<h2>'+title+'</h2>' : ''; 50833 50834 $('<div id="datatables_buttons_info" class="dt-button-info"/>') 50835 .html( title ) 50836 .append( $('<div/>')[ typeof message === 'string' ? 'html' : 'append' ]( message ) ) 50837 .css( 'display', 'none' ) 50838 .appendTo( 'body' ) 50839 .fadeIn(); 50840 50841 if ( time !== undefined && time !== 0 ) { 50842 _infoTimer = setTimeout( function () { 50843 that.buttons.info( false ); 50844 }, time ); 50845 } 50846 50847 return this; 50848} ); 50849 50850// Get data from the table for export - this is common to a number of plug-in 50851// buttons so it is included in the Buttons core library 50852DataTable.Api.register( 'buttons.exportData()', function ( options ) { 50853 if ( this.context.length ) { 50854 return _exportData( new DataTable.Api( this.context[0] ), options ); 50855 } 50856} ); 50857 50858 50859var _exportTextarea = $('<textarea/>')[0]; 50860var _exportData = function ( dt, inOpts ) 50861{ 50862 var config = $.extend( true, {}, { 50863 rows: null, 50864 columns: '', 50865 modifier: { 50866 search: 'applied', 50867 order: 'applied' 50868 }, 50869 orthogonal: 'display', 50870 stripHtml: true, 50871 stripNewlines: true, 50872 decodeEntities: true, 50873 trim: true, 50874 format: { 50875 header: function ( d ) { 50876 return strip( d ); 50877 }, 50878 footer: function ( d ) { 50879 return strip( d ); 50880 }, 50881 body: function ( d ) { 50882 return strip( d ); 50883 } 50884 } 50885 }, inOpts ); 50886 50887 var strip = function ( str ) { 50888 if ( typeof str !== 'string' ) { 50889 return str; 50890 } 50891 50892 if ( config.stripHtml ) { 50893 str = str.replace( /<.*?>/g, '' ); 50894 } 50895 50896 if ( config.trim ) { 50897 str = str.replace( /^\s+|\s+$/g, '' ); 50898 } 50899 50900 if ( config.stripNewlines ) { 50901 str = str.replace( /\n/g, ' ' ); 50902 } 50903 50904 if ( config.decodeEntities ) { 50905 _exportTextarea.innerHTML = str; 50906 str = _exportTextarea.value; 50907 } 50908 50909 return str; 50910 }; 50911 50912 50913 var header = dt.columns( config.columns ).indexes().map( function (idx, i) { 50914 return config.format.header( dt.column( idx ).header().innerHTML, idx ); 50915 } ).toArray(); 50916 50917 var footer = dt.table().footer() ? 50918 dt.columns( config.columns ).indexes().map( function (idx, i) { 50919 var el = dt.column( idx ).footer(); 50920 return config.format.footer( el ? el.innerHTML : '', idx ); 50921 } ).toArray() : 50922 null; 50923 50924 var rowIndexes = dt.rows( config.rows, config.modifier ).indexes().toArray(); 50925 var cells = dt 50926 .cells( rowIndexes, config.columns ) 50927 .render( config.orthogonal ) 50928 .toArray(); 50929 var columns = header.length; 50930 var rows = columns > 0 ? cells.length / columns : 0; 50931 var body = new Array( rows ); 50932 var cellCounter = 0; 50933 50934 for ( var i=0, ien=rows ; i<ien ; i++ ) { 50935 var row = new Array( columns ); 50936 50937 for ( var j=0 ; j<columns ; j++ ) { 50938 row[j] = config.format.body( cells[ cellCounter ], j, i ); 50939 cellCounter++; 50940 } 50941 50942 body[i] = row; 50943 } 50944 50945 return { 50946 header: header, 50947 footer: footer, 50948 body: body 50949 }; 50950}; 50951 50952 50953/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 50954 * DataTables interface 50955 */ 50956 50957// Attach to DataTables objects for global access 50958$.fn.dataTable.Buttons = Buttons; 50959$.fn.DataTable.Buttons = Buttons; 50960 50961 50962 50963// DataTables creation - check if the buttons have been defined for this table, 50964// they will have been if the `B` option was used in `dom`, otherwise we should 50965// create the buttons instance here so they can be inserted into the document 50966// using the API. Listen for `init` for compatibility with pre 1.10.10, but to 50967// be removed in future. 50968$(document).on( 'init.dt plugin-init.dt', function (e, settings, json) { 50969 if ( e.namespace !== 'dt' ) { 50970 return; 50971 } 50972 50973 var opts = settings.oInit.buttons || DataTable.defaults.buttons; 50974 50975 if ( opts && ! settings._buttons ) { 50976 new Buttons( settings, opts ).container(); 50977 } 50978} ); 50979 50980// DataTables `dom` feature option 50981DataTable.ext.feature.push( { 50982 fnInit: function( settings ) { 50983 var api = new DataTable.Api( settings ); 50984 var opts = api.init().buttons || DataTable.defaults.buttons; 50985 50986 return new Buttons( api, opts ).container(); 50987 }, 50988 cFeature: "B" 50989} ); 50990 50991 50992return Buttons; 50993})); 50994 50995/*! 50996 RowReorder 1.2.3 50997 2015-2017 SpryMedia Ltd - datatables.net/license 50998*/ 50999(function(d){"function"===typeof define&&define.amd?define(["jquery","datatables.net"],function(f){return d(f,window,document)}):"object"===typeof exports?module.exports=function(f,g){f||(f=window);if(!g||!g.fn.dataTable)g=require("datatables.net")(f,g).$;return d(g,f,f.document)}:d(jQuery,window,document)})(function(d,f,g,m){var h=d.fn.dataTable,k=function(c,b){if(!h.versionCheck||!h.versionCheck("1.10.8"))throw"DataTables RowReorder requires DataTables 1.10.8 or newer";this.c=d.extend(!0,{},h.defaults.rowReorder, 51000k.defaults,b);this.s={bodyTop:null,dt:new h.Api(c),getDataFn:h.ext.oApi._fnGetObjectDataFn(this.c.dataSrc),middles:null,scroll:{},scrollInterval:null,setDataFn:h.ext.oApi._fnSetObjectDataFn(this.c.dataSrc),start:{top:0,left:0,offsetTop:0,offsetLeft:0,nodes:[]},windowHeight:0,documentOuterHeight:0,domCloneOuterHeight:0};this.dom={clone:null,dtScroll:d("div.dataTables_scrollBody",this.s.dt.table().container())};var a=this.s.dt.settings()[0],e=a.rowreorder;if(e)return e;a.rowreorder=this;this._constructor()}; 51001d.extend(k.prototype,{_constructor:function(){var c=this,b=this.s.dt,a=d(b.table().node());"static"===a.css("position")&&a.css("position","relative");d(b.table().container()).on("mousedown.rowReorder touchstart.rowReorder",this.c.selector,function(a){if
51001(c.c.enable){var i=d(this).closest("tr"),j=b.row(i);if(j.any())return c._emitEvent("pre-row-reorder",{node:j.node(),index:j.index()}),c._mouseDown(a,i),!1}});b.on("destroy.rowReorder",function(){d(b.table().container()).off(".rowReorder");b.off(".rowReorder")})}, 51002_cachePositions:function(){var c=this.s.dt,b=d(c.table().node()).find("thead").outerHeight(),a=d.unique(c.rows({page:"current"}).nodes().toArray()),e=d.map(a,function(a){return d(a).position().top-b}),a=d.map(e,function(a,b){return e.length<b-1?(a+e[b+1])/2:(a+a+d(c.row(":last-child").node()).outerHeight())/2});this.s.middles=a;this.s.bodyTop=d(c.table().body()).offset().top;this.s.windowHeight=d(f).height();this.s.documentOuterHeight=d(g).outerHeight()},_clone:function(c){var b=d(this.s.dt.table().node().cloneNode(!1)).addClass("dt-rowReorder-float").append("<tbody/>").append(c.clone(!1)), 51003a=c.outerWidth(),e=c.outerHeight(),i=c.children().map(function(){return d(this).width()});b.width(a).height(e).find("tr").children().each(function(a){this.style.width=i[a]+"px"});b.appendTo("body");this.dom.clone=b;this.s.domCloneOuterHeight=b.outerHeight()},_clonePosition:function(c){var b=this.s.start,a=this._eventToPage(c,"Y")-b.top,c=this._eventToPage(c,"X")-b.left,e=this.c.snapX,a=a+b.offsetTop,b=!0===e?b.offsetLeft:"number"===typeof e?b.offsetLeft+e:c+b.offsetLeft;0>a?a=0:a+this.s.domCloneOuterHeight> 51004this.s.documentOuterHeight&&(a=this.s.documentOuterHeight-this.s.domCloneOuterHeight);this.dom.clone.css({top:a,left:b})},_emitEvent:function(c,b){this.s.dt.iterator("table",function(a){d(a.nTable).triggerHandler(c+".dt",b)})},_eventToPage:function(c,b){return-1!==c.type.indexOf("touch")?c.originalEvent.touches[0]["page"+b]:c["page"+b]},_mouseDown:function(c,b){var a=this,e=this.s.dt,i=this.s.start,j=b.offset();i.top=this._eventToPage(c,"Y");i.left=this._eventToPage(c,"X");i.offsetTop=j.top;i.offsetLeft= 51005j.left;i.nodes=d.unique(e.rows({page:"current"}).nodes().toArray());this._cachePositions();this._clone(b);this._clonePosition(c);this.dom.target=b;b.addClass("dt-rowReorder-moving");d(g).on("mouseup.rowReorder touchend.rowReorder",function(b){a._mouseUp(b)}).on("mousemove.rowReorder touchmove.rowReorder",function(b){a._mouseMove(b)});d(f).width()===d(g).width()&&d(g.body).addClass("dt-rowReorder-noOverflow");e=this.dom.dtScroll;this.s.scroll={windowHeight:d(f).height(),windowWidth:d(f).width(),dtTop:e.length? 51006e.offset().top:null,dtLeft:e.length?e.offset().left:null,dtHeight:e.length?e.outerHeight():null,dtWidth:e.length?e.outerWidth():null}},_mouseMove:function(c){this._clonePosition(c);for(var b=this._eventToPage(c,"Y")-this.s.bodyTop,a=this.s.middles,e=null,i=this.s.dt,j=i.table().body(),g=0,f=a.length;g<f;g++)if(b<a[g]){e=g;break}null===e&&(e=a.length);if(null===this.s.lastInsert||this.s.lastInsert!==e)0===e?this.dom.target.prependTo(j):(b=d.unique(i.rows({page:"current"}).nodes().toArray()),e>this.s.lastInsert? 51007this.dom.target.insertAfter(b[e-1]):this.dom.target.insertBefore(b[e])),this._cachePositions(),this.s.lastInsert=e;this._shiftScroll(c)},_mouseUp:function(){var c=this,b=this.s.dt,a,e,i=this.c.dataSrc;this.dom.clone.remove();this.dom.clone=null;this.dom.target.removeClass("dt-rowReorder-moving");d(g).off(".rowReorder");d(g.body).removeClass("dt-rowReorder-noOverflow");clearInterval(this.s.scrollInterval);this.s.scrollInterval=null;var j=this.s.start.nodes,f=d.unique(b.rows({page:"current"}).nodes().toArray()), 51008k={},h=[],l=[],n=this.s.getDataFn,m=this.s.setDataFn;a=0;for(e=j.length;a<e;a++)if(j[a]!==f[a]){var o=b.row(f[a]).id(),s=b.row(f[a]).data(),p=b.row(j[a]).data();o&&(k[o]=n(p));h.push({node:f[a],oldData:n(s),newData:n(p),newPosition:a,oldPosition:d.inArray(f[a],j)});l.push(f[a])}var q=[h,{dataSrc:i,nodes:l,values:k,triggerRow:b.row(this.dom.target)}];this._emitEvent("row-reorder",q);var r=function(){if(c.c.update){a=0;for(e=h.length;a<e;a++){var d=b.row(h[a].node).data();m(d,h[a].newData);b.columns().every(function(){this.dataSrc()=== 51009i&&b.cell(h[a].node,this.index()).invalidate("data")})}c._emitEvent("row-reordered",q);b.draw(!1)}};this.c.editor?(this.c.enable=!1,this.c.editor.edit(l,!1,d.extend({submit:"changed"},this.c.formOptions)).multiSet(i,k).one("submitUnsuccessful.rowReorder",function(){b.draw(!1)}).one("submitSuccess.rowReorder",function(){r()}).one("submitComplete",function(){c.c.enable=!0;c.c.editor.off(".rowReorder")}).submit()):r()},_shiftScroll:function(c){var b=this,a=this.s.scroll,e=!1,d=c.pageY-g.body.scrollTop, 51010f,h;65>d?f=-5:d>a.windowHeight-65&&(f=5);null!==a.dtTop&&c.pageY<a.dtTop+65?h=-5:null!==a.dtTop&&c.pageY>a.dtTop+a.dtHeight-65&&(h=5);f||h?(a.windowVert=f,a.dtVert=h,e=!0):this.s.scrollInterval&&(clearInterval(this.s.scrollInterval),this.s.scrollInterval=null);!this.s.scrollInterval&&e&&(this.s.scrollInterval=setInterval(function(){if(a.windowVert)g.body.scrollTop=g.body.scrollTop+a.windowVert;if(a.dtVert){var c=b.dom.dtScroll[0];if(a.dtVert)c.scrollTop=c.scrollTop+a.dtVert}},20))}});k.defaults={dataSrc:0, 51011editor:null,enable:!0,formOptions:{},selector:"td:first-child",snapX:!1,update:!0};var l=d.fn.dataTable.Api;l.register("rowReorder()",function(){return this});l.register("rowReorder.enable()",function(c){c===m&&(c=!0);return this.iterator("table",function(b){b.rowreorder&&(b.rowreorder.c.enable=c)})});l.register("rowReorder.disable()",function(){return this.iterator("table",function(c){c.rowreorder&&(c.rowreorder.c.enable=!1)})});k.version="1.2.3";d.fn.dataTable.RowReorder=k;d.fn.DataTable.RowReorder= 51012k;d(g).on("init.dt.dtr",function(c,b){if("dt"===c.namespace){var a=b.oInit.rowReorder,e=h.defaults.rowReorder;if(a||e)e=d.extend({},a,e),!1!==a&&new k(b,e)}});return k}); 51013 51014/** 51015 * When searching a table with accented characters, it can be frustrating to have 51016 * an input such as _Zurich_ not match _Zürich_ in the table (`u !== ü`). This 51017 * type based search plug-in replaces the built-in string formatter in 51018 * DataTables with a function that will replace the accented characters 51019 * with their unaccented counterparts for fast and easy filtering. 51020 * 51021 * Note that this plug-in uses the Javascript I18n API that was introduced in 51022 * ES6. For older browser's this plug-in will have no effect. 51023 * 51024 * @summary Replace accented characters with unaccented counterparts 51025 * @name Accent neutralise 51026 * @author Allan Jardine 51027 * 51028 * @example 51029 * $(document).ready(function() { 51030 * $('#example').dataTable(); 51031 * } ); 51032 */ 51033 51034(function(){ 51035 51036function removeAccents ( data ) { 51037 if ( data.normalize ) { 51038 // Use I18n API if avaiable to split characters and accents, then remove 51039 // the accents wholesale. Note that we use the original data as well as 51040 // the new to allow for searching of either form. 51041 var normalizedData = data 51042 .normalize('NFD') 51043 .replace(/[\u0300-\u036f]/g, ''); 51044 51045 data = data === normalizedData ? data : normalizedData + ' ' + data; 51046 } 51047 51048 return data; 51049} 51050 51051var searchType = jQuery.fn.DataTable.ext.type.search; 51052 51053searchType.string = function ( data ) { 51054 return ! data ? 51055 '' : 51056 typeof data === 'string' ? 51057 removeAccents( data ) : 51058 data; 51059}; 51060 51061searchType.html = function ( data ) { 51062 return ! data ? 51063 '' : 51064 typeof data === 'string' ? 51065 removeAccents( data.replace( /<.*?>/g, '' ) ) : 51066 data; 51067}; 51068 51069}()); 51070// Textarea and select clone() bug workaround | Spencer Tipping 51071// Licensed under the terms of the MIT source code license 51072 51073// Motivation. 51074// jQuery's clone() method works in most cases, but it fails to copy the value of textareas and select elements. This patch replaces jQuery's clone() method with a wrapper that fills in the 51075// values after the fact. 51076 51077// An interesting error case submitted by Piotr Przybyl: If two <select> options had the same value, the clone() method would select the wrong one in the cloned box. The fix, suggested by Piotr 51078// and implemented here, is to use the selectedIndex property on the <select> box itself rather than relying on jQuery's value-based val(). 51079 51080(function (original) { 51081 jQuery.fn.clone = function () { 51082 var result = original.apply(this, arguments), 51083 my_textareas = this.find('textarea').add(this.filter('textarea')), 51084 result_textareas = result.find('textarea').add(result.filter('textarea')), 51085 my_selects = this.find('select').add(this.filter('select')), 51086 result_selects = result.find('select').add(result.filter('select')); 51087 51088 for (var i = 0, l = my_textareas.length; i < l; ++i) $(result_textareas[i]).val($(my_textareas[i]).val()); 51089 for (var i = 0, l = my_selects.length; i < l; ++i) { 51090 for (var j = 0, m = my_selects[i].options.length; j < m; ++j) { 51091 if (my_selects[i].options[j].selected === true) { 51092 result_selects[i].options[j].selected = true; 51093 } 51094 } 51095 } 51096 return result; 51097 }; 51098}) (jQuery.fn.clone); 51099 51100// Generated by SDoc 51101 51102/*! 51103 * jQuery Cookie Plugin v1.3.1 51104 * https://github.com/carhartl/jquery-cookie 51105 * 51106 * Copyright 2013 Klaus Hartl 51107 * Released under the MIT license 51108 */ 51109(function (factory) 51110{ 51111 if (typeof define === 'function' && define.amd) 51112 { 51113 // AMD. Register as anonymous module. 51114 define(['jquery'], factory); 51115 } else 51116 { 51117 // Browser globals. 51118 factory(jQuery); 51119 } 51120}(function ($) 51121{ 51122 51123 var pluses = /\+/g; 51124 51125 function raw(s) 51126 { 51127 return s; 51128 } 51129 51130 function decoded(s) 51131 { 51132 return decodeURIComponent(s.replace(pluses, ' ')); 51133 } 51134 51135 function converted(s) 51136 { 51137 if (s.indexOf('"') === 0) 51138 { 51139 // This is a quoted cookie as according to RFC2068, unescape 51140 s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); 51141 } 51142 try 51143 { 51144 return config.json ? JSON.parse(s) : s; 51145 } catch (er) { } 51146 } 51147 51148 var config = $.cookie = function (key, value, options) 51149 { 51150 51151 // write 51152 if (value !== undefined) 51153 { 51154 options = $.extend({}, config.defaults, options); 51155 51156 if (typeof options.expires === 'number') 51157 { 51158 var days = options.expires, t = options.expires = new Date(); 51159 t.setDate(t.getDate() + days); 51160 } 51161 51162 value = config.json ? JSON.stringify(value) : String(value); 51163 51164 return (document.cookie = [ 51165 config.raw ? key : encodeURIComponent(key), 51166 '=', 51167 config.raw ? value : encodeURIComponent(value), 51168 options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 51169 options.path ? '; path=' + options.path : '', 51170 options.domain ? '; domain=' + options.domain : '', 51171 options.secure ? '; secure' : '' 51172 ].join('')); 51173 } 51174 51175 // read 51176 var decode = config.raw ? raw : decoded; 51177 var cookies = document.cookie.split('; '); 51178 var result = key ? undefined : {}; 51179 for (var i = 0, l = cookies.length; i < l; i++) 51180 { 51181 var parts = cookies[i].split('='); 51182 var name = decode(parts.shift()); 51183 var cookie = decode(parts.join('=')); 51184 51185 if (key && key === name) 51186 { 51187 result = converted(cookie); 51188 break; 51189 } 51190 51191 if (!key) 51192 { 51193 result[name] = converted(cookie); 51194 } 51195 } 51196 51197 return result; 51198 }; 51199 51200 config.defaults = {}; 51201 51202 $.removeCookie = function (key, options) 51203 { 51204 if ($.cookie(key) !== undefined) 51205 {
51206 // Must not alter options, thus extending a fresh object... 51207 $.cookie(key, '', $.extend({}, options, { expires: -1 })); 51208 return true; 51209 } 51210 return false; 51211 }; 51212 51213})); 51214/*! 51215 * jQuery Validation Plugin 51216 * 51217 * http://jqueryvalidation.org/ 51218 * 51219 * Copyright (c) 2015 Jörn Zaefferer 51220 * Released under the MIT license 51221 */ 51222(function( factory ) { 51223 if ( typeof define === "function" && define.amd ) { 51224 define( ["jquery"], factory ); 51225 } else { 51226 factory( jQuery ); 51227 } 51228}(function( $ ) { 51229 51230$.extend($.fn, { 51231 // http://jqueryvalidation.org/validate/ 51232 validate: function( options ) { 51233 51234 // if nothing is selected, return nothing; can't chain anyway 51235 if ( !this.length ) { 51236 if ( options && options.debug && window.console ) { 51237 console.warn( "Nothing selected, can't validate, returning nothing." ); 51238 } 51239 return; 51240 } 51241 51242 // check if a validator for this form was already created 51243 var validator = $.data( this[ 0 ], "validator" ); 51244 if ( validator ) { 51245 return validator; 51246 } 51247 51248 // Add novalidate tag if HTML5. 51249 this.attr( "novalidate", "novalidate" ); 51250 51251 validator = new $.validator( options, this[ 0 ] ); 51252 $.data( this[ 0 ], "validator", validator ); 51253 51254 if ( validator.settings.onsubmit ) { 51255 51256 this.on( "click.validate", ":submit", function( event ) { 51257 if ( validator.settings.submitHandler ) { 51258 validator.submitButton = event.target; 51259 } 51260 51261 // allow suppressing validation by adding a cancel class to the submit button 51262 if ( $( this ).hasClass( "cancel" ) ) { 51263 validator.cancelSubmit = true; 51264 } 51265 51266 // allow suppressing validation by adding the html5 formnovalidate attribute to the submit button 51267 if ( $( this ).attr( "formnovalidate" ) !== undefined ) { 51268 validator.cancelSubmit = true; 51269 } 51270 }); 51271 51272 // validate the form on submit 51273 this.on( "submit.validate", function( event ) { 51274 if ( validator.settings.debug ) { 51275 // prevent form submit to be able to see console output 51276 event.preventDefault(); 51277 } 51278 function handle() { 51279 var hidden, result; 51280 if ( validator.settings.submitHandler ) { 51281 if ( validator.submitButton ) { 51282 // insert a hidden input as a replacement for the missing submit button 51283 hidden = $( "<input type='hidden'/>" ) 51284 .attr( "name", validator.submitButton.name ) 51285 .val( $( validator.submitButton ).val() ) 51286 .appendTo( validator.currentForm ); 51287 } 51288 result = validator.settings.submitHandler.call( validator, validator.currentForm, event ); 51289 if ( validator.submitButton ) { 51290 // and clean up afterwards; thanks to no-block-scope, hidden can be referenced 51291 hidden.remove(); 51292 } 51293 if ( result !== undefined ) { 51294 return result; 51295 } 51296 return false; 51297 } 51298 return true; 51299 } 51300 51301 // prevent submit for invalid forms or custom submit handlers 51302 if ( validator.cancelSubmit ) { 51303 validator.cancelSubmit = false; 51304 return handle(); 51305 } 51306 if ( validator.form() ) { 51307 if ( validator.pendingRequest ) { 51308 validator.formSubmitted = true; 51309 return false; 51310 } 51311 return handle(); 51312 } else { 51313 validator.focusInvalid(); 51314 return false; 51315 } 51316 }); 51317 } 51318 51319 return validator; 51320 }, 51321 // http://jqueryvalidation.org/valid/ 51322 valid: function() { 51323 var valid, validator, errorList; 51324 51325 if ( $( this[ 0 ] ).is( "form" ) ) { 51326 valid = this.validate().form(); 51327 } else { 51328 errorList = []; 51329 valid = true; 51330 validator = $( this[ 0 ].form ).validate(); 51331 this.each( function() { 51332 valid = validator.element( this ) && valid; 51333 errorList = errorList.concat( validator.errorList ); 51334 }); 51335 validator.errorList = errorList; 51336 } 51337 return valid; 51338 }, 51339 51340 // http://jqueryvalidation.org/rules/ 51341 rules: function( command, argument ) { 51342 var element = this[ 0 ], 51343 settings, staticRules, existingRules, data, param, filtered; 51344 51345 if ( command ) { 51346 settings = $.data( element.form, "validator" ).settings; 51347 staticRules = settings.rules; 51348 existingRules = $.validator.staticRules( element ); 51349 switch ( command ) { 51350 case "add": 51351 $.extend( existingRules, $.validator.normalizeRule( argument ) ); 51352 // remove messages from rules, but allow them to be set separately 51353 delete existingRules.messages; 51354 staticRules[ element.name ] = existingRules; 51355 if ( argument.messages ) { 51356 settings.messages[ element.name ] = $.extend( settings.messages[ element.name ], argument.messages ); 51357 } 51358 break; 51359 case "remove": 51360 if ( !argument ) { 51361 delete staticRules[ element.name ]; 51362 return existingRules; 51363 } 51364 filtered = {}; 51365 $.each( argument.split( /\s/ ), function( index, method ) { 51366 filtered[ method ] = existingRules[ method ]; 51367 delete existingRules[ method ]; 51368 if ( method === "required" ) { 51369 $( element ).removeAttr( "aria-required" ); 51370 } 51371 }); 51372 return filtered; 51373 } 51374 } 51375 51376 data = $.validator.normalizeRules( 51377 $.extend( 51378 {}, 51379 $.validator.classRules( element ), 51380 $.validator.attributeRules( element ), 51381 $.validator.dataRules( element ), 51382 $.validator.staticRules( element ) 51383 ), element ); 51384 51385 // make sure required is at front 51386 if ( data.required ) { 51387 param = data.required; 51388 delete data.required; 51389 data = $.extend( { required: param }, data ); 51390 $( element ).attr( "aria-required", "true" ); 51391 } 51392 51393 // make sure remote is at back 51394 if ( data.remote ) { 51395 param = data.remote; 51396 delete data.remote; 51397 data = $.extend( data, { remote: param }); 51398 } 51399 51400 return data; 51401 } 51402}); 51403 51404// Custom selectors 51405$.extend( $.expr[ ":" ], { 51406 // http://jqueryvalidation.org/blank-selector/ 51407 blank: function( a ) { 51408 return !$.trim( "" + $( a ).val() ); 51409 }, 51410 // http://jqueryvalidation.org/filled-selector/ 51411 filled: function( a ) { 51412 return !!$.trim( "" + $( a ).val() ); 51413 }, 51414 // http://jqueryvalidation.org/unchecked-selector/ 51415 unchecked: function( a ) { 51416 return !$( a ).prop( "checked" ); 51417 } 51418}); 51419 51420// constructor for validator 51421$.validator = function( options, form ) { 51422 this.settings = $.extend( true, {}, $.validator.defaults, options ); 51423 this.currentForm = form; 51424 this.init(); 51425}; 51426 51427// http://jqueryvalidation.org/jQuery.validator.format/ 51428$.validator.format = function( source, params ) { 51429 if ( arguments.length === 1 ) { 51430 return function() { 51431 var args = $.makeArray( arguments ); 51432 args.unshift( source ); 51433 return $.validator.format.apply( this, args ); 51434 }; 51435 } 51436 if ( arguments.length > 2 && params.constructor !== Array ) { 51437 params = $.makeArray( arguments ).slice( 1 ); 51438 } 51439 if ( params.constructor !== Array ) { 51440 params = [ params ]; 51441 } 51442 $.each( params, function( i, n ) { 51443 source = source.replace( new RegExp( "\\{" + i + "\\}", "g" ), function() { 51444 return n; 51445 }); 51446 }); 51447 return source; 51448}; 51449 51450$.extend( $.validator, { 51451 51452 defaults: { 51453 messages: {}, 51454 groups: {}, 51455 rules: {}, 51456 errorClass: "error", 51457 validClass: "valid", 51458 errorElement: "label", 51459 focusCleanup: false, 51460 focusInvalid: true, 51461 errorContainer: $( [] ), 51462 errorLabelContainer: $( [] ), 51463 onsubmit: true, 51464 ignore: ":hidden", 51465 ignoreTitle: false, 51466 onfocusin: function( element ) { 51467 this.lastActive = element; 51468 51469 // Hide error label and remove error class on focus if enabled 51470 if ( this.settings.focusCleanup ) { 51471 if ( this.settings.unhighlight ) { 51472 this.settings.unhighlight.call( this, element, this.settings.errorClass, this.settings.val
vendor: 4,643 bytes, lines 51472-51602
51472idClass ); 51473 } 51474 this.hideThese( this.errorsFor( element ) ); 51475 } 51476 }, 51477 onfocusout: function( element ) { 51478 if ( !this.checkable( element ) && ( element.name in this.submitted || !this.optional( element ) ) ) { 51479 this.element( element ); 51480 } 51481 }, 51482 onkeyup: function( element, event ) { 51483 // Avoid revalidate the field when pressing one of the following keys 51484 // Shift => 16 51485 // Ctrl => 17 51486 // Alt => 18 51487 // Caps lock => 20 51488 // End => 35 51489 // Home => 36 51490 // Left arrow => 37 51491 // Up arrow => 38 51492 // Right arrow => 39 51493 // Down arrow => 40 51494 // Insert => 45 51495 // Num lock => 144 51496 // AltGr key => 225 51497 var excludedKeys = [ 51498 16, 17, 18, 20, 35, 36, 37, 51499 38, 39, 40, 45, 144, 225 51500 ]; 51501 51502 if ( event.which === 9 && this.elementValue( element ) === "" || $.inArray( event.keyCode, excludedKeys ) !== -1 ) { 51503 return; 51504 } else if ( element.name in this.submitted || element === this.lastElement ) { 51505 this.element( element ); 51506 } 51507 }, 51508 onclick: function( element ) { 51509 // click on selects, radiobuttons and checkboxes 51510 if ( element.name in this.submitted ) { 51511 this.element( element ); 51512 51513 // or option elements, check parent select in that case 51514 } else if ( element.parentNode.name in this.submitted ) { 51515 this.element( element.parentNode ); 51516 } 51517 }, 51518 highlight: function( element, errorClass, validClass ) { 51519 if ( element.type === "radio" ) { 51520 this.findByName( element.name ).addClass( errorClass ).removeClass( validClass ); 51521 } else { 51522 $( element ).addClass( errorClass ).removeClass( validClass ); 51523 } 51524 }, 51525 unhighlight: function( element, errorClass, validClass ) { 51526 if ( element.type === "radio" ) { 51527 this.findByName( element.name ).removeClass( errorClass ).addClass( validClass ); 51528 } else { 51529 $( element ).removeClass( errorClass ).addClass( validClass ); 51530 } 51531 } 51532 }, 51533 51534 // http://jqueryvalidation.org/jQuery.validator.setDefaults/ 51535 setDefaults: function( settings ) { 51536 $.extend( $.validator.defaults, settings ); 51537 }, 51538 51539 messages: { 51540 required: "This field is required.", 51541 remote: "Please fix this field.", 51542 email: "Please enter a valid email address.", 51543 url: "Please enter a valid URL.", 51544 date: "Please enter a valid date.", 51545 dateISO: "Please enter a valid date ( ISO ).", 51546 number: "Please enter a valid number.", 51547 digits: "Please enter only digits.", 51548 creditcard: "Please enter a valid credit card number.", 51549 equalTo: "Please enter the same value again.", 51550 maxlength: $.validator.format( "Please enter no more than {0} characters." ), 51551 minlength: $.validator.format( "Please enter at least {0} characters." ), 51552 rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ), 51553 range: $.validator.format( "Please enter a value between {0} and {1}." ), 51554 max: $.validator.format( "Please enter a value less than or equal to {0}." ), 51555 min: $.validator.format( "Please enter a value greater than or equal to {0}." ) 51556 }, 51557 51558 autoCreateRanges: false, 51559 51560 prototype: { 51561 51562 init: function() { 51563 this.labelContainer = $( this.settings.errorLabelContainer ); 51564 this.errorContext = this.labelContainer.length && this.labelContainer || $( this.currentForm ); 51565 this.containers = $( this.settings.errorContainer ).add( this.settings.errorLabelContainer ); 51566 this.submitted = {}; 51567 this.valueCache = {}; 51568 this.pendingRequest = 0; 51569 this.pending = {}; 51570 this.invalid = {}; 51571 this.reset(); 51572 51573 var groups = ( this.groups = {} ), 51574 rules; 51575 $.each( this.settings.groups, function( key, value ) { 51576 if ( typeof value === "string" ) { 51577 value = value.split( /\s/ ); 51578 } 51579 $.each( value, function( index, name ) { 51580 groups[ name ] = key; 51581 }); 51582 }); 51583 rules = this.settings.rules; 51584 $.each( rules, function( key, value ) { 51585 rules[ key ] = $.validator.normalizeRule( value ); 51586 }); 51587 51588 function delegate( event ) { 51589 var validator = $.data( this.form, "validator" ), 51590 eventType = "on" + event.type.replace( /^validate/, "" ), 51591 settings = validator.settings; 51592 if ( settings[ eventType ] && !$( this ).is( settings.ignore ) ) { 51593 settings[ eventType ].call( validator, this, event ); 51594 } 51595 } 51596 51597 $( this.currentForm ) 51598 .on( "focusin.validate focusout.validate keyup.validate", 51599 ":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], " + 51600 "[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], " + 51601 "[type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], " + 51602 "[type='radio'], [type='checkbox']", delegate)
51603 // Support: Chrome, oldIE 51604 // "select" is provided as event.target when clicking a option 51605 .on("click.validate", "select, option, [type='radio'], [type='checkbox']", delegate); 51606 51607 if ( this.settings.invalidHandler ) { 51608 $( this.currentForm ).on( "invalid-form.validate", this.settings.invalidHandler ); 51609 } 51610 51611 // Add aria-required to any Static/Data/Class required fields before first validation 51612 // Screen readers require this attribute to be present before the initial submission http://www.w3.org/TR/WCAG-TECHS/ARIA2.html 51613 $( this.currentForm ).find( "[required], [data-rule-required], .required" ).attr( "aria-required", "true" ); 51614 }, 51615 51616 // http://jqueryvalidation.org/Validator.form/ 51617 form: function() { 51618 this.checkForm(); 51619 $.extend( this.submitted, this.errorMap ); 51620 this.invalid = $.extend({}, this.errorMap ); 51621 if ( !this.valid() ) { 51622 $( this.currentForm ).triggerHandler( "invalid-form", [ this ]); 51623 } 51624 this.showErrors(); 51625 return this.valid(); 51626 }, 51627 51628 checkForm: function() { 51629 this.prepareForm(); 51630 for ( var i = 0, elements = ( this.currentElements = this.elements() ); elements[ i ]; i++ ) { 51631 this.check( elements[ i ] ); 51632 } 51633 return this.valid(); 51634 }, 51635 51636 // http://jqueryvalidation.org/Validator.element/ 51637 element: function( element ) { 51638 var cleanElement = this.clean( element ), 51639 checkElement = this.validationTargetFor( cleanElement ), 51640 result = true; 51641 51642 this.lastElement = checkElement; 51643 51644 if ( checkElement === undefined ) { 51645 delete this.invalid[ cleanElement.name ]; 51646 } else { 51647 this.prepareElement( checkElement ); 51648 this.currentElements = $( checkElement ); 51649 51650 result = this.check( checkElement ) !== false; 51651 if ( result ) { 51652 delete this.invalid[ checkElement.name ]; 51653 } else { 51654 this.invalid[ checkElement.name ] = true; 51655 } 51656 } 51657 // Add aria-invalid status for screen readers 51658 $( element ).attr( "aria-invalid", !result ); 51659 51660 if ( !this.numberOfInvalids() ) { 51661 // Hide error containers on last error 51662 this.toHide = this.toHide.add( this.containers ); 51663 } 51664 this.showErrors(); 51665 return result; 51666 }, 51667 51668 // http://jqueryvalidation.org/Validator.showErrors/ 51669 showErrors: function( errors ) { 51670 if ( errors ) { 51671 // add items to error list and map 51672 $.extend( this.errorMap, errors ); 51673 this.errorList = []; 51674 for ( var name in errors ) { 51675 this.errorList.push({ 51676 message: errors[ name ], 51677 element: this.findByName( name )[ 0 ] 51678 }); 51679 } 51680 // remove items from success list 51681 this.successList = $.grep( this.successList, function( element ) { 51682 return !( element.name in errors ); 51683 }); 51684 } 51685 if ( this.settings.showErrors ) { 51686 this.settings.showErrors.call( this, this.errorMap, this.errorList ); 51687 } else { 51688 this.defaultShowErrors(); 51689 } 51690 }, 51691 51692 // http://jqueryvalidation.org/Validator.resetForm/ 51693 resetForm: function() { 51694 if ( $.fn.resetForm ) { 51695 $( this.currentForm ).resetForm(); 51696 } 51697 this.submitted = {}; 51698 this.lastElement = null; 51699 this.prepareForm(); 51700 this.hideErrors(); 51701 var i, elements = this.elements() 51702 .removeData( "previousValue" ) 51703 .removeAttr( "aria-invalid" ); 51704 51705 if ( this.settings.unhighlight ) { 51706 for ( i = 0; elements[ i ]; i++ ) { 51707 this.settings.unhighlight.call( this, elements[ i ], 51708 this.settings.errorClass, "" ); 51709 } 51710 } else { 51711 elements.removeClass( this.settings.errorClass ); 51712 } 51713 }, 51714 51715 numberOfInvalids: function() { 51716 return this.objectLength( this.invalid ); 51717 }, 51718 51719 objectLength: function( obj ) { 51720 /* jshint unused: false */ 51721 var count = 0, 51722 i; 51723 for ( i in obj ) { 51724 count++; 51725 } 51726 return count; 51727 }, 51728 51729 hideErrors: function() { 51730 this.hideThese( this.toHide ); 51731 }, 51732 51733 hideThese: function( errors ) { 51734 errors.not( this.containers ).text( "" ); 51735 this.addWrapper( errors ).hide(); 51736 }, 51737 51738 valid: function() { 51739 return this.size() === 0; 51740 }, 51741 51742 size: function() { 51743 return this.errorList.length; 51744 }, 51745 51746 focusInvalid: function() { 51747 if ( this.settings.focusInvalid ) { 51748 try { 51749 $( this.findLastActive() || this.errorList.length && this.errorList[ 0 ].element || []) 51750 .filter( ":visible" ) 51751 .focus() 51752 // manually trigger focusin event; without it, focusin handler isn't called, findLastActive won't have anything to find 51753 .trigger( "focusin" ); 51754 } catch ( e ) {
51755 // ignore IE throwing errors when focusing hidden elements 51756 } 51757 } 51758 }, 51759 51760 findLastActive: function() { 51761 var lastActive = this.lastActive; 51762 return lastActive && $.grep( this.errorList, function( n ) { 51763 return n.element.name === lastActive.name; 51764 }).length === 1 && lastActive; 51765 }, 51766 51767 elements: function() { 51768 var validator = this, 51769 rulesCache = {}; 51770 51771 // select all valid inputs inside the form (no submit or reset buttons) 51772 return $( this.currentForm ) 51773 .find( "input, select, textarea" ) 51774 .not( ":submit, :reset, :image, :disabled" ) 51775 .not( this.settings.ignore ) 51776 .filter( function() { 51777 if ( !this.name && validator.settings.debug && window.console ) { 51778 console.error( "%o has no name assigned", this ); 51779 } 51780 51781 // select only the first element for each name, and only those with rules specified 51782 if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) { 51783 return false; 51784 } 51785 51786 rulesCache[ this.name ] = true; 51787 return true; 51788 }); 51789 }, 51790 51791 clean: function( selector ) { 51792 return $( selector )[ 0 ]; 51793 }, 51794 51795 errors: function() { 51796 var errorClass = this.settings.errorClass.split( " " ).join( "." ); 51797 return $( this.settings.errorElement + "." + errorClass, this.errorContext ); 51798 }, 51799 51800 reset: function() { 51801 this.successList = []; 51802 this.errorList = []; 51803 this.errorMap = {}; 51804 this.toShow = $( [] ); 51805 this.toHide = $( [] ); 51806 this.currentElements = $( [] ); 51807 }, 51808 51809 prepareForm: function() { 51810 this.reset(); 51811 this.toHide = this.errors().add( this.containers ); 51812 }, 51813 51814 prepareElement: function( element ) { 51815 this.reset(); 51816 this.toHide = this.errorsFor( element ); 51817 }, 51818 51819 elementValue: function( element ) { 51820 var val, 51821 $element = $( element ), 51822 type = element.type; 51823 51824 if ( type === "radio" || type === "checkbox" ) { 51825 return this.findByName( element.name ).filter(":checked").val(); 51826 } else if ( type === "number" && typeof element.validity !== "undefined" ) { 51827 return element.validity.badInput ? false : $element.val(); 51828 } 51829 51830 val = $element.val(); 51831 if ( typeof val === "string" ) { 51832 return val.replace(/\r/g, "" ); 51833 } 51834 return val; 51835 }, 51836 51837 check: function( element ) { 51838 element = this.validationTargetFor( this.clean( element ) ); 51839 51840 var rules = $( element ).rules(), 51841 rulesCount = $.map( rules, function( n, i ) { 51842 return i; 51843 }).length, 51844 dependencyMismatch = false, 51845 val = this.elementValue( element ), 51846 result, method, rule; 51847 51848 for ( method in rules ) { 51849 rule = { method: method, parameters: rules[ method ] }; 51850 try { 51851 51852 result = $.validator.methods[ method ].call( this, val, element, rule.parameters ); 51853 51854 // if a method indicates that the field is optional and therefore valid, 51855 // don't mark it as valid when there are no other rules 51856 if ( result === "dependency-mismatch" && rulesCount === 1 ) { 51857 dependencyMismatch = true; 51858 continue; 51859 } 51860 dependencyMismatch = false; 51861 51862 if ( result === "pending" ) { 51863 this.toHide = this.toHide.not( this.errorsFor( element ) ); 51864 return; 51865 } 51866 51867 if ( !result ) { 51868 this.formatAndAdd( element, rule ); 51869 return false; 51870 } 51871 } catch ( e ) { 51872 if ( this.settings.debug && window.console ) { 51873 console.log( "Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method.", e ); 51874 } 51875 if ( e instanceof TypeError ) { 51876 e.message += ". Exception occurred when checking element " + element.id + ", check the '" + rule.method + "' method."; 51877 } 51878 51879 throw e; 51880 } 51881 } 51882 if ( dependencyMismatch ) { 51883 return; 51884 } 51885 if ( this.objectLength( rules ) ) { 51886 this.successList.push( element ); 51887 } 51888 return true; 51889 }, 51890 51891 // return the custom message for the given element and validation method 51892 // specified in the element's HTML5 data attribute 51893 // return the generic message if present and no method specific message is present 51894 customDataMessage: function( element, method ) { 51895 return $( element ).data( "msg" + method.charAt( 0 ).toUpperCase() + 51896 method.substring( 1 ).toLowerCase() ) || $( element ).data( "msg" ); 51897 }, 51898 51899 // return the custom message for the given element name and validation method 51900 customMessage: function( name, method ) { 51901 var m = this.settings.messages[ name ]; 51902 return m && ( m.constructor === String ? m : m[ method ]); 51903 }, 51904 51905 // return the first defined argument, allowing empty strings 51906 findDefined: function() { 51907 for ( var i = 0; i < arguments.length; i++) { 51908 if ( arguments[ i ] !== undefined ) { 51909 return arguments[ i ]; 51910 } 51911 } 51912 return undefined; 51913 }, 51914 51915 defaultMessage: function( element, method ) { 51916 return this.findDefined( 51917 this.customMessage( element.name, method ), 51918 this.customDataMessage( element, method ), 51919 // title is never undefined, so handle empty string as undefined 51920 !this.settings.ignoreTitle && element.title || undefined, 51921 $.validator.messages[ method ], 51922 "<strong>Warning: No message defined for " + element.name + "</strong>" 51923 ); 51924 }, 51925 51926 formatAndAdd: function( element, rule ) { 51927 var message = this.defaultMessage( element, rule.method ), 51928 theregex = /\$?\{(\d+)\}/g; 51929 if ( typeof message === "function" ) { 51930 message = message.call( this, rule.parameters, element ); 51931 } else if ( theregex.test( message ) ) { 51932 message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters ); 51933 } 51934 this.errorList.push({ 51935 message: message, 51936 element: element, 51937 method: rule.method 51938 }); 51939 51940 this.errorMap[ element.name ] = message; 51941 this.submitted[ element.name ] = message; 51942 }, 51943 51944 addWrapper: function( toToggle ) { 51945 if ( this.settings.wrapper ) { 51946 toToggle = toToggle.add( toToggle.parent( this.settings.wrapper ) ); 51947 } 51948 return toToggle; 51949 }, 51950 51951 defaultShowErrors: function() { 51952 var i, elements, error; 51953 for ( i = 0; this.errorList[ i ]; i++ ) { 51954 error = this.errorList[ i ]; 51955 if ( this.settings.highlight ) { 51956 this.settings.highlight.call( this, error.element, this.settings.errorClass, this.settings.val
51956idClass ); 51957 } 51958 this.showLabel( error.element, error.message ); 51959 } 51960 if ( this.errorList.length ) { 51961 this.toShow = this.toShow.add( this.containers ); 51962 } 51963 if ( this.settings.success ) { 51964 for ( i = 0; this.successList[ i ]; i++ ) { 51965 this.showLabel( this.successList[ i ] ); 51966 } 51967 } 51968 if ( this.settings.unhighlight ) { 51969 for ( i = 0, elements = this.validElements(); elements[ i ]; i++ ) { 51970 this.settings.unhighlight.call( this, elements[ i ], this.settings.errorClass, this.settings.validClass ); 51971 } 51972 } 51973 this.toHide = this.toHide.not( this.toShow ); 51974 this.hideErrors(); 51975 this.addWrapper( this.toShow ).show(); 51976 }, 51977 51978 validElements: function() { 51979 return this.currentElements.not( this.invalidElements() ); 51980 }, 51981 51982 invalidElements: function() { 51983 return $( this.errorList ).map(function() { 51984 return this.element; 51985 }); 51986 }, 51987 51988 showLabel: function( element, message ) { 51989 var place, group, errorID, 51990 error = this.errorsFor( element ), 51991 elementID = this.idOrName( element ), 51992 describedBy = $( element ).attr( "aria-describedby" ); 51993 if ( error.length ) { 51994 // refresh error/success class 51995 error.removeClass( this.settings.validClass ).addClass( this.settings.errorClass ); 51996 // replace message on existing label 51997 error.html( message ); 51998 } else { 51999 // create error element 52000 error = $( "<" + this.settings.errorElement + ">" ) 52001 .attr( "id", elementID + "-error" ) 52002 .addClass( this.settings.errorClass ) 52003 .html( message || "" ); 52004 52005 // Maintain reference to the element to be placed into the DOM 52006 place = error; 52007 if ( this.settings.wrapper ) { 52008 // make sure the element is visible, even in IE 52009 // actually showing the wrapped element is handled elsewhere 52010 place = error.hide().show().wrap( "<" + this.settings.wrapper + "/>" ).parent(); 52011 } 52012 if ( this.labelContainer.length ) { 52013 this.labelContainer.append( place ); 52014 } else if ( this.settings.errorPlacement ) { 52015 this.settings.errorPlacement( place, $( element ) ); 52016 } else { 52017 place.insertAfter( element ); 52018 } 52019 52020 // Link error back to the element 52021 if ( error.is( "label" ) ) { 52022 // If the error is a label, then associate using 'for' 52023 error.attr( "for", elementID ); 52024 } else if ( error.parents( "label[for='" + elementID + "']" ).length === 0 ) { 52025 // If the element is not a child of an associated label, then it's necessary 52026 // to explicitly apply aria-describedby 52027 52028 errorID = error.attr( "id" ).replace( /(:|\.|\[|\]|\$)/g, "\\$1"); 52029 // Respect existing non-error aria-describedby 52030 if ( !describedBy ) { 52031 describedBy = errorID; 52032 } else if ( !describedBy.match( new RegExp( "\\b" + errorID + "\\b" ) ) ) { 52033 // Add to end of list if not already present 52034 describedBy += " " + errorID; 52035 } 52036 $( element ).attr( "aria-describedby", describedBy ); 52037 52038 // If this element is grouped, then assign to all elements in the same group 52039 group = this.groups[ element.name ]; 52040 if ( group ) { 52041 $.each( this.groups, function( name, testgroup ) { 52042 if ( testgroup === group ) { 52043 $( "[name='" + name + "']", this.currentForm ) 52044 .attr( "aria-describedby", error.attr( "id" ) ); 52045 } 52046 }); 52047 } 52048 } 52049 } 52050 if ( !message && this.settings.success ) { 52051 error.text( "" ); 52052 if ( typeof this.settings.success === "string" ) { 52053 error.addClass( this.settings.success ); 52054 } else { 52055 this.settings.success( error, element ); 52056 } 52057 } 52058 this.toShow = this.toShow.add( error ); 52059 }, 52060 52061 errorsFor: function( element ) { 52062 var name = this.idOrName( element ), 52063 describer = $( element ).attr( "aria-describedby" ), 52064 selector = "label[for='" + name + "'], label[for='" + name + "'] *"; 52065 52066 // aria-describedby should directly reference the error element 52067 if ( describer ) { 52068 selector = selector + ", #" + describer.replace( /\s+/g, ", #" ); 52069 } 52070 return this 52071 .errors() 52072 .filter( selector ); 52073 }, 52074 52075 idOrName: function( element ) { 52076 return this.groups[ element.name ] || ( this.checkable( element ) ? element.name : element.i
vendor: 9,590 bytes, lines 52076-52408
52076d || element.name ); 52077 }, 52078 52079 validationTargetFor: function( element ) { 52080 52081 // If radio/checkbox, validate first element in group instead 52082 if ( this.checkable( element ) ) { 52083 element = this.findByName( element.name ); 52084 } 52085 52086 // Always apply ignore filter 52087 return $( element ).not( this.settings.ignore )[ 0 ]; 52088 }, 52089 52090 checkable: function( element ) { 52091 return ( /radio|checkbox/i ).test( element.type ); 52092 }, 52093 52094 findByName: function( name ) { 52095 return $( this.currentForm ).find( "[name='" + name + "']" ); 52096 }, 52097 52098 getLength: function( value, element ) { 52099 switch ( element.nodeName.toLowerCase() ) { 52100 case "select": 52101 return $( "option:selected", element ).length; 52102 case "input": 52103 if ( this.checkable( element ) ) { 52104 return this.findByName( element.name ).filter( ":checked" ).length; 52105 } 52106 } 52107 return value.length; 52108 }, 52109 52110 depend: function( param, element ) { 52111 return this.dependTypes[typeof param] ? this.dependTypes[typeof param]( param, element ) : true; 52112 }, 52113 52114 dependTypes: { 52115 "boolean": function( param ) { 52116 return param; 52117 }, 52118 "string": function( param, element ) { 52119 return !!$( param, element.form ).length; 52120 }, 52121 "function": function( param, element ) { 52122 return param( element ); 52123 } 52124 }, 52125 52126 optional: function( element ) { 52127 var val = this.elementValue( element ); 52128 return !$.validator.methods.required.call( this, val, element ) && "dependency-mismatch"; 52129 }, 52130 52131 startRequest: function( element ) { 52132 if ( !this.pending[ element.name ] ) { 52133 this.pendingRequest++; 52134 this.pending[ element.name ] = true; 52135 } 52136 }, 52137 52138 stopRequest: function( element, valid ) { 52139 this.pendingRequest--; 52140 // sometimes synchronization fails, make sure pendingRequest is never < 0 52141 if ( this.pendingRequest < 0 ) { 52142 this.pendingRequest = 0; 52143 } 52144 delete this.pending[ element.name ]; 52145 if ( valid && this.pendingRequest === 0 && this.formSubmitted && this.form() ) { 52146 $( this.currentForm ).submit(); 52147 this.formSubmitted = false; 52148 } else if (!valid && this.pendingRequest === 0 && this.formSubmitted ) { 52149 $( this.currentForm ).triggerHandler( "invalid-form", [ this ]); 52150 this.formSubmitted = false; 52151 } 52152 }, 52153 52154 previousValue: function( element ) { 52155 return $.data( element, "previousValue" ) || $.data( element, "previousValue", { 52156 old: null, 52157 valid: true, 52158 message: this.defaultMessage( element, "remote" ) 52159 }); 52160 }, 52161 52162 // cleans up all forms and elements, removes validator-specific events 52163 destroy: function() { 52164 this.resetForm(); 52165 52166 $( this.currentForm ) 52167 .off( ".validate" ) 52168 .removeData( "validator" ); 52169 } 52170 52171 }, 52172 52173 classRuleSettings: { 52174 required: { required: true }, 52175 email: { email: true }, 52176 url: { url: true }, 52177 date: { date: true }, 52178 dateISO: { dateISO: true }, 52179 number: { number: true }, 52180 digits: { digits: true }, 52181 creditcard: { creditcard: true } 52182 }, 52183 52184 addClassRules: function( className, rules ) { 52185 if ( className.constructor === String ) { 52186 this.classRuleSettings[ className ] = rules; 52187 } else { 52188 $.extend( this.classRuleSettings, className ); 52189 } 52190 }, 52191 52192 classRules: function( element ) { 52193 var rules = {}, 52194 classes = $( element ).attr( "class" ); 52195 52196 if ( classes ) { 52197 $.each( classes.split( " " ), function() { 52198 if ( this in $.validator.classRuleSettings ) { 52199 $.extend( rules, $.validator.classRuleSettings[ this ]); 52200 } 52201 }); 52202 } 52203 return rules; 52204 }, 52205 52206 normalizeAttributeRule: function( rules, type, method, value ) { 52207 52208 // convert the value to a number for number inputs, and for text for backwards compability 52209 // allows type="date" and others to be compared as strings 52210 if ( /min|max/.test( method ) && ( type === null || /number|range|text/.test( type ) ) ) { 52211 value = Number( value ); 52212 52213 // Support Opera Mini, which returns NaN for undefined minlength 52214 if ( isNaN( value ) ) { 52215 value = undefined; 52216 } 52217 } 52218 52219 if ( value || value === 0 ) { 52220 rules[ method ] = value; 52221 } else if ( type === method && type !== "range" ) { 52222 52223 // exception: the jquery validate 'range' method 52224 // does not test for the html5 'range' type 52225 rules[ method ] = true; 52226 } 52227 }, 52228 52229 attributeRules: function( element ) { 52230 var rules = {}, 52231 $element = $( element ), 52232 type = element.getAttribute( "type" ), 52233 method, value; 52234 52235 for ( method in $.validator.methods ) { 52236 52237 // support for <input required> in both html5 and older browsers 52238 if ( method === "required" ) { 52239 value = element.getAttribute( method ); 52240 52241 // Some browsers return an empty string for the required attribute 52242 // and non-HTML5 browsers might have required="" markup 52243 if ( value === "" ) { 52244 value = true; 52245 } 52246 52247 // force non-HTML5 browsers to return bool 52248 value = !!value; 52249 } else { 52250 value = $element.attr( method ); 52251 } 52252 52253 this.normalizeAttributeRule( rules, type, method, value ); 52254 } 52255 52256 // maxlength may be returned as -1, 2147483647 ( IE ) and 524288 ( safari ) for text inputs 52257 if ( rules.maxlength && /-1|2147483647|524288/.test( rules.maxlength ) ) { 52258 delete rules.maxlength; 52259 } 52260 52261 return rules; 52262 }, 52263 52264 dataRules: function( element ) { 52265 var rules = {}, 52266 $element = $( element ), 52267 type = element.getAttribute( "type" ), 52268 method, value; 52269 52270 for ( method in $.validator.methods ) { 52271 value = $element.data( "rule" + method.charAt( 0 ).toUpperCase() + method.substring( 1 ).toLowerCase() ); 52272 this.normalizeAttributeRule( rules, type, method, value ); 52273 } 52274 return rules; 52275 }, 52276 52277 staticRules: function( element ) { 52278 var rules = {}, 52279 validator = $.data( element.form, "validator" ); 52280 52281 if ( validator.settings.rules ) { 52282 rules = $.validator.normalizeRule( validator.settings.rules[ element.name ] ) || {}; 52283 } 52284 return rules; 52285 }, 52286 52287 normalizeRules: function( rules, element ) { 52288 // handle dependency check 52289 $.each( rules, function( prop, val ) { 52290 // ignore rule when param is explicitly false, eg. required:false 52291 if ( val === false ) { 52292 delete rules[ prop ]; 52293 return; 52294 } 52295 if ( val.param || val.depends ) { 52296 var keepRule = true; 52297 switch ( typeof val.depends ) { 52298 case "string": 52299 keepRule = !!$( val.depends, element.form ).length; 52300 break; 52301 case "function": 52302 keepRule = val.depends.call( element, element ); 52303 break; 52304 } 52305 if ( keepRule ) { 52306 rules[ prop ] = val.param !== undefined ? val.param : true; 52307 } else { 52308 delete rules[ prop ]; 52309 } 52310 } 52311 }); 52312 52313 // evaluate parameters 52314 $.each( rules, function( rule, parameter ) { 52315 rules[ rule ] = $.isFunction( parameter ) ? parameter( element ) : parameter; 52316 }); 52317 52318 // clean number parameters 52319 $.each([ "minlength", "maxlength" ], function() { 52320 if ( rules[ this ] ) { 52321 rules[ this ] = Number( rules[ this ] ); 52322 } 52323 }); 52324 $.each([ "rangelength", "range" ], function() { 52325 var parts; 52326 if ( rules[ this ] ) { 52327 if ( $.isArray( rules[ this ] ) ) { 52328 rules[ this ] = [ Number( rules[ this ][ 0 ]), Number( rules[ this ][ 1 ] ) ]; 52329 } else if ( typeof rules[ this ] === "string" ) { 52330 parts = rules[ this ].replace(/[\[\]]/g, "" ).split( /[\s,]+/ ); 52331 rules[ this ] = [ Number( parts[ 0 ]), Number( parts[ 1 ] ) ]; 52332 } 52333 } 52334 }); 52335 52336 if ( $.validator.autoCreateRanges ) { 52337 // auto-create ranges 52338 if ( rules.min != null && rules.max != null ) { 52339 rules.range = [ rules.min, rules.max ]; 52340 delete rules.min; 52341 delete rules.max; 52342 } 52343 if ( rules.minlength != null && rules.maxlength != null ) { 52344 rules.rangelength = [ rules.minlength, rules.maxlength ]; 52345 delete rules.minlength; 52346 delete rules.maxlength; 52347 } 52348 } 52349 52350 return rules; 52351 }, 52352 52353 // Converts a simple string to a {string: true} rule, e.g., "required" to {required:true} 52354 normalizeRule: function( data ) { 52355 if ( typeof data === "string" ) { 52356 var transformed = {}; 52357 $.each( data.split( /\s/ ), function() { 52358 transformed[ this ] = true; 52359 }); 52360 data = transformed; 52361 } 52362 return data; 52363 }, 52364 52365 // http://jqueryvalidation.org/jQuery.validator.addMethod/ 52366 addMethod: function( name, method, message ) { 52367 $.validator.methods[ name ] = method; 52368 $.validator.messages[ name ] = message !== undefined ? message : $.validator.messages[ name ]; 52369 if ( method.length < 3 ) { 52370 $.validator.addClassRules( name, $.validator.normalizeRule( name ) ); 52371 } 52372 }, 52373 52374 methods: { 52375 52376 // http://jqueryvalidation.org/required-method/ 52377 required: function( value, element, param ) { 52378 // check if dependency is met 52379 if ( !this.depend( param, element ) ) { 52380 return "dependency-mismatch"; 52381 } 52382 if ( element.nodeName.toLowerCase() === "select" ) { 52383 // could be an array for select-multiple or a string, both are fine this way 52384 var val = $( element ).val(); 52385 return val && val.length > 0; 52386 } 52387 if ( this.checkable( element ) ) { 52388 return this.getLength( value, element ) > 0; 52389 } 52390 return value.length > 0; 52391 }, 52392 52393 // http://jqueryvalidation.org/email-method/ 52394 email: function( value, element ) { 52395 // From https://html.spec.whatwg.org/multipage/forms.html#valid-e-mail-address 52396 // Retrieved 2014-01-14 52397 // If you have a problem with this implementation, report a bug against the above spec 52398 // Or use custom methods to implement your own email validation 52399 return this.optional( element ) || /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test( value ); 52400 }, 52401 52402 // http://jqueryvalidation.org/url-method/ 52403 url: function( value, element ) { 52404 52405 // Copyright (c) 2010-2013 Diego Perini, MIT licensed 52406 // https://gist.github.com/dperini/729294 52407 // see also https://mathiasbynens.be/demo/url-regex 52408 // modified to allow protocol-relative URLs
52409 return this.optional( element ) || /^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test( value ); 52410 }, 52411 52412 // http://jqueryvalidation.org/date-method/ 52413 date: function( value, element ) { 52414 return this.optional( element ) || !/Invalid|NaN/.test( new Date( value ).toString() ); 52415 }, 52416 52417 // http://jqueryvalidation.org/dateISO-method/ 52418 dateISO: function( value, element ) { 52419 return this.optional( element ) || /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test( value ); 52420 }, 52421 52422 // http://jqueryvalidation.org/number-method/ 52423 number: function( value, element ) { 52424 return this.optional( element ) || /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test( value ); 52425 }, 52426 52427 // http://jqueryvalidation.org/digits-method/ 52428 digits: function( value, element ) { 52429 return this.optional( element ) || /^\d+$/.test( value ); 52430 }, 52431 52432 // http://jqueryvalidation.org/creditcard-method/ 52433 // based on http://en.wikipedia.org/wiki/Luhn_algorithm 52434 creditcard: function( value, element ) { 52435 if ( this.optional( element ) ) { 52436 return "dependency-mismatch"; 52437 } 52438 // accept only spaces, digits and dashes 52439 if ( /[^0-9 \-]+/.test( value ) ) { 52440 return false; 52441 } 52442 var nCheck = 0, 52443 nDigit = 0, 52444 bEven = false, 52445 n, cDigit; 52446 52447 value = value.replace( /\D/g, "" ); 52448 52449 // Basing min and max length on 52450 // http://developer.ean.com/general_info/Valid_Credit_Card_Types 52451 if ( value.length < 13 || value.length > 19 ) { 52452 return false; 52453 } 52454 52455 for ( n = value.length - 1; n >= 0; n--) { 52456 cDigit = value.charAt( n ); 52457 nDigit = parseInt( cDigit, 10 ); 52458 if ( bEven ) { 52459 if ( ( nDigit *= 2 ) > 9 ) { 52460 nDigit -= 9; 52461 } 52462 } 52463 nCheck += nDigit; 52464 bEven = !bEven; 52465 } 52466 52467 return ( nCheck % 10 ) === 0; 52468 }, 52469 52470 // http://jqueryvalidation.org/minlength-method/ 52471 minlength: function( value, element, param ) { 52472 var length = $.isArray( value ) ? value.length : this.getLength( value, element ); 52473 return this.optional( element ) || length >= param; 52474 }, 52475 52476 // http://jqueryvalidation.org/maxlength-method/ 52477 maxlength: function( value, element, param ) { 52478 var length = $.isArray( value ) ? value.length : this.getLength( value, element ); 52479 return this.optional( element ) || length <= param; 52480 }, 52481 52482 // http://jqueryvalidation.org/rangelength-method/ 52483 rangelength: function( value, element, param ) { 52484 var length = $.isArray( value ) ? value.length : this.getLength( value, element ); 52485 return this.optional( element ) || ( length >= param[ 0 ] && length <= param[ 1 ] ); 52486 }, 52487 52488 // http://jqueryvalidation.org/min-method/ 52489 min: function( value, element, param ) { 52490 return this.optional( element ) || value >= param; 52491 }, 52492 52493 // http://jqueryvalidation.org/max-method/ 52494 max: function( value, element, param ) { 52495 return this.optional( element ) || value <= param; 52496 }, 52497 52498 // http://jqueryvalidation.org/range-method/ 52499 range: function( value, element, param ) { 52500 return this.optional( element ) || ( value >= param[ 0 ] && value <= param[ 1 ] ); 52501 }, 52502 52503 // http://jqueryvalidation.org/equalTo-method/ 52504 equalTo: function( value, element, param ) {
52505 // bind to the blur event of the target in order to revalidate whenever the target field is updated 52506 // TODO find a way to bind the event just once, avoiding the unbind-rebind overhead 52507 var target = $( param ); 52508 if ( this.settings.onfocusout ) { 52509 target.off( ".validate-equalTo" ).on( "blur.validate-equalTo", function() { 52510 $( element ).valid(); 52511 }); 52512 } 52513 return value === target.val(); 52514 }, 52515 52516 // http://jqueryvalidation.org/remote-method/ 52517 remote: function( value, element, param ) { 52518 if ( this.optional( element ) ) { 52519 return "dependency-mismatch"; 52520 } 52521 52522 var previous = this.previousValue( element ), 52523 validator, data; 52524 52525 if (!this.settings.messages[ element.name ] ) { 52526 this.settings.messages[ element.name ] = {}; 52527 } 52528 previous.originalMessage = this.settings.messages[ element.name ].remote; 52529 this.settings.messages[ element.name ].remote = previous.message; 52530 52531 param = typeof param === "string" && { url: param } || param; 52532 52533 if ( previous.old === value ) { 52534 return previous.valid; 52535 } 52536 52537 previous.old = value; 52538 validator = this; 52539 this.startRequest( element ); 52540 data = {}; 52541 data[ element.name ] = value; 52542 $.ajax( $.extend( true, { 52543 mode: "abort", 52544 port: "validate" + element.name, 52545 dataType: "json", 52546 data: data, 52547 context: validator.currentForm, 52548 success: function( response ) { 52549 var valid = response === true || response === "true", 52550 errors, message, submitted; 52551 52552 validator.settings.messages[ element.name ].remote = previous.originalMessage; 52553 if ( valid ) { 52554 submitted = validator.formSubmitted; 52555 validator.prepareElement( element ); 52556 validator.formSubmitted = submitted; 52557 validator.successList.push( element ); 52558 delete validator.invalid[ element.name ]; 52559 validator.showErrors(); 52560 } else { 52561 errors = {}; 52562 message = response || validator.defaultMessage( element, "remote" ); 52563 errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message; 52564 validator.invalid[ element.name ] = true; 52565 validator.showErrors( errors ); 52566 } 52567 previous.valid = valid; 52568 validator.stopRequest( element, valid ); 52569 } 52570 }, param ) ); 52571 return "pending"; 52572 } 52573 } 52574 52575}); 52576 52577// ajax mode: abort 52578// usage: $.ajax({ mode: "abort"[, port: "uniqueport"]}); 52579// if mode:"abort" is used, the previous request on that port (port can be undefined) is aborted via XMLHttpRequest.abort() 52580 52581var pendingRequests = {}, 52582 ajax; 52583// Use a prefilter if available (1.5+) 52584if ( $.ajaxPrefilter ) { 52585 $.ajaxPrefilter(function( settings, _, xhr ) { 52586 var port = settings.port; 52587 if ( settings.mode === "abort" ) { 52588 if ( pendingRequests[port] ) { 52589 pendingRequests[port].abort(); 52590 } 52591 pendingRequests[port] = xhr; 52592 } 52593 }); 52594} else { 52595 // Proxy ajax 52596 ajax = $.ajax; 52597 $.ajax = function( settings ) { 52598 var mode = ( "mode" in settings ? settings : $.ajaxSettings ).mode, 52599 port = ( "port" in settings ? settings : $.ajaxSettings ).port; 52600 if ( mode === "abort" ) { 52601 if ( pendingRequests[port] ) { 52602 pendingRequests[port].abort(); 52603 } 52604 pendingRequests[port] = ajax.apply(this, arguments); 52605 return pendingRequests[port]; 52606 } 52607 return ajax.apply(this, arguments); 52608 }; 52609} 52610 52611})); 52612/* NUGET: BEGIN LICENSE TEXT 52613 * 52614 * Microsoft grants you the right to use these script files for the sole 52615 * purpose of either: (i) interacting through your browser with the Microsoft 52616 * website or online service, subject to the applicable licensing or use 52617 * terms; or (ii) using the files as included with a Microsoft product subject 52618 * to that product's license terms. Microsoft reserves all other rights to the 52619 * files not expressly granted by Microsoft, whether by implication, estoppel 52620 * or otherwise. Insofar as a script file is dual licensed under GPL, 52621 * Microsoft neither took the code under GPL nor distributes it thereunder but 52622 * under the terms set out in this paragraph. All notices and licenses 52623 * below are for informational purposes only. 52624 * 52625 * NUGET: END LICENSE TEXT */ 52626/*! 52627** Unobtrusive validation support library for jQuery and jQuery Validate 52628** Copyright (C) Microsoft Corporation. All rights reserved. 52629*/ 52630 52631/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */ 52632/*global document: false, jQuery: false */ 52633 52634(function ($) { 52635 var $jQval = $.validator, 52636 adapters, 52637 data_validation = "unobtrusiveValidation"; 52638 52639 function setValidationValues(options, ruleName, value) { 52640 options.rules[ruleName] = value; 52641 if (options.message) { 52642 options.messages[ruleName] = options.message; 52643 } 52644 } 52645 52646 function splitAndTrim(value) { 52647 return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g); 52648 } 52649 52650 function escapeAttributeValue(value) { 52651 // As mentioned on http://api.jquery.com/category/selectors/ 52652 return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1"); 52653 } 52654 52655 function getModelPrefix(fieldName) { 52656 return fieldName.substr(0, fieldName.lastIndexOf(".") + 1); 52657 } 52658 52659 function appendModelPrefix(value, prefix) { 52660 if (value.indexOf("*.") === 0) { 52661 value = value.replace("*.", prefix); 52662 } 52663 return value; 52664 } 52665 52666 function onError(error, inputElement) { // 'this' is the form element 52667 var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"), 52668 replaceAttrValue = container.attr("data-valmsg-replace"), 52669 replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null; 52670 52671 container.removeClass("field-validation-valid").addClass("field-validation-error"); 52672 error.data("unobtrusiveContainer", container); 52673 52674 if (replace) { 52675 container.empty(); 52676 error.removeClass("input-validation-error").appendTo(container); 52677 } 52678 else { 52679 error.hide(); 52680 } 52681 } 52682 52683 function onErrors(event, validator) { // 'this' is the form element 52684 var container = $(this).find("[data-valmsg-summary=true]"), 52685 list = container.find("ul"); 52686 52687 if (list && list.length && validator.errorList.length) { 52688 list.empty();
vendor: 16,384 bytes, lines 52689-53043
52689 container.addClass("validation-summary-errors").removeClass("validation-summary-valid"); 52690 52691 $.each(validator.errorList, function () { 52692 $("<li />").html(this.message).appendTo(list); 52693 }); 52694 } 52695 } 52696 52697 function onSuccess(error) { // 'this' is the form element 52698 var container = error.data("unobtrusiveContainer"), 52699 replaceAttrValue = container.attr("data-valmsg-replace"), 52700 replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null; 52701 52702 if (container) { 52703 container.addClass("field-validation-valid").removeClass("field-validation-error"); 52704 error.removeData("unobtrusiveContainer"); 52705 52706 if (replace) { 52707 container.empty(); 52708 } 52709 } 52710 } 52711 52712 function onReset(event) { // 'this' is the form element 52713 var $form = $(this), 52714 key = '__jquery_unobtrusive_validation_form_reset'; 52715 if ($form.data(key)) { 52716 return; 52717 } 52718 // Set a flag that indicates we're currently resetting the form. 52719 $form.data(key, true); 52720 try { 52721 $form.data("validator").resetForm(); 52722 } finally { 52723 $form.removeData(key); 52724 } 52725 52726 $form.find(".validation-summary-errors") 52727 .addClass("validation-summary-valid") 52728 .removeClass("validation-summary-errors"); 52729 $form.find(".field-validation-error") 52730 .addClass("field-validation-valid") 52731 .removeClass("field-validation-error") 52732 .removeData("unobtrusiveContainer") 52733 .find(">*") // If we were using valmsg-replace, get the underlying error 52734 .removeData("unobtrusiveContainer"); 52735 } 52736 52737 function validationInfo(form) { 52738 var $form = $(form), 52739 result = $form.data(data_validation), 52740 onResetProxy = $.proxy(onReset, form), 52741 defaultOptions = $jQval.unobtrusive.options || {}, 52742 execInContext = function (name, args) { 52743 var func = defaultOptions[name]; 52744 func && $.isFunction(func) && func.apply(form, args); 52745 } 52746 52747 if (!result) { 52748 result = { 52749 options: { // options structure passed to jQuery Validate's validate() method 52750 errorClass: defaultOptions.errorClass || "input-validation-error", 52751 errorElement: defaultOptions.errorElement || "span", 52752 errorPlacement: function () { 52753 onError.apply(form, arguments); 52754 execInContext("errorPlacement", arguments); 52755 }, 52756 invalidHandler: function () { 52757 onErrors.apply(form, arguments); 52758 execInContext("invalidHandler", arguments); 52759 }, 52760 messages: {}, 52761 rules: {}, 52762 success: function () { 52763 onSuccess.apply(form, arguments); 52764 execInContext("success", arguments); 52765 } 52766 }, 52767 attachValidation: function () { 52768 $form 52769 .off("reset." + data_validation, onResetProxy) 52770 .on("reset." + data_validation, onResetProxy) 52771 .validate(this.options); 52772 }, 52773 validate: function () { // a validation function that is called by unobtrusive Ajax 52774 $form.validate(); 52775 return $form.valid(); 52776 } 52777 }; 52778 $form.data(data_validation, result); 52779 } 52780 52781 return result; 52782 } 52783 52784 $jQval.unobtrusive = { 52785 adapters: [], 52786 52787 parseElement: function (element, skipAttach) { 52788 /// <summary> 52789 /// Parses a single HTML element for unobtrusive validation attributes. 52790 /// </summary> 52791 /// <param name="element" domElement="true">The HTML element to be parsed.</param> 52792 /// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the 52793 /// validation to the form. If parsing just this single element, you should specify true. 52794 /// If parsing several elements, you should specify false, and manually attach the validation 52795 /// to the form when you are finished. The default is false.</param> 52796 var $element = $(element), 52797 form = $element.parents("form")[0], 52798 valInfo, rules, messages; 52799 52800 if (!form) { // Cannot do client-side validation without a form 52801 return; 52802 } 52803 52804 valInfo = validationInfo(form); 52805 valInfo.options.rules[element.name] = rules = {}; 52806 valInfo.options.messages[element.name] = messages = {}; 52807 52808 $.each(this.adapters, function () { 52809 var prefix = "data-val-" + this.name, 52810 message = $element.attr(prefix), 52811 paramValues = {}; 52812 52813 if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy) 52814 prefix += "-"; 52815 52816 $.each(this.params, function () { 52817 paramValues[this] = $element.attr(prefix + this); 52818 }); 52819 52820 this.adapt({ 52821 element: element, 52822 form: form, 52823 message: message, 52824 params: paramValues, 52825 rules: rules, 52826 messages: messages 52827 }); 52828 } 52829 }); 52830 52831 $.extend(rules, { "__dummy__": true }); 52832 52833 if (!skipAttach) { 52834 valInfo.attachValidation(); 52835 } 52836 }, 52837 52838 parse: function (selector) { 52839 /// <summary> 52840 /// Parses all the HTML elements in the specified selector. It looks for input elements decorated 52841 /// with the [data-val=true] attribute value and enables validation according to the data-val-* 52842 /// attribute values. 52843 /// </summary> 52844 /// <param name="selector" type="String">Any valid jQuery selector.</param> 52845 52846 // $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one 52847 // element with data-val=true 52848 var $selector = $(selector), 52849 $forms = $selector.parents() 52850 .addBack() 52851 .filter("form") 52852 .add($selector.find("form")) 52853 .has("[data-val=true]"); 52854 52855 $selector.find("[data-val=true]").each(function () { 52856 $jQval.unobtrusive.parseElement(this, true); 52857 }); 52858 52859 $forms.each(function () { 52860 var info = validationInfo(this); 52861 if (info) { 52862 info.attachValidation(); 52863 } 52864 }); 52865 } 52866 }; 52867 52868 adapters = $jQval.unobtrusive.adapters; 52869 52870 adapters.add = function (adapterName, params, fn) { 52871 /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary> 52872 /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used 52873 /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param> 52874 /// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will 52875 /// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and 52876 /// mmmm is the parameter name).</param> 52877 /// <param name="fn" type="Function">The function to call, which adapts the values from the HTML 52878 /// attributes into jQuery Validate rules and/or messages.</param> 52879 /// <returns type="jQuery.validator.unobtrusive.adapters" /> 52880 if (!fn) { // Called with no params, just a function 52881 fn = params; 52882 params = []; 52883 } 52884 this.push({ name: adapterName, params: params, adapt: fn }); 52885 return this; 52886 }; 52887 52888 adapters.addBool = function (adapterName, ruleName) { 52889 /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where 52890 /// the jQuery Validate validation rule has no parameter values.</summary> 52891 /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used 52892 /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param> 52893 /// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value 52894 /// of adapterName will be used instead.</param> 52895 /// <returns type="jQuery.validator.unobtrusive.adapters" /> 52896 return this.add(adapterName, function (options) { 52897 setValidationValues(options, ruleName || adapterName, true); 52898 }); 52899 }; 52900 52901 adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) { 52902 /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where 52903 /// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and 52904 /// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary> 52905 /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used 52906 /// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param> 52907 /// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only 52908 /// have a minimum value.</param> 52909 /// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only 52910 /// have a maximum value.</param> 52911 /// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you 52912 /// have both a minimum and maximum value.</param> 52913 /// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that 52914 /// contains the minimum value. The default is "min".</param> 52915 /// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that 52916 /// contains the maximum value. The default is "max".</param> 52917 /// <returns type="jQuery.validator.unobtrusive.adapters" /> 52918 return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) { 52919 var min = options.params.min, 52920 max = options.params.max; 52921 52922 if (min && max) { 52923 setValidationValues(options, minMaxRuleName, [min, max]); 52924 } 52925 else if (min) { 52926 setValidationValues(options, minRuleName, min); 52927 } 52928 else if (max) { 52929 setValidationValues(options, maxRuleName, max); 52930 } 52931 }); 52932 }; 52933 52934 adapters.addSingleVal = function (adapterName, attribute, ruleName) { 52935 /// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where 52936 /// the jQuery Validate validation rule has a single value.</summary> 52937 /// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used 52938 /// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param> 52939 /// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value. 52940 /// The default is "val".</param> 52941 /// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value 52942 /// of adapterName will be used instead.</param> 52943 /// <returns type="jQuery.validator.unobtrusive.adapters" /> 52944 return this.add(adapterName, [attribute || "val"], function (options) { 52945 setValidationValues(options, ruleName || adapterName, options.params[attribute]); 52946 }); 52947 }; 52948 52949 $jQval.addMethod("__dummy__", function (value, element, params) { 52950 return true; 52951 }); 52952 52953 $jQval.addMethod("regex", function (value, element, params) { 52954 var match; 52955 if (this.optional(element)) { 52956 return true; 52957 } 52958 52959 match = new RegExp(params).exec(value); 52960 return (match && (match.index === 0) && (match[0].length === value.length)); 52961 }); 52962 52963 $jQval.addMethod("nonalphamin", function (value, element, nonalphamin) { 52964 var match; 52965 if (nonalphamin) { 52966 match = value.match(/\W/g); 52967 match = match && match.length >= nonalphamin; 52968 } 52969 return match; 52970 }); 52971 52972 if ($jQval.methods.extension) { 52973 adapters.addSingleVal("accept", "mimtype"); 52974 adapters.addSingleVal("extension", "extension"); 52975 } else { 52976 // for backward compatibility, when the 'extension' validation method does not exist, such as with versions 52977 // of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for 52978 // validating the extension, and ignore mime-type validations as they are not supported. 52979 adapters.addSingleVal("extension", "extension", "accept"); 52980 } 52981 52982 adapters.addSingleVal("regex", "pattern"); 52983 adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"); 52984 adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range"); 52985 adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength"); 52986 adapters.add("equalto", ["other"], function (options) { 52987 var prefix = getModelPrefix(options.element.name), 52988 other = options.params.other, 52989 fullOtherName = appendModelPrefix(other, prefix), 52990 element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0]; 52991 52992 setValidationValues(options, "equalTo", element); 52993 }); 52994 adapters.add("required", function (options) { 52995 // jQuery Validate equates "required" with "mandatory" for checkbox elements 52996 if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") { 52997 setValidationValues(options, "required", true); 52998 } 52999 }); 53000 adapters.add("remote", ["url", "type", "additionalfields"], function (options) { 53001 var value = { 53002 url: options.params.url, 53003 type: options.params.type || "GET", 53004 data: {} 53005 }, 53006 prefix = getModelPrefix(options.element.name); 53007 53008 $.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) { 53009 var paramName = appendModelPrefix(fieldName, prefix); 53010 value.data[paramName] = function () { 53011 var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']"); 53012 // For checkboxes and radio buttons, only pick up values from checked fields. 53013 if (field.is(":checkbox")) { 53014 return field.filter(":checked").val() || field.filter(":hidden").val() || ''; 53015 } 53016 else if (field.is(":radio")) { 53017 return field.filter(":checked").val() || ''; 53018 } 53019 return field.val(); 53020 }; 53021 }); 53022 53023 setValidationValues(options, "remote", value); 53024 }); 53025 adapters.add("password", ["min", "nonalphamin", "regex"], function (options) { 53026 if (options.params.min) { 53027 setValidationValues(options, "minlength", options.params.min); 53028 } 53029 if (options.params.nonalphamin) { 53030 setValidationValues(options, "nonalphamin", options.params.nonalphamin); 53031 } 53032 if (options.params.regex) { 53033 setValidationValues(options, "regex", options.params.regex); 53034 } 53035 }); 53036 53037 $(function () { 53038 $jQval.unobtrusive.parse(document); 53039 }); 53040}(jQuery)); 53041/* 53042 * 53043 * Copyright (c) 2006-2011
53043 Sam Collett (http://www.texotela.co.uk) 53044 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 53045 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. 53046 * 53047 * Version 1.3 53048 * Demo: http://www.texotela.co.uk/code/jquery/numeric/ 53049 * 53050 */ 53051(function($) { 53052/* 53053 * Allows only valid characters to be entered into input boxes. 53054 * Note: fixes value when pasting via Ctrl+V, but not when using the mouse to paste 53055 * side-effect: Ctrl+A does not work, though you can still use the mouse to select (or double-click to select all) 53056 * 53057 * @name numeric 53058 * @param config { decimal : "." , negative : true } 53059 * @param callback A function that runs if the number is not valid (fires onblur) 53060 * @author Sam Collett (http://www.texotela.co.uk) 53061 * @example $(".numeric").numeric(); 53062 * @example $(".numeric").numeric(","); // use , as separater 53063 * @example $(".numeric").numeric({ decimal : "," }); // use , as separator 53064 * @example $(".numeric").numeric({ negative : false }); // do not allow negative values 53065 * @example $(".numeric").numeric(null, callback); // use default values, pass on the 'callback' function 53066 * 53067 */ 53068$.fn.numeric = function(config, callback) 53069{ 53070 if(typeof config === 'boolean') 53071 { 53072 config = { decimal: config }; 53073 } 53074 config = config || {}; 53075 // if config.negative undefined, set to true (default is to allow negative numbers) 53076 if(typeof config.negative == "undefined") config.negative = true; 53077 // set decimal point 53078 var decimal = (config.decimal === false) ? "" : config.decimal || "."; 53079 // allow negatives 53080 var negative = (config.negative === true) ? true : false; 53081 // callback function 53082 var callback = typeof callback == "function" ? callback : function(){}; 53083 // set data and methods 53084 return this.data("numeric.decimal", decimal).data("numeric.negative", negative).data("numeric.callback", callback).keypress($.fn.numeric.keypress).keyup($.fn.numeric.keyup).blur($.fn.numeric.blur).on("paste", $.fn.numeric.onpaste); 53085} 53086 53087$.fn.numeric.keypress = function(e) 53088{ 53089 // get decimal character and determine if negatives are allowed 53090 var decimal = $.data(this, "numeric.decimal"); 53091 var negative = $.data(this, "numeric.negative"); 53092 // get the key that was pressed 53093 var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0; 53094 // allow enter/return key (only when in an input box) 53095 if(key == 13 && this.nodeName.toLowerCase() == "input") 53096 { 53097 return true; 53098 } 53099 else if(key == 13) 53100 { 53101 return false; 53102 } 53103 var allow = false; 53104 // allow Ctrl+A 53105 if((e.ctrlKey && key == 97 /* firefox */) || (e.ctrlKey && key == 65) /* opera */) return true; 53106 // allow Ctrl+X (cut) 53107 if((e.ctrlKey && key == 120 /* firefox */) || (e.ctrlKey && key == 88) /* opera */) return true; 53108 // allow Ctrl+C (copy) 53109 if((e.ctrlKey && key == 99 /* firefox */) || (e.ctrlKey && key == 67) /* opera */) return true; 53110 // allow Ctrl+Z (undo) 53111 if((e.ctrlKey && key == 122 /* firefox */) || (e.ctrlKey && key == 90) /* opera */) return true; 53112 // allow or deny Ctrl+V (paste), Shift+Ins 53113 if((e.ctrlKey && key == 118 /* firefox */) || (e.ctrlKey && key == 86) /* opera */ 53114 || (e.shiftKey && key == 45)) return true; 53115 // if a number was not pressed 53116 if(key < 48 || key > 57) 53117 { 53118 /* '-' only allowed at start and if negative numbers allowed */ 53119 if(this.value.indexOf("-") != 0 && negative && key == 45 && (this.value.length == 0 || ($.fn.getSelectionStart(this)) == 0)) return true; 53120 /* only one decimal separator allowed */ 53121 if(decimal && key == decimal.charCodeAt(0) && this.value.indexOf(decimal) != -1) 53122 { 53123 allow = false; 53124 } 53125 // check for other keys that have special purposes 53126 if( 53127 key != 8 /* backspace */ && 53128 key != 9 /* tab */ && 53129 key != 13 /* enter */ && 53130 key != 35 /* end */ && 53131 key != 36 /* home */ && 53132 key != 37 /* left */ && 53133 key != 39 /* right */ && 53134 key != 46 /* del */ 53135 ) 53136 { 53137 allow = false; 53138 } 53139 else 53140 { 53141 // for detecting special keys (listed above) 53142 // IE does not support 'charCode' and ignores them in keypress anyway 53143 if(typeof e.charCode != "undefined") 53144 { 53145 // special keys have 'keyCode' and 'which' the same (e.g. backspace) 53146 if(e.keyCode == e.which && e.which != 0) 53147 { 53148 allow = true; 53149 // . and delete share the same code, don't allow . (will be set to true later if it is the decimal point) 53150 if(e.which == 46) allow = false;
53151 } 53152 // or keyCode != 0 and 'charCode'/'which' = 0 53153 else if(e.keyCode != 0 && e.charCode == 0 && e.which == 0) 53154 { 53155 allow = true; 53156 } 53157 } 53158 } 53159 // if key pressed is the decimal and it is not already in the field 53160 if(decimal && key == decimal.charCodeAt(0)) 53161 { 53162 if(this.value.indexOf(decimal) == -1) 53163 { 53164 allow = true; 53165 } 53166 else 53167 { 53168 allow = false; 53169 } 53170 } 53171 } 53172 else 53173 { 53174 allow = true; 53175 } 53176 return allow; 53177} 53178 53179$.fn.numeric.keyup = function(e) 53180{ 53181 var val = this.value; 53182 if(val.length > 0) 53183 { 53184 // get carat (cursor) position 53185 var carat = $.fn.getSelectionStart(this); 53186 // get decimal character and determine if negatives are allowed 53187 var decimal = $.data(this, "numeric.decimal"); 53188 var negative = $.data(this, "numeric.negative"); 53189 53190 // prepend a 0 if necessary 53191 if(decimal != "") 53192 { 53193 // find decimal point 53194 var dot = val.indexOf(decimal); 53195 // if dot at start, add 0 before 53196 if(dot == 0) 53197 { 53198 this.value = "0" + val; 53199 } 53200 // if dot at position 1, check if there is a - symbol before it 53201 if(dot == 1 && val.charAt(0) == "-") 53202 { 53203 this.value = "-0" + val.substring(1); 53204 } 53205 val = this.value; 53206 } 53207 53208 // if pasted in, only allow the following characters 53209 var validChars = [0,1,2,3,4,5,6,7,8,9,'-',decimal]; 53210 // get length of the value (to loop through) 53211 var length = val.length; 53212 // loop backwards (to prevent going out of bounds) 53213 for(var i = length - 1; i >= 0; i--) 53214 { 53215 var ch = val.charAt(i); 53216 // remove '-' if it is in the wrong place 53217 if(i != 0 && ch == "-") 53218 { 53219 val = val.substring(0, i) + val.substring(i + 1); 53220 } 53221 // remove character if it is at the start, a '-' and negatives aren't allowed 53222 else if(i == 0 && !negative && ch == "-") 53223 { 53224 val = val.substring(1); 53225 } 53226 var validChar = false; 53227 // loop through validChars 53228 for(var j = 0; j < validChars.length; j++) 53229 { 53230 // if it is valid, break out the loop 53231 if(ch == validChars[j]) 53232 { 53233 validChar = true; 53234 break; 53235 } 53236 } 53237 // if not a valid character, or a space, remove 53238 if(!validChar || ch == " ") 53239 { 53240 val = val.substring(0, i) + val.substring(i + 1); 53241 } 53242 } 53243 // remove extra decimal characters 53244 var firstDecimal = val.indexOf(decimal); 53245 if(firstDecimal > 0) 53246 { 53247 for(var i = length - 1; i > firstDecimal; i--) 53248 { 53249 var ch = val.charAt(i); 53250 // remove decimal character 53251 if(ch == decimal) 53252 { 53253 val = val.substring(0, i) + val.substring(i + 1); 53254 } 53255 } 53256 } 53257 // set the value and prevent the cursor moving to the end 53258 this.value = val; 53259 $.fn.setSelection(this, carat); 53260 } 53261} 53262 53263$.fn.numeric.blur = function() 53264{ 53265 var decimal = $.data(this, "numeric.decimal"); 53266 var callback = $.data(this, "numeric.callback"); 53267 var val = this.value; 53268 if(val != "") 53269 { 53270 var re = new RegExp("^\\d+$|\\d*" + decimal + "\\d+"); 53271 if(!re.exec(val)) 53272 { 53273 callback.apply(this); 53274 } 53275 } 53276} 53277 53278$.fn.numeric.onpaste = function(e) 53279{ 53280 var pastedValue = (e.originalEvent.clipboardData || window.clipboardData).getData('Text'); 53281 var existingValue = e.target.value; 53282
53283 var textLeft = existingValue.substring(0, e.target.selectionStart); 53284 var textRight = existingValue.substring(e.target.selectionEnd, existingValue.length); 53285 53286 var resultValue = textLeft + pastedValue + textRight; 53287 53288 return $.isNumeric(resultValue); 53289} 53290 53291$.fn.removeNumeric = function() 53292{ 53293 return this.data("numeric.decimal", null).data("numeric.negative", null).data("numeric.callback", null).unbind("keypress", $.fn.numeric.keypress).unbind("blur", $.fn.numeric.blur); 53294} 53295 53296// Based on code from http://javascript.nwbox.com/cursor_position/ (Diego Perini <[email protected]>) 53297$.fn.getSelectionStart = function(o) 53298{ 53299 if (o.createTextRange) 53300 { 53301 var r = document.selection.createRange().duplicate(); 53302 r.moveEnd('character', o.value.length); 53303 if (r.text == '') return o.value.length; 53304 return o.value.lastIndexOf(r.text); 53305 } else return o.selectionStart; 53306} 53307 53308// set the selection, o is the object (input), p is the position ([start, end] or just start) 53309$.fn.setSelection = function(o, p) 53310{ 53311 // if p is number, start and end are the same 53312 if(typeof p == "number") p = [p, p]; 53313 // only set if p is an array of length 2 53314 if(p && p.constructor == Array && p.length == 2) 53315 { 53316 if (o.createTextRange) 53317 { 53318 var r = o.createTextRange(); 53319 r.collapse(true); 53320 r.moveStart('character', p[0]); 53321 r.moveEnd('character', p[1]); 53322 r.select(); 53323 } 53324 else if(o.setSelectionRange) 53325 { 53326 o.focus(); 53327 o.setSelectionRange(p[0], p[1]); 53328 } 53329 } 53330} 53331 53332})(jQuery);
vendor: 8,792 bytes, lines 53332-53578
53332 53333(function (global, factory) { 53334 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 53335 typeof define === 'function' && define.amd ? define('underscore', factory) : 53336 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () { 53337 var current = global._; 53338 var exports = global._ = factory(); 53339 exports.noConflict = function () { global._ = current; return exports; }; 53340 }())); 53341}(this, (function () { 53342 // Underscore.js 1.13.1 53343 // https://underscorejs.org 53344 // (c) 2009-2021 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors 53345 // Underscore may be freely distributed under the MIT license. 53346 53347 // Current version. 53348 var VERSION = '1.13.1'; 53349 53350 // Establish the root object, `window` (`self`) in the browser, `global` 53351 // on the server, or `this` in some virtual machines. We use `self` 53352 // instead of `window` for `WebWorker` support. 53353 var root = typeof self == 'object' && self.self === self && self || 53354 typeof global == 'object' && global.global === global && global || 53355 Function('return this')() || 53356 {}; 53357 53358 // Save bytes in the minified (but not gzipped) version: 53359 var ArrayProto = Array.prototype, ObjProto = Object.prototype; 53360 var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; 53361 53362 // Create quick reference variables for speed access to core prototypes. 53363 var push = ArrayProto.push, 53364 slice = ArrayProto.slice, 53365 toString = ObjProto.toString, 53366 hasOwnProperty = ObjProto.hasOwnProperty; 53367 53368 // Modern feature detection. 53369 var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined', 53370 supportsDataView = typeof DataView !== 'undefined'; 53371 53372 // All **ECMAScript 5+** native function implementations that we hope to use 53373 // are declared here. 53374 var nativeIsArray = Array.isArray, 53375 nativeKeys = Object.keys, 53376 nativeCreate = Object.create, 53377 nativeIsView = supportsArrayBuffer && ArrayBuffer.isView; 53378 53379 // Create references to these builtin functions because we override them. 53380 var _isNaN = isNaN, 53381 _isFinite = isFinite; 53382 53383 // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. 53384 var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); 53385 var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', 53386 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; 53387 53388 // The largest integer that can be represented exactly. 53389 var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; 53390 53391 // Some functions take a variable number of arguments, or a few expected 53392 // arguments at the beginning and then a variable number of values to operate 53393 // on. This helper accumulates all remaining arguments past the functionâs 53394 // argument length (or an explicit `startIndex`), into an array that becomes 53395 // the last argument. Similar to ES6âs "rest parameter". 53396 function restArguments(func, startIndex) { 53397 startIndex = startIndex == null ? func.length - 1 : +startIndex; 53398 return function() { 53399 var length = Math.max(arguments.length - startIndex, 0), 53400 rest = Array(length), 53401 index = 0; 53402 for (; index < length; index++) { 53403 rest[index] = arguments[index + startIndex]; 53404 } 53405 switch (startIndex) { 53406 case 0: return func.call(this, rest); 53407 case 1: return func.call(this, arguments[0], rest); 53408 case 2: return func.call(this, arguments[0], arguments[1], rest); 53409 } 53410 var args = Array(startIndex + 1); 53411 for (index = 0; index < startIndex; index++) { 53412 args[index] = arguments[index]; 53413 } 53414 args[startIndex] = rest; 53415 return func.apply(this, args); 53416 }; 53417 } 53418 53419 // Is a given variable an object? 53420 function isObject(obj) { 53421 var type = typeof obj; 53422 return type === 'function' || type === 'object' && !!obj; 53423 } 53424 53425 // Is a given value equal to null? 53426 function isNull(obj) { 53427 return obj === null; 53428 } 53429 53430 // Is a given variable undefined? 53431 function isUndefined(obj) { 53432 return obj === void 0; 53433 } 53434 53435 // Is a given value a boolean? 53436 function isBoolean(obj) { 53437 return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; 53438 } 53439 53440 // Is a given value a DOM element? 53441 function isElement(obj) { 53442 return !!(obj && obj.nodeType === 1); 53443 } 53444 53445 // Internal function for creating a `toString`-based type tester. 53446 function tagTester(name) { 53447 var tag = '[object ' + name + ']'; 53448 return function(obj) { 53449 return toString.call(obj) === tag; 53450 }; 53451 } 53452 53453 var isString = tagTester('String'); 53454 53455 var isNumber = tagTester('Number'); 53456 53457 var isDate = tagTester('Date'); 53458 53459 var isRegExp = tagTester('RegExp'); 53460 53461 var isError = tagTester('Error'); 53462 53463 var isSymbol = tagTester('Symbol'); 53464 53465 var isArrayBuffer = tagTester('ArrayBuffer'); 53466 53467 var isFunction = tagTester('Function'); 53468 53469 // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old 53470 // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). 53471 var nodelist = root.document && root.document.childNodes; 53472 if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { 53473 isFunction = function(obj) { 53474 return typeof obj == 'function' || false; 53475 }; 53476 } 53477 53478 var isFunction$1 = isFunction; 53479 53480 var hasObjectTag = tagTester('Object'); 53481 53482 // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`. 53483 // In IE 11, the most common among them, this problem also applies to 53484 // `Map`, `WeakMap` and `Set`. 53485 var hasStringTagBug = ( 53486 supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8))) 53487 ), 53488 isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map)); 53489 53490 var isDataView = tagTester('DataView'); 53491 53492 // In IE 10 - Edge 13, we need a different heuristic 53493 // to determine whether an object is a `DataView`. 53494 function ie10IsDataView(obj) { 53495 return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer); 53496 } 53497 53498 var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView); 53499 53500 // Is a given value an array? 53501 // Delegates to ECMA5's native `Array.isArray`. 53502 var isArray = nativeIsArray || tagTester('Array'); 53503 53504 // Internal function to check whether `key` is an own property name of `obj`. 53505 function has$1(obj, key) { 53506 return obj != null && hasOwnProperty.call(obj, key); 53507 } 53508 53509 var isArguments = tagTester('Arguments'); 53510 53511 // Define a fallback version of the method in browsers (ahem, IE < 9), where 53512 // there isn't any inspectable "Arguments" type. 53513 (function() { 53514 if (!isArguments(arguments)) { 53515 isArguments = function(obj) { 53516 return has$1(obj, 'callee'); 53517 }; 53518 } 53519 }()); 53520 53521 var isArguments$1 = isArguments; 53522 53523 // Is a given object a finite number? 53524 function isFinite$1(obj) { 53525 return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj)); 53526 } 53527 53528 // Is the given value `NaN`? 53529 function isNaN$1(obj) { 53530 return isNumber(obj) && _isNaN(obj); 53531 } 53532 53533 // Predicate-generating function. Often useful outside of Underscore. 53534 function constant(value) { 53535 return function() { 53536 return value; 53537 }; 53538 } 53539 53540 // Common internal logic for `isArrayLike` and `isBufferLike`. 53541 function createSizePropertyCheck(getSizeProperty) { 53542 return function(collection) { 53543 var sizeProperty = getSizeProperty(collection); 53544 return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX; 53545 } 53546 } 53547 53548 // Internal helper to generate a function to obtain property `key` from `obj`. 53549 function shallowProperty(key) { 53550 return function(obj) { 53551 return obj == null ? void 0 : obj[key]; 53552 }; 53553 } 53554 53555 // Internal helper to obtain the `byteLength` property of an object. 53556 var getByteLength = shallowProperty('byteLength'); 53557 53558 // Internal helper to determine whether we should spend extensive checks against 53559 // `ArrayBuffer` et al. 53560 var isBufferLike = createSizePropertyCheck(getByteLength); 53561 53562 // Is a given value a typed array? 53563 var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/; 53564 function isTypedArray(obj) { 53565 // `ArrayBuffer.isView` is the most future-proof, so use it when available. 53566 // Otherwise, fall back on the above regular expression. 53567 return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) : 53568 isBufferLike(obj) && typedArrayPattern.test(toString.call(obj)); 53569 } 53570 53571 var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false); 53572 53573 // Internal helper to obtain the `length` property of an object. 53574 var getLength = shallowProperty('length'); 53575 53576 // Internal helper to create a simple lookup structure. 53577 // `collectNonEnumProps` used to depend on `_.contains`, but this led to 53578 // circular imports. `emulatedSet` is a one-off solution that only works for
vendor: 4,192 bytes, lines 53579-53698
53579 // arrays of strings. 53580 function emulatedSet(keys) { 53581 var hash = {}; 53582 for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true; 53583 return { 53584 contains: function(key) { return hash[key]; }, 53585 push: function(key) { 53586 hash[key] = true; 53587 return keys.push(key); 53588 } 53589 }; 53590 } 53591 53592 // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't 53593 // be iterated by `for key in ...` and thus missed. Extends `keys` in place if 53594 // needed. 53595 function collectNonEnumProps(obj, keys) { 53596 keys = emulatedSet(keys); 53597 var nonEnumIdx = nonEnumerableProps.length; 53598 var constructor = obj.constructor; 53599 var proto = isFunction$1(constructor) && constructor.prototype || ObjProto; 53600 53601 // Constructor is a special case. 53602 var prop = 'constructor'; 53603 if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop); 53604 53605 while (nonEnumIdx--) { 53606 prop = nonEnumerableProps[nonEnumIdx]; 53607 if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) { 53608 keys.push(prop); 53609 } 53610 } 53611 } 53612 53613 // Retrieve the names of an object's own properties. 53614 // Delegates to **ECMAScript 5**'s native `Object.keys`. 53615 function keys(obj) { 53616 if (!isObject(obj)) return []; 53617 if (nativeKeys) return nativeKeys(obj); 53618 var keys = []; 53619 for (var key in obj) if (has$1(obj, key)) keys.push(key); 53620 // Ahem, IE < 9. 53621 if (hasEnumBug) collectNonEnumProps(obj, keys); 53622 return keys; 53623 } 53624 53625 // Is a given array, string, or object empty? 53626 // An "empty" object has no enumerable own-properties. 53627 function isEmpty(obj) { 53628 if (obj == null) return true; 53629 // Skip the more expensive `toString`-based type checks if `obj` has no 53630 // `.length`. 53631 var length = getLength(obj); 53632 if (typeof length == 'number' && ( 53633 isArray(obj) || isString(obj) || isArguments$1(obj) 53634 )) return length === 0; 53635 return getLength(keys(obj)) === 0; 53636 } 53637 53638 // Returns whether an object has a given set of `key:value` pairs. 53639 function isMatch(object, attrs) { 53640 var _keys = keys(attrs), length = _keys.length; 53641 if (object == null) return !length; 53642 var obj = Object(object); 53643 for (var i = 0; i < length; i++) { 53644 var key = _keys[i]; 53645 if (attrs[key] !== obj[key] || !(key in obj)) return false; 53646 } 53647 return true; 53648 } 53649 53650 // If Underscore is called as a function, it returns a wrapped object that can 53651 // be used OO-style. This wrapper holds altered versions of all functions added 53652 // through `_.mixin`. Wrapped objects may be chained. 53653 function _$1(obj) { 53654 if (obj instanceof _$1) return obj; 53655 if (!(this instanceof _$1)) return new _$1(obj); 53656 this._wrapped = obj; 53657 } 53658 53659 _$1.VERSION = VERSION; 53660 53661 // Extracts the result from a wrapped and chained object. 53662 _$1.prototype.value = function() { 53663 return this._wrapped; 53664 }; 53665 53666 // Provide unwrapping proxies for some methods used in engine operations 53667 // such as arithmetic and JSON stringification. 53668 _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value; 53669 53670 _$1.prototype.toString = function() { 53671 return String(this._wrapped); 53672 }; 53673 53674 // Internal function to wrap or shallow-copy an ArrayBuffer, 53675 // typed array or DataView to a new view, reusing the buffer. 53676 function toBufferView(bufferSource) { 53677 return new Uint8Array( 53678 bufferSource.buffer || bufferSource, 53679 bufferSource.byteOffset || 0, 53680 getByteLength(bufferSource) 53681 ); 53682 } 53683 53684 // We use this string twice, so give it a name for minification. 53685 var tagDataView = '[object DataView]'; 53686 53687 // Internal recursive comparison function for `_.isEqual`. 53688 function eq(a, b, aStack, bStack) { 53689 // Identical objects are equal. `0 === -0`, but they aren't identical. 53690 // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal). 53691 if (a === b) return a !== 0 || 1 / a === 1 / b; 53692 // `null` or `undefined` only equal to itself (strict comparison). 53693 if (a == null || b == null) return false; 53694 // `NaN`s are equivalent, but non-reflexive. 53695 if (a !== a) return b !== b; 53696 // Exhaust primitive checks 53697 var type = typeof a; 53698 if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
vendor: 4,262 bytes, lines 53699-53798
53699 return deepEq(a, b, aStack, bStack); 53700 } 53701 53702 // Internal recursive comparison function for `_.isEqual`. 53703 function deepEq(a, b, aStack, bStack) { 53704 // Unwrap any wrapped objects. 53705 if (a instanceof _$1) a = a._wrapped; 53706 if (b instanceof _$1) b = b._wrapped; 53707 // Compare `[[Class]]` names. 53708 var className = toString.call(a); 53709 if (className !== toString.call(b)) return false; 53710 // Work around a bug in IE 10 - Edge 13. 53711 if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) { 53712 if (!isDataView$1(b)) return false; 53713 className = tagDataView; 53714 } 53715 switch (className) { 53716 // These types are compared by value. 53717 case '[object RegExp]': 53718 // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') 53719 case '[object String]': 53720 // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is 53721 // equivalent to `new String("5")`. 53722 return '' + a === '' + b; 53723 case '[object Number]': 53724 // `NaN`s are equivalent, but non-reflexive. 53725 // Object(NaN) is equivalent to NaN. 53726 if (+a !== +a) return +b !== +b; 53727 // An `egal` comparison is performed for other numeric values. 53728 return +a === 0 ? 1 / +a === 1 / b : +a === +b; 53729 case '[object Date]': 53730 case '[object Boolean]': 53731 // Coerce dates and booleans to numeric primitive values. Dates are compared by their 53732 // millisecond representations. Note that invalid dates with millisecond representations 53733 // of `NaN` are not equivalent. 53734 return +a === +b; 53735 case '[object Symbol]': 53736 return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); 53737 case '[object ArrayBuffer]': 53738 case tagDataView: 53739 // Coerce to typed array so we can fall through. 53740 return deepEq(toBufferView(a), toBufferView(b), aStack, bStack); 53741 } 53742 53743 var areArrays = className === '[object Array]'; 53744 if (!areArrays && isTypedArray$1(a)) { 53745 var byteLength = getByteLength(a); 53746 if (byteLength !== getByteLength(b)) return false; 53747 if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true; 53748 areArrays = true; 53749 } 53750 if (!areArrays) { 53751 if (typeof a != 'object' || typeof b != 'object') return false; 53752 53753 // Objects with different constructors are not equivalent, but `Object`s or `Array`s 53754 // from different frames are. 53755 var aCtor = a.constructor, bCtor = b.constructor; 53756 if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor && 53757 isFunction$1(bCtor) && bCtor instanceof bCtor) 53758 && ('constructor' in a && 'constructor' in b)) { 53759 return false; 53760 } 53761 } 53762 // Assume equality for cyclic structures. The algorithm for detecting cyclic 53763 // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. 53764 53765 // Initializing stack of traversed objects. 53766 // It's done here since we only need them for objects and arrays comparison. 53767 aStack = aStack || []; 53768 bStack = bStack || []; 53769 var length = aStack.length; 53770 while (length--) { 53771 // Linear search. Performance is inversely proportional to the number of 53772 // unique nested structures. 53773 if (aStack[length] === a) return bStack[length] === b; 53774 } 53775 53776 // Add the first object to the stack of traversed objects. 53777 aStack.push(a); 53778 bStack.push(b); 53779 53780 // Recursively compare objects and arrays. 53781 if (areArrays) { 53782 // Compare array lengths to determine if a deep comparison is necessary. 53783 length = a.length; 53784 if (length !== b.length) return false; 53785 // Deep compare the contents, ignoring non-numeric properties. 53786 while (length--) { 53787 if (!eq(a[length], b[length], aStack, bStack)) return false; 53788 } 53789 } else { 53790 // Deep compare objects. 53791 var _keys = keys(a), key; 53792 length = _keys.length; 53793 // Ensure that both objects contain the same number of properties before comparing deep equality. 53794 if (keys(b).length !== length) return false; 53795 while (length--) { 53796 // Deep compare each member 53797 key = _keys[length]; 53798 if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
vendor: 51,132 bytes, lines 53799-55373
53799 } 53800 } 53801 // Remove the first object from the stack of traversed objects. 53802 aStack.pop(); 53803 bStack.pop(); 53804 return true; 53805 } 53806 53807 // Perform a deep comparison to check if two objects are equal. 53808 function isEqual(a, b) { 53809 return eq(a, b); 53810 } 53811 53812 // Retrieve all the enumerable property names of an object. 53813 function allKeys(obj) { 53814 if (!isObject(obj)) return []; 53815 var keys = []; 53816 for (var key in obj) keys.push(key); 53817 // Ahem, IE < 9. 53818 if (hasEnumBug) collectNonEnumProps(obj, keys); 53819 return keys; 53820 } 53821 53822 // Since the regular `Object.prototype.toString` type tests don't work for 53823 // some types in IE 11, we use a fingerprinting heuristic instead, based 53824 // on the methods. It's not great, but it's the best we got. 53825 // The fingerprint method lists are defined below. 53826 function ie11fingerprint(methods) { 53827 var length = getLength(methods); 53828 return function(obj) { 53829 if (obj == null) return false; 53830 // `Map`, `WeakMap` and `Set` have no enumerable keys. 53831 var keys = allKeys(obj); 53832 if (getLength(keys)) return false; 53833 for (var i = 0; i < length; i++) { 53834 if (!isFunction$1(obj[methods[i]])) return false; 53835 } 53836 // If we are testing against `WeakMap`, we need to ensure that 53837 // `obj` doesn't have a `forEach` method in order to distinguish 53838 // it from a regular `Map`. 53839 return methods !== weakMapMethods || !isFunction$1(obj[forEachName]); 53840 }; 53841 } 53842 53843 // In the interest of compact minification, we write 53844 // each string in the fingerprints only once. 53845 var forEachName = 'forEach', 53846 hasName = 'has', 53847 commonInit = ['clear', 'delete'], 53848 mapTail = ['get', hasName, 'set']; 53849 53850 // `Map`, `WeakMap` and `Set` each have slightly different 53851 // combinations of the above sublists. 53852 var mapMethods = commonInit.concat(forEachName, mapTail), 53853 weakMapMethods = commonInit.concat(mapTail), 53854 setMethods = ['add'].concat(commonInit, forEachName, hasName); 53855 53856 var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map'); 53857 53858 var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap'); 53859 53860 var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set'); 53861 53862 var isWeakSet = tagTester('WeakSet'); 53863 53864 // Retrieve the values of an object's properties. 53865 function values(obj) { 53866 var _keys = keys(obj); 53867 var length = _keys.length; 53868 var values = Array(length); 53869 for (var i = 0; i < length; i++) { 53870 values[i] = obj[_keys[i]]; 53871 } 53872 return values; 53873 } 53874 53875 // Convert an object into a list of `[key, value]` pairs. 53876 // The opposite of `_.object` with one argument. 53877 function pairs(obj) { 53878 var _keys = keys(obj); 53879 var length = _keys.length; 53880 var pairs = Array(length); 53881 for (var i = 0; i < length; i++) { 53882 pairs[i] = [_keys[i], obj[_keys[i]]]; 53883 } 53884 return pairs; 53885 } 53886 53887 // Invert the keys and values of an object. The values must be serializable. 53888 function invert(obj) { 53889 var result = {}; 53890 var _keys = keys(obj); 53891 for (var i = 0, length = _keys.length; i < length; i++) { 53892 result[obj[_keys[i]]] = _keys[i]; 53893 } 53894 return result; 53895 } 53896 53897 // Return a sorted list of the function names available on the object. 53898 function functions(obj) { 53899 var names = []; 53900 for (var key in obj) { 53901 if (isFunction$1(obj[key])) names.push(key); 53902 } 53903 return names.sort(); 53904 } 53905 53906 // An internal function for creating assigner functions. 53907 function createAssigner(keysFunc, defaults) { 53908 return function(obj) { 53909 var length = arguments.length; 53910 if (defaults) obj = Object(obj); 53911 if (length < 2 || obj == null) return obj; 53912 for (var index = 1; index < length; index++) { 53913 var source = arguments[index], 53914 keys = keysFunc(source), 53915 l = keys.length; 53916 for (var i = 0; i < l; i++) { 53917 var key = keys[i]; 53918 if (!defaults || obj[key] === void 0) obj[key] = source[key]; 53919 } 53920 } 53921 return obj; 53922 }; 53923 } 53924 53925 // Extend a given object with all the properties in passed-in object(s). 53926 var extend = createAssigner(allKeys); 53927 53928 // Assigns a given object with all the own properties in the passed-in 53929 // object(s). 53930 // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) 53931 var extendOwn = createAssigner(keys); 53932 53933 // Fill in a given object with default properties. 53934 var defaults = createAssigner(allKeys, true); 53935 53936 // Create a naked function reference for surrogate-prototype-swapping. 53937 function ctor() { 53938 return function(){}; 53939 } 53940 53941 // An internal function for creating a new object that inherits from another. 53942 function baseCreate(prototype) { 53943 if (!isObject(prototype)) return {}; 53944 if (nativeCreate) return nativeCreate(prototype); 53945 var Ctor = ctor(); 53946 Ctor.prototype = prototype; 53947 var result = new Ctor; 53948 Ctor.prototype = null; 53949 return result; 53950 } 53951 53952 // Creates an object that inherits from the given prototype object. 53953 // If additional properties are provided then they will be added to the 53954 // created object. 53955 function create(prototype, props) { 53956 var result = baseCreate(prototype); 53957 if (props) extendOwn(result, props); 53958 return result; 53959 } 53960 53961 // Create a (shallow-cloned) duplicate of an object. 53962 function clone(obj) { 53963 if (!isObject(obj)) return obj; 53964 return isArray(obj) ? obj.slice() : extend({}, obj); 53965 } 53966 53967 // Invokes `interceptor` with the `obj` and then returns `obj`. 53968 // The primary purpose of this method is to "tap into" a method chain, in 53969 // order to perform operations on intermediate results within the chain. 53970 function tap(obj, interceptor) { 53971 interceptor(obj); 53972 return obj; 53973 } 53974 53975 // Normalize a (deep) property `path` to array. 53976 // Like `_.iteratee`, this function can be customized. 53977 function toPath$1(path) { 53978 return isArray(path) ? path : [path]; 53979 } 53980 _$1.toPath = toPath$1; 53981 53982 // Internal wrapper for `_.toPath` to enable minification. 53983 // Similar to `cb` for `_.iteratee`. 53984 function toPath(path) { 53985 return _$1.toPath(path); 53986 } 53987 53988 // Internal function to obtain a nested property in `obj` along `path`. 53989 function deepGet(obj, path) { 53990 var length = path.length; 53991 for (var i = 0; i < length; i++) { 53992 if (obj == null) return void 0; 53993 obj = obj[path[i]]; 53994 } 53995 return length ? obj : void 0; 53996 } 53997 53998 // Get the value of the (deep) property on `path` from `object`. 53999 // If any property in `path` does not exist or if the value is 54000 // `undefined`, return `defaultValue` instead. 54001 // The `path` is normalized through `_.toPath`. 54002 function get(object, path, defaultValue) { 54003 var value = deepGet(object, toPath(path)); 54004 return isUndefined(value) ? defaultValue : value; 54005 } 54006 54007 // Shortcut function for checking if an object has a given property directly on 54008 // itself (in other words, not on a prototype). Unlike the internal `has` 54009 // function, this public version can also traverse nested properties. 54010 function has(obj, path) { 54011 path = toPath(path); 54012 var length = path.length; 54013 for (var i = 0; i < length; i++) { 54014 var key = path[i]; 54015 if (!has$1(obj, key)) return false; 54016 obj = obj[key]; 54017 } 54018 return !!length; 54019 } 54020 54021 // Keep the identity function around for default iteratees. 54022 function identity(value) { 54023 return value; 54024 } 54025 54026 // Returns a predicate for checking whether an object has a given set of 54027 // `key:value` pairs. 54028 function matcher(attrs) { 54029 attrs = extendOwn({}, attrs); 54030 return function(obj) { 54031 return isMatch(obj, attrs); 54032 }; 54033 } 54034 54035 // Creates a function that, when passed an object, will traverse that objectâs 54036 // properties down the given `path`, specified as an array of keys or indices. 54037 function property(path) { 54038 path = toPath(path); 54039 return function(obj) { 54040 return deepGet(obj, path); 54041 }; 54042 } 54043 54044 // Internal function that returns an efficient (for current engines) version 54045 // of the passed-in callback, to be repeatedly applied in other Underscore 54046 // functions. 54047 function optimizeCb(func, context, argCount) { 54048 if (context === void 0) return func; 54049 switch (argCount == null ? 3 : argCount) { 54050 case 1: return function(value) { 54051 return func.call(context, value); 54052 }; 54053 // The 2-argument case is omitted because weâre not using it. 54054 case 3: return function(value, index, collection) { 54055 return func.call(context, value, index, collection); 54056 }; 54057 case 4: return function(accumulator, value, index, collection) { 54058 return func.call(context, accumulator, value, index, collection); 54059 }; 54060 } 54061 return function() { 54062 return func.apply(context, arguments); 54063 }; 54064 } 54065 54066 // An internal function to generate callbacks that can be applied to each 54067 // element in a collection, returning the desired result â either `_.identity`, 54068 // an arbitrary callback, a property matcher, or a property accessor. 54069 function baseIteratee(value, context, argCount) { 54070 if (value == null) return identity; 54071 if (isFunction$1(value)) return optimizeCb(value, context, argCount); 54072 if (isObject(value) && !isArray(value)) return matcher(value); 54073 return property(value); 54074 } 54075 54076 // External wrapper for our callback generator. Users may customize 54077 // `_.iteratee` if they want additional predicate/iteratee shorthand styles. 54078 // This abstraction hides the internal-only `argCount` argument. 54079 function iteratee(value, context) { 54080 return baseIteratee(value, context, Infinity); 54081 } 54082 _$1.iteratee = iteratee; 54083 54084 // The function we call internally to generate a callback. It invokes 54085 // `_.iteratee` if overridden, otherwise `baseIteratee`. 54086 function cb(value, context, argCount) { 54087 if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context); 54088 return baseIteratee(value, context, argCount); 54089 } 54090 54091 // Returns the results of applying the `iteratee` to each element of `obj`. 54092 // In contrast to `_.map` it returns an object. 54093 function mapObject(obj, iteratee, context) { 54094 iteratee = cb(iteratee, context); 54095 var _keys = keys(obj), 54096 length = _keys.length, 54097 results = {}; 54098 for (var index = 0; index < length; index++) { 54099 var currentKey = _keys[index]; 54100 results[currentKey] = iteratee(obj[currentKey], currentKey, obj); 54101 } 54102 return results; 54103 } 54104 54105 // Predicate-generating function. Often useful outside of Underscore. 54106 function noop(){} 54107 54108 // Generates a function for a given object that returns a given property. 54109 function propertyOf(obj) { 54110 if (obj == null) return noop; 54111 return function(path) { 54112 return get(obj, path); 54113 }; 54114 } 54115 54116 // Run a function **n** times. 54117 function times(n, iteratee, context) { 54118 var accum = Array(Math.max(0, n)); 54119 iteratee = optimizeCb(iteratee, context, 1); 54120 for (var i = 0; i < n; i++) accum[i] = iteratee(i); 54121 return accum; 54122 } 54123 54124 // Return a random integer between `min` and `max` (inclusive). 54125 function random(min, max) { 54126 if (max == null) { 54127 max = min; 54128 min = 0; 54129 } 54130 return min + Math.floor(Math.random() * (max - min + 1)); 54131 } 54132 54133 // A (possibly faster) way to get the current timestamp as an integer. 54134 var now = Date.now || function() { 54135 return new Date().getTime(); 54136 }; 54137 54138 // Internal helper to generate functions for escaping and unescaping strings 54139 // to/from HTML interpolation. 54140 function createEscaper(map) { 54141 var escaper = function(match) { 54142 return map[match]; 54143 }; 54144 // Regexes for identifying a key that needs to be escaped. 54145 var source = '(?:' + keys(map).join('|') + ')'; 54146 var testRegexp = RegExp(source); 54147 var replaceRegexp = RegExp(source, 'g'); 54148 return function(string) { 54149 string = string == null ? '' : '' + string; 54150 return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; 54151 }; 54152 } 54153 54154 // Internal list of HTML entities for escaping. 54155 var escapeMap = { 54156 '&': '&', 54157 '<': '<', 54158 '>': '>', 54159 '"': '"', 54160 "'": ''', 54161 '`': '`' 54162 }; 54163 54164 // Function for escaping strings to HTML interpolation. 54165 var _escape = createEscaper(escapeMap); 54166 54167 // Internal list of HTML entities for unescaping. 54168 var unescapeMap = invert(escapeMap); 54169 54170 // Function for unescaping strings from HTML interpolation. 54171 var _unescape = createEscaper(unescapeMap); 54172 54173 // By default, Underscore uses ERB-style template delimiters. Change the 54174 // following template settings to use alternative delimiters. 54175 var templateSettings = _$1.templateSettings = { 54176 evaluate: /<%([\s\S]+?)%>/g, 54177 interpolate: /<%=([\s\S]+?)%>/g, 54178 escape: /<%-([\s\S]+?)%>/g 54179 }; 54180 54181 // When customizing `_.templateSettings`, if you don't want to define an 54182 // interpolation, evaluation or escaping regex, we need one that is 54183 // guaranteed not to match. 54184 var noMatch = /(.)^/; 54185 54186 // Certain characters need to be escaped so that they can be put into a 54187 // string literal. 54188 var escapes = { 54189 "'": "'", 54190 '\\': '\\', 54191 '\r': 'r', 54192 '\n': 'n', 54193 '\u2028': 'u2028', 54194 '\u2029': 'u2029' 54195 }; 54196 54197 var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; 54198 54199 function escapeChar(match) { 54200 return '\\' + escapes[match]; 54201 } 54202 54203 // In order to prevent third-party code injection through 54204 // `_.templateSettings.variable`, we test it against the following regular 54205 // expression. It is intentionally a bit more liberal than just matching valid 54206 // identifiers, but still prevents possible loopholes through defaults or 54207 // destructuring assignment. 54208 var bareIdentifier = /^\s*(\w|\$)+\s*$/; 54209 54210 // JavaScript micro-templating, similar to John Resig's implementation. 54211 // Underscore templating handles arbitrary delimiters, preserves whitespace, 54212 // and correctly escapes quotes within interpolated code. 54213 // NB: `oldSettings` only exists for backwards compatibility. 54214 function template(text, settings, oldSettings) { 54215 if (!settings && oldSettings) settings = oldSettings; 54216 settings = defaults({}, settings, _$1.templateSettings); 54217 54218 // Combine delimiters into one regular expression via alternation. 54219 var matcher = RegExp([ 54220 (settings.escape || noMatch).source, 54221 (settings.interpolate || noMatch).source, 54222 (settings.evaluate || noMatch).source 54223 ].join('|') + '|$', 'g'); 54224 54225 // Compile the template source, escaping string literals appropriately. 54226 var index = 0; 54227 var source = "__p+='"; 54228 text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { 54229 source += text.slice(index, offset).replace(escapeRegExp, escapeChar); 54230 index = offset + match.length; 54231 54232 if (escape) { 54233 source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; 54234 } else if (interpolate) { 54235 source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; 54236 } else if (evaluate) { 54237 source += "';\n" + evaluate + "\n__p+='"; 54238 } 54239 54240 // Adobe VMs need the match returned to produce the correct offset. 54241 return match; 54242 }); 54243 source += "';\n"; 54244 54245 var argument = settings.variable; 54246 if (argument) { 54247 // Insure against third-party code injection. (CVE-2021-23358) 54248 if (!bareIdentifier.test(argument)) throw new Error( 54249 'variable is not a bare identifier: ' + argument 54250 ); 54251 } else { 54252 // If a variable is not specified, place data values in local scope. 54253 source = 'with(obj||{}){\n' + source + '}\n'; 54254 argument = 'obj'; 54255 } 54256 54257 source = "var __t,__p='',__j=Array.prototype.join," + 54258 "print=function(){__p+=__j.call(arguments,'');};\n" + 54259 source + 'return __p;\n'; 54260 54261 var render; 54262 try { 54263 render = new Function(argument, '_', source); 54264 } catch (e) { 54265 e.source = source; 54266 throw e; 54267 } 54268 54269 var template = function(data) { 54270 return render.call(this, data, _$1); 54271 }; 54272 54273 // Provide the compiled source as a convenience for precompilation. 54274 template.source = 'function(' + argument + '){\n' + source + '}'; 54275 54276 return template; 54277 } 54278 54279 // Traverses the children of `obj` along `path`. If a child is a function, it 54280 // is invoked with its parent as context. Returns the value of the final 54281 // child, or `fallback` if any child is undefined. 54282 function result(obj, path, fallback) { 54283 path = toPath(path); 54284 var length = path.length; 54285 if (!length) { 54286 return isFunction$1(fallback) ? fallback.call(obj) : fallback; 54287 } 54288 for (var i = 0; i < length; i++) { 54289 var prop = obj == null ? void 0 : obj[path[i]]; 54290 if (prop === void 0) { 54291 prop = fallback; 54292 i = length; // Ensure we don't continue iterating. 54293 } 54294 obj = isFunction$1(prop) ? prop.call(obj) : prop; 54295 } 54296 return obj; 54297 } 54298 54299 // Generate a unique integer id (unique within the entire client session). 54300 // Useful for temporary DOM ids. 54301 var idCounter = 0; 54302 function uniqueId(prefix) { 54303 var id = ++idCounter + ''; 54304 return prefix ? prefix + id : id; 54305 } 54306 54307 // Start chaining a wrapped Underscore object. 54308 function chain(obj) { 54309 var instance = _$1(obj); 54310 instance._chain = true; 54311 return instance; 54312 } 54313 54314 // Internal function to execute `sourceFunc` bound to `context` with optional 54315 // `args`. Determines whether to execute a function as a constructor or as a 54316 // normal function. 54317 function executeBound(sourceFunc, boundFunc, context, callingContext, args) { 54318 if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); 54319 var self = baseCreate(sourceFunc.prototype); 54320 var result = sourceFunc.apply(self, args); 54321 if (isObject(result)) return result; 54322 return self; 54323 } 54324 54325 // Partially apply a function by creating a version that has had some of its 54326 // arguments pre-filled, without changing its dynamic `this` context. `_` acts 54327 // as a placeholder by default, allowing any combination of arguments to be 54328 // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. 54329 var partial = restArguments(function(func, boundArgs) { 54330 var placeholder = partial.placeholder; 54331 var bound = function() { 54332 var position = 0, length = boundArgs.length; 54333 var args = Array(length); 54334 for (var i = 0; i < length; i++) { 54335 args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; 54336 } 54337 while (position < arguments.length) args.push(arguments[position++]); 54338 return executeBound(func, bound, this, this, args); 54339 }; 54340 return bound; 54341 }); 54342 54343 partial.placeholder = _$1; 54344 54345 // Create a function bound to a given object (assigning `this`, and arguments, 54346 // optionally). 54347 var bind = restArguments(function(func, context, args) { 54348 if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function'); 54349 var bound = restArguments(function(callArgs) { 54350 return executeBound(func, bound, context, this, args.concat(callArgs)); 54351 }); 54352 return bound; 54353 }); 54354 54355 // Internal helper for collection methods to determine whether a collection 54356 // should be iterated as an array or as an object. 54357 // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength 54358 // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 54359 var isArrayLike = createSizePropertyCheck(getLength); 54360 54361 // Internal implementation of a recursive `flatten` function. 54362 function flatten$1(input, depth, strict, output) { 54363 output = output || []; 54364 if (!depth && depth !== 0) { 54365 depth = Infinity; 54366 } else if (depth <= 0) { 54367 return output.concat(input); 54368 } 54369 var idx = output.length; 54370 for (var i = 0, length = getLength(input); i < length; i++) { 54371 var value = input[i]; 54372 if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) { 54373 // Flatten current level of array or arguments object. 54374 if (depth > 1) { 54375 flatten$1(value, depth - 1, strict, output); 54376 idx = output.length; 54377 } else { 54378 var j = 0, len = value.length; 54379 while (j < len) output[idx++] = value[j++]; 54380 } 54381 } else if (!strict) { 54382 output[idx++] = value; 54383 } 54384 } 54385 return output; 54386 } 54387 54388 // Bind a number of an object's methods to that object. Remaining arguments 54389 // are the method names to be bound. Useful for ensuring that all callbacks 54390 // defined on an object belong to it. 54391 var bindAll = restArguments(function(obj, keys) { 54392 keys = flatten$1(keys, false, false); 54393 var index = keys.length; 54394 if (index < 1) throw new Error('bindAll must be passed function names'); 54395 while (index--) { 54396 var key = keys[index]; 54397 obj[key] = bind(obj[key], obj); 54398 } 54399 return obj; 54400 }); 54401 54402 // Memoize an expensive function by storing its results. 54403 function memoize(func, hasher) { 54404 var memoize = function(key) { 54405 var cache = memoize.cache; 54406 var address = '' + (hasher ? hasher.apply(this, arguments) : key); 54407 if (!has$1(cache, address)) cache[address] = func.apply(this, arguments); 54408 return cache[address]; 54409 }; 54410 memoize.cache = {}; 54411 return memoize; 54412 } 54413 54414 // Delays a function for the given number of milliseconds, and then calls 54415 // it with the arguments supplied. 54416 var delay = restArguments(function(func, wait, args) { 54417 return setTimeout(function() { 54418 return func.apply(null, args); 54419 }, wait); 54420 }); 54421 54422 // Defers a function, scheduling it to run after the current call stack has 54423 // cleared. 54424 var defer = partial(delay, _$1, 1); 54425 54426 // Returns a function, that, when invoked, will only be triggered at most once 54427 // during a given window of time. Normally, the throttled function will run 54428 // as much as it can, without ever going more than once per `wait` duration; 54429 // but if you'd like to disable the execution on the leading edge, pass 54430 // `{leading: false}`. To disable execution on the trailing edge, ditto. 54431 function throttle(func, wait, options) { 54432 var timeout, context, args, result; 54433 var previous = 0; 54434 if (!options) options = {}; 54435 54436 var later = function() { 54437 previous = options.leading === false ? 0 : now(); 54438 timeout = null; 54439 result = func.apply(context, args); 54440 if (!timeout) context = args = null; 54441 }; 54442 54443 var throttled = function() { 54444 var _now = now(); 54445 if (!previous && options.leading === false) previous = _now; 54446 var remaining = wait - (_now - previous); 54447 context = this; 54448 args = arguments; 54449 if (remaining <= 0 || remaining > wait) { 54450 if (timeout) { 54451 clearTimeout(timeout); 54452 timeout = null; 54453 } 54454 previous = _now; 54455 result = func.apply(context, args); 54456 if (!timeout) context = args = null; 54457 } else if (!timeout && options.trailing !== false) { 54458 timeout = setTimeout(later, remaining); 54459 } 54460 return result; 54461 }; 54462 54463 throttled.cancel = function() { 54464 clearTimeout(timeout); 54465 previous = 0; 54466 timeout = context = args = null; 54467 }; 54468 54469 return throttled; 54470 } 54471 54472 // When a sequence of calls of the returned function ends, the argument 54473 // function is triggered. The end of a sequence is defined by the `wait` 54474 // parameter. If `immediate` is passed, the argument function will be 54475 // triggered at the beginning of the sequence instead of at the end. 54476 function debounce(func, wait, immediate) { 54477 var timeout, previous, args, result, context; 54478 54479 var later = function() { 54480 var passed = now() - previous; 54481 if (wait > passed) { 54482 timeout = setTimeout(later, wait - passed); 54483 } else { 54484 timeout = null; 54485 if (!immediate) result = func.apply(context, args); 54486 // This check is needed because `func` can recursively invoke `debounced`. 54487 if (!timeout) args = context = null; 54488 } 54489 }; 54490 54491 var debounced = restArguments(function(_args) { 54492 context = this; 54493 args = _args; 54494 previous = now(); 54495 if (!timeout) { 54496 timeout = setTimeout(later, wait); 54497 if (immediate) result = func.apply(context, args); 54498 } 54499 return result; 54500 }); 54501 54502 debounced.cancel = function() { 54503 clearTimeout(timeout); 54504 timeout = args = context = null; 54505 }; 54506 54507 return debounced; 54508 } 54509 54510 // Returns the first function passed as an argument to the second, 54511 // allowing you to adjust arguments, run code before and after, and 54512 // conditionally execute the original function. 54513 function wrap(func, wrapper) { 54514 return partial(wrapper, func); 54515 } 54516 54517 // Returns a negated version of the passed-in predicate. 54518 function negate(predicate) { 54519 return function() { 54520 return !predicate.apply(this, arguments); 54521 }; 54522 } 54523 54524 // Returns a function that is the composition of a list of functions, each 54525 // consuming the return value of the function that follows. 54526 function compose() { 54527 var args = arguments; 54528 var start = args.length - 1; 54529 return function() { 54530 var i = start; 54531 var result = args[start].apply(this, arguments); 54532 while (i--) result = args[i].call(this, result); 54533 return result; 54534 }; 54535 } 54536 54537 // Returns a function that will only be executed on and after the Nth call. 54538 function after(times, func) { 54539 return function() { 54540 if (--times < 1) { 54541 return func.apply(this, arguments); 54542 } 54543 }; 54544 } 54545 54546 // Returns a function that will only be executed up to (but not including) the 54547 // Nth call. 54548 function before(times, func) { 54549 var memo; 54550 return function() { 54551 if (--times > 0) { 54552 memo = func.apply(this, arguments); 54553 } 54554 if (times <= 1) func = null; 54555 return memo; 54556 }; 54557 } 54558 54559 // Returns a function that will be executed at most one time, no matter how 54560 // often you call it. Useful for lazy initialization. 54561 var once = partial(before, 2); 54562 54563 // Returns the first key on an object that passes a truth test. 54564 function findKey(obj, predicate, context) { 54565 predicate = cb(predicate, context); 54566 var _keys = keys(obj), key; 54567 for (var i = 0, length = _keys.length; i < length; i++) { 54568 key = _keys[i]; 54569 if (predicate(obj[key], key, obj)) return key; 54570 } 54571 } 54572 54573 // Internal function to generate `_.findIndex` and `_.findLastIndex`. 54574 function createPredicateIndexFinder(dir) { 54575 return function(array, predicate, context) { 54576 predicate = cb(predicate, context); 54577 var length = getLength(array); 54578 var index = dir > 0 ? 0 : length - 1; 54579 for (; index >= 0 && index < length; index += dir) { 54580 if (predicate(array[index], index, array)) return index; 54581 } 54582 return -1; 54583 }; 54584 } 54585 54586 // Returns the first index on an array-like that passes a truth test. 54587 var findIndex = createPredicateIndexFinder(1); 54588 54589 // Returns the last index on an array-like that passes a truth test. 54590 var findLastIndex = createPredicateIndexFinder(-1); 54591 54592 // Use a comparator function to figure out the smallest index at which 54593 // an object should be inserted so as to maintain order. Uses binary search. 54594 function sortedIndex(array, obj, iteratee, context) { 54595 iteratee = cb(iteratee, context, 1); 54596 var value = iteratee(obj); 54597 var low = 0, high = getLength(array); 54598 while (low < high) { 54599 var mid = Math.floor((low + high) / 2); 54600 if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; 54601 } 54602 return low; 54603 } 54604 54605 // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions. 54606 function createIndexFinder(dir, predicateFind, sortedIndex) { 54607 return function(array, item, idx) { 54608 var i = 0, length = getLength(array); 54609 if (typeof idx == 'number') { 54610 if (dir > 0) { 54611 i = idx >= 0 ? idx : Math.max(idx + length, i); 54612 } else { 54613 length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; 54614 } 54615 } else if (sortedIndex && idx && length) { 54616 idx = sortedIndex(array, item); 54617 return array[idx] === item ? idx : -1; 54618 } 54619 if (item !== item) { 54620 idx = predicateFind(slice.call(array, i, length), isNaN$1); 54621 return idx >= 0 ? idx + i : -1; 54622 } 54623 for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { 54624 if (array[idx] === item) return idx; 54625 } 54626 return -1; 54627 }; 54628 } 54629 54630 // Return the position of the first occurrence of an item in an array, 54631 // or -1 if the item is not included in the array. 54632 // If the array is large and already in sort order, pass `true` 54633 // for **isSorted** to use binary search. 54634 var indexOf = createIndexFinder(1, findIndex, sortedIndex); 54635 54636 // Return the position of the last occurrence of an item in an array, 54637 // or -1 if the item is not included in the array. 54638 var lastIndexOf = createIndexFinder(-1, findLastIndex); 54639 54640 // Return the first value which passes a truth test. 54641 function find(obj, predicate, context) { 54642 var keyFinder = isArrayLike(obj) ? findIndex : findKey; 54643 var key = keyFinder(obj, predicate, context); 54644 if (key !== void 0 && key !== -1) return obj[key]; 54645 } 54646 54647 // Convenience version of a common use case of `_.find`: getting the first 54648 // object containing specific `key:value` pairs. 54649 function findWhere(obj, attrs) { 54650 return find(obj, matcher(attrs)); 54651 } 54652 54653 // The cornerstone for collection functions, an `each` 54654 // implementation, aka `forEach`. 54655 // Handles raw objects in addition to array-likes. Treats all 54656 // sparse array-likes as if they were dense. 54657 function each(obj, iteratee, context) { 54658 iteratee = optimizeCb(iteratee, context); 54659 var i, length; 54660 if (isArrayLike(obj)) { 54661 for (i = 0, length = obj.length; i < length; i++) { 54662 iteratee(obj[i], i, obj); 54663 } 54664 } else { 54665 var _keys = keys(obj); 54666 for (i = 0, length = _keys.length; i < length; i++) { 54667 iteratee(obj[_keys[i]], _keys[i], obj); 54668 } 54669 } 54670 return obj; 54671 } 54672 54673 // Return the results of applying the iteratee to each element. 54674 function map(obj, iteratee, context) { 54675 iteratee = cb(iteratee, context); 54676 var _keys = !isArrayLike(obj) && keys(obj), 54677 length = (_keys || obj).length, 54678 results = Array(length); 54679 for (var index = 0; index < length; index++) { 54680 var currentKey = _keys ? _keys[index] : index; 54681 results[index] = iteratee(obj[currentKey], currentKey, obj); 54682 } 54683 return results; 54684 } 54685 54686 // Internal helper to create a reducing function, iterating left or right. 54687 function createReduce(dir) { 54688 // Wrap code that reassigns argument variables in a separate function than 54689 // the one that accesses `arguments.length` to avoid a perf hit. (#1991) 54690 var reducer = function(obj, iteratee, memo, initial) { 54691 var _keys = !isArrayLike(obj) && keys(obj), 54692 length = (_keys || obj).length, 54693 index = dir > 0 ? 0 : length - 1; 54694 if (!initial) { 54695 memo = obj[_keys ? _keys[index] : index]; 54696 index += dir; 54697 } 54698 for (; index >= 0 && index < length; index += dir) { 54699 var currentKey = _keys ? _keys[index] : index; 54700 memo = iteratee(memo, obj[currentKey], currentKey, obj); 54701 } 54702 return memo; 54703 }; 54704 54705 return function(obj, iteratee, memo, context) { 54706 var initial = arguments.length >= 3; 54707 return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); 54708 }; 54709 } 54710 54711 // **Reduce** builds up a single result from a list of values, aka `inject`, 54712 // or `foldl`. 54713 var reduce = createReduce(1); 54714 54715 // The right-associative version of reduce, also known as `foldr`. 54716 var reduceRight = createReduce(-1); 54717 54718 // Return all the elements that pass a truth test. 54719 function filter(obj, predicate, context) { 54720 var results = []; 54721 predicate = cb(predicate, context); 54722 each(obj, function(value, index, list) { 54723 if (predicate(value, index, list)) results.push(value); 54724 }); 54725 return results; 54726 } 54727 54728 // Return all the elements for which a truth test fails. 54729 function reject(obj, predicate, context) { 54730 return filter(obj, negate(cb(predicate)), context); 54731 } 54732 54733 // Determine whether all of the elements pass a truth test. 54734 function every(obj, predicate, context) { 54735 predicate = cb(predicate, context); 54736 var _keys = !isArrayLike(obj) && keys(obj), 54737 length = (_keys || obj).length; 54738 for (var index = 0; index < length; index++) { 54739 var currentKey = _keys ? _keys[index] : index; 54740 if (!predicate(obj[currentKey], currentKey, obj)) return false; 54741 } 54742 return true; 54743 } 54744 54745 // Determine if at least one element in the object passes a truth test. 54746 function some(obj, predicate, context) { 54747 predicate = cb(predicate, context); 54748 var _keys = !isArrayLike(obj) && keys(obj), 54749 length = (_keys || obj).length; 54750 for (var index = 0; index < length; index++) { 54751 var currentKey = _keys ? _keys[index] : index; 54752 if (predicate(obj[currentKey], currentKey, obj)) return true; 54753 } 54754 return false; 54755 } 54756 54757 // Determine if the array or object contains a given item (using `===`). 54758 function contains(obj, item, fromIndex, guard) { 54759 if (!isArrayLike(obj)) obj = values(obj); 54760 if (typeof fromIndex != 'number' || guard) fromIndex = 0; 54761 return indexOf(obj, item, fromIndex) >= 0; 54762 } 54763 54764 // Invoke a method (with arguments) on every item in a collection. 54765 var invoke = restArguments(function(obj, path, args) { 54766 var contextPath, func; 54767 if (isFunction$1(path)) { 54768 func = path; 54769 } else { 54770 path = toPath(path); 54771 contextPath = path.slice(0, -1); 54772 path = path[path.length - 1]; 54773 } 54774 return map(obj, function(context) { 54775 var method = func; 54776 if (!method) { 54777 if (contextPath && contextPath.length) { 54778 context = deepGet(context, contextPath); 54779 } 54780 if (context == null) return void 0; 54781 method = context[path]; 54782 } 54783 return method == null ? method : method.apply(context, args); 54784 }); 54785 }); 54786 54787 // Convenience version of a common use case of `_.map`: fetching a property. 54788 function pluck(obj, key) { 54789 return map(obj, property(key)); 54790 } 54791 54792 // Convenience version of a common use case of `_.filter`: selecting only 54793 // objects containing specific `key:value` pairs. 54794 function where(obj, attrs) { 54795 return filter(obj, matcher(attrs)); 54796 } 54797 54798 // Return the maximum element (or element-based computation). 54799 function max(obj, iteratee, context) { 54800 var result = -Infinity, lastComputed = -Infinity, 54801 value, computed; 54802 if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { 54803 obj = isArrayLike(obj) ? obj : values(obj); 54804 for (var i = 0, length = obj.length; i < length; i++) { 54805 value = obj[i]; 54806 if (value != null && value > result) { 54807 result = value; 54808 } 54809 } 54810 } else { 54811 iteratee = cb(iteratee, context); 54812 each(obj, function(v, index, list) { 54813 computed = iteratee(v, index, list); 54814 if (computed > lastComputed || computed === -Infinity && result === -Infinity) { 54815 result = v; 54816 lastComputed = computed; 54817 } 54818 }); 54819 } 54820 return result; 54821 } 54822 54823 // Return the minimum element (or element-based computation). 54824 function min(obj, iteratee, context) { 54825 var result = Infinity, lastComputed = Infinity, 54826 value, computed; 54827 if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) { 54828 obj = isArrayLike(obj) ? obj : values(obj); 54829 for (var i = 0, length = obj.length; i < length; i++) { 54830 value = obj[i]; 54831 if (value != null && value < result) { 54832 result = value; 54833 } 54834 } 54835 } else { 54836 iteratee = cb(iteratee, context); 54837 each(obj, function(v, index, list) { 54838 computed = iteratee(v, index, list); 54839 if (computed < lastComputed || computed === Infinity && result === Infinity) { 54840 result = v; 54841 lastComputed = computed; 54842 } 54843 }); 54844 } 54845 return result; 54846 } 54847 54848 // Sample **n** random values from a collection using the modern version of the 54849 // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/FisherâYates_shuffle). 54850 // If **n** is not specified, returns a single random element. 54851 // The internal `guard` argument allows it to work with `_.map`. 54852 function sample(obj, n, guard) { 54853 if (n == null || guard) { 54854 if (!isArrayLike(obj)) obj = values(obj); 54855 return obj[random(obj.length - 1)]; 54856 } 54857 var sample = isArrayLike(obj) ? clone(obj) : values(obj); 54858 var length = getLength(sample); 54859 n = Math.max(Math.min(n, length), 0); 54860 var last = length - 1; 54861 for (var index = 0; index < n; index++) { 54862 var rand = random(index, last); 54863 var temp = sample[index]; 54864 sample[index] = sample[rand]; 54865 sample[rand] = temp; 54866 } 54867 return sample.slice(0, n); 54868 } 54869 54870 // Shuffle a collection. 54871 function shuffle(obj) { 54872 return sample(obj, Infinity); 54873 } 54874 54875 // Sort the object's values by a criterion produced by an iteratee. 54876 function sortBy(obj, iteratee, context) { 54877 var index = 0; 54878 iteratee = cb(iteratee, context); 54879 return pluck(map(obj, function(value, key, list) { 54880 return { 54881 value: value, 54882 index: index++, 54883 criteria: iteratee(value, key, list) 54884 }; 54885 }).sort(function(left, right) { 54886 var a = left.criteria; 54887 var b = right.criteria; 54888 if (a !== b) { 54889 if (a > b || a === void 0) return 1; 54890 if (a < b || b === void 0) return -1; 54891 } 54892 return left.index - right.index; 54893 }), 'value'); 54894 } 54895 54896 // An internal function used for aggregate "group by" operations. 54897 function group(behavior, partition) { 54898 return function(obj, iteratee, context) { 54899 var result = partition ? [[], []] : {}; 54900 iteratee = cb(iteratee, context); 54901 each(obj, function(value, index) { 54902 var key = iteratee(value, index, obj); 54903 behavior(result, value, key); 54904 }); 54905 return result; 54906 }; 54907 } 54908 54909 // Groups the object's values by a criterion. Pass either a string attribute 54910 // to group by, or a function that returns the criterion. 54911 var groupBy = group(function(result, value, key) { 54912 if (has$1(result, key)) result[key].push(value); else result[key] = [value]; 54913 }); 54914 54915 // Indexes the object's values by a criterion, similar to `_.groupBy`, but for 54916 // when you know that your index values will be unique. 54917 var indexBy = group(function(result, value, key) { 54918 result[key] = value; 54919 }); 54920 54921 // Counts instances of an object that group by a certain criterion. Pass 54922 // either a string attribute to count by, or a function that returns the 54923 // criterion. 54924 var countBy = group(function(result, value, key) { 54925 if (has$1(result, key)) result[key]++; else result[key] = 1; 54926 }); 54927 54928 // Split a collection into two arrays: one whose elements all pass the given 54929 // truth test, and one whose elements all do not pass the truth test. 54930 var partition = group(function(result, value, pass) { 54931 result[pass ? 0 : 1].push(value); 54932 }, true); 54933 54934 // Safely create a real, live array from anything iterable. 54935 var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; 54936 function toArray(obj) { 54937 if (!obj) return []; 54938 if (isArray(obj)) return slice.call(obj); 54939 if (isString(obj)) { 54940 // Keep surrogate pair characters together. 54941 return obj.match(reStrSymbol); 54942 } 54943 if (isArrayLike(obj)) return map(obj, identity); 54944 return values(obj); 54945 } 54946 54947 // Return the number of elements in a collection. 54948 function size(obj) { 54949 if (obj == null) return 0; 54950 return isArrayLike(obj) ? obj.length : keys(obj).length; 54951 } 54952 54953 // Internal `_.pick` helper function to determine whether `key` is an enumerable 54954 // property name of `obj`. 54955 function keyInObj(value, key, obj) { 54956 return key in obj; 54957 } 54958 54959 // Return a copy of the object only containing the allowed properties. 54960 var pick = restArguments(function(obj, keys) { 54961 var result = {}, iteratee = keys[0]; 54962 if (obj == null) return result; 54963 if (isFunction$1(iteratee)) { 54964 if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); 54965 keys = allKeys(obj); 54966 } else { 54967 iteratee = keyInObj; 54968 keys = flatten$1(keys, false, false); 54969 obj = Object(obj); 54970 } 54971 for (var i = 0, length = keys.length; i < length; i++) { 54972 var key = keys[i]; 54973 var value = obj[key]; 54974 if (iteratee(value, key, obj)) result[key] = value; 54975 } 54976 return result; 54977 }); 54978 54979 // Return a copy of the object without the disallowed properties. 54980 var omit = restArguments(function(obj, keys) { 54981 var iteratee = keys[0], context; 54982 if (isFunction$1(iteratee)) { 54983 iteratee = negate(iteratee); 54984 if (keys.length > 1) context = keys[1]; 54985 } else { 54986 keys = map(flatten$1(keys, false, false), String); 54987 iteratee = function(value, key) { 54988 return !contains(keys, key); 54989 }; 54990 } 54991 return pick(obj, iteratee, context); 54992 }); 54993 54994 // Returns everything but the last entry of the array. Especially useful on 54995 // the arguments object. Passing **n** will return all the values in 54996 // the array, excluding the last N. 54997 function initial(array, n, guard) { 54998 return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); 54999 } 55000 55001 // Get the first element of an array. Passing **n** will return the first N 55002 // values in the array. The **guard** check allows it to work with `_.map`. 55003 function first(array, n, guard) { 55004 if (array == null || array.length < 1) return n == null || guard ? void 0 : []; 55005 if (n == null || guard) return array[0]; 55006 return initial(array, array.length - n); 55007 } 55008 55009 // Returns everything but the first entry of the `array`. Especially useful on 55010 // the `arguments` object. Passing an **n** will return the rest N values in the 55011 // `array`. 55012 function rest(array, n, guard) { 55013 return slice.call(array, n == null || guard ? 1 : n); 55014 } 55015 55016 // Get the last element of an array. Passing **n** will return the last N 55017 // values in the array. 55018 function last(array, n, guard) { 55019 if (array == null || array.length < 1) return n == null || guard ? void 0 : []; 55020 if (n == null || guard) return array[array.length - 1]; 55021 return rest(array, Math.max(0, array.length - n)); 55022 } 55023 55024 // Trim out all falsy values from an array. 55025 function compact(array) { 55026 return filter(array, Boolean); 55027 } 55028 55029 // Flatten out an array, either recursively (by default), or up to `depth`. 55030 // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively. 55031 function flatten(array, depth) { 55032 return flatten$1(array, depth, false); 55033 } 55034 55035 // Take the difference between one array and a number of other arrays. 55036 // Only the elements present in just the first array will remain. 55037 var difference = restArguments(function(array, rest) { 55038 rest = flatten$1(rest, true, true); 55039 return filter(array, function(value){ 55040 return !contains(rest, value); 55041 }); 55042 }); 55043 55044 // Return a version of the array that does not contain the specified value(s). 55045 var without = restArguments(function(array, otherArrays) { 55046 return difference(array, otherArrays); 55047 }); 55048 55049 // Produce a duplicate-free version of the array. If the array has already 55050 // been sorted, you have the option of using a faster algorithm. 55051 // The faster algorithm will not work with an iteratee if the iteratee 55052 // is not a one-to-one function, so providing an iteratee will disable 55053 // the faster algorithm. 55054 function uniq(array, isSorted, iteratee, context) { 55055 if (!isBoolean(isSorted)) { 55056 context = iteratee; 55057 iteratee = isSorted; 55058 isSorted = false; 55059 } 55060 if (iteratee != null) iteratee = cb(iteratee, context); 55061 var result = []; 55062 var seen = []; 55063 for (var i = 0, length = getLength(array); i < length; i++) { 55064 var value = array[i], 55065 computed = iteratee ? iteratee(value, i, array) : value; 55066 if (isSorted && !iteratee) { 55067 if (!i || seen !== computed) result.push(value); 55068 seen = computed; 55069 } else if (iteratee) { 55070 if (!contains(seen, computed)) { 55071 seen.push(computed); 55072 result.push(value); 55073 } 55074 } else if (!contains(result, value)) { 55075 result.push(value); 55076 } 55077 } 55078 return result; 55079 } 55080 55081 // Produce an array that contains the union: each distinct element from all of 55082 // the passed-in arrays. 55083 var union = restArguments(function(arrays) { 55084 return uniq(flatten$1(arrays, true, true)); 55085 }); 55086 55087 // Produce an array that contains every item shared between all the 55088 // passed-in arrays. 55089 function intersection(array) { 55090 var result = []; 55091 var argsLength = arguments.length; 55092 for (var i = 0, length = getLength(array); i < length; i++) { 55093 var item = array[i]; 55094 if (contains(result, item)) continue; 55095 var j; 55096 for (j = 1; j < argsLength; j++) { 55097 if (!contains(arguments[j], item)) break; 55098 } 55099 if (j === argsLength) result.push(item); 55100 } 55101 return result; 55102 } 55103 55104 // Complement of zip. Unzip accepts an array of arrays and groups 55105 // each array's elements on shared indices. 55106 function unzip(array) { 55107 var length = array && max(array, getLength).length || 0; 55108 var result = Array(length); 55109 55110 for (var index = 0; index < length; index++) { 55111 result[index] = pluck(array, index); 55112 } 55113 return result; 55114 } 55115 55116 // Zip together multiple lists into a single array -- elements that share 55117 // an index go together. 55118 var zip = restArguments(unzip); 55119 55120 // Converts lists into objects. Pass either a single array of `[key, value]` 55121 // pairs, or two parallel arrays of the same length -- one of keys, and one of 55122 // the corresponding values. Passing by pairs is the reverse of `_.pairs`. 55123 function object(list, values) { 55124 var result = {}; 55125 for (var i = 0, length = getLength(list); i < length; i++) { 55126 if (values) { 55127 result[list[i]] = values[i]; 55128 } else { 55129 result[list[i][0]] = list[i][1]; 55130 } 55131 } 55132 return result; 55133 } 55134 55135 // Generate an integer Array containing an arithmetic progression. A port of 55136 // the native Python `range()` function. See 55137 // [the Python documentation](https://docs.python.org/library/functions.html#range). 55138 function range(start, stop, step) { 55139 if (stop == null) { 55140 stop = start || 0; 55141 start = 0; 55142 } 55143 if (!step) { 55144 step = stop < start ? -1 : 1; 55145 } 55146 55147 var length = Math.max(Math.ceil((stop - start) / step), 0); 55148 var range = Array(length); 55149 55150 for (var idx = 0; idx < length; idx++, start += step) { 55151 range[idx] = start; 55152 } 55153 55154 return range; 55155 } 55156 55157 // Chunk a single array into multiple arrays, each containing `count` or fewer 55158 // items. 55159 function chunk(array, count) { 55160 if (count == null || count < 1) return []; 55161 var result = []; 55162 var i = 0, length = array.length; 55163 while (i < length) { 55164 result.push(slice.call(array, i, i += count)); 55165 } 55166 return result; 55167 } 55168 55169 // Helper function to continue chaining intermediate results. 55170 function chainResult(instance, obj) { 55171 return instance._chain ? _$1(obj).chain() : obj; 55172 } 55173 55174 // Add your own custom functions to the Underscore object. 55175 function mixin(obj) { 55176 each(functions(obj), function(name) { 55177 var func = _$1[name] = obj[name]; 55178 _$1.prototype[name] = function() { 55179 var args = [this._wrapped]; 55180 push.apply(args, arguments); 55181 return chainResult(this, func.apply(_$1, args)); 55182 }; 55183 }); 55184 return _$1; 55185 } 55186 55187 // Add all mutator `Array` functions to the wrapper. 55188 each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { 55189 var method = ArrayProto[name]; 55190 _$1.prototype[name] = function() { 55191 var obj = this._wrapped; 55192 if (obj != null) { 55193 method.apply(obj, arguments); 55194 if ((name === 'shift' || name === 'splice') && obj.length === 0) { 55195 delete obj[0]; 55196 } 55197 } 55198 return chainResult(this, obj); 55199 }; 55200 }); 55201 55202 // Add all accessor `Array` functions to the wrapper. 55203 each(['concat', 'join', 'slice'], function(name) { 55204 var method = ArrayProto[name]; 55205 _$1.prototype[name] = function() { 55206 var obj = this._wrapped; 55207 if (obj != null) obj = method.apply(obj, arguments); 55208 return chainResult(this, obj); 55209 }; 55210 }); 55211 55212 // Named Exports 55213 55214 var allExports = { 55215 __proto__: null, 55216 VERSION: VERSION, 55217 restArguments: restArguments, 55218 isObject: isObject, 55219 isNull: isNull, 55220 isUndefined: isUndefined, 55221 isBoolean: isBoolean, 55222 isElement: isElement, 55223 isString: isString, 55224 isNumber: isNumber, 55225 isDate: isDate, 55226 isRegExp: isRegExp, 55227 isError: isError, 55228 isSymbol: isSymbol, 55229 isArrayBuffer: isArrayBuffer, 55230 isDataView: isDataView$1, 55231 isArray: isArray, 55232 isFunction: isFunction$1, 55233 isArguments: isArguments$1, 55234 isFinite: isFinite$1, 55235 isNaN: isNaN$1, 55236 isTypedArray: isTypedArray$1, 55237 isEmpty: isEmpty, 55238 isMatch: isMatch, 55239 isEqual: isEqual, 55240 isMap: isMap, 55241 isWeakMap: isWeakMap, 55242 isSet: isSet, 55243 isWeakSet: isWeakSet, 55244 keys: keys, 55245 allKeys: allKeys, 55246 values: values, 55247 pairs: pairs, 55248 invert: invert, 55249 functions: functions, 55250 methods: functions, 55251 extend: extend, 55252 extendOwn: extendOwn, 55253 assign: extendOwn, 55254 defaults: defaults, 55255 create: create, 55256 clone: clone, 55257 tap: tap, 55258 get: get, 55259 has: has, 55260 mapObject: mapObject, 55261 identity: identity, 55262 constant: constant, 55263 noop: noop, 55264 toPath: toPath$1, 55265 property: property, 55266 propertyOf: propertyOf, 55267 matcher: matcher, 55268 matches: matcher, 55269 times: times, 55270 random: random, 55271 now: now, 55272 escape: _escape, 55273 unescape: _unescape, 55274 templateSettings: templateSettings, 55275 template: template, 55276 result: result, 55277 uniqueId: uniqueId, 55278 chain: chain, 55279 iteratee: iteratee, 55280 partial: partial, 55281 bind: bind, 55282 bindAll: bindAll, 55283 memoize: memoize, 55284 delay: delay, 55285 defer: defer, 55286 throttle: throttle, 55287 debounce: debounce, 55288 wrap: wrap, 55289 negate: negate, 55290 compose: compose, 55291 after: after, 55292 before: before, 55293 once: once, 55294 findKey: findKey, 55295 findIndex: findIndex, 55296 findLastIndex: findLastIndex, 55297 sortedIndex: sortedIndex, 55298 indexOf: indexOf, 55299 lastIndexOf: lastIndexOf, 55300 find: find, 55301 detect: find, 55302 findWhere: findWhere, 55303 each: each, 55304 forEach: each, 55305 map: map, 55306 collect: map, 55307 reduce: reduce, 55308 foldl: reduce, 55309 inject: reduce, 55310 reduceRight: reduceRight, 55311 foldr: reduceRight, 55312 filter: filter, 55313 select: filter, 55314 reject: reject, 55315 every: every, 55316 all: every, 55317 some: some, 55318 any: some, 55319 contains: contains, 55320 includes: contains, 55321 include: contains, 55322 invoke: invoke, 55323 pluck: pluck, 55324 where: where, 55325 max: max, 55326 min: min, 55327 shuffle: shuffle, 55328 sample: sample, 55329 sortBy: sortBy, 55330 groupBy: groupBy, 55331 indexBy: indexBy, 55332 countBy: countBy, 55333 partition: partition, 55334 toArray: toArray, 55335 size: size, 55336 pick: pick, 55337 omit: omit, 55338 first: first, 55339 head: first, 55340 take: first, 55341 initial: initial, 55342 last: last, 55343 rest: rest, 55344 tail: rest, 55345 drop: rest, 55346 compact: compact, 55347 flatten: flatten, 55348 without: without, 55349 uniq: uniq, 55350 unique: uniq, 55351 union: union, 55352 intersection: intersection, 55353 difference: difference, 55354 unzip: unzip, 55355 transpose: unzip, 55356 zip: zip, 55357 object: object, 55358 range: range, 55359 chunk: chunk, 55360 mixin: mixin, 55361 'default': _$1 55362 }; 55363 55364 // Default Export 55365 55366 // Add all of the Underscore functions to the wrapper object. 55367 var _ = mixin(allExports); 55368 // Legacy Node.js API. 55369 _._ = _; 55370 55371 return _; 55372 55373})));
55374//# sourceMappingURL=underscore-umd.js.map 55375 55376// Backbone.js 1.0.0 55377 55378// (c) 2010-2013 Jeremy Ashkenas, DocumentCloud Inc. 55379// Backbone may be freely distributed under the MIT license. 55380// For all details and documentation: 55381// http://backbonejs.org 55382 55383(function(){ 55384 55385 // Initial Setup 55386 // ------------- 55387 55388 // Save a reference to the global object (`window` in the browser, `exports` 55389 // on the server). 55390 var root = this; 55391 55392 // Save the previous value of the `Backbone` variable, so that it can be 55393 // restored later on, if `noConflict` is used. 55394 var previousBackbone = root.Backbone; 55395 55396 // Create local references to array methods we'll want to use later. 55397 var array = []; 55398 var push = array.push; 55399 var slice = array.slice; 55400 var splice = array.splice; 55401 55402 // The top-level namespace. All public Backbone classes and modules will 55403 // be attached to this. Exported for both the browser and the server. 55404 var Backbone; 55405 if (typeof exports !== 'undefined') { 55406 Backbone = exports; 55407 } else { 55408 Backbone = root.Backbone = {}; 55409 } 55410 55411 // Current version of the library. Keep in sync with `package.json`. 55412 Backbone.VERSION = '1.0.0'; 55413 55414 // Require Underscore, if we're on the server, and it's not already present. 55415 var _ = root._; 55416 if (!_ && (typeof require !== 'undefined')) _ = require('underscore'); 55417 55418 // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns 55419 // the `$` variable. 55420 Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$; 55421 55422 // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable 55423 // to its previous owner. Returns a reference to this Backbone object. 55424 Backbone.noConflict = function() { 55425 root.Backbone = previousBackbone; 55426 return this; 55427 }; 55428 55429 // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option 55430 // will fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and 55431 // set a `X-Http-Method-Override` header. 55432 Backbone.emulateHTTP = false;
55433 55434 // Turn on `emulateJSON` to support legacy servers that can't deal with direct 55435 // `application/json` requests ... will encode the body as 55436 // `application/x-www-form-urlencoded` instead and will send the model in a 55437 // form param named `model`. 55438 Backbone.emulateJSON = false; 55439 55440 // Backbone.Events 55441 // --------------- 55442 55443 // A module that can be mixed in to *any object* in order to provide it with 55444 // custom events. You may bind with `on` or remove with `off` callback 55445 // functions to an event; `trigger`-ing an event fires all callbacks in 55446 // succession. 55447 // 55448 // var object = {}; 55449 // _.extend(object, Backbone.Events); 55450 // object.on('expand', function(){ alert('expanded'); }); 55451 // object.trigger('expand'); 55452 // 55453 var Events = Backbone.Events = { 55454 55455 // Bind an event to a `callback` function. Passing `"all"` will bind 55456 // the callback to all events fired. 55457 on: function(name, callback, context) { 55458 if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this; 55459 this._events || (this._events = {}); 55460 var events = this._events[name] || (this._events[name] = []); 55461 events.push({callback: callback, context: context, ctx: context || this}); 55462 return this; 55463 }, 55464 55465 // Bind an event to only be triggered a single time. After the first time 55466 // the callback is invoked, it will be removed. 55467 once: function(name, callback, context) { 55468 if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this; 55469 var self = this; 55470 var once = _.once(function() { 55471 self.off(name, once); 55472 callback.apply(this, arguments); 55473 }); 55474 once._callback = callback; 55475 return this.on(name, once, context); 55476 }, 55477 55478 // Remove one or many callbacks. If `context` is null, removes all 55479 // callbacks with that function. If `callback` is null, removes all 55480 // callbacks for the event. If `name` is null, removes all bound 55481 // callbacks for all events. 55482 off: function(name, callback, context) { 55483 var retain, ev, events, names, i, l, j, k; 55484 if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this; 55485 if (!name && !callback && !context) { 55486 this._events = {}; 55487 return this; 55488 } 55489 55490 names = name ? [name] : _.keys(this._events); 55491 for (i = 0, l = names.length; i < l; i++) { 55492 name = names[i]; 55493 if (events = this._events[name]) { 55494 this._events[name] = retain = []; 55495 if (callback || context) { 55496 for (j = 0, k = events.length; j < k; j++) { 55497 ev = events[j]; 55498 if ((callback && callback !== ev.callback && callback !== ev.callback._callback) || 55499 (context && context !== ev.context)) { 55500 retain.push(ev); 55501 } 55502 } 55503 } 55504 if (!retain.length) delete this._events[name]; 55505 } 55506 } 55507 55508 return this; 55509 }, 55510 55511 // Trigger one or many events, firing all bound callbacks. Callbacks are 55512 // passed the same arguments as `trigger` is, apart from the event name 55513 // (unless you're listening on `"all"`, which will cause your callback to 55514 // receive the true name of the event as the first argument). 55515 trigger: function(name) { 55516 if (!this._events) return this; 55517 var args = slice.call(arguments, 1); 55518 if (!eventsApi(this, 'trigger', name, args)) return this; 55519 var events = this._events[name]; 55520 var allEvents = this._events.all; 55521 if (events) triggerEvents(events, args); 55522 if (allEvents) triggerEvents(allEvents, arguments); 55523 return this; 55524 }, 55525 55526 // Tell this object to stop listening to either specific events ... or 55527 // to every object it's currently listening to. 55528 stopListening: function(obj, name, callback) { 55529 var listeners = this._listeners; 55530 if (!listeners) return this; 55531 var deleteListener = !name && !callback; 55532 if (typeof name === 'object') callback = this; 55533 if (obj) (listeners = {})[obj._listenerId] = obj; 55534 for (var id in listeners) { 55535 listeners[id].off(name, callback, this); 55536 if (deleteListener) delete this._listeners[id]; 55537 } 55538 return this; 55539 } 55540 55541 }; 55542 55543 // Regular expression used to split event strings. 55544 var eventSplitter = /\s+/; 55545 55546 // Implement fancy features of the Events API such as multiple event 55547 // names `"change blur"` and jQuery-style event maps `{change: action}` 55548 // in terms of the existing API. 55549 var eventsApi = function(obj, action, name, rest) { 55550 if (!name) return true; 55551 55552 // Handle event maps. 55553 if (typeof name === 'object') { 55554 for (var key in name) { 55555 obj[action].apply(obj, [key, name[key]].concat(rest)); 55556 } 55557 return false;
55558 } 55559 55560 // Handle space separated event names. 55561 if (eventSplitter.test(name)) { 55562 var names = name.split(eventSplitter); 55563 for (var i = 0, l = names.length; i < l; i++) { 55564 obj[action].apply(obj, [names[i]].concat(rest)); 55565 } 55566 return false; 55567 } 55568 55569 return true; 55570 }; 55571 55572 // A difficult-to-believe, but optimized internal dispatch function for 55573 // triggering events. Tries to keep the usual cases speedy (most internal 55574 // Backbone events have 3 arguments). 55575 var triggerEvents = function(events, args) { 55576 var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2]; 55577 switch (args.length) { 55578 case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return; 55579 case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return; 55580 case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return; 55581 case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return; 55582 default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args); 55583 } 55584 }; 55585 55586 var listenMethods = {listenTo: 'on', listenToOnce: 'once'}; 55587 55588 // Inversion-of-control versions of `on` and `once`. Tell *this* object to 55589 // listen to an event in another object ... keeping track of what it's 55590 // listening to. 55591 _.each(listenMethods, function(implementation, method) { 55592 Events[method] = function(obj, name, callback) { 55593 var listeners = this._listeners || (this._listeners = {}); 55594 var id = obj._listenerId || (obj._listenerId = _.uniqueId('l')); 55595 listeners[id] = obj; 55596 if (typeof name === 'object') callback = this; 55597 obj[implementation](name, callback, this); 55598 return this; 55599 }; 55600 }); 55601 55602 // Aliases for backwards compatibility. 55603 Events.bind = Events.on; 55604 Events.unbind = Events.off; 55605 55606 // Allow the `Backbone` object to serve as a global event bus, for folks who 55607 // want global "pubsub" in a convenient place. 55608 _.extend(Backbone, Events); 55609 55610 // Backbone.Model 55611 // -------------- 55612 55613 // Backbone **Models** are the basic data object in the framework -- 55614 // frequently representing a row in a table in a database on your server. 55615 // A discrete chunk of data and a bunch of useful, related methods for 55616 // performing computations and transformations on that data. 55617 55618 // Create a new model with the specified attributes. A client id (`cid`) 55619 // is automatically generated and assigned for you. 55620 var Model = Backbone.Model = function(attributes, options) { 55621 var defaults; 55622 var attrs = attributes || {}; 55623 options || (options = {}); 55624 this.cid = _.uniqueId('c'); 55625 this.attributes = {}; 55626 _.extend(this, _.pick(options, modelOptions)); 55627 if (options.parse) attrs = this.parse(attrs, options) || {}; 55628 if (defaults = _.result(this, 'defaults')) { 55629 attrs = _.defaults({}, attrs, defaults); 55630 } 55631 this.set(attrs, options); 55632 this.changed = {}; 55633 this.initialize.apply(this, arguments); 55634 }; 55635 55636 // A list of options to be attached directly to the model, if provided. 55637 var modelOptions = ['url', 'urlRoot', 'collection']; 55638 55639 // Attach all inheritable methods to the Model prototype. 55640 _.extend(Model.prototype, Events, { 55641 55642 // A hash of attributes whose current and previous value differ. 55643 changed: null, 55644 55645 // The value returned during the last failed validation. 55646 validationError: null, 55647 55648 // The default name for the JSON `id` attribute is `"id"`. MongoDB and 55649 // CouchDB users may want to set this to `"_id"`. 55650 idAttribute: 'id', 55651 55652 // Initialize is an empty function by default. Override it with your own 55653 // initialization logic. 55654 initialize: function(){}, 55655 55656 // Return a copy of the model's `attributes` object. 55657 toJSON: function(options) { 55658 return _.clone(this.attributes); 55659 }, 55660 55661 // Proxy `Backbone.sync` by default -- but override this if you need 55662 // custom syncing semantics for *this* particular model. 55663 sync: function() { 55664 return Backbone.sync.apply(this, arguments); 55665 }, 55666 55667 // Get the value of an attribute. 55668 get: function(attr) { 55669 return this.attributes[attr]; 55670 }, 55671 55672 // Get the HTML-escaped value of an attribute. 55673 escape: function(attr) { 55674 return _.escape(this.get(attr)); 55675 }, 55676 55677 // Returns `true` if the attribute contains a value that is not null 55678 // or undefined. 55679 has: function(attr) { 55680 return this.get(attr) != null; 55681 }, 55682 55683 // Set a hash of model attributes on the object, firing `"change"`. This is 55684 // the core primitive operation of a model, updating the data and notifying 55685 // anyone who needs to know about the change in state. The heart of the beast. 55686 set: function(key, val, options) { 55687 var attr, attrs, unset, changes, silent, changing, prev, current; 55688 if (key == null) return this; 55689 55690 // Handle both `"key", value` and `{key: value}` -style arguments. 55691 if (typeof key === 'object') { 55692 attrs = key; 55693 options = val; 55694 } else { 55695 (attrs = {})[key] = val; 55696 } 55697
55698 options || (options = {}); 55699 55700 // Run validation. 55701 if (!this._validate(attrs, options)) return false; 55702 55703 // Extract attributes and options. 55704 unset = options.unset; 55705 silent = options.silent; 55706 changes = []; 55707 changing = this._changing; 55708 this._changing = true; 55709 55710 if (!changing) { 55711 this._previousAttributes = _.clone(this.attributes); 55712 this.changed = {}; 55713 } 55714 current = this.attributes, prev = this._previousAttributes; 55715 55716 // Check for changes of `id`. 55717 if (this.idAttribute in attrs) this.id = attrs[this.idAttribute]; 55718 55719 // For each `set` attribute, update or delete the current value. 55720 for (attr in attrs) { 55721 val = attrs[attr]; 55722 if (!_.isEqual(current[attr], val)) changes.push(attr); 55723 if (!_.isEqual(prev[attr], val)) { 55724 this.changed[attr] = val; 55725 } else { 55726 delete this.changed[attr]; 55727 } 55728 unset ? delete current[attr] : current[attr] = val; 55729 } 55730 55731 // Trigger all relevant attribute changes. 55732 if (!silent) { 55733 if (changes.length) this._pending = true; 55734 for (var i = 0, l = changes.length; i < l; i++) { 55735 this.trigger('change:' + changes[i], this, current[changes[i]], options); 55736 } 55737 } 55738 55739 // You might be wondering why there's a `while` loop here. Changes can 55740 // be recursively nested within `"change"` events. 55741 if (changing) return this; 55742 if (!silent) { 55743 while (this._pending) { 55744 this._pending = false; 55745 this.trigger('change', this, options); 55746 } 55747 } 55748 this._pending = false; 55749 this._changing = false; 55750 return this; 55751 }, 55752 55753 // Remove an attribute from the model, firing `"change"`. `unset` is a noop 55754 // if the attribute doesn't exist. 55755 unset: function(attr, options) { 55756 return this.set(attr, void 0, _.extend({}, options, {unset: true})); 55757 }, 55758 55759 // Clear all attributes on the model, firing `"change"`. 55760 clear: function(options) { 55761 var attrs = {}; 55762 for (var key in this.attributes) attrs[key] = void 0; 55763 return this.set(attrs, _.extend({}, options, {unset: true})); 55764 }, 55765 55766 // Determine if the model has changed since the last `"change"` event. 55767 // If you specify an attribute name, determine if that attribute has changed. 55768 hasChanged: function(attr) { 55769 if (attr == null) return !_.isEmpty(this.changed); 55770 return _.has(this.changed, attr); 55771 }, 55772
55773 // Return an object containing all the attributes that have changed, or 55774 // false if there are no changed attributes. Useful for determining what 55775 // parts of a view need to be updated and/or what attributes need to be 55776 // persisted to the server. Unset attributes will be set to undefined. 55777 // You can also pass an attributes object to diff against the model, 55778 // determining if there *would be* a change. 55779 changedAttributes: function(diff) { 55780 if (!diff) return this.hasChanged() ? _.clone(this.changed) : false; 55781 var val, changed = false; 55782 var old = this._changing ? this._previousAttributes : this.attributes; 55783 for (var attr in diff) { 55784 if (_.isEqual(old[attr], (val = diff[attr]))) continue; 55785 (changed || (changed = {}))[attr] = val; 55786 } 55787 return changed; 55788 }, 55789 55790 // Get the previous value of an attribute, recorded at the time the last 55791 // `"change"` event was fired. 55792 previous: function(attr) { 55793 if (attr == null || !this._previousAttributes) return null; 55794 return this._previousAttributes[attr]; 55795 }, 55796 55797 // Get all of the attributes of the model at the time of the previous 55798 // `"change"` event. 55799 previousAttributes: function() { 55800 return _.clone(this._previousAttributes); 55801 }, 55802 55803 // Fetch the model from the server. If the server's representation of the 55804 // model differs from its current attributes, they will be overridden, 55805 // triggering a `"change"` event. 55806 fetch: function(options) { 55807 options = options ? _.clone(options) : {}; 55808 if (options.parse === void 0) options.parse = true; 55809 var model = this; 55810 var success = options.success; 55811 options.success = function(resp) { 55812 if (!model.set(model.parse(resp, options), options)) return false; 55813 if (success) success(model, resp, options); 55814 model.trigger('sync', model, resp, options); 55815 }; 55816 wrapError(this, options); 55817 return this.sync('read', this, options); 55818 }, 55819 55820 // Set a hash of model attributes, and sync the model to the server. 55821 // If the server returns an attributes hash that differs, the model's 55822 // state will be `set` again. 55823 save: function(key, val, options) { 55824 var attrs, method, xhr, attributes = this.attributes; 55825 55826 // Handle both `"key", value` and `{key: value}` -style arguments. 55827 if (key == null || typeof key === 'object') { 55828 attrs = key; 55829 options = val; 55830 } else { 55831 (attrs = {})[key] = val; 55832 } 55833 55834 // If we're not waiting and attributes exist, save acts as `set(attr).save(null, opts)`. 55835 if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false; 55836 55837 options = _.extend({validate: true}, options); 55838 55839 // Do not persist invalid models. 55840 if (!this._validate(attrs, options)) return false; 55841 55842 // Set temporary attributes if `{wait: true}`. 55843 if (attrs && options.wait) { 55844 this.attributes = _.extend({}, attributes, attrs); 55845 } 55846 55847 // After a successful server-side save, the client is (optionally) 55848 // updated with the server-side state. 55849 if (options.parse === void 0) options.parse = true; 55850 var model = this; 55851 var success = options.success; 55852 options.success = function(resp) { 55853 // Ensure attributes are restored during synchronous saves. 55854 model.attributes = attributes; 55855 var serverAttrs = model.parse(resp, options); 55856 if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs); 55857 if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) { 55858 return false; 55859 } 55860 if (success) success(model, resp, options); 55861 model.trigger('sync', model, resp, options); 55862 }; 55863 wrapError(this, options); 55864 55865 method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update'); 55866 if (method === 'patch') options.attrs = attrs; 55867 xhr = this.sync(method, this, options); 55868 55869 // Restore attributes. 55870 if (attrs && options.wait) this.attributes = attributes; 55871 55872 return xhr; 55873 }, 55874 55875 // Destroy this model on the server if it was already persisted. 55876 // Optimistically removes the model from its collection, if it has one. 55877 // If `wait: true` is passed, waits for the server to respond before removal. 55878 destroy: function(options) { 55879 options = options ? _.clone(options) : {}; 55880 var model = this; 55881 var success = options.success; 55882 55883 var destroy = function() { 55884 model.trigger('destroy', model, model.collection, options); 55885 }; 55886 55887 options.success = function(resp) { 55888 if (options.wait || model.isNew()) destroy(); 55889 if (success) success(model, resp, options); 55890 if (!model.isNew()) model.trigger('sync', model, resp, options); 55891 }; 55892 55893 if (this.isNew()) { 55894 options.success(); 55895 return false;
55896 } 55897 wrapError(this, options); 55898 55899 var xhr = this.sync('delete', this, options); 55900 if (!options.wait) destroy(); 55901 return xhr; 55902 }, 55903 55904 // Default URL for the model's representation on the server -- if you're 55905 // using Backbone's restful methods, override this to change the endpoint 55906 // that will be called. 55907 url: function() { 55908 var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError(); 55909 if (this.isNew()) return base; 55910 return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id); 55911 }, 55912 55913 // **parse** converts a response into the hash of attributes to be `set` on 55914 // the model. The default implementation is just to pass the response along. 55915 parse: function(resp, options) { 55916 return resp; 55917 }, 55918 55919 // Create a new model with identical attributes to this one. 55920 clone: function() { 55921 return new this.constructor(this.attributes); 55922 }, 55923 55924 // A model is new if it has never been saved to the server, and lacks an id. 55925 isNew: function() { 55926 return this.id == null; 55927 }, 55928 55929 // Check if the model is currently in a valid state. 55930 isValid: function(options) { 55931 return this._validate({}, _.extend(options || {}, { validate: true })); 55932 }, 55933 55934 // Run validation against the next complete set of model attributes, 55935 // returning `true` if all is well. Otherwise, fire an `"invalid"` event. 55936 _validate: function(attrs, options) { 55937 if (!options.validate || !this.validate) return true; 55938 attrs = _.extend({}, this.attributes, attrs); 55939 var error = this.validationError = this.validate(attrs, options) || null; 55940 if (!error) return true; 55941 this.trigger('invalid', this, error, _.extend(options || {}, {validationError: error})); 55942 return false; 55943 } 55944 55945 }); 55946 55947 // Underscore methods that we want to implement on the Model. 55948 var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit']; 55949 55950 // Mix in each Underscore method as a proxy to `Model#attributes`. 55951 _.each(modelMethods, function(method) { 55952 Model.prototype[method] = function() { 55953 var args = slice.call(arguments); 55954 args.unshift(this.attributes); 55955 return _[method].apply(_, args); 55956 }; 55957 }); 55958 55959 // Backbone.Collection 55960 // ------------------- 55961 55962 // If models tend to represent a single row of data, a Backbone Collection is 55963 // more analagous to a table full of data ... or a small slice or page of that 55964 // table, or a collection of rows that belong together for a particular reason 55965 // -- all of the messages in this particular folder, all of the documents
55966 // belonging to this particular author, and so on. Collections maintain 55967 // indexes of their models, both in order, and for lookup by `id`. 55968 55969 // Create a new **Collection**, perhaps to contain a specific type of `model`. 55970 // If a `comparator` is specified, the Collection will maintain 55971 // its models in sort order, as they're added and removed. 55972 var Collection = Backbone.Collection = function(models, options) { 55973 options || (options = {}); 55974 if (options.url) this.url = options.url; 55975 if (options.model) this.model = options.model; 55976 if (options.comparator !== void 0) this.comparator = options.comparator; 55977 this._reset(); 55978 this.initialize.apply(this, arguments); 55979 if (models) this.reset(models, _.extend({silent: true}, options)); 55980 }; 55981 55982 // Default options for `Collection#set`. 55983 var setOptions = {add: true, remove: true, merge: true}; 55984 var addOptions = {add: true, merge: false, remove: false}; 55985 55986 // Define the Collection's inheritable methods. 55987 _.extend(Collection.prototype, Events, { 55988 55989 // The default model for a collection is just a **Backbone.Model**. 55990 // This should be overridden in most cases. 55991 model: Model, 55992 55993 // Initialize is an empty function by default. Override it with your own 55994 // initialization logic. 55995 initialize: function(){}, 55996 55997 // The JSON representation of a Collection is an array of the 55998 // models' attributes. 55999 toJSON: function(options) { 56000 return this.map(function(model){ return model.toJSON(options); }); 56001 }, 56002 56003 // Proxy `Backbone.sync` by default. 56004 sync: function() { 56005 return Backbone.sync.apply(this, arguments); 56006 }, 56007 56008 // Add a model, or list of models to the set. 56009 add: function(models, options) { 56010 return this.set(models, _.defaults(options || {}, addOptions)); 56011 }, 56012 56013 // Remove a model, or a list of models from the set. 56014 remove: function(models, options) { 56015 models = _.isArray(models) ? models.slice() : [models]; 56016 options || (options = {}); 56017 var i, l, index, model; 56018 for (i = 0, l = models.length; i < l; i++) { 56019 model = this.get(models[i]); 56020 if (!model) continue; 56021 delete this._byId[model.id]; 56022 delete this._byId[model.cid]; 56023 index = this.indexOf(model); 56024 this.models.splice(index, 1); 56025 this.length--; 56026 if (!options.silent) { 56027 options.index = index; 56028 model.trigger('remove', model, this, options); 56029 } 56030 this._removeReference(model); 56031 } 56032 return this; 56033 }, 56034 56035 // Update a collection by `set`-ing a new list of models, adding new ones, 56036 // removing models that are no longer present, and merging models that 56037 // already exist in the collection, as necessary. Similar to **Model#set**, 56038 // the core operation for updating the data contained by the collection. 56039 set: function(models, options) { 56040 options = _.defaults(options || {}, setOptions); 56041 if (options.parse) models = this.parse(models, options); 56042 if (!_.isArray(models)) models = models ? [models] : []; 56043 var i, l, model, attrs, existing, sort; 56044 var at = options.at; 56045 var sortable = this.comparator && (at == null) && options.sort !== false; 56046 var sortAttr = _.isString(this.comparator) ? this.comparator : null; 56047 var toAdd = [], toRemove = [], modelMap = {}; 56048 56049 // Turn bare objects into model references, and prevent invalid models 56050 // from being added. 56051 for (i = 0, l = models.length; i < l; i++) { 56052 if (!(model = this._prepareModel(models[i], options))) continue; 56053 56054 // If a duplicate is found, prevent it from being added and 56055 // optionally merge it into the existing model. 56056 if (existing = this.get(model)) { 56057 if (options.remove) modelMap[existing.cid] = true; 56058 if (options.merge) { 56059 existing.set(model.attributes, options); 56060 if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true; 56061 } 56062 56063 // This is a new model, push it to the `toAdd` list. 56064 } else if (options.add) { 56065 toAdd.push(model); 56066 56067 // Listen to added models' events, and index models for lookup by 56068 // `id` and by `cid`. 56069 model.on('all', this._onModelEvent, this); 56070 this._byId[model.cid] = model; 56071 if (model.id != null) this._byId[model.id] = model; 56072 } 56073 } 56074 56075 // Remove nonexistent models if appropriate. 56076 if (options.remove) { 56077 for (i = 0, l = this.length; i < l; ++i) { 56078 if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model); 56079 } 56080 if (toRemove.length) this.remove(toRemove, options); 56081 } 56082 56083 // See if sorting is needed, update `length` and splice in new models. 56084 if (toAdd.length) { 56085 if (sortable) sort = true; 56086 this.length += toAdd.length; 56087 if (at != null) {
56088 splice.apply(this.models, [at, 0].concat(toAdd)); 56089 } else { 56090 push.apply(this.models, toAdd); 56091 } 56092 } 56093 56094 // Silently sort the collection if appropriate. 56095 if (sort) this.sort({silent: true}); 56096 56097 if (options.silent) return this; 56098 56099 // Trigger `add` events. 56100 for (i = 0, l = toAdd.length; i < l; i++) { 56101 (model = toAdd[i]).trigger('add', model, this, options); 56102 } 56103 56104 // Trigger `sort` if the collection was sorted. 56105 if (sort) this.trigger('sort', this, options); 56106 return this; 56107 }, 56108 56109 // When you have more items than you want to add or remove individually, 56110 // you can reset the entire set with a new list of models, without firing 56111 // any granular `add` or `remove` events. Fires `reset` when finished. 56112 // Useful for bulk operations and optimizations. 56113 reset: function(models, options) { 56114 options || (options = {}); 56115 for (var i = 0, l = this.models.length; i < l; i++) { 56116 this._removeReference(this.models[i]); 56117 } 56118 options.previousModels = this.models; 56119 this._reset(); 56120 this.add(models, _.extend({silent: true}, options)); 56121 if (!options.silent) this.trigger('reset', this, options); 56122 return this; 56123 }, 56124 56125 // Add a model to the end of the collection. 56126 push: function(model, options) { 56127 model = this._prepareModel(model, options); 56128 this.add(model, _.extend({at: this.length}, options)); 56129 return model; 56130 }, 56131 56132 // Remove a model from the end of the collection. 56133 pop: function(options) { 56134 var model = this.at(this.length - 1); 56135 this.remove(model, options); 56136 return model; 56137 }, 56138 56139 // Add a model to the beginning of the collection. 56140 unshift: function(model, options) { 56141 model = this._prepareModel(model, options); 56142 this.add(model, _.extend({at: 0}, options)); 56143 return model; 56144 }, 56145 56146 // Remove a model from the beginning of the collection. 56147 shift: function(options) { 56148 var model = this.at(0); 56149 this.remove(model, options); 56150 return model; 56151 }, 56152 56153 // Slice out a sub-array of models from the collection. 56154 slice: function(begin, end) { 56155 return this.models.slice(begin, end); 56156 }, 56157 56158 // Get a model from the set by id. 56159 get: function(obj) { 56160 if (obj == null) return void 0; 56161 return this._byId[obj.id != null ? obj.id : obj.cid || obj]; 56162 }, 56163 56164 // Get the model at the given index. 56165 at: function(index) { 56166 return this.models[index]; 56167 }, 56168 56169 // Return models with matching attributes. Useful for simple cases of 56170 // `filter`. 56171 where: function(attrs, first) { 56172 if (_.isEmpty(attrs)) return first ? void 0 : []; 56173 return this[first ? 'find' : 'filter'](function(model) { 56174 for (var key in attrs) { 56175 if (attrs[key] !== model.get(key)) return false; 56176 } 56177 return true; 56178 }); 56179 }, 56180 56181 // Return the first model with matching attributes. Useful for simple cases 56182 // of `find`. 56183 findWhere: function(attrs) { 56184 return this.where(attrs, true); 56185 }, 56186 56187 // Force the collection to re-sort itself. You don't need to call this under 56188 // normal circumstances, as the set will maintain sort order as each item 56189 // is added. 56190 sort: function(options) { 56191 if (!this.comparator) throw new Error('Cannot sort a set without a comparator'); 56192 options || (options = {}); 56193 56194 // Run sort based on type of `comparator`. 56195 if (_.isString(this.comparator) || this.comparator.length === 1) { 56196 this.models = this.sortBy(this.comparator, this); 56197 } else { 56198 this.models.sort(_.bind(this.comparator, this)); 56199 } 56200 56201 if (!options.silent) this.trigger('sort', this, options); 56202 return this; 56203 }, 56204 56205 // Figure out the smallest index at which a model should be inserted so as 56206 // to maintain order. 56207 sortedIndex: function(model, value, context) { 56208 value || (value = this.comparator); 56209 var iterator = _.isFunction(value) ? value : function(model) { 56210 return model.get(value); 56211 }; 56212 return _.sortedIndex(this.models, model, iterator, context); 56213 }, 56214 56215 // Pluck an attribute from each model in the collection. 56216 pluck: function(attr) { 56217 return _.invoke(this.models, 'get', attr); 56218 }, 56219 56220 // Fetch the default set of models for this collection, resetting the 56221 // collection when they arrive. If `reset: true` is passed, the response 56222 // data will be passed through the `reset` method instead of `set`. 56223 fetch: function(options) { 56224 options = options ? _.clone(options) : {}; 56225 if (options.parse === void 0) options.parse = true; 56226 var success = options.success; 56227 var collection = this; 56228 options.success = function(resp) { 56229 var method = options.reset ? 'reset' : 'set'; 56230 collection[method](resp, options); 56231 if (success) success(collection, resp, options); 56232 collection.trigger('sync', collection, resp, options); 56233 }; 56234 wrapError(this, options); 56235 return this.sync('read', this, options); 56236 }, 56237 56238 // Create a new instance of a model in this collection. Add the model to the 56239 // collection immediately, unless `wait: true` is passed, in which case we 56240 // wait for the server to agree. 56241 create: function(model, options) { 56242 options = options ? _.clone(options) : {}; 56243 if (!(model = this._prepareModel(model, options))) return false;
56244 if (!options.wait) this.add(model, options); 56245 var collection = this; 56246 var success = options.success; 56247 options.success = function(resp) { 56248 if (options.wait) collection.add(model, options); 56249 if (success) success(model, resp, options); 56250 }; 56251 model.save(null, options); 56252 return model; 56253 }, 56254 56255 // **parse** converts a response into a list of models to be added to the 56256 // collection. The default implementation is just to pass it through. 56257 parse: function(resp, options) { 56258 return resp; 56259 }, 56260 56261 // Create a new collection with an identical list of models as this one. 56262 clone: function() { 56263 return new this.constructor(this.models); 56264 }, 56265 56266 // Private method to reset all internal state. Called when the collection 56267 // is first initialized or reset. 56268 _reset: function() { 56269 this.length = 0; 56270 this.models = []; 56271 this._byId = {}; 56272 }, 56273 56274 // Prepare a hash of attributes (or other model) to be added to this 56275 // collection. 56276 _prepareModel: function(attrs, options) { 56277 if (attrs instanceof Model) { 56278 if (!attrs.collection) attrs.collection = this; 56279 return attrs; 56280 } 56281 options || (options = {}); 56282 options.collection = this; 56283 var model = new this.model(attrs, options); 56284 if (!model._validate(attrs, options)) { 56285 this.trigger('invalid', this, attrs, options); 56286 return false; 56287 } 56288 return model; 56289 }, 56290 56291 // Internal method to sever a model's ties to a collection. 56292 _removeReference: function(model) { 56293 if (this === model.collection) delete model.collection; 56294 model.off('all', this._onModelEvent, this); 56295 }, 56296 56297 // Internal method called every time a model in the set fires an event. 56298 // Sets need to update their indexes when models change ids. All other 56299 // events simply proxy through. "add" and "remove" events that originate 56300 // in other collections are ignored. 56301 _onModelEvent: function(event, model, collection, options) { 56302 if ((event === 'add' || event === 'remove') && collection !== this) return; 56303 if (event === 'destroy') this.remove(model, options); 56304 if (model && event === 'change:' + model.idAttribute) { 56305 delete this._byId[model.previous(model.idAttribute)]; 56306 if (model.id != null) this._byId[model.id] = model; 56307 } 56308 this.trigger.apply(this, arguments); 56309 } 56310 56311 }); 56312 56313 // Underscore methods that we want to implement on the Collection. 56314 // 90% of the core usefulness of Backbone Collections is actually implemented 56315 // right here: 56316 var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl', 56317 'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select', 56318 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke', 56319 'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest', 56320 'tail', 'drop', 'last', 'without', 'indexOf', 'shuffle', 'lastIndexOf', 56321 'isEmpty', 'chain']; 56322 56323 // Mix in each Underscore method as a proxy to `Collection#models`. 56324 _.each(methods, function(method) { 56325 Collection.prototype[method] = function() { 56326 var args = slice.call(arguments); 56327 args.unshift(this.models); 56328 return _[method].apply(_, args); 56329 }; 56330 }); 56331 56332 // Underscore methods that take a property name as an argument. 56333 var attributeMethods = ['groupBy', 'countBy', 'sortBy']; 56334 56335 // Use attributes instead of properties. 56336 _.each(attributeMethods, function(method) { 56337 Collection.prototype[method] = function(value, context) { 56338 var iterator = _.isFunction(value) ? value : function(model) { 56339 return model.get(value); 56340 }; 56341 return _[method](this.models, iterator, context); 56342 }; 56343 }); 56344 56345 // Backbone.View 56346 // ------------- 56347 56348 // Backbone Views are almost more convention than they are actual code. A View 56349 // is simply a JavaScript object that represents a logical chunk of UI in the 56350 // DOM. This might be a single item, an entire list, a sidebar or panel, or 56351 // even the surrounding frame which wraps your whole app. Defining a chunk of 56352 // UI as a **View** allows you to define your DOM events declaratively, without 56353 // having to worry about render order ... and makes it easy for the view to 56354 // react to specific changes in the state of your models. 56355 56356 // Creating a Backbone.View creates its initial element outside of the DOM,
56357 // if an existing element is not provided... 56358 var View = Backbone.View = function(options) { 56359 this.cid = _.uniqueId('view'); 56360 this._configure(options || {}); 56361 this._ensureElement(); 56362 this.initialize.apply(this, arguments); 56363 this.delegateEvents(); 56364 }; 56365 56366 // Cached regex to split keys for `delegate`. 56367 var delegateEventSplitter = /^(\S+)\s*(.*)$/; 56368 56369 // List of view options to be merged as properties. 56370 var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events']; 56371 56372 // Set up all inheritable **Backbone.View** properties and methods. 56373 _.extend(View.prototype, Events, { 56374 56375 // The default `tagName` of a View's element is `"div"`. 56376 tagName: 'div', 56377 56378 // jQuery delegate for element lookup, scoped to DOM elements within the 56379 // current view. This should be prefered to global lookups where possible. 56380 $: function(selector) { 56381 return this.$el.find(selector); 56382 }, 56383 56384 // Initialize is an empty function by default. Override it with your own 56385 // initialization logic. 56386 initialize: function(){}, 56387 56388 // **render** is the core function that your view should override, in order 56389 // to populate its element (`this.el`), with the appropriate HTML. The 56390 // convention is for **render** to always return `this`. 56391 render: function() { 56392 return this; 56393 }, 56394 56395 // Remove this view by taking the element out of the DOM, and removing any 56396 // applicable Backbone.Events listeners. 56397 remove: function() { 56398 this.$el.remove(); 56399 this.stopListening(); 56400 return this; 56401 }, 56402 56403 // Change the view's element (`this.el` property), including event 56404 // re-delegation. 56405 setElement: function(element, delegate) { 56406 if (this.$el) this.undelegateEvents(); 56407 this.$el = element instanceof Backbone.$ ? element : Backbone.$(element); 56408 this.el = this.$el[0]; 56409 if (delegate !== false) this.delegateEvents(); 56410 return this; 56411 }, 56412 56413 // Set callbacks, where `this.events` is a hash of 56414 // 56415 // *{"event selector": "callback"}* 56416 // 56417 // { 56418 // 'mousedown .title': 'edit', 56419 // 'click .button': 'save' 56420 // 'click .open': function(e) { ... } 56421 // } 56422 // 56423 // pairs. Callbacks will be bound to the view, with `this` set properly. 56424 // Uses event delegation for efficiency. 56425 // Omitting the selector binds the event to `this.el`. 56426 // This only works for delegate-able events: not `focus`, `blur`, and 56427 // not `change`, `submit`, and `reset` in Internet Explorer. 56428 delegateEvents: function(events) { 56429 if (!(events || (events = _.result(this, 'events')))) return this; 56430 this.undelegateEvents(); 56431 for (var key in events) { 56432 var method = events[key]; 56433 if (!_.isFunction(method)) method = this[events[key]]; 56434 if (!method) continue; 56435 56436 var match = key.match(delegateEventSplitter); 56437 var eventName = match[1], selector = match[2]; 56438 method = _.bind(method, this); 56439 eventName += '.delegateEvents' + this.cid; 56440 if (selector === '') { 56441 this.$el.on(eventName, method); 56442 } else { 56443 this.$el.on(eventName, selector, method); 56444 } 56445 } 56446 return this; 56447 }, 56448 56449 // Clears all callbacks previously bound to the view with `delegateEvents`. 56450 // You usually don't need to use this, but may wish to if you have multiple 56451 // Backbone views attached to the same DOM element. 56452 undelegateEvents: function() { 56453 this.$el.off('.delegateEvents' + this.cid); 56454 return this; 56455 }, 56456 56457 // Performs the initial configuration of a View with a set of options. 56458 // Keys with special meaning *(e.g. model, collection, id, className)* are 56459 // attached directly to the view. See `viewOptions` for an exhaustive 56460 // list. 56461 _configure: function(options) { 56462 if (this.options) options = _.extend({}, _.result(this, 'options'), options); 56463 _.extend(this, _.pick(options, viewOptions)); 56464 this.options = options; 56465 }, 56466 56467 // Ensure that the View has a DOM element to render into. 56468 // If `this.el` is a string, pass it through `$()`, take the first 56469 // matching element, and re-assign it to `el`. Otherwise, create 56470 // an element from the `id`, `className` and `tagName` properties. 56471 _ensureElement: function() { 56472 if (!this.el) { 56473 var attrs = _.extend({}, _.result(this, 'attributes'));
56474 if (this.id) attrs.id = _.result(this, 'id'); 56475 if (this.className) attrs['class'] = _.result(this, 'className'); 56476 var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs); 56477 this.setElement($el, false); 56478 } else { 56479 this.setElement(_.result(this, 'el'), false); 56480 } 56481 } 56482 56483 }); 56484 56485 // Backbone.sync 56486 // ------------- 56487 56488 // Override this function to change the manner in which Backbone persists 56489 // models to the server. You will be passed the type of request, and the 56490 // model in question. By default, makes a RESTful Ajax request 56491 // to the model's `url()`. Some possible customizations could be: 56492 // 56493 // * Use `setTimeout` to batch rapid-fire updates into a single request. 56494 // * Send up the models as XML instead of JSON. 56495 // * Persist models via WebSockets instead of Ajax. 56496 // 56497 // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests 56498 // as `POST`, with a `_method` parameter containing the true HTTP method, 56499 // as well as all requests with the body as `application/x-www-form-urlencoded` 56500 // instead of `application/json` with the model in a param named `model`. 56501 // Useful when interfacing with server-side languages like **PHP** that make 56502 // it difficult to read the body of `PUT` requests. 56503 Backbone.sync = function(method, model, options) { 56504 var type = methodMap[method]; 56505 56506 // Default options, unless specified. 56507 _.defaults(options || (options = {}), { 56508 emulateHTTP: Backbone.emulateHTTP, 56509 emulateJSON: Backbone.emulateJSON 56510 }); 56511 56512 // Default JSON-request options. 56513 var params = {type: type, dataType: 'json'}; 56514 56515 // Ensure that we have a URL. 56516 if (!options.url) { 56517 params.url = _.result(model, 'url') || urlError(); 56518 } 56519 56520 // Ensure that we have the appropriate request data. 56521 if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) { 56522 params.contentType = 'application/json'; 56523 params.data = JSON.stringify(options.attrs || model.toJSON(options)); 56524 } 56525 56526 // For older servers, emulate JSON by encoding the request into an HTML-form. 56527 if (options.emulateJSON) { 56528 params.contentType = 'application/x-www-form-urlencoded'; 56529 params.data = params.data ? {model: params.data} : {}; 56530 } 56531 56532 // For older servers, emulate HTTP by mimicking the HTTP method with `_method` 56533 // And an `X-HTTP-Method-Override` header. 56534 if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) { 56535 params.type = 'POST'; 56536 if (options.emulateJSON) params.data._method = type; 56537 var beforeSend = options.beforeSend; 56538 options.beforeSend = function(xhr) { 56539 xhr.setRequestHeader('X-HTTP-Method-Override', type); 56540 if (beforeSend) return beforeSend.apply(this, arguments); 56541 }; 56542 } 56543 56544 // Don't process data on a non-GET request. 56545 if (params.type !== 'GET' && !options.emulateJSON) { 56546 params.processData = false; 56547 } 56548 56549 // If we're sending a `PATCH` request, and we're in an old Internet Explorer 56550 // that still has ActiveX enabled by default, override jQuery to use that 56551 // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8. 56552 if (params.type === 'PATCH' && window.ActiveXObject && 56553 !(window.external && window.external.msActiveXFilteringEnabled)) { 56554 params.xhr = function() { 56555 return new ActiveXObject("Microsoft.XMLHTTP"); 56556 }; 56557 } 56558 56559 // Make the request, allowing the user to override any Ajax options. 56560 var xhr = options.xhr = Backbone.ajax(_.extend(params, options)); 56561 model.trigger('request', model, xhr, options); 56562 return xhr; 56563 }; 56564 56565 // Map from CRUD to HTTP for our default `Backbone.sync` implementation. 56566 var methodMap = { 56567 'create': 'POST', 56568 'update': 'PUT', 56569 'patch': 'PATCH', 56570 'delete': 'DELETE', 56571 'read': 'GET' 56572 }; 56573 56574 // Set the default implementation of `Backbone.ajax` to proxy through to `$`. 56575 // Override this if you'd like to use a different library. 56576 Backbone.ajax = function() { 56577 return Backbone.$.ajax.apply(Backbone.$, arguments); 56578 }; 56579 56580 // Backbone.Router 56581 // --------------- 56582 56583 // Routers map faux-URLs to actions, and fire events when routes are 56584 // matched. Creating a new one sets its `routes` hash, if not set statically. 56585 var Router = Backbone.Router = function(options) {
vendor: 4,260 bytes, lines 56586-56704
56586 options || (options = {}); 56587 if (options.routes) this.routes = options.routes; 56588 this._bindRoutes(); 56589 this.initialize.apply(this, arguments); 56590 }; 56591 56592 // Cached regular expressions for matching named param parts and splatted 56593 // parts of route strings. 56594 var optionalParam = /\((.*?)\)/g; 56595 var namedParam = /(\(\?)?:\w+/g; 56596 var splatParam = /\*\w+/g; 56597 var escapeRegExp = /[\-{}\[\]+?.,\\\^$|#\s]/g; 56598 56599 // Set up all inheritable **Backbone.Router** properties and methods. 56600 _.extend(Router.prototype, Events, { 56601 56602 // Initialize is an empty function by default. Override it with your own 56603 // initialization logic. 56604 initialize: function(){}, 56605 56606 // Manually bind a single named route to a callback. For example: 56607 // 56608 // this.route('search/:query/p:num', 'search', function(query, num) { 56609 // ... 56610 // }); 56611 // 56612 route: function(route, name, callback) { 56613 if (!_.isRegExp(route)) route = this._routeToRegExp(route); 56614 if (_.isFunction(name)) { 56615 callback = name; 56616 name = ''; 56617 } 56618 if (!callback) callback = this[name]; 56619 var router = this; 56620 Backbone.history.route(route, function(fragment) { 56621 var args = router._extractParameters(route, fragment); 56622 callback && callback.apply(router, args); 56623 router.trigger.apply(router, ['route:' + name].concat(args)); 56624 router.trigger('route', name, args); 56625 Backbone.history.trigger('route', router, name, args); 56626 }); 56627 return this; 56628 }, 56629 56630 // Simple proxy to `Backbone.history` to save a fragment into the history. 56631 navigate: function(fragment, options) { 56632 Backbone.history.navigate(fragment, options); 56633 return this; 56634 }, 56635 56636 // Bind all defined routes to `Backbone.history`. We have to reverse the 56637 // order of the routes here to support behavior where the most general 56638 // routes can be defined at the bottom of the route map. 56639 _bindRoutes: function() { 56640 if (!this.routes) return; 56641 this.routes = _.result(this, 'routes'); 56642 var route, routes = _.keys(this.routes); 56643 while ((route = routes.pop()) != null) { 56644 this.route(route, this.routes[route]); 56645 } 56646 }, 56647 56648 // Convert a route string into a regular expression, suitable for matching 56649 // against the current location hash. 56650 _routeToRegExp: function(route) { 56651 route = route.replace(escapeRegExp, '\\$&') 56652 .replace(optionalParam, '(?:$1)?') 56653 .replace(namedParam, function(match, optional){ 56654 return optional ? match : '([^\/]+)'; 56655 }) 56656 .replace(splatParam, '(.*?)'); 56657 return new RegExp('^' + route + '$'); 56658 }, 56659 56660 // Given a route, and a URL fragment that it matches, return the array of 56661 // extracted decoded parameters. Empty or unmatched parameters will be 56662 // treated as `null` to normalize cross-browser behavior. 56663 _extractParameters: function(route, fragment) { 56664 var params = route.exec(fragment).slice(1); 56665 return _.map(params, function(param) { 56666 return param ? decodeURIComponent(param) : null; 56667 }); 56668 } 56669 56670 }); 56671 56672 // Backbone.History 56673 // ---------------- 56674 56675 // Handles cross-browser history management, based on either 56676 // [pushState](http://diveintohtml5.info/history.html) and real URLs, or 56677 // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange) 56678 // and URL fragments. If the browser supports neither (old IE, natch), 56679 // falls back to polling. 56680 var History = Backbone.History = function() { 56681 this.handlers = []; 56682 _.bindAll(this, 'checkUrl'); 56683 56684 // Ensure that `History` can be used outside of the browser. 56685 if (typeof window !== 'undefined') { 56686 this.location = window.location; 56687 this.history = window.history; 56688 } 56689 }; 56690 56691 // Cached regex for stripping a leading hash/slash and trailing space. 56692 var routeStripper = /^[#\/]|\s+$/g; 56693 56694 // Cached regex for stripping leading and trailing slashes. 56695 var rootStripper = /^\/+|\/+$/g; 56696 56697 // Cached regex for detecting MSIE. 56698 var isExplorer = /msie [\w.]+/; 56699 56700 // Cached regex for removing a trailing slash. 56701 var trailingSlash = /\/$/; 56702 56703 // Has the history handling already been started? 56704 History.started = false;
56705 56706 // Set up all inheritable **Backbone.History** properties and methods. 56707 _.extend(History.prototype, Events, { 56708 56709 // The default interval to poll for hash changes, if necessary, is 56710 // twenty times a second. 56711 interval: 50, 56712 56713 // Gets the true hash value. Cannot use location.hash directly due to bug 56714 // in Firefox where location.hash will always be decoded. 56715 getHash: function(window) { 56716 var match = (window || this).location.href.match(/#(.*)$/); 56717 return match ? match[1] : ''; 56718 }, 56719 56720 // Get the cross-browser normalized URL fragment, either from the URL, 56721 // the hash, or the override. 56722 getFragment: function(fragment, forcePushState) { 56723 if (fragment == null) { 56724 if (this._hasPushState || !this._wantsHashChange || forcePushState) { 56725 fragment = this.location.pathname; 56726 var root = this.root.replace(trailingSlash, ''); 56727 if (!fragment.indexOf(root)) fragment = fragment.substr(root.length); 56728 } else { 56729 fragment = this.getHash(); 56730 } 56731 } 56732 return fragment.replace(routeStripper, ''); 56733 }, 56734 56735 // Start the hash change handling, returning `true` if the current URL matches 56736 // an existing route, and `false` otherwise. 56737 start: function(options) { 56738 if (History.started) throw new Error("Backbone.history has already been started"); 56739 History.started = true; 56740 56741 // Figure out the initial configuration. Do we need an iframe? 56742 // Is pushState desired ... is it available? 56743 this.options = _.extend({}, {root: '/'}, this.options, options); 56744 this.root = this.options.root; 56745 this._wantsHashChange = this.options.hashChange !== false; 56746 this._wantsPushState = !!this.options.pushState; 56747 this._hasPushState = !!(this.options.pushState && this.history && this.history.pushState); 56748 var fragment = this.getFragment(); 56749 var docMode = document.documentMode; 56750 var oldIE = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7)); 56751 56752 // Normalize root to always include a leading and trailing slash. 56753 this.root = ('/' + this.root + '/').replace(rootStripper, '/'); 56754 56755 if (oldIE && this._wantsHashChange) { 56756 this.iframe = Backbone.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow; 56757 this.navigate(fragment); 56758 } 56759 56760 // Depending on whether we're using pushState or hashes, and whether 56761 // 'onhashchange' is supported, determine how we check the URL state. 56762 if (this._hasPushState) { 56763 Backbone.$(window).on('popstate', this.checkUrl); 56764 } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) { 56765 Backbone.$(window).on('hashchange', this.checkUrl); 56766 } else if (this._wantsHashChange) { 56767 this._checkUrlInterval = setInterval(this.checkUrl, this.interval); 56768 } 56769 56770 // Determine if we need to change the base url, for a pushState link 56771 // opened by a non-pushState browser. 56772 this.fragment = fragment; 56773 var loc = this.location; 56774 var atRoot = loc.pathname.replace(/[^\/]$/, '$&/') === this.root; 56775 56776 // If we've started off with a route from a `pushState`-enabled browser, 56777 // but we're currently in a browser that doesn't support it... 56778 if (this._wantsHashChange && this._wantsPushState && !this._hasPushState && !atRoot) { 56779 this.fragment = this.getFragment(null, true); 56780 this.location.replace(this.root + this.location.search + '#' + this.fragment); 56781 // Return immediately as browser will do redirect to new url 56782 return true; 56783 56784 // Or if we've started out with a hash-based route, but we're currently 56785 // in a browser where it could be `pushState`-based instead... 56786 } else if (this._wantsPushState && this._hasPushState && atRoot && loc.hash) { 56787 this.fragment = this.getHash().replace(routeStripper, ''); 56788 this.history.replaceState({}, document.title, this.root + this.fragment + loc.search); 56789 } 56790 56791 if (!this.options.silent) return this.loadUrl(); 56792 }, 56793 56794 // Disable Backbone.history, perhaps temporarily. Not useful in a real app, 56795 // but possibly useful for unit testing Routers. 56796 stop: function() { 56797 Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl); 56798 clearInterval(this._checkUrlInterval); 56799 History.started = false;
56800 }, 56801 56802 // Add a route to be tested when the fragment changes. Routes added later 56803 // may override previous routes. 56804 route: function(route, callback) { 56805 this.handlers.unshift({route: route, callback: callback}); 56806 }, 56807 56808 // Checks the current URL to see if it has changed, and if it has, 56809 // calls `loadUrl`, normalizing across the hidden iframe. 56810 checkUrl: function(e) { 56811 var current = this.getFragment(); 56812 if (current === this.fragment && this.iframe) { 56813 current = this.getFragment(this.getHash(this.iframe)); 56814 } 56815 if (current === this.fragment) return false; 56816 if (this.iframe) this.navigate(current); 56817 this.loadUrl() || this.loadUrl(this.getHash()); 56818 }, 56819 56820 // Attempt to load the current URL fragment. If a route succeeds with a 56821 // match, returns `true`. If no defined routes matches the fragment, 56822 // returns `false`. 56823 loadUrl: function(fragmentOverride) { 56824 var fragment = this.fragment = this.getFragment(fragmentOverride); 56825 var matched = _.any(this.handlers, function(handler) { 56826 if (handler.route.test(fragment)) { 56827 handler.callback(fragment); 56828 return true; 56829 } 56830 }); 56831 return matched; 56832 }, 56833 56834 // Save a fragment into the hash history, or replace the URL state if the 56835 // 'replace' option is passed. You are responsible for properly URL-encoding 56836 // the fragment in advance. 56837 // 56838 // The options object can contain `trigger: true` if you wish to have the 56839 // route callback be fired (not usually desirable), or `replace: true`, if 56840 // you wish to modify the current URL without adding an entry to the history. 56841 navigate: function(fragment, options) { 56842 if (!History.started) return false; 56843 if (!options || options === true) options = {trigger: options}; 56844 fragment = this.getFragment(fragment || ''); 56845 if (this.fragment === fragment) return; 56846 this.fragment = fragment; 56847 var url = this.root + fragment; 56848 56849 // If pushState is available, we use it to set the fragment as a real URL. 56850 if (this._hasPushState) { 56851 this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url); 56852 56853 // If hash changes haven't been explicitly disabled, update the hash 56854 // fragment to store history. 56855 } else if (this._wantsHashChange) { 56856 this._updateHash(this.location, fragment, options.replace); 56857 if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) { 56858 // Opening and closing the iframe tricks IE7 and earlier to push a 56859 // history entry on hash-tag change. When replace is true, we don't 56860 // want this. 56861 if(!options.replace) this.iframe.document.open().close(); 56862 this._updateHash(this.iframe.location, fragment, options.replace); 56863 } 56864 56865 // If you've told us that you explicitly don't want fallback hashchange- 56866 // based history, then `navigate` becomes a page refresh. 56867 } else { 56868 return this.location.assign(url); 56869 } 56870 if (options.trigger) this.loadUrl(fragment); 56871 }, 56872 56873 // Update the hash location, either replacing the current entry, or adding 56874 // a new one to the browser history. 56875 _updateHash: function(location, fragment, replace) { 56876 if (replace) { 56877 var href = location.href.replace(/(javascript:|#).*$/, ''); 56878 location.replace(href + '#' + fragment); 56879 } else { 56880 // Some browsers require that `hash` contains a leading #. 56881 location.hash = '#' + fragment; 56882 } 56883 } 56884 56885 }); 56886 56887 // Create the default Backbone.history. 56888 Backbone.history = new History; 56889 56890 // Helpers 56891 // ------- 56892 56893 // Helper function to correctly set up the prototype chain, for subclasses. 56894 // Similar to `goog.inherits`, but uses a hash of prototype properties and 56895 // class properties to be extended. 56896 var extend = function(protoProps, staticProps) { 56897 var parent = this; 56898 var child; 56899 56900 // The constructor function for the new subclass is either defined by you 56901 // (the "constructor" property in your `extend` definition), or defaulted 56902 // by us to simply call the parent's constructor. 56903 if (protoProps && _.has(protoProps, 'constructor')) { 56904 child = protoProps.constructor; 56905 } else { 56906 child = function(){ return parent.apply(this, arguments); }; 56907 } 56908 56909 // Add static properties to the constructor function, if supplied.
56910 _.extend(child, parent, staticProps); 56911 56912 // Set the prototype chain to inherit from `parent`, without calling 56913 // `parent`'s constructor function. 56914 var Surrogate = function(){ this.constructor = child; }; 56915 Surrogate.prototype = parent.prototype; 56916 child.prototype = new Surrogate; 56917 56918 // Add prototype properties (instance properties) to the subclass, 56919 // if supplied. 56920 if (protoProps) _.extend(child.prototype, protoProps); 56921 56922 // Set a convenience property in case the parent's prototype is needed 56923 // later. 56924 child.__super__ = parent.prototype; 56925 56926 return child; 56927 }; 56928 56929 // Set up inheritance for the model, collection, router, view and history. 56930 Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend; 56931 56932 // Throw an error when a URL is needed, and none is supplied. 56933 var urlError = function() { 56934 throw new Error('A "url" property or function must be specified'); 56935 }; 56936 56937 // Wrap an optional error callback with a fallback error event. 56938 var wrapError = function (model, options) { 56939 var error = options.error; 56940 options.error = function(resp) { 56941 if (error) error(model, resp, options); 56942 model.trigger('error', model, resp, options); 56943 }; 56944 }; 56945 56946}).call(this); 56947 56948/*! JsRender v1.0.11: http://jsviews.com/#jsrender */ 56949/*! **VERSION FOR WEB** (For NODE.JS see http://jsviews.com/download/jsrender-node.js) */ 56950/* 56951 * Best-of-breed templating in browser or on Node.js. 56952 * Does not require jQuery, or HTML DOM 56953 * Integrates with JsViews (http://jsviews.com/#jsviews) 56954 * 56955 * Copyright 2021, Boris Moore 56956 * Released under the MIT License. 56957 */ 56958 56959//jshint -W018, -W041, -W120 56960 56961(function(factory, global) { 56962 // global var is the this object, which is window when running in the usual browser environment 56963 var $ = global.jQuery; 56964 56965 if (typeof exports === "object") { // CommonJS e.g. Browserify 56966 module.exports = $ 56967 ? factory(global, $) 56968 : function($) { // If no global jQuery, take optional jQuery passed as parameter: require('jsrender')(jQuery) 56969 if ($ && !$.fn) { 56970 throw "Provide jQuery or null"; 56971 } 56972 return factory(global, $); 56973 }; 56974 } else if (typeof define === "function" && define.amd) { // AMD script loader, e.g. RequireJS 56975 define(function() { 56976 return factory(global); 56977 }); 56978 } else { // Browser using plain <script> tag 56979 factory(global, false); 56980 } 56981} ( 56982 56983// factory (for jsrender.js) 56984function(global, $) { 56985"use strict"; 56986 56987//========================== Top-level vars ========================== 56988 56989// global var is the this object, which is window when running in the usual browser environment 56990var setGlobals = $ === false; // Only set globals if script block in browser (not AMD and not CommonJS) 56991 56992$ = $ && $.fn ? $ : global.jQuery; // $ is jQuery passed in by CommonJS loader (Browserify), or global jQuery. 56993 56994var versionNumber = "v1.0.11", 56995 jsvStoreName, rTag, rTmplString, topView, $views, $expando, 56996 _ocp = "_ocp", // Observable contextual parameter 56997 56998 $isFunction, $isArray, $templates, $converters, $helpers, $tags, $sub, $subSettings, $subSettingsAdvanced, $viewsSettings, 56999 delimOpenChar0, delimOpenChar1, delimCloseChar0, delimCloseChar1, linkChar, setting, baseOnError, 57000 57001 isRenderCall, 57002 rNewLine = /[ \t]*(\r\n|\n|\r)/g, 57003 rUnescapeQuotes = /\\(['"\\])/g, // Unescape quotes and trim 57004 rEscapeQuotes = /['"\\]/g, // Escape quotes and \ character 57005 rBuildHash = /(?:\x08|^)(onerror:)?(?:(~?)(([\w$.]+):)?([^\x08]+))\x08(,)?([^\x08]+)/gi, 57006 rTestElseIf = /^if\s/, 57007 rFirstElem = /<(\w+)[>\s]/, 57008 rAttrEncode = /[\x00`><"'&=]/g, // Includes > encoding since rConvertMarkers in JsViews does not skip > characters in attribute strings 57009 rIsHtml = /[\x00`><\"'&=]/, 57010 rHasHandlers = /^on[A-Z]|^convert(Back)?$/, 57011 rWrappedInViewMarker = /^\#\d+_`[\s\S]*\/\d+_`$/, 57012 rHtmlEncode = rAttrEncode, 57013 rDataEncode = /[&<>]/g, 57014 rDataUnencode = /&(amp|gt|lt);/g, 57015 rBracketQuote = /\[['"]?|['"]?\]/g, 57016 viewId = 0, 57017 charEntities = { 57018 "&": "&", 57019 "<": "<", 57020 ">": ">", 57021 "\x00": "�", 57022 "'": "'", 57023 '"': """, 57024 "`": "`", 57025 "=": "=" 57026 }, 57027 charsFromEntities = { 57028 amp: "&", 57029 gt: ">", 57030 lt: "<" 57031 }, 57032 HTML = "html", 57033 OBJECT = "object", 57034 tmplAttr = "data-jsv-tmpl", 57035 jsvTmpl = "jsvTmpl", 57036 indexStr = "For #index in nested block use #getIndex().", 57037 cpFnStore = {}
vendor: 5,502 bytes, lines 57037-57204
57037, // Compiled furnctions for computed values in template expressions (properties, methods, helpers) 57038 $render = {}, 57039 57040 jsr = global.jsrender, 57041 jsrToJq = jsr && $ && !$.render, // JsRender already loaded, without jQuery. but we will re-load it now to attach to jQuery 57042 57043 jsvStores = { 57044 template: { 57045 compile: compileTmpl 57046 }, 57047 tag: { 57048 compile: compileTag 57049 }, 57050 viewModel: { 57051 compile: compileViewModel 57052 }, 57053 helper: {}, 57054 converter: {} 57055 }; 57056 57057 // views object ($.views if jQuery is loaded, jsrender.views if no jQuery, e.g. in Node.js) 57058 $views = { 57059 jsviews: versionNumber, 57060 sub: { 57061 // subscription, e.g. JsViews integration 57062 rPath: /^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g, 57063 // not object helper view viewProperty pathTokens leafToken 57064 57065 rPrm: /(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(~?[\w$.^]+)?\s*((\+\+|--)|\+|-|~(?![\w$])|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?(@)?[#~]?[\w$.^]+)([([])?)|(,\s*)|(?:(\()\s*)?\\?(?:(')|("))|(?:\s*(([)\]])(?=[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g, 57066 // lftPrn0 lftPrn bound path operator err eq path2 late prn comma lftPrn2 apos quot rtPrn rtPrnDot prn2 space 57067 57068 View: View, 57069 Err: JsViewsError, 57070 tmplFn: tmplFn, 57071 parse: parseParams, 57072 extend: $extend, 57073 extendCtx: extendCtx, 57074 syntaxErr: syntaxError, 57075 onStore: { 57076 template: function(name, item) { 57077 if (item === null) { 57078 delete $render[name]; 57079 } else if (name) { 57080 $render[name] = item; 57081 } 57082 } 57083 }, 57084 addSetting: addSetting, 57085 settings: { 57086 allowCode: false 57087 }, 57088 advSet: noop, // Update advanced settings 57089 _thp: tagHandlersFromProps, 57090 _gm: getMethod, 57091 _tg: function() {}, // Constructor for tagDef 57092 _cnvt: convertVal, 57093 _tag: renderTag, 57094 _er: error, 57095 _err: onRenderError, 57096 _cp: retVal, // Get observable contextual parameters (or properties) ~foo=expr. In JsRender, simply returns val. 57097 _sq: function(token) { 57098 if (token === "constructor") { 57099 syntaxError(""); 57100 } 57101 return token; 57102 } 57103 }, 57104 settings: { 57105 delimiters: $viewsDelimiters, 57106 advanced: function(value) { 57107 return value 57108 ? ( 57109 $extend($subSettingsAdvanced, value), 57110 $sub.advSet(), 57111 $viewsSettings 57112 ) 57113 : $subSettingsAdvanced; 57114 } 57115 }, 57116 map: dataMap // If jsObservable loaded first, use that definition of dataMap 57117 }; 57118 57119function getDerivedMethod(baseMethod, method) { 57120 return function() { 57121 var ret, 57122 tag = this, 57123 prevBase = tag.base; 57124 57125 tag.base = baseMethod; // Within method call, calling this.base will call the base method 57126 ret = method.apply(tag, arguments); // Call the method 57127 tag.base = prevBase; // Replace this.base to be the base method of the previous call, for chained calls 57128 return ret; 57129 }; 57130} 57131 57132function getMethod(baseMethod, method) { 57133 // For derived methods (or handlers declared declaratively as in {{:foo onChange=~fooChanged}} replace by a derived method, to allow using this.base(...) 57134 // or this.baseApply(arguments) to call the base implementation. (Equivalent to this._super(...) and this._superApply(arguments) in jQuery UI) 57135 if ($isFunction(method)) { 57136 method = getDerivedMethod( 57137 !baseMethod 57138 ? noop // no base method implementation, so use noop as base method 57139 : baseMethod._d 57140 ? baseMethod // baseMethod is a derived method, so use it 57141 : getDerivedMethod(noop, baseMethod), // baseMethod is not derived so make its base method be the noop method 57142 method 57143 ); 57144 method._d = (baseMethod && baseMethod._d || 0) + 1; // Add flag for derived method (incremented for derived of derived...) 57145 } 57146 return method; 57147} 57148 57149function tagHandlersFromProps(tag, tagCtx) { 57150 var prop, 57151 props = tagCtx.props; 57152 for (prop in props) { 57153 if (rHasHandlers.test(prop) && !(tag[prop] && tag[prop].fix)) { // Don't override handlers with fix expando (used in datepicker and spinner) 57154 tag[prop] = prop !== "convert" ? getMethod(tag.constructor.prototype[prop], props[prop]) : props[prop]; 57155 // Copy over the onFoo props, convert and convertBack from tagCtx.props to tag (overrides values in tagDef). 57156 // Note: unsupported scenario: if handlers are dynamically added ^onFoo=expression this will work, but dynamically removing will not work. 57157 } 57158 } 57159} 57160 57161function retVal(val) { 57162 return val; 57163} 57164 57165function noop() { 57166 return ""; 57167} 57168 57169function dbgBreak(val) { 57170 // Usage examples: {{dbg:...}}, {{:~dbg(...)}}, {{dbg .../}}, {^{for ... onAfterLink=~dbg}} etc. 57171 try { 57172 console.log("JsRender dbg breakpoint: " + val); 57173 throw "dbg breakpoint"; // To break here, stop on caught exceptions. 57174 } 57175 catch (e) {} 57176 return this.base ? this.baseApply(arguments) : val; 57177} 57178 57179function JsViewsError(message) { 57180 // Error exception type for JsViews/JsRender 57181 // Override of $.views.sub.Error is possible 57182 this.name = ($.link ? "JsViews" : "JsRender") + " Error"; 57183 this.message = message || this.name; 57184} 57185 57186function $extend(target, source) { 57187 if (target) { 57188 for (var name in source) { 57189 target[name] = source[name]; 57190 } 57191 return target; 57192 } 57193} 57194 57195(JsViewsError.prototype = new Error()).constructor = JsViewsError; 57196 57197//========================== Top-level functions ========================== 57198 57199//=================== 57200// views.delimiters 57201//=================== 57202 57203 /** 57204 * Set the tag opening and closing delimiters and 'link' character. Default is "{{", "}}" and "^"
vendor: 13,762 bytes, lines 57205-57603
57205 * openChars, closeChars: opening and closing strings, each with two characters 57206 * $.views.settings.delimiters(...) 57207 * 57208 * @param {string} openChars 57209 * @param {string} [closeChars] 57210 * @param {string} [link] 57211 * @returns {Settings} 57212 * 57213 * Get delimiters 57214 * delimsArray = $.views.settings.delimiters() 57215 * 57216 * @returns {string[]} 57217 */ 57218function $viewsDelimiters(openChars, closeChars, link) { 57219 if (!openChars) { 57220 return $subSettings.delimiters; 57221 } 57222 if ($isArray(openChars)) { 57223 return $viewsDelimiters.apply($views, openChars); 57224 } 57225 linkChar = link ? link[0] : linkChar; 57226 if (!/^(\W|_){5}$/.test(openChars + closeChars + linkChar)) { 57227 error("Invalid delimiters"); // Must be non-word characters, and openChars and closeChars must each be length 2 57228 } 57229 delimOpenChar0 = openChars[0]; 57230 delimOpenChar1 = openChars[1]; 57231 delimCloseChar0 = closeChars[0]; 57232 delimCloseChar1 = closeChars[1]; 57233 57234 $subSettings.delimiters = [delimOpenChar0 + delimOpenChar1, delimCloseChar0 + delimCloseChar1, linkChar]; 57235 57236 // Escape the characters - since they could be regex special characters 57237 openChars = "\\" + delimOpenChar0 + "(\\" + linkChar + ")?\\" + delimOpenChar1; // Default is "{^{" 57238 closeChars = "\\" + delimCloseChar0 + "\\" + delimCloseChar1; // Default is "}}" 57239 // Build regex with new delimiters 57240 // [tag (followed by / space or }) or cvtr+colon or html or code] followed by space+params then convertBack? 57241 rTag = "(?:(\\w+(?=[\\/\\s\\" + delimCloseChar0 + "]))|(\\w+)?(:)|(>)|(\\*))\\s*((?:[^\\" 57242 + delimCloseChar0 + "]|\\" + delimCloseChar0 + "(?!\\" + delimCloseChar1 + "))*?)"; 57243 57244 // Make rTag available to JsViews (or other components) for parsing binding expressions 57245 $sub.rTag = "(?:" + rTag + ")"; 57246 // { ^? { tag+params slash? or closingTag or comment 57247 rTag = new RegExp("(?:" + openChars + rTag + "(\\/)?|\\" + delimOpenChar0 + "(\\" + linkChar + ")?\\" + delimOpenChar1 + "(?:(?:\\/(\\w+))\\s*|!--[\\s\\S]*?--))" + closeChars, "g"); 57248 57249 // Default: bind tagName cvt cln html code params slash bind2 closeBlk comment 57250 // /(?:{(\^)?{(?:(\w+(?=[\/\s}]))|(\w+)?(:)|(>)|(\*))\s*((?:[^}]|}(?!}))*?)(\/)?|{(\^)?{(?:(?:\/(\w+))\s*|!--[\s\S]*?--))}} 57251 57252 $sub.rTmpl = new RegExp("^\\s|\\s$|<.*>|([^\\\\]|^)[{}]|" + openChars + ".*" + closeChars); 57253 // $sub.rTmpl looks for initial or final white space, html tags or { or } char not preceded by \\, or JsRender tags {{xxx}}. 57254 // Each of these strings are considered NOT to be jQuery selectors 57255 return $viewsSettings; 57256} 57257 57258//========= 57259// View.get 57260//========= 57261 57262function getView(inner, type) { //view.get(inner, type) 57263 if (!type && inner !== true) { 57264 // view.get(type) 57265 type = inner; 57266 inner = undefined; 57267 } 57268 57269 var views, i, l, found, 57270 view = this, 57271 root = type === "root"; 57272 // view.get("root") returns view.root, view.get() returns view.parent, view.get(true) returns view.views[0]. 57273 57274 if (inner) { 57275 // Go through views - this one, and all nested ones, depth-first - and return first one with given type. 57276 // If type is undefined, i.e. view.get(true), return first child view. 57277 found = type && view.type === type && view; 57278 if (!found) { 57279 views = view.views; 57280 if (view._.useKey) { 57281 for (i in views) { 57282 if (found = type ? views[i].get(inner, type) : views[i]) { 57283 break; 57284 } 57285 } 57286 } else { 57287 for (i = 0, l = views.length; !found && i < l; i++) { 57288 found = type ? views[i].get(inner, type) : views[i]; 57289 } 57290 } 57291 } 57292 } else if (root) { 57293 // Find root view. (view whose parent is top view) 57294 found = view.root; 57295 } else if (type) { 57296 while (view && !found) { 57297 // Go through views - this one, and all parent ones - and return first one with given type. 57298 found = view.type === type ? view : undefined; 57299 view = view.parent; 57300 } 57301 } else { 57302 found = view.parent; 57303 } 57304 return found || undefined; 57305} 57306 57307function getNestedIndex() { 57308 var view = this.get("item"); 57309 return view ? view.index : undefined; 57310} 57311 57312getNestedIndex.depends = function() { 57313 return [this.get("item"), "index"]; 57314}; 57315 57316function getIndex() { 57317 return this.index; 57318} 57319 57320getIndex.depends = "index"; 57321 57322//================== 57323// View.ctxPrm, etc. 57324//================== 57325 57326/* Internal private: view._getOb() */ 57327function getPathObject(ob, path, ltOb, fn) { 57328 // Iterate through path to late paths: @a.b.c paths 57329 // Return "" (or noop if leaf is a function @a.b.c(...) ) if intermediate object not yet available 57330 var prevOb, tokens, l, 57331 i = 0; 57332 if (ltOb === 1) { 57333 fn = 1; 57334 ltOb = undefined; 57335 } 57336 // Paths like ^a^b^c or ~^a^b^c will not throw if an object in path is undefined. 57337 if (path) { 57338 tokens = path.split("."); 57339 l = tokens.length; 57340 57341 for (; ob && i < l; i++) { 57342 prevOb = ob; 57343 ob = tokens[i] ? ob[tokens[i]] : ob; 57344 } 57345 } 57346 if (ltOb) { 57347 ltOb.lt = ltOb.lt || i<l; // If i < l there was an object in the path not yet available 57348 } 57349 return ob === undefined 57350 ? fn ? noop : "" 57351 : fn ? function() { 57352 return ob.apply(prevOb, arguments); 57353 } : ob; 57354} 57355 57356function contextParameter(key, value, get) { 57357 // Helper method called as view.ctxPrm(key) for helpers or template parameters ~foo - from compiled template or from context callback 57358 var wrapped, deps, res, obsCtxPrm, tagElse, callView, newRes, 57359 storeView = this, 57360 isUpdate = !isRenderCall && arguments.length > 1, 57361 store = storeView.ctx; 57362 if (key) { 57363 if (!storeView._) { // tagCtx.ctxPrm() call 57364 tagElse = storeView.index; 57365 storeView = storeView.tag; 57366 } 57367 callView = storeView; 57368 if (store && store.hasOwnProperty(key) || (store = $helpers).hasOwnProperty(key)) { 57369 res = store[key]; 57370 if (key === "tag" || key === "tagCtx" || key === "root" || key === "parentTags") { 57371 return res; 57372 } 57373 } else { 57374 store = undefined; 57375 } 57376 if (!isRenderCall && storeView.tagCtx || storeView.linked) { // Data-linked view, or tag instance 57377 if (!res || !res._cxp) { 57378 // Not a contextual parameter 57379 // Set storeView to tag (if this is a tag.ctxPrm() call) or to root view ("data" view of linked template) 57380 storeView = storeView.tagCtx || $isFunction(res) 57381 ? storeView // Is a tag, not a view, or is a computed contextual parameter, so scope to the callView, no the 'scope view' 57382 : (storeView = storeView.scope || storeView, 57383 !storeView.isTop && storeView.ctx.tag // If this view is in a tag, set storeView to the tag 57384 || storeView); 57385 if (res !== undefined && storeView.tagCtx) { 57386 // If storeView is a tag, but the contextual parameter has been set at at higher level (e.g. helpers)... 57387 storeView = storeView.tagCtx.view.scope; // then move storeView to the outer level (scope of tag container view) 57388 } 57389 store = storeView._ocps; 57390 res = store && store.hasOwnProperty(key) && store[key] || res; 57391 if (!(res && res._cxp) && (get || isUpdate)) { 57392 // Create observable contextual parameter 57393 (store || (storeView._ocps = storeView._ocps || {}))[key] 57394 = res 57395 = [{ 57396 _ocp: res, // The observable contextual parameter value 57397 _vw: callView, 57398 _key: key 57399 }]; 57400 res._cxp = { 57401 path: _ocp, 57402 ind: 0, 57403 updateValue: function(val, path) { 57404 $.observable(res[0]).setProperty(_ocp, val); // Set the value (res[0]._ocp) 57405 return this; 57406 } 57407 }; 57408 } 57409 } 57410 if (obsCtxPrm = res && res._cxp) { 57411 // If this helper resource is an observable contextual parameter 57412 if (arguments.length > 2) { 57413 deps = res[1] ? $sub._ceo(res[1].deps) : [_ocp]; // fn deps (with any exprObs cloned using $sub._ceo) 57414 deps.unshift(res[0]); // view 57415 deps._cxp = obsCtxPrm; 57416 // In a context callback for a contextual param, we set get = true, to get ctxPrm [view, dependencies...] array - needed for observe call 57417 return deps; 57418 } 57419 tagElse = obsCtxPrm.tagElse; 57420 newRes = res[1] // linkFn for compiled expression 57421 ? obsCtxPrm.tag && obsCtxPrm.tag.cvtArgs 57422 ? obsCtxPrm.tag.cvtArgs(tagElse, 1)[obsCtxPrm.ind] // = tag.bndArgs() - for tag contextual parameter 57423 : res[1](res[0].data, res[0], $sub) // = fn(data, view, $sub) for compiled binding expression 57424 : res[0]._ocp; // Observable contextual parameter (uninitialized, or initialized as static expression, so no path dependencies) 57425 if (isUpdate) { 57426 $sub._ucp(key, value, storeView, obsCtxPrm); // Update observable contextual parameter 57427 return storeView; 57428 } 57429 res = newRes; 57430 } 57431 } 57432 if (res && $isFunction(res)) { 57433 // If a helper is of type function we will wrap it, so if called with no this pointer it will be called with the 57434 // view as 'this' context. If the helper ~foo() was in a data-link expression, the view will have a 'temporary' linkCtx property too. 57435 // Note that helper functions on deeper paths will have specific this pointers, from the preceding path. 57436 // For example, ~util.foo() will have the ~util object as 'this' pointer 57437 wrapped = function() { 57438 return res.apply((!this || this === global) ? callView : this, arguments); 57439 }; 57440 $extend(wrapped, res); // Attach same expandos (if any) to the wrapped function 57441 } 57442 return wrapped || res; 57443 } 57444} 57445 57446/* Internal private: view._getTmpl() */ 57447function getTemplate(tmpl) { 57448 return tmpl && (tmpl.fn 57449 ? tmpl 57450 : this.getRsc("templates", tmpl) || $templates(tmpl)); // not yet compiled 57451} 57452 57453//============== 57454// views._cnvt 57455//============== 57456 57457function convertVal(converter, view, tagCtx, onError) { 57458 // Called from compiled template code for {{:}} 57459 // self is template object or linkCtx object 57460 var tag, linkCtx, value, argsLen, bindTo, 57461 // If tagCtx is an integer, then it is the key for the compiled function to return the boundTag tagCtx 57462 boundTag = typeof tagCtx === "number" && view.tmpl.bnds[tagCtx-1]; 57463 57464 if (onError === undefined && boundTag && boundTag._lr) { // lateRender 57465 onError = ""; 57466 } 57467 if (onError !== undefined) { 57468 tagCtx = onError = {props: {}, args: [onError]}; 57469 } else if (boundTag) { 57470 tagCtx = boundTag(view.data, view, $sub); 57471 } 57472 boundTag = boundTag._bd && boundTag; 57473 if (converter || boundTag) { 57474 linkCtx = view._lc; // For data-link="{cvt:...}"... See onDataLinkedTagChange 57475 tag = linkCtx && linkCtx.tag; 57476 tagCtx.view = view; 57477 if (!tag) { 57478 tag = $extend(new $sub._tg(), { 57479 _: { 57480 bnd: boundTag, 57481 unlinked: true, 57482 lt: tagCtx.lt // If a late path @some.path has not returned @some object, mark tag as late 57483 }, 57484 inline: !linkCtx, 57485 tagName: ":", 57486 convert: converter, 57487 onArrayChange: true, 57488 flow: true, 57489 tagCtx: tagCtx, 57490 tagCtxs: [tagCtx], 57491 _is: "tag" 57492 }); 57493 argsLen = tagCtx.args.length; 57494 if (argsLen>1) { 57495 bindTo = tag.bindTo = []; 57496 while (argsLen--) { 57497 bindTo.unshift(argsLen); // Bind to all the arguments - generate bindTo array: [0,1,2...] 57498 } 57499 } 57500 if (linkCtx) { 57501 linkCtx.tag = tag; 57502 tag.linkCtx = linkCtx; 57503 } 57504 tagCtx.ctx = extendCtx(tagCtx.ctx, (linkCtx ? linkCtx.view : view).ctx); 57505 tagHandlersFromProps(tag, tagCtx); 57506 } 57507 tag._er = onError && value; 57508 tag.ctx = tagCtx.ctx || tag.ctx || {}; 57509 tagCtx.ctx = undefined; 57510 value = tag.cvtArgs()[0]; // If there is a convertBack but no convert, converter will be "true" 57511 tag._er = onError && value; 57512 } else { 57513 value = tagCtx.args[0]; 57514 } 57515 57516 // Call onRender (used by JsViews if present, to add binding annotations around rendered content) 57517 value = boundTag && view._.onRender 57518 ? view._.onRender(value, view, tag) 57519 : value; 57520 return value != undefined ? value : ""; 57521} 57522 57523function convertArgs(tagElse, bound) { // tag.cvtArgs() or tag.cvtArgs(tagElse?, true?) 57524 var l, key, boundArgs, args, bindFrom, tag, converter, 57525 tagCtx = this; 57526 57527 if (tagCtx.tagName) { 57528 tag = tagCtx; 57529 tagCtx = (tag.tagCtxs || [tagCtx])[tagElse||0]; 57530 if (!tagCtx) { 57531 return; 57532 } 57533 } else { 57534 tag = tagCtx.tag; 57535 } 57536 57537 bindFrom = tag.bindFrom; 57538 args = tagCtx.args; 57539 57540 if ((converter = tag.convert) && "" + converter === converter) { 57541 converter = converter === "true" 57542 ? undefined 57543 : (tagCtx.view.getRsc("converters", converter) || error("Unknown converter: '" + converter + "'")); 57544 } 57545 57546 if (converter && !bound) { // If there is a converter, use a copy of the tagCtx.args array for rendering, and replace the args[0] in 57547 args = args.slice(); // the copied array with the converted value. But we do not modify the value of tag.tagCtx.args[0] (the original args array) 57548 } 57549 if (bindFrom) { // Get the values of the boundArgs 57550 boundArgs = []; 57551 l = bindFrom.length; 57552 while (l--) { 57553 key = bindFrom[l]; 57554 boundArgs.unshift(argOrProp(tagCtx, key)); 57555 } 57556 if (bound) { 57557 args = boundArgs; // Call to bndArgs() - returns the boundArgs 57558 } 57559 } 57560 if (converter) { 57561 converter = converter.apply(tag, boundArgs || args); 57562 if (converter === undefined) { 57563 return args; // Returning undefined from a converter is equivalent to not having a converter. 57564 } 57565 bindFrom = bindFrom || [0]; 57566 l = bindFrom.length; 57567 if (!$isArray(converter) || (converter.arg0 !== false && (l === 1 || converter.length !== l || converter.arg0))) { 57568 converter = [converter]; // Returning converter as first arg, even if converter value is an array 57569 bindFrom = [0]; 57570 l = 1; 57571 } 57572 if (bound) { // Call to bndArgs() - so apply converter to all boundArgs 57573 args = converter; // The array of values returned from the converter 57574 } else { // Call to cvtArgs() 57575 while (l--) { 57576 key = bindFrom[l]; 57577 if (+key === key) { 57578 args[key] = converter[l]; 57579 } 57580 } 57581 } 57582 } 57583 return args; 57584} 57585 57586function argOrProp(context, key) { 57587 context = context[+key === key ? "args" : "props"]; 57588 return context && context[key]; 57589} 57590 57591function convertBoundArgs(tagElse) { // tag.bndArgs() 57592 return this.cvtArgs(tagElse, 1); 57593} 57594 57595//============= 57596// views.tag 57597//============= 57598 57599/* view.getRsc() */ 57600function getResource(resourceType, itemName) { 57601 var res, store, 57602 view = this; 57603 if ("" + itemName === itemName
vendor: 14,716 bytes, lines 57603-58002
57603) { 57604 while ((res === undefined) && view) { 57605 store = view.tmpl && view.tmpl[resourceType]; 57606 res = store && store[itemName]; 57607 view = view.parent; 57608 } 57609 return res || $views[resourceType][itemName]; 57610 } 57611} 57612 57613function renderTag(tagName, parentView, tmpl, tagCtxs, isUpdate, onError) { 57614 function bindToOrBindFrom(type) { 57615 var bindArray = tag[type]; 57616 57617 if (bindArray !== undefined) { 57618 bindArray = $isArray(bindArray) ? bindArray : [bindArray]; 57619 m = bindArray.length; 57620 while (m--) { 57621 key = bindArray[m]; 57622 if (!isNaN(parseInt(key))) { 57623 bindArray[m] = parseInt(key); // Convert "0" to 0, etc. 57624 } 57625 } 57626 } 57627 57628 return bindArray || [0]; 57629 } 57630 57631 parentView = parentView || topView; 57632 var tag, tagDef, template, tags, attr, parentTag, l, m, n, itemRet, tagCtx, tagCtxCtx, ctxPrm, bindTo, bindFrom, initVal, 57633 content, callInit, mapDef, thisMap, args, bdArgs, props, tagDataMap, contentCtx, key, bindFromLength, bindToLength, linkedElement, defaultCtx, 57634 i = 0, 57635 ret = "", 57636 linkCtx = parentView._lc || false, // For data-link="{myTag...}"... See onDataLinkedTagChange 57637 ctx = parentView.ctx, 57638 parentTmpl = tmpl || parentView.tmpl, 57639 // If tagCtxs is an integer, then it is the key for the compiled function to return the boundTag tagCtxs 57640 boundTag = typeof tagCtxs === "number" && parentView.tmpl.bnds[tagCtxs-1]; 57641 57642 if (tagName._is === "tag") { 57643 tag = tagName; 57644 tagName = tag.tagName; 57645 tagCtxs = tag.tagCtxs; 57646 template = tag.template; 57647 } else { 57648 tagDef = parentView.getRsc("tags", tagName) || error("Unknown tag: {{" + tagName + "}} "); 57649 template = tagDef.template; 57650 } 57651 if (onError === undefined && boundTag && (boundTag._lr = (tagDef.lateRender && boundTag._lr!== false || boundTag._lr))) { 57652 onError = ""; // If lateRender, set temporary onError, to skip initial rendering (and render just "") 57653 } 57654 if (onError !== undefined) { 57655 ret += onError; 57656 tagCtxs = onError = [{props: {}, args: [], params: {props:{}}}]; 57657 } else if (boundTag) { 57658 tagCtxs = boundTag(parentView.data, parentView, $sub); 57659 } 57660 57661 l = tagCtxs.length; 57662 for (; i < l; i++) { 57663 tagCtx = tagCtxs[i]; 57664 content = tagCtx.tmpl; 57665 if (!linkCtx || !linkCtx.tag || i && !linkCtx.tag.inline || tag._er || content && +content===content) { 57666 // Initialize tagCtx 57667 // For block tags, tagCtx.tmpl is an integer > 0 57668 if (content && parentTmpl.tmpls) { 57669 tagCtx.tmpl = tagCtx.content = parentTmpl.tmpls[content - 1]; // Set the tmpl property to the content of the block tag 57670 } 57671 tagCtx.index = i; 57672 tagCtx.ctxPrm = contextParameter; 57673 tagCtx.render = renderContent; 57674 tagCtx.cvtArgs = convertArgs; 57675 tagCtx.bndArgs = convertBoundArgs; 57676 tagCtx.view = parentView; 57677 tagCtx.ctx = extendCtx(extendCtx(tagCtx.ctx, tagDef && tagDef.ctx), ctx); // Clone and extend parentView.ctx 57678 } 57679 if (tmpl = tagCtx.props.tmpl) { 57680 // If the tmpl property is overridden, set the value (when initializing, or, in case of binding: ^tmpl=..., when updating) 57681 tagCtx.tmpl = parentView._getTmpl(tmpl); 57682 tagCtx.content = tagCtx.content || tagCtx.tmpl; 57683 } 57684 57685 if (!tag) { 57686 // This will only be hit for initial tagCtx (not for {{else}}) - if the tag instance does not exist yet 57687 // If the tag has not already been instantiated, we will create a new instance. 57688 // ~tag will access the tag, even within the rendering of the template content of this tag. 57689 // From child/descendant tags, can access using ~tag.parent, or ~parentTags.tagName 57690 tag = new tagDef._ctr(); 57691 callInit = !!tag.init; 57692 57693 tag.parent = parentTag = ctx && ctx.tag; 57694 tag.tagCtxs = tagCtxs; 57695 57696 if (linkCtx) { 57697 tag.inline = false; 57698 linkCtx.tag = tag; 57699 } 57700 tag.linkCtx = linkCtx; 57701 if (tag._.bnd = boundTag || linkCtx.fn) { 57702 // Bound if {^{tag...}} or data-link="{tag...}" 57703 tag._.ths = tagCtx.params.props["this"]; // Tag has a this=expr binding, to get javascript reference to tag instance 57704 tag._.lt = tagCtxs.lt; // If a late path @some.path has not returned @some object, mark tag as late 57705 tag._.arrVws = {}; 57706 } else if (tag.dataBoundOnly) { 57707 error(tagName + " must be data-bound:\n{^{" + tagName + "}}"); 57708 } 57709 //TODO better perf for childTags() - keep child tag.tags array, (and remove child, when disposed) 57710 // tag.tags = []; 57711 } else if (linkCtx && linkCtx.fn._lr) { 57712 callInit = !!tag.init; 57713 } 57714 tagDataMap = tag.dataMap; 57715 57716 tagCtx.tag = tag; 57717 if (tagDataMap && tagCtxs) { 57718 tagCtx.map = tagCtxs[i].map; // Copy over the compiled map instance from the previous tagCtxs to the refreshed ones 57719 } 57720 if (!tag.flow) { 57721 tagCtxCtx = tagCtx.ctx = tagCtx.ctx || {}; 57722 57723 // tags hash: tag.ctx.tags, merged with parentView.ctx.tags, 57724 tags = tag.parents = tagCtxCtx.parentTags = ctx && extendCtx(tagCtxCtx.parentTags, ctx.parentTags) || {}; 57725 if (parentTag) { 57726 tags[parentTag.tagName] = parentTag; 57727 //TODO better perf for childTags: parentTag.tags.push(tag); 57728 } 57729 tags[tag.tagName] = tagCtxCtx.tag = tag; 57730 tagCtxCtx.tagCtx = tagCtx; 57731 } 57732 } 57733 if (!(tag._er = onError)) { 57734 tagHandlersFromProps(tag, tagCtxs[0]); 57735 tag.rendering = {rndr: tag.rendering}; // Provide object for state during render calls to tag and elses. (Used by {{if}} and {{for}}...) 57736 for (i = 0; i < l; i++) { // Iterate tagCtx for each {{else}} block 57737 tagCtx = tag.tagCtx = tagCtxs[i]; 57738 props = tagCtx.props; 57739 tag.ctx = tagCtx.ctx; 57740 57741 if (!i) { 57742 if (callInit) { 57743 tag.init(tagCtx, linkCtx, tag.ctx); 57744 callInit = undefined; 57745 } 57746 if (!tagCtx.args.length && tagCtx.argDefault !== false && tag.argDefault !== false) { 57747 tagCtx.args = args = [tagCtx.view.data]; // Missing first arg defaults to the current data context 57748 tagCtx.params.args = ["#data"]; 57749 } 57750 57751 bindTo = bindToOrBindFrom("bindTo"); 57752 57753 if (tag.bindTo !== undefined) { 57754 tag.bindTo = bindTo; 57755 } 57756 57757 if (tag.bindFrom !== undefined) { 57758 tag.bindFrom = bindToOrBindFrom("bindFrom"); 57759 } else if (tag.bindTo) { 57760 tag.bindFrom = tag.bindTo = bindTo; 57761 } 57762 bindFrom = tag.bindFrom || bindTo; 57763 57764 bindToLength = bindTo.length; 57765 bindFromLength = bindFrom.length; 57766 57767 if (tag._.bnd && (linkedElement = tag.linkedElement)) { 57768 tag.linkedElement = linkedElement = $isArray(linkedElement) ? linkedElement: [linkedElement]; 57769 57770 if (bindToLength !== linkedElement.length) { 57771 error("linkedElement not same length as bindTo"); 57772 } 57773 } 57774 if (linkedElement = tag.linkedCtxParam) { 57775 tag.linkedCtxParam = linkedElement = $isArray(linkedElement) ? linkedElement: [linkedElement]; 57776 57777 if (bindFromLength !== linkedElement.length) { 57778 error("linkedCtxParam not same length as bindFrom/bindTo"); 57779 } 57780 } 57781 57782 if (bindFrom) { 57783 tag._.fromIndex = {}; // Hash of bindFrom index which has same path value as bindTo index. fromIndex = tag._.fromIndex[toIndex] 57784 tag._.toIndex = {}; // Hash of bindFrom index which has same path value as bindTo index. fromIndex = tag._.fromIndex[toIndex] 57785 n = bindFromLength; 57786 while (n--) { 57787 key = bindFrom[n]; 57788 m = bindToLength; 57789 while (m--) { 57790 if (key === bindTo[m]) { 57791 tag._.fromIndex[m] = n; 57792 tag._.toIndex[n] = m; 57793 } 57794 } 57795 } 57796 } 57797 57798 if (linkCtx) { 57799 // Set attr on linkCtx to ensure outputting to the correct target attribute. 57800 // Setting either linkCtx.attr or this.attr in the init() allows per-instance choice of target attrib. 57801 linkCtx.attr = tag.attr = linkCtx.attr || tag.attr || linkCtx._dfAt; 57802 } 57803 attr = tag.attr; 57804 tag._.noVws = attr && attr !== HTML; 57805 } 57806 args = tag.cvtArgs(i); 57807 if (tag.linkedCtxParam) { 57808 bdArgs = tag.cvtArgs(i, 1); 57809 m = bindFromLength; 57810 defaultCtx = tag.constructor.prototype.ctx; 57811 while (m--) { 57812 if (ctxPrm = tag.linkedCtxParam[m]) { 57813 key = bindFrom[m]; 57814 initVal = bdArgs[m]; 57815 // Create tag contextual parameter 57816 tagCtx.ctx[ctxPrm] = $sub._cp( 57817 defaultCtx && initVal === undefined ? defaultCtx[ctxPrm]: initVal, 57818 initVal !== undefined && argOrProp(tagCtx.params, key), 57819 tagCtx.view, 57820 tag._.bnd && {tag: tag, cvt: tag.convert, ind: m, tagElse: i} 57821 ); 57822 } 57823 } 57824 } 57825 if ((mapDef = props.dataMap || tagDataMap) && (args.length || props.dataMap)) { 57826 thisMap = tagCtx.map; 57827 if (!thisMap || thisMap.src !== args[0] || isUpdate) { 57828 if (thisMap && thisMap.src) { 57829 thisMap.unmap(); // only called if observable map - not when only used in JsRender, e.g. by {{props}} 57830 } 57831 mapDef.map(args[0], tagCtx, thisMap, !tag._.bnd); 57832 thisMap = tagCtx.map; 57833 } 57834 args = [thisMap.tgt]; 57835 } 57836 57837 itemRet = undefined; 57838 if (tag.render) { 57839 itemRet = tag.render.apply(tag, args); 57840 if (parentView.linked && itemRet && !rWrappedInViewMarker.test(itemRet)) { 57841 // When a tag renders content from the render method, with data linking then we need to wrap with view markers, if absent, 57842 // to provide a contentView for the tag, which will correctly dispose bindings if deleted. The 'tmpl' for this view will 57843 // be a dumbed-down template which will always return the itemRet string (no matter what the data is). The itemRet string 57844 // is not compiled as template markup, so can include "{{" or "}}" without triggering syntax errors 57845 tmpl = { // 'Dumbed-down' template which always renders 'static' itemRet string 57846 links: [] 57847 }; 57848 tmpl.render = tmpl.fn = function() { 57849 return itemRet; 57850 }; 57851 itemRet = renderWithViews(tmpl, parentView.data, undefined, true, parentView, undefined, undefined, tag); 57852 } 57853 } 57854 if (!args.length) { 57855 args = [parentView]; // no arguments - (e.g. {{else}}) get data context from view. 57856 } 57857 if (itemRet === undefined) { 57858 contentCtx = args[0]; // Default data context for wrapped block content is the first argument 57859 if (tag.contentCtx) { // Set tag.contentCtx to true, to inherit parent context, or to a function to provide alternate context. 57860 contentCtx = tag.contentCtx === true ? parentView : tag.contentCtx(contentCtx); 57861 } 57862 itemRet = tagCtx.render(contentCtx, true) || (isUpdate ? undefined : ""); 57863 } 57864 ret = ret 57865 ? ret + (itemRet || "") 57866 : itemRet !== undefined 57867 ? "" + itemRet 57868 : undefined; // If no return value from render, and no template/content tagCtx.render(...), return undefined 57869 } 57870 tag.rendering = tag.rendering.rndr; // Remove tag.rendering object (if this is outermost render call. (In case of nested calls) 57871 } 57872 tag.tagCtx = tagCtxs[0]; 57873 tag.ctx = tag.tagCtx.ctx; 57874 57875 if (tag._.noVws && tag.inline) { 57876 // inline tag with attr set to "text" will insert HTML-encoded content - as if it was element-based innerText 57877 ret = attr === "text" 57878 ? $converters.html(ret) 57879 : ""; 57880 } 57881 return boundTag && parentView._.onRender 57882 // Call onRender (used by JsViews if present, to add binding annotations around rendered content) 57883 ? parentView._.onRender(ret, parentView, tag) 57884 : ret; 57885} 57886 57887//================= 57888// View constructor 57889//================= 57890 57891function View(context, type, parentView, data, template, key, onRender, contentTmpl) { 57892 // Constructor for view object in view hierarchy. (Augmented by JsViews if JsViews is loaded) 57893 var views, parentView_, tag, self_, 57894 self = this, 57895 isArray = type === "array"; 57896 // If the data is an array, this is an 'array view' with a views array for each child 'item view' 57897 // If the data is not an array, this is an 'item view' with a views 'hash' object for any child nested views 57898 57899 self.content = contentTmpl; 57900 self.views = isArray ? [] : {}; 57901 self.data = data; 57902 self.tmpl = template; 57903 self_ = self._ = { 57904 key: 0, 57905 // ._.useKey is non zero if is not an 'array view' (owning a data array). Use this as next key for adding to child views hash 57906 useKey: isArray ? 0 : 1, 57907 id: "" + viewId++, 57908 onRender: onRender, 57909 bnds: {} 57910 }; 57911 self.linked = !!onRender; 57912 self.type = type || "top"; 57913 if (type) { 57914 self.cache = {_ct: $subSettings._cchCt}; // Used for caching results of computed properties and helpers (view.getCache) 57915 } 57916 57917 if (!parentView || parentView.type === "top") { 57918 (self.ctx = context || {}).root = self.data; 57919 } 57920 57921 if (self.parent = parentView) { 57922 self.root = parentView.root || self; // view whose parent is top view 57923 views = parentView.views; 57924 parentView_ = parentView._; 57925 self.isTop = parentView_.scp; // Is top content view of a link("#container", ...) call 57926 self.scope = (!context.tag || context.tag === parentView.ctx.tag) && !self.isTop && parentView.scope || self; 57927 // Scope for contextParams - closest non flow tag ancestor or root view 57928 if (parentView_.useKey) { 57929 // Parent is not an 'array view'. Add this view to its views object 57930 // self._key = is the key in the parent view hash 57931 views[self_.key = "_" + parentView_.useKey++] = self; 57932 self.index = indexStr; 57933 self.getIndex = getNestedIndex; 57934 } else if (views.length === (self_.key = self.index = key)) { // Parent is an 'array view'. Add this view to its views array 57935 views.push(self); // Adding to end of views array. (Using push when possible - better perf than splice) 57936 } else { 57937 views.splice(key, 0, self); // Inserting in views array 57938 } 57939 // If no context was passed in, use parent context 57940 // If context was passed in, it should have been merged already with parent context 57941 self.ctx = context || parentView.ctx; 57942 } else if (type) { 57943 self.root = self; // view whose parent is top view 57944 } 57945} 57946 57947View.prototype = { 57948 get: getView, 57949 getIndex: getIndex, 57950 ctxPrm: contextParameter, 57951 getRsc: getResource, 57952 _getTmpl: getTemplate, 57953 _getOb: getPathObject, 57954 getCache: function(key) { // Get cached value of computed value 57955 if ($subSettings._cchCt > this.cache._ct) { 57956 this.cache = {_ct: $subSettings._cchCt}; 57957 } 57958 return this.cache[key] !== undefined ? this.cache[key] : (this.cache[key] = cpFnStore[key](this.data, this, $sub)); 57959 }, 57960 _is: "view" 57961}; 57962 57963//==================================================== 57964// Registration 57965//==================================================== 57966 57967function compileChildResources(parentTmpl) { 57968 var storeName, storeNames, resources; 57969 for (storeName in jsvStores) { 57970 storeNames = storeName + "s"; 57971 if (parentTmpl[storeNames]) { 57972 resources = parentTmpl[storeNames]; // Resources not yet compiled 57973 parentTmpl[storeNames] = {}; // Remove uncompiled resources 57974 $views[storeNames](resources, parentTmpl); // Add back in the compiled resources 57975 } 57976 } 57977} 57978 57979//=============== 57980// compileTag 57981//=============== 57982 57983function compileTag(name, tagDef, parentTmpl) { 57984 var tmpl, baseTag, prop, 57985 compiledDef = new $sub._tg(); 57986 57987 function Tag() { 57988 var tag = this; 57989 tag._ = { 57990 unlinked: true 57991 }; 57992 tag.inline = true; 57993 tag.tagName = name; 57994 } 57995 57996 if ($isFunction(tagDef)) { 57997 // Simple tag declared as function. No presenter instantation. 57998 tagDef = { 57999 depends: tagDef.depends, 58000 render: tagDef 58001 }; 58002 } else if (
vendor: 7,601 bytes, lines 58002-58252
58002"" + tagDef === tagDef) { 58003 tagDef = {template: tagDef}; 58004 } 58005 58006 if (baseTag = tagDef.baseTag) { 58007 tagDef.flow = !!tagDef.flow; // Set flow property, so defaults to false even if baseTag has flow=true 58008 baseTag = "" + baseTag === baseTag 58009 ? (parentTmpl && parentTmpl.tags[baseTag] || $tags[baseTag]) 58010 : baseTag; 58011 if (!baseTag) { 58012 error('baseTag: "' + tagDef.baseTag + '" not found'); 58013 } 58014 compiledDef = $extend(compiledDef, baseTag); 58015 58016 for (prop in tagDef) { 58017 compiledDef[prop] = getMethod(baseTag[prop], tagDef[prop]); 58018 } 58019 } else { 58020 compiledDef = $extend(compiledDef, tagDef); 58021 } 58022 58023 // Tag declared as object, used as the prototype for tag instantiation (control/presenter) 58024 if ((tmpl = compiledDef.template) !== undefined) { 58025 compiledDef.template = "" + tmpl === tmpl ? ($templates[tmpl] || $templates(tmpl)) : tmpl; 58026 } 58027 (Tag.prototype = compiledDef).constructor = compiledDef._ctr = Tag; 58028 58029 if (parentTmpl) { 58030 compiledDef._parentTmpl = parentTmpl; 58031 } 58032 return compiledDef; 58033} 58034 58035function baseApply(args) { 58036 // In derived method (or handler declared declaratively as in {{:foo onChange=~fooChanged}} can call base method, 58037 // using this.baseApply(arguments) (Equivalent to this._superApply(arguments) in jQuery UI) 58038 return this.base.apply(this, args); 58039} 58040 58041//=============== 58042// compileTmpl 58043//=============== 58044 58045function compileTmpl(name, tmpl, parentTmpl, options) { 58046 // tmpl is either a template object, a selector for a template script block, or the name of a compiled template 58047 58048 //==== nested functions ==== 58049 function lookupTemplate(value) { 58050 // If value is of type string - treat as selector, or name of compiled template 58051 // Return the template object, if already compiled, or the markup string 58052 var currentName, tmpl; 58053 if (("" + value === value) || value.nodeType > 0 && (elem = value)) { 58054 if (!elem) { 58055 if (/^\.?\/[^\\:*?"<>]*$/.test(value)) { 58056 // value="./some/file.html" (or "/some/file.html") 58057 // If the template is not named, use "./some/file.html" as name. 58058 if (tmpl = $templates[name = name || value]) { 58059 value = tmpl; 58060 } else { 58061 // BROWSER-SPECIFIC CODE (not on Node.js): 58062 // Look for server-generated script block with id "./some/file.html" 58063 elem = document.getElementById(value); 58064 } 58065 } else if (value.charAt(0) === "#") { 58066 elem = document.getElementById(value.slice(1)); 58067 } else if ($.fn && !$sub.rTmpl.test(value)) { 58068 try { 58069 elem = $(value, document)[0]; // if jQuery is loaded, test for selector returning elements, and get first element 58070 } catch (e) {} 58071 }// END BROWSER-SPECIFIC CODE 58072 } //BROWSER-SPECIFIC CODE 58073 if (elem) { 58074 if (elem.tagName !== "SCRIPT") { 58075 error(value + ": Use script block, not " + elem.tagName); 58076 } 58077 if (options) { 58078 // We will compile a new template using the markup in the script element 58079 value = elem.innerHTML; 58080 } else { 58081 // We will cache a single copy of the compiled template, and associate it with the name 58082 // (renaming from a previous name if there was one). 58083 currentName = elem.getAttribute(tmplAttr); 58084 if (currentName) { 58085 if (currentName !== jsvTmpl) { 58086 value = $templates[currentName]; 58087 delete $templates[currentName]; 58088 } else if ($.fn) { 58089 value = $.data(elem)[jsvTmpl]; // Get cached compiled template 58090 } 58091 } 58092 if (!currentName || !value) { // Not yet compiled, or cached version lost 58093 name = name || ($.fn ? jsvTmpl : value); 58094 value = compileTmpl(name, elem.innerHTML, parentTmpl, options); 58095 } 58096 value.tmplName = name = name || currentName; 58097 if (name !== jsvTmpl) { 58098 $templates[name] = value; 58099 } 58100 elem.setAttribute(tmplAttr, name); 58101 if ($.fn) { 58102 $.data(elem, jsvTmpl, value); 58103 } 58104 } 58105 } // END BROWSER-SPECIFIC CODE 58106 elem = undefined; 58107 } else if (!value.fn) { 58108 value = undefined; 58109 // If value is not a string. HTML element, or compiled template, return undefined 58110 } 58111 return value; 58112 } 58113 58114 var elem, compiledTmpl, 58115 tmplOrMarkup = tmpl = tmpl || ""; 58116 $sub._html = $converters.html; 58117 58118 //==== Compile the template ==== 58119 if (options === 0) { 58120 options = undefined; 58121 tmplOrMarkup = lookupTemplate(tmplOrMarkup); // Top-level compile so do a template lookup 58122 } 58123 58124 // If options, then this was already compiled from a (script) element template declaration. 58125 // If not, then if tmpl is a template object, use it for options 58126 options = options || (tmpl.markup 58127 ? tmpl.bnds 58128 ? $extend({}, tmpl) 58129 : tmpl 58130 : {} 58131 ); 58132 58133 options.tmplName = options.tmplName || name || "unnamed"; 58134 if (parentTmpl) { 58135 options._parentTmpl = parentTmpl; 58136 } 58137 // If tmpl is not a markup string or a selector string, then it must be a template object 58138 // In that case, get it from the markup property of the object 58139 if (!tmplOrMarkup && tmpl.markup && (tmplOrMarkup = lookupTemplate(tmpl.markup)) && tmplOrMarkup.fn) { 58140 // If the string references a compiled template object, need to recompile to merge any modified options 58141 tmplOrMarkup = tmplOrMarkup.markup; 58142 } 58143 if (tmplOrMarkup !== undefined) { 58144 if (tmplOrMarkup.render || tmpl.render) { 58145 // tmpl is already compiled, so use it 58146 if (tmplOrMarkup.tmpls) { 58147 compiledTmpl = tmplOrMarkup; 58148 } 58149 } else { 58150 // tmplOrMarkup is a markup string, not a compiled template 58151 // Create template object 58152 tmpl = tmplObject(tmplOrMarkup, options); 58153 // Compile to AST and then to compiled function 58154 tmplFn(tmplOrMarkup.replace(rEscapeQuotes, "\\$&"), tmpl); 58155 } 58156 if (!compiledTmpl) { 58157 compiledTmpl = $extend(function() { 58158 return compiledTmpl.render.apply(compiledTmpl, arguments); 58159 }, tmpl); 58160 58161 compileChildResources(compiledTmpl); 58162 } 58163 return compiledTmpl; 58164 } 58165} 58166 58167//==== /end of function compileTmpl ==== 58168 58169//================= 58170// compileViewModel 58171//================= 58172 58173function getDefaultVal(defaultVal, data) { 58174 return $isFunction(defaultVal) 58175 ? defaultVal.call(data) 58176 : defaultVal; 58177} 58178 58179function addParentRef(ob, ref, parent) { 58180 Object.defineProperty(ob, ref, { 58181 value: parent, 58182 configurable: true 58183 }); 58184} 58185 58186function compileViewModel(name, type) { 58187 var i, constructor, parent, 58188 viewModels = this, 58189 getters = type.getters, 58190 extend = type.extend, 58191 id = type.id, 58192 proto = $.extend({ 58193 _is: name || "unnamed", 58194 unmap: unmap, 58195 merge: merge 58196 }, extend), 58197 args = "", 58198 cnstr = "", 58199 getterCount = getters ? getters.length : 0, 58200 $observable = $.observable, 58201 getterNames = {}; 58202 58203 function JsvVm(args) { 58204 constructor.apply(this, args); 58205 } 58206 58207 function vm() { 58208 return new JsvVm(arguments); 58209 } 58210 58211 function iterate(data, action) { 58212 var getterType, defaultVal, prop, ob, parentRef, 58213 j = 0; 58214 for (; j < getterCount; j++) { 58215 prop = getters[j]; 58216 getterType = undefined; 58217 if (prop + "" !== prop) { 58218 getterType = prop; 58219 prop = getterType.getter; 58220 parentRef = getterType.parentRef; 58221 } 58222 if ((ob = data[prop]) === undefined && getterType && (defaultVal = getterType.defaultVal) !== undefined) { 58223 ob = getDefaultVal(defaultVal, data); 58224 } 58225 action(ob, getterType && viewModels[getterType.type], prop, parentRef); 58226 } 58227 } 58228 58229 function map(data) { 58230 data = data + "" === data 58231 ? JSON.parse(data) // Accept JSON string 58232 : data; // or object/array 58233 var l, prop, childOb, parentRef, 58234 j = 0, 58235 ob = data, 58236 arr = []; 58237 58238 if ($isArray(data)) { 58239 data = data || []; 58240 l = data.length; 58241 for (; j<l; j++) { 58242 arr.push(this.map(data[j])); 58243 } 58244 arr._is = name; 58245 arr.unmap = unmap; 58246 arr.merge = merge; 58247 return arr; 58248 } 58249 58250 if (data) { 58251 iterate(data, function(ob, viewModel) { 58252 if (viewModel) { // Iterate to build getters arg array (value, or mapped value)
vendor: 6,942 bytes, lines 58253-58505
58253 ob = viewModel.map(ob); 58254 } 58255 arr.push(ob); 58256 }); 58257 ob = this.apply(this, arr); // Instantiate this View Model, passing getters args array to constructor 58258 j = getterCount; 58259 while (j--) { 58260 childOb = arr[j]; 58261 parentRef = getters[j].parentRef; 58262 if (parentRef && childOb && childOb.unmap) { 58263 if ($isArray(childOb)) { 58264 l = childOb.length; 58265 while (l--) { 58266 addParentRef(childOb[l], parentRef, ob); 58267 } 58268 } else { 58269 addParentRef(childOb, parentRef, ob); 58270 } 58271 } 58272 } 58273 for (prop in data) { // Copy over any other properties. that are not get/set properties 58274 if (prop !== $expando && !getterNames[prop]) { 58275 ob[prop] = data[prop]; 58276 } 58277 } 58278 } 58279 return ob; 58280 } 58281 58282 function merge(data, parent, parentRef) { 58283 data = data + "" === data 58284 ? JSON.parse(data) // Accept JSON string 58285 : data; // or object/array 58286 58287 var j, l, m, prop, mod, found, assigned, ob, newModArr, childOb, 58288 k = 0, 58289 model = this; 58290 58291 if ($isArray(model)) { 58292 assigned = {}; 58293 newModArr = []; 58294 l = data.length; 58295 m = model.length; 58296 for (; k<l; k++) { 58297 ob = data[k]; 58298 found = false; 58299 for (j=0; j<m && !found; j++) { 58300 if (assigned[j]) { 58301 continue; 58302 } 58303 mod = model[j]; 58304 58305 if (id) { 58306 assigned[j] = found = id + "" === id 58307 ? (ob[id] && (getterNames[id] ? mod[id]() : mod[id]) === ob[id]) 58308 : id(mod, ob); 58309 } 58310 } 58311 if (found) { 58312 mod.merge(ob); 58313 newModArr.push(mod); 58314 } else { 58315 newModArr.push(childOb = vm.map(ob)); 58316 if (parentRef) { 58317 addParentRef(childOb, parentRef, parent); 58318 } 58319 } 58320 } 58321 if ($observable) { 58322 $observable(model).refresh(newModArr, true); 58323 } else { 58324 model.splice.apply(model, [0, model.length].concat(newModArr)); 58325 } 58326 return; 58327 } 58328 iterate(data, function(ob, viewModel, getter, parentRef) { 58329 if (viewModel) { 58330 model[getter]().merge(ob, model, parentRef); // Update typed property 58331 } else if (model[getter]() !== ob) { 58332 model[getter](ob); // Update non-typed property 58333 } 58334 }); 58335 for (prop in data) { 58336 if (prop !== $expando && !getterNames[prop]) { 58337 model[prop] = data[prop]; 58338 } 58339 } 58340 } 58341 58342 function unmap() { 58343 var ob, prop, getterType, arr, value, 58344 k = 0, 58345 model = this; 58346 58347 function unmapArray(modelArr) { 58348 var arr = [], 58349 i = 0, 58350 l = modelArr.length; 58351 for (; i<l; i++) { 58352 arr.push(modelArr[i].unmap()); 58353 } 58354 return arr; 58355 } 58356 58357 if ($isArray(model)) { 58358 return unmapArray(model); 58359 } 58360 ob = {}; 58361 for (; k < getterCount; k++) { 58362 prop = getters[k]; 58363 getterType = undefined; 58364 if (prop + "" !== prop) { 58365 getterType = prop; 58366 prop = getterType.getter; 58367 } 58368 value = model[prop](); 58369 ob[prop] = getterType && value && viewModels[getterType.type] 58370 ? $isArray(value) 58371 ? unmapArray(value) 58372 : value.unmap() 58373 : value; 58374 } 58375 for (prop in model) { 58376 if (model.hasOwnProperty(prop) && (prop.charAt(0) !== "_" || !getterNames[prop.slice(1)]) && prop !== $expando && !$isFunction(model[prop])) { 58377 ob[prop] = model[prop]; 58378 } 58379 } 58380 return ob; 58381 } 58382 58383 JsvVm.prototype = proto; 58384 58385 for (i=0; i < getterCount; i++) { 58386 (function(getter) { 58387 getter = getter.getter || getter; 58388 getterNames[getter] = i+1; 58389 var privField = "_" + getter; 58390 58391 args += (args ? "," : "") + getter; 58392 cnstr += "this." + privField + " = " + getter + ";\n"; 58393 proto[getter] = proto[getter] || function(val) { 58394 if (!arguments.length) { 58395 return this[privField]; // If there is no argument, use as a getter 58396 } 58397 if ($observable) { 58398 $observable(this).setProperty(getter, val); 58399 } else { 58400 this[privField] = val; 58401 } 58402 }; 58403 58404 if ($observable) { 58405 proto[getter].set = proto[getter].set || function(val) { 58406 this[privField] = val; // Setter called by observable property change 58407 }; 58408 } 58409 })(getters[i]); 58410 } 58411 58412 // Constructor for new viewModel instance. 58413 cnstr = new Function(args, cnstr); 58414 58415 constructor = function() { 58416 cnstr.apply(this, arguments); 58417 // Pass additional parentRef str and parent obj to have a parentRef pointer on instance 58418 if (parent = arguments[getterCount + 1]) { 58419 addParentRef(this, arguments[getterCount], parent); 58420 } 58421 }; 58422 58423 constructor.prototype = proto; 58424 proto.constructor = constructor; 58425 58426 vm.map = map; 58427 vm.getters = getters; 58428 vm.extend = extend; 58429 vm.id = id; 58430 return vm; 58431} 58432 58433function tmplObject(markup, options) { 58434 // Template object constructor 58435 var htmlTag, 58436 wrapMap = $subSettingsAdvanced._wm || {}, // Only used in JsViews. Otherwise empty: {} 58437 tmpl = { 58438 tmpls: [], 58439 links: {}, // Compiled functions for link expressions 58440 bnds: [], 58441 _is: "template", 58442 render: renderContent 58443 }; 58444 58445 if (options) { 58446 tmpl = $extend(tmpl, options); 58447 } 58448 58449 tmpl.markup = markup; 58450 if (!tmpl.htmlTag) { 58451 // Set tmpl.tag to the top-level HTML tag used in the template, if any... 58452 htmlTag = rFirstElem.exec(markup); 58453 tmpl.htmlTag = htmlTag ? htmlTag[1].toLowerCase() : ""; 58454 } 58455 htmlTag = wrapMap[tmpl.htmlTag]; 58456 if (htmlTag && htmlTag !== wrapMap.div) { 58457 // When using JsViews, we trim templates which are inserted into HTML contexts where text nodes are not rendered (i.e. not 'Phrasing Content'). 58458 // Currently not trimmed for <li> tag. (Not worth adding perf cost) 58459 tmpl.markup = $.trim(tmpl.markup); 58460 } 58461 58462 return tmpl; 58463} 58464 58465//============== 58466// registerStore 58467//============== 58468 58469/** 58470* Internal. Register a store type (used for template, tags, helpers, converters) 58471*/ 58472function registerStore(storeName, storeSettings) { 58473 58474/** 58475* Generic store() function to register item, named item, or hash of items 58476* Also used as hash to store the registered items 58477* Used as implementation of $.templates(), $.views.templates(), $.views.tags(), $.views.helpers() and $.views.converters() 58478* 58479* @param {string|hash} name name - or selector, in case of $.templates(). Or hash of items 58480* @param {any} [item] (e.g. markup for named template) 58481* @param {template} [parentTmpl] For item being registered as private resource of template 58482* @returns {any|$.views} item, e.g. compiled template - or $.views in case of registering hash of items 58483*/ 58484 function theStore(name, item, parentTmpl) { 58485 // The store is also the function used to add items to the store. e.g. $.templates, or $.views.tags 58486 58487 // For store of name 'thing', Call as: 58488 // $.views.things(items[, parentTmpl]), 58489 // or $.views.things(name[, item, parentTmpl]) 58490 58491 var compile, itemName, thisStore, cnt, 58492 onStore = $sub.onStore[storeName]; 58493 58494 if (name && typeof name === OBJECT && !name.nodeType && !name.markup && !name.getTgt && !(storeName === "viewModel" && name.getters || name.extend)) { 58495 // Call to $.views.things(items[, parentTmpl]), 58496 58497 // Adding items to the store 58498 // If name is a hash, then item is parentTmpl. Iterate over hash and call store for key. 58499 for (itemName in name) { 58500 theStore(itemName, name[itemName], item); 58501 } 58502 return item || $views; 58503 } 58504 // Adding a single unnamed item to the store 58505 if (name && "" + name !== name
vendor: 17,574 bytes, lines 58505-59025
58505) { // name must be a string 58506 parentTmpl = item; 58507 item = name; 58508 name = undefined; 58509 } 58510 thisStore = parentTmpl 58511 ? storeName === "viewModel" 58512 ? parentTmpl 58513 : (parentTmpl[storeNames] = parentTmpl[storeNames] || {}) 58514 : theStore; 58515 compile = storeSettings.compile; 58516 58517 if (item === undefined) { 58518 item = compile ? name : thisStore[name]; 58519 name = undefined; 58520 } 58521 if (item === null) { 58522 // If item is null, delete this entry 58523 if (name) { 58524 delete thisStore[name]; 58525 } 58526 } else { 58527 if (compile) { 58528 item = compile.call(thisStore, name, item, parentTmpl, 0) || {}; 58529 item._is = storeName; // Only do this for compiled objects (tags, templates...) 58530 } 58531 if (name) { 58532 thisStore[name] = item; 58533 } 58534 } 58535 if (onStore) { 58536 // e.g. JsViews integration 58537 onStore(name, item, parentTmpl, compile); 58538 } 58539 return item; 58540 } 58541 58542 var storeNames = storeName + "s"; 58543 $views[storeNames] = theStore; 58544} 58545 58546/** 58547* Add settings such as: 58548* $.views.settings.allowCode(true) 58549* @param {boolean} value 58550* @returns {Settings} 58551* 58552* allowCode = $.views.settings.allowCode() 58553* @returns {boolean} 58554*/ 58555function addSetting(st) { 58556 $viewsSettings[st] = $viewsSettings[st] || function(value) { 58557 return arguments.length 58558 ? ($subSettings[st] = value, $viewsSettings) 58559 : $subSettings[st]; 58560 }; 58561} 58562 58563//======================== 58564// dataMap for render only 58565//======================== 58566 58567function dataMap(mapDef) { 58568 function Map(source, options) { 58569 this.tgt = mapDef.getTgt(source, options); 58570 options.map = this; 58571 } 58572 58573 if ($isFunction(mapDef)) { 58574 // Simple map declared as function 58575 mapDef = { 58576 getTgt: mapDef 58577 }; 58578 } 58579 58580 if (mapDef.baseMap) { 58581 mapDef = $extend($extend({}, mapDef.baseMap), mapDef); 58582 } 58583 58584 mapDef.map = function(source, options) { 58585 return new Map(source, options); 58586 }; 58587 return mapDef; 58588} 58589 58590//============== 58591// renderContent 58592//============== 58593 58594/** Render the template as a string, using the specified data and helpers/context 58595* $("#tmpl").render(), tmpl.render(), tagCtx.render(), $.render.namedTmpl() 58596* 58597* @param {any} data 58598* @param {hash} [context] helpers or context 58599* @param {boolean} [noIteration] 58600* @param {View} [parentView] internal 58601* @param {string} [key] internal 58602* @param {function} [onRender] internal 58603* @returns {string} rendered template internal 58604*/ 58605function renderContent(data, context, noIteration, parentView, key, onRender) { 58606 var i, l, tag, tmpl, tagCtx, isTopRenderCall, prevData, prevIndex, 58607 view = parentView, 58608 result = ""; 58609 58610 if (context === true) { 58611 noIteration = context; // passing boolean as second param - noIteration 58612 context = undefined; 58613 } else if (typeof context !== OBJECT) { 58614 context = undefined; // context must be a boolean (noIteration) or a plain object 58615 } 58616 58617 if (tag = this.tag) { 58618 // This is a call from renderTag or tagCtx.render(...) 58619 tagCtx = this; 58620 view = view || tagCtx.view; 58621 tmpl = view._getTmpl(tag.template || tagCtx.tmpl); 58622 if (!arguments.length) { 58623 data = tag.contentCtx && $isFunction(tag.contentCtx) 58624 ? data = tag.contentCtx(data) 58625 : view; // Default data context for wrapped block content is the first argument 58626 } 58627 } else { 58628 // This is a template.render(...) call 58629 tmpl = this; 58630 } 58631 58632 if (tmpl) { 58633 if (!parentView && data && data._is === "view") { 58634 view = data; // When passing in a view to render or link (and not passing in a parent view) use the passed-in view as parentView 58635 } 58636 58637 if (view && data === view) { 58638 // Inherit the data from the parent view. 58639 data = view.data; 58640 } 58641 58642 isTopRenderCall = !view; 58643 isRenderCall = isRenderCall || isTopRenderCall; 58644 if (isTopRenderCall) { 58645 (context = context || {}).root = data; // Provide ~root as shortcut to top-level data. 58646 } 58647 if (!isRenderCall || $subSettingsAdvanced.useViews || tmpl.useViews || view && view !== topView) { 58648 result = renderWithViews(tmpl, data, context, noIteration, view, key, onRender, tag); 58649 } else { 58650 if (view) { // In a block 58651 prevData = view.data; 58652 prevIndex = view.index; 58653 view.index = indexStr; 58654 } else { 58655 view = topView; 58656 prevData = view.data; 58657 view.data = data; 58658 view.ctx = context; 58659 } 58660 if ($isArray(data) && !noIteration) { 58661 // Create a view for the array, whose child views correspond to each data item. (Note: if key and parentView are passed in 58662 // along with parent view, treat as insert -e.g. from view.addViews - so parentView is already the view item for array) 58663 for (i = 0, l = data.length; i < l; i++) { 58664 view.index = i; 58665 view.data = data[i]; 58666 result += tmpl.fn(data[i], view, $sub); 58667 } 58668 } else { 58669 view.data = data; 58670 result += tmpl.fn(data, view, $sub); 58671 } 58672 view.data = prevData; 58673 view.index = prevIndex; 58674 } 58675 if (isTopRenderCall) { 58676 isRenderCall = undefined; 58677 } 58678 } 58679 return result; 58680} 58681 58682function renderWithViews(tmpl, data, context, noIteration, view, key, onRender, tag) { 58683 // Render template against data as a tree of subviews (nested rendered template instances), or as a string (top-level template). 58684 // If the data is the parent view, treat as noIteration, re-render with the same data context. 58685 // tmpl can be a string (e.g. rendered by a tag.render() method), or a compiled template. 58686 var i, l, newView, childView, itemResult, swapContent, contentTmpl, outerOnRender, tmplName, itemVar, newCtx, tagCtx, noLinking, 58687 result = ""; 58688 58689 if (tag) { 58690 // This is a call from renderTag or tagCtx.render(...) 58691 tmplName = tag.tagName; 58692 tagCtx = tag.tagCtx; 58693 context = context ? extendCtx(context, tag.ctx) : tag.ctx; 58694 58695 if (tmpl === view.content) { // {{xxx tmpl=#content}} 58696 contentTmpl = tmpl !== view.ctx._wrp // We are rendering the #content 58697 ? view.ctx._wrp // #content was the tagCtx.props.tmpl wrapper of the block content - so within this view, #content will now be the view.ctx._wrp block content 58698 : undefined; // #content was the view.ctx._wrp block content - so within this view, there is no longer any #content to wrap. 58699 } else if (tmpl !== tagCtx.content) { 58700 if (tmpl === tag.template) { // Rendering {{tag}} tag.template, replacing block content. 58701 contentTmpl = tagCtx.tmpl; // Set #content to block content (or wrapped block content if tagCtx.props.tmpl is set) 58702 context._wrp = tagCtx.content; // Pass wrapped block content to nested views 58703 } else { // Rendering tagCtx.props.tmpl wrapper 58704 contentTmpl = tagCtx.content || view.content; // Set #content to wrapped block content 58705 } 58706 } else { 58707 contentTmpl = view.content; // Nested views inherit same wrapped #content property 58708 } 58709 58710 if (tagCtx.props.link === false) { 58711 // link=false setting on block tag 58712 // We will override inherited value of link by the explicit setting link=false taken from props 58713 // The child views of an unlinked view are also unlinked. So setting child back to true will not have any effect. 58714 context = context || {}; 58715 context.link = false; 58716 } 58717 } 58718 58719 if (view) { 58720 onRender = onRender || view._.onRender; 58721 noLinking = context && context.link === false; 58722 58723 if (noLinking && view._.nl) { 58724 onRender = undefined; 58725 } 58726 58727 context = extendCtx(context, view.ctx); 58728 tagCtx = !tag && view.tag 58729 ? view.tag.tagCtxs[view.tagElse] 58730 : tagCtx; 58731 } 58732 58733 if (itemVar = tagCtx && tagCtx.props.itemVar) { 58734 if (itemVar[0] !== "~") { 58735 syntaxError("Use itemVar='~myItem'"); 58736 } 58737 itemVar = itemVar.slice(1); 58738 } 58739 58740 if (key === true) { 58741 swapContent = true; 58742 key = 0; 58743 } 58744 58745 // If link===false, do not call onRender, so no data-linking marker nodes 58746 if (onRender && tag && tag._.noVws) { 58747 onRender = undefined; 58748 } 58749 outerOnRender = onRender; 58750 if (onRender === true) { 58751 // Used by view.refresh(). Don't create a new wrapper view. 58752 outerOnRender = undefined; 58753 onRender = view._.onRender; 58754 } 58755 // Set additional context on views created here, (as modified context inherited from the parent, and to be inherited by child views) 58756 context = tmpl.helpers 58757 ? extendCtx(tmpl.helpers, context) 58758 : context; 58759 58760 newCtx = context; 58761 if ($isArray(data) && !noIteration) { 58762 // Create a view for the array, whose child views correspond to each data item. (Note: if key and view are passed in 58763 // along with parent view, treat as insert -e.g. from view.addViews - so view is already the view item for array) 58764 newView = swapContent 58765 ? view 58766 : (key !== undefined && view) 58767 || new View(context, "array", view, data, tmpl, key, onRender, contentTmpl); 58768 newView._.nl= noLinking; 58769 if (view && view._.useKey) { 58770 // Parent is not an 'array view' 58771 newView._.bnd = !tag || tag._.bnd && tag; // For array views that are data bound for collection change events, set the 58772 // view._.bnd property to true for top-level link() or data-link="{for}", or to the tag instance for a data-bound tag, e.g. {^{for ...}} 58773 newView.tag = tag; 58774 } 58775 for (i = 0, l = data.length; i < l; i++) { 58776 // Create a view for each data item. 58777 childView = new View(newCtx, "item", newView, data[i], tmpl, (key || 0) + i, onRender, newView.content); 58778 if (itemVar) { 58779 (childView.ctx = $extend({}, newCtx))[itemVar] = $sub._cp(data[i], "#data", childView); 58780 } 58781 itemResult = tmpl.fn(data[i], childView, $sub); 58782 result += newView._.onRender ? newView._.onRender(itemResult, childView) : itemResult; 58783 } 58784 } else { 58785 // Create a view for singleton data object. The type of the view will be the tag name, e.g. "if" or "mytag" except for 58786 // "item", "array" and "data" views. A "data" view is from programmatic render(object) against a 'singleton'. 58787 newView = swapContent ? view : new View(newCtx, tmplName || "data", view, data, tmpl, key, onRender, contentTmpl); 58788 58789 if (itemVar) { 58790 (newView.ctx = $extend({}, newCtx))[itemVar] = $sub._cp(data, "#data", newView); 58791 } 58792 58793 newView.tag = tag; 58794 newView._.nl = noLinking; 58795 result += tmpl.fn(data, newView, $sub); 58796 } 58797 if (tag) { 58798 newView.tagElse = tagCtx.index; 58799 tagCtx.contentView = newView; 58800 } 58801 return outerOnRender ? outerOnRender(result, newView) : result; 58802} 58803 58804//=========================== 58805// Build and compile template 58806//=========================== 58807 58808// Generate a reusable function that will serve to render a template against data 58809// (Compile AST then build template function) 58810 58811function onRenderError(e, view, fallback) { 58812 var message = fallback !== undefined 58813 ? $isFunction(fallback) 58814 ? fallback.call(view.data, e, view) 58815 : fallback || "" 58816 : "{Error: " + (e.message||e) + "}"; 58817 58818 if ($subSettings.onError && (fallback = $subSettings.onError.call(view.data, e, fallback && message, view)) !== undefined) { 58819 message = fallback; // There is a settings.debugMode(handler) onError override. Call it, and use return value (if any) to replace message 58820 } 58821 return view && !view._lc ? $converters.html(message) : message; // For data-link=\"{... onError=...}"... See onDataLinkedTagChange 58822} 58823 58824function error(message) { 58825 throw new $sub.Err(message); 58826} 58827 58828function syntaxError(message) { 58829 error("Syntax error\n" + message); 58830} 58831 58832function tmplFn(markup, tmpl, isLinkExpr, convertBack, hasElse) { 58833 // Compile markup to AST (abtract syntax tree) then build the template function code from the AST nodes 58834 // Used for compiling templates, and also by JsViews to build functions for data link expressions 58835 58836 //==== nested functions ==== 58837 function pushprecedingContent(shift) { 58838 shift -= loc; 58839 if (shift) { 58840 content.push(markup.substr(loc, shift).replace(rNewLine, "\\n")); 58841 } 58842 } 58843 58844 function blockTagCheck(tagName, block) { 58845 if (tagName) { 58846 tagName += '}}'; 58847 // '{{include}} block has {{/for}} with no open {{for}}' 58848 syntaxError(( 58849 block 58850 ? '{{' + block + '}} block has {{/' + tagName + ' without {{' + tagName 58851 : 'Unmatched or missing {{/' + tagName) + ', in template:\n' + markup); 58852 } 58853 } 58854 58855 function parseTag(all, bind, tagName, converter, colon, html, codeTag, params, slash, bind2, closeBlock, index) { 58856/* 58857 58858 bind tagName cvt cln html code params slash bind2 closeBlk comment 58859/(?:{(\^)?{(?:(\w+(?=[\/\s}]))|(\w+)?(:)|(>)|(\*))\s*((?:[^}]|}(?!}))*?)(\/)?|{(\^)?{(?:(?:\/(\w+))\s*|!--[\s\S]*?--))}}/g 58860 58861(?: 58862 {(\^)?{ bind 58863 (?: 58864 (\w+ tagName 58865 (?=[\/\s}]) 58866 ) 58867 | 58868 (\w+)?(:) converter colon 58869 | 58870 (>) html 58871 | 58872 (\*) codeTag 58873 ) 58874 \s* 58875 ( params 58876 (?:[^}]|}(?!}))*? 58877 ) 58878 (\/)? slash 58879 | 58880 {(\^)?{ bind2 58881 (?: 58882 (?:\/(\w+))\s* closeBlock 58883 | 58884 !--[\s\S]*?-- comment 58885 ) 58886) 58887}}/g 58888 58889*/ 58890 if (codeTag && bind || slash && !tagName || params && params.slice(-1) === ":" || bind2) { 58891 syntaxError(all); 58892 } 58893 58894 // Build abstract syntax tree (AST): [tagName, converter, params, content, hash, bindings, contentMarkup] 58895 if (html) { 58896 colon = ":"; 58897 converter = HTML; 58898 } 58899 slash = slash || isLinkExpr && !hasElse; 58900 58901 var late, openTagName, isLateOb, 58902 pathBindings = (bind || isLinkExpr) && [[]], // pathBindings is an array of arrays for arg bindings and a hash of arrays for prop bindings 58903 props = "", 58904 args = "", 58905 ctxProps = "", 58906 paramsArgs = "", 58907 paramsProps = "", 58908 paramsCtxProps = "", 58909 onError = "", 58910 useTrigger = "", 58911 // Block tag if not self-closing and not {{:}} or {{>}} (special case) and not a data-link expression 58912 block = !slash && !colon; 58913 58914 //==== nested helper function ==== 58915 tagName = tagName || (params = params || "#data", colon); // {{:}} is equivalent to {{:#data}} 58916 pushprecedingContent(index); 58917 loc = index + all.length; // location marker - parsed up to here 58918 if (codeTag) { 58919 if (allowCode) { 58920 content.push(["*", "\n" + params.replace(/^:/, "ret+= ").replace(rUnescapeQuotes, "$1") + ";\n"]); 58921 } 58922 } else if (tagName) { 58923 if (tagName === "else") { 58924 if (rTestElseIf.test(params)) { 58925 syntaxError('For "{{else if expr}}" use "{{else expr}}"'); 58926 } 58927 pathBindings = current[9] && [[]]; 58928 current[10] = markup.substring(current[10], index); // contentMarkup for block tag 58929 openTagName = current[11] || current[0] || syntaxError("Mismatched: " + all); 58930 // current[0] is tagName, but for {{else}} nodes, current[11] is tagName of preceding open tag 58931 current = stack.pop(); 58932 content = current[2]; 58933 block = true; 58934 } 58935 if (params) { 58936 // remove newlines from the params string, to avoid compiled code errors for unterminated strings 58937 parseParams(params.replace(rNewLine, " "), pathBindings, tmpl, isLinkExpr) 58938 .replace(rBuildHash, function(all, onerror, isCtxPrm, key, keyToken, keyValue, arg, param) { 58939 if (key === "this:") { 58940 keyValue = "undefined"; // this=some.path is always a to parameter (one-way), so don't need to compile/evaluate some.path initialization 58941 } 58942 if (param) { 58943 isLateOb = isLateOb || param[0] === "@"; 58944 } 58945 key = "'" + keyToken + "':"; 58946 if (arg) { 58947 args += isCtxPrm + keyValue + ","; 58948 paramsArgs += "'" + param + "',"; 58949 } else if (isCtxPrm) { // Contextual parameter, ~foo=expr 58950 ctxProps += key + 'j._cp(' + keyValue + ',"' + param + '",view),'; 58951 // Compiled code for evaluating tagCtx on a tag will have: ctx:{'foo':j._cp(compiledExpr, "expr", view)} 58952 paramsCtxProps += key + "'" + param + "',"; 58953 } else if (onerror) { 58954 onError += keyValue; 58955 } else { 58956 if (keyToken === "trigger") { 58957 useTrigger += keyValue; 58958 } 58959 if (keyToken === "lateRender") { 58960 late = param !== "false"; // Render after first pass 58961 } 58962 props += key + keyValue + ","; 58963 paramsProps += key + "'" + param + "',"; 58964 hasHandlers = hasHandlers || rHasHandlers.test(keyToken); 58965 } 58966 return ""; 58967 }).slice(0, -1); 58968 } 58969 58970 if (pathBindings && pathBindings[0]) { 58971 pathBindings.pop(); // Remove the binding that was prepared for next arg. (There is always an extra one ready). 58972 } 58973 58974 newNode = [ 58975 tagName, 58976 converter || !!convertBack || hasHandlers || "", 58977 block && [], 58978 parsedParam(paramsArgs || (tagName === ":" ? "'#data'," : ""), paramsProps, paramsCtxProps), // {{:}} equivalent to {{:#data}} 58979 parsedParam(args || (tagName === ":" ? "data," : ""), props, ctxProps), 58980 onError, 58981 useTrigger, 58982 late, 58983 isLateOb, 58984 pathBindings || 0 58985 ]; 58986 content.push(newNode); 58987 if (block) { 58988 stack.push(current); 58989 current = newNode; 58990 current[10] = loc; // Store current location of open tag, to be able to add contentMarkup when we reach closing tag 58991 current[11] = openTagName; // Used for checking syntax (matching close tag) 58992 } 58993 } else if (closeBlock) { 58994 blockTagCheck(closeBlock !== current[0] && closeBlock !== current[11] && closeBlock, current[0]); // Check matching close tag name 58995 current[10] = markup.substring(current[10], index); // contentMarkup for block tag 58996 current = stack.pop(); 58997 } 58998 blockTagCheck(!current && closeBlock); 58999 content = current[2]; 59000 } 59001 //==== /end of nested functions ==== 59002 59003 var i, result, newNode, hasHandlers, bindings, 59004 allowCode = $subSettings.allowCode || tmpl && tmpl.allowCode 59005 || $viewsSettings.allowCode === true, // include direct setting of settings.allowCode true for backward compat only 59006 astTop = [], 59007 loc = 0, 59008 stack = [], 59009 content = astTop, 59010 current = [,,astTop]; 59011 59012 if (allowCode && tmpl._is) { 59013 tmpl.allowCode = allowCode; 59014 } 59015 59016//TODO result = tmplFnsCache[markup]; // Only cache if template is not named and markup length < ..., 59017//and there are no bindings or subtemplates?? Consider standard optimization for data-link="a.b.c" 59018// if (result) { 59019// tmpl.fn = result; 59020// } else { 59021 59022// result = markup; 59023 if (isLinkExpr) { 59024 if (convertBack !== undefined) { 59025 markup = markup.slice(0, -convertBack.length - 2) + delimCloseChar0;
vendor: 6,465 bytes, lines 59025-59195
59025 59026 } 59027 markup = delimOpenChar0 + markup + delimCloseChar1; 59028 } 59029 59030 blockTagCheck(stack[0] && stack[0][2].pop()[0]); 59031 // Build the AST (abstract syntax tree) under astTop 59032 markup.replace(rTag, parseTag); 59033 59034 pushprecedingContent(markup.length); 59035 59036 if (loc = astTop[astTop.length - 1]) { 59037 blockTagCheck("" + loc !== loc && (+loc[10] === loc[10]) && loc[0]); 59038 } 59039// result = tmplFnsCache[markup] = buildCode(astTop, tmpl); 59040// } 59041 59042 if (isLinkExpr) { 59043 result = buildCode(astTop, markup, isLinkExpr); 59044 bindings = []; 59045 i = astTop.length; 59046 while (i--) { 59047 bindings.unshift(astTop[i][9]); // With data-link expressions, pathBindings array for tagCtx[i] is astTop[i][9] 59048 } 59049 setPaths(result, bindings); 59050 } else { 59051 result = buildCode(astTop, tmpl); 59052 } 59053 return result; 59054} 59055 59056function setPaths(fn, pathsArr) { 59057 var key, paths, 59058 i = 0, 59059 l = pathsArr.length; 59060 fn.deps = []; 59061 fn.paths = []; // The array of path binding (array/dictionary)s for each tag/else block's args and props 59062 for (; i < l; i++) { 59063 fn.paths.push(paths = pathsArr[i]); 59064 for (key in paths) { 59065 if (key !== "_jsvto" && paths.hasOwnProperty(key) && paths[key].length && !paths[key].skp) { 59066 fn.deps = fn.deps.concat(paths[key]); // deps is the concatenation of the paths arrays for the different bindings 59067 } 59068 } 59069 } 59070} 59071 59072function parsedParam(args, props, ctx) { 59073 return [args.slice(0, -1), props.slice(0, -1), ctx.slice(0, -1)]; 59074} 59075 59076function paramStructure(paramCode, paramVals) { 59077 return '\n\tparams:{args:[' + paramCode[0] + '],\n\tprops:{' + paramCode[1] + '}' 59078 + (paramCode[2] ? ',\n\tctx:{' + paramCode[2] + '}' : "") 59079 + '},\n\targs:[' + paramVals[0] + '],\n\tprops:{' + paramVals[1] + '}' 59080 + (paramVals[2] ? ',\n\tctx:{' + paramVals[2] + '}' : ""); 59081} 59082 59083function parseParams(params, pathBindings, tmpl, isLinkExpr) { 59084 59085 function parseTokens(all, lftPrn0, lftPrn, bound, path, operator, err, eq, path2, late, prn, 59086 comma, lftPrn2, apos, quot, rtPrn, rtPrnDot, prn2, space, index, full) { 59087 // /(\()(?=\s*\()|(?:([([])\s*)?(?:(\^?)(~?[\w$.^]+)?\s*((\+\+|--)|\+|-|~(?![\w$])|&&|\|\||===|!==|==|!=|<=|>=|[<>%*:?\/]|(=))\s*|(!*?(@)?[#~]?[\w$.^]+)([([])?)|(,\s*)|(?:(\()\s*)?\\?(?:(')|("))|(?:\s*(([)\]])(?=[.^]|\s*$|[^([])|[)\]])([([]?))|(\s+)/g, 59088 //lftPrn0 lftPrn bound path operator err eq path2 late prn comma lftPrn2 apos quot rtPrn rtPrnDot prn2 space 59089 // (left paren? followed by (path? followed by operator) or (path followed by paren?)) or comma or apos or quot or right paren or space 59090 59091 function parsePath(allPath, not, object, helper, view, viewProperty, pathTokens, leafToken) { 59092 // /^(!*?)(?:null|true|false|\d[\d.]*|([\w$]+|\.|~([\w$]+)|#(view|([\w$]+))?)([\w$.^]*?)(?:[.[^]([\w$]+)\]?)?)$/g, 59093 // not object helper view viewProperty pathTokens leafToken 59094 subPath = object === "."; 59095 if (object) { 59096 path = path.slice(not.length); 59097 if (/^\.?constructor$/.test(leafToken||path)) { 59098 syntaxError(allPath); 59099 } 59100 if (!subPath) { 59101 allPath = (late // late path @a.b.c: not throw on 'property of undefined' if a undefined, and will use _getOb() after linking to resolve late. 59102 ? (isLinkExpr ? '' : '(ltOb.lt=ltOb.lt||') + '(ob=' 59103 : "" 59104 ) 59105 + (helper 59106 ? 'view.ctxPrm("' + helper + '")' 59107 : view 59108 ? "view" 59109 : "data") 59110 + (late 59111 ? ')===undefined' + (isLinkExpr ? '' : ')') + '?"":view._getOb(ob,"' 59112 : "" 59113 ) 59114 + (leafToken 59115 ? (viewProperty 59116 ? "." + viewProperty 59117 : helper 59118 ? "" 59119 : (view ? "" : "." + object) 59120 ) + (pathTokens || "") 59121 : (leafToken = helper ? "" : view ? viewProperty || "" : object, "")); 59122 allPath = allPath + (leafToken ? "." + leafToken : ""); 59123 59124 allPath = not + (allPath.slice(0, 9) === "view.data" 59125 ? allPath.slice(5) // convert #view.data... to data... 59126 : allPath) 59127 + (late 59128 ? (isLinkExpr ? '"': '",ltOb') + (prn ? ',1)':')') 59129 : "" 59130 ); 59131 } 59132 if (bindings) { 59133 binds = named === "_linkTo" ? (bindto = pathBindings._jsvto = pathBindings._jsvto || []) : bndCtx.bd; 59134 if (theOb = subPath && binds[binds.length-1]) { 59135 if (theOb._cpfn) { // Computed property exprOb 59136 while (theOb.sb) { 59137 theOb = theOb.sb; 59138 } 59139 if (theOb.prm) { 59140 if (theOb.bnd) { 59141 path = "^" + path.slice(1); 59142 } 59143 theOb.sb = path; 59144 theOb.bnd = theOb.bnd || path[0] === "^"; 59145 } 59146 } 59147 } else { 59148 binds.push(path); 59149 } 59150 if (prn && !subPath) { 59151 pathStart[fnDp] = ind; 59152 compiledPathStart[fnDp] = compiledPath[fnDp].length; 59153 } 59154 } 59155 } 59156 return allPath; 59157 } 59158 59159 //bound = bindings && bound; 59160 if (bound && !eq) { 59161 path = bound + path; // e.g. some.fn(...)^some.path - so here path is "^some.path" 59162 } 59163 operator = operator || ""; 59164 lftPrn2 = lftPrn2 || ""; 59165 lftPrn = lftPrn || lftPrn0 || lftPrn2; 59166 path = path || path2; 59167 59168 if (late && (late = !/\)|]/.test(full[index-1]))) { 59169 path = path.slice(1).split(".").join("^"); // Late path @z.b.c. Use "^" rather than "." to ensure that deep binding will be used 59170 } 59171 // Could do this - but not worth perf cost?? :- 59172 // if (!path.lastIndexOf("#data.", 0)) { path = path.slice(6); } // If path starts with "#data.", remove that. 59173 prn = prn || prn2 || ""; 59174 var expr, binds, theOb, newOb, subPath, lftPrnFCall, ret, 59175 ind = index; 59176 59177 if (!aposed && !quoted) { 59178 if (err) { 59179 syntaxError(params); 59180 } 59181 if (rtPrnDot && bindings) { 59182 // This is a binding to a path in which an object is returned by a helper/data function/expression, e.g. foo()^x.y or (a?b:c)^x.y 59183 // We create a compiled function to get the object instance (which will be called when the dependent data of the subexpression changes, 59184 // to return the new object, and trigger re-binding of the subsequent path) 59185 expr = pathStart[fnDp-1]; 59186 if (full.length - 1 > ind - (expr || 0)) { // We need to compile a subexpression 59187 expr = $.trim(full.slice(expr, ind + all.length)); 59188 binds = bindto || bndStack[fnDp-1].bd; 59189 // Insert exprOb object, to be used during binding to return the computed object 59190 theOb = binds[binds.length-1]; 59191 if (theOb && theOb.prm) { 59192 while (theOb.sb && theOb.sb.prm) { 59193 theOb = theOb.sb; 59194 } 59195 newOb = theOb.sb = {path: theOb.sb, bnd: theOb.bnd};
vendor: 6,672 bytes, lines 59195-59379
59195 59196 } else { 59197 binds.push(newOb = {path: binds.pop()}); // Insert exprOb object, to be used during binding to return the computed object 59198 } 59199 if (theOb && theOb.sb === newOb) { 59200 compiledPath[fnDp] = compiledPath[fnDp-1].slice(theOb._cpPthSt) + compiledPath[fnDp]; 59201 compiledPath[fnDp-1] = compiledPath[fnDp-1].slice(0, theOb._cpPthSt); 59202 } 59203 newOb._cpPthSt = compiledPathStart[fnDp-1]; 59204 newOb._cpKey = expr; 59205 59206 compiledPath[fnDp] += full.slice(prevIndex, index); 59207 prevIndex = index; 59208 59209 newOb._cpfn = cpFnStore[expr] = cpFnStore[expr] || // Compiled function for computed value: get from store, or compile and store 59210 new Function("data,view,j", // Compiled function for computed value in template 59211 "//" + expr + "\nvar v;\nreturn ((v=" + compiledPath[fnDp] + (rtPrn === "]" ? ")]" : rtPrn) + ")!=null?v:null);"); 59212 59213 compiledPath[fnDp-1] += (fnCall[prnDp] && $subSettingsAdvanced.cache ? "view.getCache(\"" + expr.replace(rEscapeQuotes, "\\$&") + "\"" : compiledPath[fnDp]); 59214 59215 newOb.prm = bndCtx.bd; 59216 newOb.bnd = newOb.bnd || newOb.path && newOb.path.indexOf("^") >= 0; 59217 } 59218 compiledPath[fnDp] = ""; 59219 } 59220 if (prn === "[") { 59221 prn = "[j._sq("; 59222 } 59223 if (lftPrn === "[") { 59224 lftPrn = "[j._sq("; 59225 } 59226 } 59227 ret = (aposed 59228 // within single-quoted string 59229 ? (aposed = !apos, (aposed ? all : lftPrn2 + '"')) 59230 : quoted 59231 // within double-quoted string 59232 ? (quoted = !quot, (quoted ? all : lftPrn2 + '"')) 59233 : 59234 ( 59235 (lftPrn 59236 ? ( 59237 prnStack[++prnDp] = true, 59238 prnInd[prnDp] = 0, 59239 bindings && ( 59240 pathStart[fnDp++] = ind++, 59241 bndCtx = bndStack[fnDp] = {bd: []}, 59242 compiledPath[fnDp] = "", 59243 compiledPathStart[fnDp] = 1 59244 ), 59245 lftPrn) // Left paren, (not a function call paren) 59246 : "") 59247 + (space 59248 ? (prnDp 59249 ? "" // A space within parens or within function call parens, so not a separator for tag args 59250 // New arg or prop - so insert backspace \b (\x08) as separator for named params, used subsequently by rBuildHash, and prepare new bindings array 59251 : (paramIndex = full.slice(paramIndex, ind), named 59252 ? (named = boundName = bindto = false, "\b") 59253 : "\b,") + paramIndex + (paramIndex = ind + all.length, bindings && pathBindings.push(bndCtx.bd = []), "\b") 59254 ) 59255 : eq 59256 // named param. Remove bindings for arg and create instead bindings array for prop 59257 ? (fnDp && syntaxError(params), bindings && pathBindings.pop(), named = "_" + path, boundName = bound, paramIndex = ind + all.length, 59258 bindings && ((bindings = bndCtx.bd = pathBindings[named] = []), bindings.skp = !bound), path + ':') 59259 : path 59260 // path 59261 ? (path.split("^").join(".").replace($sub.rPath, parsePath) 59262 + (prn || operator) 59263 ) 59264 : operator 59265 // operator 59266 ? operator 59267 : rtPrn 59268 // function 59269 ? rtPrn === "]" ? ")]" : ")" 59270 : comma 59271 ? (fnCall[prnDp] || syntaxError(params), ",") // We don't allow top-level literal arrays or objects 59272 : lftPrn0 59273 ? "" 59274 : (aposed = apos, quoted = quot, '"') 59275 )) 59276 ); 59277 59278 if (!aposed && !quoted) { 59279 if (rtPrn) { 59280 fnCall[prnDp] = false; 59281 prnDp--; 59282 } 59283 } 59284 59285 if (bindings) { 59286 if (!aposed && !quoted) { 59287 if (rtPrn) { 59288 if (prnStack[prnDp+1]) { 59289 bndCtx = bndStack[--fnDp]; 59290 prnStack[prnDp+1] = false; 59291 } 59292 prnStart = prnInd[prnDp+1]; 59293 } 59294 if (prn) { 59295 prnInd[prnDp+1] = compiledPath[fnDp].length + (lftPrn ? 1 : 0); 59296 if (path || rtPrn) { 59297 bndCtx = bndStack[++fnDp] = {bd: []}; 59298 prnStack[prnDp+1] = true; 59299 } 59300 } 59301 } 59302 59303 compiledPath[fnDp] = (compiledPath[fnDp]||"") + full.slice(prevIndex, index); 59304 prevIndex = index+all.length; 59305 59306 if (!aposed && !quoted) { 59307 if (lftPrnFCall = lftPrn && prnStack[prnDp+1]) { 59308 compiledPath[fnDp-1] += lftPrn; 59309 compiledPathStart[fnDp-1]++; 59310 } 59311 if (prn === "(" && subPath && !newOb) { 59312 compiledPath[fnDp] = compiledPath[fnDp-1].slice(prnStart) + compiledPath[fnDp]; 59313 compiledPath[fnDp-1] = compiledPath[fnDp-1].slice(0, prnStart); 59314 } 59315 } 59316 compiledPath[fnDp] += lftPrnFCall ? ret.slice(1) : ret; 59317 } 59318 59319 if (!aposed && !quoted && prn) { 59320 prnDp++; 59321 if (path && prn === "(") { 59322 fnCall[prnDp] = true; 59323 } 59324 } 59325 59326 if (!aposed && !quoted && prn2) { 59327 if (bindings) { 59328 compiledPath[fnDp] += prn; 59329 } 59330 ret += prn; 59331 } 59332 return ret; 59333 } 59334 59335 var named, bindto, boundName, result, 59336 quoted, // boolean for string content in double quotes 59337 aposed, // or in single quotes 59338 bindings = pathBindings && pathBindings[0], // bindings array for the first arg 59339 bndCtx = {bd: bindings}, 59340 bndStack = {0: bndCtx}, 59341 paramIndex = 0, // list, 59342 // The following are used for tracking path parsing including nested paths, such as "a.b(c^d + (e))^f", and chained computed paths such as 59343 // "a.b().c^d().e.f().g" - which has four chained paths, "a.b()", "^c.d()", ".e.f()" and ".g" 59344 prnDp = 0, // For tracking paren depth (not function call parens) 59345 fnDp = 0, // For tracking depth of function call parens 59346 prnInd = {}, // We are in a function call 59347 prnStart = 0, // tracks the start of the current path such as c^d() in the above example 59348 prnStack = {}, // tracks parens which are not function calls, and so are associated with new bndStack contexts 59349 fnCall = {}, // We are in a function call 59350 pathStart = {},// tracks the start of the current path such as c^d() in the above example 59351 compiledPathStart = {0: 0}, 59352 compiledPath = {0:""}, 59353 prevIndex = 0; 59354 59355 if (params[0] === "@") { 59356 params = params.replace(rBracketQuote, "."); 59357 } 59358 result = (params + (tmpl ? " " : "")).replace($sub.rPrm, parseTokens); 59359 59360 if (bindings) { 59361 result = compiledPath[0]; 59362 } 59363 59364 return !prnDp && result || syntaxError(params); // Syntax error if unbalanced parens in params expression 59365} 59366 59367function buildCode(ast, tmpl, isLinkExpr) { 59368 // Build the template function code from the AST nodes, and set as property on the passed-in template object 59369 // Used for compiling templates, and also by JsViews to build functions for data link expressions 59370 var i, node, tagName, converter, tagCtx, hasTag, hasEncoder, getsVal, hasCnvt, useCnvt, tmplBindings, pathBindings, params, boundOnErrStart, 59371 boundOnErrEnd, tagRender, nestedTmpls, tmplName, nestedTmpl, tagAndElses, content, markup, nextIsElse, oldCode, isElse, isGetVal, tagCtxFn, 59372 onError, tagStart, trigger, lateRender, retStrOpen, retStrClose, 59373 tmplBindingKey = 0, 59374 useViews = $subSettingsAdvanced.useViews || tmpl.useViews || tmpl.tags || tmpl.templates || tmpl.helpers || tmpl.converters, 59375 code = "", 59376 tmplOptions = {}, 59377 l = ast.length; 59378 59379 if (
vendor: 15,697 bytes, lines 59379-59806
59379"" + tmpl === tmpl) { 59380 tmplName = isLinkExpr ? 'data-link="' + tmpl.replace(rNewLine, " ").slice(1, -1) + '"' : tmpl; 59381 tmpl = 0; 59382 } else { 59383 tmplName = tmpl.tmplName || "unnamed"; 59384 if (tmpl.allowCode) { 59385 tmplOptions.allowCode = true; 59386 } 59387 if (tmpl.debug) { 59388 tmplOptions.debug = true; 59389 } 59390 tmplBindings = tmpl.bnds; 59391 nestedTmpls = tmpl.tmpls; 59392 } 59393 for (i = 0; i < l; i++) { 59394 // AST nodes: [0: tagName, 1: converter, 2: content, 3: params, 4: code, 5: onError, 6: trigger, 7:pathBindings, 8: contentMarkup] 59395 node = ast[i]; 59396 59397 // Add newline for each callout to t() c() etc. and each markup string 59398 if ("" + node === node) { 59399 // a markup string to be inserted 59400 code += '+"' + node + '"'; 59401 } else { 59402 // a compiled tag expression to be inserted 59403 tagName = node[0]; 59404 if (tagName === "*") { 59405 // Code tag: {{* }} 59406 code += ";\n" + node[1] + "\nret=ret"; 59407 } else { 59408 converter = node[1]; 59409 content = !isLinkExpr && node[2]; 59410 tagCtx = paramStructure(node[3], params = node[4]); 59411 trigger = node[6]; 59412 lateRender = node[7]; 59413 if (node[8]) { // latePath @a.b.c or @~a.b.c 59414 retStrOpen = "\nvar ob,ltOb={},ctxs="; 59415 retStrClose = ";\nctxs.lt=ltOb.lt;\nreturn ctxs;"; 59416 } else { 59417 retStrOpen = "\nreturn "; 59418 retStrClose = ""; 59419 } 59420 markup = node[10] && node[10].replace(rUnescapeQuotes, "$1"); 59421 if (isElse = tagName === "else") { 59422 if (pathBindings) { 59423 pathBindings.push(node[9]); 59424 } 59425 } else { 59426 onError = node[5] || $subSettings.debugMode !== false && "undefined"; // If debugMode not false, set default onError handler on tag to "undefined" (see onRenderError) 59427 if (tmplBindings && (pathBindings = node[9])) { // Array of paths, or false if not data-bound 59428 pathBindings = [pathBindings]; 59429 tmplBindingKey = tmplBindings.push(1); // Add placeholder in tmplBindings for compiled function 59430 } 59431 } 59432 useViews = useViews || params[1] || params[2] || pathBindings || /view.(?!index)/.test(params[0]); 59433 // useViews is for perf optimization. For render() we only use views if necessary - for the more advanced scenarios. 59434 // We use views if there are props, contextual properties or args with #... (other than #index) - but you can force 59435 // using the full view infrastructure, (and pay a perf price) by opting in: Set useViews: true on the template, manually... 59436 if (isGetVal = tagName === ":") { 59437 if (converter) { 59438 tagName = converter === HTML ? ">" : converter + tagName; 59439 } 59440 } else { 59441 if (content) { // TODO optimize - if content.length === 0 or if there is a tmpl="..." specified - set content to null / don't run this compilation code - since content won't get used!! 59442 // Create template object for nested template 59443 nestedTmpl = tmplObject(markup, tmplOptions); 59444 nestedTmpl.tmplName = tmplName + "/" + tagName; 59445 // Compile to AST and then to compiled function 59446 nestedTmpl.useViews = nestedTmpl.useViews || useViews; 59447 buildCode(content, nestedTmpl); 59448 useViews = nestedTmpl.useViews; 59449 nestedTmpls.push(nestedTmpl); 59450 } 59451 59452 if (!isElse) { 59453 // This is not an else tag. 59454 tagAndElses = tagName; 59455 useViews = useViews || tagName && (!$tags[tagName] || !$tags[tagName].flow); 59456 // Switch to a new code string for this bound tag (and its elses, if it has any) - for returning the tagCtxs array 59457 oldCode = code; 59458 code = ""; 59459 } 59460 nextIsElse = ast[i + 1]; 59461 nextIsElse = nextIsElse && nextIsElse[0] === "else"; 59462 } 59463 tagStart = onError ? ";\ntry{\nret+=" : "\n+"; 59464 boundOnErrStart = ""; 59465 boundOnErrEnd = ""; 59466 59467 if (isGetVal && (pathBindings || trigger || converter && converter !== HTML || lateRender)) { 59468 // For convertVal we need a compiled function to return the new tagCtx(s) 59469 tagCtxFn = new Function("data,view,j", "// " + tmplName + " " + (++tmplBindingKey) + " " + tagName 59470 + retStrOpen + "{" + tagCtx + "};" + retStrClose); 59471 tagCtxFn._er = onError; 59472 tagCtxFn._tag = tagName; 59473 tagCtxFn._bd = !!pathBindings; // data-linked tag {^{.../}} 59474 tagCtxFn._lr = lateRender; 59475 59476 if (isLinkExpr) { 59477 return tagCtxFn; 59478 } 59479 59480 setPaths(tagCtxFn, pathBindings); 59481 tagRender = 'c("' + converter + '",view,'; 59482 useCnvt = true; 59483 boundOnErrStart = tagRender + tmplBindingKey + ","; 59484 boundOnErrEnd = ")"; 59485 } 59486 code += (isGetVal 59487 ? (isLinkExpr ? (onError ? "try{\n" : "") + "return " : tagStart) + (useCnvt // Call _cnvt if there is a converter: {{cnvt: ... }} or {^{cnvt: ... }} 59488 ? (useCnvt = undefined, useViews = hasCnvt = true, tagRender + (tagCtxFn 59489 ? ((tmplBindings[tmplBindingKey - 1] = tagCtxFn), tmplBindingKey) // Store the compiled tagCtxFn in tmpl.bnds, and pass the key to convertVal() 59490 : "{" + tagCtx + "}") + ")") 59491 : tagName === ">" 59492 ? (hasEncoder = true, "h(" + params[0] + ")") 59493 : (getsVal = true, "((v=" + params[0] + ')!=null?v:' + (isLinkExpr ? 'null)' : '"")')) 59494 // Non strict equality so data-link="title{:expr}" with expr=null/undefined removes title attribute 59495 ) 59496 : (hasTag = true, "\n{view:view,content:false,tmpl:" // Add this tagCtx to the compiled code for the tagCtxs to be passed to renderTag() 59497 + (content ? nestedTmpls.length : "false") + "," // For block tags, pass in the key (nestedTmpls.length) to the nested content template 59498 + tagCtx + "},")); 59499 59500 if (tagAndElses && !nextIsElse) { 59501 // This is a data-link expression or an inline tag without any elses, or the last {{else}} of an inline tag 59502 // We complete the code for returning the tagCtxs array 59503 code = "[" + code.slice(0, -1) + "]"; 59504 tagRender = 't("' + tagAndElses + '",view,this,'; 59505 if (isLinkExpr || pathBindings) { 59506 // This is a bound tag (data-link expression or inline bound tag {^{tag ...}}) so we store a compiled tagCtxs function in tmp.bnds 59507 code = new Function("data,view,j", " // " + tmplName + " " + tmplBindingKey + " " + tagAndElses + retStrOpen + code 59508 + retStrClose); 59509 code._er = onError; 59510 code._tag = tagAndElses; 59511 if (pathBindings) { 59512 setPaths(tmplBindings[tmplBindingKey - 1] = code, pathBindings); 59513 } 59514 code._lr = lateRender; 59515 if (isLinkExpr) { 59516 return code; // For a data-link expression we return the compiled tagCtxs function 59517 } 59518 boundOnErrStart = tagRender + tmplBindingKey + ",undefined,"; 59519 boundOnErrEnd = ")"; 59520 } 59521 59522 // This is the last {{else}} for an inline tag. 59523 // For a bound tag, pass the tagCtxs fn lookup key to renderTag. 59524 // For an unbound tag, include the code directly for evaluating tagCtxs array 59525 code = oldCode + tagStart + tagRender + (pathBindings && tmplBindingKey || code) + ")"; 59526 pathBindings = 0; 59527 tagAndElses = 0; 59528 } 59529 if (onError && !nextIsElse) { 59530 useViews = true; 59531 code += ';\n}catch(e){ret' + (isLinkExpr ? "urn " : "+=") + boundOnErrStart + 'j._err(e,view,' + onError + ')' + boundOnErrEnd + ';}' + (isLinkExpr ? "" : '\nret=ret'); 59532 } 59533 } 59534 } 59535 } 59536 // Include only the var references that are needed in the code 59537 code = "// " + tmplName 59538 + (tmplOptions.debug ? "\ndebugger;" : "") 59539 + "\nvar v" 59540 + (hasTag ? ",t=j._tag" : "") // has tag 59541 + (hasCnvt ? ",c=j._cnvt" : "") // converter 59542 + (hasEncoder ? ",h=j._html" : "") // html converter 59543 + (isLinkExpr 59544 ? (node[8] // late @... path? 59545 ? ", ob" 59546 : "" 59547 ) + ";\n" 59548 : ',ret=""') 59549 + code 59550 + (isLinkExpr ? "\n" : ";\nreturn ret;"); 59551 59552 try { 59553 code = new Function("data,view,j", code); 59554 } catch (e) { 59555 syntaxError("Compiled template code:\n\n" + code + '\n: "' + (e.message||e) + '"'); 59556 } 59557 if (tmpl) { 59558 tmpl.fn = code; 59559 tmpl.useViews = !!useViews; 59560 } 59561 return code; 59562} 59563 59564//========== 59565// Utilities 59566//========== 59567 59568// Merge objects, in particular contexts which inherit from parent contexts 59569function extendCtx(context, parentContext) { 59570 // Return copy of parentContext, unless context is defined and is different, in which case return a new merged context 59571 // If neither context nor parentContext are defined, return undefined 59572 return context && context !== parentContext 59573 ? (parentContext 59574 ? $extend($extend({}, parentContext), context) 59575 : context) 59576 : parentContext && $extend({}, parentContext); 59577} 59578 59579function getTargetProps(source, tagCtx) { 59580 // this pointer is theMap - which has tagCtx.props too 59581 // arguments: tagCtx.args. 59582 var key, prop, 59583 map = tagCtx.map, 59584 propsArr = map && map.propsArr; 59585 59586 if (!propsArr) { // map.propsArr is the full array of {key:..., prop:...} objects 59587 propsArr = []; 59588 if (typeof source === OBJECT || $isFunction(source)) { 59589 for (key in source) { 59590 prop = source[key]; 59591 if (key !== $expando && source.hasOwnProperty(key) && (!tagCtx.props.noFunctions || !$.isFunction(prop))) { 59592 propsArr.push({key: key, prop: prop}); 59593 } 59594 } 59595 } 59596 if (map) { 59597 map.propsArr = map.options && propsArr; // If bound {^{props}} and not isRenderCall, store propsArr on map (map.options is defined only for bound, && !isRenderCall) 59598 } 59599 } 59600 return getTargetSorted(propsArr, tagCtx); // Obtains map.tgt, by filtering, sorting and splicing the full propsArr 59601} 59602 59603function getTargetSorted(value, tagCtx) { 59604 // getTgt 59605 var mapped, start, end, 59606 tag = tagCtx.tag, 59607 props = tagCtx.props, 59608 propParams = tagCtx.params.props, 59609 filter = props.filter, 59610 sort = props.sort, 59611 directSort = sort === true, 59612 step = parseInt(props.step), 59613 reverse = props.reverse ? -1 : 1; 59614 59615 if (!$isArray(value)) { 59616 return value; 59617 } 59618 if (directSort || sort && "" + sort === sort) { 59619 // Temporary mapped array holds objects with index and sort-value 59620 mapped = value.map(function(item, i) { 59621 item = directSort ? item : getPathObject(item, sort); 59622 return {i: i, v: "" + item === item ? item.toLowerCase() : item}; 59623 }); 59624 // Sort mapped array 59625 mapped.sort(function(a, b) { 59626 return a.v > b.v ? reverse : a.v < b.v ? -reverse : 0; 59627 }); 59628 // Map to new array with resulting order 59629 value = mapped.map(function(item){ 59630 return value[item.i]; 59631 }); 59632 } else if ((sort || reverse < 0) && !tag.dataMap) { 59633 value = value.slice(); // Clone array first if not already a new array 59634 } 59635 if ($isFunction(sort)) { 59636 value = value.sort(function() { // Wrap the sort function to provide tagCtx as 'this' pointer 59637 return sort.apply(tagCtx, arguments); 59638 }); 59639 } 59640 if (reverse < 0 && (!sort || $isFunction(sort))) { // Reverse result if not already reversed in sort 59641 value = value.reverse(); 59642 } 59643 59644 if (value.filter && filter) { // IE8 does not support filter 59645 value = value.filter(filter, tagCtx); 59646 if (tagCtx.tag.onFilter) { 59647 tagCtx.tag.onFilter(tagCtx); 59648 } 59649 } 59650 59651 if (propParams.sorted) { 59652 mapped = (sort || reverse < 0) ? value : value.slice(); 59653 if (tag.sorted) { 59654 $.observable(tag.sorted).refresh(mapped); // Note that this might cause the start and end props to be modified - e.g. by pager tag control 59655 } else { 59656 tagCtx.map.sorted = mapped; 59657 } 59658 } 59659 59660 start = props.start; // Get current value - after possible changes triggered by tag.sorted refresh() above 59661 end = props.end; 59662 if (propParams.start && start === undefined || propParams.end && end === undefined) { 59663 start = end = 0; 59664 } 59665 if (!isNaN(start) || !isNaN(end)) { // start or end specified, but not the auto-create Number array scenario of {{for start=xxx end=yyy}} 59666 start = +start || 0; 59667 end = end === undefined || end > value.length ? value.length : +end; 59668 value = value.slice(start, end); 59669 } 59670 if (step > 1) { 59671 start = 0; 59672 end = value.length; 59673 mapped = []; 59674 for (; start<end; start+=step) { 59675 mapped.push(value[start]); 59676 } 59677 value = mapped; 59678 } 59679 if (propParams.paged && tag.paged) { 59680 $observable(tag.paged).refresh(value); 59681 } 59682 59683 return value; 59684} 59685 59686/** Render the template as a string, using the specified data and helpers/context 59687* $("#tmpl").render() 59688* 59689* @param {any} data 59690* @param {hash} [helpersOrContext] 59691* @param {boolean} [noIteration] 59692* @returns {string} rendered template 59693*/ 59694function $fnRender(data, context, noIteration) { 59695 var tmplElem = this.jquery && (this[0] || error('Unknown template')), // Targeted element not found for jQuery template selector such as "#myTmpl" 59696 tmpl = tmplElem.getAttribute(tmplAttr); 59697 59698 return renderContent.call(tmpl && $.data(tmplElem)[jsvTmpl] || $templates(tmplElem), 59699 data, context, noIteration); 59700} 59701 59702//========================== Register converters ========================== 59703 59704function getCharEntity(ch) { 59705 // Get character entity for HTML, Attribute and optional data encoding 59706 return charEntities[ch] || (charEntities[ch] = "&#" + ch.charCodeAt(0) + ";"); 59707} 59708 59709function getCharFromEntity(match, token) { 59710 // Get character from HTML entity, for optional data unencoding 59711 return charsFromEntities[token] || ""; 59712} 59713 59714function htmlEncode(text) { 59715 // HTML encode: Replace < > & ' " ` etc. by corresponding entities. 59716 return text != undefined ? rIsHtml.test(text) && ("" + text).replace(rHtmlEncode, getCharEntity) || text : ""; 59717} 59718 59719function dataEncode(text) { 59720 // Encode just < > and & - intended for 'safe data' along with {{:}} rather than {{>}} 59721 return "" + text === text ? text.replace(rDataEncode, getCharEntity) : text; 59722} 59723 59724function dataUnencode(text) { 59725 // Unencode just < > and & - intended for 'safe data' along with {{:}} rather than {{>}} 59726 return "" + text === text ? text.replace(rDataUnencode, getCharFromEntity) : text; 59727} 59728 59729//========================== Initialize ========================== 59730 59731$sub = $views.sub; 59732$viewsSettings = $views.settings; 59733 59734if (!(jsr || $ && $.render)) { 59735 // JsRender/JsViews not already loaded (or loaded without jQuery, and we are now moving from jsrender namespace to jQuery namepace) 59736 for (jsvStoreName in jsvStores) { 59737 registerStore(jsvStoreName, jsvStores[jsvStoreName]); 59738 } 59739 59740 $converters = $views.converters; 59741 $helpers = $views.helpers; 59742 $tags = $views.tags; 59743 59744 $sub._tg.prototype = { 59745 baseApply: baseApply, 59746 cvtArgs: convertArgs, 59747 bndArgs: convertBoundArgs, 59748 ctxPrm: contextParameter 59749 }; 59750 59751 topView = $sub.topView = new View(); 59752 59753 //BROWSER-SPECIFIC CODE 59754 if ($) { 59755 59756 //////////////////////////////////////////////////////////////////////////////////////////////// 59757 // jQuery (= $) is loaded 59758 59759 $.fn.render = $fnRender; 59760 $expando = $.expando; 59761 if ($.observable) { 59762 if (versionNumber !== (versionNumber = $.views.jsviews)) { 59763 // Different version of jsRender was loaded 59764 throw "jquery.observable.js requires jsrender.js " + versionNumber; 59765 } 59766 $extend($sub, $.views.sub); // jquery.observable.js was loaded before jsrender.js 59767 $views.map = $.views.map; 59768 } 59769 59770 } else { 59771 //////////////////////////////////////////////////////////////////////////////////////////////// 59772 // jQuery is not loaded. 59773 59774 $ = {}; 59775 59776 if (setGlobals) { 59777 global.jsrender = $; // We are loading jsrender.js from a script element, not AMD or CommonJS, so set global 59778 } 59779 59780 // Error warning if jsrender.js is used as template engine on Node.js (e.g. Express or Hapi...) 59781 // Use jsrender-node.js instead... 59782 $.renderFile = $.__express = $.compile = function() { throw "Node.js: use npm jsrender, or jsrender-node.js"; }; 59783 59784 //END BROWSER-SPECIFIC CODE 59785 $.isFunction = function(ob) { 59786 return typeof ob === "function"; 59787 }; 59788 59789 $.isArray = Array.isArray || function(obj) { 59790 return ({}.toString).call(obj) === "[object Array]"; 59791 }; 59792 59793 $sub._jq = function(jq) { // private method to move from JsRender APIs from jsrender namespace to jQuery namespace 59794 if (jq !== $) { 59795 $extend(jq, $); // map over from jsrender namespace to jQuery namespace 59796 $ = jq; 59797 $.fn.render = $fnRender; 59798 delete $.jsrender; 59799 $expando = $.expando; 59800 } 59801 }; 59802 59803 $.jsrender = versionNumber; 59804 } 59805 $subSettings = $sub.settings; 59806 $subSettings.allowCode = false;
59807 $isFunction = $.isFunction; 59808 $.render = $render; 59809 $.views = $views; 59810 $.templates = $templates = $views.templates; 59811 59812 for (setting in $subSettings) { 59813 addSetting(setting); 59814 } 59815 59816 /** 59817 * $.views.settings.debugMode(true) 59818 * @param {boolean} debugMode 59819 * @returns {Settings} 59820 * 59821 * debugMode = $.views.settings.debugMode() 59822 * @returns {boolean} 59823 */ 59824 ($viewsSettings.debugMode = function(debugMode) { 59825 return debugMode === undefined 59826 ? $subSettings.debugMode 59827 : ( 59828 $subSettings._clFns && $subSettings._clFns(), // Clear linkExprStore (cached compiled expressions), since debugMode setting affects compilation for expressions 59829 $subSettings.debugMode = debugMode, 59830 $subSettings.onError = debugMode + "" === debugMode 59831 ? function() { return debugMode; } 59832 : $isFunction(debugMode) 59833 ? debugMode 59834 : undefined, 59835 $viewsSettings); 59836 })(false); // jshint ignore:line 59837 59838 $subSettingsAdvanced = $subSettings.advanced = { 59839 cache: true, // By default use cached values of computed values (Otherwise, set advanced cache setting to false) 59840 useViews: false, 59841 _jsv: false // For global access to JsViews store 59842 }; 59843 59844 //========================== Register tags ========================== 59845 59846 $tags({ 59847 "if": { 59848 render: function(val) { 59849 // This function is called once for {{if}} and once for each {{else}}. 59850 // We will use the tag.rendering object for carrying rendering state across the calls. 59851 // If not done (a previous block has not been rendered), look at expression for this block and render the block if expression is truthy 59852 // Otherwise return "" 59853 var self = this, 59854 tagCtx = self.tagCtx, 59855 ret = (self.rendering.done || !val && (tagCtx.args.length || !tagCtx.index)) 59856 ? "" 59857 : (self.rendering.done = true, 59858 self.selected = tagCtx.index, 59859 undefined); // Test is satisfied, so render content on current context 59860 return ret; 59861 }, 59862 contentCtx: true, // Inherit parent view data context 59863 flow: true 59864 }, 59865 "for": { 59866 sortDataMap: dataMap(getTargetSorted), 59867 init: function(val, cloned) { 59868 this.setDataMap(this.tagCtxs); 59869 }, 59870 render: function(val) { 59871 // This function is called once for {{for}} and once for each {{else}}. 59872 // We will use the tag.rendering object for carrying rendering state across the calls. 59873 var value, filter, srtField, isArray, i, sorted, end, step, 59874 self = this, 59875 tagCtx = self.tagCtx, 59876 range = tagCtx.argDefault === false, 59877 props = tagCtx.props, 59878 iterate = range || tagCtx.args.length, // Not final else and not auto-create range 59879 result = "", 59880 done = 0; 59881 59882 if (!self.rendering.done) { 59883 value = iterate ? val : tagCtx.view.data; // For the final else, defaults to current data without iteration. 59884 59885 if (range) { 59886 range = props.reverse ? "unshift" : "push"; 59887 end = +props.end; 59888 step = +props.step || 1; 59889 value = []; // auto-create integer array scenario of {{for start=xxx end=yyy}} 59890 for (i = +props.start || 0; (end - i) * step > 0; i += step) { 59891 value[range](i); 59892 } 59893 } 59894 if (value !== undefined) { 59895 isArray = $isArray(value); 59896 result += tagCtx.render(value, !iterate || props.noIteration); 59897 // Iterates if data is an array, except on final else - or if noIteration property 59898 // set to true. (Use {{include}} to compose templates without array iteration) 59899 done += isArray ? value.length : 1; 59900 } 59901 if (self.rendering.done = done) { 59902 self.selected = tagCtx.index; 59903 } 59904 // If nothing was rendered we will look at the next {{else}}. Otherwise, we are done. 59905 } 59906 return result; 59907 }, 59908 setDataMap: function(tagCtxs) { 59909 var tagCtx, props, paramsProps, 59910 self = this, 59911 l = tagCtxs.length; 59912 while (l--) { 59913 tagCtx = tagCtxs[l]; 59914 props = tagCtx.props; 59915 paramsProps = tagCtx.params.props; 59916 tagCtx.argDefault = props.end === undefined || tagCtx.args.length > 0; // Default to #data except for auto-create range scenario {{for start=xxx end=yyy step=zzz}} 59917 props.dataMap = (tagCtx.argDefault !== false && $isArray(tagCtx.args[0]) && 59918 (paramsProps.sort || paramsProps.start || paramsProps.end || paramsProps.step || paramsProps.filter || paramsProps.reverse 59919 || props.sort || props.start || props.end || props.step || props.filter || props.reverse)) 59920 && self.sortDataMap; 59921 } 59922 }, 59923 flow: true 59924 }, 59925 props: { 59926 baseTag: "for", 59927 dataMap: dataMap(getTargetProps), 59928 init: noop, // Don't execute the base init() of the "for" tag 59929 flow: true 59930 }, 59931 include: { 59932 flow: true 59933 }, 59934 "*": { 59935 // {{* code... }} - Ignored if template.allowCode and $.views.settings.allowCode are false. Otherwise include code in compiled template 59936 render: retVal, 59937 flow: true 59938 }, 59939 ":*": { 59940 // {{:* returnedExpression }} - Ignored if template.allowCode and $.views.settings.allowCode are false. Otherwise include code in compiled template 59941 render: retVal, 59942 flow: true 59943 }, 59944 dbg: $helpers.dbg = $converters.dbg = dbgBreak // Register {{dbg/}}, {{dbg:...}} and ~dbg() to throw and catch, as breakpoints for debugging. 59945 }); 59946 59947 $converters({ 59948 html: htmlEncode, 59949 attr: htmlEncode, // Includes > encoding since rConvertMarkers in JsViews does not skip > characters in attribute strings 59950 encode: dataEncode, 59951 unencode: dataUnencode, // Includes > encoding since rConvertMarkers in JsViews does not skip > characters in attribute strings 59952 url: function(text) { 59953 // URL encoding helper. 59954 return text != undefined ? encodeURI("" + text) : text === null ? text : ""; // null returns null, e.g. to remove attribute. undefined returns "" 59955 } 59956 }); 59957} 59958//========================== Define default delimiters ========================== 59959$subSettings = $sub.settings; 59960$isArray = ($||jsr).isArray; 59961$viewsSettings.delimiters("{{", "}}", "^"); 59962 59963if (jsrToJq) { // Moving from jsrender namespace to jQuery namepace - copy over the stored items (templates, converters, helpers...) 59964 jsr.views.sub._jq($); 59965} 59966return $ || jsr; 59967}, window)); 59968 59969/* 59970 * JavaScript Load Image 1.1.4 59971 * https://github.com/blueimp/JavaScript-Load-Image 59972 * 59973 * Copyright 2011, Sebastian Tschan 59974 * https://blueimp.net 59975 * 59976 * Licensed under the MIT license: 59977 * http://www.opensource.org/licenses/MIT 59978 */ 59979 59980/*jslint nomen: true */ 59981/*global window, document, URL, webkitURL, Blob, File, FileReader, define */ 59982 59983(function ($) { 59984 'use strict'; 59985 59986 // Loads an image for a given File object. 59987 // Invokes the callback with an img or optional canvas 59988 // element (if supported by the browser) as parameter: 59989 var loadImage = function (file, callback, options) { 59990 var img = document.createElement('img'), 59991 url, 59992 oUrl; 59993 img.onerror = callback; 59994 img.onload = function () { 59995 if (oUrl) { 59996 loadImage.revokeObjectURL(oUrl); 59997 } 59998 callback(loadImage.scale(img, options)); 59999 }; 60000 if ((window.Blob && file instanceof Blob) || 60001 // Files are also Blob instances, but some browsers 60002 // (Firefox 3.6) support the File API but not Blobs: 60003 (window.File && file instanceof File)) { 60004 url = oUrl = loadImage.createObjectURL(file); 60005 } else { 60006 url = file; 60007 } 60008 if (url) { 60009 img.src = url; 60010 return img; 60011 } else { 60012 return loadImage.readFile(file, function (url) { 60013 img.src = url; 60014 }); 60015 } 60016 }, 60017 urlAPI = (window.createObjectURL && window) || 60018 (window.URL && URL) || (window.webkitURL && webkitURL); 60019 60020 // Scales the given image (img HTML element) 60021 // using the given options. 60022 // Returns a canvas object if the canvas option is true 60023 // and the browser supports canvas, else the scaled image: 60024 loadImage.scale = function (img, options) { 60025 options = options || {}; 60026 var canvas = document.createElement('canvas'),
60027 scale = Math.max( 60028 (options.minWidth || img.width) / img.width, 60029 (options.minHeight || img.height) / img.height 60030 ); 60031 if (scale > 1) { 60032 img.width = parseInt(img.width * scale, 10); 60033 img.height = parseInt(img.height * scale, 10); 60034 } 60035 scale = Math.min( 60036 (options.maxWidth || img.width) / img.width, 60037 (options.maxHeight || img.height) / img.height 60038 ); 60039 if (scale < 1) { 60040 img.width = parseInt(img.width * scale, 10); 60041 img.height = parseInt(img.height * scale, 10); 60042 } 60043 if (!options.canvas || !canvas.getContext) { 60044 return img; 60045 } 60046 canvas.width = img.width; 60047 canvas.height = img.height; 60048 canvas.getContext('2d') 60049 .drawImage(img, 0, 0, img.width, img.height); 60050 return canvas; 60051 }; 60052 60053 loadImage.createObjectURL = function (file) { 60054 return urlAPI ? urlAPI.createObjectURL(file) : false; 60055 }; 60056 60057 loadImage.revokeObjectURL = function (url) { 60058 return urlAPI ? urlAPI.revokeObjectURL(url) : false; 60059 }; 60060 60061 // Loads a given File object via FileReader interface, 60062 // invokes the callback with a data url: 60063 loadImage.readFile = function (file, callback) { 60064 if (window.FileReader && FileReader.prototype.readAsDataURL) { 60065 var fileReader = new FileReader(); 60066 fileReader.onload = function (e) { 60067 callback(e.target.result); 60068 }; 60069 fileReader.readAsDataURL(file); 60070 return fileReader; 60071 } 60072 return false; 60073 }; 60074 60075 if (typeof define !== 'undefined' && define.amd) { 60076 define(function () { 60077 return loadImage; 60078 }); 60079 } else { 60080 $.loadImage = loadImage; 60081 } 60082}(this)); 60083 60084/* 60085custom changes: 600861) updated getFieldName function to lowercase field names using lowerCaseNodeName function (309-322) 600872) added code for remove duplicate element in nameValues array (92-98) 600883) added "ignoreOnSubmit" class check to getSubFormValues function (269) 600894) added $jsType handling, 60090used newObj() function to create empty objects, 60091used get/set methods to access object (created using newObj func) properties (100 - 231) 600925) replaced get node value to jQuery "val" function (348) 600936) return empty array for unchecked checkbox (returned null initially) (292) 600947) allow to submit values disabledFromJsApi (326) 60095*/ 60096 60097/** 60098* Copyright (c) 2010 Maxim Vasiliev 60099* 60100* Permission is hereby granted, free of charge, to any person obtaining a copy 60101* of this software and associated documentation files (the "Software"), to deal 60102* in the Software without restriction, including without limitation the rights 60103* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 60104* copies of the Software, and to permit persons to whom the Software is 60105* furnished to do so, subject to the following conditions: 60106* 60107* The above copyright notice and this permission notice shall be included in 60108* all copies or substantial portions of the Software. 60109* 60110* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 60111* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 60112* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 60113* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 60114* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 60115* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 60116* THE SOFTWARE. 60117* 60118* @author Maxim Vasiliev 60119* Date: 09.09.2010 60120* Time: 19:02:33 60121*/ 60122 60123var form2js = (function () 60124{ 60125 "use strict"; 60126 60127 /** 60128 * Returns form values represented as Javascript object 60129 * "name" attribute defines structure of resulting object 60130 * 60131 * @param rootNode {Element|String} root form element (or it's id) or array of root elements 60132 * @param delimiter {String} structure parts delimiter defaults to '.' 60133 * @param skipEmpty {Boolean} should skip empty text values, defaults to true 60134 * @param emptyToNull {Boolean} should empty values be converted to null? 60135 * @param nodeCallback {Function} custom function to get node value 60136 * @param useIdIfEmptyName {Boolean} if true value of id attribute of field will be used if name of field is empty 60137 */ 60138 function form2js(rootNode, delimiter, skipEmpty, emptyToNull, nodeCallback, useIdIfEmptyName) 60139 { 60140 if (typeof skipEmpty == 'undefined' || skipEmpty == null) skipEmpty = true; 60141 if (typeof emptyToNull == 'undefined' || emptyToNull == null) emptyToNull = true; 60142 if (typeof delimiter == 'undefined' || delimiter == null) delimiter = '.'; 60143 if (arguments.length < 6) useIdIfEmptyName = false;
60144 60145 rootNode = typeof rootNode == 'string' ? document.getElementById(rootNode) : rootNode; 60146 60147 var formValues = [], 60148 currNode, 60149 i = 0; 60150 60151 /* If rootNode is array - combine values */ 60152 if (rootNode.constructor == Array || (typeof NodeList != 'undefined' && rootNode.constructor == NodeList)) 60153 { 60154 while (currNode = rootNode[i++]) 60155 { 60156 formValues = formValues.concat(getFormValues(currNode, nodeCallback, useIdIfEmptyName)); 60157 } 60158 } 60159 else 60160 { 60161 formValues = getFormValues(rootNode, nodeCallback, useIdIfEmptyName); 60162 } 60163 60164 return processNameValues(formValues, skipEmpty, emptyToNull, delimiter); 60165 } 60166 60167 /** 60168 * Processes collection of { name: 'name', value: 'value' } objects. 60169 * @param nameValues 60170 * @param skipEmpty if true skips elements with value == '' or value == null 60171 * @param delimiter 60172 */ 60173 function processNameValues(nameValues, skipEmpty, emptyToNull, delimiter) 60174 { 60175 var duplicateFilter = {}; 60176 _.each(nameValues, function (el) 60177 { 60178 if (!duplicateFilter.hasOwnProperty(el.name)) 60179 duplicateFilter[el.name] = el; 60180 }); 60181 nameValues = _.values(duplicateFilter); 60182 60183 var result = newObj(), 60184 arrays = newObj(), 60185 i, j, k, l, 60186 value, 60187 nameParts, 60188 currResult, 60189 arrNameFull, 60190 arrName, 60191 arrIdx, 60192 namePart, 60193 name, 60194 _nameParts; 60195 60196 for (i = 0; i < nameValues.length; i++) 60197 { 60198 value = nameValues[i].value; 60199 60200 if (emptyToNull && (value === '')) { value = null; } 60201 if (skipEmpty && (value === '' || value === null)) continue; 60202 60203 name = nameValues[i].name; 60204 if (typeof name === 'undefined') continue; 60205 60206 _nameParts = name.split(delimiter); 60207 nameParts = []; 60208 currResult = result; 60209 arrNameFull = ''; 60210 60211 for (j = 0; j < _nameParts.length; j++) 60212 { 60213 namePart = _nameParts[j].split(']['); 60214 if (namePart.length > 1) 60215 { 60216 for (k = 0; k < namePart.length; k++) 60217 { 60218 if (k == 0) 60219 { 60220 namePart[k] = namePart[k] + ']'; 60221 } 60222 else if (k == namePart.length - 1) 60223 { 60224 namePart[k] = '[' + namePart[k]; 60225 } 60226 else 60227 { 60228 namePart[k] = '[' + namePart[k] + ']'; 60229 } 60230 60231 arrIdx = namePart[k].match(/([a-z_]+)?\[([a-z_][a-z0-9_]+?)\]/i); 60232 if (arrIdx) 60233 { 60234 for (l = 1; l < arrIdx.length; l++) 60235 { 60236 if (arrIdx[l]) nameParts.push(arrIdx[l]); 60237 } 60238 } 60239 else 60240 { 60241 nameParts.push(namePart[k]); 60242 } 60243 } 60244 } 60245 else 60246 nameParts = nameParts.concat(namePart); 60247 } 60248 60249 for (j = 0; j < nameParts.length; j++) 60250 { 60251 namePart = nameParts[j]; 60252 60253 if (namePart.indexOf('[]') > -1 && j == nameParts.length - 1) 60254 { 60255 arrName = namePart.substr(0, namePart.indexOf('[')); 60256 arrNameFull += arrName; 60257 60258 if (!currResult.get(arrName)) 60259 currResult.set(arrName, []); 60260 60261 currResult.get(arrName).push(value); 60262 } 60263 else if (namePart.indexOf('[') > -1) 60264 { 60265 arrName = namePart.substr(0, namePart.indexOf('[')); 60266 arrIdx = namePart.replace(/(^([a-z_]+)?\[)|(\]$)/gi, ''); 60267 60268 /* Unique array name */ 60269 arrNameFull += '_' + arrName + '_' + arrIdx; 60270 60271 /* 60272 * Because arrIdx in field name can be not zero-based and step can be 60273 * other than 1, we can't use them in target array directly. 60274 * Instead we're making a hash where key is arrIdx and value is a reference to 60275 * added array element 60276 */ 60277 60278 if (!arrays[arrNameFull]) arrays[arrNameFull] = {}; 60279 if (arrName != '' && !currResult.get(arrName)) currResult.set(arrName, []); 60280 60281 if (j == nameParts.length - 1) 60282 { 60283 if (arrName == '') 60284 { 60285 currResult.push(value); 60286 arrays[arrNameFull][arrIdx] = currResult[currResult.length - 1]; 60287 } 60288 else 60289 { 60290 currResult.get(arrName).push(value); 60291 arrays[arrNameFull][arrIdx] = currResult.get(arrName)[currResult.get(arrName).length - 1]; 60292 } 60293 } 60294 else 60295 { 60296 if (!arrays[arrNameFull][arrIdx]) 60297 { 60298 if ((/^[a-z_]+\[?/i).test(nameParts[j + 1])
60298) currResult.get(arrName).push(newObj()); 60299 else currResult.get(arrName).push([]); 60300 60301 arrays[arrNameFull][arrIdx] = currResult.get(arrName)[currResult.get(arrName).length - 1]; 60302 } 60303 } 60304 60305 currResult = arrays[arrNameFull][arrIdx]; 60306 } 60307 else 60308 { 60309 arrNameFull += namePart; 60310 60311 if (j < nameParts.length - 1) /* Not the last part of name - means object */ 60312 { 60313 if (!currResult.get(namePart)) 60314 currResult.set(namePart, newObj()); 60315 60316 currResult = currResult.get(namePart); 60317 } 60318 else 60319 { 60320 if (namePart === "$jsType" && value) 60321 { 60322 var obj = new (getFunctionByName(value))(); 60323 for (var key in currResult) 60324 { 60325 obj.set(key, currResult.get(key)); 60326 } 60327 currResult = _.extend(currResult, obj); 60328 } 60329 else 60330 currResult.set(namePart, value); 60331 } 60332 } 60333 } 60334 } 60335 60336 return result; 60337 } 60338 60339 function getFormValues(rootNode, nodeCallback, useIdIfEmptyName) 60340 { 60341 var result = extractNodeValues(rootNode, nodeCallback, useIdIfEmptyName); 60342 return result.length > 0 ? result : getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName); 60343 } 60344 60345 function getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName) 60346 { 60347 var result = [], 60348 currentNode = rootNode.firstChild; 60349 60350 while (currentNode) 60351 { 60352 if (!$(currentNode).hasClass("ignoreOnSubmit")) 60353 result = result.concat(extractNodeValues(currentNode, nodeCallback, useIdIfEmptyName)); 60354 60355 currentNode = currentNode.nextSibling; 60356 } 60357 60358 return result; 60359 } 60360 60361 function extractNodeValues(node, nodeCallback, useIdIfEmptyName) 60362 { 60363 var callbackResult, fieldValue, result, fieldName = getFieldName(node, useIdIfEmptyName); 60364 60365 callbackResult = nodeCallback && nodeCallback(node); 60366 60367 if (callbackResult && callbackResult.name) 60368 { 60369 result = [callbackResult]; 60370 } 60371 else if (fieldName != '' && node.nodeName.match(/INPUT|TEXTAREA/i)) 60372 { 60373 fieldValue = getFieldValue(node); 60374 if (fieldValue == null && (node.type == 'radio' || node.type == 'checkbox')) 60375 result = []; 60376 else 60377 result = [{ name: fieldName, value: fieldValue}]; 60378 } 60379 else if (fieldName != '' && node.nodeName.match(/SELECT/i)) 60380 { 60381 fieldValue = getFieldValue(node); 60382 result = [{ name: fieldName.replace(/\[\]$/, ''), value: fieldValue}]; 60383 } 60384 else 60385 { 60386 result = getSubFormValues(node, nodeCallback, useIdIfEmptyName); 60387 } 60388 60389 return result; 60390 } 60391 60392 function getFieldName(node, useIdIfEmptyName) 60393 { 60394 if (node.name && node.name != '') return lowerCaseNodeName(node.name); 60395 else if (useIdIfEmptyName && node.id && node.id != '') return lowerCaseNodeName(node.id); 60396 else return ''; 60397 } 60398 60399 function lowerCaseNodeName(name) 60400 { 60401 if (name.indexOf('.') == -1) 60402 return name.firstLetterToLowerCase(); 60403 60404 return _.map(name.split('.'), function (el) { return el.firstLetterToLowerCase() }).join("."); 60405 } 60406 60407 function getFieldValue(fieldNode) 60408 { 60409 if (fieldNode.disabled && !$(fieldNode).hasClass("disabledFromJsApi")) 60410 return null; 60411 60412 switch (fieldNode.nodeName) 60413 { 60414 case 'INPUT': 60415 case 'TEXTAREA': 60416 switch (fieldNode.type.toLowerCase()) 60417 { 60418 case 'radio': 60419 case 'checkbox': 60420 if (fieldNode.checked) return fieldNode.value; 60421 break; 60422 60423 case 'button': 60424 case 'reset': 60425 case 'submit': 60426 case 'image': 60427 return ''; 60428 break; 60429 60430 default: 60431 return $(fieldNode).val(); 60432 break; 60433 } 60434 break; 60435 60436 case 'SELECT': 60437 return getSelectedOptionValue(fieldNode); 60438 break; 60439 60440 default: 60441 break; 60442 } 60443 60444 return null; 60445 } 60446 60447 function getSelectedOptionValue(selectNode) 60448 { 60449 var multiple = selectNode.multiple, 60450 result = [], 60451 options, 60452 i, l; 60453 60454 if (!multiple) return selectNode.value; 60455 60456 for (options = selectNode.getElementsByTagName('option'), i = 0, l = options.length; i < l; i++) 60457 { 60458 if (options[i].selected) result.push(options[i].value); 60459 } 60460 60461 return result; 60462 } 60463 60464 function newObj() 60465 { 60466 var obj = 60467 { 60468 get: function (key) { return this[key]; }, 60469 set: function (key, value) { this[key] = value; } 60470 }; 60471 60472 return obj; 60473 } 60474 60475 return form2js; 60476 60477})(); 60478 60479/* 60480custom changes: 604811) changed default settings.skipEmpty to false (48) 604822) added default settings.emptyToNull to true (49) 604833) added parameter settings.emptyToNull to form2js function (88, 93, 98) 604844) added custom nodeCallback function for process ASP.NET MVC checkboxes (62-83) 60485*/ 60486 60487/** 60488* Copyright (c) 2010 Maxim Vasiliev 60489* 60490* Permission is hereby granted, free of charge, to any person obtaining a copy 60491* of this software and associated documentation files (the "Software"), to deal 60492* in the Software without restriction, including without limitation the rights 60493* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 60494* copies of the Software, and to permit persons to whom the Software is 60495* furnished to do so, subject to the following conditions: 60496* 60497* The above copyright notice and this permission notice shall be included in 60498* all copies or substantial portions of the Software. 60499* 60500* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 60501* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 60502* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 60503* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 60504* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 60505* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 60506* THE SOFTWARE. 60507* 60508* @author Maxim Vasiliev 60509* Date: 29.06.11 60510* Time: 20:09 60511*/ 60512 60513(function ($) 60514{ 60515 60516 /** 60517 * jQuery wrapper for form2object() 60518 * Extracts data from child inputs into javascript object 60519 */ 60520 $.fn.toObject = function (options) 60521 { 60522 var result = [], 60523 settings = { 60524 mode: 'first', // what to convert: 'all' or 'first' matched node 60525 delimiter: ".", 60526 skipEmpty: false, 60527 emptyToNull: true, 60528 nodeCallback: null, 60529 useIdIfEmptyName: false 60530 }; 60531 60532 if (options) 60533 { 60534 $.extend(settings, options); 60535 } 60536 60537 if (settings.nodeCallback) 60538 throw 'nodeCallback is not supported!'; 60539 60540 settings.nodeCallback = function (node) 60541 { 60542 if (node.type !== 'checkbox') 60543 return false;
60544 60545 if ($(node).val().asBool()) // is ASP.NET MVC checkbox 60546 { 60547 var nameSplits = $(node) 60548 .attr('name') 60549 .split('.'); 60550 60551 var name = _.reduce(nameSplits, function (a, b) 60552 { 60553 return a.firstLetterToLowerCase() + "." + b.firstLetterToLowerCase(); 60554 }) 60555 .firstLetterToLowerCase(); 60556 60557 return { name: name, value: node.checked }; 60558 } 60559 else 60560 return false; 60561 } 60562 60563 switch (settings.mode) 60564 { 60565 case 'first': 60566 return form2js(this.get(0), settings.delimiter, settings.skipEmpty, settings.emptyToNull, settings.nodeCallback, settings.useIdIfEmptyName); 60567 break; 60568 case 'all': 60569 this.each(function () 60570 { 60571 result.push(form2js(this, settings.delimiter, settings.skipEmpty, settings.emptyToNull, settings.nodeCallback, settings.useIdIfEmptyName)); 60572 }); 60573 return result; 60574 break; 60575 case 'combine': 60576 return form2js(Array.prototype.slice.call(this), settings.delimiter, settings.skipEmpty, settings.emptyToNull, settings.nodeCallback, settings.useIdIfEmptyName); 60577 break; 60578 } 60579 } 60580 60581})(jQuery); 60582/* 60583custom changes: 605841) commented out the lines 49-54 (broke Firebug stacktrace in some cases) 60585*/ 60586 60587// node-uuid/uuid.js 60588// 60589// Copyright (c) 2010 Robert Kieffer 60590// Dual licensed under the MIT and GPL licenses. 60591// Documentation and details at https://github.com/broofa/node-uuid 60592(function() { 60593 var _global = this; 60594 60595 // Unique ID creation requires a high quality random # generator, but 60596 // Math.random() does not guarantee "cryptographic quality". So we feature 60597 // detect for more robust APIs, normalizing each method to return 128-bits 60598 // (16 bytes) of random data. 60599 var mathRNG, nodeRNG, whatwgRNG; 60600 60601 // Math.random()-based RNG. All platforms, very fast, unknown quality 60602 var _rndBytes = new Array(16); 60603 mathRNG = function() { 60604 var r, b = _rndBytes, i = 0; 60605 60606 for (var i = 0, r; i < 16; i++) { 60607 if ((i & 0x03) == 0) r = Math.random() * 0x100000000; 60608 b[i] = r >>> ((i & 0x03) << 3) & 0xff;
60609 } 60610 60611 return b; 60612 } 60613 60614 // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto 60615 // WebKit only (currently), moderately fast, high quality 60616 if (_global.crypto && crypto.getRandomValues) { 60617 var _rnds = new Uint32Array(4); 60618 whatwgRNG = function() { 60619 crypto.getRandomValues(_rnds); 60620 60621 for (var c = 0 ; c < 16; c++) { 60622 _rndBytes[c] = _rnds[c >> 2] >>> ((c & 0x03) * 8) & 0xff; 60623 } 60624 return _rndBytes; 60625 } 60626 } 60627 60628 // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html 60629 // Node.js only, moderately fast, high quality 60630 //try { 60631 // var _rb = require('crypto').randomBytes; 60632 // nodeRNG = _rb && function() { 60633 // return _rb(16); 60634 // }; 60635 //} catch (e) {} 60636 60637 // Select RNG with best quality 60638 var _rng = nodeRNG || whatwgRNG || mathRNG; 60639 60640 // Buffer class to use 60641 var BufferClass = typeof(Buffer) == 'function' ? Buffer : Array; 60642 60643 // Maps for number <-> hex string conversion 60644 var _byteToHex = []; 60645 var _hexToByte = {}; 60646 for (var i = 0; i < 256; i++) { 60647 _byteToHex[i] = (i + 0x100).toString(16).substr(1); 60648 _hexToByte[_byteToHex[i]] = i; 60649 } 60650 60651 // **`parse()` - Parse a UUID into it's component bytes** 60652 function parse(s, buf, offset) { 60653 var i = (buf && offset) || 0, ii = 0; 60654 60655 buf = buf || []; 60656 s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) { 60657 if (ii < 16) { // Don't overflow! 60658 buf[i + ii++] = _hexToByte[oct]; 60659 } 60660 }); 60661 60662 // Zero out remaining bytes if string was short 60663 while (ii < 16) { 60664 buf[i + ii++] = 0; 60665 } 60666 60667 return buf; 60668 } 60669 60670 // **`unparse()` - Convert UUID byte array (ala parse()) into a string** 60671 function unparse(buf, offset) { 60672 var i = offset || 0, bth = _byteToHex; 60673 return bth[buf[i++]] + bth[buf[i++]] + 60674 bth[buf[i++]] + bth[buf[i++]] + '-' + 60675 bth[buf[i++]] + bth[buf[i++]] + '-' + 60676 bth[buf[i++]] + bth[buf[i++]] + '-' + 60677 bth[buf[i++]] + bth[buf[i++]] + '-' + 60678 bth[buf[i++]] + bth[buf[i++]] + 60679 bth[buf[i++]] + bth[buf[i++]] + 60680 bth[buf[i++]] + bth[buf[i++]]; 60681 } 60682 60683 // **`v1()` - Generate time-based UUID** 60684 // 60685 // Inspired by https://github.com/LiosK/UUID.js 60686 // and http://docs.python.org/library/uuid.html 60687 60688 // random #'s we need to init node and clockseq 60689 var _seedBytes = _rng(); 60690 60691 // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) 60692 var _nodeId = [ 60693 _seedBytes[0] | 0x01, 60694 _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] 60695 ]; 60696 60697 // Per 4.2.2, randomize (14 bit) clockseq 60698 var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff; 60699 60700 // Previous uuid creation time 60701 var _lastMSecs = 0, _lastNSecs = 0; 60702 60703 // See https://github.com/broofa/node-uuid for API details 60704 function v1(options, buf, offset) { 60705 var i = buf && offset || 0; 60706 var b = buf || []; 60707 60708 options = options || {}; 60709 60710 var clockseq = options.clockseq != null ? options.clockseq : _clockseq; 60711 60712 // UUID timestamps are 100 nano-second units since the Gregorian epoch, 60713 // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so 60714 // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' 60715 // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. 60716 var msecs = options.msecs != null ? options.msecs : new Date().getTime(); 60717 60718 // Per 4.2.1.2, use count of uuid's generated during the current clock 60719 // cycle to simulate higher resolution clock 60720 var nsecs = options.nsecs != null ? options.nsecs : _lastNSecs + 1; 60721 60722 // Time since last uuid creation (in msecs) 60723 var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000; 60724 60725 // Per 4.2.1.2, Bump clockseq on clock regression 60726 if (dt < 0 && options.clockseq == null) { 60727 clockseq = clockseq + 1 & 0x3fff; 60728 } 60729 60730 // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new 60731 // time interval 60732 if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) { 60733 nsecs = 0; 60734 } 60735 60736 // Per 4.2.1.2 Throw error if too many uuids are requested 60737 if (nsecs >= 10000) { 60738 throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec'); 60739 } 60740 60741 _lastMSecs = msecs; 60742 _lastNSecs = nsecs; 60743 _clockseq = clockseq; 60744 60745 // Per 4.1.4 - Convert from unix epoch to Gregorian epoch 60746 msecs += 12219292800000; 60747 60748 // `time_low` 60749 var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; 60750 b[i++] = tl >>> 24 & 0xff; 60751 b[i++] = tl >>> 16 & 0xff;
60752 b[i++] = tl >>> 8 & 0xff; 60753 b[i++] = tl & 0xff; 60754 60755 // `time_mid` 60756 var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff; 60757 b[i++] = tmh >>> 8 & 0xff; 60758 b[i++] = tmh & 0xff; 60759 60760 // `time_high_and_version` 60761 b[i++] = tmh >>> 24 & 0xf | 0x10; // include version 60762 b[i++] = tmh >>> 16 & 0xff; 60763 60764 // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) 60765 b[i++] = clockseq >>> 8 | 0x80; 60766 60767 // `clock_seq_low` 60768 b[i++] = clockseq & 0xff; 60769 60770 // `node` 60771 var node = options.node || _nodeId; 60772 for (var n = 0; n < 6; n++) { 60773 b[i + n] = node[n]; 60774 } 60775 60776 return buf ? buf : unparse(b); 60777 } 60778 60779 // **`v4()` - Generate random UUID** 60780 60781 // See https://github.com/broofa/node-uuid for API details 60782 function v4(options, buf, offset) { 60783 // Deprecated - 'format' argument, as supported in v1.2 60784 var i = buf && offset || 0; 60785 60786 if (typeof(options) == 'string') { 60787 buf = options == 'binary' ? new BufferClass(16) : null; 60788 options = null; 60789 } 60790 options = options || {}; 60791 60792 var rnds = options.random || (options.rng || _rng)(); 60793 60794 // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` 60795 rnds[6] = (rnds[6] & 0x0f) | 0x40; 60796 rnds[8] = (rnds[8] & 0x3f) | 0x80; 60797 60798 // Copy bytes to buffer, if provided 60799 if (buf) { 60800 for (var ii = 0; ii < 16; ii++) { 60801 buf[i + ii] = rnds[ii]; 60802 } 60803 } 60804 60805 return buf || unparse(rnds); 60806 } 60807 60808 // Export public API 60809 var uuid = v4; 60810 uuid.v1 = v1; 60811 uuid.v4 = v4; 60812 uuid.parse = parse; 60813 uuid.unparse = unparse; 60814 uuid.BufferClass = BufferClass; 60815 60816 // Export RNG options 60817 uuid.mathRNG = mathRNG; 60818 uuid.nodeRNG = nodeRNG; 60819 uuid.whatwgRNG = whatwgRNG; 60820 60821 if (typeof(module) != 'undefined') { 60822 // Play nice with node.js 60823 module.exports = uuid; 60824 } else { 60825 // Play nice with browsers 60826 var _previousRoot = _global.uuid; 60827 60828 // **`noConflict()` - (browser only) to reset global 'uuid' var** 60829 uuid.noConflict = function() { 60830 _global.uuid = _previousRoot; 60831 return uuid; 60832 } 60833 _global.uuid = uuid; 60834 } 60835}()); 60836 60837$(document).ready(function () { 60838 60839 60840 /*----------------------------------------------------------------------*/ 60841 /* Parse the data from an data-attribute of DOM Elements 60842 /*----------------------------------------------------------------------*/ 60843 60844 60845 $.parseData = function (data, returnArray) { 60846 if (/^\[(.*)\]$/.test(data)) { //array 60847 data = data.substr(1, data.length - 2).split(','); 60848 } 60849 if (returnArray && !$.isArray(data) && data != null) { 60850 data = Array(data); 60851 } 60852 return data; 60853 }; 60854 60855 /*----------------------------------------------------------------------*/ 60856 /* Image Preloader 60857 /* http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript 60858 /*----------------------------------------------------------------------*/ 60859 60860 60861 60862 // Arguments are image paths relative to the current page. 60863 $.preload = function() { 60864 var cache = [], 60865 args_len = arguments.length; 60866 for (var i = args_len; i--;) { 60867 var cacheImage = document.createElement('img'); 60868 cacheImage.src = arguments[i]; 60869 cache.push(cacheImage); 60870 } 60871 }; 60872 60873 60874 /*----------------------------------------------------------------------*/ 60875 /* fadeInSlide by revaxarts.com 60876 /* Fades out a box and slide it up before it will get removed 60877 /*----------------------------------------------------------------------*/ 60878 60879 60880 $.fn.fadeInSlide = function (speed, callback) { 60881 if ($.isFunction(speed)) callback = speed; 60882 if (!speed) speed = 200; 60883 if (!callback) callback = function () {}; 60884 this.each(function () { 60885 60886 var $this = $(this); 60887 $this.fadeTo(speed / 2, 1).slideDown(speed / 2, function () { 60888 callback(); 60889 }); 60890 }); 60891 return this; 60892 }; 60893 60894 60895 /*----------------------------------------------------------------------*/ 60896 /* fadeOutSlide by revaxarts.com 60897 /* Fades out a box and slide it up before it will get removed 60898 /*----------------------------------------------------------------------*/ 60899 60900 60901 $.fn.fadeOutSlide = function (speed, callback) { 60902 if ($.isFunction(speed)) callback = speed; 60903 if (!speed) speed = 200; 60904 if (!callback) callback = function () {}; 60905 this.each(function () { 60906 60907 var $this = $(this); 60908 $this.fadeTo(speed / 2, 0).slideUp(speed / 2, function () { 60909 $this.remove(); 60910 callback(); 60911 }); 60912 }); 60913 return this; 60914 }; 60915 60916 /*----------------------------------------------------------------------*/ 60917 /* textFadeOut by revaxarts.com 60918 /* Fades out a box and slide it up before it will get removed 60919 /*----------------------------------------------------------------------*/ 60920 60921 60922 $.fn.textFadeOut = function (text, delay, callback) { 60923 if (!text) return false;
60924 if ($.isFunction(delay)) callback = delay; 60925 if (!delay) delay = 2000; 60926 if (!callback) callback = function () {}; 60927 this.each(function () { 60928 60929 var $this = $(this); 60930 $this.stop().text(text).show().delay(delay).fadeOut(1000,function(){ 60931 $this.text('').show(); 60932 callback(); 60933 }) 60934 }); 60935 return this; 60936 }; 60937 60938 /*----------------------------------------------------------------------*/ 60939 /* leadingZero by revaxarts.com 60940 /* adds a leding zero if necessary 60941 /*----------------------------------------------------------------------*/ 60942 60943 60944 $.leadingZero = function (value) { 60945 value = parseInt(value, 10); 60946 if(!isNaN(value)) { 60947 (value < 10) ? value = '0' + value : value; 60948 } 60949 return value; 60950 }; 60951 60952 60953}); 60954(function(window) { 60955 var re = { 60956 not_string: /[^s]/, 60957 number: /[dief]/, 60958 json: /[j]/, 60959 not_json: /[^j]/, 60960 text: /^[^\x25]+/, 60961 modulo: /^\x25{2}/, 60962 placeholder: /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fijosuxX])/, 60963 key: /^([a-z_][a-z_\d]*)/i, 60964 key_access: /^\.([a-z_][a-z_\d]*)/i, 60965 index_access: /^\[(\d+)\]/, 60966 sign: /^[\+\-]/ 60967 } 60968 60969 function sprintf() { 60970 var key = arguments[0], cache = sprintf.cache 60971 if (!(cache[key] && cache.hasOwnProperty(key))) { 60972 cache[key] = sprintf.parse(key) 60973 } 60974 return sprintf.format.call(null, cache[key], arguments) 60975 } 60976 60977 sprintf.format = function(parse_tree, argv) { 60978 var cursor = 1, tree_length = parse_tree.length, node_type = "", arg, output = [], i, k, match, pad, pad_character, pad_length, is_positive = true, sign = "" 60979 for (i = 0; i < tree_length; i++) { 60980 node_type = get_type(parse_tree[i]) 60981 if (node_type === "string") { 60982 output[output.length] = parse_tree[i] 60983 } 60984 else if (node_type === "array") { 60985 match = parse_tree[i] // convenience purposes only 60986 if (match[2]) { // keyword argument 60987 arg = argv[cursor] 60988 for (k = 0; k < match[2].length; k++) { 60989 if (!arg.hasOwnProperty(match[2][k])) { 60990 throw new Error(sprintf("[sprintf] property '%s' does not exist", match[2][k])) 60991 } 60992 arg = arg[match[2][k]] 60993 } 60994 } 60995 else if (match[1]) { // positional argument (explicit) 60996 arg = argv[match[1]] 60997 } 60998 else { // positional argument (implicit) 60999 arg = argv[cursor++] 61000 } 61001 61002 if (get_type(arg) == "function") { 61003 arg = arg() 61004 } 61005 61006 if (re.not_string.test(match[8]) && re.not_json.test(match[8]) && (get_type(arg) != "number" && isNaN(arg))) { 61007 throw new TypeError(sprintf("[sprintf] expecting number but found %s", get_type(arg))) 61008 } 61009 61010 if (re.number.test(match[8])) { 61011 is_positive = arg >= 0 61012 } 61013 61014 switch (match[8]) { 61015 case "b": 61016 arg = arg.toString(2) 61017 break 61018 case "c": 61019 arg = String.fromCharCode(arg) 61020 break 61021 case "d": 61022 case "i": 61023 arg = parseInt(arg, 10) 61024 break 61025 case "j": 61026 arg = JSON.stringify(arg, null, match[6] ? parseInt(match[6]) : 0) 61027 break 61028 case "e": 61029 arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential() 61030 break 61031 case "f": 61032 arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg) 61033 break 61034 case "o": 61035 arg = arg.toString(8) 61036 break 61037 case "s": 61038 arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg) 61039 break 61040 case "u": 61041 arg = arg >>> 0 61042 break 61043 case "x": 61044 arg = arg.toString(16) 61045 break 61046 case "X": 61047 arg = arg.toString(16).toUpperCase() 61048 break 61049 } 61050 if (re.json.test(match[8])) { 61051 output[output.length] = arg 61052 } 61053 else { 61054 if (re.number.test(match[8]) && (!is_positive || match[3])) { 61055 sign = is_positive ? "+" : "-" 61056 arg = arg.toString().replace(re.sign, "") 61057 } 61058 else { 61059 sign = "" 61060 } 61061 pad_character = match[4] ? match[4] === "0" ? "0" : match[4].charAt(1) : " " 61062 pad_length = match[6] - (sign + arg).length 61063 pad = match[6] ? (pad_length >
61063 0 ? str_repeat(pad_character, pad_length) : "") : "" 61064 output[output.length] = match[5] ? sign + arg + pad : (pad_character === "0" ? sign + pad + arg : pad + sign + arg) 61065 } 61066 } 61067 } 61068 return output.join("") 61069 } 61070 61071 sprintf.cache = {} 61072 61073 sprintf.parse = function(fmt) { 61074 var _fmt = fmt, match = [], parse_tree = [], arg_names = 0 61075 while (_fmt) { 61076 if ((match = re.text.exec(_fmt)) !== null) { 61077 parse_tree[parse_tree.length] = match[0] 61078 } 61079 else if ((match = re.modulo.exec(_fmt)) !== null) { 61080 parse_tree[parse_tree.length] = "%" 61081 } 61082 else if ((match = re.placeholder.exec(_fmt)) !== null) { 61083 if (match[2]) { 61084 arg_names |= 1 61085 var field_list = [], replacement_field = match[2], field_match = [] 61086 if ((field_match = re.key.exec(replacement_field)) !== null) { 61087 field_list[field_list.length] = field_match[1] 61088 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== "") { 61089 if ((field_match = re.key_access.exec(replacement_field)) !== null) { 61090 field_list[field_list.length] = field_match[1] 61091 } 61092 else if ((field_match = re.index_access.exec(replacement_field)) !== null) { 61093 field_list[field_list.length] = field_match[1] 61094 } 61095 else { 61096 throw new SyntaxError("[sprintf] failed to parse named argument key") 61097 } 61098 } 61099 } 61100 else { 61101 throw new SyntaxError("[sprintf] failed to parse named argument key") 61102 } 61103 match[2] = field_list 61104 } 61105 else { 61106 arg_names |= 2 61107 } 61108 if (arg_names === 3) { 61109 throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported") 61110 } 61111 parse_tree[parse_tree.length] = match 61112 } 61113 else { 61114 throw new SyntaxError("[sprintf] unexpected placeholder") 61115 } 61116 _fmt = _fmt.substring(match[0].length) 61117 } 61118 return parse_tree 61119 } 61120 61121 var vsprintf = function(fmt, argv, _argv) { 61122 _argv = (argv || []).slice(0) 61123 _argv.splice(0, 0, fmt) 61124 return sprintf.apply(null, _argv) 61125 } 61126 61127 /** 61128 * helpers 61129 */ 61130 function get_type(variable) { 61131 return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase() 61132 } 61133 61134 function str_repeat(input, multiplier) { 61135 return Array(multiplier + 1).join(input) 61136 } 61137 61138 /** 61139 * export to either browser or node.js 61140 */ 61141 if (typeof exports !== "undefined") { 61142 exports.sprintf = sprintf 61143 exports.vsprintf = vsprintf 61144 } 61145 else { 61146 window.sprintf = sprintf 61147 window.vsprintf = vsprintf 61148 61149 if (typeof define === "function" && define.amd) { 61150 define(function() { 61151 return { 61152 sprintf: sprintf, 61153 vsprintf: vsprintf 61154 } 61155 }) 61156 } 61157 } 61158})(typeof window === "undefined" ? this : window); 61159 61160/* 61161 * [js-sha512]{@link https://github.com/emn178/js-sha512} 61162 * 61163 * @version 0.3.0 61164 * @author Chen, Yi-Cyuan [[email protected]] 61165 * @copyright Chen, Yi-Cyuan 2014-2017 61166 * @license MIT 61167 */ 61168/*jslint bitwise: true */ 61169(function () { 61170 'use strict'; 61171 61172 var root = typeof window === 'object' ? window : {}; 61173 var NODE_JS = !root.JS_SHA512_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node; 61174 if (NODE_JS) { 61175 root = global; 61176 } 61177 var COMMON_JS = !root.JS_SHA512_NO_COMMON_JS && typeof module === 'object' && module.exports; 61178 var AMD = typeof define === 'function' && define.amd; 61179 var HEX_CHARS = '0123456789abcdef'.split(''); 61180 var EXTRA = [-2147483648, 8388608, 32768, 128]; 61181 var SHIFT = [24, 16, 8, 0]; 61182 var K =[ 61183 0x428A2F98, 0xD728AE22, 0x71374491, 0x23EF65CD, 61184 0xB5C0FBCF, 0xEC4D3B2F, 0xE9B5DBA5, 0x8189DBBC, 61185 0x3956C25B, 0xF348B538, 0x59F111F1, 0xB605D019,
61186 0x923F82A4, 0xAF194F9B, 0xAB1C5ED5, 0xDA6D8118, 61187 0xD807AA98, 0xA3030242, 0x12835B01, 0x45706FBE, 61188 0x243185BE, 0x4EE4B28C, 0x550C7DC3, 0xD5FFB4E2, 61189 0x72BE5D74, 0xF27B896F, 0x80DEB1FE, 0x3B1696B1, 61190 0x9BDC06A7, 0x25C71235, 0xC19BF174, 0xCF692694, 61191 0xE49B69C1, 0x9EF14AD2, 0xEFBE4786, 0x384F25E3, 61192 0x0FC19DC6, 0x8B8CD5B5, 0x240CA1CC, 0x77AC9C65, 61193 0x2DE92C6F, 0x592B0275, 0x4A7484AA, 0x6EA6E483, 61194 0x5CB0A9DC, 0xBD41FBD4, 0x76F988DA, 0x831153B5, 61195 0x983E5152, 0xEE66DFAB, 0xA831C66D, 0x2DB43210, 61196 0xB00327C8, 0x98FB213F, 0xBF597FC7, 0xBEEF0EE4, 61197 0xC6E00BF3, 0x3DA88FC2, 0xD5A79147, 0x930AA725, 61198 0x06CA6351, 0xE003826F, 0x14292967, 0x0A0E6E70, 61199 0x27B70A85, 0x46D22FFC, 0x2E1B2138, 0x5C26C926, 61200 0x4D2C6DFC, 0x5AC42AED, 0x53380D13, 0x9D95B3DF, 61201 0x650A7354, 0x8BAF63DE, 0x766A0ABB, 0x3C77B2A8, 61202 0x81C2C92E, 0x47EDAEE6, 0x92722C85, 0x1482353B, 61203 0xA2BFE8A1, 0x4CF10364, 0xA81A664B, 0xBC423001, 61204 0xC24B8B70, 0xD0F89791, 0xC76C51A3, 0x0654BE30, 61205 0xD192E819, 0xD6EF5218, 0xD6990624, 0x5565A910, 61206 0xF40E3585, 0x5771202A, 0x106AA070, 0x32BBD1B8, 61207 0x19A4C116, 0xB8D2D0C8, 0x1E376C08, 0x5141AB53, 61208 0x2748774C, 0xDF8EEB99, 0x34B0BCB5, 0xE19B48A8, 61209 0x391C0CB3, 0xC5C95A63, 0x4ED8AA4A, 0xE3418ACB, 61210 0x5B9CCA4F, 0x7763E373, 0x682E6FF3, 0xD6B2B8A3, 61211 0x748F82EE, 0x5DEFB2FC, 0x78A5636F, 0x43172F60, 61212 0x84C87814, 0xA1F0AB72, 0x8CC70208, 0x1A6439EC, 61213 0x90BEFFFA, 0x23631E28, 0xA4506CEB, 0xDE82BDE9, 61214 0xBEF9A3F7, 0xB2C67915, 0xC67178F2, 0xE372532B, 61215 0xCA273ECE, 0xEA26619C, 0xD186B8C7, 0x21C0C207, 61216 0xEADA7DD6, 0xCDE0EB1E, 0xF57D4F7F, 0xEE6ED178, 61217 0x06F067AA, 0x72176FBA, 0x0A637DC5, 0xA2C898A6, 61218 0x113F9804, 0xBEF90DAE, 0x1B710B35, 0x131C471B, 61219 0x28DB77F5, 0x23047D84, 0x32CAAB7B, 0x40C72493, 61220 0x3C9EBE0A, 0x15C9BEBC, 0x431D67C4, 0x9C100D4C, 61221 0x4CC5D4BE, 0xCB3E42B6, 0x597F299C, 0xFC657E2A, 61222 0x5FCB6FAB, 0x3AD6FAEC, 0x6C44198C, 0x4A475817 61223 ]; 61224 61225 var blocks = []; 61226 61227 var sha384 = function (message) { 61228 return sha512(message, 384); 61229 }; 61230 61231 var sha512_256 = function (message) { 61232 return sha512(message, 256); 61233 }; 61234 61235 var sha512_224 = function (message) { 61236 return sha512(message, 224); 61237 }; 61238 61239 var sha512 = function (message, bits) { 61240 var h0h, h0l, h1h, h1l, h2h, h2l, h3h, h3l, 61241 h4h, h4l, h5h, h5l, h6h, h6l, h7h, h7l, block, code, end = false, 61242 i, j, index = 0, start = 0, bytes = 0, length = message.length, 61243 s0h, s0l, s1h, s1l, c1, c2, c3, c4, 61244 abh, abl, dah, dal, cdh, cdl, bch, bcl, 61245 majh, majl, t1h, t1l, t2h, t2l, chh, chl; 61246 61247 if (bits == 384) { 61248 h0h = 0xCBBB9D5D; 61249 h0l = 0xC1059ED8; 61250 h1h = 0x629A292A; 61251 h1l = 0x367CD507; 61252 h2h = 0x9159015A; 61253 h2l = 0x3070DD17; 61254 h3h = 0x152FECD8; 61255 h3l = 0xF70E5939; 61256 h4h = 0x67332667; 61257 h4l = 0xFFC00B31; 61258 h5h = 0x8EB44A87; 61259 h5l = 0x68581511; 61260 h6h = 0xDB0C2E0D; 61261 h6l = 0x64F98FA7; 61262 h7h = 0x47B5481D; 61263 h7l = 0xBEFA4FA4; 61264 } else if (bits == 256) { 61265 h0h = 0x22312194; 61266 h0l = 0xFC2BF72C; 61267 h1h = 0x9F555FA3; 61268 h1l = 0xC84C64C2; 61269 h2h = 0x2393B86B; 61270 h2l = 0x6F53B151; 61271 h3h = 0x96387719; 61272 h3l = 0x5940EABD; 61273 h4h = 0x96283EE2; 61274 h4l = 0xA88EFFE3; 61275 h5h = 0xBE5E1E25; 61276 h5l = 0x53863992; 61277 h6h = 0x2B0199FC; 61278 h6l = 0x2C85B8AA; 61279 h7h = 0x0EB72DDC; 61280 h7l = 0x81C52CA2; 61281 } else if (bits == 224) { 61282 h0h = 0x8C3D37C8; 61283 h0l = 0x19544DA2; 61284 h1h = 0x73E19966; 61285 h1l = 0x89DCD4D6; 61286 h2h = 0x1DFAB7AE; 61287 h2l = 0x32FF9C82; 61288 h3h = 0x679DD514; 61289 h3l = 0x582F9FCF; 61290 h4h = 0x0F6D2B69; 61291 h4l = 0x7BD44DA8; 61292 h5h = 0x77E36F73; 61293 h5l = 0x04C48942; 61294 h6h = 0x3F9D85A8; 61295 h6l = 0x6A1D36C8; 61296 h7h = 0x1112E6AD; 61297 h7l = 0x91D692A1; 61298 } else { // 512 61299 h0h = 0x6A09E667; 61300 h0l = 0xF3BCC908; 61301 h1h = 0xBB67AE85; 61302 h1l = 0x84CAA73B; 61303 h2h = 0x3C6EF372; 61304 h2l = 0xFE94F82B; 61305 h3h = 0xA54FF53A; 61306 h3l = 0x5F1D36F1; 61307 h4h = 0x510E527F; 61308 h4l = 0xADE682D1; 61309 h5h = 0x9B05688C; 61310 h5l = 0x2B3E6C1F; 61311 h6h = 0x1F83D9AB; 61312 h6l = 0xFB41BD6B; 61313 h7h = 0x5BE0CD19; 61314 h7l = 0x137E2179; 61315 bits = 512; 61316 } 61317 block = 0; 61318 do { 61319 blocks[0] = block;
61320 blocks[1] = blocks[2] = blocks[3] = blocks[4] = 61321 blocks[5] = blocks[6] = blocks[7] = blocks[8] = 61322 blocks[9] = blocks[10] = blocks[11] = blocks[12] = 61323 blocks[13] = blocks[14] = blocks[15] = blocks[16] = 61324 blocks[17] = blocks[18] = blocks[19] = blocks[20] = 61325 blocks[21] = blocks[22] = blocks[23] = blocks[24] = 61326 blocks[25] = blocks[26] = blocks[27] = blocks[28] = 61327 blocks[29] = blocks[30] = blocks[31] = blocks[32] = 0; 61328 for (i = start; index < length && i < 128; ++index) { 61329 code = message.charCodeAt(index); 61330 if (code < 0x80) { 61331 blocks[i >> 2] |= code << SHIFT[i++ & 3]; 61332 } else if (code < 0x800) { 61333 blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3]; 61334 blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; 61335 } else if (code < 0xd800 || code >= 0xe000) { 61336 blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3]; 61337 blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; 61338 blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; 61339 } else { 61340 code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff)); 61341 blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3]; 61342 blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3]; 61343 blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3]; 61344 blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3]; 61345 } 61346 } 61347 bytes += i - start; 61348 start = i - 128; 61349 if (index == length) { 61350 blocks[i >> 2] |= EXTRA[i & 3]; 61351 ++index; 61352 } 61353 block = blocks[32]; 61354 if (index > length && i < 112) { 61355 blocks[31] = bytes << 3; 61356 end = true; 61357 } 61358 61359 for (j = 32; j < 160; j += 2) { 61360 t1h = blocks[j - 30]; 61361 t1l = blocks[j - 29]; 61362 s0h = ((t1h >>> 1) | (t1l << 31)) ^ ((t1h >>> 8) | (t1l << 24)) ^ (t1h >>> 7); 61363 s0l = ((t1l >>> 1) | (t1h << 31)) ^ ((t1l >>> 8) | (t1h << 24)) ^ ((t1l >>> 7) | t1h << 25); 61364 61365 t1h = blocks[j - 4]; 61366 t1l = blocks[j - 3]; 61367 s1h = ((t1h >>> 19) | (t1l << 13)) ^ ((t1l >>> 29) | (t1h << 3)) ^ (t1h >>> 6); 61368 s1l = ((t1l >>> 19) | (t1h << 13)) ^ ((t1h >>> 29) | (t1l << 3)) ^ ((t1l >>> 6) | t1h << 26); 61369 61370 t1h = blocks[j - 32]; 61371 t1l = blocks[j - 31]; 61372 t2h = blocks[j - 14]; 61373 t2l = blocks[j - 13]; 61374 61375 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (s0l & 0xFFFF) + (s1l & 0xFFFF); 61376 c2 = (t2l >>> 16) + (t1l >>> 16) + (s0l >>> 16) + (s1l >>> 16) + (c1 >>> 16); 61377 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (s0h & 0xFFFF) + (s1h & 0xFFFF) + (c2 >>> 16); 61378 c4 = (t2h >>> 16) + (t1h >>> 16) + (s0h >>> 16) + (s1h >>> 16) + (c3 >>> 16); 61379 61380 blocks[j] = (c4 << 16) | (c3 & 0xFFFF); 61381 blocks[j + 1] = (c2 << 16) | (c1 & 0xFFFF); 61382 } 61383 61384 var ah = h0h, al = h0l, bh = h1h, bl = h1l, ch = h2h, cl = h2l, dh = h3h, dl = h3l, eh = h4h, el = h4l, fh = h5h, fl = h5l, gh = h6h, gl = h6l, hh = h7h, hl = h7l; 61385 bch = bh & ch; 61386 bcl = bl & cl; 61387 for (j = 0; j < 160; j += 8) { 61388 s0h = ((ah >>> 28) | (al << 4)) ^ ((al >>> 2) | (ah << 30)) ^ ((al >>> 7) | (ah << 25)); 61389 s0l = ((al >>> 28) | (ah << 4)) ^ ((ah >>> 2) | (al << 30)) ^ ((ah >>> 7) | (al << 25)); 61390 61391 s1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((el >>> 9) | (eh << 23)); 61392 s1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((eh >>> 9) | (el << 23)); 61393 61394 abh = ah & bh; 61395 abl = al & bl; 61396 majh = abh ^ (ah & ch) ^ bch; 61397 majl = abl ^ (al & cl) ^ bcl; 61398 61399 chh = (eh & fh) ^ (~eh & gh); 61400 chl = (el & fl) ^ (~el & gl); 61401 61402 t1h = blocks[j]; 61403 t1l = blocks[j + 1]; 61404 t2h = K[j]; 61405 t2l = K[j + 1]; 61406 61407 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (hl & 0xFFFF); 61408 c2 = (t2l >>> 16) + (t1l >>> 16) + (chl >>> 16) + (s1l >>> 16) + (hl >>> 16) + (c1 >>> 16); 61409 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (hh & 0xFFFF) + (c2 >>
61409> 16); 61410 c4 = (t2h >>> 16) + (t1h >>> 16) + (chh >>> 16) + (s1h >>> 16) + (hh >>> 16) + (c3 >>> 16); 61411 61412 t1h = (c4 << 16) | (c3 & 0xFFFF); 61413 t1l = (c2 << 16) | (c1 & 0xFFFF); 61414 61415 c1 = (majl & 0xFFFF) + (s0l & 0xFFFF); 61416 c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16); 61417 c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16); 61418 c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16); 61419 61420 t2h = (c4 << 16) | (c3 & 0xFFFF); 61421 t2l = (c2 << 16) | (c1 & 0xFFFF); 61422 61423 c1 = (dl & 0xFFFF) + (t1l & 0xFFFF); 61424 c2 = (dl >>> 16) + (t1l >>> 16) + (c1 >>> 16); 61425 c3 = (dh & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); 61426 c4 = (dh >>> 16) + (t1h >>> 16) + (c3 >>> 16); 61427 61428 hh = (c4 << 16) | (c3 & 0xFFFF); 61429 hl = (c2 << 16) | (c1 & 0xFFFF); 61430 61431 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF); 61432 c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16); 61433 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); 61434 c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16); 61435 61436 dh = (c4 << 16) | (c3 & 0xFFFF); 61437 dl = (c2 << 16) | (c1 & 0xFFFF); 61438 61439 s0h = ((dh >>> 28) | (dl << 4)) ^ ((dl >>> 2) | (dh << 30)) ^ ((dl >>> 7) | (dh << 25)); 61440 s0l = ((dl >>> 28) | (dh << 4)) ^ ((dh >>> 2) | (dl << 30)) ^ ((dh >>> 7) | (dl << 25)); 61441 61442 s1h = ((hh >>> 14) | (hl << 18)) ^ ((hh >>> 18) | (hl << 14)) ^ ((hl >>> 9) | (hh << 23)); 61443 s1l = ((hl >>> 14) | (hh << 18)) ^ ((hl >>> 18) | (hh << 14)) ^ ((hh >>> 9) | (hl << 23)); 61444 61445 dah = dh & ah; 61446 dal = dl & al; 61447 majh = dah ^ (dh & bh) ^ abh; 61448 majl = dal ^ (dl & bl) ^ abl; 61449 61450 chh = (hh & eh) ^ (~hh & fh); 61451 chl = (hl & el) ^ (~hl & fl); 61452 61453 t1h = blocks[j + 2]; 61454 t1l = blocks[j + 3]; 61455 t2h = K[j + 2]; 61456 t2l = K[j + 3]; 61457 61458 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (gl & 0xFFFF); 61459 c2 = (t2l >>> 16) + (t1l >>> 16) + (chl >>> 16) + (s1l >>> 16) + (gl >>> 16) + (c1 >>> 16); 61460 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (gh & 0xFFFF) + (c2 >>> 16); 61461 c4 = (t2h >>> 16) + (t1h >>> 16) + (chh >>> 16) + (s1h >>> 16) + (gh >>> 16) + (c3 >>> 16); 61462 61463 t1h = (c4 << 16) | (c3 & 0xFFFF); 61464 t1l = (c2 << 16) | (c1 & 0xFFFF); 61465 61466 c1 = (majl & 0xFFFF) + (s0l & 0xFFFF); 61467 c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16); 61468 c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16); 61469 c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16); 61470 61471 t2h = (c4 << 16) | (c3 & 0xFFFF); 61472 t2l = (c2 << 16) | (c1 & 0xFFFF); 61473 61474 c1 = (cl & 0xFFFF) + (t1l & 0xFFFF); 61475 c2 = (cl >>> 16) + (t1l >>> 16) + (c1 >>> 16); 61476 c3 = (ch & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); 61477 c4 = (ch >>> 16) + (t1h >>> 16) + (c3 >>> 16); 61478 61479 gh = (c4 << 16) | (c3 & 0xFFFF); 61480 gl = (c2 << 16) | (c1 & 0xFFFF); 61481 61482 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF); 61483 c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16); 61484 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); 61485 c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16); 61486 61487 ch = (c4 << 16) | (c3 & 0xFFFF); 61488 cl = (c2 << 16) | (c1 & 0xFFFF); 61489 61490 s0h = ((ch >>> 28) | (cl << 4)) ^ ((cl >>> 2) | (ch << 30)) ^ ((cl >>> 7) | (ch << 25)); 61491 s0l = ((cl >>> 28) | (ch << 4)) ^ ((ch >>> 2) | (cl << 30)) ^ ((ch >>> 7) | (cl << 25)); 61492 61493 s1h = ((gh >>> 14) | (gl << 18)) ^ ((gh >>> 18) | (gl << 14)) ^ ((gl >>> 9) | (gh << 23)); 61494 s1l = ((gl >>> 14) | (gh << 18)) ^ ((gl >>> 18) | (gh << 14)) ^ ((gh >>> 9) | (gl << 23)); 61495 61496 cdh = ch & dh; 61497 cdl = cl & dl; 61498 majh = cdh ^ (ch & ah) ^ dah; 61499 majl = cdl ^ (cl & al) ^ dal; 61500 61501 chh = (gh & hh) ^ (~gh & eh); 61502 chl = (gl & hl) ^ (~gl & el); 61503 61504 t1h = blocks[j + 4]; 61505 t1l = blocks[j + 5]; 61506 t2h = K[j + 4]; 61507 t2l = K[j + 5]; 61508 61509 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (fl & 0xFFFF); 61510 c2 = (t2l >>> 16) + (t1l >>> 16) + (chl >>> 16) + (s1l >>> 16) + (fl >>> 16) + (c1 >>> 16); 61511 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (fh & 0xFFFF) + (c2 >>
61511> 16); 61512 c4 = (t2h >>> 16) + (t1h >>> 16) + (chh >>> 16) + (s1h >>> 16) + (fh >>> 16) + (c3 >>> 16); 61513 61514 t1h = (c4 << 16) | (c3 & 0xFFFF); 61515 t1l = (c2 << 16) | (c1 & 0xFFFF); 61516 61517 c1 = (majl & 0xFFFF) + (s0l & 0xFFFF); 61518 c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16); 61519 c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16); 61520 c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16); 61521 61522 t2h = (c4 << 16) | (c3 & 0xFFFF); 61523 t2l = (c2 << 16) | (c1 & 0xFFFF); 61524 61525 c1 = (bl & 0xFFFF) + (t1l & 0xFFFF); 61526 c2 = (bl >>> 16) + (t1l >>> 16) + (c1 >>> 16); 61527 c3 = (bh & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); 61528 c4 = (bh >>> 16) + (t1h >>> 16) + (c3 >>> 16); 61529 61530 fh = (c4 << 16) | (c3 & 0xFFFF); 61531 fl = (c2 << 16) | (c1 & 0xFFFF); 61532 61533 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF); 61534 c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16); 61535 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); 61536 c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16); 61537 61538 bh = (c4 << 16) | (c3 & 0xFFFF); 61539 bl = (c2 << 16) | (c1 & 0xFFFF); 61540 61541 s0h = ((bh >>> 28) | (bl << 4)) ^ ((bl >>> 2) | (bh << 30)) ^ ((bl >>> 7) | (bh << 25)); 61542 s0l = ((bl >>> 28) | (bh << 4)) ^ ((bh >>> 2) | (bl << 30)) ^ ((bh >>> 7) | (bl << 25)); 61543 61544 s1h = ((fh >>> 14) | (fl << 18)) ^ ((fh >>> 18) | (fl << 14)) ^ ((fl >>> 9) | (fh << 23)); 61545 s1l = ((fl >>> 14) | (fh << 18)) ^ ((fl >>> 18) | (fh << 14)) ^ ((fh >>> 9) | (fl << 23)); 61546 61547 bch = bh & ch; 61548 bcl = bl & cl; 61549 majh = bch ^ (bh & dh) ^ cdh; 61550 majl = bcl ^ (bl & dl) ^ cdl; 61551 61552 chh = (fh & gh) ^ (~fh & hh); 61553 chl = (fl & gl) ^ (~fl & hl); 61554 61555 t1h = blocks[j + 6]; 61556 t1l = blocks[j + 7]; 61557 t2h = K[j + 6]; 61558 t2l = K[j + 7]; 61559 61560 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF) + (chl & 0xFFFF) + (s1l & 0xFFFF) + (el & 0xFFFF); 61561 c2 = (t2l >>> 16) + (t1l >>> 16) + (chl >>> 16) + (s1l >>> 16) + (el >>> 16) + (c1 >>> 16); 61562 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (chh & 0xFFFF) + (s1h & 0xFFFF) + (eh & 0xFFFF) + (c2 >>> 16); 61563 c4 = (t2h >>> 16) + (t1h >>> 16) + (chh >>> 16) + (s1h >>> 16) + (eh >>> 16) + (c3 >>> 16); 61564 61565 t1h = (c4 << 16) | (c3 & 0xFFFF); 61566 t1l = (c2 << 16) | (c1 & 0xFFFF); 61567 61568 c1 = (majl & 0xFFFF) + (s0l & 0xFFFF); 61569 c2 = (majl >>> 16) + (s0l >>> 16) + (c1 >>> 16); 61570 c3 = (majh & 0xFFFF) + (s0h & 0xFFFF) + (c2 >>> 16); 61571 c4 = (majh >>> 16) + (s0h >>> 16) + (c3 >>> 16); 61572 61573 t2h = (c4 << 16) | (c3 & 0xFFFF); 61574 t2l = (c2 << 16) | (c1 & 0xFFFF); 61575 61576 c1 = (al & 0xFFFF) + (t1l & 0xFFFF); 61577 c2 = (al >>> 16) + (t1l >>> 16) + (c1 >>> 16); 61578 c3 = (ah & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); 61579 c4 = (ah >>> 16) + (t1h >>> 16) + (c3 >>> 16); 61580 61581 eh = (c4 << 16) | (c3 & 0xFFFF); 61582 el = (c2 << 16) | (c1 & 0xFFFF); 61583 61584 c1 = (t2l & 0xFFFF) + (t1l & 0xFFFF); 61585 c2 = (t2l >>> 16) + (t1l >>> 16) + (c1 >>> 16); 61586 c3 = (t2h & 0xFFFF) + (t1h & 0xFFFF) + (c2 >>> 16); 61587 c4 = (t2h >>> 16) + (t1h >>> 16) + (c3 >>> 16); 61588 61589 ah = (c4 << 16) | (c3 & 0xFFFF); 61590 al = (c2 << 16) | (c1 & 0xFFFF); 61591 } 61592 61593 c1 = (h0l & 0xFFFF) + (al & 0xFFFF); 61594 c2 = (h0l >>> 16) + (al >>> 16) + (c1 >>> 16); 61595 c3 = (h0h & 0xFFFF) + (ah & 0xFFFF) + (c2 >>> 16); 61596 c4 = (h0h >>> 16) + (ah >>> 16) + (c3 >>> 16); 61597 61598 h0h = (c4 << 16) | (c3 & 0xFFFF); 61599 h0l = (c2 << 16) | (c1 & 0xFFFF); 61600 61601 c1 = (h1l & 0xFFFF) + (bl & 0xFFFF); 61602 c2 = (h1l >>> 16) + (bl >>> 16) + (c1 >>> 16); 61603 c3 = (h1h & 0xFFFF) + (bh & 0xFFFF) + (c2 >>> 16); 61604 c4 = (h1h >>> 16) + (bh >>> 16) + (c3 >>> 16); 61605 61606 h1h = (c4 << 16) | (c3 & 0xFFFF); 61607 h1l = (c2 << 16) | (c1 & 0xFFFF); 61608 61609 c1 = (h2l & 0xFFFF) + (cl & 0xFFFF); 61610 c2 = (h2l >>> 16) + (cl >>> 16) + (c1 >>> 16); 61611 c3 = (h2h & 0xFFFF) + (ch & 0xFFFF) + (c2 >>> 16); 61612 c4 = (h2h >>> 16) + (ch >>> 16) + (c3 >>> 16); 61613 61614 h2h = (c4 << 16) | (c3 & 0xFFFF); 61615 h2l = (c2 << 16) | (c1 & 0xFFFF); 61616 61617 c1 = (h3l & 0xFFFF) + (dl & 0xFFFF); 61618 c2 = (h3l >>> 16) + (dl >>> 16) + (c1 >>> 16); 61619 c3 = (h3h & 0xFFFF) + (dh & 0xFFFF) + (c2 >>
61619> 16); 61620 c4 = (h3h >>> 16) + (dh >>> 16) + (c3 >>> 16); 61621 61622 h3h = (c4 << 16) | (c3 & 0xFFFF); 61623 h3l = (c2 << 16) | (c1 & 0xFFFF); 61624 61625 c1 = (h4l & 0xFFFF) + (el & 0xFFFF); 61626 c2 = (h4l >>> 16) + (el >>> 16) + (c1 >>> 16); 61627 c3 = (h4h & 0xFFFF) + (eh & 0xFFFF) + (c2 >>> 16); 61628 c4 = (h4h >>> 16) + (eh >>> 16) + (c3 >>> 16); 61629 61630 h4h = (c4 << 16) | (c3 & 0xFFFF); 61631 h4l = (c2 << 16) | (c1 & 0xFFFF); 61632 61633 c1 = (h5l & 0xFFFF) + (fl & 0xFFFF); 61634 c2 = (h5l >>> 16) + (fl >>> 16) + (c1 >>> 16); 61635 c3 = (h5h & 0xFFFF) + (fh & 0xFFFF) + (c2 >>> 16); 61636 c4 = (h5h >>> 16) + (fh >>> 16) + (c3 >>> 16); 61637 61638 h5h = (c4 << 16) | (c3 & 0xFFFF); 61639 h5l = (c2 << 16) | (c1 & 0xFFFF); 61640 61641 c1 = (h6l & 0xFFFF) + (gl & 0xFFFF); 61642 c2 = (h6l >>> 16) + (gl >>> 16) + (c1 >>> 16); 61643 c3 = (h6h & 0xFFFF) + (gh & 0xFFFF) + (c2 >>> 16); 61644 c4 = (h6h >>> 16) + (gh >>> 16) + (c3 >>> 16); 61645 61646 h6h = (c4 << 16) | (c3 & 0xFFFF); 61647 h6l = (c2 << 16) | (c1 & 0xFFFF); 61648 61649 c1 = (h7l & 0xFFFF) + (hl & 0xFFFF); 61650 c2 = (h7l >>> 16) + (hl >>> 16) + (c1 >>> 16); 61651 c3 = (h7h & 0xFFFF) + (hh & 0xFFFF) + (c2 >>> 16); 61652 c4 = (h7h >>> 16) + (hh >>> 16) + (c3 >>> 16); 61653 61654 h7h = (c4 << 16) | (c3 & 0xFFFF); 61655 h7l = (c2 << 16) | (c1 & 0xFFFF); 61656 } while (!end); 61657 61658 var hex = HEX_CHARS[(h0h >> 28) & 0x0F] + HEX_CHARS[(h0h >> 24) & 0x0F] + 61659 HEX_CHARS[(h0h >> 20) & 0x0F] + HEX_CHARS[(h0h >> 16) & 0x0F] + 61660 HEX_CHARS[(h0h >> 12) & 0x0F] + HEX_CHARS[(h0h >> 8) & 0x0F] + 61661 HEX_CHARS[(h0h >> 4) & 0x0F] + HEX_CHARS[h0h & 0x0F] + 61662 HEX_CHARS[(h0l >> 28) & 0x0F] + HEX_CHARS[(h0l >> 24) & 0x0F] + 61663 HEX_CHARS[(h0l >> 20) & 0x0F] + HEX_CHARS[(h0l >> 16) & 0x0F] + 61664 HEX_CHARS[(h0l >> 12) & 0x0F] + HEX_CHARS[(h0l >> 8) & 0x0F] + 61665 HEX_CHARS[(h0l >> 4) & 0x0F] + HEX_CHARS[h0l & 0x0F] + 61666 HEX_CHARS[(h1h >> 28) & 0x0F] + HEX_CHARS[(h1h >> 24) & 0x0F] + 61667 HEX_CHARS[(h1h >> 20) & 0x0F] + HEX_CHARS[(h1h >> 16) & 0x0F] + 61668 HEX_CHARS[(h1h >> 12) & 0x0F] + HEX_CHARS[(h1h >> 8) & 0x0F] + 61669 HEX_CHARS[(h1h >> 4) & 0x0F] + HEX_CHARS[h1h & 0x0F] + 61670 HEX_CHARS[(h1l >> 28) & 0x0F] + HEX_CHARS[(h1l >> 24) & 0x0F] + 61671 HEX_CHARS[(h1l >> 20) & 0x0F] + HEX_CHARS[(h1l >> 16) & 0x0F] + 61672 HEX_CHARS[(h1l >> 12) & 0x0F] + HEX_CHARS[(h1l >> 8) & 0x0F] + 61673 HEX_CHARS[(h1l >> 4) & 0x0F] + HEX_CHARS[h1l & 0x0F] + 61674 HEX_CHARS[(h2h >> 28) & 0x0F] + HEX_CHARS[(h2h >> 24) & 0x0F] + 61675 HEX_CHARS[(h2h >> 20) & 0x0F] + HEX_CHARS[(h2h >> 16) & 0x0F] + 61676 HEX_CHARS[(h2h >> 12) & 0x0F] + HEX_CHARS[(h2h >> 8) & 0x0F] + 61677 HEX_CHARS[(h2h >> 4) & 0x0F] + HEX_CHARS[h2h & 0x0F] + 61678 HEX_CHARS[(h2l >> 28) & 0x0F] + HEX_CHARS[(h2l >> 24) & 0x0F] + 61679 HEX_CHARS[(h2l >> 20) & 0x0F] + HEX_CHARS[(h2l >> 16) & 0x0F] + 61680 HEX_CHARS[(h2l >> 12) & 0x0F] + HEX_CHARS[(h2l >> 8) & 0x0F] + 61681 HEX_CHARS[(h2l >> 4) & 0x0F] + HEX_CHARS[h2l & 0x0F] + 61682 HEX_CHARS[(h3h >> 28) & 0x0F] + HEX_CHARS[(h3h >> 24) & 0x0F] + 61683 HEX_CHARS[(h3h >> 20) & 0x0F] + HEX_CHARS[(h3h >> 16) & 0x0F] + 61684 HEX_CHARS[(h3h >> 12) & 0x0F] + HEX_CHARS[(h3h >> 8) & 0x0F] + 61685 HEX_CHARS[(h3h >> 4) & 0x0F] + HEX_CHARS[h3h & 0x0F]; 61686 if (bits >= 256) { 61687 hex += HEX_CHARS[(h3l >> 28) & 0x0F] + HEX_CHARS[(h3l >> 24) & 0x0F] + 61688 HEX_CHARS[(h3l >> 20) & 0x0F] + HEX_CHARS[(h3l >> 16) & 0x0F] + 61689 HEX_CHARS[(h3l >> 12) & 0x0F] + HEX_CHARS[(h3l >> 8) & 0x0F] + 61690 HEX_CHARS[(h3l >> 4) & 0x0F] + HEX_CHARS[h3l & 0x0F]; 61691 } 61692 if (bits >= 384) { 61693 hex += HEX_CHARS[(h4h >> 28) & 0x0F] + HEX_CHARS[(h4h >> 24) & 0x0F] + 61694 HEX_CHARS[(h4h >> 20) & 0x0F] + HEX_CHARS[(h4h >> 16) & 0x0F] + 61695 HEX_CHARS[(h4h >> 12) & 0x0F] + HEX_CHARS[(h4h >> 8) & 0x0F] + 61696 HEX_CHARS[(h4h >> 4) & 0x0F] + HEX_CHARS[h4h & 0x0F] + 61697 HEX_CHARS[(h4l >> 28) & 0x0F] + HEX_CHARS[(h4l >> 24) & 0x0F] + 61698 HEX_CHARS[(h4l >> 20) & 0x0F] + HEX_CHARS[(h4l >> 16) & 0x0F] + 61699 HEX_CHARS[(h4l >> 12) & 0x0F] + HEX_CHARS[(h4l >> 8) & 0x0F] + 61700 HEX_CHARS[(h4l >> 4) & 0x0F] + HEX_CHARS[h4l & 0x0F] + 61701 HEX_CHARS[(h5h >> 28) & 0x0F] + HEX_CHARS[(h5h >> 24) & 0x0F] + 61702 HEX_CHARS[(h5h >> 20) & 0x0F] + HEX_CHARS[(h5h >> 16) & 0x0F] + 61703 HEX_CHARS[(h5h >> 12) & 0x0F] + HEX_CHARS[(h5h >> 8) & 0x0F] + 61704 HEX_CHARS[(h5h >> 4) & 0x0F] + HEX_CHARS[h5h & 0x0F] + 61705 HEX_CHARS[(h5l >> 28) & 0x0F] + HEX_CHARS[(h5l >> 24) & 0x0F] + 61706 HEX_CHARS[(h5l >> 20) & 0x0F] + HEX_CHARS[(h5l >> 16) & 0x0F] + 61707 HEX_CHARS[(h5l >> 12) & 0x0F] + HEX_CHARS[(h5l >> 8) & 0x0F] + 61708 HEX_CHARS[(h5l >> 4) & 0x0F] + HEX_CHARS[h5l & 0x0F]; 61709 } 61710 if (bits == 512) { 61711 hex += HEX_CHARS[(h6h >> 28) & 0x0F] + HEX_CHARS[(h6h >> 24) & 0x0F] + 61712 HEX_CHARS[(h6h >> 20) & 0x0F] + HEX_CHARS[(h6h >> 16) & 0x0F] + 61713 HEX_CHARS[(h6h >> 12) & 0x0F] + HEX_CHARS[(h6h >> 8) & 0x0F] + 61714 HEX_CHARS[(h6h >> 4) & 0x0F] + HEX_CHARS[h6h & 0x0F] + 61715 HEX_CHARS[(h6l >> 28) & 0x0F] + HEX_CHARS[(h6l >> 24) & 0x0F] + 61716 HEX_CHARS[(h6l >> 20) & 0x0F] + HEX_CHARS[(h6l >> 16) & 0x0F] + 61717 HEX_CHARS[(h6l >> 12) & 0x0F] + HEX_CHARS[(h6l >> 8) & 0x0F] + 61718 HEX_CHARS[(h6l >> 4) & 0x0F] + HEX_CHARS[h6l & 0x0F] + 61719 HEX_CHARS[(h7h >> 28) & 0x0F] + HEX_CHARS[(h7h >> 24) & 0x0F] + 61720 HEX_CHARS[(h7h >> 20) & 0x0F] + HEX_CHARS[(h7h >> 16) & 0x0F] + 61721 HEX_CHARS[(h7h >> 12) & 0x0F] + HEX_CHARS[(h7h >> 8) & 0x0F] + 61722 HEX_CHARS[(h7h >> 4) & 0x0F] + HEX_CHARS[h7h & 0x0F] + 61723 HEX_CHARS[(h7l >> 28) & 0x0F] + HEX_CHARS[(h7l >> 24) & 0x0F] + 61724 HEX_CHARS[(h7l >> 20) & 0x0F] + HEX_CHARS[(h7l >> 16) & 0x0F] + 61725 HEX_CHARS[(h7l >> 12) & 0x0F] + HEX_CHARS[(h7l >> 8) & 0x0F] + 61726 HEX_CHARS[(h7l >> 4) & 0x0F] + HEX_CHARS[h7l & 0x0F]; 61727 } 61728 return hex; 61729 }; 61730 61731 var exports = sha512; 61732 exports.sha512 = sha512; 61733 exports.sha384 = sha384; 61734 exports.sha512_256 = sha512_256; 61735 exports.sha512_224 = sha512_224; 61736 61737 if (COMMON_JS) { 61738 module.exports = exports; 61739 } else { 61740 root.sha512 = sha512; 61741 root.sha384 = sha384; 61742 root.sha512_256 = sha512_256; 61743 root.sha512_224 = sha512_224; 61744 if (AMD) { 61745 define(function () { 61746 return exports; 61747 }); 61748 } 61749 } 61750})(); 61751 61752/*!!! migrated to jQuery 1.9.1 !!!*/ 61753 61754/*----------------------------------------------------------------------*/ 61755/* wl_Breadcrumb v 1.0 by revaxarts.com 61756/* description: Makes and handles a Breadcrumb navigation
61757/* dependency: 61758/*----------------------------------------------------------------------*/ 61759 61760 61761$.fn.wl_Breadcrumb = function (method) { 61762 61763 var args = arguments; 61764 return this.each(function () { 61765 61766 var $this = $(this), 61767 $li = $this.find('li'); 61768 $a = $this.find('a'); 61769 61770 61771 if ($.fn.wl_Breadcrumb.methods[method]) { 61772 return $.fn.wl_Breadcrumb.methods[method].apply(this, Array.prototype.slice.call(args, 1)); 61773 } else if (typeof method === 'object' || !method) { 61774 if ($this.data('wl_Breadcrumb')) { 61775 var opts = $.extend({}, $this.data('wl_Breadcrumb'), method); 61776 } else { 61777 var opts = $.extend({}, $.fn.wl_Breadcrumb.defaults, method, $this.data()); 61778 } 61779 } else { 61780 $.error('Method "' + method + '" does not exist'); 61781 } 61782 61783 //get the current field or use the first if not set 61784 var $current = $this.find('a.active').eq(0); 61785 if (!$current.length) $current = $a.eq(opts.start); 61786 61787 61788 if (!$this.data('wl_Breadcrumb')) { 61789 61790 $this.data('wl_Breadcrumb', {}); 61791 61792 //each anchor 61793 $a.each(function (i) { 61794 var _this = $(this); 61795 //save the id 61796 _this.data('id', i); 61797 61798 //prepend numbers if set 61799 if (opts.numbers) _this.text((i + 1) + '. ' + _this.text()); 61800 }); 61801 61802 //each listelement 61803 $li.each(function (i) { 61804 var _this = $(this); 61805 61806 //if has a class (must be an icon) 61807 if (_this.attr('class')) { 61808 //innerwrap the anchor to attach the icon 61809 $a.eq(i).wrapInner('<span class="' + _this.attr('class') + '"/>'); 61810 //remove the class from the list element 61811 _this.removeAttr('class'); 61812 } 61813 }); 61814 61815 //add a 'last' class to the last element for IE :( 61816 if (navigator.appVersion.indexOf("MSIE") != -1) $li.filter(':last').addClass('last'); 61817 61818 //Bind the click handler 61819 $this.delegate('a', 'click.wl_Breadcrumb', function () { 61820 var opts = $this.data('wl_Breadcrumb') || opts; 61821 61822 //if disabled stop 61823 if (opts.disabled) return false; 61824 var _this = $(this); 61825 61826 //if not allownextonly or data is current+1 or current-x 61827 if (!opts.allownextonly || _this.data('id') - $this.find('a.active').data('id') <= 1) { 61828 61829 //activate and trigger callback 61830 $.fn.wl_Breadcrumb.methods.activate.call($this[0], _this); 61831 opts.onChange.call($this[0], _this, _this.data('id')); 61832 } 61833 return false; 61834 }); 61835 61836 //connected breadcrumb 61837 if (opts.connect) { 61838 var $connect = $('#' + opts.connect), 61839 $pages = $connect.children(); 61840 61841 //bind event to all 'next' class elements 61842 $connect.find('.next').bind('click.wl_Breadcrumb', function () { 61843 $this.wl_Breadcrumb('next'); 61844 return false; 61845 }); 61846 //bind event to all 'prev' class elements 61847 $connect.find('.prev').bind('click.wl_Breadcrumb', function () { 61848 $this.wl_Breadcrumb('prev'); 61849 return false; 61850 }); 61851 61852 //hide all and show the starting one 61853 $pages.hide().eq(opts.start).show(); 61854 61855 } 61856 61857 //disable if set 61858 if (opts.disabled) { 61859 $this.wl_Breadcrumb('disable'); 61860 } 61861 } else { 61862 61863 } 61864 61865 if (opts) $.extend($this.data('wl_Breadcrumb'), opts); 61866 61867 //activate the current part 61868 $.fn.wl_Breadcrumb.methods.activate.call(this, $current); 61869 }); 61870 61871}; 61872 61873$.fn.wl_Breadcrumb.defaults = { 61874 start: 0, 61875 numbers: false, 61876 allownextonly: false, 61877 disabled: false, 61878 connect: null, 61879 onChange: function () {} 61880}; 61881$.fn.wl_Breadcrumb.version = '1.0'; 61882 61883 61884$.fn.wl_Breadcrumb.methods = { 61885 activate: function (element) { 61886 var $this = $(this); 61887 61888 //element is a number so we mean the id 61889 if (typeof element === 'number') { 61890 element = $this.find('li').eq(element).find('a'); 61891 element.trigger('click.wl_Breadcrumb'); 61892 return false; 61893 } 61894 var _opts = $this.data('wl_Breadcrumb'); 61895 //remove classes 61896 $this.find('a').removeClass('active previous'); 61897 //find all previous tabs and add a class 61898 element.parent().prevAll().find('a').addClass('previous'); 61899 //add and active class to the current tab 61900 element.addClass('active'); 61901 //connected breadcrumb 61902 if (_opts.connect) { 61903 var $connect = $('#' + _opts.connect), 61904 $pages = $connect.children(); 61905 //hide all and show selected 61906 $pages.hide().eq(element.data('id')).show(); 61907 } 61908 }, 61909 disable: function () { 61910 var $this = $(this); 61911 //disable and add class disable 61912 $this.wl_Breadcrumb('set', 'disabled', true); 61913 $this.addClass('disabled'); 61914 }, 61915 enable: function () { 61916 var $this = $(this); 61917 //enable and remove class disable 61918 $this.wl_Breadcrumb('set', 'disabled', false); 61919 $this.removeClass('disabled'); 61920 }, 61921 next: function () { 61922 var $this = $(this); 61923 //click next tab 61924 $this.find('a.active').parent().next().find('a').trigger('click.wl_Breadcrumb'); 61925 }, 61926 prev: function () { 61927 var $this = $(this); 61928 //click prev tab 61929 $this.find('a.active').parent().prev().find('a').trigger('click.wl_Breadcrumb'); 61930 }, 61931 set: function () { 61932 var $this = $(this), 61933 options = {}; 61934 if (typeof arguments[0] === 'object') { 61935 options = arguments[0]; 61936 } else if (arguments[0] && arguments[1] !== undefined) { 61937 options[arguments[0]] = arguments[1]; 61938 } 61939 $.each(options, function (key, value) { 61940 if ($.fn.wl_Breadcrumb.defaults[key] !== undefined || $.fn.wl_Breadcrumb.defaults[key] == null) { 61941 $this.data('wl_Breadcrumb')[key] = value; 61942 } else { 61943 $.error('Key "' + key + '" is not defined'); 61944 } 61945 }); 61946 61947 } 61948}; 61949/*----------------------------------------------------------------------*/ 61950/* wl_Dialog v 1.1 by revaxarts.com 61951/* description: handles alert boxes, prompt boxes and confirm boxes and 61952/* message boxes 61953/* contains 4 plugins
61954/* dependency: jquery UI Dialog 61955/*----------------------------------------------------------------------*/ 61956 61957 61958/*----------------------------------------------------------------------*/ 61959/* Confirm Dialog 61960/* like the native confirm method 61961/*----------------------------------------------------------------------*/ 61962$.confirm = function (text, callback, cancelcallback) { 61963 61964 var options = $.extend(true, {}, $.alert.defaults, $.confirm.defaults); 61965 61966 //nativ behaviour 61967 if (options.nativ) { 61968 if (result = confirm(unescape(text))) { 61969 if ($.isFunction(callback)) callback.call(this); 61970 } else { 61971 if ($.isFunction(cancelcallback)) cancelcallback.call(this); 61972 } 61973 return; 61974 } 61975 61976 //the callbackfunction 61977 var cb = function () { 61978 if ($.isFunction(callback)) callback.call(this); 61979 $(this).dialog('close'); 61980 $('#wl_dialog').remove(); 61981 }, 61982 61983 //the callbackfunction on cancel 61984 ccb = function () { 61985 if ($.isFunction(cancelcallback)) cancelcallback.call(this); 61986 $(this).dialog('close'); 61987 $('#wl_dialog').remove(); 61988 }; 61989 61990 //set some options 61991 options = $.extend({}, { 61992 buttons: [{ 61993 text: options.text.ok, 61994 click: cb 61995 }, { 61996 text: options.text.cancel, 61997 click: ccb 61998 }] 61999 }, options); 62000 62001 //use the dialog 62002 return $.alert(unescape(text), options); 62003}; 62004 62005$.confirm.defaults = { 62006 text: { 62007 header: 'Please confirm', 62008 ok: 'Yes', 62009 cancel: 'No' 62010 } 62011}; 62012 62013/*----------------------------------------------------------------------*/ 62014/* Prompt Dialog 62015/* like the native prompt method 62016/*----------------------------------------------------------------------*/ 62017 62018$.prompt = function (text, value, callback, cancelcallback) { 62019 62020 var options = $.extend(true, {}, $.alert.defaults, $.prompt.defaults); 62021 62022 //nativ behaviour 62023 if (options.nativ) { 62024 var val = prompt(unescape($.trim(text)), unescape(value)); 62025 if ($.isFunction(callback) && val !== null) { 62026 callback.call(this, val); 62027 } else { 62028 if ($.isFunction(cancelcallback)) cancelcallback.call(this); 62029 } 62030 return; 62031 } 62032 62033 //the callbackfunction 62034 var cb = function (value) { 62035 if ($.isFunction(callback)) callback.call(this, value); 62036 $(this).dialog('close'); 62037 $('#wl_dialog').remove(); 62038 }, 62039 62040 //the callbackfunction on cancel 62041 ccb = function () { 62042 if ($.isFunction(cancelcallback)) cancelcallback.call(this); 62043 $(this).dialog('close'); 62044 $('#wl_dialog').remove(); 62045 }; 62046 62047 //set some options 62048 options = $.extend({}, { 62049 buttons: [{ 62050 text: options.text.ok, 62051 click: function () { 62052 cb.call(this, $('#wl_promptinputfield').val()); 62053 } 62054 }, { 62055 text: options.text.cancel, 62056 click: ccb 62057 }], 62058 open: function () { 62059 $('#wl_promptinputfield').focus().select(); 62060 $('#wl_promptinputfield').uniform(); 62061 $('#wl_promptinputform').bind('submit', function (event) { 62062 event.preventDefault(); 62063 cb.call(this, $('#wl_promptinputfield').val()); 62064 $(this).parent().dialog('close'); 62065 $('#wl_dialog').remove(); 62066 }); 62067 62068 } 62069 }, options); 62070 62071 //use the dialog 62072 return $.alert('<p>' + unescape(text) + '</p><form id="wl_promptinputform"><input id="wl_promptinputfield" name="wl_promptinputfield" value="' + unescape(value) + '"></form>', options); 62073}; 62074 62075$.prompt.defaults = { 62076 text: { 62077 header: 'Please prompt', 62078 ok: 'OK', 62079 cancel: 'Cancel' 62080 } 62081}; 62082 62083 62084/*----------------------------------------------------------------------*/ 62085/* Alert Dialog 62086/* like the native alert method 62087/*----------------------------------------------------------------------*/ 62088 62089$.alert = function (content, options) { 62090 //if no options it is a normal dialog 62091 if (!options) { 62092 var options = $.extend(true, {}, { 62093 buttons: [{ 62094 text: $.alert.defaults.text.ok, 62095 click: function () { 62096 $(this).dialog('close'); 62097 $('#wl_dialog').remove(); 62098 } 62099 }] 62100 }, $.alert.defaults); 62101 } 62102 62103 //nativ behaviour 62104 if (options.nativ) { 62105 alert(content); 62106 return; 62107 } 62108 62109 //create a container
62110 var container = $('<div/>', { 62111 id: 'wl_dialog' 62112 }).appendTo('body'); 62113 62114 //set a header 62115 if (options.text && options.text.header) 62116 container.attr('title', options.text.header); 62117 else 62118 container.attr('title', $.alert.defaults.text.header); 62119 62120 //fill the container 62121 container.html(content.replace(/\n/g, '<br>')); 62122 //display the dialog 62123 container.dialog(options); 62124 62125 return{ 62126 close:function(callback){ 62127 container.dialog('close'); 62128 container.remove(); 62129 if($.isFunction(callback)) callback.call(this); 62130 }, 62131 setHeader:function(text){ 62132 this.set('title',text); 62133 }, 62134 setBody:function(html){ 62135 container.html(html); 62136 }, 62137 set:function(option, value){ 62138 container.dialog("option", option, value); 62139 }, 62140 open: function () { 62141 container.dialog('open'); 62142 }, 62143 } 62144 62145 62146}; 62147 62148 62149$.alert.defaults = { 62150 nativ: false, 62151 resizable: false, 62152 modal: true, 62153 text: { 62154 header: 'Notification', 62155 ok: 'OK' 62156 } 62157}; 62158 62159 62160/*----------------------------------------------------------------------*/ 62161/* Message Function 62162/*----------------------------------------------------------------------*/ 62163 62164 62165$.msg = function (content, options) { 62166 62167 62168 //get the options 62169 var options = $.extend({}, $.msg.defaults, options); 62170 62171 var container = $('#wl_msg'),msgbox; 62172 62173 //the container doen't exists => create it 62174 if (!container.length) {
62175 container = $('<div/>', { 62176 id: 'wl_msg' 62177 }).appendTo('body').data('msgcount', 0); 62178 var topoffset = parseInt(container.css('top'), 10); 62179 62180 //bind some events to it 62181 container.bind('mouseenter', function () { 62182 container.data('pause', true); 62183 }).bind('mouseleave', function () { 62184 container.data('pause', false); 62185 }); 62186 container.delegate('.msg-close', 'click', function () { 62187 container.data('pause', false); 62188 close($(this).parent()); 62189 }); 62190 container.delegate('.msg-box-close', 'click', function () { 62191 container.fadeOutSlide(options.fadeTime); 62192 }); 62193 62194 //bind the scroll event 62195 $(window).unbind('scroll.wl_msg').bind('scroll.wl_msg', function () { 62196 var pos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop; 62197 if (pos > topoffset) { 62198 (window.navigator.standalone === undefined) ? container.css({ 62199 position: 'fixed', 62200 top: 10 62201 }) : container.css({ 62202 top: pos + 10 62203 }); 62204 } else { 62205 (window.navigator.standalone === undefined) ? container.removeAttr('style') : container.css({ 62206 top: topoffset 62207 }); 62208 } 62209 }).trigger('scroll.wl_msg'); 62210 } 62211 62212 //stop if no content is set 62213 if(!content)return false; 62214 62215 //count of displayed messages 62216 var count = container.data('msgcount'); 62217 62218 function getHTML(content, headline) { 62219 return '<div class="msg-box"><h3>' + (headline || '') + '</h3><a class="msg-close">close</a><div class="msg-content">' + content.replace('\n', '<br>') + '</div></div>'; 62220 } 62221 62222 function create() { 62223 msgbox = $(getHTML(content, options.header)), 62224 closeall = $('.msg-box-close'); 62225 62226 //we have some messages allready 62227 if (count) { 62228 62229 //No close all button 62230 if (!closeall.length) { 62231 msgbox.appendTo(container); 62232 $('<div class="msg-box-close">close all</div>').appendTo(container).fadeInSlide(options.fadeTime); 62233 62234 //Close all button 62235 } else { 62236 msgbox.insertBefore(closeall); 62237 } 62238 62239 //first message 62240 } else { 62241 msgbox.appendTo(container); 62242 } 62243 62244 //fade it in nicely 62245 msgbox.fadeInSlide(options.fadeTime); 62246 62247 //add the count of the messages to the container 62248 container.data('msgcount', ++count); 62249 62250 //outclose it only if it's not sticky 62251 if (!options.sticky) { 62252 close(msgbox, options.live); 62253 } 62254 } 62255 62256 function close(item, delay, callback) { 62257 if ($.isFunction(delay)){ 62258 callback = delay; 62259 delay = 0; 62260 }else if(!delay){ 62261 delay = 0; 62262 } 62263 setTimeout(function () { 62264 62265 //if the mouse isn't over the container 62266 if (!container.data('pause')) { 62267 item.fadeOutSlide(options.fadeTime, function () { 62268 var count = $('.msg-box').length; 62269 if (count < 2 && $('.msg-box-close').length) { 62270 $('.msg-box-close').fadeOutSlide(options.fadeTime); 62271 } 62272 container.data('msgcount', count); 62273 if($.isFunction(callback)) callback.call(item); 62274 }) 62275 //try again... 62276 } else { 62277 close(item, delay); 62278 } 62279 62280 }, delay); 62281 } 62282 62283 //create the messsage 62284 create(); 62285 62286 return { 62287 close:function(callback){ 62288 close(msgbox,callback); 62289 }, 62290 setHeader:function(text){ 62291 msgbox.find('h3').eq(0).text(text); 62292 }, 62293 setBody:function(html){ 62294 msgbox.find('.msg-content').eq(0).html(html); 62295 }, 62296 closeAll:function(callback){ 62297 container.fadeOutSlide(options.fadeTime, function(){ 62298 if($.isFunction(callback)) callback.call(this); 62299 }); 62300 } 62301 } 62302 62303}; 62304 62305$.msg.defaults = { 62306 header: null, 62307 live: 5000, 62308 topoffset: 90, 62309 fadeTime: 500, 62310 sticky: false 62311}; 62312 62313//initial call to prevent IE to jump to the top 62314$(document).ready(function() {$.msg(false);}); 62315 62316/*!!! migrated to jQuery 1.9.1 !!!*/ 62317 62318/*----------------------------------------------------------------------*/ 62319/* wl_Store v 1.0 by revaxarts.com 62320/* description: Uses LocalStorage to save information within the Browser 62321/* enviroment 62322/* dependency: >IE7 :) 62323/*----------------------------------------------------------------------*/ 62324 62325 62326$.wl_Store = function (namespace) { 62327 62328 //IE7 isn't a cool client :( 62329 var coolClient = (typeof window.localStorage !== 'undefined' && typeof JSON !== 'undefined'), 62330 //namespace for the storage 62331 namespace = namespace || 'wl_store', 62332 62333 62334 loc = { 62335 62336 //method to save data 62337 save: function (key, value) { 62338 var _save; 62339 if (typeof key !== 'object') { 62340 var _current = get() || {}; 62341 var _obj = {}; 62342 _obj[key] = value; 62343 _save = $.extend({}, _current, _obj); 62344 } else { 62345 _save = key; 62346 } 62347 localStorage[namespace] = JSON.stringify(_save); 62348 return true; 62349 }, 62350 62351 //method to get data 62352 get: function (key) { 62353 if (!localStorage[namespace]) 62354 return null; 62355 62356 var _obj = $.parseJSON(localStorage[namespace]); 62357 62358 if (typeof key !== 'undefined' && _obj) { 62359 return _obj[key]; 62360 } 62361 return _obj; 62362 }, 62363 62364 //method to remove data 62365 remove: function (key) { 62366 var obj = get(); 62367 if (typeof key !== 'undefined' && obj[key]) { 62368 delete obj[key]; 62369 for (var i in obj) { 62370 var notempty = true; 62371 break; 62372 } 62373 if (notempty) { 62374 save(obj); 62375 return true; 62376 } 62377 } 62378 localStorage.removeItem(namespace); 62379 return true; 62380 }, 62381 62382 //delete all saved data 62383 flush: function () { 62384 localStorage.clear(); 62385 return true; 62386 } 62387 }, 62388 62389 //IE 7 can't handle localStorage but cookies are to bad for storing huge data 62390 cok = { 62391 save: function (key, value) { 62392 return false;
62393 }, 62394 get: function (key) { 62395 return false; 62396 }, 62397 remove: function (key) { 62398 return false; 62399 }, 62400 flush: function () { 62401 return false; 62402 } 62403 }, 62404 save = function (key, value) { 62405 return (coolClient) ? loc.save(key, value) : cok.save(key, value); 62406 }, 62407 62408 remove = function (key) { 62409 return (coolClient) ? loc.remove(key) : cok.remove(key); 62410 }, 62411 62412 flush = function () { 62413 return (coolClient) ? loc.flush() : cok.flush(); 62414 }, 62415 62416 get = function (key) { 62417 return (coolClient) ? loc.get(key) : cok.get(key); 62418 }; 62419 62420 //public methods 62421 return { 62422 save: function (key, value) { 62423 return save(key, value); 62424 }, 62425 get: function (key) { 62426 return get(key); 62427 }, 62428 remove: function (key) { 62429 return remove(key); 62430 }, 62431 flush: function () { 62432 return flush(); 62433 } 62434 62435 } 62436 62437 62438}; 62439/*----------------------------------------------------------------------*/ 62440/* wl_Widget v 1.1 by revaxarts.com 62441/* description: handles all function for the widgets 62442/* dependency: wl_Store, jquery sortable a.d. 62443/*----------------------------------------------------------------------*/ 62444 62445 62446$.fn.wl_Widget = function (method) { 62447 62448 var args = arguments; 62449 return this.each(function () { 62450 62451 var $this = $(this); 62452 62453 if ($.fn.wl_Widget.methods[method]) { 62454 return $.fn.wl_Widget.methods[method].apply(this, Array.prototype.slice.call(args, 1)); 62455 } else if (typeof method === 'object' || !method) { 62456 if ($this.data('wl_Widget')) { 62457 var opts = $.extend({}, $this.data('wl_Widget'), method); 62458 } else { 62459 var opts = $.extend({}, $.fn.wl_Widget.defaults, method, $this.data()); 62460 } 62461 } else { 62462 $.error('Method "' + method + '" does not exist'); 62463 } 62464 62465 62466 if (!$this.data('wl_Widget')) { 62467 62468 $this.data('wl_Widget', {}); 62469 62470 //find the widgets within the conatainer 62471 var $widgets = $this.find('div.widget'); 62472 62473 //iterate thru the widgets 62474 $widgets.each(function () { 62475 var $widget = $(this), 62476 _opts = $.extend({}, opts, $widget.data()), 62477 $handle = $widget.find('h3.handle'), 62478 $content = $widget.find('div').eq(0), 62479 $container = $widget.parent(); 62480 62481 $widget.data('wl_Widget', {}); 62482 62483 //set an icon 62484 if (_opts.icon) { 62485 $handle.addClass('icon'); 62486 $('<a>', { 62487 'class': 'icon i_' + _opts.icon 62488 }).appendTo($handle); 62489 } 62490 62491 //if sortable add a class 62492 if (_opts.sortable) { 62493 $widget.addClass('sortable'); 62494 } 62495 62496 //if collapseable 62497 if(_opts.collapseable){ 62498 //add the collapse button 62499 $('<a>', { 62500 'class': 'collapse', 62501 'title': _opts.text.collapse 62502 }).appendTo($handle); 62503 62504 //collapse if set 62505 if (_opts.collapsed) { 62506 $content.hide(); 62507 $widget.addClass('collapsed'); 62508 $handle.find('a.collapse').attr('title',_opts.text.expand); 62509 } 62510 62511 62512 //handle the collapse button (touchstart is required for iOS devices) 62513 $handle.delegate('a.collapse', 'click.wl_Widget touchstart.wl_Widget', function (event) { 62514 var _opts = $widget.data('wl_Widget') || _opts, 62515 _content = $widget.find('div').eq(0); 62516 62517 if (_content.is(':hidden')) { 62518 62519 //expand hidden content 62520 _content.slideDown(100, function () { 62521 $widget.removeClass('collapsed').data('wl_Widget').collapsed = false; 62522 $handle.find('a.collapse').attr('title',_opts.text.collapse); 62523 //callback 62524 _opts.onExpand.call($widget[0]); 62525 //save 62526 $.fn.wl_Widget.methods.save(); 62527 62528 //trigger resize for some plugins 62529 $(window).resize(); 62530 }); 62531 } else { 62532 62533 //hide content 62534 $content.slideUp(100, function () { 62535 $widget.addClass('collapsed').data('wl_Widget').collapsed = true; 62536 $handle.find('a.collapse').attr('title',_opts.text.expand); 62537 //callback 62538 _opts.onCollapse.call($widget[0]); 62539 //save 62540 $.fn.wl_Widget.methods.save(); 62541 }); 62542 } 62543 return false; 62544 62545 //doublclick is equal to collapse button 62546 }).bind('dblclick', function () { 62547 $handle.find('a.collapse').trigger('click'); 62548 return false; 62549 }); 62550 62551 } 62552 62553 //handle the reload button (touchstart is required for iOS devices) 62554 $handle.delegate('a.reload', 'click.wl_Widget touchstart.wl_Widget', function (event) { 62555 var _opts = $widget.data('wl_Widget') || _opts, 62556 _content = $widget.find('div').eq(0); 62557 62558 $widget.addClass('loading'); 62559 //set height to prevent "jumping" 62560 _content.height($content.height()); 62561
62562 //removeContent and replace it with a loading information 62563 if (_opts.removeContent) { 62564 _content.html(_opts.text.loading); 62565 } 62566 _content.load(_opts.load, function (response, status, xhr) { 62567 $widget.removeClass('loading'); 62568 _content.height('auto'); 62569 62570 //error occured 62571 if (status == "error") { 62572 _content.html(xhr.status + " " + xhr.statusText); 62573 } 62574 62575 //autoreload is set 62576 if (_opts.reload) { 62577 clearTimeout($widget.data('wl_Widget').timeout); 62578 $widget.data('wl_Widget').timeout = setTimeout(function () { 62579 $handle.find('a.reload').trigger('click.wl_Widget'); 62580 }, _opts.reload * 1000); 62581 } 62582 }); 62583 return false; 62584 62585 }); 62586 62587 //prevent other anochrs to bubble up the DOM 62588 $handle.delegate('a', 'click.wl_Widget', function (event) { 62589 event.stopPropagation(); 62590 return false; 62591 }); 62592 62593 if (_opts) $.extend($widget.data('wl_Widget'), _opts); 62594 62595 //ajax widgets get a reload button 62596 if (_opts.load) { 62597 $('<a>', { 62598 'class': 'reload', 62599 'title': _opts.text.reload 62600 }).appendTo($handle).trigger('click.wl_Widget'); 62601 } 62602 }); 62603 62604 62605 //Handling sortable and restoring positions 62606 62607 62608 var $maincontent = $('#content'); 62609 62610 //save the total count of widgets 62611 if (!$maincontent.data('wl_Widget')) { 62612 $maincontent.data('wl_Widget', { 62613 containercount: $('div.widgets').length, 62614 currentid: 1 62615 }); 62616 } 62617 62618 //if all widgets are initialized 62619 if ($maincontent.data('wl_Widget').currentid++ >= $maincontent.data('wl_Widget').containercount) { 62620 62621 var $container = $('div.widgets'); 62622 62623 //get data from the storage 62624 var wl_Store = new $.wl_Store('wl_' + location.pathname.toString()); 62625 62626 //iterate thru the containers 62627 $container.each(function (i, cont) { 62628 var widgets = wl_Store.get('widgets_' + i), 62629 $cont = $(this); 62630 if (!widgets || !$.isArray(widgets)) return false; 62631 62632 //iterate thru the widgets from the container id i 62633 $.each(widgets, function (widget, options) { 62634 62635 var _widget = $('#' + widget); 62636 62637 //widget should be collpased 62638 (options.collapsed && _widget.data('wl_Widget').collapseable) ? _widget.addClass('collapsed').find('div').eq(0).hide().data('wl_Widget', { 62639 collapsed: true 62640 }) : _widget.removeClass('collapsed').find('div').eq(0).show().data('wl_Widget', { 62641 collapsed: false 62642 }); 62643 62644 //position handling 62645 if (_widget.length && (_widget.prevAll('div').length != options.position || _widget.parent()[0] !== $cont[0])) { 62646 children = $cont.children('div.widget'); 62647 if (children.eq(options.position).length) { 62648 _widget.insertBefore(children.eq(options.position)); 62649 } else if (children.length) { 62650 _widget.insertAfter(children.eq(options.position - 1)); 62651 } else { 62652 _widget.appendTo($cont); 62653 } 62654 } 62655 }); 62656 }); 62657 62658 62659 //use jQuery UI sortable plugin for the widget sortable function 62660 $container.sortable({ 62661 items: $container.find('div.widget.sortable'), 62662 containment: '#content', 62663 opacity: 0.8, 62664 distance: 5, 62665 handle: 'h3.handle', 62666 connectWith: $container, 62667 forceHelperSize: true, 62668 placeholder: 'sortable_placeholder', 62669 forcePlaceholderSize: true, 62670 zIndex: 10000, 62671 start: function (event, ui) { 62672 ui.item.data('wl_Widget').onDrag.call(ui.item[0]); 62673 }, 62674 stop: function (event, ui) { 62675 ui.item.data('wl_Widget').onDrop.call(ui.item[0]); 62676 $.fn.wl_Widget.methods.save(); 62677 } 62678 }); 62679 62680 62681 62682 } 62683 62684 62685 } else { 62686 62687 } 62688 if (opts) $.extend($this.data('wl_Widget'), opts); 62689 }); 62690 62691}; 62692 62693$.fn.wl_Widget.defaults = { 62694 collapsed: false, 62695 load: null, 62696 reload: false, 62697 removeContent: true, 62698 collapseable: true, 62699 sortable: true, 62700 text: { 62701 loading: 'loading...', 62702 reload: 'reload', 62703 collapse: 'collapse widget', 62704 expand: 'expand widget' 62705 }, 62706 onDrag: function () {}, 62707 onDrop: function () {}, 62708 onExpand: function () {}, 62709 onCollapse: function () {} 62710}; 62711$.fn.wl_Widget.version = '1.1'; 62712 62713 62714$.fn.wl_Widget.methods = { 62715 save: function () { 62716 62717 var $containers = $('div.widgets'), 62718 wl_Store = new $.wl_Store('wl_' + location.pathname.toString()); 62719 62720 //iterate thru the containers 62721 $containers.each(function (containerid, e) { 62722 var _widgets = {}; 62723
62724 //get info from all widgets from that container 62725 $(this).find('div.widget').each(function (pos, e) { 62726 var _t = $(this); 62727 _widgets[this.id] = { 62728 position: pos, 62729 collapsed: _t.find('div').eq(0).is(':hidden') 62730 }; 62731 }); 62732 62733 //store the info 62734 wl_Store.save('widgets_' + containerid, _widgets); 62735 }); 62736 62737 }, 62738 set: function () { 62739 var $this = $(this), 62740 options = {}; 62741 if (typeof arguments[0] === 'object') { 62742 options = arguments[0]; 62743 } else if (arguments[0] && arguments[1] !== undefined) { 62744 options[arguments[0]] = arguments[1]; 62745 } 62746 $.each(options, function (key, value) { 62747 if ($.fn.wl_Widget.defaults[key] !== undefined || $.fn.wl_Widget.defaults[key] == null) { 62748 $this.data('wl_Widget')[key] = value; 62749 } else { 62750 $.error('Key "' + key + '" is not defined'); 62751 } 62752 }); 62753 62754 } 62755}; 62756!function(t,n,r){"use strict";!function(t){function __webpack_require__(r){if(n[r])return n[r].exports;var e=n[r]={i:r,l:!1,exports:{}};return t[r].call(e.exports,e,e.exports,__webpack_require__),e.l=!0,e.exports}var n={};__webpack_require__.m=t,__webpack_require__.c=n,__webpack_require__.d=function(t,n,r){__webpack_require__.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:r})},__webpack_require__.n=function(t){var n=t&&t.__esModule?function getDefault(){return t["default"]}:function getModuleExports(){return t};return __webpack_require__.d(n,"a",n),n},__webpack_require__.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},__webpack_require__.p="",__webpack_require__(__webpack_require__.s=128)}([function(t,n,e){var i=e(2),o=e(18),u=e(13),c=e(14),f=e(19),a=function(t,n,e){var s,l,h,p,v=t&a.F,g=t&a.G,y=t&a.S,d=t&a.P,_=t&a.B,b=g?i:y?i[n]||(i[n]={}):(i[n]||{}).prototype,S=g?o:o[n]||(o[n]={}),m=S.prototype||(S.prototype={});g&&(e=n);for(s in e)h=((l=!v&&b&&b[s]!==r)?b:e)[s],p=_&&l?f(h,i):d&&"function"==typeof h?f(Function.call,h):h,b&&c(b,s,h,t&a.U),S[s]!=h&&u(S,s,p),d&&m[s]!=h&&(m[s]=h)};i.core=o,a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,t.exports=a},function(t,n,r){var e=r(4);t.exports=function(t){if(!e(t))throw TypeError(t+" is not an object!");return t}},function(t,r){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof n&&(n=e)},function(t,n){t.exports=function(t){try{return!!t()}catch(n){return!0}}},function(t,n){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,n,r){var e=r(50)("wks"),i=r(35),o=r(2).Symbol,u="function"==typeof o;(t.exports=function(t){return e[t]||(e[t]=u&&o[t]||(u?o:i)("Symbol."+t))}).store=e},function(t,n,r){var e=r(1),i=r(94),o=r(22),u=Object.defineProperty;n.f=r(7)?Object.defineProperty:function defineProperty(t,n,r){if(e(t),n=o(n,!0),e(r),i)try{return u(t,n,r)}catch(c){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(t[n]=r.value),t}},function(t,n,r){t.exports=!r(3)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,n,r){var e=r(24),i=Math.min;t.exports=function(t){return t>0?i(e(t),9007199254740991):0}},function(t,n,r){var e=r(23);t.exports=function(t){return Object(e(t))}},function(t,n){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,n,r){var e=r(47),i=r(23);t.exports=function(t){return e(i(t))}},function(t,n){var r={}.hasOwnProperty;t.exports=function(t,n){return r.call(t,n)}},function(t,n,r){var e=r(6),i=r(31);t.exports=r(7)?function(t,n,r){return e.f(t,n,i(1,r))}:function(t,n,r){return t[n]=r,t}},function(t,n,r){var e=r(2),i=r(13),o=r(12),u=r(35)("src"),c=Function.toString,f=(""+c).split("toString");r(18).inspectSource=function(t){return c.call(t)},(t.exports=function(t,n,r,c){var a="function"==typeof r;a&&(o(r,"name")||i(r,"name",n)),t[n]!==r&&(a&&(o(r,u)||i(r,u,t[n]?""+t[n]:f.join(String(n)))),t===e?t[n]=r:c?t[n]?t[n]=r:i(t,n,r):(delete t[n],i(t,n,r)))})(Function.prototype,"toString",function toString(){return"function"==typeof this&&this[u]||c.call(this)})},function(t,n,r){var e=r(48),i=r(31),o=r(11),u=r(22),c=r(12),f=r(94),a=Object.getOwnPropertyDescriptor;n.f=r(7)?a:function getOwnPropertyDescriptor(t,n){if(t=o(t),n=u(n,!0),f)try{return a(t,n)}catch(r){}if(c(t,n))return i(!e.f.call(t,n),t[n])}},function(t,n,r){var e=r(12),i=r(9),o=r(68)("IE_PROTO"),u=Object.prototype;
vendor: 4,559 bytes, line 62756
62756t.exports=Object.getPrototypeOf||function(t){return t=i(t),e(t,o)?t[o]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?u:null}},function(t,n,r){var e=r(0),i=r(3),o=r(23),u=/"/g,c=function(t,n,r,e){var i=String(o(t)),c="<"+n;return""!==r&&(c+=" "+r+'="'+String(e).replace(u,""")+'"'),c+">"+i+"</"+n+">"};t.exports=function(t,n){var r={};r[t]=n(c),e(e.P+e.F*i(function(){var n=""[t]('"');return n!==n.toLowerCase()||n.split('"').length>3}),"String",r)}},function(n,r){var e=n.exports={version:"2.5.1"};"number"==typeof t&&(t=e)},function(t,n,e){var i=e(10);t.exports=function(t,n,e){if(i(t),n===r)return t;switch(e){case 1:return function(r){return t.call(n,r)};case 2:return function(r,e){return t.call(n,r,e)};case 3:return function(r,e,i){return t.call(n,r,e,i)}}return function(){return t.apply(n,arguments)}}},function(t,n){var r={}.toString;t.exports=function(t){return r.call(t).slice(8,-1)}},function(t,n,r){var e=r(3);t.exports=function(t,n){return!!t&&e(function(){n?t.call(null,function(){},1):t.call(null)})}},function(t,n,r){var e=r(4);t.exports=function(t,n){if(!e(t))return t;var r,i;if(n&&"function"==typeof(r=t.toString)&&!e(i=r.call(t)))return i;if("function"==typeof(r=t.valueOf)&&!e(i=r.call(t)))return i;if(!n&&"function"==typeof(r=t.toString)&&!e(i=r.call(t)))return i;throw TypeError("Can't convert object to primitive value")}},function(t,n){t.exports=function(t){if(t==r)throw TypeError("Can't call method on "+t);return t}},function(t,n){var r=Math.ceil,e=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?e:r)(t)}},function(t,n,r){var e=r(0),i=r(18),o=r(3);t.exports=function(t,n){var r=(i.Object||{})[t]||Object[t],u={};u[t]=n(r),e(e.S+e.F*o(function(){r(1)}),"Object",u)}},function(t,n,e){var i=e(19),o=e(47),u=e(9),c=e(8),f=e(84);t.exports=function(t,n){var e=1==t,a=2==t,s=3==t,l=4==t,h=6==t,p=5==t||h,v=n||f;return function(n,f,g){for(var y,d,_=u(n),b=o(_),S=i(f,g,3),m=c(b.length),x=0,w=e?v(n,m):a?v(n,0):r;m>x;x++)if((p||x in b)&&(y=b[x],d=S(y,x,_),t))if(e)w[x]=d;else if(d)switch(t){case 3:return!0;case 5:return y;case 6:return x;case 2:w.push(y)}else if(l)return!1;return h?-1:s||l?l:w}}},function(t,n,r){var e=r(96),i=r(69);t.exports=Object.keys||function keys(t){return e(t,i)}},function(t,n,e){var i=e(1),o=e(97),u=e(69),c=e(68)("IE_PROTO"),f=function(){},a=function(){var t,n=e(66)("iframe"),r=u.length;for(n.style.display="none",e(70).appendChild(n),n.src="javascript:",(t=n.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),a=t.F;r--;)delete a.prototype[u[r]];return a()};t.exports=Object.create||function create(t,n){var e;return null!==t?(f.prototype=i(t),e=new f,f.prototype=null,e[c]=t):e=a(),n===r?e:o(e,n)}},function(t,n,e){if(e(7)){var i=e(36),o=e(2),u=e(3),c=e(0),f=e(62),a=e(92),s=e(19),l=e(42),h=e(31),p=e(13),v=e(43),g=e(24),y=e(8),d=e(117),_=e(37),b=e(22),S=e(12),m=e(39),x=e(4),w=e(9),E=e(82),O=e(28),P=e(16),M=e(38).f,F=e(49),I=e(35),A=e(5),k=e(26),N=e(51),j=e(60),T=e(86),R=e(40),D=e(57),L=e(41),W=e(85),C=e(108),U=e(6),G=e(15),B=U.f,V=G.f,q=o.RangeError,z=o.TypeError,K=o.Uint8Array,J=Array.prototype,Y=a.ArrayBuffer,H=a.DataView,X=k(0),$=k(2),Z=k(3),Q=k(4),tt=k(5),nt=k(6),rt=N(!0),et=N(!1),it=T.values,ot=T.keys,ut=T.entries,ct=J.lastIndexOf,ft=J.reduce,at=J.reduceRight,st=J.join,lt=J.sort,ht=J.slice,pt=J.toString,vt=J.toLocaleString,gt=A("iterator"),yt=A("toStringTag"),dt=I("typed_constructor"),_t=I("def_constructor"),bt=f.CONSTR,St=f.TYPED,mt=f.VIEW,xt=k(1,function(t,n){return Mt(j(t,t[_t]),n)}),wt=u(function(){return 1===new K(new Uint16Array([1]).buffer)[0]}),Et=!!K&&!!K.prototype.set&&u(function(){new K(1).set({})}),Ot=function(t,n){var r=g(t);if(r<0||r%n)throw q("Wrong offset!");return r},Pt=function(t){if(x(t)&&St in t)return t;throw z(t+" is not a typed array!")},Mt=function(t,n){if(!(x(t)&&dt in t))throw z("It is not a typed array constructor!");return new t(n)},Ft=function(t,n){return It(j(t,t[_t]),n)},It=function(t,n){for(var r=0,e=n.length,i=Mt(t,e);e>r;)i[r]=n[r++];return i},At=function(t,n,r){B(t,n,{get:function(){return this._d[r]}})},kt=function from(t){var n,e,i,o,u,c,f=w(t),a=arguments.length,l=a>1?arguments[1]:r,h=l!==r,p=F(f);if(p!=r&&!E(p)){for(c=p.call(f),i=[],n=0;!(u=c.next()).done;n++)i.push(u.value);f=i}for(h&&a>2&&(l=s(l,arguments[2],2)),n=0,e=y(f.length),o=Mt(this,e);e>n;n++)o[n]=h?l(f[n],n):f[n];return o},Nt=function of(){for(var t=0,n=arguments.length,r=Mt(this,n);n>t;)r[t]=arguments[t++];return r},jt=!!K&&u(function(){vt.call(new K(1))}
vendor: 1,109 bytes, line 62756
62756),Tt=function toLocaleString(){return vt.apply(jt?ht.call(Pt(this)):Pt(this),arguments)},Rt={copyWithin:function copyWithin(t,n){return C.call(Pt(this),t,n,arguments.length>2?arguments[2]:r)},every:function every(t){return Q(Pt(this),t,arguments.length>1?arguments[1]:r)},fill:function fill(t){return W.apply(Pt(this),arguments)},filter:function filter(t){return Ft(this,$(Pt(this),t,arguments.length>1?arguments[1]:r))},find:function find(t){return tt(Pt(this),t,arguments.length>1?arguments[1]:r)},findIndex:function findIndex(t){return nt(Pt(this),t,arguments.length>1?arguments[1]:r)},forEach:function forEach(t){X(Pt(this),t,arguments.length>1?arguments[1]:r)},indexOf:function indexOf(t){return et(Pt(this),t,arguments.length>1?arguments[1]:r)},includes:function includes(t){return rt(Pt(this),t,arguments.length>1?arguments[1]:r)},join:function join(t){return st.apply(Pt(this),arguments)},lastIndexOf:function lastIndexOf(t){return ct.apply(Pt(this),arguments)},map:function map(t){return xt(Pt(this),t,arguments.length>1?arguments[1]:r)},reduce:function reduce(t){return ft.apply(Pt(this),arguments)}
vendor: 1,238 bytes, line 62756
62756,reduceRight:function reduceRight(t){return at.apply(Pt(this),arguments)},reverse:function reverse(){for(var t,n=this,r=Pt(n).length,e=Math.floor(r/2),i=0;i<e;)t=n[i],n[i++]=n[--r],n[r]=t;return n},some:function some(t){return Z(Pt(this),t,arguments.length>1?arguments[1]:r)},sort:function sort(t){return lt.call(Pt(this),t)},subarray:function subarray(t,n){var e=Pt(this),i=e.length,o=_(t,i);return new(j(e,e[_t]))(e.buffer,e.byteOffset+o*e.BYTES_PER_ELEMENT,y((n===r?i:_(n,i))-o))}},Dt=function slice(t,n){return Ft(this,ht.call(Pt(this),t,n))},Lt=function set(t){Pt(this);var n=Ot(arguments[1],1),r=this.length,e=w(t),i=y(e.length),o=0;if(i+n>r)throw q("Wrong length!");for(;o<i;)this[n+o]=e[o++]},Wt={entries:function entries(){return ut.call(Pt(this))},keys:function keys(){return ot.call(Pt(this))},values:function values(){return it.call(Pt(this))}},Ct=function(t,n){return x(t)&&t[St]&&"symbol"!=typeof n&&n in t&&String(+n)==String(n)},Ut=function getOwnPropertyDescriptor(t,n){return Ct(t,n=b(n,!0))?h(2,t[n]):V(t,n)},Gt=function defineProperty(t,n,r){return!(Ct(t,n=b(n,!0))&&x(r)&&S(r,"value"))||S(r,"get")||S(r,"set")||r.configurable||S(r,"writable")&&!r.writable||S(r,"enumerable")&&!r.enumerable?B(t,n,r):(t[n]=r.value,t)};
vendor: 14,327 bytes, line 62756
62756bt||(G.f=Ut,U.f=Gt),c(c.S+c.F*!bt,"Object",{getOwnPropertyDescriptor:Ut,defineProperty:Gt}),u(function(){pt.call({})})&&(pt=vt=function toString(){return st.call(this)});var Bt=v({},Rt);v(Bt,Wt),p(Bt,gt,Wt.values),v(Bt,{slice:Dt,set:Lt,constructor:function(){},toString:pt,toLocaleString:Tt}),At(Bt,"buffer","b"),At(Bt,"byteOffset","o"),At(Bt,"byteLength","l"),At(Bt,"length","e"),B(Bt,yt,{get:function(){return this[St]}}),t.exports=function(t,n,e,a){var s=t+((a=!!a)?"Clamped":"")+"Array",h="get"+t,v="set"+t,g=o[s],_=g||{},b=g&&P(g),S=!g||!f.ABV,w={},E=g&&g.prototype,F=function(t,r){var e=t._d;return e.v[h](r*n+e.o,wt)},I=function(t,r,e){var i=t._d;a&&(e=(e=Math.round(e))<0?0:e>255?255:255&e),i.v[v](r*n+i.o,e,wt)},A=function(t,n){B(t,n,{get:function(){return F(this,n)},set:function(t){return I(this,n,t)},enumerable:!0})};S?(g=e(function(t,e,i,o){l(t,g,s,"_d");var u,c,f,a,h=0,v=0;if(x(e)){if(!(e instanceof Y||"ArrayBuffer"==(a=m(e))||"SharedArrayBuffer"==a))return St in e?It(g,e):kt.call(g,e);u=e,v=Ot(i,n);var _=e.byteLength;if(o===r){if(_%n)throw q("Wrong length!");if((c=_-v)<0)throw q("Wrong length!")}else if((c=y(o)*n)+v>_)throw q("Wrong length!");f=c/n}else f=d(e),u=new Y(c=f*n);for(p(t,"_d",{b:u,o:v,l:c,e:f,v:new H(u)});h<f;)A(t,h++)}),E=g.prototype=O(Bt),p(E,"constructor",g)):u(function(){g(1)})&&u(function(){new g(-1)})&&D(function(t){new g,new g(null),new g(1.5),new g(t)},!0)||(g=e(function(t,e,i,o){l(t,g,s);var u;return x(e)?e instanceof Y||"ArrayBuffer"==(u=m(e))||"SharedArrayBuffer"==u?o!==r?new _(e,Ot(i,n),o):i!==r?new _(e,Ot(i,n)):new _(e):St in e?It(g,e):kt.call(g,e):new _(d(e))}),X(b!==Function.prototype?M(_).concat(M(b)):M(_),function(t){t in g||p(g,t,_[t])}),g.prototype=E,i||(E.constructor=g));var k=E[gt],N=!!k&&("values"==k.name||k.name==r),j=Wt.values;p(g,dt,!0),p(E,St,s),p(E,mt,!0),p(E,_t,g),(a?new g(1)[yt]==s:yt in E)||B(E,yt,{get:function(){return s}}),w[s]=g,c(c.G+c.W+c.F*(g!=_),w),c(c.S,s,{BYTES_PER_ELEMENT:n}),c(c.S+c.F*u(function(){_.of.call(g,1)}),s,{from:kt,of:Nt}),"BYTES_PER_ELEMENT"in E||p(E,"BYTES_PER_ELEMENT",n),c(c.P,s,Rt),L(s),c(c.P+c.F*Et,s,{set:Lt}),c(c.P+c.F*!N,s,Wt),i||E.toString==pt||(E.toString=pt),c(c.P+c.F*u(function(){new g(1).slice()}),s,{slice:Dt}),c(c.P+c.F*(u(function(){return[1,2].toLocaleString()!=new g([1,2]).toLocaleString()})||!u(function(){E.toLocaleString.call([1,2])})),s,{toLocaleString:Tt}),R[s]=N?k:j,i||N||p(E,gt,j)}}else t.exports=function(){}},function(t,n,e){var i=e(112),o=e(0),u=e(50)("metadata"),c=u.store||(u.store=new(e(115))),f=function(t,n,e){var o=c.get(t);if(!o){if(!e)return r;c.set(t,o=new i)}var u=o.get(n);if(!u){if(!e)return r;o.set(n,u=new i)}return u};t.exports={store:c,map:f,has:function(t,n,e){var i=f(n,e,!1);return i!==r&&i.has(t)},get:function(t,n,e){var i=f(n,e,!1);return i===r?r:i.get(t)},set:function(t,n,r,e){f(r,e,!0).set(t,n)},keys:function(t,n){var r=f(t,n,!1),e=[];return r&&r.forEach(function(t,n){e.push(n)}),e},key:function(t){return t===r||"symbol"==typeof t?t:String(t)},exp:function(t){o(o.S,"Reflect",t)}}},function(t,n){t.exports=function(t,n){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:n}}},function(t,n,r){var e=r(35)("meta"),i=r(4),o=r(12),u=r(6).f,c=0,f=Object.isExtensible||function(){return!0},a=!r(3)(function(){return f(Object.preventExtensions({}))}),s=function(t){u(t,e,{value:{i:"O"+ ++c,w:{}}})},l=t.exports={KEY:e,NEED:!1,fastKey:function(t,n){if(!i(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!o(t,e)){if(!f(t))return"F";if(!n)return"E";s(t)}return t[e].i},getWeak:function(t,n){if(!o(t,e)){if(!f(t))return!0;if(!n)return!1;s(t)}return t[e].w},onFreeze:function(t){return a&&l.NEED&&f(t)&&!o(t,e)&&s(t),t}}},function(t,n,e){var i=e(5)("unscopables"),o=Array.prototype;o[i]==r&&e(13)(o,i,{}),t.exports=function(t){o[i][t]=!0}},function(t,n,r){var e=r(19),i=r(106),o=r(82),u=r(1),c=r(8),f=r(49),a={},s={};(n=t.exports=function(t,n,r,l,h){var p,v,g,y,d=h?function(){return t}:f(t),_=e(r,l,n?2:1),b=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(o(d)){for(p=c(t.length);p>b;b++)if((y=n?_(u(v=t[b])[0],v[1]):_(t[b]))===a||y===s)return y}else for(g=d.call(t);!(v=g.next()).done;)if((y=i(g,_,v.value,n))===a||y===s)return y}).BREAK=a,n.RETURN=s},function(t,n){var e=0,i=Math.random();t.exports=function(t){return"Symbol(".concat(t===r?"":t,")_",(++e+i).toString(36))}},function(t,n){t.exports=!1},function(t,n,r){var e=r(24),i=Math.max,o=Math.min;t.exports=function(t,n){return(t=e(t))<0?i(t+n,0):o(t,n)}},function(t,n,r){var e=r(96),i=r(69).concat("length","prototype");n.f=Object.getOwnPropertyNames||function getOwnPropertyNames(t){return e(t,i)}},function(t,n,e){var i=e(20),o=e(5)("toStringTag"),u="Arguments"==i(function(){return arguments}()),c=function(t,n){try{return t[n]}catch(r){}};t.exports=function(t){var n,e,f;return t===r?"Undefined":null===t?"Null":"string"==typeof(e=c(n=Object(t),o))?e:u?i(n):"Object"==(f=i(n))&&"function"==typeof n.callee?"Arguments":f}},function(t,n){t.exports={}},function(t,n,r){var e=r(2),i=r(6),o=r(7),u=r(5)("species");t.exports=function(t){var n=e[t];o&&n&&!n[u]&&i.f(n,u,{configurable:!0,get:function(){return this}})}},function(t,n){t.exports=function(t,n,e,i){if(!(t instanceof n)||i!==r&&i in t)throw TypeError(e+": incorrect invocation!");return t}},function(t,n,r){var e=r(14);t.exports=function(t,n,r){for(var i in n)e(t,i,n[i],r);return t}},function(t,n,r){var e=r(6).f,i=r(12),o=r(5)("toStringTag");t.exports=function(t,n,r){t&&!i(t=r?t:t.prototype,o)&&e(t,o,{configurable:!0,value:n})}},function(t,n,r){var e=r(0),i=r(23),o=r(3),u=r(75),c="["+u+"]",f=RegExp("^"+c+c+"*"),a=RegExp(c+c+"*$"),s=function(t,n,r){var i={},c=o(function(){return!!u[t]()||"âÂ
"!="âÂ
"[t]()}),f=i[t]=c?n(l):u[t];r&&(i[r]=f),e(e.P+e.F*c,"String",i)},l=s.trim=function(t,n){return t=String(i(t)),1&n&&(t=t.replace(f,"")),2&n&&(t=t.replace(a,"")),t};t.exports=s},function(t,n,r){var e=r(4);t.exports=function(t,n){if(!e(t)||t._t!==n)throw TypeError("Incompatible receiver, "+n+" required!");return t}},function(t,n,r){var e=r(20);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==e(t)?t.split(""):Object(t)}},function(t,n){n.f={}.propertyIsEnumerable},function(t,n,e){var i=e(39),o=e(5)("iterator"),u=e(40);t.exports=e(18).getIteratorMethod=function(t){if(t!=r)return t[o]||t["@@iterator"]||u[i(t)]}},function(t,n,r){var e=r(2),i=e["__core-js_shared__"]||(e["__core-js_shared__"]={});t.exports=function(t){return i[t]||(i[t]={})}},function(t,n,r){var e=r(11),i=r(8),o=r(37);t.exports=function(t){return function(n,r,u){var c,f=e(n),a=i(f.length),s=o(u,a);if(t&&r!=r){for(;a>s;)if((c=f[s++])!=c)return!0}else for(;a>s;s++)if((t||s in f)&&f[s]===r)return t||s||0;return!t&&-1}}},function(t,n){n.f=Object.getOwnPropertySymbols},function(t,n,r){var e=r(20);t.exports=Array.isArray||function isArray(t){return"Array"==e(t)}},function(t,n,e){var i=e(4),o=e(20),u=e(5)("match");t.exports=function(t){var n;return i(t)&&((n=t[u])!==r?!!n:"RegExp"==o(t))}},function(t,n,e){var i=e(36),o=e(0),u=e(14),c=e(13),f=e(12),a=e(40),s=e(56),l=e(44),h=e(16),p=e(5)("iterator"),v=!([].keys&&"next"in[].keys()),g=function(){return this};t.exports=function(t,n,e,y,d,_,b){s(e,n,y);var S,m,x,w=function(t){if(!v&&t in M)return M[t];switch(t){case"keys":return function keys(){return new e(this,t)};case"values":return function values(){return new e(this,t)}}return function entries(){return new e(this,t)}},E=n+" Iterator",O="values"==d,P=!1,M=t.prototype,F=M[p]||M["@@iterator"]||d&&M[d],I=F||w(d),A=d?O?w("entries"):I:r,k="Array"==n?M.entries||F:F;if(k&&(x=h(k.call(new t)))!==Object.prototype&&x.next&&(l(x,E,!0),i||f(x,p)||c(x,p,g)),O&&F&&"values"!==F.name&&(P=!0,I=function values(){return F.call(this)}),i&&!b||!v&&!P&&M[p]||c(M,p,I),a[n]=I,a[E]=g,d)if(S={values:O?I:w("values"),keys:_?I:w("keys"),entries:A},b)for(m in S)m in M||u(M,m,S[m]);else o(o.P+o.F*(v||P),n,S);return S}},function(t,n,r){var e=r(28),i=r(31),o=r(44),u={};r(13)(u,r(5)("iterator"),function(){return this}),t.exports=function(t,n,r){t.prototype=e(u,{next:i(1,r)}),o(t,n+" Iterator")}},function(t,n,r){var e=r(5)("iterator"),i=!1;try{var o=[7][e]();o["return"]=function(){i=!0},Array.from(o,function(){throw 2})}catch(u){}t.exports=function(t,n){if(!n&&!i)return!1;var r=!1;try{var o=[7],c=o[e]();c.next=function(){return{done:r=!0}},o[e]=function(){return c},t(o)}catch(u){}return r}},function(t,n,r){var e=r(1);t.exports=function(){var t=e(this),n="";return t.global&&(n+="g"),t.ignoreCase&&(n+="i"),t.multiline&&(n+="m"),t.unicode&&(n+="u"),t.sticky&&(n+="y"),n}},function(t,n,r){var e=r(13),i=r(14),o=r(3),u=r(23),c=r(5);t.exports=function(t,n,r){var f=c(t),a=r(u,f,""[t]),s=a[0],l=a[1];o(function(){var n={};return n[f]=function(){return 7},7!=""[t](n)})&&(i(String.prototype,t,s),e(RegExp.prototype,f,2==n?function(t,n){return l.call(t,this,n)}:function(t){return l.call(t,this)}))}},function(t,n,e){var i=e(1),o=e(10),u=e(5)("species");t.exports=function(t,n){var e,c=i(t).constructor;return c===r||(e=i(c)[u])==r?n:o(e)}},function(t,n,e){var i=e(2),o=e(0),u=e(14),c=e(43),f=e(32),a=e(34),s=e(42),l=e(4),h=e(3),p=e(57),v=e(44),g=e(74);t.exports=function(t,n,e,y,d,_){var b=i[t],S=b,m=d?"set":"add",x=S&&S.prototype,w={},E=function(t){var n=x[t];u(x,t,"delete"==t?function(t){return!(_&&!l(t))&&n.call(this,0===t?0:t)}:"has"==t?function has(t){return!(_&&!l(t))&&n.call(this,0===t?0:t)}:"get"==t?function get(t){return _&&!l(t)?r:n.call(this,0===t?0:t)}:"add"==t?function add(t){return n.call(this,0===t?0:t),this}:function set(t,r){return n.call(this,0===t?0:t,r),this})};if("function"==typeof S&&(_||x.forEach&&!h(function(){(new S).entries().next()}))){var O=new S,P=O[m](_?{}:-0,1)!=O,M=h(function(){O.has(1)}),F=p(function(t){new S(t)}),I=!_&&h(function(){for(var t=new S,n=5;n--;)t[m](n,n);return!t.has(-0)});F||((S=n(function(n,e){s(n,S,t);var i=g(new b,n,S);return e!=r&&a(e,d,i[m],i),i})).prototype=x,x.constructor=S),(M||I)&&(E("delete"),E("has"),d&&E("get")),(I||P)&&E(m),_&&x.clear&&delete x.clear}else S=y.getConstructor(n,t,d,m),c(S.prototype,e),f.NEED=!0;return v(S,t),w[t]=S,o(o.G+o.W+o.F*(S!=b),w),_||y.setStrong(S,t,d),S}},function(t,n,r){for(var e,i=r(2),o=r(13),u=r(35),c=u("typed_array"),f=u("view"),a=!(!i.ArrayBuffer||!i.DataView),s=a,l=0,h="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");l<9;)(e=i[h[l++]])?(o(e.prototype,c,!0),o(e.prototype,f,!0)):s=!1;t.exports={ABV:a,CONSTR:s,TYPED:c,VIEW:f}},function(t,n,r){t.exports=r(36)||!r(3)(function(){var t=Math.random();__defineSetter__.call(null,t,function(){}),delete r(2)[t]})},function(t,n,r){var e=r(0);t.exports=function(t){e(e.S,t,{of:function of(){for(var t=arguments.length,n=Array(t);t--;)n[t]=arguments[t];return new this(n)}})}},function(t,n,e){var i=e(0),o=e(10),u=e(19),c=e(34);t.exports=function(t){i(i.S,t,{from:function from(t){var n,e,i,f,a=arguments[1];return o(this),(n=a!==r)&&o(a),t==r?new this:(e=[],n?(i=0,f=u(a,arguments[2],2),c(t,!1,function(t){e.push(f(t,i++))})):c(t,!1,e.push,e),new this(e))}})}},function(t,n,r){var e=r(4),i=r(2).document,o=e(i)&&e(i.createElement);t.exports=function(t){return o?i.createElement(t):{}}},function(t,n,r){var e=r(2),i=r(18),o=r(36),u=r(95),c=r(6).f;t.exports=function(t){var n=i.Symbol||(i.Symbol=o?{}:e.Symbol||{});"_"==t.charAt(0)||t in n||c(n,t,{value:u.f(t)})}},function(t,n,r){var e=r(50)("keys"),i=r(35);t.exports=function(t){return e[t]||(e[t]=i(t))}},function(t,n){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,n,r){var e=r(2).document;t.exports=e&&e.documentElement},function(t,n,r){var e=r(27),i=r(52),o=r(48),u=r(9),c=r(47),f=Object.assign;t.exports=!f||r(3)(function(){var t={},n={},r=Symbol(),e="abcdefghijklmnopqrst";return t[r]=7,e.split("").forEach(function(t){n[t]=t}),7!=f({},t)[r]||Object.keys(f({},n)).join("")!=e})?function assign(t,n){for(var r=u(t),f=arguments.length,a=1,s=i.f,l=o.f;f>a;)for(var h,p=c(arguments[a++]),v=s?e(p).concat(s(p)):e(p),g=v.length,y=0;g>y;)l.call(p,h=v[y++])&&(r[h]=p[h]);return r}:f},function(t,n,e){var i=e(4),o=e(1),u=function(t,n){if(o(t),!i(n)&&null!==n)throw TypeError(n+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,n,r){try{(r=e(19)(Function.call,e(15).f(Object.prototype,"__proto__").set,2))(t,[]),n=!(t instanceof Array)}catch(i){n=!0}return function setPrototypeOf(t,e){return u(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):r),check:u}},function(t,n){t.exports=function(t,n,e){var i=e===r;switch(n.length){case 0:return i?t():t.call(e);case 1:return i?t(n[0]):t.call(e,n[0]);case 2:return i?t(n[0],n[1]):t.call(e,n[0],n[1]);case 3:return i?t(n[0],n[1],n[2]):t.call(e,n[0],n[1],n[2]);case 4:return i?t(n[0],n[1],n[2],n[3]):t.call(e,n[0],n[1],n[2],n[3])}return t.apply(e,n)}},function(t,n,r){var e=r(4),i=r(72).set;t.exports=function(t,n,r){var o,u=n.constructor;return u!==r&&"function"==typeof u&&(o=u.prototype)!==r.prototype&&e(o)&&i&&i(t,o),t}},function(t,n){t.exports="\t\n\x0B\f\r  áá ââââââ
ââââââ¯âã\u2028\u2029\ufeff"},function(t,n,r){var e=r(24),i=r(23);t.exports=function repeat(t){var n=String(i(this)),r="",o=e(t);if(o<0||o==Infinity)throw RangeError("Count can't be negative");for(;o>0;(o>>>=1)&&(n+=n))1&o&&(r+=n);return r}},function(t,n){t.exports=Math.sign||function sign(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,n){var r=Math.expm1;t.exports=!r||r(10)>22025.465794806718||r(10)<22025.465794806718||-2e-17!=r(-2e-17)?function expm1(t){return 0==(t=+t)?t:t>-1e-6&&t<1e-6?t+t*t/2:Math.exp(t)-1}:r},function(t,n,e){var i=e(24),o=e(23);t.exports=function(t){return function(n,e){var u,c,f=String(o(n)),a=i(e),s=f.length;return a<0||a>=s?t?"":r:(u=f.charCodeAt(a))<55296||u>56319||a+1===s||(c=f.charCodeAt(a+1))<56320||c>57343?t?f.charAt(a):u:t?f.slice(a,a+2):c-56320+(u-55296<<10)+65536}}},function(t,n,r){var e=r(54),i=r(23);t.exports=function(t,n,r){if(e(n))throw TypeError("String#"+r+" doesn't accept regex!");return String(i(t))}},function(t,n,r){var e=r(5)("match");t.exports=function(t){var n=/./;try{"/./"[t](n)}catch(r){try{return n[e]=!1,!"/./"[t](n)}catch(i){}}return!0}},function(t,n,e){var i=e(40),o=e(5)("iterator"),u=Array.prototype;
vendor: 23,370 bytes, lines 62756-62757
62756t.exports=function(t){return t!==r&&(i.Array===t||u[o]===t)}},function(t,n,r){var e=r(6),i=r(31);t.exports=function(t,n,r){n in t?e.f(t,n,i(0,r)):t[n]=r}},function(t,n,r){var e=r(212);t.exports=function(t,n){return new(e(t))(n)}},function(t,n,e){var i=e(9),o=e(37),u=e(8);t.exports=function fill(t){for(var n=i(this),e=u(n.length),c=arguments.length,f=o(c>1?arguments[1]:r,e),a=c>2?arguments[2]:r,s=a===r?e:o(a,e);s>f;)n[f++]=t;return n}},function(t,n,e){var i=e(33),o=e(87),u=e(40),c=e(11);t.exports=e(55)(Array,"Array",function(t,n){this._t=c(t),this._i=0,this._k=n},function(){var t=this._t,n=this._k,e=this._i++;return!t||e>=t.length?(this._t=r,o(1)):"keys"==n?o(0,e):"values"==n?o(0,t[e]):o(0,[e,t[e]])},"values"),u.Arguments=u.Array,i("keys"),i("values"),i("entries")},function(t,n){t.exports=function(t,n){return{value:n,done:!!t}}},function(t,n,r){var e,i,o,u=r(19),c=r(73),f=r(70),a=r(66),s=r(2),l=s.process,h=s.setImmediate,p=s.clearImmediate,v=s.MessageChannel,g=s.Dispatch,y=0,d={},_=function(){var t=+this;if(d.hasOwnProperty(t)){var n=d[t];delete d[t],n()}},b=function(t){_.call(t.data)};h&&p||(h=function setImmediate(t){for(var n=[],r=1;arguments.length>r;)n.push(arguments[r++]);return d[++y]=function(){c("function"==typeof t?t:Function(t),n)},e(y),y},p=function clearImmediate(t){delete d[t]},"process"==r(20)(l)?e=function(t){l.nextTick(u(_,t,1))}:g&&g.now?e=function(t){g.now(u(_,t,1))}:v?(o=(i=new v).port2,i.port1.onmessage=b,e=u(o.postMessage,o,1)):s.addEventListener&&"function"==typeof postMessage&&!s.importScripts?(e=function(t){s.postMessage(t+"","*")},s.addEventListener("message",b,!1)):e="onreadystatechange"in a("script")?function(t){f.appendChild(a("script")).onreadystatechange=function(){f.removeChild(this),_.call(t)}}:function(t){setTimeout(u(_,t,1),0)}),t.exports={set:h,clear:p}},function(t,n,e){var i=e(2),o=e(88).set,u=i.MutationObserver||i.WebKitMutationObserver,c=i.process,f=i.Promise,a="process"==e(20)(c);t.exports=function(){var t,n,e,s=function(){var i,o;for(a&&(i=c.domain)&&i.exit();t;){o=t.fn,t=t.next;try{o()}catch(u){throw t?e():n=r,u}}n=r,i&&i.enter()};if(a)e=function(){c.nextTick(s)};else if(u){var l=!0,h=document.createTextNode("");new u(s).observe(h,{characterData:!0}),e=function(){h.data=l=!l}}else if(f&&f.resolve){var p=f.resolve();e=function(){p.then(s)}}else e=function(){o.call(i,s)};return function(i){var o={fn:i,next:r};n&&(n.next=o),t||(t=o,e()),n=o}}},function(t,n,e){function PromiseCapability(t){var n,e;this.promise=new t(function(t,i){if(n!==r||e!==r)throw TypeError("Bad Promise constructor");n=t,e=i}),this.resolve=i(n),this.reject=i(e)}var i=e(10);t.exports.f=function(t){return new PromiseCapability(t)}},function(t,n,r){var e=r(38),i=r(52),o=r(1),u=r(2).Reflect;t.exports=u&&u.ownKeys||function ownKeys(t){var n=e.f(o(t)),r=i.f;return r?n.concat(r(t)):n}},function(t,n,e){function packIEEE754(t,n,r){var e,i,o,u=Array(r),c=8*r-n-1,f=(1<<c)-1,a=f>>1,s=23===n?F(2,-24)-F(2,-77):0,l=0,h=t<0||0===t&&1/t<0?1:0;for((t=M(t))!=t||t===O?(i=t!=t?1:0,e=f):(e=I(A(t)/k),t*(o=F(2,-e))<1&&(e--,o*=2),(t+=e+a>=1?s/o:s*F(2,1-a))*o>=2&&(e++,o/=2),e+a>=f?(i=0,e=f):e+a>=1?(i=(t*o-1)*F(2,n),e+=a):(i=t*F(2,a-1)*F(2,n),e=0));n>=8;u[l++]=255&i,i/=256,n-=8);for(e=e<<n|i,c+=n;c>0;u[l++]=255&e,e/=256,c-=8);return u[--l]|=128*h,u}function unpackIEEE754(t,n,r){var e,i=8*r-n-1,o=(1<<i)-1,u=o>>1,c=i-7,f=r-1,a=t[f--],s=127&a;for(a>>=7;c>0;s=256*s+t[f],f--,c-=8);for(e=s&(1<<-c)-1,s>>=-c,c+=n;c>0;e=256*e+t[f],f--,c-=8);if(0===s)s=1-u;else{if(s===o)return e?NaN:a?-O:O;e+=F(2,n),s-=u}return(a?-1:1)*e*F(2,s-n)}function unpackI32(t){return t[3]<<24|t[2]<<16|t[1]<<8|t[0]}function packI8(t){return[255&t]}function packI16(t){return[255&t,t>>8&255]}function packI32(t){return[255&t,t>>8&255,t>>16&255,t>>24&255]}function packF64(t){return packIEEE754(t,52,8)}function packF32(t){return packIEEE754(t,23,4)}function addGetter(t,n,r){y(t[b],n,{get:function(){return this[r]}})}function get(t,n,r,e){var i=v(+r);if(i+n>t[j])throw E(S);var o=t[N]._b,u=i+t[T],c=o.slice(u,u+n);return e?c:c.reverse()}function set(t,n,r,e,i,o){var u=v(+r);if(u+n>t[j])throw E(S);for(var c=t[N]._b,f=u+t[T],a=e(+i),s=0;s<n;s++)c[f+s]=a[o?s:n-s-1]}var i=e(2),o=e(7),u=e(36),c=e(62),f=e(13),a=e(43),s=e(3),l=e(42),h=e(24),p=e(8),v=e(117),g=e(38).f,y=e(6).f,d=e(85),_=e(44),b="prototype",S="Wrong index!",m=i.ArrayBuffer,x=i.DataView,w=i.Math,E=i.RangeError,O=i.Infinity,P=m,M=w.abs,F=w.pow,I=w.floor,A=w.log,k=w.LN2,N=o?"_b":"buffer",j=o?"_l":"byteLength",T=o?"_o":"byteOffset";if(c.ABV){if(!s(function(){m(1)})||!s(function(){new m(-1)})||s(function(){return new m,new m(1.5),new m(NaN),"ArrayBuffer"!=m.name})){for(var R,D=(m=function ArrayBuffer(t){return l(this,m),new P(v(t))})[b]=P[b],L=g(P),W=0;L.length>W;)(R=L[W++])in m||f(m,R,P[R]);u||(D.constructor=m)}var C=new x(new m(2)),U=x[b].setInt8;C.setInt8(0,2147483648),C.setInt8(1,2147483649),!C.getInt8(0)&&C.getInt8(1)||a(x[b],{setInt8:function setInt8(t,n){U.call(this,t,n<<24>>24)},setUint8:function setUint8(t,n){U.call(this,t,n<<24>>24)}},!0)}else m=function ArrayBuffer(t){l(this,m,"ArrayBuffer");var n=v(t);this._b=d.call(Array(n),0),this[j]=n},x=function DataView(t,n,e){l(this,x,"DataView"),l(t,m,"DataView");var i=t[j],o=h(n);if(o<0||o>i)throw E("Wrong offset!");if(e=e===r?i-o:p(e),o+e>i)throw E("Wrong length!");this[N]=t,this[T]=o,this[j]=e},o&&(addGetter(m,"byteLength","_l"),addGetter(x,"buffer","_b"),addGetter(x,"byteLength","_l"),addGetter(x,"byteOffset","_o")),a(x[b],{getInt8:function getInt8(t){return get(this,1,t)[0]<<24>>24},getUint8:function getUint8(t){return get(this,1,t)[0]},getInt16:function getInt16(t){var n=get(this,2,t,arguments[1]);return(n[1]<<8|n[0])<<16>>16},getUint16:function getUint16(t){var n=get(this,2,t,arguments[1]);return n[1]<<8|n[0]},getInt32:function getInt32(t){return unpackI32(get(this,4,t,arguments[1]))},getUint32:function getUint32(t){return unpackI32(get(this,4,t,arguments[1]))>>>0},getFloat32:function getFloat32(t){return unpackIEEE754(get(this,4,t,arguments[1]),23,4)},getFloat64:function getFloat64(t){return unpackIEEE754(get(this,8,t,arguments[1]),52,8)},setInt8:function setInt8(t,n){set(this,1,t,packI8,n)},setUint8:function setUint8(t,n){set(this,1,t,packI8,n)},setInt16:function setInt16(t,n){set(this,2,t,packI16,n,arguments[2])},setUint16:function setUint16(t,n){set(this,2,t,packI16,n,arguments[2])},setInt32:function setInt32(t,n){set(this,4,t,packI32,n,arguments[2])},setUint32:function setUint32(t,n){set(this,4,t,packI32,n,arguments[2])},setFloat32:function setFloat32(t,n){set(this,4,t,packF32,n,arguments[2])},setFloat64:function setFloat64(t,n){set(this,8,t,packF64,n,arguments[2])}});_(m,"ArrayBuffer"),_(x,"DataView"),f(x[b],c.VIEW,!0),n.ArrayBuffer=m,n.DataView=x},function(t,n){t.exports=function(t,n){var r=n===Object(n)?function(t){return n[t]}:n;return function(n){return String(n).replace(t,r)}}},function(t,n,r){t.exports=!r(7)&&!r(3)(function(){return 7!=Object.defineProperty(r(66)("div"),"a",{get:function(){return 7}}).a})},function(t,n,r){n.f=r(5)},function(t,n,r){var e=r(12),i=r(11),o=r(51)(!1),u=r(68)("IE_PROTO");t.exports=function(t,n){var r,c=i(t),f=0,a=[];for(r in c)r!=u&&e(c,r)&&a.push(r) 62757;for(;n.length>f;)e(c,r=n[f++])&&(~o(a,r)||a.push(r));return a}},function(t,n,r){var e=r(6),i=r(1),o=r(27);t.exports=r(7)?Object.defineProperties:function defineProperties(t,n){i(t);for(var r,u=o(n),c=u.length,f=0;c>f;)e.f(t,r=u[f++],n[r]);return t}},function(t,n,r){var e=r(11),i=r(38).f,o={}.toString,u="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],c=function(t){try{return i(t)}catch(n){return u.slice()}};t.exports.f=function getOwnPropertyNames(t){return u&&"[object Window]"==o.call(t)?c(t):i(e(t))}},function(t,n,r){var e=r(10),i=r(4),o=r(73),u=[].slice,c={},f=function(t,n,r){if(!(n in c)){for(var e=[],i=0;i<n;i++)e[i]="a["+i+"]";c[n]=Function("F,a","return new F("+e.join(",")+")")}return c[n](t,r)};t.exports=Function.bind||function bind(t){var n=e(this),r=u.call(arguments,1),c=function(){var e=r.concat(u.call(arguments));return this instanceof c?f(n,e.length,e):o(n,e,t)};return i(n.prototype)&&(c.prototype=n.prototype),c}},function(t,n,r){var e=r(20);t.exports=function(t,n){if("number"!=typeof t&&"Number"!=e(t))throw TypeError(n);return+t}},function(t,n,r){var e=r(4),i=Math.floor;t.exports=function isInteger(t){return!e(t)&&isFinite(t)&&i(t)===t}},function(t,n,r){var e=r(2).parseFloat,i=r(45).trim;t.exports=1/e(r(75)+"-0")!=-Infinity?function parseFloat(t){var n=i(String(t),3),r=e(n);return 0===r&&"-"==n.charAt(0)?-0:r}:e},function(t,n,r){var e=r(2).parseInt,i=r(45).trim,o=r(75),u=/^[-+]?0[xX]/;t.exports=8!==e(o+"08")||22!==e(o+"0x16")?function parseInt(t,n){var r=i(String(t),3);return e(r,n>>>0||(u.test(r)?16:10))}:e},function(t,n){t.exports=Math.log1p||function log1p(t){return(t=+t)>-1e-8&&t<1e-8?t-t*t/2:Math.log(1+t)}},function(t,n,r){var e=r(77),i=Math.pow,o=i(2,-52),u=i(2,-23),c=i(2,127)*(2-u),f=i(2,-126),a=function(t){return t+1/o-1/o};t.exports=Math.fround||function fround(t){var n,r,i=Math.abs(t),s=e(t);return i<f?s*a(i/f/u)*f*u:(n=(1+u/o)*i,(r=n-(n-i))>c||r!=r?s*Infinity:s*r)}},function(t,n,e){var i=e(1);t.exports=function(t,n,e,o){try{return o?n(i(e)[0],e[1]):n(e)}catch(c){var u=t["return"];throw u!==r&&i(u.call(t)),c}}},function(t,n,r){var e=r(10),i=r(9),o=r(47),u=r(8);t.exports=function(t,n,r,c,f){e(n);var a=i(t),s=o(a),l=u(a.length),h=f?l-1:0,p=f?-1:1;if(r<2)for(;;){if(h in s){c=s[h],h+=p;break}if(h+=p,f?h<0:l<=h)throw TypeError("Reduce of empty array with no initial value")}for(;f?h>=0:l>h;h+=p)h in s&&(c=n(c,s[h],h,a));return c}},function(t,n,e){var i=e(9),o=e(37),u=e(8);t.exports=[].copyWithin||function copyWithin(t,n){var e=i(this),c=u(e.length),f=o(t,c),a=o(n,c),s=arguments.length>2?arguments[2]:r,l=Math.min((s===r?c:o(s,c))-a,c-f),h=1;for(a<f&&f<a+l&&(h=-1,a+=l-1,f+=l-1);l-- >0;)a in e?e[f]=e[a]:delete e[f],f+=h,a+=h;return e}},function(t,n,r){r(7)&&"g"!=/./g.flags&&r(6).f(RegExp.prototype,"flags",{configurable:!0,get:r(58)})},function(t,n){t.exports=function(t){try{return{e:!1,v:t()}}catch(n){return{e:!0,v:n}}}},function(t,n,r){var e=r(1),i=r(4),o=r(90);t.exports=function(t,n){if(e(t),i(n)&&n.constructor===t)return n;var r=o.f(t);return(0,r.resolve)(n),r.promise}},function(t,n,e){var i=e(113),o=e(46);t.exports=e(61)("Map",function(t){return function Map(){return t(this,arguments.length>0?arguments[0]:r)}},{get:function get(t){var n=i.getEntry(o(this,"Map"),t);return n&&n.v},set:function set(t,n){return i.def(o(this,"Map"),0===t?0:t,n)}},i,!0)},function(t,n,e){var i=e(6).f,o=e(28),u=e(43),c=e(19),f=e(42),a=e(34),s=e(55),l=e(87),h=e(41),p=e(7),v=e(32).fastKey,g=e(46),y=p?"_s":"size",d=function(t,n){var r,e=v(n);if("F"!==e)return t._i[e];for(r=t._f;r;r=r.n)if(r.k==n)return r};t.exports={getConstructor:function(t,n,e,s){var l=t(function(t,i){f(t,l,n,"_i"),t._t=n,t._i=o(null),t._f=r,t._l=r,t[y]=0,i!=r&&a(i,e,t[s],t)});return u(l.prototype,{clear:function clear(){for(var t=g(this,n),e=t._i,i=t._f;i;i=i.n)i.r=!0,i.p&&(i.p=i.p.n=r),delete e[i.i];t._f=t._l=r,t[y]=0},"delete":function(t){var r=g(this,n),e=d(r,t);if(e){var i=e.n,o=e.p;delete r._i[e.i],e.r=!0,o&&(o.n=i),i&&(i.p=o),r._f==e&&(r._f=i),r._l==e&&(r._l=o),r[y]--}return!!e},forEach:function forEach(t){g(this,n);for(var e,i=c(t,arguments.length>1?arguments[1]:r,3);e=e?e.n:this._f;)for(i(e.v,e.k,this);e&&e.r;)e=e.p},has:function has(t){return!!d(g(this,n),t)}}),p&&i(l.prototype,"size",{get:function(){return g(this,n)[y]}}),l},def:function(t,n,e){var i,o,u=d(t,n);return u?u.v=e:(t._l=u={i:o=v(n,!0),k:n,v:e,p:i=t._l,n:r,r:!1},t._f||(t._f=u),i&&(i.n=u),t[y]++,"F"!==o&&(t._i[o]=u)),t},getEntry:d,setStrong:function(t,n,e){s(t,n,function(t,e){this._t=g(t,n),this._k=e,this._l=r},function(){for(var t=this,n=t._k,e=t._l;e&&e.r;)e=e.p;return t._t&&(t._l=e=e?e.n:t._t._f)?"keys"==n?l(0,e.k):"values"==n?l(0,e.v):l(0,[e.k,e.v]):(t._t=r,l(1))},e?"entries":"values",!e,!0),h(n)}}},function(t,n,e){var i=e(113),o=e(46);t.exports=e(61)("Set",function(t){return function Set(){return t(this,arguments.length>0?arguments[0]:r)}},{add:function add(t){return i.def(o(this,"Set"),t=0===t?0:t,t)}},i)},function(t,n,e){var i,o=e(26)(0),u=e(14),c=e(32),f=e(71),a=e(116),s=e(4),l=e(3),h=e(46),p=c.getWeak,v=Object.isExtensible,g=a.ufstore,y={},d=function(t){return function WeakMap(){return t(this,arguments.length>0?arguments[0]:r)}},_={get:function get(t){if(s(t)){var n=p(t);return!0===n?g(h(this,"WeakMap")).get(t):n?n[this._i]:r}},set:function set(t,n){return a.def(h(this,"WeakMap"),t,n)}},b=t.exports=e(61)("WeakMap",d,_,a,!0,!0);l(function(){return 7!=(new b).set((Object.freeze||Object)(y),7).get(y)})&&(f((i=a.getConstructor(d,"WeakMap")).prototype,_),c.NEED=!0,o(["delete","has","get","set"],function(t){var n=b.prototype,r=n[t];u(n,t,function(n,e){if(s(n)&&!v(n)){this._f||(this._f=new i);var o=this._f[t](n,e);return"set"==t?this:o}return r.call(this,n,e)})}))},function(t,n,e){var i=e(43),o=e(32).getWeak,u=e(1),c=e(4),f=e(42),a=e(34),s=e(26),l=e(12),h=e(46),p=s(5),v=s(6),g=0,y=function(t){return t._l||(t._l=new d)},d=function(){this.a=[]},_=function(t,n){return p(t.a,function(t){return t[0]===n})};d.prototype={get:function(t){var n=_(this,t);if(n)return n[1]},has:function(t){return!!_(this,t)},set:function(t,n){var r=_(this,t);r?r[1]=n:this.a.push([t,n])},"delete":function(t){var n=v(this.a,function(n){return n[0]===t});return~n&&this.a.splice(n,1),!!~n}},t.exports={getConstructor:function(t,n,e,u){var s=t(function(t,i){f(t,s,n,"_i"),t._t=n,t._i=g++,t._l=r,i!=r&&a(i,e,t[u],t)});return i(s.prototype,{"delete":function(t){if(!c(t))return!1;var r=o(t);return!0===r?y(h(this,n))["delete"](t):r&&l(r,this._i)&&delete r[this._i]},has:function has(t){if(!c(t))return!1;var r=o(t);return!0===r?y(h(this,n)).has(t):r&&l(r,this._i)}}),s},def:function(t,n,r){var e=o(u(n),!0);return!0===e?y(t).set(n,r):e[t._i]=r,t},ufstore:y}},function(t,n,e){var i=e(24),o=e(8);t.exports=function(t){if(t===r)return 0;var n=i(t),e=o(n);if(n!==e)throw RangeError("Wrong length!");return e}},function(t,n,e){function flattenIntoArray(t,n,e,a,s,l,h,p){for(var v,g,y=s,d=0,_=!!h&&c(h,p,3);d<a;){if(d in e){if(v=_?_(e[d],d,n):e[d],g=!1,o(v)&&(g=(g=v[f])!==r?!!g:i(v)),g&&l>0)y=flattenIntoArray(t,n,v,u(v.length),y,l-1)-1;else{if(y>=9007199254740991)throw TypeError();t[y]=v}y++}d++}return y}var i=e(53),o=e(4),u=e(8),c=e(19),f=e(5)("isConcatSpreadable");t.exports=flattenIntoArray},function(t,n,e){var i=e(8),o=e(76),u=e(23);t.exports=function(t,n,e,c){var f=String(u(t)),a=f.length,s=e===r?" ":String(e),l=i(n);if(l<=a||""==s)return f;var h=l-a,p=o.call(s,Math.ceil(h/s.length));return p.length>h&&(p=p.slice(0,h)),c?p+f:f+p}},function(t,n,r){var e=r(27),i=r(11),o=r(48).f;t.exports=function(t){return function(n){for(var r,u=i(n),c=e(u),f=c.length,a=0,s=[];f>a;)o.call(u,r=c[a++])&&s.push(t?[r,u[r]]:u[r]);return s}}},function(t,n,r){var e=r(39),i=r(122);t.exports=function(t){return function toJSON(){if(e(this)!=t)throw TypeError(t+"#toJSON isn't generic");return i(this)}}},function(t,n,r){var e=r(34);t.exports=function(t,n){var r=[];return e(t,!1,r.push,r,n),r}},function(t,n){t.exports=Math.scale||function scale(t,n,r,e,i){return 0===arguments.length||t!=t||n!=n||r!=r||e!=e||i!=i?NaN:t===Infinity||t===-Infinity?t:(t-n)*(i-e)/(r-n)+e}},function(t,n,e){var i=e(39),o=e(5)("iterator"),u=e(40);t.exports=e(18).isIterable=function(t){var n=Object(t);return n[o]!==r||"@@iterator"in n||u.hasOwnProperty(i(n))}},function(t,n,r){var e=r(126),i=r(73),o=r(10);t.exports=function(){for(var t=o(this),n=arguments.length,r=Array(n),u=0,c=e._,f=!1;n>u;)(r[u]=arguments[u++])===c&&(f=!0);return function(){var e,o=this,u=arguments.length,a=0,s=0;if(!f&&!u)return i(t,r,o);if(e=r.slice(),f)for(;n>a;a++)e[a]===c&&(e[a]=arguments[s++]);for(;u>s;)e.push(arguments[s++]);return i(t,e,o)}}},function(t,n,r){t.exports=r(2)},function(t,n,r){var e=r(6),i=r(15),o=r(91),u=r(11);t.exports=function define(t,n){for(var r,c=o(u(n)),f=c.length,a=0;f>a;)e.f(t,r=c[a++],i.f(n,r));return t}},function(t,n,r){r(129),r(131),r(132),r(133),r(134),r(135),r(136),r(137),r(138),r(139),r(140),r(141),r(142),r(143),r(144),r(145),r(147),r(148),r(149),r(150),r(151),r(152),r(153),r(154),r(155),r(156),r(157),r(158),r(159),r(160),r(161),r(162),r(163),r(164),r(165),r(166),r(167),r(168),r(169),r(170),r(171),r(172),r(173),r(174),r(175),r(176),r(177),r(178),r(179),r(180),r(181),r(182),r(183),r(184),r(185),r(186),r(187),r(188),r(189),r(190),r(191),r(192),r(193),r(194),r(195),r(196),r(197),r(198),r(199),r(200),r(201),r(202),r(203),r(204),r(205),r(206),r(207),r(208),r(209),r(210),r(211),r(213),r(214),r(215),r(216),r(217),r(218),r(219),r(220),r(221),r(222),r(223),r(224),r(86),r(225),r(226),r(227),r(109),r(228),r(229),r(230),r(231),r(232),r(112),r(114),r(115),r(233),r(234),r(235),r(236),r(237),r(238),r(239),r(240),r(241),r(242),r(243),r(244),r(245),r(246),r(247),r(248),r(249),r(250),r(252),r(253),r(255),r(256),r(257),r(258),r(259),r(260),r(261),r(262),r(263),r(264),r(265),r(266),r(267),r(268),r(269),r(270),r(271),r(272),r(273),r(274),r(275),r(276),r(277),r(278),r(279),r(280),r(281),r(282),r(283),r(284),r(285),r(286),r(287),r(288),r(289),r(290),r(291),r(292),r(293),r(294),r(295),r(296),r(297),r(298),r(299),r(300),r(301),r(302),r(303),r(304),r(305),r(306),r(307),r(308),r(309),r(310),r(311),r(312),r(313),r(314),r(315),r(316),r(317),r(318),r(319),r(320),r(321),r(322),r(323),r(324),r(325),r(49),r(327),r(124),r(328),r(329),r(330),r(331),r(332),r(333),r(334),r(335),r(336),t.exports=r(337)},function(t,n,e){var i=e(2),o=e(12),u=e(7),c=e(0),f=e(14),a=e(32).KEY,s=e(3),l=e(50),h=e(44),p=e(35),v=e(5),g=e(95),y=e(67),d=e(130),_=e(53),b=e(1),S=e(11),m=e(22),x=e(31),w=e(28),E=e(98),O=e(15),P=e(6),M=e(27),F=O.f,I=P.f,A=E.f,k=i.Symbol,N=i.JSON,j=N&&N.stringify,T=v("_hidden"),R=v("toPrimitive"),D={}.propertyIsEnumerable,L=l("symbol-registry"),W=l("symbols"),C=l("op-symbols"),U=Object.prototype,G="function"==typeof k,B=i.QObject,V=!B||!B.prototype||!B.prototype.findChild,q=u&&s(function(){return 7!=w(I({},"a",{get:function(){return I(this,"a",{value:7}).a}})).a})?function(t,n,r){var e=F(U,n);e&&delete U[n],I(t,n,r),e&&t!==U&&I(U,n,e)}:I,z=function(t){var n=W[t]=w(k.prototype);return n._k=t,n},K=G&&"symbol"==typeof k.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof k},J=function defineProperty(t,n,r){return t===U&&J(C,n,r),b(t),n=m(n,!0),b(r),o(W,n)?(r.enumerable?(o(t,T)&&t[T][n]&&(t[T][n]=!1),r=w(r,{enumerable:x(0,!1)})):(o(t,T)||I(t,T,x(1,{})),t[T][n]=!0),q(t,n,r)):I(t,n,r)},Y=function defineProperties(t,n){b(t);for(var r,e=d(n=S(n)),i=0,o=e.length;o>i;)J(t,r=e[i++],n[r]);return t},H=function propertyIsEnumerable(t){var n=D.call(this,t=m(t,!0));return!(this===U&&o(W,t)&&!o(C,t))&&(!(n||!o(this,t)||!o(W,t)||o(this,T)&&this[T][t])||n)},X=function getOwnPropertyDescriptor(t,n){if(t=S(t),n=m(n,!0),t!==U||!o(W,n)||o(C,n)){var r=F(t,n);return!r||!o(W,n)||o(t,T)&&t[T][n]||(r.enumerable=!0),r}},$=function getOwnPropertyNames(t){for(var n,r=A(S(t)),e=[],i=0;r.length>i;)o(W,n=r[i++])||n==T||n==a||e.push(n);return e},Z=function getOwnPropertySymbols(t){for(var n,r=t===U,e=A(r?C:S(t)),i=[],u=0;e.length>u;)!o(W,n=e[u++])||r&&!o(U,n)||i.push(W[n]);return i};G||(f((k=function Symbol(){if(this instanceof k)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:r),n=function(r){this===U&&n.call(C,r),o(this,T)&&o(this[T],t)&&(this[T][t]=!1),q(this,t,x(1,r))};return u&&V&&q(U,t,{configurable:!0,set:n}),z(t)}).prototype,"toString",function toString(){return this._k}),O.f=X,P.f=J,e(38).f=E.f=$,e(48).f=H,e(52).f=Z,u&&!e(36)&&f(U,"propertyIsEnumerable",H,!0),g.f=function(t){return z(v(t))}),c(c.G+c.W+c.F*!G,{Symbol:k});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Q.length>tt;)v(Q[tt++]);for(var nt=M(v.store),rt=0;nt.length>rt;)y(nt[rt++]);c(c.S+c.F*!G,"Symbol",{"for":function(t){return o(L,t+="")?L[t]:L[t]=k(t)},keyFor:function keyFor(t){if(!K(t))throw TypeError(t+" is not a symbol!");for(var n in L)if(L[n]===t)return n},useSetter:function(){V=!0},useSimple:function(){V=!1}}),c(c.S+c.F*!G,"Object",{create:function create(t,n){return n===r?w(t):Y(w(t),n)},defineProperty:J,defineProperties:Y,getOwnPropertyDescriptor:X,getOwnPropertyNames:$,getOwnPropertySymbols:Z}),N&&c(c.S+c.F*(!G||s(function(){var t=k();return"[null]"!=j([t])||"{}"!=j({a:t})||"{}"!=j(Object(t))})),"JSON",{stringify:function stringify(t){if(t!==r&&!K(t)){for(var n,e,i=[t],o=1;arguments.length>o;)i.push(arguments[o++]);return"function"==typeof(n=i[1])&&(e=n),!e&&_(n)||(n=function(t,n){if(e&&(n=e.call(this,t,n)),!K(n))return n}),i[1]=n,j.apply(N,i)}}}),k.prototype[R]||e(13)(k.prototype,R,k.prototype.valueOf),h(k,"Symbol"),h(Math,"Math",!0),h(i.JSON,"JSON",!0)},function(t,n,r){var e=r(27),i=r(52),o=r(48);t.exports=function(t){var n=e(t),r=i.f;if(r)for(var u,c=r(t),f=o.f,a=0;c.length>a;)f.call(t,u=c[a++])&&n.push(u);return n}},function(t,n,r){var e=r(0);e(e.S+e.F*!r(7),"Object",{defineProperty:r(6).f})},function(t,n,r){var e=r(0);e(e.S+e.F*!r(7),"Object",{defineProperties:r(97)})},function(t,n,r){var e=r(11),i=r(15).f;r(25)("getOwnPropertyDescriptor",function(){return function getOwnPropertyDescriptor(t,n){return i(e(t),n)}})},function(t,n,r){var e=r(0);e(e.S,"Object",{create:r(28)})},function(t,n,r){var e=r(9),i=r(16);r(25)("getPrototypeOf",function(){return function getPrototypeOf(t){return i(e(t))}})},function(t,n,r){var e=r(9),i=r(27);r(25)("keys",function(){return function keys(t){return i(e(t))}})},function(t,n,r){r(25)("getOwnPropertyNames",function(){return r(98).f})},function(t,n,r){var e=r(4),i=r(32).onFreeze;r(25)("freeze",function(t){return function freeze(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(4),i=r(32).onFreeze;r(25)("seal",function(t){return function seal(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(4),i=r(32).onFreeze;r(25)("preventExtensions",function(t){return function preventExtensions(n){return t&&e(n)?t(i(n)):n}})},function(t,n,r){var e=r(4);r(25)("isFrozen",function(t){return function isFrozen(n){return!e(n)||!!t&&t(n)}})},function(t,n,r){var e=r(4);r(25)("isSealed",function(t){return function isSealed(n){return!e(n)||!!t&&t(n)}})},function(t,n,r){var e=r(4);r(25)("isExtensible",function(t){return function isExtensible(n){return!!e(n)&&(!t||t(n))}})},function(t,n,r){var e=r(0);e(e.S+e.F,"Object",{assign:r(71)})},function(t,n,r){var e=r(0);e(e.S,"Object",{is:r(146)})},function(t,n){t.exports=Object.is||function is(t,n){return t===n?0!==t||1/t==1/n:t!=t&&n!=n}},function(t,n,r){var e=r(0);e(e.S,"Object",{setPrototypeOf:r(72).set})},function(t,n,r){var e=r(39),i={};i[r(5)("toStringTag")]="z",i+""!="[object z]"&&r(14)(Object.prototype,"toString",function toString(){return"[object "+e(this)+"]"},!0)},function(t,n,r){var e=r(0);e(e.P,"Function",{bind:r(99)})},function(t,n,r){var e=r(6).f,i=Function.prototype,o=/^\s*function ([^ (]*)/;"name"in i||r(7)&&e(i,"name",{configurable:!0,get:function(){try{return(""+this).match(o)[1]}catch(t){return""}}})},function(t,n,r){var e=r(4),i=r(16),o=r(5)("hasInstance"),u=Function.prototype;o in u||r(6).f(u,o,{value:function(t){if("function"!=typeof this||!e(t))return!1;if(!e(this.prototype))return t instanceof this;for(;t=i(t);)if(this.prototype===t)return!0;return!1}})}
vendor: 4,842 bytes, line 62757
62757,function(t,n,r){var e=r(2),i=r(12),o=r(20),u=r(74),c=r(22),f=r(3),a=r(38).f,s=r(15).f,l=r(6).f,h=r(45).trim,p=e.Number,v=p,g=p.prototype,y="Number"==o(r(28)(g)),d="trim"in String.prototype,_=function(t){var n=c(t,!1);if("string"==typeof n&&n.length>2){var r,e,i,o=(n=d?n.trim():h(n,3)).charCodeAt(0);if(43===o||45===o){if(88===(r=n.charCodeAt(2))||120===r)return NaN}else if(48===o){switch(n.charCodeAt(1)){case 66:case 98:e=2,i=49;break;case 79:case 111:e=8,i=55;break;default:return+n}for(var u,f=n.slice(2),a=0,s=f.length;a<s;a++)if((u=f.charCodeAt(a))<48||u>i)return NaN;return parseInt(f,e)}}return+n};if(!p(" 0o1")||!p("0b1")||p("+0x1")){p=function Number(t){var n=arguments.length<1?0:t,r=this;return r instanceof p&&(y?f(function(){g.valueOf.call(r)}):"Number"!=o(r))?u(new v(_(n)),r,p):_(n)};for(var b,S=r(7)?a(v):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),m=0;S.length>m;m++)i(v,b=S[m])&&!i(p,b)&&l(p,b,s(v,b));p.prototype=g,g.constructor=p,r(14)(e,"Number",p)}},function(t,n,r){var e=r(0),i=r(24),o=r(100),u=r(76),c=1..toFixed,f=Math.floor,a=[0,0,0,0,0,0],s="Number.toFixed: incorrect invocation!",l=function(t,n){for(var r=-1,e=n;++r<6;)e+=t*a[r],a[r]=e%1e7,e=f(e/1e7)},h=function(t){for(var n=6,r=0;--n>=0;)r+=a[n],a[n]=f(r/t),r=r%t*1e7},p=function(){for(var t=6,n="";--t>=0;)if(""!==n||0===t||0!==a[t]){var r=String(a[t]);n=""===n?r:n+u.call("0",7-r.length)+r}return n},v=function(t,n,r){return 0===n?r:n%2==1?v(t,n-1,r*t):v(t*t,n/2,r)},g=function(t){for(var n=0,r=t;r>=4096;)n+=12,r/=4096;for(;r>=2;)n+=1,r/=2;return n};e(e.P+e.F*(!!c&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r(3)(function(){c.call({})})),"Number",{toFixed:function toFixed(t){var n,r,e,c,f=o(this,s),a=i(t),y="",d="0";if(a<0||a>20)throw RangeError(s);if(f!=f)return"NaN";if(f<=-1e21||f>=1e21)return String(f);if(f<0&&(y="-",f=-f),f>1e-21)if(n=g(f*v(2,69,1))-69,r=n<0?f*v(2,-n,1):f/v(2,n,1),r*=4503599627370496,(n=52-n)>0){for(l(0,r),e=a;e>=7;)l(1e7,0),e-=7;for(l(v(10,e,1),0),e=n-1;e>=23;)h(1<<23),e-=23;h(1<<e),l(1,1),h(2),d=p()}else l(0,r),l(1<<-n,0),d=p()+u.call("0",a);return d=a>0?y+((c=d.length)<=a?"0."+u.call("0",a-c)+d:d.slice(0,c-a)+"."+d.slice(c-a)):y+d}})},function(t,n,e){var i=e(0),o=e(3),u=e(100),c=1..toPrecision;i(i.P+i.F*(o(function(){return"1"!==c.call(1,r)})||!o(function(){c.call({})})),"Number",{toPrecision:function toPrecision(t){var n=u(this,"Number#toPrecision: incorrect invocation!");return t===r?c.call(n):c.call(n,t)}})},function(t,n,r){var e=r(0);e(e.S,"Number",{EPSILON:Math.pow(2,-52)})},function(t,n,r){var e=r(0),i=r(2).isFinite;e(e.S,"Number",{isFinite:function isFinite(t){return"number"==typeof t&&i(t)}})},function(t,n,r){var e=r(0);e(e.S,"Number",{isInteger:r(101)})},function(t,n,r){var e=r(0);e(e.S,"Number",{isNaN:function isNaN(t){return t!=t}})},function(t,n,r){var e=r(0),i=r(101),o=Math.abs;e(e.S,"Number",{isSafeInteger:function isSafeInteger(t){return i(t)&&o(t)<=9007199254740991}})},function(t,n,r){var e=r(0);e(e.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(t,n,r){var e=r(0);e(e.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(t,n,r){var e=r(0),i=r(102);e(e.S+e.F*(Number.parseFloat!=i),"Number",{parseFloat:i})},function(t,n,r){var e=r(0),i=r(103);e(e.S+e.F*(Number.parseInt!=i),"Number",{parseInt:i})},function(t,n,r){var e=r(0),i=r(103);e(e.G+e.F*(parseInt!=i),{parseInt:i})},function(t,n,r){var e=r(0),i=r(102);e(e.G+e.F*(parseFloat!=i),{parseFloat:i})},function(t,n,r){var e=r(0),i=r(104),o=Math.sqrt,u=Math.acosh;e(e.S+e.F*!(u&&710==Math.floor(u(Number.MAX_VALUE))&&u(Infinity)==Infinity),"Math",{acosh:function acosh(t){return(t=+t)<1?NaN:t>94906265.62425156?Math.log(t)+Math.LN2:i(t-1+o(t-1)*o(t+1))}})},function(t,n,r){function asinh(t){return isFinite(t=+t)&&0!=t?t<0?-asinh(-t):Math.log(t+Math.sqrt(t*t+1)):t}var e=r(0),i=Math.asinh;e(e.S+e.F*!(i&&1/i(0)>0),"Math",{asinh:asinh})},function(t,n,r){var e=r(0),i=Math.atanh;e(e.S+e.F*!(i&&1/i(-0)<0),"Math",{atanh:function atanh(t){return 0==(t=+t)?t:Math.log((1+t)/(1-t))/2}})},function(t,n,r){var e=r(0),i=r(77);e(e.S,"Math",{cbrt:function cbrt(t){return i(t=+t)*Math.pow(Math.abs(t),1/3)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{clz32:function clz32(t){return(t>>>=0)?31-Math.floor(Math.log(t+.5)*Math.LOG2E):32}})},function(t,n,r){var e=r(0),i=Math.exp;e(e.S,"Math",{cosh:function cosh(t){return(i(t=+t)+i(-t))/2}})},function(t,n,r){var e=r(0),i=r(78);e(e.S+e.F*(i!=Math.expm1),"Math",{expm1:i})},function(t,n,r){var e=r(0);e(e.S,"Math",{fround:r(105)})},function(t,n,r){var e=r(0),i=Math.abs;e(e.S,"Math",{hypot:function hypot(t,n){for(var r,e,o=0,u=0,c=arguments.length,f=0;u<c;
62757)f<(r=i(arguments[u++]))?(o=o*(e=f/r)*e+1,f=r):o+=r>0?(e=r/f)*e:r;return f===Infinity?Infinity:f*Math.sqrt(o)}})},function(t,n,r){var e=r(0),i=Math.imul;e(e.S+e.F*r(3)(function(){return-5!=i(4294967295,5)||2!=i.length}),"Math",{imul:function imul(t,n){var r=+t,e=+n,i=65535&r,o=65535&e;return 0|i*o+((65535&r>>>16)*o+i*(65535&e>>>16)<<16>>>0)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{log10:function log10(t){return Math.log(t)*Math.LOG10E}})},function(t,n,r){var e=r(0);e(e.S,"Math",{log1p:r(104)})},function(t,n,r){var e=r(0);e(e.S,"Math",{log2:function log2(t){return Math.log(t)/Math.LN2}})},function(t,n,r){var e=r(0);e(e.S,"Math",{sign:r(77)})},function(t,n,r){var e=r(0),i=r(78),o=Math.exp;e(e.S+e.F*r(3)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function sinh(t){return Math.abs(t=+t)<1?(i(t)-i(-t))/2:(o(t-1)-o(-t-1))*(Math.E/2)}})},function(t,n,r){var e=r(0),i=r(78),o=Math.exp;e(e.S,"Math",{tanh:function tanh(t){var n=i(t=+t),r=i(-t);return n==Infinity?1:r==Infinity?-1:(n-r)/(o(t)+o(-t))}})},function(t,n,r){var e=r(0);e(e.S,"Math",{trunc:function trunc(t){return(t>0?Math.floor:Math.ceil)(t)}})},function(t,n,r){var e=r(0),i=r(37),o=String.fromCharCode,u=String.fromCodePoint;e(e.S+e.F*(!!u&&1!=u.length),"String",{fromCodePoint:function fromCodePoint(t){for(var n,r=[],e=arguments.length,u=0;e>u;){if(n=+arguments[u++],i(n,1114111)!==n)throw RangeError(n+" is not a valid code point");r.push(n<65536?o(n):o(55296+((n-=65536)>>10),n%1024+56320))}return r.join("")}})},function(t,n,r){var e=r(0),i=r(11),o=r(8);e(e.S,"String",{raw:function raw(t){for(var n=i(t.raw),r=o(n.length),e=arguments.length,u=[],c=0;r>c;)u.push(String(n[c++])),c<e&&u.push(String(arguments[c]));return u.join("")}})},function(t,n,r){r(45)("trim",function(t){return function trim(){return t(this,3)}})},function(t,n,r){var e=r(0),i=r(79)(!1);e(e.P,"String",{codePointAt:function codePointAt(t){return i(this,t)}})},function(t,n,e){var i=e(0),o=e(8),u=e(80),c="".endsWith;i(i.P+i.F*e(81)("endsWith"),"String",{endsWith:function endsWith(t){var n=u(this,t,"endsWith"),e=arguments.length>1?arguments[1]:r,i=o(n.length),f=e===r?i:Math.min(o(e),i),a=String(t);return c?c.call(n,a,f):n.slice(f-a.length,f)===a}})},function(t,n,e){var i=e(0),o=e(80);i(i.P+i.F*e(81)("includes"),"String",{includes:function includes(t){return!!~o(this,t,"includes").indexOf(t,arguments.length>1?arguments[1]:r)}})},function(t,n,r){var e=r(0);e(e.P,"String",{repeat:r(76)})},function(t,n,e){var i=e(0),o=e(8),u=e(80),c="".startsWith;i(i.P+i.F*e(81)("startsWith"),"String",{startsWith:function startsWith(t){var n=u(this,t,"startsWith"),e=o(Math.min(arguments.length>1?arguments[1]:r,n.length)),i=String(t);return c?c.call(n,i,e):n.slice(e,e+i.length)===i}})},function(t,n,e){var i=e(79)(!0);e(55)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,n=this._t,e=this._i;return e>=n.length?{value:r,done:!0}:(t=i(n,e),this._i+=t.length,{value:t,done:!1})})},function(t,n,r){r(17)("anchor",function(t){return function anchor(n){return t(this,"a","name",n)}})},function(t,n,r){r(17)("big",function(t){return function big(){return t(this,"big","","")}})},function(t,n,r){r(17)("blink",function(t){return function blink(){return t(this,"blink","","")}})},function(t,n,r){r(17)("bold",function(t){return function bold(){return t(this,"b","","")}})},function(t,n,r){r(17)("fixed",function(t){return function fixed(){return t(this,"tt","","")}})},function(t,n,r){r(17)("fontcolor",function(t){return function fontcolor(n){return t(this,"font","color",n)}})},function(t,n,r){r(17)("fontsize",function(t){return function fontsize(n){return t(this,"font","size",n)}})},function(t,n,r){r(17)("italics",function(t){return function italics(){return t(this,"i","","")}})},function(t,n,r){r(17)("link",function(t){return function link(n){return t(this,"a","href",n)}})},function(t,n,r){r(17)("small",function(t){return function small(){return t(this,"small","","")}})},function(t,n,r){r(17)("strike",function(t){return function strike(){return t(this,"strike","","")}})},function(t,n,r){r(17)("sub",function(t){return function sub(){return t(this,"sub","","")}})},function(t,n,r){r(17)("sup",function(t){return function sup(){return t(this,"sup","","")}})},function(t,n,r){var e=r(0);e(e.S,"Array",{isArray:r(53)})},function(t,n,e){var i=e(19),o=e(0),u=e(9),c=e(106),f=e(82),a=e(8),s=e(83),l=e(49);o(o.S+o.F*!e(57)(function(t){Array.from(t)}),"Array",{from:function from(t){var n,e,o,h,p=u(t),v="function"==typeof this?this:Array,g=arguments.length,y=g>1?arguments[1]:r,d=y!==r,_=0,b=l(p);if(d&&(y=i(y,g>2?arguments[2]:r,2)),b==r||v==Array&&f(b))for(e=new v(n=a(p.length));n>_;_++)s(e,_,d?y(p[_],_):p[_]);else for(h=b.call(p),e=new v;!(o=h.next()).done;_++)s(e,_,d?c(h,y,[o.value,_],!0):o.value);return e.length=_,e}})},function(t,n,r){var e=r(0),i=r(83);e(e.S+e.F*r(3)(function(){function F(){}return!(Array.of.call(F)instanceof F)}),"Array",{of:function of(){for(var t=0,n=arguments.length,r=new("function"==typeof this?this:Array)(n);n>t;)i(r,t,arguments[t++]);return r.length=n,r}})},function(t,n,e){var i=e(0),o=e(11),u=[].join;i(i.P+i.F*(e(47)!=Object||!e(21)(u)),"Array",{join:function join(t){return u.call(o(this),t===r?",":t)}})},function(t,n,e){var i=e(0),o=e(70),u=e(20),c=e(37),f=e(8),a=[].slice;i(i.P+i.F*e(3)(function(){o&&a.call(o)}),"Array",{slice:function slice(t,n){var e=f(this.length),i=u(this);if(n=n===r?e:n,"Array"==i)return a.call(this,t,n);for(var o=c(t,e),s=c(n,e),l=f(s-o),h=Array(l),p=0;p<l;p++)h[p]="String"==i?this.charAt(o+p):this[o+p];return h}})},function(t,n,e){var i=e(0),o=e(10),u=e(9),c=e(3),f=[].sort,a=[1,2,3];i(i.P+i.F*(c(function(){a.sort(r)})||!c(function(){a.sort(null)})||!e(21)(f)),"Array",{sort:function sort(t){return t===r?f.call(u(this)):f.call(u(this),o(t))}})},function(t,n,r){var e=r(0),i=r(26)(0),o=r(21)([].forEach,!0);
vendor: 18,465 bytes, lines 62757-62758
62757e(e.P+e.F*!o,"Array",{forEach:function forEach(t){return i(this,t,arguments[1])}})},function(t,n,e){var i=e(4),o=e(53),u=e(5)("species");t.exports=function(t){var n;return o(t)&&("function"!=typeof(n=t.constructor)||n!==Array&&!o(n.prototype)||(n=r),i(n)&&null===(n=n[u])&&(n=r)),n===r?Array:n}},function(t,n,r){var e=r(0),i=r(26)(1);e(e.P+e.F*!r(21)([].map,!0),"Array",{map:function map(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(26)(2);e(e.P+e.F*!r(21)([].filter,!0),"Array",{filter:function filter(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(26)(3);e(e.P+e.F*!r(21)([].some,!0),"Array",{some:function some(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(26)(4);e(e.P+e.F*!r(21)([].every,!0),"Array",{every:function every(t){return i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(107);e(e.P+e.F*!r(21)([].reduce,!0),"Array",{reduce:function reduce(t){return i(this,t,arguments.length,arguments[1],!1)}})},function(t,n,r){var e=r(0),i=r(107);e(e.P+e.F*!r(21)([].reduceRight,!0),"Array",{reduceRight:function reduceRight(t){return i(this,t,arguments.length,arguments[1],!0)}})},function(t,n,r){var e=r(0),i=r(51)(!1),o=[].indexOf,u=!!o&&1/[1].indexOf(1,-0)<0;e(e.P+e.F*(u||!r(21)(o)),"Array",{indexOf:function indexOf(t){return u?o.apply(this,arguments)||0:i(this,t,arguments[1])}})},function(t,n,r){var e=r(0),i=r(11),o=r(24),u=r(8),c=[].lastIndexOf,f=!!c&&1/[1].lastIndexOf(1,-0)<0;e(e.P+e.F*(f||!r(21)(c)),"Array",{lastIndexOf:function lastIndexOf(t){if(f)return c.apply(this,arguments)||0;var n=i(this),r=u(n.length),e=r-1;for(arguments.length>1&&(e=Math.min(e,o(arguments[1]))),e<0&&(e=r+e);e>=0;e--)if(e in n&&n[e]===t)return e||0;return-1}})},function(t,n,r){var e=r(0);e(e.P,"Array",{copyWithin:r(108)}),r(33)("copyWithin")},function(t,n,r){var e=r(0);e(e.P,"Array",{fill:r(85)}),r(33)("fill")},function(t,n,e){var i=e(0),o=e(26)(5),u=!0;"find"in[]&&Array(1).find(function(){u=!1}),i(i.P+i.F*u,"Array",{find:function find(t){return o(this,t,arguments.length>1?arguments[1]:r)}}),e(33)("find")},function(t,n,e){var i=e(0),o=e(26)(6),u="findIndex",c=!0;u in[]&&Array(1)[u](function(){c=!1}),i(i.P+i.F*c,"Array",{findIndex:function findIndex(t){return o(this,t,arguments.length>1?arguments[1]:r)}}),e(33)(u)},function(t,n,r){r(41)("Array")},function(t,n,e){var i=e(2),o=e(74),u=e(6).f,c=e(38).f,f=e(54),a=e(58),s=i.RegExp,l=s,h=s.prototype,p=/a/g,v=/a/g,g=new s(p)!==p;if(e(7)&&(!g||e(3)(function(){return v[e(5)("match")]=!1,s(p)!=p||s(v)==v||"/a/i"!=s(p,"i")}))){s=function RegExp(t,n){var e=this instanceof s,i=f(t),u=n===r;return!e&&i&&t.constructor===s&&u?t:o(g?new l(i&&!u?t.source:t,n):l((i=t instanceof s)?t.source:t,i&&u?a.call(t):n),e?this:h,s)};for(var y=c(l),d=0;y.length>d;)!function(t){t in s||u(s,t,{configurable:!0,get:function(){return l[t]},set:function(n){l[t]=n}})}(y[d++]);h.constructor=s,s.prototype=h,e(14)(i,"RegExp",s)}e(41)("RegExp")},function(t,n,e){e(109);var i=e(1),o=e(58),u=e(7),c=/./.toString,f=function(t){e(14)(RegExp.prototype,"toString",t,!0)};e(3)(function(){return"/a/b"!=c.call({source:"a",flags:"b"})})?f(function toString(){var t=i(this);return"/".concat(t.source,"/","flags"in t?t.flags:!u&&t instanceof RegExp?o.call(t):r)}):"toString"!=c.name&&f(function toString(){return c.call(this)})},function(t,n,e){e(59)("match",1,function(t,n,e){return[function match(e){var i=t(this),o=e==r?r:e[n];return o!==r?o.call(e,i):new RegExp(e)[n](String(i))},e]})},function(t,n,e){e(59)("replace",2,function(t,n,e){return[function replace(i,o){var u=t(this),c=i==r?r:i[n];return c!==r?c.call(i,u,o):e.call(String(u),i,o)},e]})},function(t,n,e){e(59)("search",1,function(t,n,e){return[function search(e){var i=t(this),o=e==r?r:e[n];return o!==r?o.call(e,i):new RegExp(e)[n](String(i))},e]})},function(t,n,e){e(59)("split",2,function(t,n,i){var o=e(54),u=i,c=[].push,f="length";if("c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1)[f]||2!="ab".split(/(?:ab)*/)[f]||4!=".".split(/(.?)(.?)/)[f]||".".split(/()()/)[f]>1||"".split(/.?/)[f]){var a=/()??/.exec("")[1]===r;i=function(t,n){var e=String(this);if(t===r&&0===n)return[];if(!o(t))return u.call(e,t,n);var i,s,l,h,p,v=[],g=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.unicode?"u":"")+(t.sticky?"y":""),y=0,d=n===r?4294967295:n>>>0,_=new RegExp(t.source,g+"g");for(a||(i=new RegExp("^"+_.source+"$(?!\\s)",g));(s=_.exec(e))&&!((l=s.index+s[0][f])>y&&(v.push(e.slice(y,s.index)),!a&&s[f]>1&&s[0].replace(i,function(){for(p=1;p<arguments[f]-2;p++)arguments[p]===r&&(s[p]=r)}),s[f]>1&&s.index<e[f]&&c.apply(v,s.slice(1)),h=s[0][f],y=l,v[f]>=d));)_.lastIndex===s.index&&_.lastIndex++;return y===e[f]?!h&&_.test("")||v.push(""):v.push(e.slice(y)),v[f]>d?v.slice(0,d):v}}else"0".split(r,0)[f]&&(i=function(t,n){return t===r&&0===n?[]:u.call(this,t,n)});return[function split(e,o){var u=t(this),c=e==r?r:e[n];return c!==r?c.call(e,u,o):i.call(String(u),e,o)},i]})},function(t,n,e){ 62758var i,o,u,c,f=e(36),a=e(2),s=e(19),l=e(39),h=e(0),p=e(4),v=e(10),g=e(42),y=e(34),d=e(60),_=e(88).set,b=e(89)(),S=e(90),m=e(110),x=e(111),w=a.TypeError,E=a.process,O=a.Promise,P="process"==l(E),M=function(){},F=o=S.f,I=!!function(){try{var t=O.resolve(1),n=(t.constructor={})[e(5)("species")]=function(t){t(M,M)};return(P||"function"==typeof PromiseRejectionEvent)&&t.then(M)instanceof n}catch(r){}}(),A=function(t){var n;return!(!p(t)||"function"!=typeof(n=t.then))&&n},k=function(t,n){if(!t._n){t._n=!0;var r=t._c;b(function(){for(var e=t._v,i=1==t._s,o=0;r.length>o;)!function(n){var r,o,u=i?n.ok:n.fail,c=n.resolve,f=n.reject,a=n.domain;try{u?(i||(2==t._h&&T(t),t._h=1),!0===u?r=e:(a&&a.enter(),r=u(e),a&&a.exit()),r===n.promise?f(w("Promise-chain cycle")):(o=A(r))?o.call(r,c,f):c(r)):f(e)}catch(s){f(s)}}(r[o++]);t._c=[],t._n=!1,n&&!t._h&&N(t)})}},N=function(t){_.call(a,function(){var n,e,i,o=t._v,u=j(t);if(u&&(n=m(function(){P?E.emit("unhandledRejection",o,t):(e=a.onunhandledrejection)?e({promise:t,reason:o}):(i=a.console)&&i.error&&i.error("Unhandled promise rejection",o)}),t._h=P||j(t)?2:1),t._a=r,u&&n.e)throw n.v})},j=function(t){if(1==t._h)return!1;for(var n,r=t._a||t._c,e=0;r.length>e;)if((n=r[e++]).fail||!j(n.promise))return!1;return!0},T=function(t){_.call(a,function(){var n;P?E.emit("rejectionHandled",t):(n=a.onrejectionhandled)&&n({promise:t,reason:t._v})})},R=function(t){var n=this;n._d||(n._d=!0,(n=n._w||n)._v=t,n._s=2,n._a||(n._a=n._c.slice()),k(n,!0))},D=function(t){var n,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===t)throw w("Promise can't be resolved itself");(n=A(t))?b(function(){var e={_w:r,_d:!1};try{n.call(t,s(D,e,1),s(R,e,1))}catch(i){R.call(e,i)}}):(r._v=t,r._s=1,k(r,!1))}catch(e){R.call({_w:r,_d:!1},e)}}};I||(O=function Promise(t){g(this,O,"Promise","_h"),v(t),i.call(this);try{t(s(D,this,1),s(R,this,1))}catch(n){R.call(this,n)}},(i=function Promise(t){this._c=[],this._a=r,this._s=0,this._d=!1,this._v=r,this._h=0,this._n=!1}).prototype=e(43)(O.prototype,{then:function then(t,n){var e=F(d(this,O));return e.ok="function"!=typeof t||t,e.fail="function"==typeof n&&n,e.domain=P?E.domain:r,this._c.push(e),this._a&&this._a.push(e),this._s&&k(this,!1),e.promise},"catch":function(t){return this.then(r,t)}}),u=function(){var t=new i;this.promise=t,this.resolve=s(D,t,1),this.reject=s(R,t,1)},S.f=F=function(t){return t===O||t===c?new u(t):o(t)}),h(h.G+h.W+h.F*!I,{Promise:O}),e(44)(O,"Promise"),e(41)("Promise"),c=e(18).Promise,h(h.S+h.F*!I,"Promise",{reject:function reject(t){var n=F(this);return(0,n.reject)(t),n.promise}}),h(h.S+h.F*(f||!I),"Promise",{resolve:function resolve(t){return x(f&&this===c?O:this,t)}}),h(h.S+h.F*!(I&&e(57)(function(t){O.all(t)["catch"](M)})),"Promise",{all:function all(t){var n=this,e=F(n),i=e.resolve,o=e.reject,u=m(function(){var e=[],u=0,c=1;y(t,!1,function(t){var f=u++,a=!1;e.push(r),c++,n.resolve(t).then(function(t){a||(a=!0,e[f]=t,--c||i(e))},o)}),--c||i(e)});return u.e&&o(u.v),e.promise},race:function race(t){var n=this,r=F(n),e=r.reject,i=m(function(){y(t,!1,function(t){n.resolve(t).then(r.resolve,e)})});return i.e&&e(i.v),r.promise}})},function(t,n,e){var i=e(116),o=e(46);e(61)("WeakSet",function(t){return function WeakSet(){return t(this,arguments.length>0?arguments[0]:r)}},{add:function add(t){return i.def(o(this,"WeakSet"),t,!0)}},i,!1,!0)},function(t,n,r){var e=r(0),i=r(10),o=r(1),u=(r(2).Reflect||{}).apply,c=Function.apply;e(e.S+e.F*!r(3)(function(){u(function(){})}),"Reflect",{apply:function apply(t,n,r){var e=i(t),f=o(r);return u?u(e,n,f):c.call(e,n,f)}})},function(t,n,r){var e=r(0),i=r(28),o=r(10),u=r(1),c=r(4),f=r(3),a=r(99),s=(r(2).Reflect||{}).construct,l=f(function(){function F(){}return!(s(function(){},[],F)instanceof F)}),h=!f(function(){s(function(){})});e(e.S+e.F*(l||h),"Reflect",{construct:function construct(t,n){o(t),u(n);var r=arguments.length<3?t:o(arguments[2]);if(h&&!l)return s(t,n,r);if(t==r){switch(n.length){case 0:return new t;case 1:return new t(n[0]);case 2:return new t(n[0],n[1]);case 3:return new t(n[0],n[1],n[2]);case 4:return new t(n[0],n[1],n[2],n[3])}var e=[null];return e.push.apply(e,n),new(a.apply(t,e))}var f=r.prototype,p=i(c(f)?f:Object.prototype),v=Function.apply.call(t,p,n);return c(v)?v:p}})},function(t,n,r){var e=r(6),i=r(0),o=r(1),u=r(22);i(i.S+i.F*r(3)(function(){Reflect.defineProperty(e.f({},1,{value:1}),1,{value:2})}),"Reflect",{defineProperty:function defineProperty(t,n,r){o(t),n=u(n,!0),o(r);try{return e.f(t,n,r),!0}catch(i){return!1}}})},function(t,n,r){var e=r(0),i=r(15).f,o=r(1);e(e.S,"Reflect",{deleteProperty:function deleteProperty(t,n){var r=i(o(t),n);return!(r&&!r.configurable)&&delete t[n]}})},function(t,n,e){var i=e(0),o=e(1),u=function(t){this._t=o(t),this._i=0;var n,r=this._k=[];for(n in t)r.push(n)};e(56)(u,"Object",function(){var t,n=this,e=n._k;do{if(n._i>=e.length)return{value:r,done:!0}}while(!((t=e[n._i++])in n._t));return{value:t,done:!1}}),i(i.S,"Reflect",{enumerate:function enumerate(t){return new u(t)}})},function(t,n,e){function get(t,n){var e,c,s=arguments.length<3?t:arguments[2];return a(t)===s?t[n]:(e=i.f(t,n))?u(e,"value")?e.value:e.get!==r?e.get.call(s):r:f(c=o(t))?get(c,n,s):void 0}var i=e(15),o=e(16),u=e(12),c=e(0),f=e(4),a=e(1);c(c.S,"Reflect",{get:get})},function(t,n,r){var e=r(15),i=r(0),o=r(1);i(i.S,"Reflect",{getOwnPropertyDescriptor:function getOwnPropertyDescriptor(t,n){return e.f(o(t),n)}})},function(t,n,r){var e=r(0),i=r(16),o=r(1);e(e.S,"Reflect",{getPrototypeOf:function getPrototypeOf(t){return i(o(t))}})},function(t,n,r){var e=r(0);e(e.S,"Reflect",{has:function has(t,n){return n in t}})},function(t,n,r){var e=r(0),i=r(1),o=Object.isExtensible;e(e.S,"Reflect",{isExtensible:function isExtensible(t){return i(t),!o||o(t)}})},function(t,n,r){var e=r(0);e(e.S,"Reflect",{ownKeys:r(91)})},function(t,n,r){var e=r(0),i=r(1),o=Object.preventExtensions;e(e.S,"Reflect",{preventExtensions:function preventExtensions(t){i(t);try{return o&&o(t),!0}catch(n){return!1}}})},function(t,n,e){function set(t,n,e){var f,h,p=arguments.length<4?t:arguments[3],v=o.f(s(t),n);if(!v){if(l(h=u(t)))return set(h,n,e,p);v=a(0)}return c(v,"value")?!(!1===v.writable||!l(p))&&(f=o.f(p,n)||a(0),f.value=e,i.f(p,n,f),!0):v.set!==r&&(v.set.call(p,e),!0)}var i=e(6),o=e(15),u=e(16),c=e(12),f=e(0),a=e(31),s=e(1),l=e(4);f(f.S,"Reflect",{set:set})},function(t,n,r){var e=r(0),i=r(72);i&&e(e.S,"Reflect",{setPrototypeOf:function setPrototypeOf(t,n){i.check(t,n);try{return i.set(t,n),!0}catch(r){return!1}}})},function(t,n,r){var e=r(0);e(e.S,"Date",{now:function(){return(new Date).getTime()}})},function(t,n,r){var e=r(0),i=r(9),o=r(22);e(e.P+e.F*r(3)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function toJSON(t){var n=i(this),r=o(n);return"number"!=typeof r||isFinite(r)?n.toISOString():null}})},function(t,n,r){var e=r(0),i=r(251);e(e.P+e.F*(Date.prototype.toISOString!==i),"Date",{toISOString:i})},function(t,n,r){var e=r(3),i=Date.prototype.getTime,o=Date.prototype.toISOString,u=function(t){return t>9?t:"0"+t};t.exports=e(function(){return"0385-07-25T07:06:39.999Z"!=o.call(new Date(-5e13-1))})||!e(function(){o.call(new Date(NaN))})?function toISOString(){if(!isFinite(i.call(this)))throw RangeError("Invalid time value");var t=this,n=t.getUTCFullYear(),r=t.getUTCMilliseconds(),e=n<0?"-":n>9999?"+":"";return e+("00000"+Math.abs(n)).slice(e?-6:-4)+"-"+u(t.getUTCMonth()+1)+"-"+u(t.getUTCDate())+"T"+u(t.getUTCHours())+":"+u(t.getUTCMinutes())+":"+u(t.getUTCSeconds())+"."+(r>99?r:"0"+u(r))+"Z"}:o},function(t,n,r){var e=Date.prototype,i=e.toString,o=e.getTime;new Date(NaN)+""!="Invalid Date"&&r(14)(e,"toString",function toString(){var t=o.call(this);return t===t?i.call(this):"Invalid Date"})},function(t,n,r){var e=r(5)("toPrimitive"),i=Date.prototype;e in i||r(13)(i,e,r(254))},function(t,n,r){var e=r(1),i=r(22);t.exports=function(t){if("string"!==t&&"number"!==t&&"default"!==t)throw TypeError("Incorrect hint");return i(e(this),"number"!=t)}},function(t,n,e){var i=e(0),o=e(62),u=e(92),c=e(1),f=e(37),a=e(8),s=e(4),l=e(2).ArrayBuffer,h=e(60),p=u.ArrayBuffer,v=u.DataView,g=o.ABV&&l.isView,y=p.prototype.slice,d=o.VIEW;i(i.G+i.W+i.F*(l!==p),{ArrayBuffer:p}),i(i.S+i.F*!o.CONSTR,"ArrayBuffer",{isView:function isView(t){return g&&g(t)||s(t)&&d in t}}),i(i.P+i.U+i.F*e(3)(function(){return!new p(2).slice(1,r).byteLength}),"ArrayBuffer",{slice:function slice(t,n){if(y!==r&&n===r)return y.call(c(this),t);for(var e=c(this).byteLength,i=f(t,e),o=f(n===r?e:n,e),u=new(h(this,p))(a(o-i)),s=new v(this),l=new v(u),g=0;i<o;)l.setUint8(g++,s.getUint8(i++));return u}}),e(41)("ArrayBuffer")},function(t,n,r){var e=r(0);e(e.G+e.W+e.F*!r(62).ABV,{DataView:r(92).DataView})},function(t,n,r){r(29)("Int8",1,function(t){return function Int8Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Uint8",1,function(t){return function Uint8Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Uint8",1,function(t){return function Uint8ClampedArray(n,r,e){return t(this,n,r,e)}},!0)},function(t,n,r){r(29)("Int16",2,function(t){return function Int16Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Uint16",2,function(t){return function Uint16Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Int32",4,function(t){return function Int32Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Uint32",4,function(t){return function Uint32Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Float32",4,function(t){return function Float32Array(n,r,e){return t(this,n,r,e)}})},function(t,n,r){r(29)("Float64",8,function(t){return function Float64Array(n,r,e){return t(this,n,r,e)}})},function(t,n,e){var i=e(0),o=e(51)(!0);i(i.P,"Array",{includes:function includes(t){return o(this,t,arguments.length>1?arguments[1]:r)}}),e(33)("includes")},function(t,n,r){var e=r(0),i=r(118),o=r(9),u=r(8),c=r(10),f=r(84);e(e.P,"Array",{flatMap:function flatMap(t){var n,r,e=o(this);return c(t),n=u(e.length),r=f(e,0),i(r,e,e,n,0,1,t,arguments[1]),r}}),r(33)("flatMap")},function(t,n,e){var i=e(0),o=e(118),u=e(9),c=e(8),f=e(24),a=e(84);i(i.P,"Array",{flatten:function flatten(){var t=arguments[0],n=u(this),e=c(n.length),i=a(n,0);return o(i,n,n,e,0,t===r?1:f(t)),i}}),e(33)("flatten")},function(t,n,r){var e=r(0),i=r(79)(!0);e(e.P,"String",{at:function at(t){return i(this,t)}})},function(t,n,e){var i=e(0),o=e(119);i(i.P,"String",{padStart:function padStart(t){return o(this,t,arguments.length>1?arguments[1]:r,!0)}})},function(t,n,e){var i=e(0),o=e(119);i(i.P,"String",{padEnd:function padEnd(t){return o(this,t,arguments.length>1?arguments[1]:r,!1)}})},function(t,n,r){r(45)("trimLeft",function(t){return function trimLeft(){return t(this,1)}},"trimStart")},function(t,n,r){r(45)("trimRight",function(t){return function trimRight(){return t(this,2)}},"trimEnd")},function(t,n,r){var e=r(0),i=r(23),o=r(8),u=r(54),c=r(58),f=RegExp.prototype,a=function(t,n){this._r=t,this._s=n};r(56)(a,"RegExp String",function next(){var t=this._r.exec(this._s);return{value:t,done:null===t}}),e(e.P,"String",{matchAll:function matchAll(t){if(i(this),!u(t))throw TypeError(t+" is not a regexp!");var n=String(this),r="flags"in f?String(t.flags):c.call(t),e=new RegExp(t.source,~r.indexOf("g")?r:"g"+r);return e.lastIndex=o(t.lastIndex),new a(e,n)}})},function(t,n,r){r(67)("asyncIterator")},function(t,n,r){r(67)("observable")},function(t,n,e){var i=e(0),o=e(91),u=e(11),c=e(15),f=e(83);i(i.S,"Object",{getOwnPropertyDescriptors:function getOwnPropertyDescriptors(t){for(var n,e,i=u(t),a=c.f,s=o(i),l={},h=0;s.length>h;)(e=a(i,n=s[h++]))!==r&&f(l,n,e);return l}})},function(t,n,r){var e=r(0),i=r(120)(!1);e(e.S,"Object",{values:function values(t){return i(t)}})},function(t,n,r){var e=r(0),i=r(120)(!0);e(e.S,"Object",{entries:function entries(t){return i(t)}})},function(t,n,r){var e=r(0),i=r(9),o=r(10),u=r(6);r(7)&&e(e.P+r(63),"Object",{__defineGetter__:function __defineGetter__(t,n){u.f(i(this),t,{get:o(n),enumerable:!0,configurable:!0})}})},function(t,n,r){var e=r(0),i=r(9),o=r(10),u=r(6);r(7)&&e(e.P+r(63),"Object",{__defineSetter__:function __defineSetter__(t,n){u.f(i(this),t,{set:o(n),enumerable:!0,configurable:!0})}})},function(t,n,r){var e=r(0),i=r(9),o=r(22),u=r(16),c=r(15).f;r(7)&&e(e.P+r(63),"Object",{__lookupGetter__:function __lookupGetter__(t){var n,r=i(this),e=o(t,!0);do{if(n=c(r,e))return n.get}while(r=u(r))}})},function(t,n,r){var e=r(0),i=r(9),o=r(22),u=r(16),c=r(15).f;r(7)&&e(e.P+r(63),"Object",{__lookupSetter__:function __lookupSetter__(t){var n,r=i(this),e=o(t,!0);do{if(n=c(r,e))return n.set}while(r=u(r))}})},function(t,n,r){var e=r(0);e(e.P+e.R,"Map",{toJSON:r(121)("Map")})},function(t,n,r){var e=r(0);e(e.P+e.R,"Set",{toJSON:r(121)("Set")})},function(t,n,r){r(64)("Map")},function(t,n,r){r(64)("Set")},function(t,n,r){r(64)("WeakMap")},function(t,n,r){r(64)("WeakSet")},function(t,n,r){r(65)("Map")},function(t,n,r){r(65)("Set")},function(t,n,r){r(65)("WeakMap")},function(t,n,r){r(65)("WeakSet")},function(t,n,r){var e=r(0);e(e.G,{global:r(2)})},function(t,n,r){var e=r(0);e(e.S,"System",{global:r(2)})},function(t,n,r){var e=r(0),i=r(20);e(e.S,"Error",{isError:function isError(t){return"Error"===i(t)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{clamp:function clamp(t,n,r){return Math.min(r,Math.max(n,t))}})},function(t,n,r){var e=r(0);e(e.S,"Math",{DEG_PER_RAD:Math.PI/180})},function(t,n,r){var e=r(0),i=180/Math.PI;e(e.S,"Math",{degrees:function degrees(t){return t*i}})}
62758,function(t,n,r){var e=r(0),i=r(123),o=r(105);e(e.S,"Math",{fscale:function fscale(t,n,r,e,u){return o(i(t,n,r,e,u))}})},function(t,n,r){var e=r(0);e(e.S,"Math",{iaddh:function iaddh(t,n,r,e){var i=t>>>0,o=r>>>0;return(n>>>0)+(e>>>0)+((i&o|(i|o)&~(i+o>>>0))>>>31)|0}})},function(t,n,r){var e=r(0);e(e.S,"Math",{isubh:function isubh(t,n,r,e){var i=t>>>0,o=r>>>0;return(n>>>0)-(e>>>0)-((~i&o|~(i^o)&i-o>>>0)>>>31)|0}})},function(t,n,r){var e=r(0);e(e.S,"Math",{imulh:function imulh(t,n){var r=+t,e=+n,i=65535&r,o=65535&e,u=r>>16,c=e>>16,f=(u*o>>>0)+(i*o>>>16);return u*c+(f>>16)+((i*c>>>0)+(65535&f)>>16)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{RAD_PER_DEG:180/Math.PI})},function(t,n,r){var e=r(0),i=Math.PI/180;e(e.S,"Math",{radians:function radians(t){return t*i}})},function(t,n,r){var e=r(0);e(e.S,"Math",{scale:r(123)})},function(t,n,r){var e=r(0);e(e.S,"Math",{umulh:function umulh(t,n){var r=+t,e=+n,i=65535&r,o=65535&e,u=r>>>16,c=e>>>16,f=(u*o>>>0)+(i*o>>>16);return u*c+(f>>>16)+((i*c>>>0)+(65535&f)>>>16)}})},function(t,n,r){var e=r(0);e(e.S,"Math",{signbit:function signbit(t){return(t=+t)!=t?t:0==t?1/t==Infinity:t>0}})},function(t,n,r){var e=r(0),i=r(18),o=r(2),u=r(60),c=r(111);e(e.P+e.R,"Promise",{"finally":function(t){var n=u(this,i.Promise||o.Promise),r="function"==typeof t;return this.then(r?function(r){return c(n,t()).then(function(){return r})}:t,r?function(r){return c(n,t()).then(function(){throw r})}:t)}})},function(t,n,r){var e=r(0),i=r(90),o=r(110);e(e.S,"Promise",{"try":function(t){var n=i.f(this),r=o(t);return(r.e?n.reject:n.resolve)(r.v),n.promise}})},function(t,n,r){var e=r(30),i=r(1),o=e.key,u=e.set;e.exp({defineMetadata:function defineMetadata(t,n,r,e){u(t,n,i(r),o(e))}})},function(t,n,e){var i=e(30),o=e(1),u=i.key,c=i.map,f=i.store;i.exp({deleteMetadata:function deleteMetadata(t,n){var e=arguments.length<3?r:u(arguments[2]),i=c(o(n),e,!1);if(i===r||!i["delete"](t))return!1;if(i.size)return!0;var a=f.get(n);return a["delete"](e),!!a.size||f["delete"](n)}})},function(t,n,e){var i=e(30),o=e(1),u=e(16),c=i.has,f=i.get,a=i.key,s=function(t,n,e){if(c(t,n,e))return f(t,n,e);var i=u(n);return null!==i?s(t,i,e):r};i.exp({getMetadata:function getMetadata(t,n){return s(t,o(n),arguments.length<3?r:a(arguments[2]))}})},function(t,n,e){var i=e(114),o=e(122),u=e(30),c=e(1),f=e(16),a=u.keys,s=u.key,l=function(t,n){var r=a(t,n),e=f(t);if(null===e)return r;var u=l(e,n);return u.length?r.length?o(new i(r.concat(u))):u:r};u.exp({getMetadataKeys:function getMetadataKeys(t){return l(c(t),arguments.length<2?r:s(arguments[1]))}})},function(t,n,e){var i=e(30),o=e(1),u=i.get,c=i.key;i.exp({getOwnMetadata:function getOwnMetadata(t,n){return u(t,o(n),arguments.length<3?r:c(arguments[2]))}})},function(t,n,e){var i=e(30),o=e(1),u=i.keys,c=i.key;i.exp({getOwnMetadataKeys:function getOwnMetadataKeys(t){return u(o(t),arguments.length<2?r:c(arguments[1]))}})},function(t,n,e){var i=e(30),o=e(1),u=e(16),c=i.has,f=i.key,a=function(t,n,r){if(c(t,n,r))return!0;var e=u(n);return null!==e&&a(t,e,r)};i.exp({hasMetadata:function hasMetadata(t,n){return a(t,o(n),arguments.length<3?r:f(arguments[2]))}})},function(t,n,e){var i=e(30),o=e(1),u=i.has,c=i.key;i.exp({hasOwnMetadata:function hasOwnMetadata(t,n){return u(t,o(n),arguments.length<3?r:c(arguments[2]))}})},function(t,n,e){var i=e(30),o=e(1),u=e(10),c=i.key,f=i.set;i.exp({metadata:function metadata(t,n){return function decorator(e,i){f(t,n,(i!==r?o:u)(e),c(i))}}})},function(t,n,r){var e=r(0),i=r(89)(),o=r(2).process,u="process"==r(20)(o);e(e.G,{asap:function asap(t){var n=u&&o.domain;i(n?n.bind(t):t)}})},function(t,n,e){var i=e(0),o=e(2),u=e(18),c=e(89)(),f=e(5)("observable"),a=e(10),s=e(1),l=e(42),h=e(43),p=e(13),v=e(34),g=v.RETURN,y=function(t){return null==t?r:a(t)},d=function(t){var n=t._c;n&&(t._c=r,n())},_=function(t){return t._o===r},b=function(t){_(t)||(t._o=r,d(t))},S=function(t,n){s(t),this._c=r,this._o=t,t=new m(this);try{var e=n(t),i=e;null!=e&&("function"==typeof e.unsubscribe?e=function(){i.unsubscribe()}:a(e),this._c=e)}catch(o){return void t.error(o)}_(this)&&d(this)};S.prototype=h({},{unsubscribe:function unsubscribe(){b(this)}});var m=function(t){this._s=t};m.prototype=h({},{next:function next(t){var n=this._s;if(!_(n)){var r=n._o;try{var e=y(r.next);if(e)return e.call(r,t)}catch(i){try{b(n)}finally{throw i}}}},error:function error(t){var n=this._s;if(_(n))throw t;var e=n._o;n._o=r;try{var i=y(e.error);if(!i)throw t;t=i.call(e,t)}catch(o){try{d(n)}finally{throw o}}return d(n),t},complete:function complete(t){var n=this._s;if(!_(n)){var e=n._o;n._o=r;try{var i=y(e.complete);t=i?i.call(e,t):r}catch(o){try{d(n)}finally{throw o}}return d(n),t}}});var x=function Observable(t){l(this,x,"Observable","_f")._f=a(t)};h(x.prototype,{subscribe:function subscribe(t){return new S(t,this._f)}
62758,forEach:function forEach(t){var n=this;return new(u.Promise||o.Promise)(function(r,e){a(t);var i=n.subscribe({next:function(n){try{return t(n)}catch(r){e(r),i.unsubscribe()}},error:e,complete:r})})}}),h(x,{from:function from(t){var n="function"==typeof this?this:x,r=y(s(t)[f]);if(r){var e=s(r.call(t));return e.constructor===n?e:new n(function(t){return e.subscribe(t)})}return new n(function(n){var r=!1;return c(function(){if(!r){try{if(v(t,!1,function(t){if(n.next(t),r)return g})===g)return}catch(e){if(r)throw e;return void n.error(e)}n.complete()}}),function(){r=!0}})},of:function of(){for(var t=0,n=arguments.length,r=Array(n);t<n;)r[t]=arguments[t++];return new("function"==typeof this?this:x)(function(t){var n=!1;return c(function(){if(!n){for(var e=0;e<r.length;++e)if(t.next(r[e]),n)return;t.complete()}}),function(){n=!0}})}}),p(x.prototype,f,function(){return this}),i(i.G,{Observable:x}),e(41)("Observable")},function(t,n,r){var e=r(0),i=r(88);e(e.G+e.B,{setImmediate:i.set,clearImmediate:i.clear})},function(t,n,r){for(var e=r(86),i=r(27),o=r(14),u=r(2),c=r(13),f=r(40),a=r(5),s=a("iterator"),l=a("toStringTag"),h=f.Array,p={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},v=i(p),g=0;g<v.length;g++){var y,d=v[g],_=p[d],b=u[d],S=b&&b.prototype;if(S&&(S[s]||c(S,s,h),S[l]||c(S,l,d),f[d]=h,_))for(y in e)S[y]||o(S,y,e[y],!0)}},function(t,n,r){var e=r(2),i=r(0),o=e.navigator,u=[].slice,c=!!o&&/MSIE .\./.test(o.userAgent),f=function(t){return function(n,r){var e=arguments.length>2,i=!!e&&u.call(arguments,2);return t(e?function(){("function"==typeof n?n:Function(n)).apply(this,i)}:n,r)}};i(i.G+i.B+i.F*c,{setTimeout:f(e.setTimeout),setInterval:f(e.setInterval)})},function(t,n,e){function Dict(t){var n=f(null);return t!=r&&(g(t)?v(t,!0,function(t,r){n[t]=r}):c(n,t)),n}var i=e(19),o=e(0),u=e(31),c=e(71),f=e(28),a=e(16),s=e(27),l=e(6),h=e(326),p=e(10),v=e(34),g=e(124),y=e(56),d=e(87),_=e(4),b=e(11),S=e(7),m=e(12),x=function(t){var n=1==t,e=4==t;return function(o,u,c){var f,a,s,l=i(u,c,3),h=b(o),p=n||7==t||2==t?new("function"==typeof this?this:Dict):r;for(f in h)if(m(h,f)&&(a=h[f],s=l(a,f,o),t))if(n)p[f]=s;else if(s)switch(t){case 2:p[f]=a;break;case 3:return!0;case 5:return a;case 6:return f;case 7:p[s[0]]=s[1]}else if(e)return!1;return 3==t||e?e:p}},w=x(6),E=function(t){return function(n){return new O(n,t)}},O=function(t,n){this._t=b(t),this._a=s(t),this._i=0,this._k=n};y(O,"Dict",function(){var t,n=this,e=n._t,i=n._a,o=n._k;do{if(n._i>=i.length)return n._t=r,d(1)}while(!m(e,t=i[n._i++]));return"keys"==o?d(0,t):"values"==o?d(0,e[t]):d(0,[t,e[t]])}),Dict.prototype=null,o(o.G+o.F,{Dict:Dict}),o(o.S,"Dict",{keys:E("keys"),values:E("values"),entries:E("entries"),forEach:x(0),map:x(1),filter:x(2),some:x(3),every:x(4),find:x(5),findKey:w,mapPairs:x(7),reduce:function reduce(t,n,r){p(n);var e,i,o=b(t),u=s(o),c=u.length,f=0;if(arguments.length<3){if(!c)throw TypeError("Reduce of empty object with no initial value");e=o[u[f++]]}else e=Object(r);for(;c>f;)m(o,i=u[f++])&&(e=n(e,o[i],i,t));return e},keyOf:h,includes:function includes(t,n){return(n==n?h(t,n):w(t,function(t){return t!=t}))!==r},has:m,get:function get(t,n){if(m(t,n))return t[n]},set:function set(t,n,r){return S&&n in Object?l.f(t,n,u(0,r)):t[n]=r,t},isDict:function isDict(t){return _(t)&&a(t)===Dict.prototype}})},function(t,n,r){var e=r(27),i=r(11);t.exports=function(t,n){for(var r,o=i(t),u=e(o),c=u.length,f=0;c>f;)if(o[r=u[f++]]===n)return r}},function(t,n,r){var e=r(1),i=r(49);t.exports=r(18).getIterator=function(t){var n=i(t);if("function"!=typeof n)throw TypeError(t+" is not iterable!");return e(n.call(t))}},function(t,n,r){var e=r(2),i=r(18),o=r(0),u=r(125);o(o.G+o.F,{delay:function delay(t){return new(i.Promise||e.Promise)(function(n){setTimeout(u.call(n,!0),t)})}})},function(t,n,r){var e=r(126),i=r(0);r(18)._=e._=e._||{},i(i.P+i.F,"Function",{part:r(125)})},function(t,n,r){var e=r(0);e(e.S+e.F,"Object",{isObject:r(4)})},function(t,n,r){var e=r(0);e(e.S+e.F,"Object",{classof:r(39)})},function(t,n,r){var e=r(0),i=r(127);e(e.S+e.F,"Object",{define:i})},function(t,n,r){var e=r(0),i=r(127),o=r(28);e(e.S+e.F,"Object",{make:function(t,n){return i(o(t),n)}})},function(t,n,e){e(55)(Number,"Number",function(t){this._l=+t,this._i=0},function(){var t=this._i++,n=!(t<this._l);return{done:n,value:n?r:t}})},function(t,n,r){var e=r(0),i=r(93)(/[\\^$*+?.()|[\]{}]/g,"\\$&");e(e.S,"RegExp",{escape:function escape(t){return i(t)}})},function(t,n,r){var e=r(0),i=r(93)(/[&<>"']/g,{"&":"&","<":"<",">":">",'"':""","'":"'"});e(e.P+e.F,"String",{escapeHTML:function escapeHTML(){return i(this)}})},function(t,n,r){var e=r(0),i=r(93)(/&(?:amp|lt|gt|quot|apos);/g,{"&":"&","<":"<",">":">",""":'"',"'":"'"});e(e.P+e.F,"String",{unescapeHTML:function unescapeHTML(){return i(this)}})}]),"undefined"!=typeof module&&module.exports?module.exports=t:"function"==typeof define&&define.amd?define(function(){return t}):n.core=t}(1,1); 62759
vendor: 45,826 bytes, lines 62760-62764
62760/*! 62761* sweetalert2 v11.26.25 62762* Released under the MIT License. 62763*/ 62764!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Sweetalert2=t()}(this,function(){"use strict";function e(e,t,n){if("function"==typeof e?e===t:e.has(t))return arguments.length<3?t:n;throw new TypeError("Private element is not present on this object")}function t(t,n){return t.get(e(t,n))}function n(e,t,n){(function(e,t){if(t.has(e))throw new TypeError("Cannot initialize the same private elements twice on an object")})(e,t),t.set(e,n)}const o={},i=e=>new Promise(t=>{if(!e)return t();const n=window.scrollX,i=window.scrollY;o.restoreFocusTimeout=setTimeout(()=>{o.previousActiveElement instanceof HTMLElement?(o.previousActiveElement.focus(),o.previousActiveElement=null):document.body&&document.body.focus(),t()},100),window.scrollTo(n,i)}),s="swal2-",r=["container","shown","height-auto","iosfix","popup","modal","no-backdrop","no-transition","toast","toast-shown","show","hide","close","title","html-container","actions","confirm","deny","cancel","footer","icon","icon-content","image","input","file","range","select","radio","checkbox","label","textarea","inputerror","input-label","validation-message","progress-steps","active-progress-step","progress-step","progress-step-line","loader","loading","styled","top","top-start","top-end","top-left","top-right","center","center-start","center-end","center-left","center-right","bottom","bottom-start","bottom-end","bottom-left","bottom-right","grow-row","grow-column","grow-fullscreen","rtl","timer-progress-bar","timer-progress-bar-container","scrollbar-measure","icon-success","icon-warning","icon-info","icon-question","icon-error","draggable","dragging"].reduce((e,t)=>(e[t]=s+t,e),{}),a=["success","warning","info","question","error"].reduce((e,t)=>(e[t]=s+t,e),{}),l="SweetAlert2:",c=e=>e.charAt(0).toUpperCase()+e.slice(1),u=e=>{console.warn(`${l} ${"object"==typeof e?e.join(" "):e}`)},d=e=>{console.error(`${l} ${e}`)},p=[],m=(e,t=null)=>{var n;n=`"${e}" is deprecated and will be removed in the next major release.${t?` Use "${t}" instead.`:""}`,p.includes(n)||(p.push(n),u(n))},h=e=>"function"==typeof e?e():e,g=e=>e&&"function"==typeof e.toPromise,f=e=>g(e)?e.toPromise():Promise.resolve(e),b=e=>e&&Promise.resolve(e)===e,y=()=>document.body.querySelector(`.${r.container}`),v=e=>{const t=y();return t?t.querySelector(e):null},w=e=>v(`.${e}`),C=()=>w(r.popup),A=()=>w(r.icon),E=()=>w(r.title),k=()=>w(r["html-container"]),B=()=>w(r.image),$=()=>w(r["progress-steps"]),L=()=>w(r["validation-message"]),P=()=>v(`.${r.actions} .${r.confirm}`),x=()=>v(`.${r.actions} .${r.cancel}`),T=()=>v(`.${r.actions} .${r.deny}`),S=()=>v(`.${r.loader}`),O=()=>w(r.actions),M=()=>w(r.footer),H=()=>w(r["timer-progress-bar"]),j=()=>w(r.close),I=()=>{const e=C();if(!e)return[];const t=e.querySelectorAll('[tabindex]:not([tabindex="-1"]):not([tabindex="0"])'),n=Array.from(t).sort((e,t)=>{const n=parseInt(e.getAttribute("tabindex")||"0"),o=parseInt(t.getAttribute("tabindex")||"0");return n>o?1:n<o?-1:0}),o=e.querySelectorAll('\n a[href],\n area[href],\n input:not([disabled]),\n select:not([disabled]),\n textarea:not([disabled]),\n button:not([disabled]),\n iframe,\n object,\n embed,\n [tabindex="0"],\n [contenteditable],\n audio[controls],\n video[controls],\n summary\n'),i=Array.from(o).filter(e=>"-1"!==e.getAttribute("tabindex"));return[...new Set(n.concat(i))].filter(e=>ee(e))},D=()=>N(document.body,r.shown)&&!N(document.body,r["toast-shown"])&&!N(document.body,r["no-backdrop"]),V=()=>{const e=C();return!!e&&N(e,r.toast)},q=(e,t)=>{if(e.textContent="",t){const n=(new DOMParser).parseFromString(t,"text/html"),o=n.querySelector("head");o&&Array.from(o.childNodes).forEach(t=>{e.appendChild(t)});const i=n.querySelector("body");i&&Array.from(i.childNodes).forEach(t=>{t instanceof HTMLVideoElement||t instanceof HTMLAudioElement?e.appendChild(t.cloneNode(!0)):e.appendChild(t)})}},N=(e,t)=>!!t&&t.split(/\s+/).every(t=>e.classList.contains(t)),_=(e,t,n)=>{if(((e,t)=>{Array.from(e.classList).forEach(n=>{Object.values(r).includes(n)||Object.values(a).includes(n)||Object.values(t.showClass||{}).includes(n)||e.classList.remove(n)})})(e,t),!t.customClass)return;const o=t.customClass[n];o&&("string"==typeof o||o.forEach?z(e,o):u(`Invalid type of customClass.${n}! Expected string or iterable object, got "${typeof o}"`))},F=(e,t)=>{if(!t)return null;switch(t){case"select":case"textarea":case"file":return e.querySelector(`.${r.popup} > .${r[t]}`);case"checkbox":return e.querySelector(`.${r.popup} > .${r.checkbox} input`);case"radio":return e.querySelector(`.${r.popup} > .${r.radio} input:checked`)||e.querySelector(`.${r.popup} > .${r.radio} input:first-child`);case"range":return e.querySelector(`.${r.popup} > .${r.range} input`);default:return e.querySelector(`.${r.popup} > .${r.input}`)}},R=e=>{if(e.focus(),"file"!==e.type){const t=e.value;e.value="",e.value=t}},U=(e,t,n)=>{if(!e||!t)return;const o="string"==typeof t?t.split(/\s+/).filter(Boolean):t;(Array.isArray(e)?e:[e]).forEach(e=>{o.forEach(t=>{n?e.classList.add(t):e.classList.remove(t)})})},z=(e,t)=>{U(e,t,!0)},W=(e,t)=>{U(e,t,!1)},K=(e,t)=>Array.from(e.children).find(e=>e instanceof HTMLElement&&N(e,t)),Y=(e,t,n)=>{n===`${parseInt(`${n}`)}`&&(n=parseInt(n)),n||0===n?e.style.setProperty(t,"number"==typeof n?`${n}px`:n):e.style.removeProperty(t)},X=(e,t="flex")=>{e&&(e.style.display=t)},Z=e=>{e&&(e.style.display="none")},J=(e,t="block")=>{e&&new MutationObserver(()=>{Q(e,e.innerHTML,t)}).observe(e,{childList:!0,subtree:!0})},G=(e,t,n,o)=>{const i=e.querySelector(t);i&&i.style.setProperty(n,o)},Q=(e,t,n="flex")=>{t?X(e,n):Z(e)},ee=e=>Boolean(e&&(e.offsetWidth||e.offsetHeight||e.getClientRects().length)),te=e=>Boolean(e.scrollHeight>e.clientHeight),ne=e=>{const t=window.getComputedStyle(e),n=parseFloat(t.getPropertyValue("animation-duration")||"0"),o=parseFloat(t.getPropertyValue("transition-duration")||"0");return n>0||o>0},oe=(e,t=!1)=>{const n=H();n&&ee(n)&&(t&&(n.style.transition="none",n.style.width="100%"),setTimeout(()=>{n.style.transition=`width ${e/1e3}s linear`,n.style.width="0%"},10))},ie=`\n <div aria-labelledby="${r.title}" aria-describedby="${r["html-container"]}" class="${r.popup}" tabindex="-1">\n <button type="button" class="${r.close}"></button>\n <ul class="${r["progress-steps"]}"></ul>\n <div class="${r.icon}"></div>\n <img class="${r.image}" />\n <h2 class="${r.title}" id="${r.title}"></h2>\n <div class="${r["html-container"]}" id="${r["html-container"]}"></div>\n <input class="${r.input}" id="${r.input}" />\n <input type="file" class="${r.file}" />\n <div class="${r.range}">\n <input type="range" />\n <output></output>\n </div>\n <select class="${r.select}" id="${r.select}"></select>\n <div class="${r.radio}"></div>\n <label class="${r.checkbox}">\n <input type="checkbox" id="${r.checkbox}" />\n <span class="${r.label}"></span>\n </label>\n <textarea class="${r.textarea}" id="${r.textarea}"></textarea>\n <div class="${r["validation-message"]}" id="${r["validation-message"]}"></div>\n <div class="${r.actions}">\n <div class="${r.loader}"></div>\n <button type="button" class="${r.confirm}"></button>\n <button type="button" class="${r.deny}"></button>\n <button type="button" class="${r.cancel}"></button>\n </div>\n <div class="${r.footer}"></div>\n <div class="${r["timer-progress-bar-container"]}">\n <div class="${r["timer-progress-bar"]}"></div>\n </div>\n </div>\n`.replace(/(^|\n)\s*/g,""),se=()=>{o.currentInstance&&o.currentInstance.resetValidationMessage()},re=e=>{const t=(()=>{const e=y();return!!e&&(e.remove(),W([document.documentElement,document.body],[r["no-backdrop"],r["toast-shown"],r["has-column"]]),!0)})();if("undefined"==typeof window||"undefined"==typeof document)return void d("SweetAlert2 requires document to initialize");const n=document.createElement("div");n.className=r.container,t&&z(n,r["no-transition"]),q(n,ie),n.dataset.swal2Theme=e.theme;const i=(e=>{if("string"==typeof e){const t=document.querySelector(e);if(!t)throw new Error(`Target element "${e}" not found`);return t}return e})(e.target||"body");i.appendChild(n),e.topLayer&&(n.setAttribute("popover",""),n.showPopover()),(e=>{const t=C();t&&(t.setAttribute("role",e.toast?"alert":"dialog"),t.setAttribute("aria-live",e.toast?"polite":"assertive"),e.toast||t.setAttribute("aria-modal","true"))})(e),(e=>{"rtl"===window.getComputedStyle(e).direction&&(z(y(),r.rtl),o.isRTL=!0)})(i),(()=>{const e=C();if(!e)return;const t=K(e,r.input),n=K(e,r.file),o=e.querySelector(`.${r.range} input`),i=e.querySelector(`.${r.range} output`),s=K(e,r.select),a=e.querySelector(`.${r.checkbox} input`),l=K(e,r.textarea);t&&(t.oninput=se),n&&(n.onchange=se),s&&(s.onchange=se),a&&(a.onchange=se),l&&(l.oninput=se),o&&i&&(o.oninput=()=>{se(),i.value=o.value},o.onchange=()=>{se(),i.value=o.value})})()},ae=(e,t)=>{e instanceof HTMLElement?t.appendChild(e):"object"==typeof e?le(e,t):e&&q(t,e)},le=(e,t)=>{"jquery"in e?ce(t,e):q(t,e.toString())},ce=(e,t)=>{if(e.textContent="",0 in t)for(let n=0;n in t;n++)e.appendChild(t[n].cloneNode(!0));else e.appendChild(t.cloneNode(!0))},ue=(e,t)=>{const n=O(),o=S();n&&o&&(t.showConfirmButton||t.showDenyButton||t.showCancelButton?X(n):Z(n),_(n,t,"actions"),function(e,t,n){const o=P(),i=T(),s=x();if(!o||!i||!s)return;de(o,"confirm",n),de(i,"deny",n),de(s,"cancel",n),function(e,t,n,o){if(!o.buttonsStyling)return void W([e,t,n],r.styled);z([e,t,n],r.styled);const i=[[e,"confirm",o.confirmButtonColor],[t,"deny",o.denyButtonColor],[n,"cancel",o.cancelButtonColor]];i.forEach(([e,t,n])=>{n&&e.style.setProperty(`--swal2-${t}-button-background-color`,n),function(e){const t=window.getComputedStyle(e);if(t.getPropertyValue("--swal2-action-button-focus-box-shadow"))return;const n=t.backgroundColor.replace(/rgba?\((\d+), (\d+), (\d+).*/,"rgba($1, $2, $3, 0.5)");e.style.setProperty("--swal2-action-button-focus-box-shadow",t.getPropertyValue("--swal2-outline").replace(/ rgba\(.*/,` ${n}`))}(e)})}(o,i,s,n),n.reverseButtons&&(n.toast?(e.insertBefore(s,o),e.insertBefore(i,o)):(e.insertBefore(s,t),e.insertBefore(i,t),e.insertBefore(o,t)))}(n,o,t),q(o,t.loaderHtml||""),_(o,t,"loader"))};function de(e,t,n){const o=c(t);Q(e,n[`show${o}Button`],"inline-block"),q(e,n[`${t}ButtonText`]||""),e.setAttribute("aria-label",n[`${t}ButtonAriaLabel`]||""),e.className=r[t],_(e,n,`${t}Button`)}const pe=(e,t)=>{const n=y();n&&(!function(e,t){"string"==typeof t?e.style.background=t:t||z([document.documentElement,document.body],r["no-backdrop"])}(n,t.backdrop),function(e,t){if(!t)return;t in r?z(e,r[t]):(u('The "position" parameter is not valid, defaulting to "center"'),z(e,r.center))}(n,t.position),function(e,t){if(!t)return;z(e,r[`grow-${t}`])}(n,t.grow),_(n,t,"container"))};var me={innerParams:new WeakMap,domCache:new WeakMap,focusedElement:new WeakMap};const he=["input","file","range","select","radio","checkbox","textarea"],ge=e=>{if(!e.input)return;if(!Ae[e.input])return void d(`Unexpected type of input! Expected ${Object.keys(Ae).join(" | ")}, got "${e.input}"`);const t=we(e.input);if(!t)return;const n=Ae[e.input](t,e);X(t),e.inputAutoFocus&&setTimeout(()=>{R(n)})},fe=(e,t)=>{const n=C();if(!n)return;const o=F(n,e);if(o){(e=>{for(const{name:t}of Array.from(e.attributes))["id","type","value","style"].includes(t)||e.removeAttribute(t)})(o);for(const e in t)o.setAttribute(e,t[e])}},be=e=>{if(!e.input)return;const t=we(e.input);t&&_(t,e,"input")},ye=(e,t)=>{!e.placeholder&&t.inputPlaceholder&&(e.placeholder=t.inputPlaceholder)},ve=(e,t,n)=>{if(n.inputLabel){const o=document.createElement("label"),i=r["input-label"];o.setAttribute("for",e.id),o.className=i,"object"==typeof n.customClass&&z(o,n.customClass.inputLabel),o.innerText=n.inputLabel,t.insertAdjacentElement("beforebegin",o)}},we=e=>{const t=C();if(t)return K(t,r[e]||r.input)},Ce=(e,t)=>{["string","number"].includes(typeof t)?e.value=`${t}`:b(t)||u(`Unexpected type of inputValue! Expected "string", "number" or "Promise", got "${typeof t}"`)},Ae={};Ae.text=Ae.email=Ae.password=Ae.number=Ae.tel=Ae.url=Ae.search=Ae.date=Ae["datetime-local"]=Ae.time=Ae.week=Ae.month=(e,t)=>{const n=e;return Ce(n,t.inputValue),ve(n,n,t),ye(n,t),n.type=t.input,n},Ae.file=(e,t)=>{const n=e;return ve(n,n,t),ye(n,t),n},Ae.range=(e,t)=>{const n=e,o=n.querySelector("input"),i=n.querySelector("output");return o&&(Ce(o,t.inputValue),o.type=t.input,ve(o,e,t)),i&&Ce(i,t.inputValue),e},Ae.select=(e,t)=>{const n=e;if(n.textContent="",t.inputPlaceholder){const e=document.createElement("option");q(e,t.inputPlaceholder),e.value="",e.disabled=!0,e.selected=!0,n.appendChild(e)}return ve(n,n,t),n},Ae.radio=e=>(e.textContent="",e),Ae.checkbox=(e,t)=>{const n=C();if(!n)throw new Error("Popup not found");const o=F(n,"checkbox");if(!o)throw new Error("Checkbox input not found");o.value="1",o.checked=Boolean(t.inputValue);const i=e.querySelector("span");if(i){const e=t.inputPlaceholder||t.inputLabel;e&&q(i,e)}return o},Ae.textarea=(e,t)=>{const n=e;Ce(n,t.inputValue),ye(n,t),ve(n,n,t);return setTimeout(()=>{if("MutationObserver"in window){const e=C();if(!e)return;const o=parseInt(window.getComputedStyle(e).width);new MutationObserver(()=>{if(!document.body.contains(n))return;const e=n.offsetWidth+(i=n,parseInt(window.getComputedStyle(i).marginLeft)+parseInt(window.getComputedStyle(i).marginRight));var i;const s=C();s&&(e>o?s.style.width=`${e}px`:Y(s,"width",t.width))}).observe(n,{attributes:!0,attributeFilter:["style"]})}}),n};const Ee=(e,t)=>{const n=k();n&&(J(n),_(n,t,"htmlContainer"),t.html?(ae(t.html,n),X(n,"block")):t.text?(n.textContent=t.text,X(n,"block")):Z(n),((e,t)=>{const n=C();if(!n)return;const o=me.innerParams.get(e),i=!o||t.input!==o.input;he.forEach(e=>{const o=K(n,r[e]);o&&(fe(e,t.inputAttributes),o.className=r[e],i&&Z(o))}),t.input&&(i&&ge(t),be(t))})(e,t))},ke=(e,t)=>{for(const[n,o]of Object.entries(a))t.icon!==n&&W(e,o);z(e,t.icon&&a[t.icon]),Le(e,t),Be(),_(e,t,"icon")},Be=()=>{const e=C();if(!e)return;const t=window.getComputedStyle(e).getPropertyValue("background-color");e.querySelectorAll("[class^=swal2-success-circular-line], .swal2-success-fix").forEach(e=>{e.style.backgroundColor=t})},$e=(e,t)=>{if(!t.icon&&!t.iconHtml)return;let n=e.innerHTML,o="";if(t.iconHtml)o=Pe(t.iconHtml);else if("success"===t.icon)o=(e=>`\n ${e.animation?'<div class="swal2-success-circular-line-left"></div>':""}\n <span class="swal2-success-line-tip"></span> <span class="swal2-success-line-long"></span>\n <div class="swal2-success-ring"></div>\n ${e.animation?'<div class="swal2-success-fix"></div>':""}\n ${e.animation?'<div class="swal2-success-circular-line-right"></div>':""}\n`)(t),n=n.replace(/ style=".*?"/g,"");else if("error"===t.icon)o='\n <span class="swal2-x-mark">\n <span class="swal2-x-mark-line-left"></span>\n <span class="swal2-x-mark-line-right"></span>\n </span>\n';else if(t.icon){o=Pe({question:"?",warning:"!",info:"i"}[t.icon])}n.trim()!==o.trim()&&q(e,o)},Le=(e,t)=>{if(t.iconColor){e.style.color=t.iconColor,e.style.borderColor=t.iconColor;for(const n of[".swal2-success-line-tip",".swal2-success-line-long",".swal2-x-mark-line-left",".swal2-x-mark-line-right"])G(e,n,"background-color",t.iconColor);G(e,".swal2-success-ring","border-color",t.iconColor)}},Pe=e=>`<div class="${r["icon-content"]}">${e}</div>`;let xe=!1,Te=0,Se=0,Oe=0,Me=0;const He=e=>{const t=C();if(!t)return;const n=A();if(e.target===t||n&&n.contains(e.target)){xe=!0;const n=De(e);Te=n.clientX,Se=n.clientY,Oe=parseInt(t.style.insetInlineStart)||0,Me=parseInt(t.style.insetBlockStart)||0,z(t,"swal2-dragging")}},je=e=>{const t=C();if(t&&xe){let{clientX:n,clientY:i}=De(e);const s=n-Te;t.style.insetInlineStart=`${Oe+(o.isRTL?-s:s)}px`,t.style.insetBlockStart=`${Me+(i-Se)}px`}},Ie=()=>{const e=C();xe=!1,W(e,"swal2-dragging")},De=e=>{const t=e.type.startsWith("touch")?e.touches[0]:e;return{clientX:t.clientX,clientY:t.clientY}},Ve=(e,t)=>{const n=y(),o=C();if(n&&o){if(t.toast){Y(n,"width",t.width),o.style.width="100%";const e=S();e&&o.insertBefore(e,A())}else Y(o,"width",t.width);Y(o,"padding",t.padding),t.color&&(o.style.color=t.color),t.background&&(o.style.background=t.background),Z(L()),qe(o,t),t.draggable&&!t.toast?(z(o,r.draggable),(e=>{e.addEventListener("mousedown",He),document.body.addEventListener("mousemove",je),e.addEventListener("mouseup",Ie),e.addEventListener("touchstart",He),document.body.addEventListener("touchmove",je),e.addEventListener("touchend",Ie)})(o)):(W(o,r.draggable),(e=>{e.removeEventListener("mousedown",He),document.body.removeEventListener("mousemove",je),e.removeEventListener("mouseup",Ie),e.removeEventListener("touchstart",He),document.body.removeEventListener("touchmove",je),e.removeEventListener("touchend",Ie)})(o))}},qe=(e,t)=>{const n=t.showClass||{};e.className=`${r.popup} ${ee(e)?n.popup:""}`,t.toast?(z([document.documentElement,document.body],r["toast-shown"]),z(e,r.toast)):z(e,r.modal),_(e,t,"popup"),"string"==typeof t.customClass&&z(e,t.customClass),t.icon&&z(e,r[`icon-${t.icon}`])},Ne=e=>{const t=document.createElement("li");return z(t,r["progress-step"]),q(t,e),t},_e=e=>{const t=document.createElement("li");return z(t,r["progress-step-line"]),e.progressStepsDistance&&Y(t,"width",e.progressStepsDistance),t},Fe=(e,t)=>{var n;Ve(0,t),pe(0,t),((e,t)=>{const n=$();if(!n)return;const{progressSteps:o,currentProgressStep:i}=t;o&&0!==o.length&&void 0!==i?(X(n),n.textContent="",i>=o.length&&u("Invalid currentProgressStep parameter, it should be less than progressSteps.length (currentProgressStep like JS arrays starts from 0)"),o.forEach((e,s)=>{const a=Ne(e);if(n.appendChild(a),s===i&&z(a,r["active-progress-step"]),s!==o.length-1){const e=_e(t);n.appendChild(e)}})):Z(n)})(0,t),((e,t)=>{const n=me.innerParams.get(e),o=A();if(!o)return;if(n&&t.icon===n.icon)return $e(o,t),void ke(o,t);if(!t.icon&&!t.iconHtml)return void Z(o);if(t.icon&&-1===Object.keys(a).indexOf(t.icon))return d(`Unknown icon! Expected "success", "error", "warning", "info" or "question", got "${t.icon}"`),void Z(o);X(o),$e(o,t),ke(o,t),z(o,t.showClass&&t.showClass.icon),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",Be)})(e,t),((e,t)=>{const n=B();n&&(t.imageUrl?(X(n,""),n.setAttribute("src",t.imageUrl),n.setAttribute("alt",t.imageAlt||""),Y(n,"width",t.imageWidth),Y(n,"height",t.imageHeight),n.className=r.image,_(n,t,"image")):Z(n))})(0,t),((e,t)=>{const n=E();n&&(J(n),Q(n,Boolean(t.title||t.titleText),"block"),t.title&&ae(t.title,n),t.titleText&&(n.innerText=t.titleText),_(n,t,"title"))})(0,t),((e,t)=>{const n=j();n&&(q(n,t.closeButtonHtml||""),_(n,t,"closeButton"),Q(n,t.showCloseButton),n.setAttribute("aria-label",t.closeButtonAriaLabel||""))})(0,t),Ee(e,t),ue(0,t),((e,t)=>{const n=M();n&&(J(n),Q(n,Boolean(t.footer),"block"),t.footer&&ae(t.footer,n),_(n,t,"footer"))})(0,t);const i=C();"function"==typeof t.didRender&&i&&t.didRender(i),null===(n=o.eventEmitter)||void 0===n||n.emit("didRender",i)},Re=()=>{var e;return null===(e=P())||void 0===e?void 0:e.click()},Ue=Object.freeze({cancel:"cancel",backdrop:"backdrop",close:"close",esc:"esc",timer:"timer"}),ze=e=>{if(e.keydownTarget&&e.keydownHandlerAdded&&e.keydownHandler){const t=e.keydownHandler;e.keydownTarget.removeEventListener("keydown",t,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!1}},We=(e,t)=>{var n;const o=I();return o.length?(-2===(e+=t)&&(e=o.length-1),e===o.length?e=0:-1===e&&(e=o.length-1),o[e].focus(),!(navigator.userAgent.includes("Firefox")&&o[e]instanceof HTMLIFrameElement)):(null===(n=C())||void 0===n||n.focus(),!0)},Ke=["ArrowRight","ArrowDown"],Ye=["ArrowLeft","ArrowUp"],Xe=(e,t,n)=>{e&&(t.isComposing||229===t.keyCode||(e.stopKeydownPropagation&&t.stopPropagation(),"Enter"===t.key?Ze(t,e):"Tab"===t.key?Je(t):[...Ke,...Ye].includes(t.key)?Ge(t.key):"Escape"===t.key&&Qe(t,e,n)))},Ze=(e,t)=>{if(!h(t.allowEnterKey))return;const n=C();if(!n||!t.input)return;const o=F(n,t.input);if(e.target&&o&&e.target instanceof HTMLElement&&e.target.outerHTML===o.outerHTML){if(["textarea","file"].includes(t.input))return;Re(),e.preventDefault()}},Je=e=>{const t=e.target,n=I().findIndex(e=>e===t);let o=!0;o=e.shiftKey?We(n,-1):We(n,1),e.stopPropagation(),o&&e.preventDefault()},Ge=e=>{const t=O(),n=P(),o=T(),i=x();if(!(t&&n&&o&&i))return;const s=[n,o,i];if(document.activeElement instanceof HTMLElement&&!s.includes(document.activeElement))return;const r=Ke.includes(e)?"nextElementSibling":"previousElementSibling";let a=document.activeElement;if(a){for(let e=0;e<t.children.length;e++){if(a=a[r],!a)return;if(a instanceof HTMLButtonElement&&ee(a))break}a instanceof HTMLButtonElement&&a.focus()}},Qe=(e,t,n)=>{e.preventDefault(),h(t.allowEscapeKey)&&n(Ue.esc)};var et={swalPromiseResolve:new WeakMap,swalPromiseReject:new WeakMap};const tt=()=>{Array.from(document.body.children).forEach(e=>{e.hasAttribute("data-previous-aria-hidden")?(e.setAttribute("aria-hidden",e.getAttribute("data-previous-aria-hidden")||""),e.removeAttribute("data-previous-aria-hidden")):e.removeAttribute("aria-hidden")})},nt="undefined"!=typeof window&&Boolean(window.GestureEvent),ot=nt&&/iPad|iPhone|iPod/.test(navigator.userAgent)&&!window.MSStream,it=()=>{const e=y();if(!e)return;let t;e.ontouchstart=e=>{t=st(e)},e.ontouchmove=e=>{t&&(e.preventDefault(),e.stopPropagation())}},st=e=>{const t=e.target,n=y(),o=k();return!(!n||!o)&&(!rt(e)&&!at(e)&&(t===n||!(te(n)||!(t instanceof HTMLElement)||((e,t)=>{let n=e;for(;n&&n!==t;){if(te(n))return!0;n=n.parentElement}return!1})(t,o)||"INPUT"===t.tagName||"TEXTAREA"===t.tagName||te(o)&&o.contains(t))))},rt=e=>Boolean(e.touches&&e.touches.length&&"stylus"===e.touches[0].touchType),at=e=>e.touches&&e.touches.length>1;let lt=null;const ct=e=>{null===lt&&(document.body.scrollHeight>window.innerHeight||"scroll"===e)&&(lt=parseInt(window.getComputedStyle(document.body).getPropertyValue("padding-right")),document.body.style.paddingRight=`${lt+(()=>{const e=document.createElement("div");e.className=r["scrollbar-measure"],document.body.appendChild(e);const t=e.getBoundingClientRect().width-e.clientWidth;return document.body.removeChild(e),t})()}px`)};function ut(e,t,n,s){V()?yt(e,s):(i(n).then(()=>yt(e,s)),ze(o)),nt?(t.setAttribute("style","display:none !important"),t.removeAttribute("class"),t.innerHTML=""):t.remove(),D()&&(null!==lt&&(document.body.style.paddingRight=`${lt}px`,lt=null),(()=>{if(N(document.body,r.iosfix)){const e=parseInt(document.body.style.top,10);W(document.body,r.iosfix),document.body.style.top="",document.body.scrollTop=-1*e}})(),tt()),W([document.documentElement,document.body],[r.shown,r["height-auto"],r["no-backdrop"],r["toast-shown"]])}function dt(e){e=gt(e);const t=et.swalPromiseResolve.get(this),n=pt(this);this.isAwaitingPromise?e.isDismissed||(ht(this),t(e)):n&&t(e)}const pt=e=>{const t=C();if(!t)return!1;const n=me.innerParams.get(e);if(!n||N(t,n.hideClass.popup))return!1;W(t,n.showClass.popup),z(t,n.hideClass.popup);const o=y();return W(o,n.showClass.backdrop),z(o,n.hideClass.backdrop),ft(e,t,n),!0};function mt(e){const t=et.swalPromiseReject.get(this);ht(this),t&&t(e)}const ht=e=>{e.isAwaitingPromise&&(delete e.isAwaitingPromise,me.innerParams.get(e)||e._destroy())},gt=e=>void 0===e?{isConfirmed:!1,isDenied:!1,isDismissed:!0}:Object.assign({isConfirmed:!1,isDenied:!1,isDismissed:!1},e),ft=(e,t,n)=>{var i;const s=y(),r=ne(t);"function"==typeof n.willClose&&n.willClose(t),null===(i=o.eventEmitter)||void 0===i||i.emit("willClose",t),r&&s?bt(e,t,s,Boolean(n.returnFocus),n.didClose):s&&ut(e,s,Boolean(n.returnFocus),n.didClose)},bt=(e,t,n,i,s)=>{o.swalCloseEventFinishedCallback=ut.bind(null,e,n,i,s);const r=function(e){var n;e.target===t&&(null===(n=o.swalCloseEventFinishedCallback)||void 0===n||n.call(o),delete o.swalCloseEventFinishedCallback,t.removeEventListener("animationend",r),t.removeEventListener("transitionend",r))};t.addEventListener("animationend",r),t.addEventListener("transitionend",r)},yt=(e,t)=>{setTimeout(()=>{var n;"function"==typeof t&&t.bind(e.params)(),null===(n=o.eventEmitter)||void 0===n||n.emit("didClose"),e._destroy&&e._destroy()})},vt=e=>{let t=C();if(t||new Gn,t=C(),!t)return;const n=S();V()?Z(A()):wt(t,e),X(n),t.setAttribute("data-loading","true"),t.setAttribute("aria-busy","true"),t.focus()},wt=(e,t)=>{const n=O(),o=S();n&&o&&(!t&&ee(P())&&(t=P()),X(n),t&&(Z(t),o.setAttribute("data-button-to-replace",t.className),n.insertBefore(o,t)),z([e,n],r.loading))},Ct=e=>e.checked?1:0,At=e=>e.checked?e.value:null,Et=e=>e.files&&e.files.length?null!==e.getAttribute("multiple")?e.files:e.files[0]:null,kt=(e,t)=>{const n=C();if(!n)return;const o=e=>{"select"===t.input?function(e,t,n){const o=K(e,r.select);if(!o)return;const i=(e,t,o)=>{const i=document.createElement("option");i.value=o,q(i,t),i.selected=Lt(o,n.inputValue),e.appendChild(i)};t.forEach(e=>{const t=e[0],n=e[1];if(Array.isArray(n)){const e=document.createElement("optgroup");e.label=t,e.disabled=!1,o.appendChild(e),n.forEach(t=>i(e,t[1],t[0]))}else i(o,n,t)}),o.focus()}(n,$t(e),t):"radio"===t.input&&function(e,t,n){const o=K(e,r.radio);if(!o)return;t.forEach(e=>{const t=e[0],i=e[1],s=document.createElement("input"),a=document.createElement("label");s.type="radio",s.name=r.radio,s.value=t,Lt(t,n.inputValue)&&(s.checked=!0);const l=document.createElement("span");q(l,i),l.className=r.label,a.appendChild(s),a.appendChild(l),o.appendChild(a)});const i=o.querySelectorAll("input");i.length&&i[0].focus()}(n,$t(e),t)};g(t.inputOptions)||b(t.inputOptions)?(vt(P()),f(t.inputOptions).then(t=>{e.hideLoading(),o(t)})):"object"==typeof t.inputOptions?o(t.inputOptions):d("Unexpected type of inputOptions! Expected object, Map or Promise, got "+typeof t.inputOptions)},Bt=(e,t)=>{const n=e.getInput();n&&(Z(n),f(t.inputValue).then(o=>{n.value="number"===t.input?`${parseFloat(o)||0}`:`${o}`,X(n),n.focus(),e.hideLoading()}).catch(t=>{d(`Error in inputValue promise: ${t}`),n.value="",X(n),n.focus(),e.hideLoading()}))};const $t=e=>(e instanceof Map?Array.from(e):Object.entries(e)).map(([e,t])=>[e,"object"==typeof t?$t(t):t]),Lt=(e,t)=>Boolean(t)&&null!=t&&t.toString()===e.toString(),Pt=(e,t)=>{const n=me.innerParams.get(e);if(!n.input)return void d(`The "input" parameter is needed to be set when using returnInputValueOn${c(t)}`);const o=e.getInput(),i=((e,t)=>{const n=e.getInput();if(!n)return null;switch(t.input){case"checkbox":return Ct(n);case"radio":return At(n);case"file":return Et(n);default:return t.inputAutoTrim?n.value.trim():n.value}})(e,n);n.inputValidator?xt(e,i,t):o&&!o.checkValidity()?(e.enableButtons(),e.showValidationMessage(n.validationMessage||o.validationMessage)):"deny"===t?Tt(e,i):Mt(e,i)},xt=(e,t,n)=>{const o=me.innerParams.get(e);e.disableInput();Promise.resolve().then(()=>f(o.inputValidator(t,o.validationMessage))).then(o=>{e.enableButtons(),e.enableInput(),o?e.showValidationMessage(o):"deny"===n?Tt(e,t):Mt(e,t)})},Tt=(e,t)=>{const n=me.innerParams.get(e);if(n.showLoaderOnDeny&&vt(T()),n.preDeny){e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preDeny(t,n.validationMessage))).then(n=>{!1===n?(e.hideLoading(),ht(e)):e.close({isDenied:!0,value:void 0===n?t:n})}).catch(t=>Ot(e,t))}else e.close({isDenied:!0,value:t})},St=(e,t)=>{e.close({isConfirmed:!0,value:t})},Ot=(e,t)=>{e.rejectPromise(t)},Mt=(e,t)=>{const n=me.innerParams.get(e);if(n.showLoaderOnConfirm&&vt(),n.preConfirm){e.resetValidationMessage(),e.isAwaitingPromise=!0;Promise.resolve().then(()=>f(n.preConfirm(t,n.validationMessage))).then(n=>{ee(L())||!1===n?(e.hideLoading(),ht(e)):St(e,void 0===n?t:n)}).catch(t=>Ot(e,t))}else St(e,t)};function Ht(){const e=me.innerParams.get(this);if(!e)return;const t=me.domCache.get(this);Z(t.loader),V()?e.icon&&X(A()):jt(t),W([t.popup,t.actions],r.loading),t.popup.removeAttribute("aria-busy"),t.popup.removeAttribute("data-loading"),this.enableButtons()}const jt=e=>{const t=e.loader.getAttribute("data-button-to-replace"),n=t?e.popup.getElementsByClassName(t):[];n.length?X(n[0],"inline-block"):ee(P())||ee(T())||ee(x())||Z(e.actions)};function It(){const e=me.innerParams.get(this),t=me.domCache.get(this);return t?F(t.popup,e.input):null}function Dt(e,t,n){const o=me.domCache.get(e);t.forEach(e=>{o[e].disabled=n})}function Vt(e,t){const n=C();if(n&&e)if("radio"===e.type){n.querySelectorAll(`[name="${r.radio}"]`).forEach(e=>{e.disabled=t})}else e.disabled=t}function qt(){Dt(this,["confirmButton","denyButton","cancelButton"],!1);const e=me.focusedElement.get(this);e instanceof HTMLElement&&document.activeElement===document.body&&e.focus(),me.focusedElement.delete(this)}function Nt(){me.focusedElement.set(this,document.activeElement),Dt(this,["confirmButton","denyButton","cancelButton"],!0)}function _t(){Vt(this.getInput(),!1)}function Ft(){Vt(this.getInput(),!0)}function Rt(e){const t=me.domCache.get(this),n=me.innerParams.get(this);q(t.validationMessage,e),t.validationMessage.className=r["validation-message"],n.customClass&&n.customClass.validationMessage&&z(t.validationMessage,n.customClass.validationMessage),X(t.validationMessage);const o=this.getInput();o&&(o.setAttribute("aria-invalid","true"),o.setAttribute("aria-describedby",r["validation-message"]),R(o),z(o,r.inputerror))}function Ut(){const e=me.domCache.get(this);e.validationMessage&&Z(e.validationMessage);const t=this.getInput();t&&(t.removeAttribute("aria-invalid"),t.removeAttribute("aria-describedby"),W(t,r.inputerror))}const zt={title:"",titleText:"",text:"",html:"",footer:"",icon:void 0,iconColor:void 0,iconHtml:void 0,template:void 0,toast:!1,draggable:!1,animation:!0,theme:"light",showClass:{popup:"swal2-show",backdrop:"swal2-backdrop-show",icon:"swal2-icon-show"},hideClass:{popup:"swal2-hide",backdrop:"swal2-backdrop-hide",icon:"swal2-icon-hide"},customClass:{},target:"body",color:void 0,backdrop:!0,heightAuto:!0,allowOutsideClick:!0,allowEscapeKey:!0,allowEnterKey:!0,stopKeydownPropagation:!0,keydownListenerCapture:!1,showConfirmButton:!0,showDenyButton:!1,showCancelButton:!1,preConfirm:void 0,preDeny:void 0,confirmButtonText:"OK",confirmButtonAriaLabel:"",confirmButtonColor:void 0,denyButtonText:"No",denyButtonAriaLabel:"",denyButtonColor:void 0,cancelButtonText:"Cancel",cancelButtonAriaLabel:"",cancelButtonColor:void 0,buttonsStyling:!0,reverseButtons:!1,focusConfirm:!0,focusDeny:!1,focusCancel:!1,returnFocus:!0,showCloseButton:!1,closeButtonHtml:"×",closeButtonAriaLabel:"Close this dialog",loaderHtml:"",showLoaderOnConfirm:!1,showLoaderOnDeny:!1,imageUrl:void 0,imageWidth:void 0,imageHeight:void 0,imageAlt:"",timer:void 0,timerProgressBar:!1,width:void 0,padding:void 0,background:void 0,input:void 0,inputPlaceholder:"",inputLabel:"",inputValue:"",inputOptions:{},inputAutoFocus:!0,inputAutoTrim:!0,inputAttributes:{},inputValidator:void 0,returnInputValueOnDeny:!1,validationMessage:void 0,grow:!1,position:"center",progressSteps:[],currentProgressStep:void 0,progressStepsDistance:void 0,willOpen:void 0,didOpen:void 0,didRender:void 0,willClose:void 0,didClose:void 0,didDestroy:void 0,scrollbarPadding:!0,topLayer:!1},Wt=["allowEscapeKey","allowOutsideClick","background","buttonsStyling","cancelButtonAriaLabel","cancelButtonColor","cancelButtonText","closeButtonAriaLabel","closeButtonHtml","color","confirmButtonAriaLabel","confirmButtonColor","confirmButtonText","currentProgressStep","customClass","denyButtonAriaLabel","denyButtonColor","denyButtonText","didClose","didDestroy","draggable","footer","hideClass","html","icon","iconColor","iconHtml","imageAlt","imageHeight","imageUrl","imageWidth","preConfirm","preDeny","progressSteps","returnFocus","reverseButtons","showCancelButton","showCloseButton","showConfirmButton","showDenyButton","text","title","titleText","theme","willClose"],Kt={allowEnterKey:void 0},Yt=["allowOutsideClick","allowEnterKey","backdrop","draggable","focusConfirm","focusDeny","focusCancel","returnFocus","heightAuto","keydownListenerCapture"],Xt=e=>Object.prototype.hasOwnProperty.call(zt,e),Zt=e=>-1!==Wt.indexOf(e),Jt=e=>Kt[e],Gt=e=>{Xt(e)||u(`Unknown parameter "${e}"`)},Qt=e=>{Yt.includes(e)&&u(`The parameter "${e}" is incompatible with toasts`)},en=e=>{const t=Jt(e);t&&m(e,t)},tn=e=>{!1===e.backdrop&&e.allowOutsideClick&&u('"allowOutsideClick" parameter requires `backdrop` parameter to be set to `true`'),e.theme&&!["light","dark","auto","minimal","borderless","bootstrap-4","bootstrap-4-light","bootstrap-4-dark","bootstrap-5","bootstrap-5-light","bootstrap-5-dark","material-ui","material-ui-light","material-ui-dark","embed-iframe","bulma","bulma-light","bulma-dark"].includes(e.theme)&&u(`Invalid theme "${e.theme}"`);for(const t in e)Gt(t),e.toast&&Qt(t),en(t)};function nn(e){const t=y(),n=C(),o=me.innerParams.get(this);if(!n||N(n,o.hideClass.popup))return void u("You're trying to update the closed or closing popup, that won't work. Use the update() method in preConfirm parameter or show a new popup.");const i=on(e),s=Object.assign({},o,i);tn(s),t&&(t.dataset.swal2Theme=s.theme),Fe(this,s),me.innerParams.set(this,s),Object.defineProperties(this,{params:{value:Object.assign({},this.params,e),writable:!1,enumerable:!0}})}const on=e=>{const t={};return Object.keys(e).forEach(n=>{if(Zt(n)){const o=e;t[n]=o[n]}else u(`Invalid parameter to update: ${n}`)}),t};function sn(){var e;const t=me.domCache.get(this),n=me.innerParams.get(this);n?(t.popup&&o.swalCloseEventFinishedCallback&&(o.swalCloseEventFinishedCallback(),delete o.swalCloseEventFinishedCallback),"function"==typeof n.didDestroy&&n.didDestroy(),null===(e=o.eventEmitter)||void 0===e||e.emit("didDestroy"),rn(this)):an(this)}const rn=e=>{an(e),delete e.params,delete o.keydownHandler,delete o.keydownTarget,delete o.currentInstance},an=e=>{e.isAwaitingPromise?(ln(me,e),e.isAwaitingPromise=!0):(ln(et,e),ln(me,e),delete e.isAwaitingPromise,delete e.disableButtons,delete e.enableButtons,delete e.getInput,delete e.disableInput,delete e.enableInput,delete e.hideLoading,delete e.disableLoading,delete e.showValidationMessage,delete e.resetValidationMessage,delete e.close,delete e.closePopup,delete e.closeModal,delete e.closeToast,delete e.rejectPromise,delete e.update,delete e._destroy)},ln=(e,t)=>{for(const n in e)e[n].delete(t)};var cn=Object.freeze({__proto__:null,_destroy:sn,close:dt,closeModal:dt,closePopup:dt,closeToast:dt,disableButtons:Nt,disableInput:Ft,disableLoading:Ht,enableButtons:qt,enableInput:_t,getInput:It,handleAwaitingPromise:ht,hideLoading:Ht,rejectPromise:mt,resetValidationMessage:Ut,showValidationMessage:Rt,update:nn});const un=(e,t,n)=>{t.popup.onclick=()=>{e&&(dn(e)||e.timer||e.input)||n(Ue.close)}},dn=e=>Boolean(e.showConfirmButton||e.showDenyButton||e.showCancelButton||e.showCloseButton);let pn=!1;const mn=e=>{e.popup.onmousedown=()=>{e.container.onmouseup=function(t){e.container.onmouseup=()=>{},t.target===e.container&&(pn=!0)}}},hn=e=>{e.container.onmousedown=t=>{t.target===e.container&&t.preventDefault(),e.popup.onmouseup=function(t){e.popup.onmouseup=()=>{},(t.target===e.popup||t.target instanceof HTMLElement&&e.popup.contains(t.target))&&(pn=!0)}}},gn=(e,t,n)=>{t.container.onclick=o=>{pn?pn=!1:o.target===t.container&&h(e.allowOutsideClick)&&n(Ue.backdrop)}},fn=e=>e instanceof Element||(e=>"object"==typeof e&&null!==e&&"jquery"in e)(e);const bn=()=>{if(o.timeout)return(()=>{const e=H();if(!e)return;const t=parseInt(window.getComputedStyle(e).width);e.style.removeProperty("transition"),e.style.width="100%";const n=t/parseInt(window.getComputedStyle(e).width)*100;e.style.width=`${n}%`})(),o.timeout.stop()},yn=()=>{if(o.timeout){const e=o.timeout.start();return oe(e),e}};let vn=!1;const wn={};const Cn=e=>{for(let t=e.target;t&&t!==document;t=t.parentNode)for(const e in wn){const n=t.getAttribute&&t.getAttribute(e);if(n)return void wn[e].fire({template:n})}};o.eventEmitter=new class{constructor(){this.events={}}_getHandlersByEventName(e){return void 0===this.events[e]&&(this.events[e]=[]),this.events[e]}on(e,t){const n=this._getHandlersByEventName(e);n.includes(t)||n.push(t)}once(e,t){const n=(...o)=>{this.removeListener(e,n),t.apply(this,o)};this.on(e,n)}emit(e,...t){this._getHandlersByEventName(e).forEach(e=>{try{e.apply(this,t)}catch(e){console.error(e)}})}removeListener(e,t){const n=this._getHandlersByEventName(e),o=n.indexOf(t);o>-1&&n.splice(o,1)}removeAllListeners(e){void 0!==this.events[e]&&(this.events[e].length=0)}reset(){this.events={}}};var An=Object.freeze({__proto__:null,argsToParams:e=>{const t={};return"object"!=typeof e[0]||fn(e[0])?["title","html","icon"].forEach((n,o)=>{const i=e[o];"string"==typeof i||fn(i)?t[n]=i:void 0!==i&&d(`Unexpected type of ${n}! Expected "string" or "Element", got ${typeof i}`)}):Object.assign(t,e[0]),t},bindClickHandler:function(e="data-swal-template"){wn[e]=this,vn||(document.body.addEventListener("click",Cn),vn=!0)},clickCancel:()=>{var e;return null===(e=x())||void 0===e?void 0:e.click()},clickConfirm:Re,clickDeny:()=>{var e;return null===(e=T())||void 0===e?void 0:e.click()},enableLoading:vt,fire:function(...e){return new this(...e)},getActions:O,getCancelButton:x,getCloseButton:j,getConfirmButton:P,getContainer:y,getDenyButton:T,getFocusableElements:I,getFooter:M,getHtmlContainer:k,getIcon:A,getIconContent:()=>w(r["icon-content"]),getImage:B,getInputLabel:()=>w(r["input-label"]),getLoader:S,getPopup:C,getProgressSteps:$,getTimerLeft:()=>o.timeout&&o.timeout.getTimerLeft(),getTimerProgressBar:H,getTitle:E,getValidationMessage:L,increaseTimer:e=>{if(o.timeout){const t=o.timeout.increase(e);return oe(t,!0),t}},isDeprecatedParameter:Jt,isLoading:()=>{const e=C();return!!e&&e.hasAttribute("data-loading")},isTimerRunning:()=>Boolean(o.timeout&&o.timeout.isRunning()),isUpdatableParameter:Zt,isValidParameter:Xt,isVisible:()=>ee(C()),mixin:function(e){return class extends(this){_main(t,n){return super._main(t,Object.assign({},e,n))}}},off:(e,t)=>{o.eventEmitter&&(e?t?o.eventEmitter.removeListener(e,t):o.eventEmitter.removeAllListeners(e):o.eventEmitter.reset())},on:(e,t)=>{o.eventEmitter&&o.eventEmitter.on(e,t)},once:(e,t)=>{o.eventEmitter&&o.eventEmitter.once(e,t)},resumeTimer:yn,showLoading:vt,stopTimer:bn,toggleTimer:()=>{const e=o.timeout;return e&&(e.running?bn():yn())}});class En{constructor(e,t){this.callback=e,this.remaining=t,this.running=!1,this.start()}start(){return this.running||(this.running=!0,this.started=new Date,this.id=setTimeout(this.callback,this.remaining)),this.remaining}stop(){return this.started&&this.running&&(this.running=!1,clearTimeout(this.id),this.remaining-=(new Date).getTime()-this.started.getTime()),this.remaining}increase(e){const t=this.running;return t&&this.stop(),this.remaining+=e,t&&this.start(),this.remaining}getTimerLeft(){return this.running&&(this.stop(),this.start()),this.remaining}isRunning(){return this.running}}const kn=["swal-title","swal-html","swal-footer"],Bn=e=>{const t={};return Array.from(e.querySelectorAll("swal-param")).forEach(e=>{Mn(e,["name","value"]);const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=n in zt&&"boolean"==typeof zt[n]?"false"!==o:n in zt&&"object"==typeof zt[n]?JSON.parse(o):o)}),t},$n=e=>{const t={};return Array.from(e.querySelectorAll("swal-function-param")).forEach(e=>{const n=e.getAttribute("name"),o=e.getAttribute("value");n&&o&&(t[n]=new Function(`return ${o}`)())}),t},Ln=e=>{const t={};return Array.from(e.querySelectorAll("swal-button")).forEach(e=>{Mn(e,["type","color","aria-label"]);const n=e.getAttribute("type");if(!n||!["confirm","cancel","deny"].includes(n))return;t[`${n}ButtonText`]=e.innerHTML,t[`show${c(n)}Button`]=!0;const o=e.getAttribute("color");null!==o&&(t[`${n}ButtonColor`]=o);const i=e.getAttribute("aria-label");null!==i&&(t[`${n}ButtonAriaLabel`]=i)}),t},Pn=e=>{const t={},n=e.querySelector("swal-image");if(n){Mn(n,["src","width","height","alt"]);const e=n.getAttribute("src");null!==e&&(t.imageUrl=e||void 0);const o=n.getAttribute("width");null!==o&&(t.imageWidth=o||void 0);const i=n.getAttribute("height");null!==i&&(t.imageHeight=i||void 0);const s=n.getAttribute("alt");null!==s&&(t.imageAlt=s||void 0)}return t},xn=e=>{const t={},n=e.querySelector("swal-icon");return n&&(Mn(n,["type","color"]),n.hasAttribute("type")&&(t.icon=n.getAttribute("type")),n.hasAttribute("color")&&(t.iconColor=n.getAttribute("color")),t.iconHtml=n.innerHTML),t},Tn=e=>{const t={},n=e.querySelector("swal-input");n&&(Mn(n,["type","label","placeholder","value"]),t.input=n.getAttribute("type")||"text",n.hasAttribute("label")&&(t.inputLabel=n.getAttribute("label")),n.hasAttribute("placeholder")&&(t.inputPlaceholder=n.getAttribute("placeholder")),n.hasAttribute("value")&&(t.inputValue=n.getAttribute("value")));const o=Array.from(e.querySelectorAll("swal-input-option"));return o.length&&(t.inputOptions={},o.forEach(e=>{Mn(e,["value"]);const n=e.getAttribute("value");if(!n)return;const o=e.innerHTML;t.inputOptions[n]=o})),t},Sn=(e,t)=>{const n={};for(const o in t){const i=t[o],s=e.querySelector(i);s&&(Mn(s,[]),n[i.replace(/^swal-/,"")]=s.innerHTML.trim())}return n},On=e=>{const t=kn.concat(["swal-param","swal-function-param","swal-button","swal-image","swal-icon","swal-input","swal-input-option"]);Array.from(e.children).forEach(e=>{const n=e.tagName.toLowerCase();t.includes(n)||u(`Unrecognized element <${n}>`)})},Mn=(e,t)=>{Array.from(e.attributes).forEach(n=>{-1===t.indexOf(n.name)&&u([`Unrecognized attribute "${n.name}" on <${e.tagName.toLowerCase()}>.`,""+(t.length?`Allowed attributes are: ${t.join(", ")}`:"To set the value, use HTML within the element.")])})},Hn=e=>{var t,n;const i=y(),s=C();if(!i||!s)return;"function"==typeof e.willOpen&&e.willOpen(s),null===(t=o.eventEmitter)||void 0===t||t.emit("willOpen",s);const r=window.getComputedStyle(document.body).overflowY;if(Vn(i,s,e),setTimeout(()=>{In(i,s)},10),D()&&(Dn(i,void 0!==e.scrollbarPadding&&e.scrollbarPadding,r),(()=>{const e=y();Array.from(document.body.children).forEach(t=>{t.contains(e)||(t.hasAttribute("aria-hidden")&&t.setAttribute("data-previous-aria-hidden",t.getAttribute("aria-hidden")||""),t.setAttribute("aria-hidden","true"))})})()),ot&&!1===e.backdrop&&s.scrollHeight>i.clientHeight&&(i.style.pointerEvents="auto"),V()||o.previousActiveElement||(o.previousActiveElement=document.activeElement),"function"==typeof e.didOpen){const t=e.didOpen;setTimeout(()=>t(s))}null===(n=o.eventEmitter)||void 0===n||n.emit("didOpen",s)},jn=e=>{const t=C();if(!t||e.target!==t)return;const n=y();n&&(t.removeEventListener("animationend",jn),t.removeEventListener("transitionend",jn),n.style.overflowY="auto",W(n,r["no-transition"]))},In=(e,t)=>{ne(t)?(e.style.overflowY="hidden",t.addEventListener("animationend",jn),t.addEventListener("transitionend",jn)):e.style.overflowY="auto"},Dn=(e,t,n)=>{(()=>{if(nt&&!N(document.body,r.iosfix)){const e=document.body.scrollTop;document.body.style.top=-1*e+"px",z(document.body,r.iosfix),it()}})(),t&&"hidden"!==n&&ct(n),setTimeout(()=>{e.scrollTop=0})},Vn=(e,t,n)=>{var o;null!==(o=n.showClass)&&void 0!==o&&o.backdrop&&z(e,n.showClass.backdrop),n.animation?(t.style.setProperty("opacity","0","important"),X(t,"grid"),setTimeout(()=>{var e;null!==(e=n.showClass)&&void 0!==e&&e.popup&&z(t,n.showClass.popup),t.style.removeProperty("opacity")},10)):X(t,"grid"),z([document.documentElement,document.body],r.shown),n.heightAuto&&n.backdrop&&!n.toast&&z([document.documentElement,document.body],r["height-auto"])};var qn=(e,t)=>/^[a-zA-Z0-9.+_'-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9-]+$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid email address"),Nn=(e,t)=>/^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-z]{2,63}\b([-a-zA-Z0-9@:%_+.~#?&/=]*)$/.test(e)?Promise.resolve():Promise.resolve(t||"Invalid URL");function _n(e){!function(e){e.inputValidator||("email"===e.input&&(e.inputValidator=qn),"url"===e.input&&(e.inputValidator=Nn))}(e),e.showLoaderOnConfirm&&!e.preConfirm&&u("showLoaderOnConfirm is set to true, but preConfirm is not defined.\nshowLoaderOnConfirm should be used together with preConfirm, see usage example:\nhttps://sweetalert2.github.io/#ajax-request"),function(e){(!e.target||"string"==typeof e.target&&!document.querySelector(e.target)||"string"!=typeof e.target&&!e.target.appendChild)&&(u('Target parameter is not valid, defaulting to "body"'),e.target="body")}(e),"string"==typeof e.title&&(e.title=e.title.split("\n").join("<br />")),re(e)}let Fn;var Rn=new WeakMap;class Un{constructor(...t){if(n(this,Rn,Promise.resolve({isConfirmed:!1,isDenied:!1,isDismissed:!0})),"undefined"==typeof window)return;Fn=this;const o=Object.freeze(this.constructor.argsToParams(t));var i,s,r;this.params=o,this.isAwaitingPromise=!1,i=Rn,s=this,r=this._main(Fn.params),i.set(e(i,s),r)}_main(e,t={}){if(tn(Object.assign({},t,e)),o.currentInstance){const e=et.swalPromiseResolve.get(o.currentInstance),{isAwaitingPromise:t}=o.currentInstance;o.currentInstance._destroy(),t||e({isDismissed:!0}),D()&&tt()}o.currentInstance=Fn;const n=Wn(e,t);_n(n),Object.freeze(n),o.timeout&&(o.timeout.stop(),delete o.timeout),clearTimeout(o.restoreFocusTimeout);const i=Kn(Fn);return Fe(Fn,n),me.innerParams.set(Fn,n),zn(Fn,i,n)}then(e){return t(Rn,this).then(e)}finally(e){return t(Rn,this).finally(e)}}const zn=(e,t,n)=>new Promise((i,s)=>{const r=t=>{e.close({isDismissed:!0,dismiss:t,isConfirmed:!1,isDenied:!1})};et.swalPromiseResolve.set(e,i),et.swalPromiseReject.set(e,s),t.confirmButton.onclick=()=>{(e=>{const t=me.innerParams.get(e);e.disableButtons(),t.input?Pt(e,"confirm"):Mt(e,!0)})(e)},t.denyButton.onclick=()=>{(e=>{const t=me.innerParams.get(e);e.disableButtons(),t.returnInputValueOnDeny?Pt(e,"deny"):Tt(e,!1)})(e)},t.cancelButton.onclick=()=>{((e,t)=>
vendor: 4,624 bytes, lines 62764-62765
62764{e.disableButtons(),t(Ue.cancel)})(e,r)},t.closeButton.onclick=()=>{r(Ue.close)},((e,t,n)=>{e.toast?un(e,t,n):(mn(t),hn(t),gn(e,t,n))})(n,t,r),((e,t,n)=>{if(ze(e),!t.toast){const o=e=>Xe(t,e,n);e.keydownHandler=o;const i=t.keydownListenerCapture?window:C();if(i){e.keydownTarget=i,e.keydownListenerCapture=t.keydownListenerCapture;const n=o;e.keydownTarget.addEventListener("keydown",n,{capture:e.keydownListenerCapture}),e.keydownHandlerAdded=!0}}})(o,n,r),((e,t)=>{"select"===t.input||"radio"===t.input?kt(e,t):["text","email","number","tel","textarea"].some(e=>e===t.input)&&(g(t.inputValue)||b(t.inputValue))&&(vt(P()),Bt(e,t))})(e,n),Hn(n),Yn(o,n,r),Xn(t,n),setTimeout(()=>{t.container.scrollTop=0})}),Wn=(e,t)=>{const n=(e=>{const t="string"==typeof e.template?document.querySelector(e.template):e.template;if(!t)return{};const n=t.content;return On(n),Object.assign(Bn(n),$n(n),Ln(n),Pn(n),xn(n),Tn(n),Sn(n,kn))})(e),o=Object.assign({},zt,t,n,e);return o.showClass=Object.assign({},zt.showClass,o.showClass),o.hideClass=Object.assign({},zt.hideClass,o.hideClass),!1===o.animation&&(o.showClass={backdrop:"swal2-noanimation"},o.hideClass={}),o},Kn=e=>{const t={popup:C(),container:y(),actions:O(),confirmButton:P(),denyButton:T(),cancelButton:x(),loader:S(),closeButton:j(),validationMessage:L(),progressSteps:$()};return me.domCache.set(e,t),t},Yn=(e,t,n)=>{const o=H();Z(o),t.timer&&(e.timeout=new En(()=>{n("timer"),delete e.timeout},t.timer),t.timerProgressBar&&o&&(X(o),_(o,t,"timerProgressBar"),setTimeout(()=>{e.timeout&&e.timeout.running&&oe(t.timer)})))},Xn=(e,t)=>{if(!t.toast)return h(t.allowEnterKey)?void(Zn(e)||Jn(e,t)||We(-1,1)):(m("allowEnterKey","preConfirm: () => false"),void e.popup.focus())},Zn=e=>{const t=Array.from(e.popup.querySelectorAll("[autofocus]"));for(const e of t)if(e instanceof HTMLElement&&ee(e))return e.focus(),!0;return!1},Jn=(e,t)=>t.focusDeny&&ee(e.denyButton)?(e.denyButton.focus(),!0):t.focusCancel&&ee(e.cancelButton)?(e.cancelButton.focus(),!0):!(!t.focusConfirm||!ee(e.confirmButton))&&(e.confirmButton.focus(),!0);Un.prototype.disableButtons=Nt,Un.prototype.enableButtons=qt,Un.prototype.getInput=It,Un.prototype.disableInput=Ft,Un.prototype.enableInput=_t,Un.prototype.hideLoading=Ht,Un.prototype.disableLoading=Ht,Un.prototype.showValidationMessage=Rt,Un.prototype.resetValidationMessage=Ut,Un.prototype.close=dt,Un.prototype.closePopup=dt,Un.prototype.closeModal=dt,Un.prototype.closeToast=dt,Un.prototype.rejectPromise=mt,Un.prototype.update=nn,Un.prototype._destroy=sn,Object.assign(Un,An),Object.keys(cn).forEach(e=>{Un[e]=function(...t){if(Fn&&Fn[e])return Fn[e](...t)}}),Un.DismissReason=Ue,Un.version="11.26.25";const Gn=Un;return Gn.default=Gn,Gn}),void 0!==this&&this.Sweetalert2&&(this.swal=this.sweetAlert=this.Swal=this.SweetAlert=this.Sweetalert2); 62765"undefined"!=typeof document&&function(e,t){var n=e.createElement("style");if(e.getElementsByTagName("head")[0].appendChild(n),n.styleSheet)n.styleSheet.disabled||(n.styleSheet.cssText=t);else try{n.innerHTML=t}catch(e){n.innerText=t}}(document,":root{--swal2-outline: 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-container-padding: 0.625em;--swal2-backdrop: rgba(0, 0, 0, 0.4);--swal2-backdrop-transition: background-color 0.15s;--swal2-width: 32em;--swal2-padding: 0 0 1.25em;--swal2-border: none;--swal2-border-radius: 0.3125rem;--swal2-background: white;--swal2-color: #545454;--swal2-show-animation: swal2-show 0.3s;--swal2-hide-animation: swal2-hide 0.15s forwards;--swal2-icon-zoom: 1;--swal2-title-padding: 0.8em 1em 0;--swal2-html-container-padding: 1em 1.6em 0.3em;--swal2-input-border: 1px solid #d9d9d9;--swal2-input-border-radius: 0.1875em;--swal2-input-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-background: transparent;--swal2-input-transition: border-color 0.2s, box-shadow 0.2s;--swal2-input-hover-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px transparent;--swal2-input-focus-border: 1px solid #b4dbed;--swal2-input-focus-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06), 0 0 0 3px rgba(100, 150, 200, 0.5);--swal2-progress-step-background: #add8e6;--swal2-validation-message-background: #f0f0f0;--swal2-validation-message-color: #666;--swal2-footer-border-color: #eee;--swal2-footer-background: transparent;--swal2-footer-color: inherit;--swal2-timer-progress-bar-background: rgba(0, 0, 0, 0.3);--swal2-close-button-position: initial;--swal2-close-button-inset: auto;--swal2-close-button-font-size: 2.5em;--swal2-close-button-color: #ccc;--swal2-close-button-transition: color 0.2s, box-shadow 0.2s;--swal2-close-button-outline: initial;
vendor: 6,251 bytes, line 62765
62765--swal2-close-button-box-shadow: inset 0 0 0 3px transparent;--swal2-close-button-focus-box-shadow: inset var(--swal2-outline);--swal2-close-button-hover-transform: none;--swal2-actions-justify-content: center;--swal2-actions-width: auto;--swal2-actions-margin: 1.25em auto 0;--swal2-actions-padding: 0;--swal2-actions-border-radius: 0;--swal2-actions-background: transparent;--swal2-action-button-transition: background-color 0.2s, box-shadow 0.2s;--swal2-action-button-hover: black 10%;--swal2-action-button-active: black 10%;--swal2-confirm-button-box-shadow: none;--swal2-confirm-button-border-radius: 0.25em;--swal2-confirm-button-background-color: #7066e0;--swal2-confirm-button-color: #fff;--swal2-deny-button-box-shadow: none;--swal2-deny-button-border-radius: 0.25em;--swal2-deny-button-background-color: #dc3741;--swal2-deny-button-color: #fff;--swal2-cancel-button-box-shadow: none;--swal2-cancel-button-border-radius: 0.25em;--swal2-cancel-button-background-color: #6e7881;--swal2-cancel-button-color: #fff;--swal2-toast-show-animation: swal2-toast-show 0.5s;--swal2-toast-hide-animation: swal2-toast-hide 0.1s forwards;--swal2-toast-border: none;--swal2-toast-box-shadow: 0 0 1px hsl(0deg 0% 0% / 0.075), 0 1px 2px hsl(0deg 0% 0% / 0.075), 1px 2px 4px hsl(0deg 0% 0% / 0.075), 1px 3px 8px hsl(0deg 0% 0% / 0.075), 2px 4px 16px hsl(0deg 0% 0% / 0.075)}[data-swal2-theme=dark]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}@media(prefers-color-scheme: dark){[data-swal2-theme=auto]{--swal2-dark-theme-black: #19191a;--swal2-dark-theme-white: #e1e1e1;--swal2-background: var(--swal2-dark-theme-black);--swal2-color: var(--swal2-dark-theme-white);--swal2-footer-border-color: #555;--swal2-input-background: color-mix(in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10%);--swal2-validation-message-background: color-mix( in srgb, var(--swal2-dark-theme-black), var(--swal2-dark-theme-white) 10% );--swal2-validation-message-color: var(--swal2-dark-theme-white);--swal2-timer-progress-bar-background: rgba(255, 255, 255, 0.7)}}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow:hidden}body.swal2-height-auto{height:auto !important}body.swal2-no-backdrop .swal2-container{background-color:rgba(0,0,0,0) !important;pointer-events:none}body.swal2-no-backdrop .swal2-container .swal2-popup{pointer-events:auto}body.swal2-no-backdrop .swal2-container .swal2-modal{box-shadow:0 0 10px var(--swal2-backdrop)}body.swal2-toast-shown .swal2-container{box-sizing:border-box;width:360px;max-width:100%;background-color:rgba(0,0,0,0);pointer-events:none}body.swal2-toast-shown .swal2-container.swal2-top{inset:0 auto auto 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-top-end,body.swal2-toast-shown .swal2-container.swal2-top-right{inset:0 0 auto auto}body.swal2-toast-shown .swal2-container.swal2-top-start,body.swal2-toast-shown .swal2-container.swal2-top-left{inset:0 auto auto 0}body.swal2-toast-shown .swal2-container.swal2-center-start,body.swal2-toast-shown .swal2-container.swal2-center-left{inset:50% auto auto 0;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-center{inset:50% auto auto 50%;transform:translate(-50%, -50%)}body.swal2-toast-shown .swal2-container.swal2-center-end,body.swal2-toast-shown .swal2-container.swal2-center-right{inset:50% 0 auto auto;transform:translateY(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-start,body.swal2-toast-shown .swal2-container.swal2-bottom-left{inset:auto auto 0 0}body.swal2-toast-shown .swal2-container.swal2-bottom{inset:auto auto 0 50%;transform:translateX(-50%)}body.swal2-toast-shown .swal2-container.swal2-bottom-end,body.swal2-toast-shown .swal2-container.swal2-bottom-right{inset:auto 0 0 auto}@media print{body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown){overflow-y:scroll !important}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown)>[aria-hidden=true]{display:none}body.swal2-shown:not(.swal2-no-backdrop,.swal2-toast-shown) .swal2-container{position:static !important}}div:where(.swal2-container){display:grid;position:fixed;z-index:1060;inset:0;box-sizing:border-box;grid-template-areas:\"top-start top top-end\" \"center-start center center-end\" \"bottom-start bottom-center bottom-end\";grid-template-rows:minmax(min-content, auto) minmax(min-content, auto) minmax(min-content, auto);height:100%;padding:var(--swal2-container-padding);overflow-x:hidden;transition:var(--swal2-backdrop-transition);-webkit-overflow-scrolling:touch}div:where(.swal2-container).swal2-backdrop-show,div:where(.swal2-container).swal2-noanimation{background:var(--swal2-backdrop)}div:where(.swal2-container).swal2-backdrop-hide{background:rgba(0,0,0,0) !important}div:where(.swal2-container).swal2-top-start,div:where(.swal2-container).swal2-center-start,div:where(.swal2-container).swal2-bottom-start{grid-template-columns:minmax(0, 1fr) auto auto}div:where(.swal2-container).swal2-top,div:where(.swal2-container).swal2-center,div:where(.swal2-container).swal2-bottom{grid-template-columns:auto minmax(0, 1fr) auto}div:where(.swal2-container).swal2-top-end,div:where(.swal2-container).swal2-center-end,div:where(.swal2-container).swal2-bottom-end{grid-template-columns:auto auto minmax(0, 1fr)}div:where(.swal2-container).swal2-top-start>.swal2-popup{align-self:start}div:where(.swal2-container).swal2-top>.swal2-popup{grid-column:2;place-self:start center}div:where(.swal2-container).swal2-top-end>.swal2-popup,div:where(.swal2-container).swal2-top-right>.swal2-popup{grid-column:3;place-self:start end}div:where(.swal2-container).swal2-center-start>.swal2-popup,div:where(.swal2-container).swal2-center-left>.swal2-popup{grid-row:2;
vendor: 22,449 bytes, line 62765
62765align-self:center}div:where(.swal2-container).swal2-center>.swal2-popup{grid-column:2;grid-row:2;place-self:center center}div:where(.swal2-container).swal2-center-end>.swal2-popup,div:where(.swal2-container).swal2-center-right>.swal2-popup{grid-column:3;grid-row:2;place-self:center end}div:where(.swal2-container).swal2-bottom-start>.swal2-popup,div:where(.swal2-container).swal2-bottom-left>.swal2-popup{grid-column:1;grid-row:3;align-self:end}div:where(.swal2-container).swal2-bottom>.swal2-popup{grid-column:2;grid-row:3;place-self:end center}div:where(.swal2-container).swal2-bottom-end>.swal2-popup,div:where(.swal2-container).swal2-bottom-right>.swal2-popup{grid-column:3;grid-row:3;place-self:end end}div:where(.swal2-container).swal2-grow-row>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-column:1/4;width:100%}div:where(.swal2-container).swal2-grow-column>.swal2-popup,div:where(.swal2-container).swal2-grow-fullscreen>.swal2-popup{grid-row:1/4;align-self:stretch}div:where(.swal2-container).swal2-no-transition{transition:none !important}div:where(.swal2-container)[popover]{width:auto;border:0}div:where(.swal2-container) div:where(.swal2-popup){display:none;position:relative;box-sizing:border-box;grid-template-columns:minmax(0, 100%);width:var(--swal2-width);max-width:100%;padding:var(--swal2-padding);border:var(--swal2-border);border-radius:var(--swal2-border-radius);background:var(--swal2-background);color:var(--swal2-color);font-family:inherit;font-size:1rem}div:where(.swal2-container) div:where(.swal2-popup):focus{outline:none}div:where(.swal2-container) div:where(.swal2-popup).swal2-loading{overflow-y:hidden}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable{cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-draggable div:where(.swal2-icon){cursor:grab}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging{cursor:grabbing}div:where(.swal2-container) div:where(.swal2-popup).swal2-dragging div:where(.swal2-icon){cursor:grabbing}div:where(.swal2-container) h2:where(.swal2-title){position:relative;max-width:100%;margin:0;padding:var(--swal2-title-padding);color:inherit;font-size:1.875em;font-weight:600;text-align:center;text-transform:none;overflow-wrap:break-word;cursor:initial}div:where(.swal2-container) div:where(.swal2-actions){display:flex;z-index:1;box-sizing:border-box;flex-wrap:wrap;align-items:center;justify-content:var(--swal2-actions-justify-content);width:var(--swal2-actions-width);margin:var(--swal2-actions-margin);padding:var(--swal2-actions-padding);border-radius:var(--swal2-actions-border-radius);background:var(--swal2-actions-background)}div:where(.swal2-container) div:where(.swal2-loader){display:none;align-items:center;justify-content:center;width:2.2em;height:2.2em;margin:0 1.875em;animation:swal2-rotate-loading 1.5s linear 0s infinite normal;border-width:.25em;border-style:solid;border-radius:100%;border-color:#2778c4 rgba(0,0,0,0) #2778c4 rgba(0,0,0,0)}div:where(.swal2-container) button:where(.swal2-styled){margin:.3125em;padding:.625em 1.1em;transition:var(--swal2-action-button-transition);border:none;box-shadow:0 0 0 3px rgba(0,0,0,0);font-weight:500}div:where(.swal2-container) button:where(.swal2-styled):not([disabled]){cursor:pointer}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm){border-radius:var(--swal2-confirm-button-border-radius);background:initial;background-color:var(--swal2-confirm-button-background-color);box-shadow:var(--swal2-confirm-button-box-shadow);color:var(--swal2-confirm-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):hover{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-confirm):active{background-color:color-mix(in srgb, var(--swal2-confirm-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny){border-radius:var(--swal2-deny-button-border-radius);background:initial;background-color:var(--swal2-deny-button-background-color);box-shadow:var(--swal2-deny-button-box-shadow);color:var(--swal2-deny-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):hover{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-deny):active{background-color:color-mix(in srgb, var(--swal2-deny-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel){border-radius:var(--swal2-cancel-button-border-radius);background:initial;background-color:var(--swal2-cancel-button-background-color);box-shadow:var(--swal2-cancel-button-box-shadow);color:var(--swal2-cancel-button-color);font-size:1em}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):hover{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-hover))}div:where(.swal2-container) button:where(.swal2-styled):where(.swal2-cancel):active{background-color:color-mix(in srgb, var(--swal2-cancel-button-background-color), var(--swal2-action-button-active))}div:where(.swal2-container) button:where(.swal2-styled):focus-visible{outline:none;box-shadow:var(--swal2-action-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-styled)[disabled]:not(.swal2-loading){opacity:.4}div:where(.swal2-container) button:where(.swal2-styled)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-footer){margin:1em 0 0;padding:1em 1em 0;border-top:1px solid var(--swal2-footer-border-color);background:var(--swal2-footer-background);color:var(--swal2-footer-color);font-size:1em;text-align:center;cursor:initial}div:where(.swal2-container) .swal2-timer-progress-bar-container{position:absolute;right:0;bottom:0;left:0;grid-column:auto !important;overflow:hidden;border-bottom-right-radius:var(--swal2-border-radius);border-bottom-left-radius:var(--swal2-border-radius)}div:where(.swal2-container) div:where(.swal2-timer-progress-bar){width:100%;height:.25em;background:var(--swal2-timer-progress-bar-background)}div:where(.swal2-container) img:where(.swal2-image){max-width:100%;margin:2em auto 1em;cursor:initial}div:where(.swal2-container) button:where(.swal2-close){position:var(--swal2-close-button-position);inset:var(--swal2-close-button-inset);z-index:2;align-items:center;justify-content:center;width:1.2em;height:1.2em;margin-top:0;margin-right:0;margin-bottom:-1.2em;padding:0;overflow:hidden;transition:var(--swal2-close-button-transition);border:none;border-radius:var(--swal2-border-radius);outline:var(--swal2-close-button-outline);background:rgba(0,0,0,0);color:var(--swal2-close-button-color);font-family:monospace;font-size:var(--swal2-close-button-font-size);cursor:pointer;justify-self:end}div:where(.swal2-container) button:where(.swal2-close):hover{transform:var(--swal2-close-button-hover-transform);background:rgba(0,0,0,0);color:#f27474}div:where(.swal2-container) button:where(.swal2-close):focus-visible{outline:none;box-shadow:var(--swal2-close-button-focus-box-shadow)}div:where(.swal2-container) button:where(.swal2-close)::-moz-focus-inner{border:0}div:where(.swal2-container) div:where(.swal2-html-container){z-index:1;justify-content:center;margin:0;padding:var(--swal2-html-container-padding);overflow:auto;color:inherit;font-size:1.125em;font-weight:normal;line-height:normal;text-align:center;overflow-wrap:break-word;word-break:break-word;cursor:initial}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea),div:where(.swal2-container) select:where(.swal2-select),div:where(.swal2-container) div:where(.swal2-radio),div:where(.swal2-container) label:where(.swal2-checkbox){margin:1em 2em 3px}div:where(.swal2-container) input:where(.swal2-input),div:where(.swal2-container) input:where(.swal2-file),div:where(.swal2-container) textarea:where(.swal2-textarea){box-sizing:border-box;width:auto;transition:var(--swal2-input-transition);border:var(--swal2-input-border);border-radius:var(--swal2-input-border-radius);background:var(--swal2-input-background);box-shadow:var(--swal2-input-box-shadow);color:inherit;font-size:1.125em}div:where(.swal2-container) input:where(.swal2-input).swal2-inputerror,div:where(.swal2-container) input:where(.swal2-file).swal2-inputerror,div:where(.swal2-container) textarea:where(.swal2-textarea).swal2-inputerror{border-color:#f27474 !important;box-shadow:0 0 2px #f27474 !important}div:where(.swal2-container) input:where(.swal2-input):hover,div:where(.swal2-container) input:where(.swal2-file):hover,div:where(.swal2-container) textarea:where(.swal2-textarea):hover{box-shadow:var(--swal2-input-hover-box-shadow)}div:where(.swal2-container) input:where(.swal2-input):focus,div:where(.swal2-container) input:where(.swal2-file):focus,div:where(.swal2-container) textarea:where(.swal2-textarea):focus{border:var(--swal2-input-focus-border);outline:none;box-shadow:var(--swal2-input-focus-box-shadow)}div:where(.swal2-container) input:where(.swal2-input)::placeholder,div:where(.swal2-container) input:where(.swal2-file)::placeholder,div:where(.swal2-container) textarea:where(.swal2-textarea)::placeholder{color:#ccc}div:where(.swal2-container) .swal2-range{margin:1em 2em 3px;background:var(--swal2-background)}div:where(.swal2-container) .swal2-range input{width:80%}div:where(.swal2-container) .swal2-range output{width:20%;color:inherit;font-weight:600;text-align:center}div:where(.swal2-container) .swal2-range input,div:where(.swal2-container) .swal2-range output{height:2.625em;padding:0;font-size:1.125em;line-height:2.625em}div:where(.swal2-container) .swal2-input{height:2.625em;padding:0 .75em}div:where(.swal2-container) .swal2-file{width:75%;margin-right:auto;margin-left:auto;background:var(--swal2-input-background);font-size:1.125em}div:where(.swal2-container) .swal2-textarea{height:6.75em;padding:.75em}div:where(.swal2-container) .swal2-select{min-width:50%;max-width:100%;padding:.375em .625em;background:var(--swal2-input-background);color:inherit;font-size:1.125em}div:where(.swal2-container) .swal2-radio,div:where(.swal2-container) .swal2-checkbox{align-items:center;justify-content:center;background:var(--swal2-background);color:inherit}div:where(.swal2-container) .swal2-radio label,div:where(.swal2-container) .swal2-checkbox label{margin:0 .6em;font-size:1.125em}div:where(.swal2-container) .swal2-radio input,div:where(.swal2-container) .swal2-checkbox input{flex-shrink:0;margin:0 .4em}div:where(.swal2-container) label:where(.swal2-input-label){display:flex;justify-content:center;margin:1em auto 0}div:where(.swal2-container) div:where(.swal2-validation-message){align-items:center;justify-content:center;margin:1em 0 0;padding:.625em;overflow:hidden;background:var(--swal2-validation-message-background);color:var(--swal2-validation-message-color);font-size:1em;font-weight:300}div:where(.swal2-container) div:where(.swal2-validation-message)::before{content:\"!\";display:inline-block;width:1.5em;min-width:1.5em;height:1.5em;margin:0 .625em;border-radius:50%;background-color:#f27474;color:#fff;font-weight:600;line-height:1.5em;text-align:center}div:where(.swal2-container) .swal2-progress-steps{flex-wrap:wrap;align-items:center;max-width:100%;margin:1.25em auto;padding:0;background:rgba(0,0,0,0);font-weight:600}div:where(.swal2-container) .swal2-progress-steps li{display:inline-block;position:relative}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step{z-index:20;flex-shrink:0;width:2em;height:2em;border-radius:2em;background:#2778c4;color:#fff;line-height:2em;text-align:center}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step{background:#2778c4}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step{background:var(--swal2-progress-step-background);color:#fff}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step.swal2-active-progress-step~.swal2-progress-step-line{background:var(--swal2-progress-step-background)}div:where(.swal2-container) .swal2-progress-steps .swal2-progress-step-line{z-index:10;flex-shrink:0;width:2.5em;height:.4em;margin:0 -1px;background:#2778c4}div:where(.swal2-icon){position:relative;box-sizing:content-box;justify-content:center;width:5em;height:5em;margin:2.5em auto .6em;zoom:var(--swal2-icon-zoom);border:.25em solid rgba(0,0,0,0);border-radius:50%;border-color:#000;font-family:inherit;line-height:5em;cursor:default;user-select:none}div:where(.swal2-icon) .swal2-icon-content{display:flex;align-items:center;font-size:3.75em}div:where(.swal2-icon).swal2-error{border-color:#f27474;color:#f27474}div:where(.swal2-icon).swal2-error .swal2-x-mark{position:relative;flex-grow:1}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line]{display:block;position:absolute;top:2.3125em;width:2.9375em;height:.3125em;border-radius:.125em;background-color:#f27474}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=left]{left:1.0625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-error [class^=swal2-x-mark-line][class$=right]{right:1em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-error.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-error.swal2-icon-show .swal2-x-mark{animation:swal2-animate-error-x-mark .5s}div:where(.swal2-icon).swal2-warning{border-color:#f8bb86;color:#f8bb86}div:where(.swal2-icon).swal2-warning.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-warning.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .5s}div:where(.swal2-icon).swal2-info{border-color:#3fc3ee;color:#3fc3ee}div:where(.swal2-icon).swal2-info.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-info.swal2-icon-show .swal2-icon-content{animation:swal2-animate-i-mark .8s}div:where(.swal2-icon).swal2-question{border-color:#87adbd;color:#87adbd}div:where(.swal2-icon).swal2-question.swal2-icon-show{animation:swal2-animate-error-icon .5s}div:where(.swal2-icon).swal2-question.swal2-icon-show .swal2-icon-content{animation:swal2-animate-question-mark .8s}div:where(.swal2-icon).swal2-success{border-color:#a5dc86;color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line]{position:absolute;width:3.75em;height:7.5em;border-radius:50%}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.4375em;left:-2.0635em;transform:rotate(-45deg);transform-origin:3.75em 3.75em;border-radius:7.5em 0 0 7.5em}div:where(.swal2-icon).swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.6875em;left:1.875em;transform:rotate(-45deg);transform-origin:0 3.75em;border-radius:0 7.5em 7.5em 0}div:where(.swal2-icon).swal2-success .swal2-success-ring{position:absolute;z-index:2;top:-0.25em;left:-0.25em;box-sizing:content-box;width:100%;height:100%;border:.25em solid rgba(165,220,134,.3);border-radius:50%}div:where(.swal2-icon).swal2-success .swal2-success-fix{position:absolute;z-index:1;top:.5em;left:1.625em;width:.4375em;height:5.625em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line]{display:block;position:absolute;z-index:2;height:.3125em;border-radius:.125em;background-color:#a5dc86}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=tip]{top:2.875em;left:.8125em;width:1.5625em;transform:rotate(45deg)}div:where(.swal2-icon).swal2-success [class^=swal2-success-line][class$=long]{top:2.375em;right:.5em;width:2.9375em;transform:rotate(-45deg)}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-animate-success-line-tip .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-animate-success-line-long .75s}div:where(.swal2-icon).swal2-success.swal2-icon-show .swal2-success-circular-line-right{animation:swal2-rotate-success-circular-line 4.25s ease-in}[class^=swal2]{-webkit-tap-highlight-color:rgba(0,0,0,0)}.swal2-show{animation:var(--swal2-show-animation)}.swal2-hide{animation:var(--swal2-hide-animation)}.swal2-noanimation{transition:none}.swal2-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}.swal2-rtl .swal2-close{margin-right:initial;margin-left:0}.swal2-rtl .swal2-timer-progress-bar{right:0;left:auto}.swal2-toast{box-sizing:border-box;grid-column:1/4 !important;grid-row:1/4 !important;grid-template-columns:min-content auto min-content;padding:1em;overflow-y:hidden;border:var(--swal2-toast-border);background:var(--swal2-background);box-shadow:var(--swal2-toast-box-shadow);pointer-events:auto}.swal2-toast>*{grid-column:2}.swal2-toast h2:where(.swal2-title){margin:.5em 1em;padding:0;font-size:1em;text-align:initial}.swal2-toast .swal2-loading{justify-content:center}.swal2-toast input:where(.swal2-input){height:2em;margin:.5em;font-size:1em}.swal2-toast .swal2-validation-message{font-size:1em}.swal2-toast div:where(.swal2-footer){margin:.5em 0 0;padding:.5em 0 0;font-size:.8em}.swal2-toast button:where(.swal2-close){grid-column:3/3;grid-row:1/99;align-self:center;width:.8em;height:.8em;margin:0;font-size:2em}.swal2-toast div:where(.swal2-html-container){margin:.5em 1em;padding:0;overflow:initial;font-size:1em;text-align:initial}.swal2-toast div:where(.swal2-html-container):empty{padding:0}.swal2-toast .swal2-loader{grid-column:1;grid-row:1/99;align-self:center;width:2em;height:2em;margin:.25em}.swal2-toast .swal2-icon{grid-column:1;grid-row:1/99;align-self:center;width:2em;min-width:2em;height:2em;margin:0 .5em 0 0}.swal2-toast .swal2-icon .swal2-icon-content{display:flex;align-items:center;font-size:1.8em;font-weight:bold}.swal2-toast .swal2-icon.swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line]{top:.875em;width:1.375em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=left]{left:.3125em}.swal2-toast .swal2-icon.swal2-error [class^=swal2-x-mark-line][class$=right]{right:.3125em}.swal2-toast div:where(.swal2-actions){justify-content:flex-start;height:auto;margin:0;margin-top:.5em;padding:0 .5em}.swal2-toast button:where(.swal2-styled){margin:.25em .5em;padding:.4em .6em;font-size:1em}.swal2-toast .swal2-success{border-color:#a5dc86}.swal2-toast .swal2-success [class^=swal2-success-circular-line]{position:absolute;width:1.6em;height:3em;border-radius:50%}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=left]{top:-0.8em;left:-0.5em;transform:rotate(-45deg);transform-origin:2em 2em;border-radius:4em 0 0 4em}.swal2-toast .swal2-success [class^=swal2-success-circular-line][class$=right]{top:-0.25em;left:.9375em;transform-origin:0 1.5em;border-radius:0 4em 4em 0}.swal2-toast .swal2-success .swal2-success-ring{width:2em;height:2em}.swal2-toast .swal2-success .swal2-success-fix{top:0;left:.4375em;width:.4375em;height:2.6875em}.swal2-toast .swal2-success [class^=swal2-success-line]{height:.3125em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=tip]{top:1.125em;left:.1875em;width:.75em}.swal2-toast .swal2-success [class^=swal2-success-line][class$=long]{top:.9375em;right:.1875em;width:1.375em}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-tip{animation:swal2-toast-animate-success-line-tip .75s}.swal2-toast .swal2-success.swal2-icon-show .swal2-success-line-long{animation:swal2-toast-animate-success-line-long .75s}.swal2-toast.swal2-show{animation:var(--swal2-toast-show-animation)}.swal2-toast.swal2-hide{animation:var(--swal2-toast-hide-animation)}@keyframes swal2-show{0%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}100%{transform:translate3d(0, 0, 0) scale(1);opacity:1}}@keyframes swal2-hide{0%{transform:translate3d(0, 0, 0) scale(1);opacity:1}100%{transform:translate3d(0, -50px, 0) scale(0.9);opacity:0}}@keyframes swal2-animate-success-line-tip{0%{top:1.1875em;left:.0625em;width:0}54%{top:1.0625em;left:.125em;width:0}70%{top:2.1875em;left:-0.375em;width:3.125em}84%{top:3em;left:1.3125em;width:1.0625em}100%{top:2.8125em;left:.8125em;width:1.5625em}}@keyframes swal2-animate-success-line-long{0%{top:3.375em;right:2.875em;width:0}65%{top:3.375em;right:2.875em;width:0}84%{top:2.1875em;right:0;width:3.4375em}100%{top:2.375em;right:.5em;width:2.9375em}}@keyframes swal2-rotate-success-circular-line{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}100%{transform:rotate(-405deg)}}@keyframes swal2-animate-error-x-mark{0%{margin-top:1.625em;transform:scale(0.4);opacity:0}50%{margin-top:1.625em;transform:scale(0.4);opacity:0}80%{margin-top:-0.375em;transform:scale(1.15)}100%{margin-top:0;transform:scale(1);opacity:1}}@keyframes swal2-animate-error-icon{0%{transform:rotateX(100deg);opacity:0}100%{transform:rotateX(0deg);opacity:1}}@keyframes swal2-rotate-loading{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes swal2-animate-question-mark{0%{transform:rotateY(-360deg)}100%{transform:rotateY(0)}}@keyframes swal2-animate-i-mark{0%{transform:rotateZ(45deg);opacity:0}25%{transform:rotateZ(-25deg);opacity:.4}50%{transform:rotateZ(15deg);opacity:.8}75%{transform:rotateZ(-5deg);opacity:1}100%{transform:rotateX(0);opacity:1}}@keyframes swal2-toast-show{0%{transform:translateY(-0.625em) rotateZ(2deg)}33%{transform:translateY(0) rotateZ(-2deg)}66%{transform:translateY(0.3125em) rotateZ(2deg)}100%{transform:translateY(0) rotateZ(0deg)}}@keyframes swal2-toast-hide{100%{transform:rotateZ(1deg);opacity:0}}@keyframes swal2-toast-animate-success-line-tip{0%{top:.5625em;left:.0625em;width:0}54%{top:.125em;left:.125em;width:0}70%{top:.625em;left:-0.25em;width:1.625em}84%{top:1.0625em;left:.75em;width:.5em}100%{top:1.125em;left:.1875em;width:.75em}}@keyframes swal2-toast-animate-success-line-long{0%{top:1.625em;right:1.375em;width:0}65%{top:1.25em;right:.9375em;width:0}84%{top:.9375em;right:0;width:1.125em}100%{top:.9375em;right:.1875em;width:1.375em}}");
62765 62766/* 62767 * jQuery.bind-first library v0.2.3 62768 * Copyright (c) 2013 Vladimir Zhuravlev 62769 * 62770 * Released under MIT License 62771 * @license 62772 * 62773 * Date: Thu Feb 6 10:13:59 ICT 2014 62774 **/ 62775 62776(function($) { 62777 var splitVersion = $.fn.jquery.split("."); 62778 var major = parseInt(splitVersion[0]); 62779 var minor = parseInt(splitVersion[1]); 62780 62781 var JQ_LT_17 = (major < 1) || (major == 1 && minor < 7); 62782 62783 function eventsData($el) { 62784 return JQ_LT_17 ? $el.data('events') : $._data($el[0]).events; 62785 } 62786 62787 function moveHandlerToTop($el, eventName, isDelegated) { 62788 var data = eventsData($el); 62789 var events = data[eventName]; 62790 62791 if (!JQ_LT_17) { 62792 var handler = isDelegated ? events.splice(events.delegateCount - 1, 1)[0] : events.pop(); 62793 events.splice(isDelegated ? 0 : (events.delegateCount || 0), 0, handler); 62794 62795 return; 62796 } 62797 62798 if (isDelegated) { 62799 data.live.unshift(data.live.pop()); 62800 } else { 62801 events.unshift(events.pop()); 62802 } 62803 } 62804 62805 function moveEventHandlers($elems, eventsString, isDelegate) { 62806 var events = eventsString.split(/\s+/); 62807 $elems.each(function() { 62808 for (var i = 0; i < events.length; ++i) { 62809 var pureEventName = $.trim(events[i]).match(/[^\.]+/i)[0]; 62810 moveHandlerToTop($(this), pureEventName, isDelegate); 62811 } 62812 }); 62813 } 62814 62815 function makeMethod(methodName) { 62816 $.fn[methodName + 'First'] = function() { 62817 var args = $.makeArray(arguments); 62818 var eventsString = args.shift(); 62819 62820 if (eventsString) { 62821 $.fn[methodName].apply(this, arguments); 62822 moveEventHandlers(this, eventsString); 62823 } 62824 62825 return this; 62826 } 62827 } 62828 62829 // bind 62830 makeMethod('bind'); 62831 62832 // one 62833 makeMethod('one'); 62834 62835 // delegate 62836 $.fn.delegateFirst = function() { 62837 var args = $.makeArray(arguments); 62838 var eventsString = args[1]; 62839 62840 if (eventsString) { 62841 args.splice(0, 2); 62842 $.fn.delegate.apply(this, arguments); 62843 moveEventHandlers(this, eventsString, true); 62844 } 62845 62846 return this; 62847 }; 62848 62849 // live 62850 $.fn.liveFirst = function() { 62851 var args = $.makeArray(arguments); 62852 62853 // live = delegate to the document 62854 args.unshift(this.selector); 62855 $.fn.delegateFirst.apply($(document), args); 62856 62857 return this; 62858 }; 62859 62860 // on (jquery >= 1.7) 62861 if (!JQ_LT_17) { 62862 $.fn.onFirst = function(types, selector) { 62863 var $el = $(this); 62864 var isDelegated = typeof selector === 'string'; 62865 62866 $.fn.on.apply($el, arguments); 62867 62868 // events map 62869 if (typeof types === 'object') { 62870 for (type in types) 62871 if (types.hasOwnProperty(type)) { 62872 moveEventHandlers($el, type, isDelegated); 62873 } 62874 } else if (typeof types === 'string') { 62875 moveEventHandlers($el, types, isDelegated); 62876 } 62877 62878 return $el; 62879 }; 62880 } 62881 62882})(jQuery); 62883 62884//! moment.js 62885//! version : 2.29.4 62886//! authors : Tim Wood, Iskren Chernev, Moment.js contributors 62887//! license : MIT 62888//! momentjs.com 62889 62890;(function (global, factory) { 62891 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 62892 typeof define === 'function' && define.amd ? define(factory) : 62893 global.moment = factory() 62894}(this, (function () { 'use strict'; 62895 62896 var hookCallback; 62897 62898 function hooks() { 62899 return hookCallback.apply(null, arguments); 62900 } 62901 62902 // This is done to register the method called with moment() 62903 // without creating circular dependencies. 62904 function setHookCallback(callback) { 62905 hookCallback = callback; 62906 } 62907 62908 function isArray(input) { 62909 return ( 62910 input instanceof Array || 62911 Object.prototype.toString.call(input) === '[object Array]' 62912 ); 62913 } 62914 62915 function isObject(input) { 62916 // IE8 will treat undefined and null as object if it wasn't for 62917 // input != null 62918 return ( 62919 input != null && 62920 Object.prototype.toString.call(input) === '[object Object]' 62921 ); 62922 } 62923 62924 function hasOwnProp(a, b) { 62925 return Object.prototype.hasOwnProperty.call(a, b); 62926 } 62927 62928 function isObjectEmpty(obj) { 62929 if (Object.getOwnPropertyNames) { 62930 return Object.getOwnPropertyNames(obj).length === 0; 62931 } else { 62932 var k; 62933 for (k in obj) { 62934 if (hasOwnProp(obj, k)) { 62935 return false;
vendor: 68,783 bytes, lines 62936-65173
62936 } 62937 } 62938 return true; 62939 } 62940 } 62941 62942 function isUndefined(input) { 62943 return input === void 0; 62944 } 62945 62946 function isNumber(input) { 62947 return ( 62948 typeof input === 'number' || 62949 Object.prototype.toString.call(input) === '[object Number]' 62950 ); 62951 } 62952 62953 function isDate(input) { 62954 return ( 62955 input instanceof Date || 62956 Object.prototype.toString.call(input) === '[object Date]' 62957 ); 62958 } 62959 62960 function map(arr, fn) { 62961 var res = [], 62962 i, 62963 arrLen = arr.length; 62964 for (i = 0; i < arrLen; ++i) { 62965 res.push(fn(arr[i], i)); 62966 } 62967 return res; 62968 } 62969 62970 function extend(a, b) { 62971 for (var i in b) { 62972 if (hasOwnProp(b, i)) { 62973 a[i] = b[i]; 62974 } 62975 } 62976 62977 if (hasOwnProp(b, 'toString')) { 62978 a.toString = b.toString; 62979 } 62980 62981 if (hasOwnProp(b, 'valueOf')) { 62982 a.valueOf = b.valueOf; 62983 } 62984 62985 return a; 62986 } 62987 62988 function createUTC(input, format, locale, strict) { 62989 return createLocalOrUTC(input, format, locale, strict, true).utc(); 62990 } 62991 62992 function defaultParsingFlags() { 62993 // We need to deep clone this object. 62994 return { 62995 empty: false, 62996 unusedTokens: [], 62997 unusedInput: [], 62998 overflow: -2, 62999 charsLeftOver: 0, 63000 nullInput: false, 63001 invalidEra: null, 63002 invalidMonth: null, 63003 invalidFormat: false, 63004 userInvalidated: false, 63005 iso: false, 63006 parsedDateParts: [], 63007 era: null, 63008 meridiem: null, 63009 rfc2822: false, 63010 weekdayMismatch: false, 63011 }; 63012 } 63013 63014 function getParsingFlags(m) { 63015 if (m._pf == null) { 63016 m._pf = defaultParsingFlags(); 63017 } 63018 return m._pf; 63019 } 63020 63021 var some; 63022 if (Array.prototype.some) { 63023 some = Array.prototype.some; 63024 } else { 63025 some = function (fun) { 63026 var t = Object(this), 63027 len = t.length >>> 0, 63028 i; 63029 63030 for (i = 0; i < len; i++) { 63031 if (i in t && fun.call(this, t[i], i, t)) { 63032 return true; 63033 } 63034 } 63035 63036 return false; 63037 }; 63038 } 63039 63040 function isValid(m) { 63041 if (m._isValid == null) { 63042 var flags = getParsingFlags(m), 63043 parsedParts = some.call(flags.parsedDateParts, function (i) { 63044 return i != null; 63045 }), 63046 isNowValid = 63047 !isNaN(m._d.getTime()) && 63048 flags.overflow < 0 && 63049 !flags.empty && 63050 !flags.invalidEra && 63051 !flags.invalidMonth && 63052 !flags.invalidWeekday && 63053 !flags.weekdayMismatch && 63054 !flags.nullInput && 63055 !flags.invalidFormat && 63056 !flags.userInvalidated && 63057 (!flags.meridiem || (flags.meridiem && parsedParts)); 63058 63059 if (m._strict) { 63060 isNowValid = 63061 isNowValid && 63062 flags.charsLeftOver === 0 && 63063 flags.unusedTokens.length === 0 && 63064 flags.bigHour === undefined; 63065 } 63066 63067 if (Object.isFrozen == null || !Object.isFrozen(m)) { 63068 m._isValid = isNowValid; 63069 } else { 63070 return isNowValid; 63071 } 63072 } 63073 return m._isValid; 63074 } 63075 63076 function createInvalid(flags) { 63077 var m = createUTC(NaN); 63078 if (flags != null) { 63079 extend(getParsingFlags(m), flags); 63080 } else { 63081 getParsingFlags(m).userInvalidated = true; 63082 } 63083 63084 return m; 63085 } 63086 63087 // Plugins that add properties should also add the key here (null value), 63088 // so we can properly clone ourselves. 63089 var momentProperties = (hooks.momentProperties = []), 63090 updateInProgress = false; 63091 63092 function copyConfig(to, from) { 63093 var i, 63094 prop, 63095 val, 63096 momentPropertiesLen = momentProperties.length; 63097 63098 if (!isUndefined(from._isAMomentObject)) { 63099 to._isAMomentObject = from._isAMomentObject; 63100 } 63101 if (!isUndefined(from._i)) { 63102 to._i = from._i; 63103 } 63104 if (!isUndefined(from._f)) { 63105 to._f = from._f; 63106 } 63107 if (!isUndefined(from._l)) { 63108 to._l = from._l; 63109 } 63110 if (!isUndefined(from._strict)) { 63111 to._strict = from._strict; 63112 } 63113 if (!isUndefined(from._tzm)) { 63114 to._tzm = from._tzm; 63115 } 63116 if (!isUndefined(from._isUTC)) { 63117 to._isUTC = from._isUTC; 63118 } 63119 if (!isUndefined(from._offset)) { 63120 to._offset = from._offset; 63121 } 63122 if (!isUndefined(from._pf)) { 63123 to._pf = getParsingFlags(from); 63124 } 63125 if (!isUndefined(from._locale)) { 63126 to._locale = from._locale; 63127 } 63128 63129 if (momentPropertiesLen > 0) { 63130 for (i = 0; i < momentPropertiesLen; i++) { 63131 prop = momentProperties[i]; 63132 val = from[prop]; 63133 if (!isUndefined(val)) { 63134 to[prop] = val; 63135 } 63136 } 63137 } 63138 63139 return to; 63140 } 63141 63142 // Moment prototype object 63143 function Moment(config) { 63144 copyConfig(this, config); 63145 this._d = new Date(config._d != null ? config._d.getTime() : NaN); 63146 if (!this.isValid()) { 63147 this._d = new Date(NaN); 63148 } 63149 // Prevent infinite loop in case updateOffset creates new moment 63150 // objects. 63151 if (updateInProgress === false) { 63152 updateInProgress = true; 63153 hooks.updateOffset(this); 63154 updateInProgress = false; 63155 } 63156 } 63157 63158 function isMoment(obj) { 63159 return ( 63160 obj instanceof Moment || (obj != null && obj._isAMomentObject != null) 63161 ); 63162 } 63163 63164 function warn(msg) { 63165 if ( 63166 hooks.suppressDeprecationWarnings === false && 63167 typeof console !== 'undefined' && 63168 console.warn 63169 ) { 63170 console.warn('Deprecation warning: ' + msg); 63171 } 63172 } 63173 63174 function deprecate(msg, fn) { 63175 var firstTime = true; 63176 63177 return extend(function () { 63178 if (hooks.deprecationHandler != null) { 63179 hooks.deprecationHandler(null, msg); 63180 } 63181 if (firstTime) { 63182 var args = [], 63183 arg, 63184 i, 63185 key, 63186 argLen = arguments.length; 63187 for (i = 0; i < argLen; i++) { 63188 arg = ''; 63189 if (typeof arguments[i] === 'object') { 63190 arg += '\n[' + i + '] '; 63191 for (key in arguments[0]) { 63192 if (hasOwnProp(arguments[0], key)) { 63193 arg += key + ': ' + arguments[0][key] + ', '; 63194 } 63195 } 63196 arg = arg.slice(0, -2); // Remove trailing comma and space 63197 } else { 63198 arg = arguments[i]; 63199 } 63200 args.push(arg); 63201 } 63202 warn( 63203 msg + 63204 '\nArguments: ' + 63205 Array.prototype.slice.call(args).join('') + 63206 '\n' + 63207 new Error().stack 63208 ); 63209 firstTime = false; 63210 } 63211 return fn.apply(this, arguments); 63212 }, fn); 63213 } 63214 63215 var deprecations = {}; 63216 63217 function deprecateSimple(name, msg) { 63218 if (hooks.deprecationHandler != null) { 63219 hooks.deprecationHandler(name, msg); 63220 } 63221 if (!deprecations[name]) { 63222 warn(msg); 63223 deprecations[name] = true; 63224 } 63225 } 63226 63227 hooks.suppressDeprecationWarnings = false; 63228 hooks.deprecationHandler = null; 63229 63230 function isFunction(input) { 63231 return ( 63232 (typeof Function !== 'undefined' && input instanceof Function) || 63233 Object.prototype.toString.call(input) === '[object Function]' 63234 ); 63235 } 63236 63237 function set(config) { 63238 var prop, i; 63239 for (i in config) { 63240 if (hasOwnProp(config, i)) { 63241 prop = config[i]; 63242 if (isFunction(prop)) { 63243 this[i] = prop; 63244 } else { 63245 this['_' + i] = prop; 63246 } 63247 } 63248 } 63249 this._config = config; 63250 // Lenient ordinal parsing accepts just a number in addition to 63251 // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. 63252 // TODO: Remove "ordinalParse" fallback in next major release. 63253 this._dayOfMonthOrdinalParseLenient = new RegExp( 63254 (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + 63255 '|' + 63256 /\d{1,2}/.source 63257 ); 63258 } 63259 63260 function mergeConfigs(parentConfig, childConfig) { 63261 var res = extend({}, parentConfig), 63262 prop; 63263 for (prop in childConfig) { 63264 if (hasOwnProp(childConfig, prop)) { 63265 if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { 63266 res[prop] = {}; 63267 extend(res[prop], parentConfig[prop]); 63268 extend(res[prop], childConfig[prop]); 63269 } else if (childConfig[prop] != null) { 63270 res[prop] = childConfig[prop]; 63271 } else { 63272 delete res[prop]; 63273 } 63274 } 63275 } 63276 for (prop in parentConfig) { 63277 if ( 63278 hasOwnProp(parentConfig, prop) && 63279 !hasOwnProp(childConfig, prop) && 63280 isObject(parentConfig[prop]) 63281 ) { 63282 // make sure changes to properties don't modify parent config 63283 res[prop] = extend({}, res[prop]); 63284 } 63285 } 63286 return res; 63287 } 63288 63289 function Locale(config) { 63290 if (config != null) { 63291 this.set(config); 63292 } 63293 } 63294 63295 var keys; 63296 63297 if (Object.keys) { 63298 keys = Object.keys; 63299 } else { 63300 keys = function (obj) { 63301 var i, 63302 res = []; 63303 for (i in obj) { 63304 if (hasOwnProp(obj, i)) { 63305 res.push(i); 63306 } 63307 } 63308 return res; 63309 }; 63310 } 63311 63312 var defaultCalendar = { 63313 sameDay: '[Today at] LT', 63314 nextDay: '[Tomorrow at] LT', 63315 nextWeek: 'dddd [at] LT', 63316 lastDay: '[Yesterday at] LT', 63317 lastWeek: '[Last] dddd [at] LT', 63318 sameElse: 'L', 63319 }; 63320 63321 function calendar(key, mom, now) { 63322 var output = this._calendar[key] || this._calendar['sameElse']; 63323 return isFunction(output) ? output.call(mom, now) : output; 63324 } 63325 63326 function zeroFill(number, targetLength, forceSign) { 63327 var absNumber = '' + Math.abs(number), 63328 zerosToFill = targetLength - absNumber.length, 63329 sign = number >= 0; 63330 return ( 63331 (sign ? (forceSign ? '+' : '') : '-') + 63332 Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + 63333 absNumber 63334 ); 63335 } 63336 63337 var formattingTokens = 63338 /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, 63339 localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, 63340 formatFunctions = {}, 63341 formatTokenFunctions = {}; 63342 63343 // token: 'M' 63344 // padded: ['MM', 2] 63345 // ordinal: 'Mo' 63346 // callback: function () { this.month() + 1 } 63347 function addFormatToken(token, padded, ordinal, callback) { 63348 var func = callback; 63349 if (typeof callback === 'string') { 63350 func = function () { 63351 return this[callback](); 63352 }; 63353 } 63354 if (token) { 63355 formatTokenFunctions[token] = func; 63356 } 63357 if (padded) { 63358 formatTokenFunctions[padded[0]] = function () { 63359 return zeroFill(func.apply(this, arguments), padded[1], padded[2]); 63360 }; 63361 } 63362 if (ordinal) { 63363 formatTokenFunctions[ordinal] = function () { 63364 return this.localeData().ordinal( 63365 func.apply(this, arguments), 63366 token 63367 ); 63368 }; 63369 } 63370 } 63371 63372 function removeFormattingTokens(input) { 63373 if (input.match(/\[[\s\S]/)) { 63374 return input.replace(/^\[|\]$/g, ''); 63375 } 63376 return input.replace(/\\/g, ''); 63377 } 63378 63379 function makeFormatFunction(format) { 63380 var array = format.match(formattingTokens), 63381 i, 63382 length; 63383 63384 for (i = 0, length = array.length; i < length; i++) { 63385 if (formatTokenFunctions[array[i]]) { 63386 array[i] = formatTokenFunctions[array[i]]; 63387 } else { 63388 array[i] = removeFormattingTokens(array[i]); 63389 } 63390 } 63391 63392 return function (mom) { 63393 var output = '', 63394 i; 63395 for (i = 0; i < length; i++) { 63396 output += isFunction(array[i]) 63397 ? array[i].call(mom, format) 63398 : array[i]; 63399 } 63400 return output; 63401 }; 63402 } 63403 63404 // format date using native date object 63405 function formatMoment(m, format) { 63406 if (!m.isValid()) { 63407 return m.localeData().invalidDate(); 63408 } 63409 63410 format = expandFormat(format, m.localeData()); 63411 formatFunctions[format] = 63412 formatFunctions[format] || makeFormatFunction(format); 63413 63414 return formatFunctions[format](m); 63415 } 63416 63417 function expandFormat(format, locale) { 63418 var i = 5; 63419 63420 function replaceLongDateFormatTokens(input) { 63421 return locale.longDateFormat(input) || input; 63422 } 63423 63424 localFormattingTokens.lastIndex = 0; 63425 while (i >= 0 && localFormattingTokens.test(format)) { 63426 format = format.replace( 63427 localFormattingTokens, 63428 replaceLongDateFormatTokens 63429 ); 63430 localFormattingTokens.lastIndex = 0; 63431 i -= 1; 63432 } 63433 63434 return format; 63435 } 63436 63437 var defaultLongDateFormat = { 63438 LTS: 'h:mm:ss A', 63439 LT: 'h:mm A', 63440 L: 'MM/DD/YYYY', 63441 LL: 'MMMM D, YYYY', 63442 LLL: 'MMMM D, YYYY h:mm A', 63443 LLLL: 'dddd, MMMM D, YYYY h:mm A', 63444 }; 63445 63446 function longDateFormat(key) { 63447 var format = this._longDateFormat[key], 63448 formatUpper = this._longDateFormat[key.toUpperCase()]; 63449 63450 if (format || !formatUpper) { 63451 return format; 63452 } 63453 63454 this._longDateFormat[key] = formatUpper 63455 .match(formattingTokens) 63456 .map(function (tok) { 63457 if ( 63458 tok === 'MMMM' || 63459 tok === 'MM' || 63460 tok === 'DD' || 63461 tok === 'dddd' 63462 ) { 63463 return tok.slice(1); 63464 } 63465 return tok; 63466 }) 63467 .join(''); 63468 63469 return this._longDateFormat[key]; 63470 } 63471 63472 var defaultInvalidDate = 'Invalid date'; 63473 63474 function invalidDate() { 63475 return this._invalidDate; 63476 } 63477 63478 var defaultOrdinal = '%d', 63479 defaultDayOfMonthOrdinalParse = /\d{1,2}/; 63480 63481 function ordinal(number) { 63482 return this._ordinal.replace('%d', number); 63483 } 63484 63485 var defaultRelativeTime = { 63486 future: 'in %s', 63487 past: '%s ago', 63488 s: 'a few seconds', 63489 ss: '%d seconds', 63490 m: 'a minute', 63491 mm: '%d minutes', 63492 h: 'an hour', 63493 hh: '%d hours', 63494 d: 'a day', 63495 dd: '%d days', 63496 w: 'a week', 63497 ww: '%d weeks', 63498 M: 'a month', 63499 MM: '%d months', 63500 y: 'a year', 63501 yy: '%d years', 63502 }; 63503 63504 function relativeTime(number, withoutSuffix, string, isFuture) { 63505 var output = this._relativeTime[string]; 63506 return isFunction(output) 63507 ? output(number, withoutSuffix, string, isFuture) 63508 : output.replace(/%d/i, number); 63509 } 63510 63511 function pastFuture(diff, output) { 63512 var format = this._relativeTime[diff > 0 ? 'future' : 'past']; 63513 return isFunction(format) ? format(output) : format.replace(/%s/i, output); 63514 } 63515 63516 var aliases = {}; 63517 63518 function addUnitAlias(unit, shorthand) { 63519 var lowerCase = unit.toLowerCase(); 63520 aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; 63521 } 63522 63523 function normalizeUnits(units) { 63524 return typeof units === 'string' 63525 ? aliases[units] || aliases[units.toLowerCase()] 63526 : undefined; 63527 } 63528 63529 function normalizeObjectUnits(inputObject) { 63530 var normalizedInput = {}, 63531 normalizedProp, 63532 prop; 63533 63534 for (prop in inputObject) { 63535 if (hasOwnProp(inputObject, prop)) { 63536 normalizedProp = normalizeUnits(prop); 63537 if (normalizedProp) { 63538 normalizedInput[normalizedProp] = inputObject[prop]; 63539 } 63540 } 63541 } 63542 63543 return normalizedInput; 63544 } 63545 63546 var priorities = {}; 63547 63548 function addUnitPriority(unit, priority) { 63549 priorities[unit] = priority; 63550 } 63551 63552 function getPrioritizedUnits(unitsObj) { 63553 var units = [], 63554 u; 63555 for (u in unitsObj) { 63556 if (hasOwnProp(unitsObj, u)) { 63557 units.push({ unit: u, priority: priorities[u] }); 63558 } 63559 } 63560 units.sort(function (a, b) { 63561 return a.priority - b.priority; 63562 }); 63563 return units; 63564 } 63565 63566 function isLeapYear(year) { 63567 return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; 63568 } 63569 63570 function absFloor(number) { 63571 if (number < 0) { 63572 // -0 -> 0 63573 return Math.ceil(number) || 0; 63574 } else { 63575 return Math.floor(number); 63576 } 63577 } 63578 63579 function toInt(argumentForCoercion) { 63580 var coercedNumber = +argumentForCoercion, 63581 value = 0; 63582 63583 if (coercedNumber !== 0 && isFinite(coercedNumber)) { 63584 value = absFloor(coercedNumber); 63585 } 63586 63587 return value; 63588 } 63589 63590 function makeGetSet(unit, keepTime) { 63591 return function (value) { 63592 if (value != null) { 63593 set$1(this, unit, value); 63594 hooks.updateOffset(this, keepTime); 63595 return this; 63596 } else { 63597 return get(this, unit); 63598 } 63599 }; 63600 } 63601 63602 function get(mom, unit) { 63603 return mom.isValid() 63604 ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() 63605 : NaN; 63606 } 63607 63608 function set$1(mom, unit, value) { 63609 if (mom.isValid() && !isNaN(value)) { 63610 if ( 63611 unit === 'FullYear' && 63612 isLeapYear(mom.year()) && 63613 mom.month() === 1 && 63614 mom.date() === 29 63615 ) { 63616 value = toInt(value); 63617 mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit]( 63618 value, 63619 mom.month(), 63620 daysInMonth(value, mom.month()) 63621 ); 63622 } else { 63623 mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); 63624 } 63625 } 63626 } 63627 63628 // MOMENTS 63629 63630 function stringGet(units) { 63631 units = normalizeUnits(units); 63632 if (isFunction(this[units])) { 63633 return this[units](); 63634 } 63635 return this; 63636 } 63637 63638 function stringSet(units, value) { 63639 if (typeof units === 'object') { 63640 units = normalizeObjectUnits(units); 63641 var prioritized = getPrioritizedUnits(units), 63642 i, 63643 prioritizedLen = prioritized.length; 63644 for (i = 0; i < prioritizedLen; i++) { 63645 this[prioritized[i].unit](units[prioritized[i].unit]); 63646 } 63647 } else { 63648 units = normalizeUnits(units); 63649 if (isFunction(this[units])) { 63650 return this[units](value); 63651 } 63652 } 63653 return this; 63654 } 63655 63656 var match1 = /\d/, // 0 - 9 63657 match2 = /\d\d/, // 00 - 99 63658 match3 = /\d{3}/, // 000 - 999 63659 match4 = /\d{4}/, // 0000 - 9999 63660 match6 = /[+-]?\d{6}/, // -999999 - 999999 63661 match1to2 = /\d\d?/, // 0 - 99 63662 match3to4 = /\d\d\d\d?/, // 999 - 9999 63663 match5to6 = /\d\d\d\d\d\d?/, // 99999 - 999999 63664 match1to3 = /\d{1,3}/, // 0 - 999 63665 match1to4 = /\d{1,4}/, // 0 - 9999 63666 match1to6 = /[+-]?\d{1,6}/, // -999999 - 999999 63667 matchUnsigned = /\d+/, // 0 - inf 63668 matchSigned = /[+-]?\d+/, // -inf - inf 63669 matchOffset = /Z|[+-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z 63670 matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z 63671 matchTimestamp = /[+-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 63672 // any word (or two) characters or numbers including two/three word month in arabic. 63673 // includes scottish gaelic two word and hyphenated months 63674 matchWord = 63675 /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, 63676 regexes; 63677 63678 regexes = {}; 63679 63680 function addRegexToken(token, regex, strictRegex) { 63681 regexes[token] = isFunction(regex) 63682 ? regex 63683 : function (isStrict, localeData) { 63684 return isStrict && strictRegex ? strictRegex : regex; 63685 }; 63686 } 63687 63688 function getParseRegexForToken(token, config) { 63689 if (!hasOwnProp(regexes, token)) { 63690 return new RegExp(unescapeFormat(token)); 63691 } 63692 63693 return regexes[token](config._strict, config._locale); 63694 } 63695 63696 // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript 63697 function unescapeFormat(s) { 63698 return regexEscape( 63699 s 63700 .replace('\\', '') 63701 .replace( 63702 /\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, 63703 function (matched, p1, p2, p3, p4) { 63704 return p1 || p2 || p3 || p4; 63705 } 63706 ) 63707 ); 63708 } 63709 63710 function regexEscape(s) { 63711 return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 63712 } 63713 63714 var tokens = {}; 63715 63716 function addParseToken(token, callback) { 63717 var i, 63718 func = callback, 63719 tokenLen; 63720 if (typeof token === 'string') { 63721 token = [token]; 63722 } 63723 if (isNumber(callback)) { 63724 func = function (input, array) { 63725 array[callback] = toInt(input); 63726 }; 63727 } 63728 tokenLen = token.length; 63729 for (i = 0; i < tokenLen; i++) { 63730 tokens[token[i]] = func; 63731 } 63732 } 63733 63734 function addWeekParseToken(token, callback) { 63735 addParseToken(token, function (input, array, config, token) { 63736 config._w = config._w || {}; 63737 callback(input, config._w, config, token); 63738 }); 63739 } 63740 63741 function addTimeToArrayFromToken(token, input, config) { 63742 if (input != null && hasOwnProp(tokens, token)) { 63743 tokens[token](input, config._a, config, token); 63744 } 63745 } 63746 63747 var YEAR = 0, 63748 MONTH = 1, 63749 DATE = 2, 63750 HOUR = 3, 63751 MINUTE = 4, 63752 SECOND = 5, 63753 MILLISECOND = 6, 63754 WEEK = 7, 63755 WEEKDAY = 8; 63756 63757 function mod(n, x) { 63758 return ((n % x) + x) % x; 63759 } 63760 63761 var indexOf; 63762 63763 if (Array.prototype.indexOf) { 63764 indexOf = Array.prototype.indexOf; 63765 } else { 63766 indexOf = function (o) { 63767 // I know 63768 var i; 63769 for (i = 0; i < this.length; ++i) { 63770 if (this[i] === o) { 63771 return i; 63772 } 63773 } 63774 return -1; 63775 }; 63776 } 63777 63778 function daysInMonth(year, month) { 63779 if (isNaN(year) || isNaN(month)) { 63780 return NaN; 63781 } 63782 var modMonth = mod(month, 12); 63783 year += (month - modMonth) / 12; 63784 return modMonth === 1 63785 ? isLeapYear(year) 63786 ? 29 63787 : 28 63788 : 31 - ((modMonth % 7) % 2); 63789 } 63790 63791 // FORMATTING 63792 63793 addFormatToken('M', ['MM', 2], 'Mo', function () { 63794 return this.month() + 1; 63795 }); 63796 63797 addFormatToken('MMM', 0, 0, function (format) { 63798 return this.localeData().monthsShort(this, format); 63799 }); 63800 63801 addFormatToken('MMMM', 0, 0, function (format) { 63802 return this.localeData().months(this, format); 63803 }); 63804 63805 // ALIASES 63806 63807 addUnitAlias('month', 'M'); 63808 63809 // PRIORITY 63810 63811 addUnitPriority('month', 8); 63812 63813 // PARSING 63814 63815 addRegexToken('M', match1to2); 63816 addRegexToken('MM', match1to2, match2); 63817 addRegexToken('MMM', function (isStrict, locale) { 63818 return locale.monthsShortRegex(isStrict); 63819 }); 63820 addRegexToken('MMMM', function (isStrict, locale) { 63821 return locale.monthsRegex(isStrict); 63822 }); 63823 63824 addParseToken(['M', 'MM'], function (input, array) { 63825 array[MONTH] = toInt(input) - 1; 63826 }); 63827 63828 addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { 63829 var month = config._locale.monthsParse(input, token, config._strict); 63830 // if we didn't find a month name, mark the date as invalid. 63831 if (month != null) { 63832 array[MONTH] = month; 63833 } else { 63834 getParsingFlags(config).invalidMonth = input; 63835 } 63836 }); 63837 63838 // LOCALES 63839 63840 var defaultLocaleMonths = 63841 'January_February_March_April_May_June_July_August_September_October_November_December'.split( 63842 '_' 63843 ), 63844 defaultLocaleMonthsShort = 63845 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), 63846 MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, 63847 defaultMonthsShortRegex = matchWord, 63848 defaultMonthsRegex = matchWord; 63849 63850 function localeMonths(m, format) { 63851 if (!m) { 63852 return isArray(this._months) 63853 ? this._months 63854 : this._months['standalone']; 63855 } 63856 return isArray(this._months) 63857 ? this._months[m.month()] 63858 : this._months[ 63859 (this._months.isFormat || MONTHS_IN_FORMAT).test(format) 63860 ? 'format' 63861 : 'standalone' 63862 ][m.month()]; 63863 } 63864 63865 function localeMonthsShort(m, format) { 63866 if (!m) { 63867 return isArray(this._monthsShort) 63868 ? this._monthsShort 63869 : this._monthsShort['standalone']; 63870 } 63871 return isArray(this._monthsShort) 63872 ? this._monthsShort[m.month()] 63873 : this._monthsShort[ 63874 MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone' 63875 ][m.month()]; 63876 } 63877 63878 function handleStrictParse(monthName, format, strict) { 63879 var i, 63880 ii, 63881 mom, 63882 llc = monthName.toLocaleLowerCase(); 63883 if (!this._monthsParse) { 63884 // this is not used 63885 this._monthsParse = []; 63886 this._longMonthsParse = []; 63887 this._shortMonthsParse = []; 63888 for (i = 0; i < 12; ++i) { 63889 mom = createUTC([2000, i]); 63890 this._shortMonthsParse[i] = this.monthsShort( 63891 mom, 63892 '' 63893 ).toLocaleLowerCase(); 63894 this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); 63895 } 63896 } 63897 63898 if (strict) { 63899 if (format === 'MMM') { 63900 ii = indexOf.call(this._shortMonthsParse, llc); 63901 return ii !== -1 ? ii : null; 63902 } else { 63903 ii = indexOf.call(this._longMonthsParse, llc); 63904 return ii !== -1 ? ii : null; 63905 } 63906 } else { 63907 if (format === 'MMM') { 63908 ii = indexOf.call(this._shortMonthsParse, llc); 63909 if (ii !== -1) { 63910 return ii; 63911 } 63912 ii = indexOf.call(this._longMonthsParse, llc); 63913 return ii !== -1 ? ii : null; 63914 } else { 63915 ii = indexOf.call(this._longMonthsParse, llc); 63916 if (ii !== -1) { 63917 return ii; 63918 } 63919 ii = indexOf.call(this._shortMonthsParse, llc); 63920 return ii !== -1 ? ii : null; 63921 } 63922 } 63923 } 63924 63925 function localeMonthsParse(monthName, format, strict) { 63926 var i, mom, regex; 63927 63928 if (this._monthsParseExact) { 63929 return handleStrictParse.call(this, monthName, format, strict); 63930 } 63931 63932 if (!this._monthsParse) { 63933 this._monthsParse = []; 63934 this._longMonthsParse = []; 63935 this._shortMonthsParse = []; 63936 } 63937 63938 // TODO: add sorting 63939 // Sorting makes sure if one month (or abbr) is a prefix of another 63940 // see sorting in computeMonthsParse 63941 for (i = 0; i < 12; i++) { 63942 // make the regex if we don't have it already 63943 mom = createUTC([2000, i]); 63944 if (strict && !this._longMonthsParse[i]) { 63945 this._longMonthsParse[i] = new RegExp( 63946 '^' + this.months(mom, '').replace('.', '') + '$', 63947 'i' 63948 ); 63949 this._shortMonthsParse[i] = new RegExp( 63950 '^' + this.monthsShort(mom, '').replace('.', '') + '$', 63951 'i' 63952 ); 63953 } 63954 if (!strict && !this._monthsParse[i]) { 63955 regex = 63956 '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); 63957 this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); 63958 } 63959 // test the regex 63960 if ( 63961 strict && 63962 format === 'MMMM' && 63963 this._longMonthsParse[i].test(monthName) 63964 ) { 63965 return i; 63966 } else if ( 63967 strict && 63968 format === 'MMM' && 63969 this._shortMonthsParse[i].test(monthName) 63970 ) { 63971 return i; 63972 } else if (!strict && this._monthsParse[i].test(monthName)) { 63973 return i; 63974 } 63975 } 63976 } 63977 63978 // MOMENTS 63979 63980 function setMonth(mom, value) { 63981 var dayOfMonth; 63982 63983 if (!mom.isValid()) { 63984 // No op 63985 return mom; 63986 } 63987 63988 if (typeof value === 'string') { 63989 if (/^\d+$/.test(value)) { 63990 value = toInt(value); 63991 } else { 63992 value = mom.localeData().monthsParse(value); 63993 // TODO: Another silent failure? 63994 if (!isNumber(value)) { 63995 return mom; 63996 } 63997 } 63998 } 63999 64000 dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); 64001 mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); 64002 return mom; 64003 } 64004 64005 function getSetMonth(value) { 64006 if (value != null) { 64007 setMonth(this, value); 64008 hooks.updateOffset(this, true); 64009 return this; 64010 } else { 64011 return get(this, 'Month'); 64012 } 64013 } 64014 64015 function getDaysInMonth() { 64016 return daysInMonth(this.year(), this.month()); 64017 } 64018 64019 function monthsShortRegex(isStrict) { 64020 if (this._monthsParseExact) { 64021 if (!hasOwnProp(this, '_monthsRegex')) { 64022 computeMonthsParse.call(this); 64023 } 64024 if (isStrict) { 64025 return this._monthsShortStrictRegex; 64026 } else { 64027 return this._monthsShortRegex; 64028 } 64029 } else { 64030 if (!hasOwnProp(this, '_monthsShortRegex')) { 64031 this._monthsShortRegex = defaultMonthsShortRegex; 64032 } 64033 return this._monthsShortStrictRegex && isStrict 64034 ? this._monthsShortStrictRegex 64035 : this._monthsShortRegex; 64036 } 64037 } 64038 64039 function monthsRegex(isStrict) { 64040 if (this._monthsParseExact) { 64041 if (!hasOwnProp(this, '_monthsRegex')) { 64042 computeMonthsParse.call(this); 64043 } 64044 if (isStrict) { 64045 return this._monthsStrictRegex; 64046 } else { 64047 return this._monthsRegex; 64048 } 64049 } else { 64050 if (!hasOwnProp(this, '_monthsRegex')) { 64051 this._monthsRegex = defaultMonthsRegex; 64052 } 64053 return this._monthsStrictRegex && isStrict 64054 ? this._monthsStrictRegex 64055 : this._monthsRegex; 64056 } 64057 } 64058 64059 function computeMonthsParse() { 64060 function cmpLenRev(a, b) { 64061 return b.length - a.length; 64062 } 64063 64064 var shortPieces = [], 64065 longPieces = [], 64066 mixedPieces = [], 64067 i, 64068 mom; 64069 for (i = 0; i < 12; i++) { 64070 // make the regex if we don't have it already 64071 mom = createUTC([2000, i]); 64072 shortPieces.push(this.monthsShort(mom, '')); 64073 longPieces.push(this.months(mom, '')); 64074 mixedPieces.push(this.months(mom, '')); 64075 mixedPieces.push(this.monthsShort(mom, '')); 64076 } 64077 // Sorting makes sure if one month (or abbr) is a prefix of another it 64078 // will match the longer piece. 64079 shortPieces.sort(cmpLenRev); 64080 longPieces.sort(cmpLenRev); 64081 mixedPieces.sort(cmpLenRev); 64082 for (i = 0; i < 12; i++) { 64083 shortPieces[i] = regexEscape(shortPieces[i]); 64084 longPieces[i] = regexEscape(longPieces[i]); 64085 } 64086 for (i = 0; i < 24; i++) { 64087 mixedPieces[i] = regexEscape(mixedPieces[i]); 64088 } 64089 64090 this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); 64091 this._monthsShortRegex = this._monthsRegex; 64092 this._monthsStrictRegex = new RegExp( 64093 '^(' + longPieces.join('|') + ')', 64094 'i' 64095 ); 64096 this._monthsShortStrictRegex = new RegExp( 64097 '^(' + shortPieces.join('|') + ')', 64098 'i' 64099 ); 64100 } 64101 64102 // FORMATTING 64103 64104 addFormatToken('Y', 0, 0, function () { 64105 var y = this.year(); 64106 return y <= 9999 ? zeroFill(y, 4) : '+' + y; 64107 }); 64108 64109 addFormatToken(0, ['YY', 2], 0, function () { 64110 return this.year() % 100; 64111 }); 64112 64113 addFormatToken(0, ['YYYY', 4], 0, 'year'); 64114 addFormatToken(0, ['YYYYY', 5], 0, 'year'); 64115 addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); 64116 64117 // ALIASES 64118 64119 addUnitAlias('year', 'y'); 64120 64121 // PRIORITIES 64122 64123 addUnitPriority('year', 1); 64124 64125 // PARSING 64126 64127 addRegexToken('Y', matchSigned); 64128 addRegexToken('YY', match1to2, match2); 64129 addRegexToken('YYYY', match1to4, match4); 64130 addRegexToken('YYYYY', match1to6, match6); 64131 addRegexToken('YYYYYY', match1to6, match6); 64132 64133 addParseToken(['YYYYY', 'YYYYYY'], YEAR); 64134 addParseToken('YYYY', function (input, array) { 64135 array[YEAR] = 64136 input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); 64137 }); 64138 addParseToken('YY', function (input, array) { 64139 array[YEAR] = hooks.parseTwoDigitYear(input); 64140 }); 64141 addParseToken('Y', function (input, array) { 64142 array[YEAR] = parseInt(input, 10); 64143 }); 64144 64145 // HELPERS 64146 64147 function daysInYear(year) { 64148 return isLeapYear(year) ? 366 : 365; 64149 } 64150 64151 // HOOKS 64152 64153 hooks.parseTwoDigitYear = function (input) { 64154 return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); 64155 }; 64156 64157 // MOMENTS 64158 64159 var getSetYear = makeGetSet('FullYear', true); 64160 64161 function getIsLeapYear() { 64162 return isLeapYear(this.year()); 64163 } 64164 64165 function createDate(y, m, d, h, M, s, ms) { 64166 // can't just apply() to create a date: 64167 // https://stackoverflow.com/q/181348 64168 var date; 64169 // the date constructor remaps years 0-99 to 1900-1999 64170 if (y < 100 && y >= 0) { 64171 // preserve leap years using a full 400 year cycle, then reset 64172 date = new Date(y + 400, m, d, h, M, s, ms); 64173 if (isFinite(date.getFullYear())) { 64174 date.setFullYear(y); 64175 } 64176 } else { 64177 date = new Date(y, m, d, h, M, s, ms); 64178 } 64179 64180 return date; 64181 } 64182 64183 function createUTCDate(y) { 64184 var date, args; 64185 // the Date.UTC function remaps years 0-99 to 1900-1999 64186 if (y < 100 && y >= 0) { 64187 args = Array.prototype.slice.call(arguments); 64188 // preserve leap years using a full 400 year cycle, then reset 64189 args[0] = y + 400; 64190 date = new Date(Date.UTC.apply(null, args)); 64191 if (isFinite(date.getUTCFullYear())) { 64192 date.setUTCFullYear(y); 64193 } 64194 } else { 64195 date = new Date(Date.UTC.apply(null, arguments)); 64196 } 64197 64198 return date; 64199 } 64200 64201 // start-of-first-week - start-of-year 64202 function firstWeekOffset(year, dow, doy) { 64203 var // first-week day -- which january is always in the first week (4 for iso, 1 for other) 64204 fwd = 7 + dow - doy, 64205 // first-week day local weekday -- which local weekday is fwd 64206 fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; 64207 64208 return -fwdlw + fwd - 1; 64209 } 64210 64211 // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday 64212 function dayOfYearFromWeeks(year, week, weekday, dow, doy) { 64213 var localWeekday = (7 + weekday - dow) % 7, 64214 weekOffset = firstWeekOffset(year, dow, doy), 64215 dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, 64216 resYear, 64217 resDayOfYear; 64218 64219 if (dayOfYear <= 0) { 64220 resYear = year - 1; 64221 resDayOfYear = daysInYear(resYear) + dayOfYear; 64222 } else if (dayOfYear > daysInYear(year)) { 64223 resYear = year + 1; 64224 resDayOfYear = dayOfYear - daysInYear(year); 64225 } else { 64226 resYear = year; 64227 resDayOfYear = dayOfYear; 64228 } 64229 64230 return { 64231 year: resYear, 64232 dayOfYear: resDayOfYear, 64233 }; 64234 } 64235 64236 function weekOfYear(mom, dow, doy) { 64237 var weekOffset = firstWeekOffset(mom.year(), dow, doy), 64238 week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, 64239 resWeek, 64240 resYear; 64241 64242 if (week < 1) { 64243 resYear = mom.year() - 1; 64244 resWeek = week + weeksInYear(resYear, dow, doy); 64245 } else if (week > weeksInYear(mom.year(), dow, doy)) { 64246 resWeek = week - weeksInYear(mom.year(), dow, doy); 64247 resYear = mom.year() + 1; 64248 } else { 64249 resYear = mom.year(); 64250 resWeek = week; 64251 } 64252 64253 return { 64254 week: resWeek, 64255 year: resYear, 64256 }; 64257 } 64258 64259 function weeksInYear(year, dow, doy) { 64260 var weekOffset = firstWeekOffset(year, dow, doy), 64261 weekOffsetNext = firstWeekOffset(year + 1, dow, doy); 64262 return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; 64263 } 64264 64265 // FORMATTING 64266 64267 addFormatToken('w', ['ww', 2], 'wo', 'week'); 64268 addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); 64269 64270 // ALIASES 64271 64272 addUnitAlias('week', 'w'); 64273 addUnitAlias('isoWeek', 'W'); 64274 64275 // PRIORITIES 64276 64277 addUnitPriority('week', 5); 64278 addUnitPriority('isoWeek', 5); 64279 64280 // PARSING 64281 64282 addRegexToken('w', match1to2); 64283 addRegexToken('ww', match1to2, match2); 64284 addRegexToken('W', match1to2); 64285 addRegexToken('WW', match1to2, match2); 64286 64287 addWeekParseToken( 64288 ['w', 'ww', 'W', 'WW'], 64289 function (input, week, config, token) { 64290 week[token.substr(0, 1)] = toInt(input); 64291 } 64292 ); 64293 64294 // HELPERS 64295 64296 // LOCALES 64297 64298 function localeWeek(mom) { 64299 return weekOfYear(mom, this._week.dow, this._week.doy).week; 64300 } 64301 64302 var defaultLocaleWeek = { 64303 dow: 0, // Sunday is the first day of the week. 64304 doy: 6, // The week that contains Jan 6th is the first week of the year. 64305 }; 64306 64307 function localeFirstDayOfWeek() { 64308 return this._week.dow; 64309 } 64310 64311 function localeFirstDayOfYear() { 64312 return this._week.doy; 64313 } 64314 64315 // MOMENTS 64316 64317 function getSetWeek(input) { 64318 var week = this.localeData().week(this); 64319 return input == null ? week : this.add((input - week) * 7, 'd'); 64320 } 64321 64322 function getSetISOWeek(input) { 64323 var week = weekOfYear(this, 1, 4).week; 64324 return input == null ? week : this.add((input - week) * 7, 'd'); 64325 } 64326 64327 // FORMATTING 64328 64329 addFormatToken('d', 0, 'do', 'day'); 64330 64331 addFormatToken('dd', 0, 0, function (format) { 64332 return this.localeData().weekdaysMin(this, format); 64333 }); 64334 64335 addFormatToken('ddd', 0, 0, function (format) { 64336 return this.localeData().weekdaysShort(this, format); 64337 }); 64338 64339 addFormatToken('dddd', 0, 0, function (format) { 64340 return this.localeData().weekdays(this, format); 64341 }); 64342 64343 addFormatToken('e', 0, 0, 'weekday'); 64344 addFormatToken('E', 0, 0, 'isoWeekday'); 64345 64346 // ALIASES 64347 64348 addUnitAlias('day', 'd'); 64349 addUnitAlias('weekday', 'e'); 64350 addUnitAlias('isoWeekday', 'E'); 64351 64352 // PRIORITY 64353 addUnitPriority('day', 11); 64354 addUnitPriority('weekday', 11); 64355 addUnitPriority('isoWeekday', 11); 64356 64357 // PARSING 64358 64359 addRegexToken('d', match1to2); 64360 addRegexToken('e', match1to2); 64361 addRegexToken('E', match1to2); 64362 addRegexToken('dd', function (isStrict, locale) { 64363 return locale.weekdaysMinRegex(isStrict); 64364 }); 64365 addRegexToken('ddd', function (isStrict, locale) { 64366 return locale.weekdaysShortRegex(isStrict); 64367 }); 64368 addRegexToken('dddd', function (isStrict, locale) { 64369 return locale.weekdaysRegex(isStrict); 64370 }); 64371 64372 addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { 64373 var weekday = config._locale.weekdaysParse(input, token, config._strict); 64374 // if we didn't get a weekday name, mark the date as invalid 64375 if (weekday != null) { 64376 week.d = weekday; 64377 } else { 64378 getParsingFlags(config).invalidWeekday = input; 64379 } 64380 }); 64381 64382 addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { 64383 week[token] = toInt(input); 64384 }); 64385 64386 // HELPERS 64387 64388 function parseWeekday(input, locale) { 64389 if (typeof input !== 'string') { 64390 return input; 64391 } 64392 64393 if (!isNaN(input)) { 64394 return parseInt(input, 10); 64395 } 64396 64397 input = locale.weekdaysParse(input); 64398 if (typeof input === 'number') { 64399 return input; 64400 } 64401 64402 return null; 64403 } 64404 64405 function parseIsoWeekday(input, locale) { 64406 if (typeof input === 'string') { 64407 return locale.weekdaysParse(input) % 7 || 7; 64408 } 64409 return isNaN(input) ? null : input; 64410 } 64411 64412 // LOCALES 64413 function shiftWeekdays(ws, n) { 64414 return ws.slice(n, 7).concat(ws.slice(0, n)); 64415 } 64416 64417 var defaultLocaleWeekdays = 64418 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), 64419 defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), 64420 defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), 64421 defaultWeekdaysRegex = matchWord, 64422 defaultWeekdaysShortRegex = matchWord, 64423 defaultWeekdaysMinRegex = matchWord; 64424 64425 function localeWeekdays(m, format) { 64426 var weekdays = isArray(this._weekdays) 64427 ? this._weekdays 64428 : this._weekdays[ 64429 m && m !== true && this._weekdays.isFormat.test(format) 64430 ? 'format' 64431 : 'standalone' 64432 ]; 64433 return m === true 64434 ? shiftWeekdays(weekdays, this._week.dow) 64435 : m 64436 ? weekdays[m.day()] 64437 : weekdays; 64438 } 64439 64440 function localeWeekdaysShort(m) { 64441 return m === true 64442 ? shiftWeekdays(this._weekdaysShort, this._week.dow) 64443 : m 64444 ? this._weekdaysShort[m.day()] 64445 : this._weekdaysShort; 64446 } 64447 64448 function localeWeekdaysMin(m) { 64449 return m === true 64450 ? shiftWeekdays(this._weekdaysMin, this._week.dow) 64451 : m 64452 ? this._weekdaysMin[m.day()] 64453 : this._weekdaysMin; 64454 } 64455 64456 function handleStrictParse$1(weekdayName, format, strict) { 64457 var i, 64458 ii, 64459 mom, 64460 llc = weekdayName.toLocaleLowerCase(); 64461 if (!this._weekdaysParse) { 64462 this._weekdaysParse = []; 64463 this._shortWeekdaysParse = []; 64464 this._minWeekdaysParse = []; 64465 64466 for (i = 0; i < 7; ++i) { 64467 mom = createUTC([2000, 1]).day(i); 64468 this._minWeekdaysParse[i] = this.weekdaysMin( 64469 mom, 64470 '' 64471 ).toLocaleLowerCase(); 64472 this._shortWeekdaysParse[i] = this.weekdaysShort( 64473 mom, 64474 '' 64475 ).toLocaleLowerCase(); 64476 this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); 64477 } 64478 } 64479 64480 if (strict) { 64481 if (format === 'dddd') { 64482 ii = indexOf.call(this._weekdaysParse, llc); 64483 return ii !== -1 ? ii : null; 64484 } else if (format === 'ddd') { 64485 ii = indexOf.call(this._shortWeekdaysParse, llc); 64486 return ii !== -1 ? ii : null; 64487 } else { 64488 ii = indexOf.call(this._minWeekdaysParse, llc); 64489 return ii !== -1 ? ii : null; 64490 } 64491 } else { 64492 if (format === 'dddd') { 64493 ii = indexOf.call(this._weekdaysParse, llc); 64494 if (ii !== -1) { 64495 return ii; 64496 } 64497 ii = indexOf.call(this._shortWeekdaysParse, llc); 64498 if (ii !== -1) { 64499 return ii; 64500 } 64501 ii = indexOf.call(this._minWeekdaysParse, llc); 64502 return ii !== -1 ? ii : null; 64503 } else if (format === 'ddd') { 64504 ii = indexOf.call(this._shortWeekdaysParse, llc); 64505 if (ii !== -1) { 64506 return ii; 64507 } 64508 ii = indexOf.call(this._weekdaysParse, llc); 64509 if (ii !== -1) { 64510 return ii; 64511 } 64512 ii = indexOf.call(this._minWeekdaysParse, llc); 64513 return ii !== -1 ? ii : null; 64514 } else { 64515 ii = indexOf.call(this._minWeekdaysParse, llc); 64516 if (ii !== -1) { 64517 return ii; 64518 } 64519 ii = indexOf.call(this._weekdaysParse, llc); 64520 if (ii !== -1) { 64521 return ii; 64522 } 64523 ii = indexOf.call(this._shortWeekdaysParse, llc); 64524 return ii !== -1 ? ii : null; 64525 } 64526 } 64527 } 64528 64529 function localeWeekdaysParse(weekdayName, format, strict) { 64530 var i, mom, regex; 64531 64532 if (this._weekdaysParseExact) { 64533 return handleStrictParse$1.call(this, weekdayName, format, strict); 64534 } 64535 64536 if (!this._weekdaysParse) { 64537 this._weekdaysParse = []; 64538 this._minWeekdaysParse = []; 64539 this._shortWeekdaysParse = []; 64540 this._fullWeekdaysParse = []; 64541 } 64542 64543 for (i = 0; i < 7; i++) { 64544 // make the regex if we don't have it already 64545 64546 mom = createUTC([2000, 1]).day(i); 64547 if (strict && !this._fullWeekdaysParse[i]) { 64548 this._fullWeekdaysParse[i] = new RegExp( 64549 '^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 64550 'i' 64551 ); 64552 this._shortWeekdaysParse[i] = new RegExp( 64553 '^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 64554 'i' 64555 ); 64556 this._minWeekdaysParse[i] = new RegExp( 64557 '^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 64558 'i' 64559 ); 64560 } 64561 if (!this._weekdaysParse[i]) { 64562 regex = 64563 '^' + 64564 this.weekdays(mom, '') + 64565 '|^' + 64566 this.weekdaysShort(mom, '') + 64567 '|^' + 64568 this.weekdaysMin(mom, ''); 64569 this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); 64570 } 64571 // test the regex 64572 if ( 64573 strict && 64574 format === 'dddd' && 64575 this._fullWeekdaysParse[i].test(weekdayName) 64576 ) { 64577 return i; 64578 } else if ( 64579 strict && 64580 format === 'ddd' && 64581 this._shortWeekdaysParse[i].test(weekdayName) 64582 ) { 64583 return i; 64584 } else if ( 64585 strict && 64586 format === 'dd' && 64587 this._minWeekdaysParse[i].test(weekdayName) 64588 ) { 64589 return i; 64590 } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { 64591 return i; 64592 } 64593 } 64594 } 64595 64596 // MOMENTS 64597 64598 function getSetDayOfWeek(input) { 64599 if (!this.isValid()) { 64600 return input != null ? this : NaN; 64601 } 64602 var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); 64603 if (input != null) { 64604 input = parseWeekday(input, this.localeData()); 64605 return this.add(input - day, 'd'); 64606 } else { 64607 return day; 64608 } 64609 } 64610 64611 function getSetLocaleDayOfWeek(input) { 64612 if (!this.isValid()) { 64613 return input != null ? this : NaN; 64614 } 64615 var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; 64616 return input == null ? weekday : this.add(input - weekday, 'd'); 64617 } 64618 64619 function getSetISODayOfWeek(input) { 64620 if (!this.isValid()) { 64621 return input != null ? this : NaN; 64622 } 64623 64624 // behaves the same as moment#day except 64625 // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) 64626 // as a setter, sunday should belong to the previous week. 64627 64628 if (input != null) { 64629 var weekday = parseIsoWeekday(input, this.localeData()); 64630 return this.day(this.day() % 7 ? weekday : weekday - 7); 64631 } else { 64632 return this.day() || 7; 64633 } 64634 } 64635 64636 function weekdaysRegex(isStrict) { 64637 if (this._weekdaysParseExact) { 64638 if (!hasOwnProp(this, '_weekdaysRegex')) { 64639 computeWeekdaysParse.call(this); 64640 } 64641 if (isStrict) { 64642 return this._weekdaysStrictRegex; 64643 } else { 64644 return this._weekdaysRegex; 64645 } 64646 } else { 64647 if (!hasOwnProp(this, '_weekdaysRegex')) { 64648 this._weekdaysRegex = defaultWeekdaysRegex; 64649 } 64650 return this._weekdaysStrictRegex && isStrict 64651 ? this._weekdaysStrictRegex 64652 : this._weekdaysRegex; 64653 } 64654 } 64655 64656 function weekdaysShortRegex(isStrict) { 64657 if (this._weekdaysParseExact) { 64658 if (!hasOwnProp(this, '_weekdaysRegex')) { 64659 computeWeekdaysParse.call(this); 64660 } 64661 if (isStrict) { 64662 return this._weekdaysShortStrictRegex; 64663 } else { 64664 return this._weekdaysShortRegex; 64665 } 64666 } else { 64667 if (!hasOwnProp(this, '_weekdaysShortRegex')) { 64668 this._weekdaysShortRegex = defaultWeekdaysShortRegex; 64669 } 64670 return this._weekdaysShortStrictRegex && isStrict 64671 ? this._weekdaysShortStrictRegex 64672 : this._weekdaysShortRegex; 64673 } 64674 } 64675 64676 function weekdaysMinRegex(isStrict) { 64677 if (this._weekdaysParseExact) { 64678 if (!hasOwnProp(this, '_weekdaysRegex')) { 64679 computeWeekdaysParse.call(this); 64680 } 64681 if (isStrict) { 64682 return this._weekdaysMinStrictRegex; 64683 } else { 64684 return this._weekdaysMinRegex; 64685 } 64686 } else { 64687 if (!hasOwnProp(this, '_weekdaysMinRegex')) { 64688 this._weekdaysMinRegex = defaultWeekdaysMinRegex; 64689 } 64690 return this._weekdaysMinStrictRegex && isStrict 64691 ? this._weekdaysMinStrictRegex 64692 : this._weekdaysMinRegex; 64693 } 64694 } 64695 64696 function computeWeekdaysParse() { 64697 function cmpLenRev(a, b) { 64698 return b.length - a.length; 64699 } 64700 64701 var minPieces = [], 64702 shortPieces = [], 64703 longPieces = [], 64704 mixedPieces = [], 64705 i, 64706 mom, 64707 minp, 64708 shortp, 64709 longp; 64710 for (i = 0; i < 7; i++) { 64711 // make the regex if we don't have it already 64712 mom = createUTC([2000, 1]).day(i); 64713 minp = regexEscape(this.weekdaysMin(mom, '')); 64714 shortp = regexEscape(this.weekdaysShort(mom, '')); 64715 longp = regexEscape(this.weekdays(mom, '')); 64716 minPieces.push(minp); 64717 shortPieces.push(shortp); 64718 longPieces.push(longp); 64719 mixedPieces.push(minp); 64720 mixedPieces.push(shortp); 64721 mixedPieces.push(longp); 64722 } 64723 // Sorting makes sure if one weekday (or abbr) is a prefix of another it 64724 // will match the longer piece. 64725 minPieces.sort(cmpLenRev); 64726 shortPieces.sort(cmpLenRev); 64727 longPieces.sort(cmpLenRev); 64728 mixedPieces.sort(cmpLenRev); 64729 64730 this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); 64731 this._weekdaysShortRegex = this._weekdaysRegex; 64732 this._weekdaysMinRegex = this._weekdaysRegex; 64733 64734 this._weekdaysStrictRegex = new RegExp( 64735 '^(' + longPieces.join('|') + ')', 64736 'i' 64737 ); 64738 this._weekdaysShortStrictRegex = new RegExp( 64739 '^(' + shortPieces.join('|') + ')', 64740 'i' 64741 ); 64742 this._weekdaysMinStrictRegex = new RegExp( 64743 '^(' + minPieces.join('|') + ')', 64744 'i' 64745 ); 64746 } 64747 64748 // FORMATTING 64749 64750 function hFormat() { 64751 return this.hours() % 12 || 12; 64752 } 64753 64754 function kFormat() { 64755 return this.hours() || 24; 64756 } 64757 64758 addFormatToken('H', ['HH', 2], 0, 'hour'); 64759 addFormatToken('h', ['hh', 2], 0, hFormat); 64760 addFormatToken('k', ['kk', 2], 0, kFormat); 64761 64762 addFormatToken('hmm', 0, 0, function () { 64763 return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); 64764 }); 64765 64766 addFormatToken('hmmss', 0, 0, function () { 64767 return ( 64768 '' + 64769 hFormat.apply(this) + 64770 zeroFill(this.minutes(), 2) + 64771 zeroFill(this.seconds(), 2) 64772 ); 64773 }); 64774 64775 addFormatToken('Hmm', 0, 0, function () { 64776 return '' + this.hours() + zeroFill(this.minutes(), 2); 64777 }); 64778 64779 addFormatToken('Hmmss', 0, 0, function () { 64780 return ( 64781 '' + 64782 this.hours() + 64783 zeroFill(this.minutes(), 2) + 64784 zeroFill(this.seconds(), 2) 64785 ); 64786 }); 64787 64788 function meridiem(token, lowercase) { 64789 addFormatToken(token, 0, 0, function () { 64790 return this.localeData().meridiem( 64791 this.hours(), 64792 this.minutes(), 64793 lowercase 64794 ); 64795 }); 64796 } 64797 64798 meridiem('a', true); 64799 meridiem('A', false); 64800 64801 // ALIASES 64802 64803 addUnitAlias('hour', 'h'); 64804 64805 // PRIORITY 64806 addUnitPriority('hour', 13); 64807 64808 // PARSING 64809 64810 function matchMeridiem(isStrict, locale) { 64811 return locale._meridiemParse; 64812 } 64813 64814 addRegexToken('a', matchMeridiem); 64815 addRegexToken('A', matchMeridiem); 64816 addRegexToken('H', match1to2); 64817 addRegexToken('h', match1to2); 64818 addRegexToken('k', match1to2); 64819 addRegexToken('HH', match1to2, match2); 64820 addRegexToken('hh', match1to2, match2); 64821 addRegexToken('kk', match1to2, match2); 64822 64823 addRegexToken('hmm', match3to4); 64824 addRegexToken('hmmss', match5to6); 64825 addRegexToken('Hmm', match3to4); 64826 addRegexToken('Hmmss', match5to6); 64827 64828 addParseToken(['H', 'HH'], HOUR); 64829 addParseToken(['k', 'kk'], function (input, array, config) { 64830 var kInput = toInt(input); 64831 array[HOUR] = kInput === 24 ? 0 : kInput; 64832 }); 64833 addParseToken(['a', 'A'], function (input, array, config) { 64834 config._isPm = config._locale.isPM(input); 64835 config._meridiem = input; 64836 }); 64837 addParseToken(['h', 'hh'], function (input, array, config) { 64838 array[HOUR] = toInt(input); 64839 getParsingFlags(config).bigHour = true; 64840 }); 64841 addParseToken('hmm', function (input, array, config) { 64842 var pos = input.length - 2; 64843 array[HOUR] = toInt(input.substr(0, pos)); 64844 array[MINUTE] = toInt(input.substr(pos)); 64845 getParsingFlags(config).bigHour = true; 64846 }); 64847 addParseToken('hmmss', function (input, array, config) { 64848 var pos1 = input.length - 4, 64849 pos2 = input.length - 2; 64850 array[HOUR] = toInt(input.substr(0, pos1)); 64851 array[MINUTE] = toInt(input.substr(pos1, 2)); 64852 array[SECOND] = toInt(input.substr(pos2)); 64853 getParsingFlags(config).bigHour = true; 64854 }); 64855 addParseToken('Hmm', function (input, array, config) { 64856 var pos = input.length - 2; 64857 array[HOUR] = toInt(input.substr(0, pos)); 64858 array[MINUTE] = toInt(input.substr(pos)); 64859 }); 64860 addParseToken('Hmmss', function (input, array, config) { 64861 var pos1 = input.length - 4, 64862 pos2 = input.length - 2; 64863 array[HOUR] = toInt(input.substr(0, pos1)); 64864 array[MINUTE] = toInt(input.substr(pos1, 2)); 64865 array[SECOND] = toInt(input.substr(pos2)); 64866 }); 64867 64868 // LOCALES 64869 64870 function localeIsPM(input) { 64871 // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays 64872 // Using charAt should be more compatible. 64873 return (input + '').toLowerCase().charAt(0) === 'p'; 64874 } 64875 64876 var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i, 64877 // Setting the hour should keep the time, because the user explicitly 64878 // specified which hour they want. So trying to maintain the same hour (in 64879 // a new timezone) makes sense. Adding/subtracting hours does not follow 64880 // this rule. 64881 getSetHour = makeGetSet('Hours', true); 64882 64883 function localeMeridiem(hours, minutes, isLower) { 64884 if (hours > 11) { 64885 return isLower ? 'pm' : 'PM'; 64886 } else { 64887 return isLower ? 'am' : 'AM'; 64888 } 64889 } 64890 64891 var baseConfig = { 64892 calendar: defaultCalendar, 64893 longDateFormat: defaultLongDateFormat, 64894 invalidDate: defaultInvalidDate, 64895 ordinal: defaultOrdinal, 64896 dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, 64897 relativeTime: defaultRelativeTime, 64898 64899 months: defaultLocaleMonths, 64900 monthsShort: defaultLocaleMonthsShort, 64901 64902 week: defaultLocaleWeek, 64903 64904 weekdays: defaultLocaleWeekdays, 64905 weekdaysMin: defaultLocaleWeekdaysMin, 64906 weekdaysShort: defaultLocaleWeekdaysShort, 64907 64908 meridiemParse: defaultLocaleMeridiemParse, 64909 }; 64910 64911 // internal storage for locale config files 64912 var locales = {}, 64913 localeFamilies = {}, 64914 globalLocale; 64915 64916 function commonPrefix(arr1, arr2) { 64917 var i, 64918 minl = Math.min(arr1.length, arr2.length); 64919 for (i = 0; i < minl; i += 1) { 64920 if (arr1[i] !== arr2[i]) { 64921 return i; 64922 } 64923 } 64924 return minl; 64925 } 64926 64927 function normalizeLocale(key) { 64928 return key ? key.toLowerCase().replace('_', '-') : key; 64929 } 64930 64931 // pick the locale from the array 64932 // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each 64933 // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root 64934 function chooseLocale(names) { 64935 var i = 0, 64936 j, 64937 next, 64938 locale, 64939 split; 64940 64941 while (i < names.length) { 64942 split = normalizeLocale(names[i]).split('-'); 64943 j = split.length; 64944 next = normalizeLocale(names[i + 1]); 64945 next = next ? next.split('-') : null; 64946 while (j > 0) { 64947 locale = loadLocale(split.slice(0, j).join('-')); 64948 if (locale) { 64949 return locale; 64950 } 64951 if ( 64952 next && 64953 next.length >= j && 64954 commonPrefix(split, next) >= j - 1 64955 ) { 64956 //the next array item is better than a shallower substring of this one 64957 break; 64958 } 64959 j--; 64960 } 64961 i++; 64962 } 64963 return globalLocale; 64964 } 64965 64966 function isLocaleNameSane(name) { 64967 // Prevent names that look like filesystem paths, i.e contain '/' or '\' 64968 return name.match('^[^/\\\\]*$') != null; 64969 } 64970 64971 function loadLocale(name) { 64972 var oldLocale = null, 64973 aliasedRequire; 64974 // TODO: Find a better way to register and load all the locales in Node 64975 if ( 64976 locales[name] === undefined && 64977 typeof module !== 'undefined' && 64978 module && 64979 module.exports && 64980 isLocaleNameSane(name) 64981 ) { 64982 try { 64983 oldLocale = globalLocale._abbr; 64984 aliasedRequire = require; 64985 aliasedRequire('./locale/' + name); 64986 getSetGlobalLocale(oldLocale); 64987 } catch (e) { 64988 // mark as not found to avoid repeating expensive file require call causing high CPU 64989 // when trying to find en-US, en_US, en-us for every format call 64990 locales[name] = null; // null means not found 64991 } 64992 } 64993 return locales[name]; 64994 } 64995 64996 // This function will load locale and then set the global locale. If 64997 // no arguments are passed in, it will simply return the current global 64998 // locale key. 64999 function getSetGlobalLocale(key, values) { 65000 var data; 65001 if (key) { 65002 if (isUndefined(values)) { 65003 data = getLocale(key); 65004 } else { 65005 data = defineLocale(key, values); 65006 } 65007 65008 if (data) { 65009 // moment.duration._locale = moment._locale = data; 65010 globalLocale = data; 65011 } else { 65012 if (typeof console !== 'undefined' && console.warn) { 65013 //warn user if arguments are passed but the locale could not be set 65014 console.warn( 65015 'Locale ' + key + ' not found. Did you forget to load it?' 65016 ); 65017 } 65018 } 65019 } 65020 65021 return globalLocale._abbr; 65022 } 65023 65024 function defineLocale(name, config) { 65025 if (config !== null) { 65026 var locale, 65027 parentConfig = baseConfig; 65028 config.abbr = name; 65029 if (locales[name] != null) { 65030 deprecateSimple( 65031 'defineLocaleOverride', 65032 'use moment.updateLocale(localeName, config) to change ' + 65033 'an existing locale. moment.defineLocale(localeName, ' + 65034 'config) should only be used for creating a new locale ' + 65035 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.' 65036 ); 65037 parentConfig = locales[name]._config; 65038 } else if (config.parentLocale != null) { 65039 if (locales[config.parentLocale] != null) { 65040 parentConfig = locales[config.parentLocale]._config; 65041 } else { 65042 locale = loadLocale(config.parentLocale); 65043 if (locale != null) { 65044 parentConfig = locale._config; 65045 } else { 65046 if (!localeFamilies[config.parentLocale]) { 65047 localeFamilies[config.parentLocale] = []; 65048 } 65049 localeFamilies[config.parentLocale].push({ 65050 name: name, 65051 config: config, 65052 }); 65053 return null; 65054 } 65055 } 65056 } 65057 locales[name] = new Locale(mergeConfigs(parentConfig, config)); 65058 65059 if (localeFamilies[name]) { 65060 localeFamilies[name].forEach(function (x) { 65061 defineLocale(x.name, x.config); 65062 }); 65063 } 65064 65065 // backwards compat for now: also set the locale 65066 // make sure we set the locale AFTER all child locales have been 65067 // created, so we won't end up with the child locale set. 65068 getSetGlobalLocale(name); 65069 65070 return locales[name]; 65071 } else { 65072 // useful for testing 65073 delete locales[name]; 65074 return null; 65075 } 65076 } 65077 65078 function updateLocale(name, config) { 65079 if (config != null) { 65080 var locale, 65081 tmpLocale, 65082 parentConfig = baseConfig; 65083 65084 if (locales[name] != null && locales[name].parentLocale != null) { 65085 // Update existing child locale in-place to avoid memory-leaks 65086 locales[name].set(mergeConfigs(locales[name]._config, config)); 65087 } else { 65088 // MERGE 65089 tmpLocale = loadLocale(name); 65090 if (tmpLocale != null) { 65091 parentConfig = tmpLocale._config; 65092 } 65093 config = mergeConfigs(parentConfig, config); 65094 if (tmpLocale == null) { 65095 // updateLocale is called for creating a new locale 65096 // Set abbr so it will have a name (getters return 65097 // undefined otherwise). 65098 config.abbr = name; 65099 } 65100 locale = new Locale(config); 65101 locale.parentLocale = locales[name]; 65102 locales[name] = locale; 65103 } 65104 65105 // backwards compat for now: also set the locale 65106 getSetGlobalLocale(name); 65107 } else { 65108 // pass null for config to unupdate, useful for tests 65109 if (locales[name] != null) { 65110 if (locales[name].parentLocale != null) { 65111 locales[name] = locales[name].parentLocale; 65112 if (name === getSetGlobalLocale()) { 65113 getSetGlobalLocale(name); 65114 } 65115 } else if (locales[name] != null) { 65116 delete locales[name]; 65117 } 65118 } 65119 } 65120 return locales[name]; 65121 } 65122 65123 // returns locale data 65124 function getLocale(key) { 65125 var locale; 65126 65127 if (key && key._locale && key._locale._abbr) { 65128 key = key._locale._abbr; 65129 } 65130 65131 if (!key) { 65132 return globalLocale; 65133 } 65134 65135 if (!isArray(key)) { 65136 //short-circuit everything else 65137 locale = loadLocale(key); 65138 if (locale) { 65139 return locale; 65140 } 65141 key = [key]; 65142 } 65143 65144 return chooseLocale(key); 65145 } 65146 65147 function listLocales() { 65148 return keys(locales); 65149 } 65150 65151 function checkOverflow(m) { 65152 var overflow, 65153 a = m._a; 65154 65155 if (a && getParsingFlags(m).overflow === -2) { 65156 overflow = 65157 a[MONTH] < 0 || a[MONTH] > 11 65158 ? MONTH 65159 : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) 65160 ? DATE 65161 : a[HOUR] < 0 || 65162 a[HOUR] > 24 || 65163 (a[HOUR] === 24 && 65164 (a[MINUTE] !== 0 || 65165 a[SECOND] !== 0 || 65166 a[MILLISECOND] !== 0)) 65167 ? HOUR 65168 : a[MINUTE] < 0 || a[MINUTE] > 59 65169 ? MINUTE 65170 : a[SECOND] < 0 || a[SECOND] > 59 65171 ? SECOND 65172 : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 65173 ? MILLISECOND
vendor: 9,346 bytes, lines 65174-65457
65174 : -1; 65175 65176 if ( 65177 getParsingFlags(m)._overflowDayOfYear && 65178 (overflow < YEAR || overflow > DATE) 65179 ) { 65180 overflow = DATE; 65181 } 65182 if (getParsingFlags(m)._overflowWeeks && overflow === -1) { 65183 overflow = WEEK; 65184 } 65185 if (getParsingFlags(m)._overflowWeekday && overflow === -1) { 65186 overflow = WEEKDAY; 65187 } 65188 65189 getParsingFlags(m).overflow = overflow; 65190 } 65191 65192 return m; 65193 } 65194 65195 // iso 8601 regex 65196 // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) 65197 var extendedIsoRegex = 65198 /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, 65199 basicIsoRegex = 65200 /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, 65201 tzRegex = /Z|[+-]\d\d(?::?\d\d)?/, 65202 isoDates = [ 65203 ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], 65204 ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], 65205 ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], 65206 ['GGGG-[W]WW', /\d{4}-W\d\d/, false], 65207 ['YYYY-DDD', /\d{4}-\d{3}/], 65208 ['YYYY-MM', /\d{4}-\d\d/, false], 65209 ['YYYYYYMMDD', /[+-]\d{10}/], 65210 ['YYYYMMDD', /\d{8}/], 65211 ['GGGG[W]WWE', /\d{4}W\d{3}/], 65212 ['GGGG[W]WW', /\d{4}W\d{2}/, false], 65213 ['YYYYDDD', /\d{7}/], 65214 ['YYYYMM', /\d{6}/, false], 65215 ['YYYY', /\d{4}/, false], 65216 ], 65217 // iso time formats and regexes 65218 isoTimes = [ 65219 ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], 65220 ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], 65221 ['HH:mm:ss', /\d\d:\d\d:\d\d/], 65222 ['HH:mm', /\d\d:\d\d/], 65223 ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], 65224 ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], 65225 ['HHmmss', /\d\d\d\d\d\d/], 65226 ['HHmm', /\d\d\d\d/], 65227 ['HH', /\d\d/], 65228 ], 65229 aspNetJsonRegex = /^\/?Date\((-?\d+)/i, 65230 // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 65231 rfc2822 = 65232 /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, 65233 obsOffsets = { 65234 UT: 0, 65235 GMT: 0, 65236 EDT: -4 * 60, 65237 EST: -5 * 60, 65238 CDT: -5 * 60, 65239 CST: -6 * 60, 65240 MDT: -6 * 60, 65241 MST: -7 * 60, 65242 PDT: -7 * 60, 65243 PST: -8 * 60, 65244 }; 65245 65246 // date from iso format 65247 function configFromISO(config) { 65248 var i, 65249 l, 65250 string = config._i, 65251 match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), 65252 allowTime, 65253 dateFormat, 65254 timeFormat, 65255 tzFormat, 65256 isoDatesLen = isoDates.length, 65257 isoTimesLen = isoTimes.length; 65258 65259 if (match) { 65260 getParsingFlags(config).iso = true; 65261 for (i = 0, l = isoDatesLen; i < l; i++) { 65262 if (isoDates[i][1].exec(match[1])) { 65263 dateFormat = isoDates[i][0]; 65264 allowTime = isoDates[i][2] !== false; 65265 break; 65266 } 65267 } 65268 if (dateFormat == null) { 65269 config._isValid = false; 65270 return; 65271 } 65272 if (match[3]) { 65273 for (i = 0, l = isoTimesLen; i < l; i++) { 65274 if (isoTimes[i][1].exec(match[3])) { 65275 // match[2] should be 'T' or space 65276 timeFormat = (match[2] || ' ') + isoTimes[i][0]; 65277 break; 65278 } 65279 } 65280 if (timeFormat == null) { 65281 config._isValid = false; 65282 return; 65283 } 65284 } 65285 if (!allowTime && timeFormat != null) { 65286 config._isValid = false; 65287 return; 65288 } 65289 if (match[4]) { 65290 if (tzRegex.exec(match[4])) { 65291 tzFormat = 'Z'; 65292 } else { 65293 config._isValid = false; 65294 return; 65295 } 65296 } 65297 config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); 65298 configFromStringAndFormat(config); 65299 } else { 65300 config._isValid = false; 65301 } 65302 } 65303 65304 function extractFromRFC2822Strings( 65305 yearStr, 65306 monthStr, 65307 dayStr, 65308 hourStr, 65309 minuteStr, 65310 secondStr 65311 ) { 65312 var result = [ 65313 untruncateYear(yearStr), 65314 defaultLocaleMonthsShort.indexOf(monthStr), 65315 parseInt(dayStr, 10), 65316 parseInt(hourStr, 10), 65317 parseInt(minuteStr, 10), 65318 ]; 65319 65320 if (secondStr) { 65321 result.push(parseInt(secondStr, 10)); 65322 } 65323 65324 return result; 65325 } 65326 65327 function untruncateYear(yearStr) { 65328 var year = parseInt(yearStr, 10); 65329 if (year <= 49) { 65330 return 2000 + year; 65331 } else if (year <= 999) { 65332 return 1900 + year; 65333 } 65334 return year; 65335 } 65336 65337 function preprocessRFC2822(s) { 65338 // Remove comments and folding whitespace and replace multiple-spaces with a single space 65339 return s 65340 .replace(/\([^()]*\)|[\n\t]/g, ' ') 65341 .replace(/(\s\s+)/g, ' ') 65342 .replace(/^\s\s*/, '') 65343 .replace(/\s\s*$/, ''); 65344 } 65345 65346 function checkWeekday(weekdayStr, parsedInput, config) { 65347 if (weekdayStr) { 65348 // TODO: Replace the vanilla JS Date object with an independent day-of-week check. 65349 var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), 65350 weekdayActual = new Date( 65351 parsedInput[0], 65352 parsedInput[1], 65353 parsedInput[2] 65354 ).getDay(); 65355 if (weekdayProvided !== weekdayActual) { 65356 getParsingFlags(config).weekdayMismatch = true; 65357 config._isValid = false; 65358 return false; 65359 } 65360 } 65361 return true; 65362 } 65363 65364 function calculateOffset(obsOffset, militaryOffset, numOffset) { 65365 if (obsOffset) { 65366 return obsOffsets[obsOffset]; 65367 } else if (militaryOffset) { 65368 // the only allowed military tz is Z 65369 return 0; 65370 } else { 65371 var hm = parseInt(numOffset, 10), 65372 m = hm % 100, 65373 h = (hm - m) / 100; 65374 return h * 60 + m; 65375 } 65376 } 65377 65378 // date and time from ref 2822 format 65379 function configFromRFC2822(config) { 65380 var match = rfc2822.exec(preprocessRFC2822(config._i)), 65381 parsedArray; 65382 if (match) { 65383 parsedArray = extractFromRFC2822Strings( 65384 match[4], 65385 match[3], 65386 match[2], 65387 match[5], 65388 match[6], 65389 match[7] 65390 ); 65391 if (!checkWeekday(match[1], parsedArray, config)) { 65392 return; 65393 } 65394 65395 config._a = parsedArray; 65396 config._tzm = calculateOffset(match[8], match[9], match[10]); 65397 65398 config._d = createUTCDate.apply(null, config._a); 65399 config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); 65400 65401 getParsingFlags(config).rfc2822 = true; 65402 } else { 65403 config._isValid = false; 65404 } 65405 } 65406 65407 // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict 65408 function configFromString(config) { 65409 var matched = aspNetJsonRegex.exec(config._i); 65410 if (matched !== null) { 65411 config._d = new Date(+matched[1]); 65412 return; 65413 } 65414 65415 configFromISO(config); 65416 if (config._isValid === false) { 65417 delete config._isValid; 65418 } else { 65419 return; 65420 } 65421 65422 configFromRFC2822(config); 65423 if (config._isValid === false) { 65424 delete config._isValid; 65425 } else { 65426 return; 65427 } 65428 65429 if (config._strict) { 65430 config._isValid = false; 65431 } else { 65432 // Final attempt, use Input Fallback 65433 hooks.createFromInputFallback(config); 65434 } 65435 } 65436 65437 hooks.createFromInputFallback = deprecate( 65438 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 65439 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 65440 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', 65441 function (config) { 65442 config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); 65443 } 65444 ); 65445 65446 // Pick the first defined of two or three arguments. 65447 function defaults(a, b, c) { 65448 if (a != null) { 65449 return a; 65450 } 65451 if (b != null) { 65452 return b; 65453 } 65454 return c; 65455 } 65456 65457 function currentDateArray(config
vendor: 87,494 bytes, lines 65457-68333
65457) { 65458 // hooks is actually the exported moment object 65459 var nowValue = new Date(hooks.now()); 65460 if (config._useUTC) { 65461 return [ 65462 nowValue.getUTCFullYear(), 65463 nowValue.getUTCMonth(), 65464 nowValue.getUTCDate(), 65465 ]; 65466 } 65467 return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; 65468 } 65469 65470 // convert an array to a date. 65471 // the array should mirror the parameters below 65472 // note: all values past the year are optional and will default to the lowest possible value. 65473 // [year, month, day , hour, minute, second, millisecond] 65474 function configFromArray(config) { 65475 var i, 65476 date, 65477 input = [], 65478 currentDate, 65479 expectedWeekday, 65480 yearToUse; 65481 65482 if (config._d) { 65483 return; 65484 } 65485 65486 currentDate = currentDateArray(config); 65487 65488 //compute day of the year from weeks and weekdays 65489 if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { 65490 dayOfYearFromWeekInfo(config); 65491 } 65492 65493 //if the day of the year is set, figure out what it is 65494 if (config._dayOfYear != null) { 65495 yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); 65496 65497 if ( 65498 config._dayOfYear > daysInYear(yearToUse) || 65499 config._dayOfYear === 0 65500 ) { 65501 getParsingFlags(config)._overflowDayOfYear = true; 65502 } 65503 65504 date = createUTCDate(yearToUse, 0, config._dayOfYear); 65505 config._a[MONTH] = date.getUTCMonth(); 65506 config._a[DATE] = date.getUTCDate(); 65507 } 65508 65509 // Default to current date. 65510 // * if no year, month, day of month are given, default to today 65511 // * if day of month is given, default month and year 65512 // * if month is given, default only year 65513 // * if year is given, don't default anything 65514 for (i = 0; i < 3 && config._a[i] == null; ++i) { 65515 config._a[i] = input[i] = currentDate[i]; 65516 } 65517 65518 // Zero out whatever was not defaulted, including time 65519 for (; i < 7; i++) { 65520 config._a[i] = input[i] = 65521 config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i]; 65522 } 65523 65524 // Check for 24:00:00.000 65525 if ( 65526 config._a[HOUR] === 24 && 65527 config._a[MINUTE] === 0 && 65528 config._a[SECOND] === 0 && 65529 config._a[MILLISECOND] === 0 65530 ) { 65531 config._nextDay = true; 65532 config._a[HOUR] = 0; 65533 } 65534 65535 config._d = (config._useUTC ? createUTCDate : createDate).apply( 65536 null, 65537 input 65538 ); 65539 expectedWeekday = config._useUTC 65540 ? config._d.getUTCDay() 65541 : config._d.getDay(); 65542 65543 // Apply timezone offset from input. The actual utcOffset can be changed 65544 // with parseZone. 65545 if (config._tzm != null) { 65546 config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); 65547 } 65548 65549 if (config._nextDay) { 65550 config._a[HOUR] = 24; 65551 } 65552 65553 // check for mismatching day of week 65554 if ( 65555 config._w && 65556 typeof config._w.d !== 'undefined' && 65557 config._w.d !== expectedWeekday 65558 ) { 65559 getParsingFlags(config).weekdayMismatch = true; 65560 } 65561 } 65562 65563 function dayOfYearFromWeekInfo(config) { 65564 var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek; 65565 65566 w = config._w; 65567 if (w.GG != null || w.W != null || w.E != null) { 65568 dow = 1; 65569 doy = 4; 65570 65571 // TODO: We need to take the current isoWeekYear, but that depends on 65572 // how we interpret now (local, utc, fixed offset). So create 65573 // a now version of current config (take local/utc/offset flags, and 65574 // create now). 65575 weekYear = defaults( 65576 w.GG, 65577 config._a[YEAR], 65578 weekOfYear(createLocal(), 1, 4).year 65579 ); 65580 week = defaults(w.W, 1); 65581 weekday = defaults(w.E, 1); 65582 if (weekday < 1 || weekday > 7) { 65583 weekdayOverflow = true; 65584 } 65585 } else { 65586 dow = config._locale._week.dow; 65587 doy = config._locale._week.doy; 65588 65589 curWeek = weekOfYear(createLocal(), dow, doy); 65590 65591 weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); 65592 65593 // Default to current week. 65594 week = defaults(w.w, curWeek.week); 65595 65596 if (w.d != null) { 65597 // weekday -- low day numbers are considered next week 65598 weekday = w.d; 65599 if (weekday < 0 || weekday > 6) { 65600 weekdayOverflow = true; 65601 } 65602 } else if (w.e != null) { 65603 // local weekday -- counting starts from beginning of week 65604 weekday = w.e + dow; 65605 if (w.e < 0 || w.e > 6) { 65606 weekdayOverflow = true; 65607 } 65608 } else { 65609 // default to beginning of week 65610 weekday = dow; 65611 } 65612 } 65613 if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { 65614 getParsingFlags(config)._overflowWeeks = true; 65615 } else if (weekdayOverflow != null) { 65616 getParsingFlags(config)._overflowWeekday = true; 65617 } else { 65618 temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); 65619 config._a[YEAR] = temp.year; 65620 config._dayOfYear = temp.dayOfYear; 65621 } 65622 } 65623 65624 // constant that refers to the ISO standard 65625 hooks.ISO_8601 = function () {}; 65626 65627 // constant that refers to the RFC 2822 form 65628 hooks.RFC_2822 = function () {}; 65629 65630 // date from string and format string 65631 function configFromStringAndFormat(config) { 65632 // TODO: Move this to another part of the creation flow to prevent circular deps 65633 if (config._f === hooks.ISO_8601) { 65634 configFromISO(config); 65635 return; 65636 } 65637 if (config._f === hooks.RFC_2822) { 65638 configFromRFC2822(config); 65639 return; 65640 } 65641 config._a = []; 65642 getParsingFlags(config).empty = true; 65643 65644 // This array is used to make a Date, either with `new Date` or `Date.UTC` 65645 var string = '' + config._i, 65646 i, 65647 parsedInput, 65648 tokens, 65649 token, 65650 skipped, 65651 stringLength = string.length, 65652 totalParsedInputLength = 0, 65653 era, 65654 tokenLen; 65655 65656 tokens = 65657 expandFormat(config._f, config._locale).match(formattingTokens) || []; 65658 tokenLen = tokens.length; 65659 for (i = 0; i < tokenLen; i++) { 65660 token = tokens[i]; 65661 parsedInput = (string.match(getParseRegexForToken(token, config)) || 65662 [])[0]; 65663 if (parsedInput) { 65664 skipped = string.substr(0, string.indexOf(parsedInput)); 65665 if (skipped.length > 0) { 65666 getParsingFlags(config).unusedInput.push(skipped); 65667 } 65668 string = string.slice( 65669 string.indexOf(parsedInput) + parsedInput.length 65670 ); 65671 totalParsedInputLength += parsedInput.length; 65672 } 65673 // don't parse if it's not a known token 65674 if (formatTokenFunctions[token]) { 65675 if (parsedInput) { 65676 getParsingFlags(config).empty = false; 65677 } else { 65678 getParsingFlags(config).unusedTokens.push(token); 65679 } 65680 addTimeToArrayFromToken(token, parsedInput, config); 65681 } else if (config._strict && !parsedInput) { 65682 getParsingFlags(config).unusedTokens.push(token); 65683 } 65684 } 65685 65686 // add remaining unparsed input length to the string 65687 getParsingFlags(config).charsLeftOver = 65688 stringLength - totalParsedInputLength; 65689 if (string.length > 0) { 65690 getParsingFlags(config).unusedInput.push(string); 65691 } 65692 65693 // clear _12h flag if hour is <= 12 65694 if ( 65695 config._a[HOUR] <= 12 && 65696 getParsingFlags(config).bigHour === true && 65697 config._a[HOUR] > 0 65698 ) { 65699 getParsingFlags(config).bigHour = undefined; 65700 } 65701 65702 getParsingFlags(config).parsedDateParts = config._a.slice(0); 65703 getParsingFlags(config).meridiem = config._meridiem; 65704 // handle meridiem 65705 config._a[HOUR] = meridiemFixWrap( 65706 config._locale, 65707 config._a[HOUR], 65708 config._meridiem 65709 ); 65710 65711 // handle era 65712 era = getParsingFlags(config).era; 65713 if (era !== null) { 65714 config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]); 65715 } 65716 65717 configFromArray(config); 65718 checkOverflow(config); 65719 } 65720 65721 function meridiemFixWrap(locale, hour, meridiem) { 65722 var isPm; 65723 65724 if (meridiem == null) { 65725 // nothing to do 65726 return hour; 65727 } 65728 if (locale.meridiemHour != null) { 65729 return locale.meridiemHour(hour, meridiem); 65730 } else if (locale.isPM != null) { 65731 // Fallback 65732 isPm = locale.isPM(meridiem); 65733 if (isPm && hour < 12) { 65734 hour += 12; 65735 } 65736 if (!isPm && hour === 12) { 65737 hour = 0; 65738 } 65739 return hour; 65740 } else { 65741 // this is not supposed to happen 65742 return hour; 65743 } 65744 } 65745 65746 // date from string and array of format strings 65747 function configFromStringAndArray(config) { 65748 var tempConfig, 65749 bestMoment, 65750 scoreToBeat, 65751 i, 65752 currentScore, 65753 validFormatFound, 65754 bestFormatIsValid = false, 65755 configfLen = config._f.length; 65756 65757 if (configfLen === 0) { 65758 getParsingFlags(config).invalidFormat = true; 65759 config._d = new Date(NaN); 65760 return; 65761 } 65762 65763 for (i = 0; i < configfLen; i++) { 65764 currentScore = 0; 65765 validFormatFound = false; 65766 tempConfig = copyConfig({}, config); 65767 if (config._useUTC != null) { 65768 tempConfig._useUTC = config._useUTC; 65769 } 65770 tempConfig._f = config._f[i]; 65771 configFromStringAndFormat(tempConfig); 65772 65773 if (isValid(tempConfig)) { 65774 validFormatFound = true; 65775 } 65776 65777 // if there is any input that was not parsed add a penalty for that format 65778 currentScore += getParsingFlags(tempConfig).charsLeftOver; 65779 65780 //or tokens 65781 currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; 65782 65783 getParsingFlags(tempConfig).score = currentScore; 65784 65785 if (!bestFormatIsValid) { 65786 if ( 65787 scoreToBeat == null || 65788 currentScore < scoreToBeat || 65789 validFormatFound 65790 ) { 65791 scoreToBeat = currentScore; 65792 bestMoment = tempConfig; 65793 if (validFormatFound) { 65794 bestFormatIsValid = true; 65795 } 65796 } 65797 } else { 65798 if (currentScore < scoreToBeat) { 65799 scoreToBeat = currentScore; 65800 bestMoment = tempConfig; 65801 } 65802 } 65803 } 65804 65805 extend(config, bestMoment || tempConfig); 65806 } 65807 65808 function configFromObject(config) { 65809 if (config._d) { 65810 return; 65811 } 65812 65813 var i = normalizeObjectUnits(config._i), 65814 dayOrDate = i.day === undefined ? i.date : i.day; 65815 config._a = map( 65816 [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], 65817 function (obj) { 65818 return obj && parseInt(obj, 10); 65819 } 65820 ); 65821 65822 configFromArray(config); 65823 } 65824 65825 function createFromConfig(config) { 65826 var res = new Moment(checkOverflow(prepareConfig(config))); 65827 if (res._nextDay) { 65828 // Adding is smart enough around DST 65829 res.add(1, 'd'); 65830 res._nextDay = undefined; 65831 } 65832 65833 return res; 65834 } 65835 65836 function prepareConfig(config) { 65837 var input = config._i, 65838 format = config._f; 65839 65840 config._locale = config._locale || getLocale(config._l); 65841 65842 if (input === null || (format === undefined && input === '')) { 65843 return createInvalid({ nullInput: true }); 65844 } 65845 65846 if (typeof input === 'string') { 65847 config._i = input = config._locale.preparse(input); 65848 } 65849 65850 if (isMoment(input)) { 65851 return new Moment(checkOverflow(input)); 65852 } else if (isDate(input)) { 65853 config._d = input; 65854 } else if (isArray(format)) { 65855 configFromStringAndArray(config); 65856 } else if (format) { 65857 configFromStringAndFormat(config); 65858 } else { 65859 configFromInput(config); 65860 } 65861 65862 if (!isValid(config)) { 65863 config._d = null; 65864 } 65865 65866 return config; 65867 } 65868 65869 function configFromInput(config) { 65870 var input = config._i; 65871 if (isUndefined(input)) { 65872 config._d = new Date(hooks.now()); 65873 } else if (isDate(input)) { 65874 config._d = new Date(input.valueOf()); 65875 } else if (typeof input === 'string') { 65876 configFromString(config); 65877 } else if (isArray(input)) { 65878 config._a = map(input.slice(0), function (obj) { 65879 return parseInt(obj, 10); 65880 }); 65881 configFromArray(config); 65882 } else if (isObject(input)) { 65883 configFromObject(config); 65884 } else if (isNumber(input)) { 65885 // from milliseconds 65886 config._d = new Date(input); 65887 } else { 65888 hooks.createFromInputFallback(config); 65889 } 65890 } 65891 65892 function createLocalOrUTC(input, format, locale, strict, isUTC) { 65893 var c = {}; 65894 65895 if (format === true || format === false) { 65896 strict = format; 65897 format = undefined; 65898 } 65899 65900 if (locale === true || locale === false) { 65901 strict = locale; 65902 locale = undefined; 65903 } 65904 65905 if ( 65906 (isObject(input) && isObjectEmpty(input)) || 65907 (isArray(input) && input.length === 0) 65908 ) { 65909 input = undefined; 65910 } 65911 // object construction must be done this way. 65912 // https://github.com/moment/moment/issues/1423 65913 c._isAMomentObject = true; 65914 c._useUTC = c._isUTC = isUTC; 65915 c._l = locale; 65916 c._i = input; 65917 c._f = format; 65918 c._strict = strict; 65919 65920 return createFromConfig(c); 65921 } 65922 65923 function createLocal(input, format, locale, strict) { 65924 return createLocalOrUTC(input, format, locale, strict, false); 65925 } 65926 65927 var prototypeMin = deprecate( 65928 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', 65929 function () { 65930 var other = createLocal.apply(null, arguments); 65931 if (this.isValid() && other.isValid()) { 65932 return other < this ? this : other; 65933 } else { 65934 return createInvalid(); 65935 } 65936 } 65937 ), 65938 prototypeMax = deprecate( 65939 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', 65940 function () { 65941 var other = createLocal.apply(null, arguments); 65942 if (this.isValid() && other.isValid()) { 65943 return other > this ? this : other; 65944 } else { 65945 return createInvalid(); 65946 } 65947 } 65948 ); 65949 65950 // Pick a moment m from moments so that m[fn](other) is true for all 65951 // other. This relies on the function fn to be transitive. 65952 // 65953 // moments should either be an array of moment objects or an array, whose 65954 // first element is an array of moment objects. 65955 function pickBy(fn, moments) { 65956 var res, i; 65957 if (moments.length === 1 && isArray(moments[0])) { 65958 moments = moments[0]; 65959 } 65960 if (!moments.length) { 65961 return createLocal(); 65962 } 65963 res = moments[0]; 65964 for (i = 1; i < moments.length; ++i) { 65965 if (!moments[i].isValid() || moments[i][fn](res)) { 65966 res = moments[i]; 65967 } 65968 } 65969 return res; 65970 } 65971 65972 // TODO: Use [].sort instead? 65973 function min() { 65974 var args = [].slice.call(arguments, 0); 65975 65976 return pickBy('isBefore', args); 65977 } 65978 65979 function max() { 65980 var args = [].slice.call(arguments, 0); 65981 65982 return pickBy('isAfter', args); 65983 } 65984 65985 var now = function () { 65986 return Date.now ? Date.now() : +new Date(); 65987 }; 65988 65989 var ordering = [ 65990 'year', 65991 'quarter', 65992 'month', 65993 'week', 65994 'day', 65995 'hour', 65996 'minute', 65997 'second', 65998 'millisecond', 65999 ]; 66000 66001 function isDurationValid(m) { 66002 var key, 66003 unitHasDecimal = false, 66004 i, 66005 orderLen = ordering.length; 66006 for (key in m) { 66007 if ( 66008 hasOwnProp(m, key) && 66009 !( 66010 indexOf.call(ordering, key) !== -1 && 66011 (m[key] == null || !isNaN(m[key])) 66012 ) 66013 ) { 66014 return false; 66015 } 66016 } 66017 66018 for (i = 0; i < orderLen; ++i) { 66019 if (m[ordering[i]]) { 66020 if (unitHasDecimal) { 66021 return false; // only allow non-integers for smallest unit 66022 } 66023 if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { 66024 unitHasDecimal = true; 66025 } 66026 } 66027 } 66028 66029 return true; 66030 } 66031 66032 function isValid$1() { 66033 return this._isValid; 66034 } 66035 66036 function createInvalid$1() { 66037 return createDuration(NaN); 66038 } 66039 66040 function Duration(duration) { 66041 var normalizedInput = normalizeObjectUnits(duration), 66042 years = normalizedInput.year || 0, 66043 quarters = normalizedInput.quarter || 0, 66044 months = normalizedInput.month || 0, 66045 weeks = normalizedInput.week || normalizedInput.isoWeek || 0, 66046 days = normalizedInput.day || 0, 66047 hours = normalizedInput.hour || 0, 66048 minutes = normalizedInput.minute || 0, 66049 seconds = normalizedInput.second || 0, 66050 milliseconds = normalizedInput.millisecond || 0; 66051 66052 this._isValid = isDurationValid(normalizedInput); 66053 66054 // representation for dateAddRemove 66055 this._milliseconds = 66056 +milliseconds + 66057 seconds * 1e3 + // 1000 66058 minutes * 6e4 + // 1000 * 60 66059 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 66060 // Because of dateAddRemove treats 24 hours as different from a 66061 // day when working around DST, we need to store them separately 66062 this._days = +days + weeks * 7; 66063 // It is impossible to translate months into days without knowing 66064 // which months you are are talking about, so we have to store 66065 // it separately. 66066 this._months = +months + quarters * 3 + years * 12; 66067 66068 this._data = {}; 66069 66070 this._locale = getLocale(); 66071 66072 this._bubble(); 66073 } 66074 66075 function isDuration(obj) { 66076 return obj instanceof Duration; 66077 } 66078 66079 function absRound(number) { 66080 if (number < 0) { 66081 return Math.round(-1 * number) * -1; 66082 } else { 66083 return Math.round(number); 66084 } 66085 } 66086 66087 // compare two arrays, return the number of differences 66088 function compareArrays(array1, array2, dontConvert) { 66089 var len = Math.min(array1.length, array2.length), 66090 lengthDiff = Math.abs(array1.length - array2.length), 66091 diffs = 0, 66092 i; 66093 for (i = 0; i < len; i++) { 66094 if ( 66095 (dontConvert && array1[i] !== array2[i]) || 66096 (!dontConvert && toInt(array1[i]) !== toInt(array2[i])) 66097 ) { 66098 diffs++; 66099 } 66100 } 66101 return diffs + lengthDiff; 66102 } 66103 66104 // FORMATTING 66105 66106 function offset(token, separator) { 66107 addFormatToken(token, 0, 0, function () { 66108 var offset = this.utcOffset(), 66109 sign = '+'; 66110 if (offset < 0) { 66111 offset = -offset; 66112 sign = '-'; 66113 } 66114 return ( 66115 sign + 66116 zeroFill(~~(offset / 60), 2) + 66117 separator + 66118 zeroFill(~~offset % 60, 2) 66119 ); 66120 }); 66121 } 66122 66123 offset('Z', ':'); 66124 offset('ZZ', ''); 66125 66126 // PARSING 66127 66128 addRegexToken('Z', matchShortOffset); 66129 addRegexToken('ZZ', matchShortOffset); 66130 addParseToken(['Z', 'ZZ'], function (input, array, config) { 66131 config._useUTC = true; 66132 config._tzm = offsetFromString(matchShortOffset, input); 66133 }); 66134 66135 // HELPERS 66136 66137 // timezone chunker 66138 // '+10:00' > ['10', '00'] 66139 // '-1530' > ['-15', '30'] 66140 var chunkOffset = /([\+\-]|\d\d)/gi; 66141 66142 function offsetFromString(matcher, string) { 66143 var matches = (string || '').match(matcher), 66144 chunk, 66145 parts, 66146 minutes; 66147 66148 if (matches === null) { 66149 return null; 66150 } 66151 66152 chunk = matches[matches.length - 1] || []; 66153 parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; 66154 minutes = +(parts[1] * 60) + toInt(parts[2]); 66155 66156 return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes; 66157 } 66158 66159 // Return a moment from input, that is local/utc/zone equivalent to model. 66160 function cloneWithOffset(input, model) { 66161 var res, diff; 66162 if (model._isUTC) { 66163 res = model.clone(); 66164 diff = 66165 (isMoment(input) || isDate(input) 66166 ? input.valueOf() 66167 : createLocal(input).valueOf()) - res.valueOf(); 66168 // Use low-level api, because this fn is low-level api. 66169 res._d.setTime(res._d.valueOf() + diff); 66170 hooks.updateOffset(res, false); 66171 return res; 66172 } else { 66173 return createLocal(input).local(); 66174 } 66175 } 66176 66177 function getDateOffset(m) { 66178 // On Firefox.24 Date#getTimezoneOffset returns a floating point. 66179 // https://github.com/moment/moment/pull/1871 66180 return -Math.round(m._d.getTimezoneOffset()); 66181 } 66182 66183 // HOOKS 66184 66185 // This function will be called whenever a moment is mutated. 66186 // It is intended to keep the offset in sync with the timezone. 66187 hooks.updateOffset = function () {}; 66188 66189 // MOMENTS 66190 66191 // keepLocalTime = true means only change the timezone, without 66192 // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> 66193 // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset 66194 // +0200, so we adjust the time as needed, to be valid. 66195 // 66196 // Keeping the time actually adds/subtracts (one hour) 66197 // from the actual represented time. That is why we call updateOffset 66198 // a second time. In case it wants us to change the offset again 66199 // _changeInProgress == true case, then we have to adjust, because 66200 // there is no such time in the given timezone. 66201 function getSetOffset(input, keepLocalTime, keepMinutes) { 66202 var offset = this._offset || 0, 66203 localAdjust; 66204 if (!this.isValid()) { 66205 return input != null ? this : NaN; 66206 } 66207 if (input != null) { 66208 if (typeof input === 'string') { 66209 input = offsetFromString(matchShortOffset, input); 66210 if (input === null) { 66211 return this; 66212 } 66213 } else if (Math.abs(input) < 16 && !keepMinutes) { 66214 input = input * 60; 66215 } 66216 if (!this._isUTC && keepLocalTime) { 66217 localAdjust = getDateOffset(this); 66218 } 66219 this._offset = input; 66220 this._isUTC = true; 66221 if (localAdjust != null) { 66222 this.add(localAdjust, 'm'); 66223 } 66224 if (offset !== input) { 66225 if (!keepLocalTime || this._changeInProgress) { 66226 addSubtract( 66227 this, 66228 createDuration(input - offset, 'm'), 66229 1, 66230 false 66231 ); 66232 } else if (!this._changeInProgress) { 66233 this._changeInProgress = true; 66234 hooks.updateOffset(this, true); 66235 this._changeInProgress = null; 66236 } 66237 } 66238 return this; 66239 } else { 66240 return this._isUTC ? offset : getDateOffset(this); 66241 } 66242 } 66243 66244 function getSetZone(input, keepLocalTime) { 66245 if (input != null) { 66246 if (typeof input !== 'string') { 66247 input = -input; 66248 } 66249 66250 this.utcOffset(input, keepLocalTime); 66251 66252 return this; 66253 } else { 66254 return -this.utcOffset(); 66255 } 66256 } 66257 66258 function setOffsetToUTC(keepLocalTime) { 66259 return this.utcOffset(0, keepLocalTime); 66260 } 66261 66262 function setOffsetToLocal(keepLocalTime) { 66263 if (this._isUTC) { 66264 this.utcOffset(0, keepLocalTime); 66265 this._isUTC = false; 66266 66267 if (keepLocalTime) { 66268 this.subtract(getDateOffset(this), 'm'); 66269 } 66270 } 66271 return this; 66272 } 66273 66274 function setOffsetToParsedOffset() { 66275 if (this._tzm != null) { 66276 this.utcOffset(this._tzm, false, true); 66277 } else if (typeof this._i === 'string') { 66278 var tZone = offsetFromString(matchOffset, this._i); 66279 if (tZone != null) { 66280 this.utcOffset(tZone); 66281 } else { 66282 this.utcOffset(0, true); 66283 } 66284 } 66285 return this; 66286 } 66287 66288 function hasAlignedHourOffset(input) { 66289 if (!this.isValid()) { 66290 return false; 66291 } 66292 input = input ? createLocal(input).utcOffset() : 0; 66293 66294 return (this.utcOffset() - input) % 60 === 0; 66295 } 66296 66297 function isDaylightSavingTime() { 66298 return ( 66299 this.utcOffset() > this.clone().month(0).utcOffset() || 66300 this.utcOffset() > this.clone().month(5).utcOffset() 66301 ); 66302 } 66303 66304 function isDaylightSavingTimeShifted() { 66305 if (!isUndefined(this._isDSTShifted)) { 66306 return this._isDSTShifted; 66307 } 66308 66309 var c = {}, 66310 other; 66311 66312 copyConfig(c, this); 66313 c = prepareConfig(c); 66314 66315 if (c._a) { 66316 other = c._isUTC ? createUTC(c._a) : createLocal(c._a); 66317 this._isDSTShifted = 66318 this.isValid() && compareArrays(c._a, other.toArray()) > 0; 66319 } else { 66320 this._isDSTShifted = false; 66321 } 66322 66323 return this._isDSTShifted; 66324 } 66325 66326 function isLocal() { 66327 return this.isValid() ? !this._isUTC : false; 66328 } 66329 66330 function isUtcOffset() { 66331 return this.isValid() ? this._isUTC : false; 66332 } 66333 66334 function isUtc() { 66335 return this.isValid() ? this._isUTC && this._offset === 0 : false; 66336 } 66337 66338 // ASP.NET json date format regex 66339 var aspNetRegex = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, 66340 // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html 66341 // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere 66342 // and further modified to allow for strings containing both week and day 66343 isoRegex = 66344 /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; 66345 66346 function createDuration(input, key) { 66347 var duration = input, 66348 // matching against regexp is expensive, do it on demand 66349 match = null, 66350 sign, 66351 ret, 66352 diffRes; 66353 66354 if (isDuration(input)) { 66355 duration = { 66356 ms: input._milliseconds, 66357 d: input._days, 66358 M: input._months, 66359 }; 66360 } else if (isNumber(input) || !isNaN(+input)) { 66361 duration = {}; 66362 if (key) { 66363 duration[key] = +input; 66364 } else { 66365 duration.milliseconds = +input; 66366 } 66367 } else if ((match = aspNetRegex.exec(input))) { 66368 sign = match[1] === '-' ? -1 : 1; 66369 duration = { 66370 y: 0, 66371 d: toInt(match[DATE]) * sign, 66372 h: toInt(match[HOUR]) * sign, 66373 m: toInt(match[MINUTE]) * sign, 66374 s: toInt(match[SECOND]) * sign, 66375 ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match 66376 }; 66377 } else if ((match = isoRegex.exec(input))) { 66378 sign = match[1] === '-' ? -1 : 1; 66379 duration = { 66380 y: parseIso(match[2], sign), 66381 M: parseIso(match[3], sign), 66382 w: parseIso(match[4], sign), 66383 d: parseIso(match[5], sign), 66384 h: parseIso(match[6], sign), 66385 m: parseIso(match[7], sign), 66386 s: parseIso(match[8], sign), 66387 }; 66388 } else if (duration == null) { 66389 // checks for null or undefined 66390 duration = {}; 66391 } else if ( 66392 typeof duration === 'object' && 66393 ('from' in duration || 'to' in duration) 66394 ) { 66395 diffRes = momentsDifference( 66396 createLocal(duration.from), 66397 createLocal(duration.to) 66398 ); 66399 66400 duration = {}; 66401 duration.ms = diffRes.milliseconds; 66402 duration.M = diffRes.months; 66403 } 66404 66405 ret = new Duration(duration); 66406 66407 if (isDuration(input) && hasOwnProp(input, '_locale')) { 66408 ret._locale = input._locale; 66409 } 66410 66411 if (isDuration(input) && hasOwnProp(input, '_isValid')) { 66412 ret._isValid = input._isValid; 66413 } 66414 66415 return ret; 66416 } 66417 66418 createDuration.fn = Duration.prototype; 66419 createDuration.invalid = createInvalid$1; 66420 66421 function parseIso(inp, sign) { 66422 // We'd normally use ~~inp for this, but unfortunately it also 66423 // converts floats to ints. 66424 // inp may be undefined, so careful calling replace on it. 66425 var res = inp && parseFloat(inp.replace(',', '.')); 66426 // apply sign while we're at it 66427 return (isNaN(res) ? 0 : res) * sign; 66428 } 66429 66430 function positiveMomentsDifference(base, other) { 66431 var res = {}; 66432 66433 res.months = 66434 other.month() - base.month() + (other.year() - base.year()) * 12; 66435 if (base.clone().add(res.months, 'M').isAfter(other)) { 66436 --res.months; 66437 } 66438 66439 res.milliseconds = +other - +base.clone().add(res.months, 'M'); 66440 66441 return res; 66442 } 66443 66444 function momentsDifference(base, other) { 66445 var res; 66446 if (!(base.isValid() && other.isValid())) { 66447 return { milliseconds: 0, months: 0 }; 66448 } 66449 66450 other = cloneWithOffset(other, base); 66451 if (base.isBefore(other)) { 66452 res = positiveMomentsDifference(base, other); 66453 } else { 66454 res = positiveMomentsDifference(other, base); 66455 res.milliseconds = -res.milliseconds; 66456 res.months = -res.months; 66457 } 66458 66459 return res; 66460 } 66461 66462 // TODO: remove 'name' arg after deprecation is removed 66463 function createAdder(direction, name) { 66464 return function (val, period) { 66465 var dur, tmp; 66466 //invert the arguments, but complain about it 66467 if (period !== null && !isNaN(+period)) { 66468 deprecateSimple( 66469 name, 66470 'moment().' + 66471 name + 66472 '(period, number) is deprecated. Please use moment().' + 66473 name + 66474 '(number, period). ' + 66475 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.' 66476 ); 66477 tmp = val; 66478 val = period; 66479 period = tmp; 66480 } 66481 66482 dur = createDuration(val, period); 66483 addSubtract(this, dur, direction); 66484 return this; 66485 }; 66486 } 66487 66488 function addSubtract(mom, duration, isAdding, updateOffset) { 66489 var milliseconds = duration._milliseconds, 66490 days = absRound(duration._days), 66491 months = absRound(duration._months); 66492 66493 if (!mom.isValid()) { 66494 // No op 66495 return; 66496 } 66497 66498 updateOffset = updateOffset == null ? true : updateOffset; 66499 66500 if (months) { 66501 setMonth(mom, get(mom, 'Month') + months * isAdding); 66502 } 66503 if (days) { 66504 set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); 66505 } 66506 if (milliseconds) { 66507 mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); 66508 } 66509 if (updateOffset) { 66510 hooks.updateOffset(mom, days || months); 66511 } 66512 } 66513 66514 var add = createAdder(1, 'add'), 66515 subtract = createAdder(-1, 'subtract'); 66516 66517 function isString(input) { 66518 return typeof input === 'string' || input instanceof String; 66519 } 66520 66521 // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined 66522 function isMomentInput(input) { 66523 return ( 66524 isMoment(input) || 66525 isDate(input) || 66526 isString(input) || 66527 isNumber(input) || 66528 isNumberOrStringArray(input) || 66529 isMomentInputObject(input) || 66530 input === null || 66531 input === undefined 66532 ); 66533 } 66534 66535 function isMomentInputObject(input) { 66536 var objectTest = isObject(input) && !isObjectEmpty(input), 66537 propertyTest = false, 66538 properties = [ 66539 'years', 66540 'year', 66541 'y', 66542 'months', 66543 'month', 66544 'M', 66545 'days', 66546 'day', 66547 'd', 66548 'dates', 66549 'date', 66550 'D', 66551 'hours', 66552 'hour', 66553 'h', 66554 'minutes', 66555 'minute', 66556 'm', 66557 'seconds', 66558 'second', 66559 's', 66560 'milliseconds', 66561 'millisecond', 66562 'ms', 66563 ], 66564 i, 66565 property, 66566 propertyLen = properties.length; 66567 66568 for (i = 0; i < propertyLen; i += 1) { 66569 property = properties[i]; 66570 propertyTest = propertyTest || hasOwnProp(input, property); 66571 } 66572 66573 return objectTest && propertyTest; 66574 } 66575 66576 function isNumberOrStringArray(input) { 66577 var arrayTest = isArray(input), 66578 dataTypeTest = false; 66579 if (arrayTest) { 66580 dataTypeTest = 66581 input.filter(function (item) { 66582 return !isNumber(item) && isString(input); 66583 }).length === 0; 66584 } 66585 return arrayTest && dataTypeTest; 66586 } 66587 66588 function isCalendarSpec(input) { 66589 var objectTest = isObject(input) && !isObjectEmpty(input), 66590 propertyTest = false, 66591 properties = [ 66592 'sameDay', 66593 'nextDay', 66594 'lastDay', 66595 'nextWeek', 66596 'lastWeek', 66597 'sameElse', 66598 ], 66599 i, 66600 property; 66601 66602 for (i = 0; i < properties.length; i += 1) { 66603 property = properties[i]; 66604 propertyTest = propertyTest || hasOwnProp(input, property); 66605 } 66606 66607 return objectTest && propertyTest; 66608 } 66609 66610 function getCalendarFormat(myMoment, now) { 66611 var diff = myMoment.diff(now, 'days', true); 66612 return diff < -6 66613 ? 'sameElse' 66614 : diff < -1 66615 ? 'lastWeek' 66616 : diff < 0 66617 ? 'lastDay' 66618 : diff < 1 66619 ? 'sameDay' 66620 : diff < 2 66621 ? 'nextDay' 66622 : diff < 7 66623 ? 'nextWeek' 66624 : 'sameElse'; 66625 } 66626 66627 function calendar$1(time, formats) { 66628 // Support for single parameter, formats only overload to the calendar function 66629 if (arguments.length === 1) { 66630 if (!arguments[0]) { 66631 time = undefined; 66632 formats = undefined; 66633 } else if (isMomentInput(arguments[0])) { 66634 time = arguments[0]; 66635 formats = undefined; 66636 } else if (isCalendarSpec(arguments[0])) { 66637 formats = arguments[0]; 66638 time = undefined; 66639 } 66640 } 66641 // We want to compare the start of today, vs this. 66642 // Getting start-of-today depends on whether we're local/utc/offset or not. 66643 var now = time || createLocal(), 66644 sod = cloneWithOffset(now, this).startOf('day'), 66645 format = hooks.calendarFormat(this, sod) || 'sameElse', 66646 output = 66647 formats && 66648 (isFunction(formats[format]) 66649 ? formats[format].call(this, now) 66650 : formats[format]); 66651 66652 return this.format( 66653 output || this.localeData().calendar(format, this, createLocal(now)) 66654 ); 66655 } 66656 66657 function clone() { 66658 return new Moment(this); 66659 } 66660 66661 function isAfter(input, units) { 66662 var localInput = isMoment(input) ? input : createLocal(input); 66663 if (!(this.isValid() && localInput.isValid())) { 66664 return false; 66665 } 66666 units = normalizeUnits(units) || 'millisecond'; 66667 if (units === 'millisecond') { 66668 return this.valueOf() > localInput.valueOf(); 66669 } else { 66670 return localInput.valueOf() < this.clone().startOf(units).valueOf(); 66671 } 66672 } 66673 66674 function isBefore(input, units) { 66675 var localInput = isMoment(input) ? input : createLocal(input); 66676 if (!(this.isValid() && localInput.isValid())) { 66677 return false; 66678 } 66679 units = normalizeUnits(units) || 'millisecond'; 66680 if (units === 'millisecond') { 66681 return this.valueOf() < localInput.valueOf(); 66682 } else { 66683 return this.clone().endOf(units).valueOf() < localInput.valueOf(); 66684 } 66685 } 66686 66687 function isBetween(from, to, units, inclusivity) { 66688 var localFrom = isMoment(from) ? from : createLocal(from), 66689 localTo = isMoment(to) ? to : createLocal(to); 66690 if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { 66691 return false; 66692 } 66693 inclusivity = inclusivity || '()'; 66694 return ( 66695 (inclusivity[0] === '(' 66696 ? this.isAfter(localFrom, units) 66697 : !this.isBefore(localFrom, units)) && 66698 (inclusivity[1] === ')' 66699 ? this.isBefore(localTo, units) 66700 : !this.isAfter(localTo, units)) 66701 ); 66702 } 66703 66704 function isSame(input, units) { 66705 var localInput = isMoment(input) ? input : createLocal(input), 66706 inputMs; 66707 if (!(this.isValid() && localInput.isValid())) { 66708 return false; 66709 } 66710 units = normalizeUnits(units) || 'millisecond'; 66711 if (units === 'millisecond') { 66712 return this.valueOf() === localInput.valueOf(); 66713 } else { 66714 inputMs = localInput.valueOf(); 66715 return ( 66716 this.clone().startOf(units).valueOf() <= inputMs && 66717 inputMs <= this.clone().endOf(units).valueOf() 66718 ); 66719 } 66720 } 66721 66722 function isSameOrAfter(input, units) { 66723 return this.isSame(input, units) || this.isAfter(input, units); 66724 } 66725 66726 function isSameOrBefore(input, units) { 66727 return this.isSame(input, units) || this.isBefore(input, units); 66728 } 66729 66730 function diff(input, units, asFloat) { 66731 var that, zoneDelta, output; 66732 66733 if (!this.isValid()) { 66734 return NaN; 66735 } 66736 66737 that = cloneWithOffset(input, this); 66738 66739 if (!that.isValid()) { 66740 return NaN; 66741 } 66742 66743 zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; 66744 66745 units = normalizeUnits(units); 66746 66747 switch (units) { 66748 case 'year': 66749 output = monthDiff(this, that) / 12; 66750 break; 66751 case 'month': 66752 output = monthDiff(this, that); 66753 break; 66754 case 'quarter': 66755 output = monthDiff(this, that) / 3; 66756 break; 66757 case 'second': 66758 output = (this - that) / 1e3; 66759 break; // 1000 66760 case 'minute': 66761 output = (this - that) / 6e4; 66762 break; // 1000 * 60 66763 case 'hour': 66764 output = (this - that) / 36e5; 66765 break; // 1000 * 60 * 60 66766 case 'day': 66767 output = (this - that - zoneDelta) / 864e5; 66768 break; // 1000 * 60 * 60 * 24, negate dst 66769 case 'week': 66770 output = (this - that - zoneDelta) / 6048e5; 66771 break; // 1000 * 60 * 60 * 24 * 7, negate dst 66772 default: 66773 output = this - that; 66774 } 66775 66776 return asFloat ? output : absFloor(output); 66777 } 66778 66779 function monthDiff(a, b) { 66780 if (a.date() < b.date()) { 66781 // end-of-month calculations work correct when the start month has more 66782 // days than the end month. 66783 return -monthDiff(b, a); 66784 } 66785 // difference in months 66786 var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()), 66787 // b is in (anchor - 1 month, anchor + 1 month) 66788 anchor = a.clone().add(wholeMonthDiff, 'months'), 66789 anchor2, 66790 adjust; 66791 66792 if (b - anchor < 0) { 66793 anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); 66794 // linear across the month 66795 adjust = (b - anchor) / (anchor - anchor2); 66796 } else { 66797 anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); 66798 // linear across the month 66799 adjust = (b - anchor) / (anchor2 - anchor); 66800 } 66801 66802 //check for negative zero, return zero if negative zero 66803 return -(wholeMonthDiff + adjust) || 0; 66804 } 66805 66806 hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; 66807 hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; 66808 66809 function toString() { 66810 return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); 66811 } 66812 66813 function toISOString(keepOffset) { 66814 if (!this.isValid()) { 66815 return null; 66816 } 66817 var utc = keepOffset !== true, 66818 m = utc ? this.clone().utc() : this; 66819 if (m.year() < 0 || m.year() > 9999) { 66820 return formatMoment( 66821 m, 66822 utc 66823 ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' 66824 : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ' 66825 ); 66826 } 66827 if (isFunction(Date.prototype.toISOString)) { 66828 // native implementation is ~50x faster, use it when we can 66829 if (utc) { 66830 return this.toDate().toISOString(); 66831 } else { 66832 return new Date(this.valueOf() + this.utcOffset() * 60 * 1000) 66833 .toISOString() 66834 .replace('Z', formatMoment(m, 'Z')); 66835 } 66836 } 66837 return formatMoment( 66838 m, 66839 utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ' 66840 ); 66841 } 66842 66843 /** 66844 * Return a human readable representation of a moment that can 66845 * also be evaluated to get a new moment which is the same 66846 * 66847 * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects 66848 */ 66849 function inspect() { 66850 if (!this.isValid()) { 66851 return 'moment.invalid(/* ' + this._i + ' */)'; 66852 } 66853 var func = 'moment', 66854 zone = '', 66855 prefix, 66856 year, 66857 datetime, 66858 suffix; 66859 if (!this.isLocal()) { 66860 func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; 66861 zone = 'Z'; 66862 } 66863 prefix = '[' + func + '("]'; 66864 year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY'; 66865 datetime = '-MM-DD[T]HH:mm:ss.SSS'; 66866 suffix = zone + '[")]'; 66867 66868 return this.format(prefix + year + datetime + suffix); 66869 } 66870 66871 function format(inputString) { 66872 if (!inputString) { 66873 inputString = this.isUtc() 66874 ? hooks.defaultFormatUtc 66875 : hooks.defaultFormat; 66876 } 66877 var output = formatMoment(this, inputString); 66878 return this.localeData().postformat(output); 66879 } 66880 66881 function from(time, withoutSuffix) { 66882 if ( 66883 this.isValid() && 66884 ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) 66885 ) { 66886 return createDuration({ to: this, from: time }) 66887 .locale(this.locale()) 66888 .humanize(!withoutSuffix); 66889 } else { 66890 return this.localeData().invalidDate(); 66891 } 66892 } 66893 66894 function fromNow(withoutSuffix) { 66895 return this.from(createLocal(), withoutSuffix); 66896 } 66897 66898 function to(time, withoutSuffix) { 66899 if ( 66900 this.isValid() && 66901 ((isMoment(time) && time.isValid()) || createLocal(time).isValid()) 66902 ) { 66903 return createDuration({ from: this, to: time }) 66904 .locale(this.locale()) 66905 .humanize(!withoutSuffix); 66906 } else { 66907 return this.localeData().invalidDate(); 66908 } 66909 } 66910 66911 function toNow(withoutSuffix) { 66912 return this.to(createLocal(), withoutSuffix); 66913 } 66914 66915 // If passed a locale key, it will set the locale for this 66916 // instance. Otherwise, it will return the locale configuration 66917 // variables for this instance. 66918 function locale(key) { 66919 var newLocaleData; 66920 66921 if (key === undefined) { 66922 return this._locale._abbr; 66923 } else { 66924 newLocaleData = getLocale(key); 66925 if (newLocaleData != null) { 66926 this._locale = newLocaleData; 66927 } 66928 return this; 66929 } 66930 } 66931 66932 var lang = deprecate( 66933 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', 66934 function (key) { 66935 if (key === undefined) { 66936 return this.localeData(); 66937 } else { 66938 return this.locale(key); 66939 } 66940 } 66941 ); 66942 66943 function localeData() { 66944 return this._locale; 66945 } 66946 66947 var MS_PER_SECOND = 1000, 66948 MS_PER_MINUTE = 60 * MS_PER_SECOND, 66949 MS_PER_HOUR = 60 * MS_PER_MINUTE, 66950 MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; 66951 66952 // actual modulo - handles negative numbers (for dates before 1970): 66953 function mod$1(dividend, divisor) { 66954 return ((dividend % divisor) + divisor) % divisor; 66955 } 66956 66957 function localStartOfDate(y, m, d) { 66958 // the date constructor remaps years 0-99 to 1900-1999 66959 if (y < 100 && y >= 0) { 66960 // preserve leap years using a full 400 year cycle, then reset 66961 return new Date(y + 400, m, d) - MS_PER_400_YEARS; 66962 } else { 66963 return new Date(y, m, d).valueOf(); 66964 } 66965 } 66966 66967 function utcStartOfDate(y, m, d) { 66968 // Date.UTC remaps years 0-99 to 1900-1999 66969 if (y < 100 && y >= 0) { 66970 // preserve leap years using a full 400 year cycle, then reset 66971 return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; 66972 } else { 66973 return Date.UTC(y, m, d); 66974 } 66975 } 66976 66977 function startOf(units) { 66978 var time, startOfDate; 66979 units = normalizeUnits(units); 66980 if (units === undefined || units === 'millisecond' || !this.isValid()) { 66981 return this; 66982 } 66983 66984 startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; 66985 66986 switch (units) { 66987 case 'year': 66988 time = startOfDate(this.year(), 0, 1); 66989 break; 66990 case 'quarter': 66991 time = startOfDate( 66992 this.year(), 66993 this.month() - (this.month() % 3), 66994 1 66995 ); 66996 break; 66997 case 'month': 66998 time = startOfDate(this.year(), this.month(), 1); 66999 break; 67000 case 'week': 67001 time = startOfDate( 67002 this.year(), 67003 this.month(), 67004 this.date() - this.weekday() 67005 ); 67006 break; 67007 case 'isoWeek': 67008 time = startOfDate( 67009 this.year(), 67010 this.month(), 67011 this.date() - (this.isoWeekday() - 1) 67012 ); 67013 break; 67014 case 'day': 67015 case 'date': 67016 time = startOfDate(this.year(), this.month(), this.date()); 67017 break; 67018 case 'hour': 67019 time = this._d.valueOf(); 67020 time -= mod$1( 67021 time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), 67022 MS_PER_HOUR 67023 ); 67024 break; 67025 case 'minute': 67026 time = this._d.valueOf(); 67027 time -= mod$1(time, MS_PER_MINUTE); 67028 break; 67029 case 'second': 67030 time = this._d.valueOf(); 67031 time -= mod$1(time, MS_PER_SECOND); 67032 break; 67033 } 67034 67035 this._d.setTime(time); 67036 hooks.updateOffset(this, true); 67037 return this; 67038 } 67039 67040 function endOf(units) { 67041 var time, startOfDate; 67042 units = normalizeUnits(units); 67043 if (units === undefined || units === 'millisecond' || !this.isValid()) { 67044 return this; 67045 } 67046 67047 startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; 67048 67049 switch (units) { 67050 case 'year': 67051 time = startOfDate(this.year() + 1, 0, 1) - 1; 67052 break; 67053 case 'quarter': 67054 time = 67055 startOfDate( 67056 this.year(), 67057 this.month() - (this.month() % 3) + 3, 67058 1 67059 ) - 1; 67060 break; 67061 case 'month': 67062 time = startOfDate(this.year(), this.month() + 1, 1) - 1; 67063 break; 67064 case 'week': 67065 time = 67066 startOfDate( 67067 this.year(), 67068 this.month(), 67069 this.date() - this.weekday() + 7 67070 ) - 1; 67071 break; 67072 case 'isoWeek': 67073 time = 67074 startOfDate( 67075 this.year(), 67076 this.month(), 67077 this.date() - (this.isoWeekday() - 1) + 7 67078 ) - 1; 67079 break; 67080 case 'day': 67081 case 'date': 67082 time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; 67083 break; 67084 case 'hour': 67085 time = this._d.valueOf(); 67086 time += 67087 MS_PER_HOUR - 67088 mod$1( 67089 time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), 67090 MS_PER_HOUR 67091 ) - 67092 1; 67093 break; 67094 case 'minute': 67095 time = this._d.valueOf(); 67096 time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; 67097 break; 67098 case 'second': 67099 time = this._d.valueOf(); 67100 time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; 67101 break; 67102 } 67103 67104 this._d.setTime(time); 67105 hooks.updateOffset(this, true); 67106 return this; 67107 } 67108 67109 function valueOf() { 67110 return this._d.valueOf() - (this._offset || 0) * 60000; 67111 } 67112 67113 function unix() { 67114 return Math.floor(this.valueOf() / 1000); 67115 } 67116 67117 function toDate() { 67118 return new Date(this.valueOf()); 67119 } 67120 67121 function toArray() { 67122 var m = this; 67123 return [ 67124 m.year(), 67125 m.month(), 67126 m.date(), 67127 m.hour(), 67128 m.minute(), 67129 m.second(), 67130 m.millisecond(), 67131 ]; 67132 } 67133 67134 function toObject() { 67135 var m = this; 67136 return { 67137 years: m.year(), 67138 months: m.month(), 67139 date: m.date(), 67140 hours: m.hours(), 67141 minutes: m.minutes(), 67142 seconds: m.seconds(), 67143 milliseconds: m.milliseconds(), 67144 }; 67145 } 67146 67147 function toJSON() { 67148 // new Date(NaN).toJSON() === null 67149 return this.isValid() ? this.toISOString() : null; 67150 } 67151 67152 function isValid$2() { 67153 return isValid(this); 67154 } 67155 67156 function parsingFlags() { 67157 return extend({}, getParsingFlags(this)); 67158 } 67159 67160 function invalidAt() { 67161 return getParsingFlags(this).overflow; 67162 } 67163 67164 function creationData() { 67165 return { 67166 input: this._i, 67167 format: this._f, 67168 locale: this._locale, 67169 isUTC: this._isUTC, 67170 strict: this._strict, 67171 }; 67172 } 67173 67174 addFormatToken('N', 0, 0, 'eraAbbr'); 67175 addFormatToken('NN', 0, 0, 'eraAbbr'); 67176 addFormatToken('NNN', 0, 0, 'eraAbbr'); 67177 addFormatToken('NNNN', 0, 0, 'eraName'); 67178 addFormatToken('NNNNN', 0, 0, 'eraNarrow'); 67179 67180 addFormatToken('y', ['y', 1], 'yo', 'eraYear'); 67181 addFormatToken('y', ['yy', 2], 0, 'eraYear'); 67182 addFormatToken('y', ['yyy', 3], 0, 'eraYear'); 67183 addFormatToken('y', ['yyyy', 4], 0, 'eraYear'); 67184 67185 addRegexToken('N', matchEraAbbr); 67186 addRegexToken('NN', matchEraAbbr); 67187 addRegexToken('NNN', matchEraAbbr); 67188 addRegexToken('NNNN', matchEraName); 67189 addRegexToken('NNNNN', matchEraNarrow); 67190 67191 addParseToken( 67192 ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], 67193 function (input, array, config, token) { 67194 var era = config._locale.erasParse(input, token, config._strict); 67195 if (era) { 67196 getParsingFlags(config).era = era; 67197 } else { 67198 getParsingFlags(config).invalidEra = input; 67199 } 67200 } 67201 ); 67202 67203 addRegexToken('y', matchUnsigned); 67204 addRegexToken('yy', matchUnsigned); 67205 addRegexToken('yyy', matchUnsigned); 67206 addRegexToken('yyyy', matchUnsigned); 67207 addRegexToken('yo', matchEraYearOrdinal); 67208 67209 addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR); 67210 addParseToken(['yo'], function (input, array, config, token) { 67211 var match; 67212 if (config._locale._eraYearOrdinalRegex) { 67213 match = input.match(config._locale._eraYearOrdinalRegex); 67214 } 67215 67216 if (config._locale.eraYearOrdinalParse) { 67217 array[YEAR] = config._locale.eraYearOrdinalParse(input, match); 67218 } else { 67219 array[YEAR] = parseInt(input, 10); 67220 } 67221 }); 67222 67223 function localeEras(m, format) { 67224 var i, 67225 l, 67226 date, 67227 eras = this._eras || getLocale('en')._eras; 67228 for (i = 0, l = eras.length; i < l; ++i) { 67229 switch (typeof eras[i].since) { 67230 case 'string': 67231 // truncate time 67232 date = hooks(eras[i].since).startOf('day'); 67233 eras[i].since = date.valueOf(); 67234 break; 67235 } 67236 67237 switch (typeof eras[i].until) { 67238 case 'undefined': 67239 eras[i].until = +Infinity; 67240 break; 67241 case 'string': 67242 // truncate time 67243 date = hooks(eras[i].until).startOf('day').valueOf(); 67244 eras[i].until = date.valueOf(); 67245 break; 67246 } 67247 } 67248 return eras; 67249 } 67250 67251 function localeErasParse(eraName, format, strict) { 67252 var i, 67253 l, 67254 eras = this.eras(), 67255 name, 67256 abbr, 67257 narrow; 67258 eraName = eraName.toUpperCase(); 67259 67260 for (i = 0, l = eras.length; i < l; ++i) { 67261 name = eras[i].name.toUpperCase(); 67262 abbr = eras[i].abbr.toUpperCase(); 67263 narrow = eras[i].narrow.toUpperCase(); 67264 67265 if (strict) { 67266 switch (format) { 67267 case 'N': 67268 case 'NN': 67269 case 'NNN': 67270 if (abbr === eraName) { 67271 return eras[i]; 67272 } 67273 break; 67274 67275 case 'NNNN': 67276 if (name === eraName) { 67277 return eras[i]; 67278 } 67279 break; 67280 67281 case 'NNNNN': 67282 if (narrow === eraName) { 67283 return eras[i]; 67284 } 67285 break; 67286 } 67287 } else if ([name, abbr, narrow].indexOf(eraName) >= 0) { 67288 return eras[i]; 67289 } 67290 } 67291 } 67292 67293 function localeErasConvertYear(era, year) { 67294 var dir = era.since <= era.until ? +1 : -1; 67295 if (year === undefined) { 67296 return hooks(era.since).year(); 67297 } else { 67298 return hooks(era.since).year() + (year - era.offset) * dir; 67299 } 67300 } 67301 67302 function getEraName() { 67303 var i, 67304 l, 67305 val, 67306 eras = this.localeData().eras(); 67307 for (i = 0, l = eras.length; i < l; ++i) { 67308 // truncate time 67309 val = this.clone().startOf('day').valueOf(); 67310 67311 if (eras[i].since <= val && val <= eras[i].until) { 67312 return eras[i].name; 67313 } 67314 if (eras[i].until <= val && val <= eras[i].since) { 67315 return eras[i].name; 67316 } 67317 } 67318 67319 return ''; 67320 } 67321 67322 function getEraNarrow() { 67323 var i, 67324 l, 67325 val, 67326 eras = this.localeData().eras(); 67327 for (i = 0, l = eras.length; i < l; ++i) { 67328 // truncate time 67329 val = this.clone().startOf('day').valueOf(); 67330 67331 if (eras[i].since <= val && val <= eras[i].until) { 67332 return eras[i].narrow; 67333 } 67334 if (eras[i].until <= val && val <= eras[i].since) { 67335 return eras[i].narrow; 67336 } 67337 } 67338 67339 return ''; 67340 } 67341 67342 function getEraAbbr() { 67343 var i, 67344 l, 67345 val, 67346 eras = this.localeData().eras(); 67347 for (i = 0, l = eras.length; i < l; ++i) { 67348 // truncate time 67349 val = this.clone().startOf('day').valueOf(); 67350 67351 if (eras[i].since <= val && val <= eras[i].until) { 67352 return eras[i].abbr; 67353 } 67354 if (eras[i].until <= val && val <= eras[i].since) { 67355 return eras[i].abbr; 67356 } 67357 } 67358 67359 return ''; 67360 } 67361 67362 function getEraYear() { 67363 var i, 67364 l, 67365 dir, 67366 val, 67367 eras = this.localeData().eras(); 67368 for (i = 0, l = eras.length; i < l; ++i) { 67369 dir = eras[i].since <= eras[i].until ? +1 : -1; 67370 67371 // truncate time 67372 val = this.clone().startOf('day').valueOf(); 67373 67374 if ( 67375 (eras[i].since <= val && val <= eras[i].until) || 67376 (eras[i].until <= val && val <= eras[i].since) 67377 ) { 67378 return ( 67379 (this.year() - hooks(eras[i].since).year()) * dir + 67380 eras[i].offset 67381 ); 67382 } 67383 } 67384 67385 return this.year(); 67386 } 67387 67388 function erasNameRegex(isStrict) { 67389 if (!hasOwnProp(this, '_erasNameRegex')) { 67390 computeErasParse.call(this); 67391 } 67392 return isStrict ? this._erasNameRegex : this._erasRegex; 67393 } 67394 67395 function erasAbbrRegex(isStrict) { 67396 if (!hasOwnProp(this, '_erasAbbrRegex')) { 67397 computeErasParse.call(this); 67398 } 67399 return isStrict ? this._erasAbbrRegex : this._erasRegex; 67400 } 67401 67402 function erasNarrowRegex(isStrict) { 67403 if (!hasOwnProp(this, '_erasNarrowRegex')) { 67404 computeErasParse.call(this); 67405 } 67406 return isStrict ? this._erasNarrowRegex : this._erasRegex; 67407 } 67408 67409 function matchEraAbbr(isStrict, locale) { 67410 return locale.erasAbbrRegex(isStrict); 67411 } 67412 67413 function matchEraName(isStrict, locale) { 67414 return locale.erasNameRegex(isStrict); 67415 } 67416 67417 function matchEraNarrow(isStrict, locale) { 67418 return locale.erasNarrowRegex(isStrict); 67419 } 67420 67421 function matchEraYearOrdinal(isStrict, locale) { 67422 return locale._eraYearOrdinalRegex || matchUnsigned; 67423 } 67424 67425 function computeErasParse() { 67426 var abbrPieces = [], 67427 namePieces = [], 67428 narrowPieces = [], 67429 mixedPieces = [], 67430 i, 67431 l, 67432 eras = this.eras(); 67433 67434 for (i = 0, l = eras.length; i < l; ++i) { 67435 namePieces.push(regexEscape(eras[i].name)); 67436 abbrPieces.push(regexEscape(eras[i].abbr)); 67437 narrowPieces.push(regexEscape(eras[i].narrow)); 67438 67439 mixedPieces.push(regexEscape(eras[i].name)); 67440 mixedPieces.push(regexEscape(eras[i].abbr)); 67441 mixedPieces.push(regexEscape(eras[i].narrow)); 67442 } 67443 67444 this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); 67445 this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i'); 67446 this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i'); 67447 this._erasNarrowRegex = new RegExp( 67448 '^(' + narrowPieces.join('|') + ')', 67449 'i' 67450 ); 67451 } 67452 67453 // FORMATTING 67454 67455 addFormatToken(0, ['gg', 2], 0, function () { 67456 return this.weekYear() % 100; 67457 }); 67458 67459 addFormatToken(0, ['GG', 2], 0, function () { 67460 return this.isoWeekYear() % 100; 67461 }); 67462 67463 function addWeekYearFormatToken(token, getter) { 67464 addFormatToken(0, [token, token.length], 0, getter); 67465 } 67466 67467 addWeekYearFormatToken('gggg', 'weekYear'); 67468 addWeekYearFormatToken('ggggg', 'weekYear'); 67469 addWeekYearFormatToken('GGGG', 'isoWeekYear'); 67470 addWeekYearFormatToken('GGGGG', 'isoWeekYear'); 67471 67472 // ALIASES 67473 67474 addUnitAlias('weekYear', 'gg'); 67475 addUnitAlias('isoWeekYear', 'GG'); 67476 67477 // PRIORITY 67478 67479 addUnitPriority('weekYear', 1); 67480 addUnitPriority('isoWeekYear', 1); 67481 67482 // PARSING 67483 67484 addRegexToken('G', matchSigned); 67485 addRegexToken('g', matchSigned); 67486 addRegexToken('GG', match1to2, match2); 67487 addRegexToken('gg', match1to2, match2); 67488 addRegexToken('GGGG', match1to4, match4); 67489 addRegexToken('gggg', match1to4, match4); 67490 addRegexToken('GGGGG', match1to6, match6); 67491 addRegexToken('ggggg', match1to6, match6); 67492 67493 addWeekParseToken( 67494 ['gggg', 'ggggg', 'GGGG', 'GGGGG'], 67495 function (input, week, config, token) { 67496 week[token.substr(0, 2)] = toInt(input); 67497 } 67498 ); 67499 67500 addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { 67501 week[token] = hooks.parseTwoDigitYear(input); 67502 }); 67503 67504 // MOMENTS 67505 67506 function getSetWeekYear(input) { 67507 return getSetWeekYearHelper.call( 67508 this, 67509 input, 67510 this.week(), 67511 this.weekday(), 67512 this.localeData()._week.dow, 67513 this.localeData()._week.doy 67514 ); 67515 } 67516 67517 function getSetISOWeekYear(input) { 67518 return getSetWeekYearHelper.call( 67519 this, 67520 input, 67521 this.isoWeek(), 67522 this.isoWeekday(), 67523 1, 67524 4 67525 ); 67526 } 67527 67528 function getISOWeeksInYear() { 67529 return weeksInYear(this.year(), 1, 4); 67530 } 67531 67532 function getISOWeeksInISOWeekYear() { 67533 return weeksInYear(this.isoWeekYear(), 1, 4); 67534 } 67535 67536 function getWeeksInYear() { 67537 var weekInfo = this.localeData()._week; 67538 return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); 67539 } 67540 67541 function getWeeksInWeekYear() { 67542 var weekInfo = this.localeData()._week; 67543 return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy); 67544 } 67545 67546 function getSetWeekYearHelper(input, week, weekday, dow, doy) { 67547 var weeksTarget; 67548 if (input == null) { 67549 return weekOfYear(this, dow, doy).year; 67550 } else { 67551 weeksTarget = weeksInYear(input, dow, doy); 67552 if (week > weeksTarget) { 67553 week = weeksTarget; 67554 } 67555 return setWeekAll.call(this, input, week, weekday, dow, doy); 67556 } 67557 } 67558 67559 function setWeekAll(weekYear, week, weekday, dow, doy) { 67560 var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), 67561 date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); 67562 67563 this.year(date.getUTCFullYear()); 67564 this.month(date.getUTCMonth()); 67565 this.date(date.getUTCDate()); 67566 return this; 67567 } 67568 67569 // FORMATTING 67570 67571 addFormatToken('Q', 0, 'Qo', 'quarter'); 67572 67573 // ALIASES 67574 67575 addUnitAlias('quarter', 'Q'); 67576 67577 // PRIORITY 67578 67579 addUnitPriority('quarter', 7); 67580 67581 // PARSING 67582 67583 addRegexToken('Q', match1); 67584 addParseToken('Q', function (input, array) { 67585 array[MONTH] = (toInt(input) - 1) * 3; 67586 }); 67587 67588 // MOMENTS 67589 67590 function getSetQuarter(input) { 67591 return input == null 67592 ? Math.ceil((this.month() + 1) / 3) 67593 : this.month((input - 1) * 3 + (this.month() % 3)); 67594 } 67595 67596 // FORMATTING 67597 67598 addFormatToken('D', ['DD', 2], 'Do', 'date'); 67599 67600 // ALIASES 67601 67602 addUnitAlias('date', 'D'); 67603 67604 // PRIORITY 67605 addUnitPriority('date', 9); 67606 67607 // PARSING 67608 67609 addRegexToken('D', match1to2); 67610 addRegexToken('DD', match1to2, match2); 67611 addRegexToken('Do', function (isStrict, locale) { 67612 // TODO: Remove "ordinalParse" fallback in next major release. 67613 return isStrict 67614 ? locale._dayOfMonthOrdinalParse || locale._ordinalParse 67615 : locale._dayOfMonthOrdinalParseLenient; 67616 }); 67617 67618 addParseToken(['D', 'DD'], DATE); 67619 addParseToken('Do', function (input, array) { 67620 array[DATE] = toInt(input.match(match1to2)[0]); 67621 }); 67622 67623 // MOMENTS 67624 67625 var getSetDayOfMonth = makeGetSet('Date', true); 67626 67627 // FORMATTING 67628 67629 addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); 67630 67631 // ALIASES 67632 67633 addUnitAlias('dayOfYear', 'DDD'); 67634 67635 // PRIORITY 67636 addUnitPriority('dayOfYear', 4); 67637 67638 // PARSING 67639 67640 addRegexToken('DDD', match1to3); 67641 addRegexToken('DDDD', match3); 67642 addParseToken(['DDD', 'DDDD'], function (input, array, config) { 67643 config._dayOfYear = toInt(input); 67644 }); 67645 67646 // HELPERS 67647 67648 // MOMENTS 67649 67650 function getSetDayOfYear(input) { 67651 var dayOfYear = 67652 Math.round( 67653 (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5 67654 ) + 1; 67655 return input == null ? dayOfYear : this.add(input - dayOfYear, 'd'); 67656 } 67657 67658 // FORMATTING 67659 67660 addFormatToken('m', ['mm', 2], 0, 'minute'); 67661 67662 // ALIASES 67663 67664 addUnitAlias('minute', 'm'); 67665 67666 // PRIORITY 67667 67668 addUnitPriority('minute', 14); 67669 67670 // PARSING 67671 67672 addRegexToken('m', match1to2); 67673 addRegexToken('mm', match1to2, match2); 67674 addParseToken(['m', 'mm'], MINUTE); 67675 67676 // MOMENTS 67677 67678 var getSetMinute = makeGetSet('Minutes', false); 67679 67680 // FORMATTING 67681 67682 addFormatToken('s', ['ss', 2], 0, 'second'); 67683 67684 // ALIASES 67685 67686 addUnitAlias('second', 's'); 67687 67688 // PRIORITY 67689 67690 addUnitPriority('second', 15); 67691 67692 // PARSING 67693 67694 addRegexToken('s', match1to2); 67695 addRegexToken('ss', match1to2, match2); 67696 addParseToken(['s', 'ss'], SECOND); 67697 67698 // MOMENTS 67699 67700 var getSetSecond = makeGetSet('Seconds', false); 67701 67702 // FORMATTING 67703 67704 addFormatToken('S', 0, 0, function () { 67705 return ~~(this.millisecond() / 100); 67706 }); 67707 67708 addFormatToken(0, ['SS', 2], 0, function () { 67709 return ~~(this.millisecond() / 10); 67710 }); 67711 67712 addFormatToken(0, ['SSS', 3], 0, 'millisecond'); 67713 addFormatToken(0, ['SSSS', 4], 0, function () { 67714 return this.millisecond() * 10; 67715 }); 67716 addFormatToken(0, ['SSSSS', 5], 0, function () { 67717 return this.millisecond() * 100; 67718 }); 67719 addFormatToken(0, ['SSSSSS', 6], 0, function () { 67720 return this.millisecond() * 1000; 67721 }); 67722 addFormatToken(0, ['SSSSSSS', 7], 0, function () { 67723 return this.millisecond() * 10000; 67724 }); 67725 addFormatToken(0, ['SSSSSSSS', 8], 0, function () { 67726 return this.millisecond() * 100000; 67727 }); 67728 addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { 67729 return this.millisecond() * 1000000; 67730 }); 67731 67732 // ALIASES 67733 67734 addUnitAlias('millisecond', 'ms'); 67735 67736 // PRIORITY 67737 67738 addUnitPriority('millisecond', 16); 67739 67740 // PARSING 67741 67742 addRegexToken('S', match1to3, match1); 67743 addRegexToken('SS', match1to3, match2); 67744 addRegexToken('SSS', match1to3, match3); 67745 67746 var token, getSetMillisecond; 67747 for (token = 'SSSS'; token.length <= 9; token += 'S') { 67748 addRegexToken(token, matchUnsigned); 67749 } 67750 67751 function parseMs(input, array) { 67752 array[MILLISECOND] = toInt(('0.' + input) * 1000); 67753 } 67754 67755 for (token = 'S'; token.length <= 9; token += 'S') { 67756 addParseToken(token, parseMs); 67757 } 67758 67759 getSetMillisecond = makeGetSet('Milliseconds', false); 67760 67761 // FORMATTING 67762 67763 addFormatToken('z', 0, 0, 'zoneAbbr'); 67764 addFormatToken('zz', 0, 0, 'zoneName'); 67765 67766 // MOMENTS 67767 67768 function getZoneAbbr() { 67769 return this._isUTC ? 'UTC' : ''; 67770 } 67771 67772 function getZoneName() { 67773 return this._isUTC ? 'Coordinated Universal Time' : ''; 67774 } 67775 67776 var proto = Moment.prototype; 67777 67778 proto.add = add; 67779 proto.calendar = calendar$1; 67780 proto.clone = clone; 67781 proto.diff = diff; 67782 proto.endOf = endOf; 67783 proto.format = format; 67784 proto.from = from; 67785 proto.fromNow = fromNow; 67786 proto.to = to; 67787 proto.toNow = toNow; 67788 proto.get = stringGet; 67789 proto.invalidAt = invalidAt; 67790 proto.isAfter = isAfter; 67791 proto.isBefore = isBefore; 67792 proto.isBetween = isBetween; 67793 proto.isSame = isSame; 67794 proto.isSameOrAfter = isSameOrAfter; 67795 proto.isSameOrBefore = isSameOrBefore; 67796 proto.isValid = isValid$2; 67797 proto.lang = lang; 67798 proto.locale = locale; 67799 proto.localeData = localeData; 67800 proto.max = prototypeMax; 67801 proto.min = prototypeMin; 67802 proto.parsingFlags = parsingFlags; 67803 proto.set = stringSet; 67804 proto.startOf = startOf; 67805 proto.subtract = subtract; 67806 proto.toArray = toArray; 67807 proto.toObject = toObject; 67808 proto.toDate = toDate; 67809 proto.toISOString = toISOString; 67810 proto.inspect = inspect; 67811 if (typeof Symbol !== 'undefined' && Symbol.for != null) { 67812 proto[Symbol.for('nodejs.util.inspect.custom')] = function () { 67813 return 'Moment<' + this.format() + '>'; 67814 }; 67815 } 67816 proto.toJSON = toJSON; 67817 proto.toString = toString; 67818 proto.unix = unix; 67819 proto.valueOf = valueOf; 67820 proto.creationData = creationData; 67821 proto.eraName = getEraName; 67822 proto.eraNarrow = getEraNarrow; 67823 proto.eraAbbr = getEraAbbr; 67824 proto.eraYear = getEraYear; 67825 proto.year = getSetYear; 67826 proto.isLeapYear = getIsLeapYear; 67827 proto.weekYear = getSetWeekYear; 67828 proto.isoWeekYear = getSetISOWeekYear; 67829 proto.quarter = proto.quarters = getSetQuarter; 67830 proto.month = getSetMonth; 67831 proto.daysInMonth = getDaysInMonth; 67832 proto.week = proto.weeks = getSetWeek; 67833 proto.isoWeek = proto.isoWeeks = getSetISOWeek; 67834 proto.weeksInYear = getWeeksInYear; 67835 proto.weeksInWeekYear = getWeeksInWeekYear; 67836 proto.isoWeeksInYear = getISOWeeksInYear; 67837 proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear; 67838 proto.date = getSetDayOfMonth; 67839 proto.day = proto.days = getSetDayOfWeek; 67840 proto.weekday = getSetLocaleDayOfWeek; 67841 proto.isoWeekday = getSetISODayOfWeek; 67842 proto.dayOfYear = getSetDayOfYear; 67843 proto.hour = proto.hours = getSetHour; 67844 proto.minute = proto.minutes = getSetMinute; 67845 proto.second = proto.seconds = getSetSecond; 67846 proto.millisecond = proto.milliseconds = getSetMillisecond; 67847 proto.utcOffset = getSetOffset; 67848 proto.utc = setOffsetToUTC; 67849 proto.local = setOffsetToLocal; 67850 proto.parseZone = setOffsetToParsedOffset; 67851 proto.hasAlignedHourOffset = hasAlignedHourOffset; 67852 proto.isDST = isDaylightSavingTime; 67853 proto.isLocal = isLocal; 67854 proto.isUtcOffset = isUtcOffset; 67855 proto.isUtc = isUtc; 67856 proto.isUTC = isUtc; 67857 proto.zoneAbbr = getZoneAbbr; 67858 proto.zoneName = getZoneName; 67859 proto.dates = deprecate( 67860 'dates accessor is deprecated. Use date instead.', 67861 getSetDayOfMonth 67862 ); 67863 proto.months = deprecate( 67864 'months accessor is deprecated. Use month instead', 67865 getSetMonth 67866 ); 67867 proto.years = deprecate( 67868 'years accessor is deprecated. Use year instead', 67869 getSetYear 67870 ); 67871 proto.zone = deprecate( 67872 'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', 67873 getSetZone 67874 ); 67875 proto.isDSTShifted = deprecate( 67876 'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', 67877 isDaylightSavingTimeShifted 67878 ); 67879 67880 function createUnix(input) { 67881 return createLocal(input * 1000); 67882 } 67883 67884 function createInZone() { 67885 return createLocal.apply(null, arguments).parseZone(); 67886 } 67887 67888 function preParsePostFormat(string) { 67889 return string; 67890 } 67891 67892 var proto$1 = Locale.prototype; 67893 67894 proto$1.calendar = calendar; 67895 proto$1.longDateFormat = longDateFormat; 67896 proto$1.invalidDate = invalidDate; 67897 proto$1.ordinal = ordinal; 67898 proto$1.preparse = preParsePostFormat; 67899 proto$1.postformat = preParsePostFormat; 67900 proto$1.relativeTime = relativeTime; 67901 proto$1.pastFuture = pastFuture; 67902 proto$1.set = set; 67903 proto$1.eras = localeEras; 67904 proto$1.erasParse = localeErasParse; 67905 proto$1.erasConvertYear = localeErasConvertYear; 67906 proto$1.erasAbbrRegex = erasAbbrRegex; 67907 proto$1.erasNameRegex = erasNameRegex; 67908 proto$1.erasNarrowRegex = erasNarrowRegex; 67909 67910 proto$1.months = localeMonths; 67911 proto$1.monthsShort = localeMonthsShort; 67912 proto$1.monthsParse = localeMonthsParse; 67913 proto$1.monthsRegex = monthsRegex; 67914 proto$1.monthsShortRegex = monthsShortRegex; 67915 proto$1.week = localeWeek; 67916 proto$1.firstDayOfYear = localeFirstDayOfYear; 67917 proto$1.firstDayOfWeek = localeFirstDayOfWeek; 67918 67919 proto$1.weekdays = localeWeekdays; 67920 proto$1.weekdaysMin = localeWeekdaysMin; 67921 proto$1.weekdaysShort = localeWeekdaysShort; 67922 proto$1.weekdaysParse = localeWeekdaysParse; 67923 67924 proto$1.weekdaysRegex = weekdaysRegex; 67925 proto$1.weekdaysShortRegex = weekdaysShortRegex; 67926 proto$1.weekdaysMinRegex = weekdaysMinRegex; 67927 67928 proto$1.isPM = localeIsPM; 67929 proto$1.meridiem = localeMeridiem; 67930 67931 function get$1(format, index, field, setter) { 67932 var locale = getLocale(), 67933 utc = createUTC().set(setter, index); 67934 return locale[field](utc, format); 67935 } 67936 67937 function listMonthsImpl(format, index, field) { 67938 if (isNumber(format)) { 67939 index = format; 67940 format = undefined; 67941 } 67942 67943 format = format || ''; 67944 67945 if (index != null) { 67946 return get$1(format, index, field, 'month'); 67947 } 67948 67949 var i, 67950 out = []; 67951 for (i = 0; i < 12; i++) { 67952 out[i] = get$1(format, i, field, 'month'); 67953 } 67954 return out; 67955 } 67956 67957 // () 67958 // (5) 67959 // (fmt, 5) 67960 // (fmt) 67961 // (true) 67962 // (true, 5) 67963 // (true, fmt, 5) 67964 // (true, fmt) 67965 function listWeekdaysImpl(localeSorted, format, index, field) { 67966 if (typeof localeSorted === 'boolean') { 67967 if (isNumber(format)) { 67968 index = format; 67969 format = undefined; 67970 } 67971 67972 format = format || ''; 67973 } else { 67974 format = localeSorted; 67975 index = format; 67976 localeSorted = false; 67977 67978 if (isNumber(format)) { 67979 index = format; 67980 format = undefined; 67981 } 67982 67983 format = format || ''; 67984 } 67985 67986 var locale = getLocale(), 67987 shift = localeSorted ? locale._week.dow : 0, 67988 i, 67989 out = []; 67990 67991 if (index != null) { 67992 return get$1(format, (index + shift) % 7, field, 'day'); 67993 } 67994 67995 for (i = 0; i < 7; i++) { 67996 out[i] = get$1(format, (i + shift) % 7, field, 'day'); 67997 } 67998 return out; 67999 } 68000 68001 function listMonths(format, index) { 68002 return listMonthsImpl(format, index, 'months'); 68003 } 68004 68005 function listMonthsShort(format, index) { 68006 return listMonthsImpl(format, index, 'monthsShort'); 68007 } 68008 68009 function listWeekdays(localeSorted, format, index) { 68010 return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); 68011 } 68012 68013 function listWeekdaysShort(localeSorted, format, index) { 68014 return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); 68015 } 68016 68017 function listWeekdaysMin(localeSorted, format, index) { 68018 return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); 68019 } 68020 68021 getSetGlobalLocale('en', { 68022 eras: [ 68023 { 68024 since: '0001-01-01', 68025 until: +Infinity, 68026 offset: 1, 68027 name: 'Anno Domini', 68028 narrow: 'AD', 68029 abbr: 'AD', 68030 }, 68031 { 68032 since: '0000-12-31', 68033 until: -Infinity, 68034 offset: 1, 68035 name: 'Before Christ', 68036 narrow: 'BC', 68037 abbr: 'BC', 68038 }, 68039 ], 68040 dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, 68041 ordinal: function (number) { 68042 var b = number % 10, 68043 output = 68044 toInt((number % 100) / 10) === 1 68045 ? 'th' 68046 : b === 1 68047 ? 'st' 68048 : b === 2 68049 ? 'nd' 68050 : b === 3 68051 ? 'rd' 68052 : 'th'; 68053 return number + output; 68054 }, 68055 }); 68056 68057 // Side effect imports 68058 68059 hooks.lang = deprecate( 68060 'moment.lang is deprecated. Use moment.locale instead.', 68061 getSetGlobalLocale 68062 ); 68063 hooks.langData = deprecate( 68064 'moment.langData is deprecated. Use moment.localeData instead.', 68065 getLocale 68066 ); 68067 68068 var mathAbs = Math.abs; 68069 68070 function abs() { 68071 var data = this._data; 68072 68073 this._milliseconds = mathAbs(this._milliseconds); 68074 this._days = mathAbs(this._days); 68075 this._months = mathAbs(this._months); 68076 68077 data.milliseconds = mathAbs(data.milliseconds); 68078 data.seconds = mathAbs(data.seconds); 68079 data.minutes = mathAbs(data.minutes); 68080 data.hours = mathAbs(data.hours); 68081 data.months = mathAbs(data.months); 68082 data.years = mathAbs(data.years); 68083 68084 return this; 68085 } 68086 68087 function addSubtract$1(duration, input, value, direction) { 68088 var other = createDuration(input, value); 68089 68090 duration._milliseconds += direction * other._milliseconds; 68091 duration._days += direction * other._days; 68092 duration._months += direction * other._months; 68093 68094 return duration._bubble(); 68095 } 68096 68097 // supports only 2.0-style add(1, 's') or add(duration) 68098 function add$1(input, value) { 68099 return addSubtract$1(this, input, value, 1); 68100 } 68101 68102 // supports only 2.0-style subtract(1, 's') or subtract(duration) 68103 function subtract$1(input, value) { 68104 return addSubtract$1(this, input, value, -1); 68105 } 68106 68107 function absCeil(number) { 68108 if (number < 0) { 68109 return Math.floor(number); 68110 } else { 68111 return Math.ceil(number); 68112 } 68113 } 68114 68115 function bubble() { 68116 var milliseconds = this._milliseconds, 68117 days = this._days, 68118 months = this._months, 68119 data = this._data, 68120 seconds, 68121 minutes, 68122 hours, 68123 years, 68124 monthsFromDays; 68125 68126 // if we have a mix of positive and negative values, bubble down first 68127 // check: https://github.com/moment/moment/issues/2166 68128 if ( 68129 !( 68130 (milliseconds >= 0 && days >= 0 && months >= 0) || 68131 (milliseconds <= 0 && days <= 0 && months <= 0) 68132 ) 68133 ) { 68134 milliseconds += absCeil(monthsToDays(months) + days) * 864e5; 68135 days = 0; 68136 months = 0; 68137 } 68138 68139 // The following code bubbles up values, see the tests for 68140 // examples of what that means. 68141 data.milliseconds = milliseconds % 1000; 68142 68143 seconds = absFloor(milliseconds / 1000); 68144 data.seconds = seconds % 60; 68145 68146 minutes = absFloor(seconds / 60); 68147 data.minutes = minutes % 60; 68148 68149 hours = absFloor(minutes / 60); 68150 data.hours = hours % 24; 68151 68152 days += absFloor(hours / 24); 68153 68154 // convert days to months 68155 monthsFromDays = absFloor(daysToMonths(days)); 68156 months += monthsFromDays; 68157 days -= absCeil(monthsToDays(monthsFromDays)); 68158 68159 // 12 months -> 1 year 68160 years = absFloor(months / 12); 68161 months %= 12; 68162 68163 data.days = days; 68164 data.months = months; 68165 data.years = years; 68166 68167 return this; 68168 } 68169 68170 function daysToMonths(days) { 68171 // 400 years have 146097 days (taking into account leap year rules) 68172 // 400 years have 12 months === 4800 68173 return (days * 4800) / 146097; 68174 } 68175 68176 function monthsToDays(months) { 68177 // the reverse of daysToMonths 68178 return (months * 146097) / 4800; 68179 } 68180 68181 function as(units) { 68182 if (!this.isValid()) { 68183 return NaN; 68184 } 68185 var days, 68186 months, 68187 milliseconds = this._milliseconds; 68188 68189 units = normalizeUnits(units); 68190 68191 if (units === 'month' || units === 'quarter' || units === 'year') { 68192 days = this._days + milliseconds / 864e5; 68193 months = this._months + daysToMonths(days); 68194 switch (units) { 68195 case 'month': 68196 return months; 68197 case 'quarter': 68198 return months / 3; 68199 case 'year': 68200 return months / 12; 68201 } 68202 } else { 68203 // handle milliseconds separately because of floating point math errors (issue #1867) 68204 days = this._days + Math.round(monthsToDays(this._months)); 68205 switch (units) { 68206 case 'week': 68207 return days / 7 + milliseconds / 6048e5; 68208 case 'day': 68209 return days + milliseconds / 864e5; 68210 case 'hour': 68211 return days * 24 + milliseconds / 36e5; 68212 case 'minute': 68213 return days * 1440 + milliseconds / 6e4; 68214 case 'second': 68215 return days * 86400 + milliseconds / 1000; 68216 // Math.floor prevents floating point math errors here 68217 case 'millisecond': 68218 return Math.floor(days * 864e5) + milliseconds; 68219 default: 68220 throw new Error('Unknown unit ' + units); 68221 } 68222 } 68223 } 68224 68225 // TODO: Use this.as('ms')? 68226 function valueOf$1() { 68227 if (!this.isValid()) { 68228 return NaN; 68229 } 68230 return ( 68231 this._milliseconds + 68232 this._days * 864e5 + 68233 (this._months % 12) * 2592e6 + 68234 toInt(this._months / 12) * 31536e6 68235 ); 68236 } 68237 68238 function makeAs(alias) { 68239 return function () { 68240 return this.as(alias); 68241 }; 68242 } 68243 68244 var asMilliseconds = makeAs('ms'), 68245 asSeconds = makeAs('s'), 68246 asMinutes = makeAs('m'), 68247 asHours = makeAs('h'), 68248 asDays = makeAs('d'), 68249 asWeeks = makeAs('w'), 68250 asMonths = makeAs('M'), 68251 asQuarters = makeAs('Q'), 68252 asYears = makeAs('y'); 68253 68254 function clone$1() { 68255 return createDuration(this); 68256 } 68257 68258 function get$2(units) { 68259 units = normalizeUnits(units); 68260 return this.isValid() ? this[units + 's']() : NaN; 68261 } 68262 68263 function makeGetter(name) { 68264 return function () { 68265 return this.isValid() ? this._data[name] : NaN; 68266 }; 68267 } 68268 68269 var milliseconds = makeGetter('milliseconds'), 68270 seconds = makeGetter('seconds'), 68271 minutes = makeGetter('minutes'), 68272 hours = makeGetter('hours'), 68273 days = makeGetter('days'), 68274 months = makeGetter('months'), 68275 years = makeGetter('years'); 68276 68277 function weeks() { 68278 return absFloor(this.days() / 7); 68279 } 68280 68281 var round = Math.round, 68282 thresholds = { 68283 ss: 44, // a few seconds to seconds 68284 s: 45, // seconds to minute 68285 m: 45, // minutes to hour 68286 h: 22, // hours to day 68287 d: 26, // days to month/week 68288 w: null, // weeks to month 68289 M: 11, // months to year 68290 }; 68291 68292 // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize 68293 function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { 68294 return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); 68295 } 68296 68297 function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) { 68298 var duration = createDuration(posNegDuration).abs(), 68299 seconds = round(duration.as('s')), 68300 minutes = round(duration.as('m')), 68301 hours = round(duration.as('h')), 68302 days = round(duration.as('d')), 68303 months = round(duration.as('M')), 68304 weeks = round(duration.as('w')), 68305 years = round(duration.as('y')), 68306 a = 68307 (seconds <= thresholds.ss && ['s', seconds]) || 68308 (seconds < thresholds.s && ['ss', seconds]) || 68309 (minutes <= 1 && ['m']) || 68310 (minutes < thresholds.m && ['mm', minutes]) || 68311 (hours <= 1 && ['h']) || 68312 (hours < thresholds.h && ['hh', hours]) || 68313 (days <= 1 && ['d']) || 68314 (days < thresholds.d && ['dd', days]); 68315 68316 if (thresholds.w != null) { 68317 a = 68318 a || 68319 (weeks <= 1 && ['w']) || 68320 (weeks < thresholds.w && ['ww', weeks]); 68321 } 68322 a = a || 68323 (months <= 1 && ['M']) || 68324 (months < thresholds.M && ['MM', months]) || 68325 (years <= 1 && ['y']) || ['yy', years]; 68326 68327 a[2] = withoutSuffix; 68328 a[3] = +posNegDuration > 0; 68329 a[4] = locale; 68330 return substituteTimeAgo.apply(null, a); 68331 } 68332 68333 // This function allows you to set the rounding function for relative time strings
68334 function getSetRelativeTimeRounding(roundingFunction) { 68335 if (roundingFunction === undefined) { 68336 return round; 68337 } 68338 if (typeof roundingFunction === 'function') { 68339 round = roundingFunction; 68340 return true; 68341 } 68342 return false; 68343 } 68344 68345 // This function allows you to set a threshold for relative time strings 68346 function getSetRelativeTimeThreshold(threshold, limit) { 68347 if (thresholds[threshold] === undefined) { 68348 return false; 68349 } 68350 if (limit === undefined) { 68351 return thresholds[threshold]; 68352 } 68353 thresholds[threshold] = limit; 68354 if (threshold === 's') { 68355 thresholds.ss = limit - 1; 68356 } 68357 return true; 68358 } 68359 68360 function humanize(argWithSuffix, argThresholds) { 68361 if (!this.isValid()) { 68362 return this.localeData().invalidDate(); 68363 } 68364 68365 var withSuffix = false, 68366 th = thresholds, 68367 locale, 68368 output; 68369 68370 if (typeof argWithSuffix === 'object') { 68371 argThresholds = argWithSuffix; 68372 argWithSuffix = false; 68373 } 68374 if (typeof argWithSuffix === 'boolean') { 68375 withSuffix = argWithSuffix; 68376 } 68377 if (typeof argThresholds === 'object') { 68378 th = Object.assign({}, thresholds, argThresholds); 68379 if (argThresholds.s != null && argThresholds.ss == null) { 68380 th.ss = argThresholds.s - 1; 68381 } 68382 } 68383 68384 locale = this.localeData(); 68385 output = relativeTime$1(this, !withSuffix, th, locale); 68386 68387 if (withSuffix) { 68388 output = locale.pastFuture(+this, output); 68389 } 68390 68391 return locale.postformat(output); 68392 } 68393 68394 var abs$1 = Math.abs; 68395 68396 function sign(x) { 68397 return (x > 0) - (x < 0) || +x; 68398 } 68399 68400 function toISOString$1() { 68401 // for ISO strings we do not use the normal bubbling rules: 68402 // * milliseconds bubble up until they become hours 68403 // * days do not bubble at all 68404 // * months bubble up until they become years 68405 // This is because there is no context-free conversion between hours and days 68406 // (think of clock changes) 68407 // and also not between days and months (28-31 days per month) 68408 if (!this.isValid()) { 68409 return this.localeData().invalidDate(); 68410 } 68411 68412 var seconds = abs$1(this._milliseconds) / 1000, 68413 days = abs$1(this._days), 68414 months = abs$1(this._months), 68415 minutes, 68416 hours, 68417 years, 68418 s, 68419 total = this.asSeconds(), 68420 totalSign, 68421 ymSign, 68422 daysSign, 68423 hmsSign; 68424 68425 if (!total) { 68426 // this is the same as C#'s (Noda) and python (isodate)... 68427 // but not other JS (goog.date) 68428 return 'P0D'; 68429 } 68430 68431 // 3600 seconds -> 60 minutes -> 1 hour 68432 minutes = absFloor(seconds / 60); 68433 hours = absFloor(minutes / 60); 68434 seconds %= 60; 68435 minutes %= 60; 68436 68437 // 12 months -> 1 year 68438 years = absFloor(months / 12); 68439 months %= 12; 68440 68441 // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js 68442 s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; 68443 68444 totalSign = total < 0 ? '-' : ''; 68445 ymSign = sign(this._months) !== sign(total) ? '-' : ''; 68446 daysSign = sign(this._days) !== sign(total) ? '-' : ''; 68447 hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; 68448 68449 return ( 68450 totalSign + 68451 'P' + 68452 (years ? ymSign + years + 'Y' : '') + 68453 (months ? ymSign + months + 'M' : '') + 68454 (days ? daysSign + days + 'D' : '') + 68455 (hours || minutes || seconds ? 'T' : '') + 68456 (hours ? hmsSign + hours + 'H' : '') + 68457 (minutes ? hmsSign + minutes + 'M' : '') + 68458 (seconds ? hmsSign + s + 'S' : '') 68459 ); 68460 } 68461 68462 var proto$2 = Duration.prototype; 68463 68464 proto$2.isValid = isValid$1; 68465 proto$2.abs = abs; 68466 proto$2.add = add$1; 68467 proto$2.subtract = subtract$1; 68468 proto$2.as = as; 68469 proto$2.asMilliseconds = asMilliseconds; 68470 proto$2.asSeconds = asSeconds; 68471 proto$2.asMinutes = asMinutes; 68472 proto$2.asHours = asHours; 68473 proto$2.asDays = asDays; 68474 proto$2.asWeeks = asWeeks; 68475 proto$2.asMonths = asMonths; 68476 proto$2.asQuarters = asQuarters; 68477 proto$2.asYears = asYears; 68478 proto$2.valueOf = valueOf$1; 68479 proto$2._bubble = bubble; 68480 proto$2.clone = clone$1; 68481 proto$2.get = get$2; 68482 proto$2.milliseconds = milliseconds; 68483 proto$2.seconds = seconds; 68484 proto$2.minutes = minutes; 68485 proto$2.hours = hours; 68486 proto$2.days = days; 68487 proto$2.weeks = weeks; 68488 proto$2.months = months; 68489 proto$2.years = years; 68490 proto$2.humanize = humanize; 68491 proto$2.toISOString = toISOString$1; 68492 proto$2.toString = toISOString$1; 68493 proto$2.toJSON = toISOString$1; 68494 proto$2.locale = locale; 68495 proto$2.localeData = localeData; 68496 68497 proto$2.toIsoString = deprecate( 68498 'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', 68499 toISOString$1 68500 ); 68501 proto$2.lang = lang; 68502 68503 // FORMATTING 68504 68505 addFormatToken('X', 0, 0, 'unix'); 68506 addFormatToken('x', 0, 0, 'valueOf'); 68507 68508 // PARSING 68509 68510 addRegexToken('x', matchSigned); 68511 addRegexToken('X', matchTimestamp); 68512 addParseToken('X', function (input, array, config) { 68513 config._d = new Date(parseFloat(input) * 1000); 68514 }); 68515 addParseToken('x', function (input, array, config) { 68516 config._d = new Date(toInt(input)); 68517 }); 68518 68519 //! moment.js 68520 68521 hooks.version = '2.29.4'; 68522 68523 setHookCallback(createLocal); 68524 68525 hooks.fn = proto; 68526 hooks.min = min; 68527 hooks.max = max; 68528 hooks.now = now; 68529 hooks.utc = createUTC; 68530 hooks.unix = createUnix; 68531 hooks.months = listMonths; 68532 hooks.isDate = isDate; 68533 hooks.locale = getSetGlobalLocale; 68534 hooks.invalid = createInvalid; 68535 hooks.duration = createDuration; 68536 hooks.isMoment = isMoment; 68537 hooks.weekdays = listWeekdays; 68538 hooks.parseZone = createInZone; 68539 hooks.localeData = getLocale; 68540 hooks.isDuration = isDuration; 68541 hooks.monthsShort = listMonthsShort; 68542 hooks.weekdaysMin = listWeekdaysMin; 68543 hooks.defineLocale = defineLocale; 68544 hooks.updateLocale = updateLocale; 68545 hooks.locales = listLocales; 68546 hooks.weekdaysShort = listWeekdaysShort; 68547 hooks.normalizeUnits = normalizeUnits; 68548 hooks.relativeTimeRounding = getSetRelativeTimeRounding; 68549 hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; 68550 hooks.calendarFormat = getCalendarFormat; 68551 hooks.prototype = proto; 68552 68553 // currently HTML5 input type only supports 24-hour formats 68554 hooks.HTML5_FMT = { 68555 DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" /> 68556 DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" /> 68557 DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" /> 68558 DATE: 'YYYY-MM-DD', // <input type="date" /> 68559 TIME: 'HH:mm', // <input type="time" /> 68560 TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" /> 68561 TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" /> 68562 WEEK: 'GGGG-[W]WW', // <input type="week" /> 68563 MONTH: 'YYYY-MM', // <input type="month" /> 68564 }; 68565 68566 return hooks; 68567 68568}))); 68569 68570//! moment-timezone.js 68571//! version : 0.5.31 68572//! Copyright (c) JS Foundation and other contributors 68573//! license : MIT 68574//! github.com/moment/moment-timezone 68575 68576(function (root, factory) { 68577 "use strict"; 68578 68579 /*global define*/ 68580 if (typeof module === 'object' && module.exports) { 68581 module.exports = factory(require('moment')); // Node 68582 } else if (typeof define === 'function' && define.amd) { 68583 define(['moment'], factory); // AMD 68584 } else { 68585 factory(root.moment); // Browser 68586 } 68587}(this, function (moment) { 68588 "use strict"; 68589 68590 // Resolves es6 module loading issue 68591 if (moment.version === undefined && moment.default) { 68592 moment = moment.default; 68593 } 68594 68595 // Do not load moment-timezone a second time. 68596 // if (moment.tz !== undefined) { 68597 // logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion); 68598 // return moment; 68599 // } 68600 68601 var VERSION = "0.5.31", 68602 zones = {}, 68603 links = {}, 68604 countries = {}, 68605 names = {}, 68606 guesses = {}, 68607 cachedGuess; 68608 68609 if (!moment || typeof moment.version !== 'string') { 68610 logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/'); 68611 } 68612 68613 var momentVersion = moment.version.split('.'), 68614 major = +momentVersion[0], 68615 minor = +momentVersion[1]; 68616 68617 // Moment.js version check 68618 if (major < 2 || (major === 2 && minor < 6)) { 68619 logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com'); 68620 } 68621 68622 /************************************ 68623 Unpacking 68624 ************************************/ 68625 68626 function charCodeToInt(charCode) { 68627 if (charCode > 96) { 68628 return charCode - 87; 68629 } else if (charCode > 64) { 68630 return charCode - 29; 68631 } 68632 return charCode - 48; 68633 } 68634 68635 function unpackBase60(string) { 68636 var i = 0, 68637 parts = string.split('.'), 68638 whole = parts[0], 68639 fractional = parts[1] || '', 68640 multiplier = 1, 68641 num, 68642 out = 0, 68643 sign = 1; 68644 68645 // handle negative numbers 68646 if (string.charCodeAt(0) === 45) { 68647 i = 1; 68648 sign = -1; 68649 } 68650 68651 // handle digits before the decimal 68652 for (i; i < whole.length; i++) { 68653 num = charCodeToInt(whole.charCodeAt(i)); 68654 out = 60 * out + num; 68655 } 68656 68657 // handle digits after the decimal 68658 for (i = 0; i < fractional.length; i++) { 68659 multiplier = multiplier / 60; 68660 num = charCodeToInt(fractional.charCodeAt(i)); 68661 out += num * multiplier; 68662 } 68663 68664 return out * sign; 68665 } 68666 68667 function arrayToInt (array) { 68668 for (var i = 0; i < array.length; i++) { 68669 array[i] = unpackBase60(array[i]); 68670 } 68671 } 68672 68673 function intToUntil (array, length) { 68674 for (var i = 0; i < length; i++) { 68675 array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds 68676 } 68677 68678 array[length - 1] = Infinity; 68679 } 68680 68681 function mapIndices (source, indices) { 68682 var out = [], i; 68683 68684 for (i = 0; i < indices.length; i++) { 68685 out[i] = source[indices[i]]; 68686 } 68687 68688 return out; 68689 } 68690 68691 function unpack (string) { 68692 var data = string.split('|'), 68693 offsets = data[2].split(' '), 68694 indices = data[3].split(''), 68695 untils = data[4].split(' '); 68696 68697 arrayToInt(offsets); 68698 arrayToInt(indices); 68699 arrayToInt(untils); 68700 68701 intToUntil(untils, indices.length); 68702 68703 return { 68704 name : data[0], 68705 abbrs : mapIndices(data[1].split(' '), indices), 68706 offsets : mapIndices(offsets, indices), 68707 untils : untils, 68708 population : data[5] | 0 68709 }; 68710 } 68711 68712 /************************************ 68713 Zone object 68714 ************************************/ 68715 68716 function Zone (packedString) { 68717 if (packedString) { 68718 this._set(unpack(packedString)); 68719 } 68720 } 68721 68722 Zone.prototype = { 68723 _set : function (unpacked) { 68724 this.name = unpacked.name; 68725 this.abbrs = unpacked.abbrs; 68726 this.untils = unpacked.untils; 68727 this.offsets = unpacked.offsets; 68728 this.population = unpacked.population; 68729 }, 68730 68731 _index : function (timestamp) { 68732 var target = +timestamp, 68733 untils = this.untils, 68734 i; 68735 68736 for (i = 0; i < untils.length; i++) { 68737 if (target < untils[i]) { 68738 return i; 68739 } 68740 } 68741 }, 68742 68743 countries : function () { 68744 var zone_name = this.name; 68745 return Object.keys(countries).filter(function (country_code) { 68746 return countries[country_code].zones.indexOf(zone_name) !== -1; 68747 }); 68748 }, 68749 68750 parse : function (timestamp) { 68751 var target = +timestamp, 68752 offsets = this.offsets, 68753 untils = this.untils, 68754 max = untils.length - 1, 68755 offset, offsetNext, offsetPrev, i; 68756 68757 for (i = 0; i < max; i++) { 68758 offset = offsets[i]; 68759 offsetNext = offsets[i + 1]; 68760 offsetPrev = offsets[i ? i - 1 : i]; 68761 68762 if (offset < offsetNext && tz.moveAmbiguousForward) { 68763 offset = offsetNext; 68764 } else if (offset > offsetPrev && tz.moveInvalidForward) { 68765 offset = offsetPrev; 68766 } 68767 68768 if (target < untils[i] - (offset * 60000)) { 68769 return offsets[i]; 68770 } 68771 } 68772 68773 return offsets[max]; 68774 }, 68775 68776 abbr : function (mom) { 68777 return this.abbrs[this._index(mom)]; 68778 }, 68779 68780 offset : function (mom) {
vendor: 3,253 bytes, lines 68781-68914
68781 logError("zone.offset has been deprecated in favor of zone.utcOffset"); 68782 return this.offsets[this._index(mom)]; 68783 }, 68784 68785 utcOffset : function (mom) { 68786 return this.offsets[this._index(mom)]; 68787 } 68788 }; 68789 68790 /************************************ 68791 Country object 68792 ************************************/ 68793 68794 function Country (country_name, zone_names) { 68795 this.name = country_name; 68796 this.zones = zone_names; 68797 } 68798 68799 /************************************ 68800 Current Timezone 68801 ************************************/ 68802 68803 function OffsetAt(at) { 68804 var timeString = at.toTimeString(); 68805 var abbr = timeString.match(/\([a-z ]+\)/i); 68806 if (abbr && abbr[0]) { 68807 // 17:56:31 GMT-0600 (CST) 68808 // 17:56:31 GMT-0600 (Central Standard Time) 68809 abbr = abbr[0].match(/[A-Z]/g); 68810 abbr = abbr ? abbr.join('') : undefined; 68811 } else { 68812 // 17:56:31 CST 68813 // 17:56:31 GMT+0800 (å°åæ¨æºæé) 68814 abbr = timeString.match(/[A-Z]{3,5}/g); 68815 abbr = abbr ? abbr[0] : undefined; 68816 } 68817 68818 if (abbr === 'GMT') { 68819 abbr = undefined; 68820 } 68821 68822 this.at = +at; 68823 this.abbr = abbr; 68824 this.offset = at.getTimezoneOffset(); 68825 } 68826 68827 function ZoneScore(zone) { 68828 this.zone = zone; 68829 this.offsetScore = 0; 68830 this.abbrScore = 0; 68831 } 68832 68833 ZoneScore.prototype.scoreOffsetAt = function (offsetAt) { 68834 this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset); 68835 if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) { 68836 this.abbrScore++; 68837 } 68838 }; 68839 68840 function findChange(low, high) { 68841 var mid, diff; 68842 68843 while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) { 68844 mid = new OffsetAt(new Date(low.at + diff)); 68845 if (mid.offset === low.offset) { 68846 low = mid; 68847 } else { 68848 high = mid; 68849 } 68850 } 68851 68852 return low; 68853 } 68854 68855 function userOffsets() { 68856 var startYear = new Date().getFullYear() - 2, 68857 last = new OffsetAt(new Date(startYear, 0, 1)), 68858 offsets = [last], 68859 change, next, i; 68860 68861 for (i = 1; i < 48; i++) { 68862 next = new OffsetAt(new Date(startYear, i, 1)); 68863 if (next.offset !== last.offset) { 68864 change = findChange(last, next); 68865 offsets.push(change); 68866 offsets.push(new OffsetAt(new Date(change.at + 6e4))); 68867 } 68868 last = next; 68869 } 68870 68871 for (i = 0; i < 4; i++) { 68872 offsets.push(new OffsetAt(new Date(startYear + i, 0, 1))); 68873 offsets.push(new OffsetAt(new Date(startYear + i, 6, 1))); 68874 } 68875 68876 return offsets; 68877 } 68878 68879 function sortZoneScores (a, b) { 68880 if (a.offsetScore !== b.offsetScore) { 68881 return a.offsetScore - b.offsetScore; 68882 } 68883 if (a.abbrScore !== b.abbrScore) { 68884 return a.abbrScore - b.abbrScore; 68885 } 68886 if (a.zone.population !== b.zone.population) { 68887 return b.zone.population - a.zone.population; 68888 } 68889 return b.zone.name.localeCompare(a.zone.name); 68890 } 68891 68892 function addToGuesses (name, offsets) { 68893 var i, offset; 68894 arrayToInt(offsets); 68895 for (i = 0; i < offsets.length; i++) { 68896 offset = offsets[i]; 68897 guesses[offset] = guesses[offset] || {}; 68898 guesses[offset][name] = true; 68899 } 68900 } 68901 68902 function guessesForUserOffsets (offsets) { 68903 var offsetsLength = offsets.length, 68904 filteredGuesses = {}, 68905 out = [], 68906 i, j, guessesOffset; 68907 68908 for (i = 0; i < offsetsLength; i++) { 68909 guessesOffset = guesses[offsets[i].offset] || {}; 68910 for (j in guessesOffset) { 68911 if (guessesOffset.hasOwnProperty(j)) { 68912 filteredGuesses[j] = true; 68913 } 68914 }
vendor: 4,401 bytes, lines 68914-69117
68914 68915 } 68916 68917 for (i in filteredGuesses) { 68918 if (filteredGuesses.hasOwnProperty(i)) { 68919 out.push(names[i]); 68920 } 68921 } 68922 68923 return out; 68924 } 68925 68926 function rebuildGuess () { 68927 68928 // use Intl API when available and returning valid time zone 68929 try { 68930 var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone; 68931 if (intlName && intlName.length > 3) { 68932 var name = names[normalizeName(intlName)]; 68933 if (name) { 68934 return name; 68935 } 68936 logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded."); 68937 } 68938 } catch (e) { 68939 // Intl unavailable, fall back to manual guessing. 68940 } 68941 68942 var offsets = userOffsets(), 68943 offsetsLength = offsets.length, 68944 guesses = guessesForUserOffsets(offsets), 68945 zoneScores = [], 68946 zoneScore, i, j; 68947 68948 for (i = 0; i < guesses.length; i++) { 68949 zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength); 68950 for (j = 0; j < offsetsLength; j++) { 68951 zoneScore.scoreOffsetAt(offsets[j]); 68952 } 68953 zoneScores.push(zoneScore); 68954 } 68955 68956 zoneScores.sort(sortZoneScores); 68957 68958 return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined; 68959 } 68960 68961 function guess (ignoreCache) { 68962 if (!cachedGuess || ignoreCache) { 68963 cachedGuess = rebuildGuess(); 68964 } 68965 return cachedGuess; 68966 } 68967 68968 /************************************ 68969 Global Methods 68970 ************************************/ 68971 68972 function normalizeName (name) { 68973 return (name || '').toLowerCase().replace(/\//g, '_'); 68974 } 68975 68976 function addZone (packed) { 68977 var i, name, split, normalized; 68978 68979 if (typeof packed === "string") { 68980 packed = [packed]; 68981 } 68982 68983 for (i = 0; i < packed.length; i++) { 68984 split = packed[i].split('|'); 68985 name = split[0]; 68986 normalized = normalizeName(name); 68987 zones[normalized] = packed[i]; 68988 names[normalized] = name; 68989 addToGuesses(normalized, split[2].split(' ')); 68990 } 68991 } 68992 68993 function getZone (name, caller) { 68994 68995 name = normalizeName(name); 68996 68997 var zone = zones[name]; 68998 var link; 68999 69000 if (zone instanceof Zone) { 69001 return zone; 69002 } 69003 69004 if (typeof zone === 'string') { 69005 zone = new Zone(zone); 69006 zones[name] = zone; 69007 return zone; 69008 } 69009 69010 // Pass getZone to prevent recursion more than 1 level deep 69011 if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) { 69012 zone = zones[name] = new Zone(); 69013 zone._set(link); 69014 zone.name = names[name]; 69015 return zone; 69016 } 69017 69018 return null; 69019 } 69020 69021 function getNames () { 69022 var i, out = []; 69023 69024 for (i in names) { 69025 if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) { 69026 out.push(names[i]); 69027 } 69028 } 69029 69030 return out.sort(); 69031 } 69032 69033 function getCountryNames () { 69034 return Object.keys(countries); 69035 } 69036 69037 function addLink (aliases) { 69038 var i, alias, normal0, normal1; 69039 69040 if (typeof aliases === "string") { 69041 aliases = [aliases]; 69042 } 69043 69044 for (i = 0; i < aliases.length; i++) { 69045 alias = aliases[i].split('|'); 69046 69047 normal0 = normalizeName(alias[0]); 69048 normal1 = normalizeName(alias[1]); 69049 69050 links[normal0] = normal1; 69051 names[normal0] = alias[0]; 69052 69053 links[normal1] = normal0; 69054 names[normal1] = alias[1]; 69055 } 69056 } 69057 69058 function addCountries (data) { 69059 var i, country_code, country_zones, split; 69060 if (!data || !data.length) return; 69061 for (i = 0; i < data.length; i++) { 69062 split = data[i].split('|'); 69063 country_code = split[0].toUpperCase(); 69064 country_zones = split[1].split(' '); 69065 countries[country_code] = new Country( 69066 country_code, 69067 country_zones 69068 ); 69069 } 69070 } 69071 69072 function getCountry (name) { 69073 name = name.toUpperCase(); 69074 return countries[name] || null; 69075 } 69076 69077 function zonesForCountry(country, with_offset) { 69078 country = getCountry(country); 69079 69080 if (!country) return null; 69081 69082 var zones = country.zones.sort(); 69083 69084 if (with_offset) { 69085 return zones.map(function (zone_name) { 69086 var zone = getZone(zone_name); 69087 return { 69088 name: zone_name, 69089 offset: zone.utcOffset(new Date()) 69090 }; 69091 }); 69092 } 69093 69094 return zones; 69095 } 69096 69097 function loadData (data) { 69098 addZone(data.zones); 69099 addLink(data.links); 69100 addCountries(data.countries); 69101 tz.dataVersion = data.version; 69102 } 69103 69104 function zoneExists (name) { 69105 if (!zoneExists.didShowError) { 69106 zoneExists.didShowError = true; 69107 logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')"); 69108 } 69109 return !!getZone(name); 69110 } 69111 69112 function needsOffset (m) { 69113 var isUnixTimestamp = (m._f === 'X' || m._f === 'x'); 69114 return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp); 69115 } 69116 69117 function
vendor: 5,778 bytes, lines 69117-69273
69117logError (message) { 69118 if (typeof console !== 'undefined' && typeof console.error === 'function') { 69119 console.error(message); 69120 } 69121 } 69122 69123 /************************************ 69124 moment.tz namespace 69125 ************************************/ 69126 69127 function tz (input) { 69128 var args = Array.prototype.slice.call(arguments, 0, -1), 69129 name = arguments[arguments.length - 1], 69130 zone = getZone(name), 69131 out = moment.utc.apply(null, args); 69132 69133 if (zone && !moment.isMoment(input) && needsOffset(out)) { 69134 out.add(zone.parse(out), 'minutes'); 69135 } 69136 69137 out.tz(name); 69138 69139 return out; 69140 } 69141 69142 tz.version = VERSION; 69143 tz.dataVersion = ''; 69144 tz._zones = zones; 69145 tz._links = links; 69146 tz._names = names; 69147 tz._countries = countries; 69148 tz.add = addZone; 69149 tz.link = addLink; 69150 tz.load = loadData; 69151 tz.zone = getZone; 69152 tz.zoneExists = zoneExists; // deprecated in 0.1.0 69153 tz.guess = guess; 69154 tz.names = getNames; 69155 tz.Zone = Zone; 69156 tz.unpack = unpack; 69157 tz.unpackBase60 = unpackBase60; 69158 tz.needsOffset = needsOffset; 69159 tz.moveInvalidForward = true; 69160 tz.moveAmbiguousForward = false; 69161 tz.countries = getCountryNames; 69162 tz.zonesForCountry = zonesForCountry; 69163 69164 /************************************ 69165 Interface with Moment.js 69166 ************************************/ 69167 69168 var fn = moment.fn; 69169 69170 moment.tz = tz; 69171 69172 moment.defaultZone = null; 69173 69174 moment.updateOffset = function (mom, keepTime) { 69175 var zone = moment.defaultZone, 69176 offset; 69177 69178 if (mom._z === undefined) { 69179 if (zone && needsOffset(mom) && !mom._isUTC) { 69180 mom._d = moment.utc(mom._a)._d; 69181 mom.utc().add(zone.parse(mom), 'minutes'); 69182 } 69183 mom._z = zone; 69184 } 69185 if (mom._z) { 69186 offset = mom._z.utcOffset(mom); 69187 if (Math.abs(offset) < 16) { 69188 offset = offset / 60; 69189 } 69190 if (mom.utcOffset !== undefined) { 69191 var z = mom._z; 69192 mom.utcOffset(-offset, keepTime); 69193 mom._z = z; 69194 } else { 69195 mom.zone(offset, keepTime); 69196 } 69197 } 69198 }; 69199 69200 fn.tz = function (name, keepTime) { 69201 if (name) { 69202 if (typeof name !== 'string') { 69203 throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']'); 69204 } 69205 this._z = getZone(name); 69206 if (this._z) { 69207 moment.updateOffset(this, keepTime); 69208 } else { 69209 logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/."); 69210 } 69211 return this; 69212 } 69213 if (this._z) { return this._z.name; } 69214 }; 69215 69216 function abbrWrap (old) { 69217 return function () { 69218 if (this._z) { return this._z.abbr(this); } 69219 return old.call(this); 69220 }; 69221 } 69222 69223 function resetZoneWrap (old) { 69224 return function () { 69225 this._z = null; 69226 return old.apply(this, arguments); 69227 }; 69228 } 69229 69230 function resetZoneWrap2 (old) { 69231 return function () { 69232 if (arguments.length > 0) this._z = null; 69233 return old.apply(this, arguments); 69234 }; 69235 } 69236 69237 fn.zoneName = abbrWrap(fn.zoneName); 69238 fn.zoneAbbr = abbrWrap(fn.zoneAbbr); 69239 fn.utc = resetZoneWrap(fn.utc); 69240 fn.local = resetZoneWrap(fn.local); 69241 fn.utcOffset = resetZoneWrap2(fn.utcOffset); 69242 69243 moment.tz.setDefault = function(name) { 69244 if (major < 2 || (major === 2 && minor < 9)) { 69245 logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.'); 69246 } 69247 moment.defaultZone = name ? getZone(name) : null; 69248 return moment; 69249 }; 69250 69251 // Cloning a moment should include the _z property. 69252 var momentProperties = moment.momentProperties; 69253 if (Object.prototype.toString.call(momentProperties) === '[object Array]') { 69254 // moment 2.8.1+ 69255 momentProperties.push('_z'); 69256 momentProperties.push('_a'); 69257 } else if (momentProperties) { 69258 // moment 2.7.0 69259 momentProperties._z = null; 69260 } 69261 69262 loadData({ 69263 "version": "2020a", 69264 "zones": [ 69265 "Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5", 69266 "Africa/Accra|LMT GMT +0020|.Q 0 -k|012121212121212121212121212121212121212121212121|-26BbX.8 6tzX.8 MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE 1BAk MnE 1C0k MnE 1BAk MnE 1BAk MnE|41e5", 69267 "Africa/Nairobi|LMT EAT +0230 +0245|-2r.g -30 -2u -2J|01231|-1F3Cr.g 3Dzr.g okMu MFXJ|47e5", 69268 "Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5", 69269 "Africa/Lagos|LMT WAT|-d.A -10|01|-22y0d.A|17e6", 69270 "Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4", 69271 "Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5", 69272 "Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6", 69273 "Africa/Casablanca|LMT +00 +01|u.k 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e
6927300 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|32e5", 69274 "Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3", 69275 "Africa/El_Aaiun|LMT -01 +00 +01|Q.M 10 0 -10|012323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e
6927500 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|20e4", 69276 "Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5", 69277 "Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|01212121212121212121212121212121213|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0|", 69278 "Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5", 69279 "Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5", 69280 "Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5", 69281 "Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|0121|-2le00 4i6N0 2q00|", 69282 "Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5", 69283 "Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5", 69284 "Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4", 69285 "America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326", 69286 "America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4", 69287 "America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3", 69288 "America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4", 69289 "America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0|", 69290 "America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0|", 69291 "America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0|", 69292 "America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0|", 69293 "America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|", 69294 "America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0|", 69295 "America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|", 69296 "America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0|", 69297 "America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0|", 69298 "America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0|", 69299 "America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0|", 69300 "America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0|", 69301 "America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4", 69302 "America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5", 69303 "America/Atikokan|CST CDT CWT CPT EST|60 50 50 50 50|0101234|-25TQ0 1in0 Rnb0 3je0 8x30 iw0|28e2",
69304 "America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3", 69305 "America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5", 69306 "America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4", 69307 "America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5", 69308 "America/Belize|LMT CST -0530 CDT|5Q.M 60 5u 50|01212121212121212121212121212121212121212121212121213131|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1f0Mu qn0 lxB0 mn0|57e3", 69309 "America/Blanc-Sablon|AST ADT AWT APT|40 30 30 30|010230|-25TS0 1in0 UGp0 8x50 iu0|11e2", 69310 "America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2", 69311 "America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5", 69312 "America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4", 69313 "America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2", 69314 "America/Campo_Grande|LMT -04 -03|3C.s 40 30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4", 69315 "America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG
693150 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4", 69316 "America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5", 69317 "America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3", 69318 "America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5", 69319 "America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5", 69320 "America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4", 69321 "America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5", 69322 "America/Creston|MST PST|70 80|010|-29DR0 43B0|53e2", 69323 "America/Cuiaba|LMT -04 -03|3I.k 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|54e4", 69324 "America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8", 69325 "America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3", 69326 "America/Dawson|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|01010230405656565656565656565656565656565656565656565656565656565656565656565656565656565657|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|13e2", 69327 "America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5", 69328 "America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|0123425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 JxX1 SMX 1cN0 1cL0 aW10 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5", 69329 "America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|0121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 XQp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5", 69330 "America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3", 69331 "America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5", 69332 "America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5", 69333 "America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2", 69334 "America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69335 "America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5", 69336 "America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3", 69337 "America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3", 69338 "America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|01023232323232324523232323232323232323232323232323232323232676767676767676767676767676767676767676767676867676
693387676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2", 69339 "America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|01212121212121212121212121212121212121212121212121212121212121212121212121232121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 5Ip0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2", 69340 "America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5", 69341 "America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5", 69342 "America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4", 69343 "America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4", 69344 "America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5",
69345 "America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4", 69346 "America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69347 "America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69348 "America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69349 "America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010401054541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 8wn0 1cN0 1cL0 1cN0 1cK0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69350 "America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69351 "America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69352 "America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69353 "America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2", 69354 "America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2", 69355 "America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4", 69356 "America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3", 69357 "America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 1nX1 e0X 9vd0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69358 "America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69359 "America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5", 69360 "America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6", 69361 "America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6", 69362 "America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4", 69363 "America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5", 69364 "America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5", 69365 "America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4", 69366 "America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4",
69367 "America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4", 69368 "America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2", 69369 "America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5", 69370 "America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|01203030303030303030303030303030304545450454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2", 69371 "America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6", 69372 "America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2", 69373 "America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3", 69374 "America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5", 69375 "America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5", 69376 "America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5", 69377 "America/Nassau|LMT EST EDT|59.u 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2kNuO.u 26XdO.u 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4",
69378 "America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6", 69379 "America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2", 69380 "America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2", 69381 "America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2", 69382 "America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69383 "America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69384 "America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69385 "America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 de
69385L0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3", 69386 "America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2", 69387 "America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4", 69388 "America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5", 69389 "America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5", 69390 "America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4", 69391 "America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4", 69392 "America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5", 69393 "America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|", 69394 "America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842", 69395 "America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2", 69396 "America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5", 69397 "America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4", 69398 "America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229", 69399 "America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4", 69400 "America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|62e5", 69401 "America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5", 69402 "America/Sao_Paulo|LMT -03 -02|36.s 30 20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6", 69403 "America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452", 69404 "America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2",
69405 "America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4", 69406 "America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3", 69407 "America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5", 69408 "America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656", 69409 "America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4", 69410 "America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5", 69411 "America/Whitehorse|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|01010230405656565656565656565656565656565656565656565656565656565656565656565656565656565657|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|23e3", 69412 "America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4", 69413 "America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642", 69414 "America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3", 69415 "Antarctica/Casey|-00 +08 +11|0 -80 -b0|01212121|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10|10", 69416 "Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70", 69417 "Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80", 69418 "Antarctica/Macquarie|AEST AEDT -00 +11|-a0 -b0 0 -b0|0102010101010101010101010101010101010101010101010101010101010101010101010101010101010101013|-29E80 19X0 4SL0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0|1", 69419 "Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60", 69420 "Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|010202020202
6942002020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5", 69421 "Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40", 69422 "Antarctica/Rothera|-00 -03|0 30|01|gOo0|130", 69423 "Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20", 69424 "Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40", 69425 "Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25", 69426 "Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4", 69427 "Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5", 69428 "Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5", 69429 "Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5", 69430 "Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3", 69431 "Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4", 69432 "Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4", 69433 "Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4", 69434 "Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|", 69435 "Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5",
69436 "Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4", 69437 "Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5", 69438 "Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6", 69439 "Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|", 69440 "Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5", 69441 "Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4", 69442 "Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4", 69443 "Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6", 69444 "Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4", 69445 "Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3", 69446 "Asia/Shanghai|CST CDT|-80 -90|01010101010101010101010101010|-23uw0 18n0 OjB0 Rz0 11d0 1wL0 A10 8HX0 1G10 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 aL0 1tU30 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6", 69447 "Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5", 69448 "Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6", 69449 "Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5", 69450 "Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4", 69451 "Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5", 69452 "Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4", 69453 "Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312
69453121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|", 69454 "Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|0101010101010101010101010101010123232323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXd0 gM0 8Q00 IM0 1wM0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0|18e5", 69455 "Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101012323232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2q0 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 pBd0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXd0 gM0 8Q00 IM0 1wM0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nz0 1220 1qL0 WN0 1qL0 WN0 1qL0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0 Wo0 1rc0 11c0 1oo0 11c0 1oo0 11c0 1oo0 11c0 1rc0|25e4", 69456 "Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5", 69457 "Asia/Hong_Kong|LMT HKT HKST HKWT JST|-7A.G -80 -90 -8u -90|0123412121212121212121212121212121212121212121212121212121212121212121|-2CFH0 1taO0 Hc0 xUu 9tBu 11z0 1tDu Rc0 1wo0 11A0 1cM0 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5", 69458 "Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3", 69459 "Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4", 69460 "Europe/Istanbul|IMT EET EEST +03 +04|-1U.U -20 -30 -30 -40|0121212121212121212121212121212121212121212121234312121212121212121212121212121212121212121212121212121212121212123|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSN0 CL0 mp0 1Vz0 1gN0 8yn0 1yp0 ML0 1kp0 17b
694600 1ip0 17b0 1fB0 19X0 1ip0 19X0 1ip0 17b0 qdB0 38L0 1jd0 Tz0 l6O0 11A0 WN0 1qL0 TB0 1tX0 U10 1tz0 11B0 1in0 17d0 z90 cne0 pb0 2Cp0 1800 14o0 1dc0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6", 69461 "Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6", 69462 "Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4", 69463 "Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|012121212121321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyMk.E 5Rb0 10r0 1px0 10N0 1pz0 16p0 1jB0 16p0 1jx0 3LB0 Em0 or0 1cn0 1dB0 16n0 10O0 1ja0 1tC0 14o0 1cM0 1a00 11A0 1Na0 An0 1MP0 AJ0 1Kp0 LC0 1oo0 Wl0 EQN0 Db0 1fB0 Rb0 bXd0 gM0 8Q00 IM0 1wM0 11z0 1C10 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4", 69464 "Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5", 69465 "Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4", 69466 "Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6", 69467 "Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5", 69468 "Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5", 69469 "Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2", 69470 "Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5", 69471 "Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5", 69472 "Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4", 69473 "Asia/Macau|LMT CST +09 +10 CDT|-7y.a -80 -90 -a0 -90|012323214141414141414141414141414141414141414141414141414141414141414141|-2CFHy.a 1uqKy.a PX0 1kn0 15B0 11b0 4Qq0 1oM0 11c0 1ko0 1u00 11A0 1cM0 11c0 1o00 11A0 1o00 11A0 1oo0 1400 1o00 11A0 1o00 U00 1tA0 U00 1wo0 Rc0 1wru U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cK0 1cO0 1cK0 1cO0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4", 69474 "Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3",
69475 "Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5", 69476 "Asia/Manila|PST PDT JST|-80 -90 -90|010201010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6", 69477 "Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4", 69478 "Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4", 69479 "Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5", 69480 "Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5", 69481 "Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4", 69482 "Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4", 69483 "Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BA0|29e5", 69484 "Asia/Qostanay|LMT +04 +05 +06|-4e.s -40 -50 -60|012323232323232323232123232323232323232323232323|-1Pc4e.s eUoe.s 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|", 69485 "Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|01232323232323232323232323232323232323232323232|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 zQl0|73e4", 69486 "Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5", 69487 "Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4", 69488 "Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4", 69489 "Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -a0 -9u|012343434343151515151515134343|-2um8r.Q 97XV.Q 1m1zu 6CM0 Fz0 1kN0 14n0 1kN0 14L0 1zd0 On0 69B0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6", 69490 "Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2",
69491 "Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5", 69492 "Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5", 69493 "Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5", 69494 "Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6", 69495 "Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3", 69496 "Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rc0 1lc0 14o0 1zc0 Oo0 1zc0 Oo0|38e6", 69497 "Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5", 69498 "Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5", 69499 "Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2", 69500 "Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4", 69501 "Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4", 69502 "Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5", 69503 "Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5", 69504 "Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4", 69505 "Atlantic/Bermuda|LMT AST ADT|4j.i 40 30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1BnRE.G 1LTbE.G 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3",
69506 "Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4", 69507 "Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4", 69508 "Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3", 69509 "Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4", 69510 "Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4", 69511 "Atlantic/South_Georgia|-02|20|0||30", 69512 "Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2", 69513 "Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5", 69514 "Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5", 69515 "Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5", 69516 "Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3", 69517 "Australia/Currie|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|746", 69518 "Australia/Darwin|ACST ACDT|-9u -au|010101010|-293lt xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0|12e4", 69519 "Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293kI xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368", 69520 "Australia/Hobart|AEST AEDT|-a0 -b0|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 19X0 10jd0 yL0 1cN0 1cL0 1fB0 19X0 VfB0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4", 69521 "Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu
695211cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347", 69522 "Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10", 69523 "Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293lX xcX 10jd0 yL0 1cN0 1cL0 1fB0 19X0 17c10 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5", 69524 "Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293jX xcX 10jd0 yL0 1cN0 1cL0 1gSp0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5", 69525 "CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|", 69526 "Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|30e2", 69527 "CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69528 "EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|", 69529 "Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", 69530 "EST|EST|50|0||", 69531 "EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69532 "Etc/GMT-0|GMT|0|0||", 69533 "Etc/GMT-1|+01|-10|0||", 69534 "Pacific/Port_Moresby|+10|-a0|0||25e4", 69535 "Etc/GMT-11|+11|-b0|0||", 69536 "Pacific/Tarawa|+12|-c0|0||29e3", 69537 "Etc/GMT-13|+13|-d0|0||", 69538 "Etc/GMT-14|+14|-e0|0||", 69539 "Etc/GMT-2|+02|-20|0||", 69540 "Etc/GMT-3|+03|-30|0||", 69541 "Etc/GMT-4|+04|-40|0||", 69542 "Etc/GMT-5|+05|-50|0||", 69543 "Etc/GMT-6|+06|-60|0||", 69544 "Indian/Christmas|+07|-70|0||21e2", 69545 "Etc/GMT-8|+08|-80|0||", 69546 "Pacific/Palau|+09|-90|0||21e3", 69547 "Etc/GMT+1|-01|10|0||", 69548 "Etc/GMT+10|-10|a0|0||", 69549 "Etc/GMT+11|-11|b0|0||", 69550 "Etc/GMT+12|-12|c0|0||", 69551 "Etc/GMT+3|-03|30|0||", 69552 "Etc/GMT+4|-04|40|0||", 69553 "Etc/GMT+5|-05|50|0||", 69554 "Etc/GMT+6|-06|60|0||", 69555 "Etc/GMT+7|-07|70|0||", 69556 "Etc/GMT+8|-08|80|0||", 69557 "Etc/GMT+9|-09|90|0||", 69558 "Etc/UTC|UTC|0|0||", 69559 "Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 U
69559o0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5", 69560 "Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3", 69561 "Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5", 69562 "Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5", 69563 "Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6", 69564 "Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", 69565 "Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5", 69566 "Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5", 69567 "Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5", 69568 "Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5", 69569 "Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1ip0 17b0 1op0 1tb0 Q2m0 3Ne0 WM0 1fA0 1cM0 1cM0 1oJ0 1dc0 1030 1fA0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1iM0 1fA0 8Ha0 Rb0 1wN0 Rb0 1BB0 Lz0 1C20 LB0 SNX0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5", 69570 "Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4", 69571 "Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4", 69572 "Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", 69573 "Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3", 69574 "Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", 69575 "Europe/Kaliningrad|CET CEST EET EEST MSK MSD +03|-10 -20 -20 -30 -30 -40 -30|01010101010101232454545454545454543232323232323232323232323232323232323232323262|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 390 7A0 1en0 12N0 1pbb0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4", 69576 "Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5", 69577 "Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4",
69578 "Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5", 69579 "Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4", 69580 "Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5", 69581 "Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4", 69582 "Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5", 69583 "Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3", 69584 "Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6", 69585 "Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco8.l cNb8.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6", 69586 "Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -2
695860 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4", 69587 "Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5", 69588 "Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5", 69589 "Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810|", 69590 "Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4", 69591 "Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", 69592 "Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5", 69593 "Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4", 69594 "Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4", 69595 "Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5", 69596 "Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4", 69597 "Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1ao0 1co0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5", 69598 "Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4", 69599 "Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0|10e5", 69600 "Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5", 69601 "Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4", 69602 "HST|HST|a0|0||", 69603 "Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2", 69604 "Indian/Cocos|+0630|-6u|0||596", 69605 "Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130", 69606 "Indian/Mahe|LMT +04|-3F.M -40|01|-2yO3F.M|79e3", 69607 "Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4", 69608 "Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4", 69609 "Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4", 69610 "Pacific/Kwajalein|+11 +10 +09 -12 +12|-b0 -a0 -90 c0 -c0|012034|-1kln0 akp0 6Up0 12ry0 Wan0|14e3", 69611 "MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|", 69612 "MST|MST|70|0||", 69613 "MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69614 "Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600", 69615 "Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545454545454545454545454545454545454|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|37e3", 69616 "Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4", 69617 "Pacific/Chuuk|+10 +09|-a0 -90|01010|-2ewy0 axB0 RVX0 axd0|49e3", 69618 "Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|0121212121212121212121|-2l9nd.g 2Szcd.g 1cL0 1oN0 10L0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3",
69619 "Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B7X0|1", 69620 "Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483", 69621 "Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|0121212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 20o0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00|88e4", 69622 "Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3", 69623 "Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125", 69624 "Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4", 69625 "Pacific/Guam|GST +09 GDT ChST|-a0 -90 -b0 -a0|01020202020202020203|-18jK0 6pB0 AhB0 3QL0 g2p0 3p91 WOX rX0 1zd0 Rb0 1wp0 Rb0 5xd0 rX0 5sN0 zb1 1C0X On0 ULb0|17e4", 69626 "Pacific/Honolulu|HST HDT HWT HPT HST|au 9u 9u 9u a0|0102304|-1thLu 8x0 lef0 8wWu iAu 46p0|37e4", 69627 "Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2", 69628 "Pacific/Kosrae|+11 +09 +10 +12|-b0 -90 -a0 -c0|01021030|-2ewz0 axC0 HBy0 akp0 axd0 WOK0 1bdz0|66e2", 69629 "Pacific/Majuro|+11 +09 +10 +12|-b0 -90 -a0 -c0|0102103|-2ewz0 axC0 HBy0 akp0 6RB0 12um0|28e3", 69630 "Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2", 69631 "Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2", 69632 "Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E QCnB.E 7mqu 1lnbu|10e3", 69633 "Pacific/Niue|-1120 -1130 -11|bk bu b0|012|-KfME 17y0a|12e2", 69634 "Pacific/Norfolk|+1112 +1130 +1230 +11 +12|-bc -bu -cu -b0 -c0|012134343434343434343434343434343434343434|-Kgbc W01G Oo0 1COo0 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|25e4", 69635 "Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3", 69636 "Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56", 69637 "Pacific/Pohnpei|+11 +09 +10|-b0 -90 -a0|010210|-2ewz0 axC0 HBy0 akp0 axd0|34e3", 69638 "Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3", 69639 "Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4", 69640 "Pacific/Tongatapu|+1220 +13 +14|-ck -d0 -e0|0121212121|-1aB0k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3", 69641 "PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", 69642 "WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|" 69643 ], 69644 "links": [ 69645 "Africa/Abidjan|Africa/Bamako", 69646 "Africa/Abidjan|Africa/Banjul", 69647 "Africa/Abidjan|Africa/Conakry", 69648 "Africa/Abidjan|Africa/Dakar", 69649 "Africa/Abidjan|Africa/Freetown", 69650 "Africa/Abidjan|Africa/Lome", 69651 "Africa/Abidjan|Africa/Nouakchott", 69652 "Africa/Abidjan|Africa/Ouagadougou", 69653 "Africa/Abidjan|Africa/Timbuktu", 69654 "Africa/Abidjan|Atlantic/St_Helena", 69655 "Africa/Cairo|Egypt", 69656 "Africa/Johannesburg|Africa/Maseru", 69657 "Africa/Johannesburg|Africa/Mbabane", 69658 "Africa/Lagos|Africa/Bangui", 69659 "Africa/Lagos|Africa/Brazzaville", 69660 "Africa/Lagos|Africa/Douala", 69661 "Africa/Lagos|Africa/Kinshasa", 69662 "Africa/Lagos|Africa/Libreville", 69663 "Africa/Lagos|Africa/Luanda", 69664 "Africa/Lagos|Africa/Malabo", 69665 "Africa/Lagos|Africa/Niamey", 69666 "Africa/Lagos|Africa/Porto-Novo", 69667 "Africa/Maputo|Africa/Blantyre", 69668 "Africa/Maputo|Africa/Bujumbura", 69669 "Africa/Maputo|Africa/Gaborone", 69670 "Africa/Maputo|Africa/Harare",
69671 "Africa/Maputo|Africa/Kigali", 69672 "Africa/Maputo|Africa/Lubumbashi", 69673 "Africa/Maputo|Africa/Lusaka", 69674 "Africa/Nairobi|Africa/Addis_Ababa", 69675 "Africa/Nairobi|Africa/Asmara", 69676 "Africa/Nairobi|Africa/Asmera", 69677 "Africa/Nairobi|Africa/Dar_es_Salaam", 69678 "Africa/Nairobi|Africa/Djibouti", 69679 "Africa/Nairobi|Africa/Kampala", 69680 "Africa/Nairobi|Africa/Mogadishu", 69681 "Africa/Nairobi|Indian/Antananarivo", 69682 "Africa/Nairobi|Indian/Comoro", 69683 "Africa/Nairobi|Indian/Mayotte", 69684 "Africa/Tripoli|Libya", 69685 "America/Adak|America/Atka", 69686 "America/Adak|US/Aleutian", 69687 "America/Anchorage|US/Alaska", 69688 "America/Argentina/Buenos_Aires|America/Buenos_Aires", 69689 "America/Argentina/Catamarca|America/Argentina/ComodRivadavia", 69690 "America/Argentina/Catamarca|America/Catamarca", 69691 "America/Argentina/Cordoba|America/Cordoba", 69692 "America/Argentina/Cordoba|America/Rosario", 69693 "America/Argentina/Jujuy|America/Jujuy", 69694 "America/Argentina/Mendoza|America/Mendoza", 69695 "America/Atikokan|America/Coral_Harbour", 69696 "America/Chicago|US/Central", 69697 "America/Curacao|America/Aruba", 69698 "America/Curacao|America/Kralendijk", 69699 "America/Curacao|America/Lower_Princes", 69700 "America/Denver|America/Shiprock", 69701 "America/Denver|Navajo", 69702 "America/Denver|US/Mountain", 69703 "America/Detroit|US/Michigan", 69704 "America/Edmonton|Canada/Mountain", 69705 "America/Fort_Wayne|America/Indiana/Indianapolis", 69706 "America/Fort_Wayne|America/Indianapolis", 69707 "America/Fort_Wayne|US/East-Indiana", 69708 "America/Godthab|America/Nuuk", 69709 "America/Halifax|Canada/Atlantic", 69710 "America/Havana|Cuba", 69711 "America/Indiana/Knox|America/Knox_IN", 69712 "America/Indiana/Knox|US/Indiana-Starke", 69713 "America/Jamaica|Jamaica", 69714 "America/Kentucky/Louisville|America/Louisville", 69715 "America/Los_Angeles|US/Pacific", 69716 "America/Los_Angeles|US/Pacific-New", 69717 "America/Manaus|Brazil/West", 69718 "America/Mazatlan|Mexico/BajaSur", 69719 "America/Mexico_City|Mexico/General", 69720 "America/New_York|US/Eastern", 69721 "America/Noronha|Brazil/DeNoronha", 69722 "America/Panama|America/Cayman", 69723 "America/Phoenix|US/Arizona", 69724 "America/Port_of_Spain|America/Anguilla", 69725 "America/Port_of_Spain|America/Antigua", 69726 "America/Port_of_Spain|America/Dominica", 69727 "America/Port_of_Spain|America/Grenada", 69728 "America/Port_of_Spain|America/Guadeloupe", 69729 "America/Port_of_Spain|America/Marigot", 69730 "America/Port_of_Spain|America/Montserrat", 69731 "America/Port_of_Spain|America/St_Barthelemy", 69732 "America/Port_of_Spain|America/St_Kitts", 69733 "America/Port_of_Spain|America/St_Lucia", 69734 "America/Port_of_Spain|America/St_Thomas", 69735 "America/Port_of_Spain|America/St_Vincent", 69736 "America/Port_of_Spain|America/Tortola", 69737 "America/Port_of_Spain|America/Virgin", 69738 "America/Regina|Canada/Saskatchewan", 69739 "America/Rio_Branco|America/Porto_Acre", 69740 "America/Rio_Branco|Brazil/Acre", 69741 "America/Santiago|Chile/Continental", 69742 "America/Sao_Paulo|Brazil/East",
69743 "America/St_Johns|Canada/Newfoundland", 69744 "America/Tijuana|America/Ensenada", 69745 "America/Tijuana|America/Santa_Isabel", 69746 "America/Tijuana|Mexico/BajaNorte", 69747 "America/Toronto|America/Montreal", 69748 "America/Toronto|Canada/Eastern", 69749 "America/Vancouver|Canada/Pacific", 69750 "America/Whitehorse|Canada/Yukon", 69751 "America/Winnipeg|Canada/Central", 69752 "Asia/Ashgabat|Asia/Ashkhabad", 69753 "Asia/Bangkok|Asia/Phnom_Penh", 69754 "Asia/Bangkok|Asia/Vientiane", 69755 "Asia/Dhaka|Asia/Dacca", 69756 "Asia/Dubai|Asia/Muscat", 69757 "Asia/Ho_Chi_Minh|Asia/Saigon", 69758 "Asia/Hong_Kong|Hongkong", 69759 "Asia/Jerusalem|Asia/Tel_Aviv", 69760 "Asia/Jerusalem|Israel", 69761 "Asia/Kathmandu|Asia/Katmandu", 69762 "Asia/Kolkata|Asia/Calcutta", 69763 "Asia/Kuala_Lumpur|Asia/Singapore", 69764 "Asia/Kuala_Lumpur|Singapore", 69765 "Asia/Macau|Asia/Macao", 69766 "Asia/Makassar|Asia/Ujung_Pandang", 69767 "Asia/Nicosia|Europe/Nicosia", 69768 "Asia/Qatar|Asia/Bahrain", 69769 "Asia/Rangoon|Asia/Yangon", 69770 "Asia/Riyadh|Asia/Aden", 69771 "Asia/Riyadh|Asia/Kuwait", 69772 "Asia/Seoul|ROK", 69773 "Asia/Shanghai|Asia/Chongqing", 69774 "Asia/Shanghai|Asia/Chungking", 69775 "Asia/Shanghai|Asia/Harbin", 69776 "Asia/Shanghai|PRC", 69777 "Asia/Taipei|ROC", 69778 "Asia/Tehran|Iran", 69779 "Asia/Thimphu|Asia/Thimbu", 69780 "Asia/Tokyo|Japan", 69781 "Asia/Ulaanbaatar|Asia/Ulan_Bator", 69782 "Asia/Urumqi|Asia/Kashgar", 69783 "Atlantic/Faroe|Atlantic/Faeroe", 69784 "Atlantic/Reykjavik|Iceland", 69785 "Atlantic/South_Georgia|Etc/GMT+2", 69786 "Australia/Adelaide|Australia/South", 69787 "Australia/Brisbane|Australia/Queensland", 69788 "Australia/Broken_Hill|Australia/Yancowinna", 69789 "Australia/Darwin|Australia/North", 69790 "Australia/Hobart|Australia/Tasmania", 69791 "Australia/Lord_Howe|Australia/LHI", 69792 "Australia/Melbourne|Australia/Victoria", 69793 "Australia/Perth|Australia/West", 69794 "Australia/Sydney|Australia/ACT", 69795 "Australia/Sydney|Australia/Canberra", 69796 "Australia/Sydney|Australia/NSW", 69797 "Etc/GMT-0|Etc/GMT", 69798 "Etc/GMT-0|Etc/GMT+0", 69799 "Etc/GMT-0|Etc/GMT0", 69800 "Etc/GMT-0|Etc/Greenwich", 69801 "Etc/GMT-0|GMT", 69802 "Etc/GMT-0|GMT+0", 69803 "Etc/GMT-0|GMT-0", 69804 "Etc/GMT-0|GMT0", 69805 "Etc/GMT-0|Greenwich", 69806 "Etc/UTC|Etc/UCT", 69807 "Etc/UTC|Etc/Universal", 69808 "Etc/UTC|Etc/Zulu", 69809 "Etc/UTC|UCT", 69810 "Etc/UTC|UTC", 69811 "Etc/UTC|Universal", 69812 "Etc/UTC|Zulu", 69813 "Europe/Belgrade|Europe/Ljubljana", 69814 "Europe/Belgrade|Europe/Podgorica", 69815 "Europe/Belgrade|Europe/Sarajevo", 69816 "Europe/Belgrade|Europe/Skopje", 69817 "Europe/Belgrade|Europe/Zagreb", 69818 "Europe/Chisinau|Europe/Tiraspol", 69819 "Europe/Dublin|Eire", 69820 "Europe/Helsinki|Europe/Mariehamn", 69821 "Europe/Istanbul|Asia/Istanbul", 69822 "Europe/Istanbul|Turkey", 69823 "Europe/Lisbon|Portugal", 69824 "Europe/London|Europe/Belfast", 69825 "Europe/London|Europe/Guernsey", 69826 "Europe/London|Europe/Isle_of_Man", 69827 "Europe/London|Europe/Jersey", 69828 "Europe/London|GB", 69829 "Europe/London|GB-Eire", 69830 "Europe/Moscow|W-SU", 69831 "Europe/Oslo|Arctic/Longyearbyen", 69832 "Europe/Oslo|Atlantic/Jan_Mayen", 69833 "Europe/Prague|Europe/Bratislava", 69834 "Europe/Rome|Europe/San_Marino", 69835 "Europe/Rome|Europe/Vatican", 69836 "Europe/Warsaw|Poland", 69837 "Europe/Zurich|Europe/Busingen", 69838 "Europe/Zurich|Europe/Vaduz", 69839 "Indian/Christmas|Etc/GMT-7", 69840 "Pacific/Auckland|Antarctica/McMurdo", 69841 "Pacific/Auckland|Antarctica/South_Pole", 69842 "Pacific/Auckland|NZ", 69843 "Pacific/Chatham|NZ-CHAT", 69844 "Pacific/Chuuk|Pacific/Truk", 69845 "Pacific/Chuuk|Pacific/Yap", 69846 "Pacific/Easter|Chile/EasterIsland", 69847 "Pacific/Guam|Pacific/Saipan", 69848 "Pacific/Honolulu|Pacific/Johnston", 69849 "Pacific/Honolulu|US/Hawaii", 69850 "Pacific/Kwajalein|Kwajalein", 69851 "Pacific/Pago_Pago|Pacific/Midway", 69852 "Pacific/Pago_Pago|Pacific/Samoa", 69853 "Pacific/Pago_Pago|US/Samoa", 69854 "Pacific/Palau|Etc/GMT-9", 69855 "Pacific/Pohnpei|Pacific/Ponape", 69856 "Pacific/Port_Moresby|Etc/GMT-10", 69857 "Pacific/Tarawa|Etc/GMT-12", 69858 "Pacific/Tarawa|Pacific/Funafuti", 69859 "Pacific/Tarawa|Pacific/Wake", 69860 "Pacific/Tarawa|Pacific/Wallis" 69861 ], 69862 "countries": [ 69863 "AD|Europe/Andorra", 69864 "AE|Asia/Dubai", 69865 "AF|Asia/Kabul", 69866 "AG|America/Port_of_Spain America/Antigua", 69867 "AI|America/Port_of_Spain America/Anguilla", 69868 "AL|Europe/Tirane", 69869 "AM|Asia/Yerevan", 69870 "AO|Africa/Lagos Africa/Luanda", 69871 "AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo", 69872 "AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia", 69873 "AS|Pacific/Pago_Pago", 69874 "AT|Europe/Vienna", 69875 "AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Currie Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla", 69876 "AW|America/Curacao America/Aruba", 69877 "AX|Europe/Helsinki Europe/Mariehamn", 69878 "AZ|Asia/Baku", 69879 "BA|Europe/Belgrade Europe/Sarajevo", 69880 "BB|America/Barbados", 69881 "BD|Asia/Dhaka", 69882 "BE|Europe/Brussels", 69883 "BF|Africa/Abidjan Africa/Ouagadougou", 69884 "BG|Europe/Sofia", 69885 "BH|Asia/Qatar Asia/Bahrain", 69886 "BI|Africa/Maputo Africa/Bujumbura", 69887 "BJ|Africa/Lagos Africa/Porto-Novo", 69888 "BL|America/Port_of_Spain America/St_Barthelemy", 69889 "BM|Atlantic/Bermuda", 69890 "BN|Asia/Brunei", 69891 "BO|America/La_Paz", 69892 "BQ|America/Curacao America/Kralendijk", 69893 "BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco", 69894 "BS|America/Nassau", 69895 "BT|Asia/Thimphu", 69896 "BW|Africa/Maputo Africa/Gaborone", 69897 "BY|Europe/Minsk", 69898 "BZ|America/Belize", 69899 "CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Vancouver America/Whitehorse America/Dawson", 69900 "CC|Indian/Cocos", 69901 "CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi", 69902 "CF|Africa/Lagos Africa/Bangui", 69903 "CG|Africa/Lagos Africa/Brazzaville", 69904 "CH|Europe/Zurich", 69905 "CI|Africa/Abidjan", 69906 "CK|Pacific/Rarotonga", 69907 "CL|America/Santiago America/Punta_Arenas Pacific/Easter", 69908 "CM|Africa/Lagos Africa/Douala", 69909 "CN|Asia/Shanghai Asia/Urumqi", 69910 "CO|America/Bogota", 69911 "CR|America/Costa_Rica", 69912 "CU|America/Havana", 69913 "CV|Atlantic/Cape_Verde", 69914 "CW|America/Curacao", 69915 "CX|Indian/Christmas", 69916 "CY|Asia/Nicosia Asia/Famagusta", 69917 "CZ|Europe/Prague", 69918 "DE|Europe/Zurich Europe/Berlin Europe/Busingen", 69919 "DJ|Africa/Nairobi Africa/Djibouti", 69920 "DK|Europe/Copenhagen", 69921 "DM|America/Port_of_Spain America/Dominica", 69922 "DO|America/Santo_Domingo", 69923 "DZ|Africa/Algiers", 69924 "EC|America/Guayaquil Pacific/Galapagos", 69925 "EE|Europe/Tallinn", 69926 "EG|Africa/Cairo", 69927 "EH|Africa/El_Aaiun", 69928 "ER|Africa/Nairobi Africa/Asmara", 69929 "ES|Europe/Madrid Africa/Ceuta Atlantic/Canary", 69930 "ET|Africa/Nairobi Africa/Addis_Ababa", 69931 "FI|Europe/Helsinki", 69932 "FJ|Pacific/Fiji", 69933 "FK|Atlantic/Stanley", 69934 "FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae", 69935 "FO|Atlantic/Faroe", 69936 "FR|Europe/Paris", 69937 "GA|Africa/Lagos Africa/Libreville", 69938 "GB|Europe/London", 69939 "GD|America/Port_of_Spain America/Grenada", 69940 "GE|Asia/Tbilisi", 69941 "GF|America/Cayenne",
69942 "GG|Europe/London Europe/Guernsey", 69943 "GH|Africa/Accra", 69944 "GI|Europe/Gibraltar", 69945 "GL|America/Godthab America/Danmarkshavn America/Scoresbysund America/Thule", 69946 "GM|Africa/Abidjan Africa/Banjul", 69947 "GN|Africa/Abidjan Africa/Conakry", 69948 "GP|America/Port_of_Spain America/Guadeloupe", 69949 "GQ|Africa/Lagos Africa/Malabo", 69950 "GR|Europe/Athens", 69951 "GS|Atlantic/South_Georgia", 69952 "GT|America/Guatemala", 69953 "GU|Pacific/Guam", 69954 "GW|Africa/Bissau", 69955 "GY|America/Guyana", 69956 "HK|Asia/Hong_Kong", 69957 "HN|America/Tegucigalpa", 69958 "HR|Europe/Belgrade Europe/Zagreb", 69959 "HT|America/Port-au-Prince", 69960 "HU|Europe/Budapest", 69961 "ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura", 69962 "IE|Europe/Dublin", 69963 "IL|Asia/Jerusalem", 69964 "IM|Europe/London Europe/Isle_of_Man", 69965 "IN|Asia/Kolkata", 69966 "IO|Indian/Chagos", 69967 "IQ|Asia/Baghdad", 69968 "IR|Asia/Tehran", 69969 "IS|Atlantic/Reykjavik", 69970 "IT|Europe/Rome", 69971 "JE|Europe/London Europe/Jersey", 69972 "JM|America/Jamaica", 69973 "JO|Asia/Amman", 69974 "JP|Asia/Tokyo", 69975 "KE|Africa/Nairobi", 69976 "KG|Asia/Bishkek", 69977 "KH|Asia/Bangkok Asia/Phnom_Penh", 69978 "KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati", 69979 "KM|Africa/Nairobi Indian/Comoro", 69980 "KN|America/Port_of_Spain America/St_Kitts", 69981 "KP|Asia/Pyongyang", 69982 "KR|Asia/Seoul", 69983 "KW|Asia/Riyadh Asia/Kuwait", 69984 "KY|America/Panama America/Cayman", 69985 "KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral", 69986 "LA|Asia/Bangkok Asia/Vientiane", 69987 "LB|Asia/Beirut", 69988 "LC|America/Port_of_Spain America/St_Lucia", 69989 "LI|Europe/Zurich Europe/Vaduz", 69990 "LK|Asia/Colombo", 69991 "LR|Africa/Monrovia", 69992 "LS|Africa/Johannesburg Africa/Maseru", 69993 "LT|Europe/Vilnius", 69994 "LU|Europe/Luxembourg", 69995 "LV|Europe/Riga", 69996 "LY|Africa/Tripoli", 69997 "MA|Africa/Casablanca", 69998 "MC|Europe/Monaco", 69999 "MD|Europe/Chisinau", 70000 "ME|Europe/Belgrade Europe/Podgorica", 70001 "MF|America/Port_of_Spain America/Marigot", 70002 "MG|Africa/Nairobi Indian/Antananarivo", 70003 "MH|Pacific/Majuro Pacific/Kwajalein", 70004 "MK|Europe/Belgrade Europe/Skopje", 70005 "ML|Africa/Abidjan Africa/Bamako", 70006 "MM|Asia/Yangon", 70007 "MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan", 70008 "MO|Asia/Macau", 70009 "MP|Pacific/Guam Pacific/Saipan", 70010 "MQ|America/Martinique", 70011 "MR|Africa/Abidjan Africa/Nouakchott", 70012 "MS|America/Port_of_Spain America/Montserrat", 70013 "MT|Europe/Malta", 70014 "MU|Indian/Mauritius", 70015 "MV|Indian/Maldives", 70016 "MW|Africa/Maputo Africa/Blantyre", 70017 "MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas", 70018 "MY|Asia/Kuala_Lumpur Asia/Kuching", 70019 "MZ|Africa/Maputo", 70020 "NA|Africa/Windhoek", 70021 "NC|Pacific/Noumea", 70022 "NE|Africa/Lagos Africa/Niamey", 70023 "NF|Pacific/Norfolk", 70024 "NG|Africa/Lagos", 70025 "NI|America/Managua", 70026 "NL|Europe/Amsterdam", 70027 "NO|Europe/Oslo", 70028 "NP|Asia/Kathmandu", 70029 "NR|Pacific/Nauru", 70030 "NU|Pacific/Niue", 70031 "NZ|Pacific/Auckland Pacific/Chatham", 70032 "OM|Asia/Dubai Asia/Muscat", 70033 "PA|America/Panama", 70034 "PE|America/Lima", 70035 "PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier", 70036 "PG|Pacific/Port_Moresby Pacific/Bougainville", 70037 "PH|Asia/Manila", 70038 "PK|Asia/Karachi", 70039 "PL|Europe/Warsaw", 70040 "PM|America/Miquelon", 70041 "PN|Pacific/Pitcairn", 70042 "PR|America/Puerto_Rico", 70043 "PS|Asia/Gaza Asia/Hebron", 70044 "PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores", 70045 "PW|Pacific/Palau", 70046 "PY|America/Asuncion", 70047 "QA|Asia/Qatar", 70048 "RE|Indian/Reunion", 70049 "RO|Europe/Bucharest", 70050 "RS|Europe/Belgrade", 70051 "RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Astrakhan Europe/Volgograd Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr", 70052 "RW|Africa/Maputo Africa/Kigali", 70053 "SA|Asia/Riyadh", 70054 "SB|Pacific/Guadalcanal", 70055 "SC|Indian/Mahe", 70056 "SD|Africa/Khartoum", 70057 "SE|Europe/Stockholm", 70058 "SG|Asia/Singapore", 70059 "SH|Africa/Abidjan Atlantic/St_Helena", 70060 "SI|Europe/Belgrade Europe/Ljubljana", 70061 "SJ|Europe/Oslo Arctic/Longyearbyen", 70062 "SK|Europe/Prague Europe/Bratislava", 70063 "SL|Africa/Abidjan Africa/Freetown", 70064 "SM|Europe/Rome Europe/San_Marino", 70065 "SN|Africa/Abidjan Africa/Dakar", 70066 "SO|Africa/Nairobi Africa/Mogadishu", 70067 "SR|America/Paramaribo", 70068 "SS|Africa/Juba", 70069 "ST|Africa/Sao_Tome", 70070 "SV|America/El_Salvador", 70071 "SX|America/Curacao America/Lower_Princes", 70072 "SY|Asia/Damascus", 70073 "SZ|Africa/Johannesburg Africa/Mbabane", 70074 "TC|America/Grand_Turk", 70075 "TD|Africa/Ndjamena", 70076 "TF|Indian/Reunion Indian/Kerguelen", 70077 "TG|Africa/Abidjan Africa/Lome", 70078 "TH|Asia/Bangkok", 70079 "TJ|Asia/Dushanbe", 70080 "TK|Pacific/Fakaofo", 70081 "TL|Asia/Dili", 70082 "TM|Asia/Ashgabat", 70083 "TN|Africa/Tunis", 70084 "TO|Pacific/Tongatapu", 70085 "TR|Europe/Istanbul", 70086 "TT|America/Port_of_Spain", 70087 "TV|Pacific/Funafuti", 70088 "TW|Asia/Taipei", 70089 "TZ|Africa/Nairobi Africa/Dar_es_Salaam", 70090 "UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye", 70091 "UG|Africa/Nairobi Africa/Kampala", 70092 "UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway",
vendor: 5,109 bytes, lines 70093-70123
70093 "US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu", 70094 "UY|America/Montevideo", 70095 "UZ|Asia/Samarkand Asia/Tashkent", 70096 "VA|Europe/Rome Europe/Vatican", 70097 "VC|America/Port_of_Spain America/St_Vincent", 70098 "VE|America/Caracas", 70099 "VG|America/Port_of_Spain America/Tortola", 70100 "VI|America/Port_of_Spain America/St_Thomas", 70101 "VN|Asia/Bangkok Asia/Ho_Chi_Minh", 70102 "VU|Pacific/Efate", 70103 "WF|Pacific/Wallis", 70104 "WS|Pacific/Apia", 70105 "YE|Asia/Riyadh Asia/Aden", 70106 "YT|Africa/Nairobi Indian/Mayotte", 70107 "ZA|Africa/Johannesburg", 70108 "ZM|Africa/Maputo Africa/Lusaka", 70109 "ZW|Africa/Maputo Africa/Harare" 70110 ] 70111 }); 70112 70113 70114 return moment; 70115})); 70116 70117/** 70118 * Minified by jsDelivr using Terser v3.14.1. 70119 * Original file: /npm/[email protected]/lib/unorm.js 70120 * 70121 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 70122 */ 70123!function(t){"use strict";for(var r=[null,0,{}],e=10,n=44032,i=4352,o=4449,s=4519,u=19,f=21,a=28,h=f*a,c=u*h,l=function(t,r){this.codepoint=t,this.feature=r},p={},C=[],d=0;d<=255;++d)C[d]=0;var g=[function(t,e,n){return e<60||13311<e&&e<42607?new l(e,r):t(e,n)},function(t,r,n){var i=p[r];return i||(i=t(r,n)).feature&&++C[r>>8&255]>e&&(p[r]=i),i},function(t,r,e){return e?t(r,e):new l(r,null)},function(t,r,e){var p;if(r<i||i+u<=r&&r<n||n+c<r)return t(r,e);if(i<=r&&r<i+u){var C={},d=(r-i)*f;for(p=0;p<f;++p)C[o+p]=n+a*(p+d);return new l(r,[,,C])}var g=r-n,v=g%a,w=[];if(0!==v)w[0]=[n+g-v,s+v];else for(w[0]=[i+Math.floor(g/h),o+Math.floor(g%h/a)],w[2]={},p=1;p<a;++p)w[2][s+p]=r+p;return new l(r,w)},function(t,e,n){var i=65280&e,o=(l.udata[i]||{})[e];return new l(e,o||r)}];l.fromCharCode=g.reduceRight(function(t,r){return function(e,n){return r(t,e,n)}},null),l.isHighSurrogate=function(t){return t>=55296&&t<=56319},l.isLowSurrogate=function(t){return t>=56320&&t<=57343},l.prototype.prepFeature=function(){this.feature||(this.feature=l.fromCharCode(this.codepoint,!0).feature)},l.prototype.toString=function(){if(this.codepoint<65536)return String.fromCharCode(this.codepoint);var t=this.codepoint-65536;return String.fromCharCode(Math.floor(t/1024)+55296,t%1024+56320)},l.prototype.getDecomp=function(){return this.prepFeature(),this.feature[0]||null},l.prototype.isCompatibility=function(){return this.prepFeature(),!!this.feature[1]&&256&this.feature[1]},l.prototype.isExclude=function(){return this.prepFeature(),!!this.feature[1]&&512&this.feature[1]},l.prototype.getCanonicalClass=function(){return this.prepFeature(),this.feature[1]?255&this.feature[1]:0},l.prototype.getComposite=function(t){if(this.prepFeature(),!this.feature[2])return null;var r=this.feature[2][t.codepoint];return r?l.fromCharCode(r):null};var v=function(t){this.str=t,this.cursor=0};v.prototype.next=function(){if(this.str&&this.cursor<this.str.length){var t,r=this.str.charCodeAt(this.cursor++);return l.isHighSurrogate(r)&&this.cursor<this.str.length&&l.isLowSurrogate(t=this.str.charCodeAt(this.cursor))&&(r=1024*(r-55296)+(t-56320)+65536,++this.cursor),l.fromCharCode(r)}return this.str=null,null};var w=function(t,r){this.it=t,this.canonical=r,this.resBuf=[]};w.prototype.next=function(){if(0===this.resBuf.length){var t=this.it.next();if(!t)return null;this.resBuf=function t(r,e){var n=e.getDecomp();if(!n||r&&e.isCompatibility())return[e];for(var i=[],o=0;o<n.length;++o){var s=t(r,l.fromCharCode(n[o]));i=i.concat(s)}return i}(this.canonical,t)}return this.resBuf.shift()};var m=function(t){this.it=t,this.resBuf=[]};m.prototype.next=function(){var t;if(0===this.resBuf.length)do{var r=this.it.next();if(!r)break;t=r.getCanonicalClass();var e=this.resBuf.length;if(0!==t)for(;e>0;--e){if(this.resBuf[e-1].getCanonicalClass()<=t)break}this.resBuf.splice(e,0,r)}while(0!==t);return this.resBuf.shift()};var B=function(t){this.it=t,this.procBuf=[],this.resBuf=[],this.lastClass=null};B.prototype.next=function(){for(;0===this.resBuf.length;){var t=this.it.next();if(!t){this.resBuf=this.procBuf,this.procBuf=[];break}if(0===this.procBuf.length)this.lastClass=t.getCanonicalClass(),this.procBuf.push(t);else{var r=this.procBuf[0].getComposite(t),e=t.getCanonicalClass();r&&(this.lastClass<e||0===this.lastClass)?this.procBuf[0]=r:(0===e&&(this.resBuf=this.procBuf,this.procBuf=[]),this.lastClass=e,this.procBuf.push(t))}}return this.resBuf.shift()};var y=function(t,r){for(var e,n=function(t,r){switch(t){case"NFD":return new m(new w(new v(r),!0));case"NFKD":return new m(new w(new v(r),!1));case"NFC":return new B(new m(new w(new v(r),!0)));case"NFKC":return new B(new m(new w(new v(r),!1)))}
70123throw t+" is invalid"}(t,r),i="";e=n.next();)i+=e.toString();return i};l
vendor: 30,878 bytes, line 70123
70123.udata={0:{60:[,,{824:8814}],61:[,,{824:8800}],62:[,,{824:8815}],65:[,,{768:192,769:193,770:194,771:195,772:256,774:258,775:550,776:196,777:7842,778:197,780:461,783:512,785:514,803:7840,805:7680,808:260}],66:[,,{775:7682,803:7684,817:7686}],67:[,,{769:262,770:264,775:266,780:268,807:199}],68:[,,{775:7690,780:270,803:7692,807:7696,813:7698,817:7694}],69:[,,{768:200,769:201,770:202,771:7868,772:274,774:276,775:278,776:203,777:7866,780:282,783:516,785:518,803:7864,807:552,808:280,813:7704,816:7706}],70:[,,{775:7710}],71:[,,{769:500,770:284,772:7712,774:286,775:288,780:486,807:290}],72:[,,{770:292,775:7714,776:7718,780:542,803:7716,807:7720,814:7722}],73:[,,{768:204,769:205,770:206,771:296,772:298,774:300,775:304,776:207,777:7880,780:463,783:520,785:522,803:7882,808:302,816:7724}],74:[,,{770:308}],75:[,,{769:7728,780:488,803:7730,807:310,817:7732}],76:[,,{769:313,780:317,803:7734,807:315,813:7740,817:7738}],77:[,,{769:7742,775:7744,803:7746}],78:[,,{768:504,769:323,771:209,775:7748,780:327,803:7750,807:325,813:7754,817:7752}],79:[,,{768:210,769:211,770:212,771:213,772:332,774:334,775:558,776:214,777:7886,779:336,780:465,783:524,785:526,795:416,803:7884,808:490}],80:[,,{769:7764,775:7766}],82:[,,{769:340,775:7768,780:344,783:528,785:530,803:7770,807:342,817:7774}],83:[,,{769:346,770:348,775:7776,780:352,803:7778,806:536,807:350}],84:[,,{775:7786,780:356,803:7788,806:538,807:354,813:7792,817:7790}],85:[,,{768:217,769:218,770:219,771:360,772:362,774:364,776:220,777:7910,778:366,779:368,780:467,783:532,785:534,795:431,803:7908,804:7794,808:370,813:7798,816:7796}],86:[,,{771:7804,803:7806}],87:[,,{768:7808,769:7810,770:372,775:7814,776:7812,803:7816}],88:[,,{775:7818,776:7820}],89:[,,{768:7922,769:221,770:374,771:7928,772:562,775:7822,776:376,777:7926,803:7924}],90:[,,{769:377,770:7824,775:379,780:381,803:7826,817:7828}],97:[,,{768:224,769:225,770:226,771:227,772:257,774:259,775:551,776:228,777:7843,778:229,780:462,783:513,785:515,803:7841,805:7681,808:261}],98:[,,{775:7683,803:7685,817:7687}],99:[,,{769:263,770:265,775:267,780:269,807:231}],100:[,,{775:7691,780:271,803:7693,807:7697,813:7699,817:7695}],101:[,,{768:232,769:233,770:234,771:7869,772:275,774:277,775:279,776:235,777:7867,780:283,783:517,785:519,803:7865,807:553,808:281,813:7705,816:7707}],102:[,,{775:7711}],103:[,,{769:501,770:285,772:7713,774:287,775:289,780:487,807:291}],104:[,,{770:293,775:7715,776:7719,780:543,803:7717,807:7721,814:7723,817:7830}],105:[,,{768:236,769:237,770:238,771:297,772:299,774:301,776:239,777:7881,780:464,783:521,785:523,803:7883,808:303,816:7725}],106:[,,{770:309,780:496}],107:[,,{769:7729,780:489,803:7731,807:311,817:7733}],108:[,,{769:314,780:318,803:7735,807:316,813:7741,817:7739}],109:[,,{769:7743,775:7745,803:7747}],110:[,,{768:505,769:324,771:241,775:7749,780:328,803:7751,807:326,813:7755,817:7753}],111:[,,{768:242,769:243,770:244,771:245,772:333,774:335,775:559,776:246,777:7887,779:337,780:466,783:525,785:527,795:417,803:7885,808:491}],112:[,,{769:7765,775:7767}],114:[,,{769:341,775:7769,780:345,783:529,785:531,803:7771,807:343,817:7775}],115:[,,{769:347,770:349,775:7777,780:353,803:7779,806:537,807:351}],116:[,,{775:7787,776:7831,780:357,803:7789,806:539,807:355,813:7793,817:7791}],117:[,,{768:249,769:250,770:251,771:361,772:363,774:365,776:252,777:7911,778:367,779:369,780:468,783:533,785:535,795:432,803:7909,804:7795,808:371,813:7799,816:7797}],118:[,,{771:7805,803:7807}],119:[,,{768:7809,769:7811,770:373,775:7815,776:7813,778:7832,803:7817}],120:[,,{775:7819,776:7821}],121:[,,{768:7923,769:253,770:375,771:7929,772:563,775:7823,776:255,777:7927,778:7833,803:7925}],122:[,,{769:378,770:7825,775:380,780:382,803:7827,817:7829}],160:[[32],256],168:[[32,776],256,{768:8173,769:901,834:8129}],170:[[97],256],175:[[32,772],256],178:[[50],256],179:[[51],256],180:[[32,769],256],181:[[956],256],184:[[32,807],256],185:[[49],256],186:[[111],256],188:[[49,8260,52],256],189:[[49,8260,50],256],190:[[51,8260,52],256],192:[[65,768]],193:[[65,769]],194:[[65,770],,{768:7846,769:7844,771:7850,777:7848}],195:[[65,771]],196:[[65,776],,{772:478}],197:[[65,778],,{769:506}],198:[,,{769:508,772:482}],199:[[67,807],,{769:7688}],200:[[69,768]],201:[[69,769]],202:[[69,770],,{768:7872,769:7870,771:7876,777:7874}],203:[[69,776]],204:[[73,768]],205:[[73,769]],206:[[73,770]],207:[[73,776],,{769:7726}],209:[[78,771]],210:[[79,768]],211:[[79,769]],212:[[79,770],,{768:7890,769:7888,771:7894,777:7892}],213:[[79,771],,{769:7756,772:556,776:7758}],214:[[79,776],,{772:554}],216:[,,{769:510}],217:[[85,768]],218:[[85,769]],219:[[85,770]],220:[[85,776],,{768:475,769:471,772:469,780:473}],221:[[89,769]],224:[[97,768]],225:[[97,769]],226:[[97,770],,{768:7847,769:7845,771:7851,777:7849}],227:[[97,771]],228:[[97,776],,{772:479}],229:[[97,778],,{769:507}],230:[,,{769:509,772:483}],231:[[99,807],,{769:7689}],232:[[101,768]],233:[[101,769]],234:[[101,770],,{768:7873,769:7871,771:7877,777:7875}],235:[[101,776]],236:[[105,768]],237:[[105,769]],238:[[105,770]],239:[[105,776],,{769:7727}],241:[[110,771]],242:[[111,768]],243:[[111,769]],244:[[111,770],,{768:7891,769:7889,771:7895,777:7893}],245:[[111,771],,{769:7757,772:557,776:7759}],246:[[111,776],,{772:555}],248:[,,{769:511}],249:[[117,768]],250:[[117,769]],251:[[117,770]],252:[[117,776],,{768:476,769:472,772:470,780:474}],253:[[121,769]],255:[[121,776]]},256:{256:[[65,772]],257:[[97,772]],258:[[65,774],,{768:7856,769:7854,771:7860,777:7858}],259:[[97,774],,{768:7857,769:7855,771:7861,777:7859}],260:[[65,808]],261:[[97,808]],262:[[67,769]],263:[[99,769]],264:[[67,770]],265:[[99,770]],266:[[67,775]],267:[[99,775]],268:[[67,780]],269:[[99,780]],270:[[68,780]],271:[[100,780]],274:[[69,772],,{768:7700,769:7702}],275:[[101,772],,{768:7701,769:7703}],276:[[69,774]],277:[[101,774]],278:[[69,775]],279:[[101,775]],280:[[69,808]],281:[[101,808]],282:[[69,780]],283:[[101,780]],284:[[71,770]],285:[[103,770]],286:[[71,774]],287:[[103,774]],288:[[71,775]],289:[[103,775]],290:[[71,807]],291:[[103,807]],292:[[72,770]],293:[[104,770]],296:[[73,771]],297:[[105,771]],298:[[73,772]],299:[[105,772]],300:[[73,774]],301:[[105,774]],302:[[73,808]],303:[[105,808]],304:[[73,775]],306:[[73,74],256],307:[[105,106],256],308:[[74,770]],309:[[106,770]],310:[[75,807]],311:[[107,807]],313:[[76,769]],314:[[108,769]],315:[[76,807]],316:[[108,807]],317:[[76,780]],318:[[108,780]],319:[[76,183],256],320:[[108,183],256],323:[[78,769]],324:[[110,769]],325:[[78,807]],326:[[110,807]],327:[[78,780]],328:[[110,780]],329:[[700,110],256],332:[[79,772],,{768:7760,769:7762}],333:[[111,772],,{768:7761,769:7763}],334:[[79,774]],335:[[111,774]],336:[[79,779]],337:[[111,779]],340:[[82,769]],341:[[114,769]],342:[[82,807]],343:[[114,807]],344:[[82,780]],345:[[114,780]],346:[[83,769],,{775:7780}],347:[[115,769],,{775:7781}],348:[[83,770]],349:[[115,770]],350:[[83,807]],351:[[115,807]],352:[[83,780],,{775:7782}],353:[[115,780],,{775:7783}],354:[[84,807]],355:[[116,807]],356:[[84,780]],357:[[116,780]],360:[[85,771],,{769:7800}],361:[[117,771],,{769:7801}],362:[[85,772],,{776:7802}],363:[[117,772],,{776:7803}],364:[[85,774]],365:[[117,774]],366:[[85,778]],367:[[117,778]],368:[[85,779]],369:[[117,779]],370:[[85,808]],371:[[117,808]],372:[[87,770]],373:[[119,770]],374:[[89,770]],375:[[121,770]],376:[[89,776]],377:[[90,769]],378:[[122,769]],379:[[90,775]],380:[[122,775]],381:[[90,780]],382:[[122,780]],383:[[115],256,{775:7835}],416:[[79,795],,{768:7900,769:7898,771:7904,777:7902,803:7906}],417:[[111,795],,{768:7901,769:7899,771:7905,777:7903,803:7907}],431:[[85,795],,{768:7914,769:7912,771:7918,777:7916,803:7920}],432:[[117,795],,{768:7915,769:7913,771:7919,777:7917,803:7921}],439:[,,{780:494}],452:[[68,381],256],453:[[68,382],256],454:[[100,382],256],455:[[76,74],256],456:[[76,106],256],457:[[108,106],256],458:[[78,74],256],459:[[78,106],256],460:[[110,106],256],461:[[65,780]],462:[[97,780]],463:[[73,780]],464:[[105,780]],465:[[79,780]],466:[[111,780]],467:[[85,780]],468:[[117,780]],469:[[220,772]],470:[[252,772]],471:[[220,769]],472:[[252,769]],473:[[220,780]],474:[[252,780]],475:[[220,768]],476:[[252,768]],478:[[196,772]],479:[[228,772]],480:[[550,772]],481:[[551,772]],482:[[198,772]],483:[[230,772]],486:[[71,780]],487:[[103,780]],488:[[75,780]],489:[[107,780]],490:[[79,808],,{772:492}],491:[[111,808],,{772:493}],492:[[490,772]],493:[[491,772]],494:[[439,780]],495:[[658,780]],496:[[106,780]],497:[[68,90],256],498:[[68,122],256],499:[[100,122],256],500:[[71,769]],501:[[103,769]],504:[[78,768]],505:[[110,768]],506:[[197,769]],507:[[229,769]],508:[[198,769]],509:[[230,769]],510:[[216,769]],511:[[248,769]],66045:[,220]},512:{512:[[65,783]],513:[[97,783]],514:[[65,785]],515:[[97,785]],516:[[69,783]],517:[[101,783]],518:[[69,785]],519:[[101,785]],520:[[73,783]],521:[[105,783]],522:[[73,785]],523:[[105,785]],524:[[79,783]],525:[[111,783]],526:[[79,785]],527:[[111,785]],528:[[82,783]],529:[[114,783]],530:[[82,785]],531:[[114,785]],532:[[85,783]],533:[[117,783]],534:[[85,785]],535:[[117,785]],536:[[83,806]],537:[[115,806]],538:[[84,806]],539:[[116,806]],542:[[72,780]],543:[[104,780]],550:[[65,775],,{772:480}],551:[[97,775],,{772:481}],552:[[69,807],,{774:7708}],553:[[101,807],,{774:7709}],554:[[214,772]],555:[[246,772]],556:[[213,772]],557:[[245,772]],558:[[79,775],,{772:560}],559:[[111,775],,{772:561}],560:[[558,772]],561:[[559,772]],562:[[89,772]],563:[[121,772]],658:[,,{780:495}],688:[[104],256],689:[[614],256],690:[[106],256],691:[[114],256],692:[[633],256],693:[[635],256],694:[[641],256],695:[[119],256],696:[[121],256],728:[[32,774],256],729:[[32,775],256],730:[[32,778],256],731:[[32,808],256],732:[[32,771],256],733:[[32,779],256],736:[[611],256],737:[[108],256],738:[[115],256],739:[[120],256],740:[[661],256],66272:[,220]},768:{768:[,230],769:[,230],770:[,230],771:[,230],772:[,230],773:[,230],774:[,230],775:[,230],776:[,230,{769:836}],777:[,230],778:[,230],779:[,230],780:[,230],781:[,230],782:[,230],783:[,230],784:[,230],785:[,230],786:[,230],787:[,230],788:[,230],789:[,232],790:[,220],791:[,220],792:[,220],793:[,220],794:[,232],795:[,216],796:[,220],797:[,220],798:[,220],799:[,220],800:[,220],801:[,202],802:[,202],803:[,220],804:[,220],805:[,220],806:[,220],807:[,202],808:[,202],809:[,220],810:[,220],811:[,220],812:[,220],813:[,220],814:[,220],815:[,220],816:[,220],817:[,220],818:[,220],819:[,220],820:[,1],821:[,1],822:[,1],823:[,1],824:[,1],825:[,220],826:[,220],827:[,220],828:[,220],829:[,230],830:[,230],831:[,230],832:[[768],230],833:[[769],230],834:[,230],835:[[787],230],836:[[776,769],230],837:[,240],838:[,230],839:[,220],840:[,220],841:[,220],842:[,230],843:[,230],844:[,230],845:[,220],846:[,220],848:[,230],849:[,230],850:[,230],851:[,220],852:[,220],853:[,220],854:[,220],855:[,230],856:[,232],857:[,220],858:[,220],859:[,230],860:[,233],861:[,234],862:[,234],863:[,233],864:[,234],865:[,234],866:[,233],867:[,230],868:[,230],869:[,230],870:[,230],871:[,230],872:[,230],873:[,230],874:[,230],875:[,230],876:[,230],877:[,230],878:[,230],879:[,230],884:[[697]],890:[[32,837],256],894:[[59]],900:[[32,769],256],901:[[168,769]],902:[[913,769]],903:[[183]],904:[[917,769]],905:[[919,769]],906:[[921,769]],908:[[927,769]],910:[[933,769]],911:[[937,769]],912:[[970,769]],913:[,,{768:8122,769:902,772:8121,774:8120,787:7944,788:7945,837:8124}],917:[,,{768:8136,769:904,787:7960,788:7961}],919:[,,{768:8138,769:905,787:7976,788:7977,837:8140}],921:[,,{768:8154,769:906,772:8153,774:8152,776:938,787:7992,788:7993}],927:[,,{768:8184,769:908,787:8008,788:8009}],929:[,,{788:8172}],933:[,,{768:8170,769:910,772:8169,774:8168,776:939,788:8025}],937:[,,{768:8186,769:911,787:8040,788:8041,837:8188}],938:[[921,776]],939:[[933,776]],940:[[945,769],,{837:8116}],941:[[949,769]],942:[[951,769],,{837:8132}],943:[[953,769]],944:[[971,769]],945:[,,{768:8048,769:940,772:8113,774:8112,787:7936,788:7937,834:8118,837:8115}],949:[,,{768:8050,769:941,787:7952,788:7953}],951:[,,{768:8052,769:942,787:7968,788:7969,834:8134,837:8131}],953:[,,{768:8054,769:943,772:8145,774:8144,776:970,787:7984,788:7985,834:8150}],959:[,,{768:8056,769:972,787:8e3,788:8001}],961:[,,{787:8164,788:8165}],965:[,,{768:8058,769:973,772:8161,774:8160,776:971,787:8016,788:8017,834:8166}],969:[,,{768:8060,769:974,787:8032,788:8033,834:8182,837:8179}],970:[[953,776],,{768:8146,769:912,834:8151}],971:[[965,776],,{768:8162,769:944,834:8167}],972:[[959,769]],973:[[965,769]],974:[[969,769],,{837:8180}],976:[[946],256],977:[[952],256],978:[[933],256,{769:979,776:980}],979:[[978,769]],980:[[978,776]],981:[[966],256],982:[[960],256],1008:[[954],256],1009:[[961],256],1010:[[962],256],1012:[[920],256],1013:[[949],256],1017:[[931],256],66422:[,230],66423:[,230],66424:[,230],66425:[,230],66426:[,230]},1024:{1024:[[1045,768]],1025:[[1045,776]],1027:[[1043,769]],1030:[,,{776:1031}],1031:[[1030,776]],1036:[[1050,769]],1037:[[1048,768]],1038:[[1059,774]],1040:[,,{774:1232,776:1234}],1043:[,,{769:1027}],1045:[,,{768:1024,774:1238,776:1025}],1046:[,,{774:1217,776:1244}],1047:[,,{776:1246}],1048:[,,{768:1037,772:1250,774:1049,776:1252}],1049:[[1048,774]],1050:[,,{769:1036}],1054:[,,{776:1254}],1059:[,,{772:1262,774:1038,776:1264,779:1266}],1063:[,,{776:1268}],1067:[,,{776:1272}],1069:[,,{776:1260}],1072:[,,{774:1233,776:1235}],1075:[,,{769:1107}],1077:[,,{768:1104,774:1239,776:1105}],1078:[,,{774:1218,776:1245}],1079:[,,{776:1247}],1080:[,,{768:1117,772:1251,774:1081,776:1253}],1081:[[1080,774]],1082:[,,{769:1116}],1086:[,,{776:1255}],1091:[,,{772:1263,774:1118,776:1265,779:1267}],1095:[,,{776:1269}],1099:[,,{776:1273}],1101:[,,{776:1261}],1104:[[1077,768]],1105:[[1077,776]],1107:[[1075,769]],1110:[,,{776:1111}],1111:[[1110,776]],1116:[[1082,769]],1117:[[1080,768]],1118:[[1091,774]],1140:[,,{783:1142}],1141:[,,{783:1143}],1142:[[1140,783]],1143:[[1141,783]],1155:[,230],1156:[,230],1157:[,230],1158:[,230],1159:[,230],1217:[[1046,774]],1218:[[1078,774]],1232:[[1040,774]],1233:[[1072,774]],1234:[[1040,776]],1235:[[1072,776]],1238:[[1045,774]],1239:[[1077,774]],1240:[,,{776:1242}],1241:[,,{776:1243}],1242:[[1240,776]],1243:[[1241,776]],1244:[[1046,776]],1245:[[1078,776]],1246:[[1047,776]],1247:[[1079,776]],1250:[[1048,772]],1251:[[1080,772]],1252:[[1048,776]],1253:[[1080,776]],1254:[[1054,776]],1255:[[1086,776]],1256:[,,{776:1258}],1257:[,,{776:1259}],1258:[[1256,776]],1259:[[1257,776]],1260:[[1069,776]],1261:[[1101,776]],1262:[[1059,772]],1263:[[1091,772]],1264:[[1059,776]],1265:[[1091,776]],1266:[[1059,779]],1267:[[1091,779]],1268:[[1063,776]],1269:[[1095,776]],1272:[[1067,776]],1273:[[1099,776]]},1280:{1415:[[1381,1410],256],1425:[,220],1426:[,230],1427:[,230],1428:[,230],1429:[,230],1430:[,220],1431:[,230],1432:[,230],1433:[,230],1434:[,222],1435:[,220],1436:[,230],1437:[,230],1438:[,230],1439:[,230],1440:[,230],1441:[,230],1442:[,220],1443:[,220],1444:[,220],1445:[,220],1446:[,220],1447:[,220],1448:[,230],1449:[,230],1450:[,220],1451:[,230],1452:[,230],1453:[,222],1454:[,228],1455:[,230],1456:[,10],1457:[,11],1458:[,12],1459:[,13],1460:[,14],1461:[,15],1462:[,16],1463:[,17],1464:[,18],1465:[,19],1466:[,19],1467:[,20],1468:[,21],1469:[,22],1471:[,23],1473:[,24],1474:[,25],1476:[,230],1477:[,220],1479:[,18]},1536:{1552:[,230],1553:[,230],1554:[,230],1555:[,230],1556:[,230],1557:[,230],1558:[,230],1559:[,230],1560:[,30],1561:[,31],1562:[,32],1570:[[1575,1619]],1571:[[1575,1620]],1572:[[1608,1620]],1573:[[1575,1621]],1574:[[1610,1620]],1575:[,,{1619:1570,1620:1571,1621:1573}],1608:[,,{1620:1572}],1610:[,,{1620:1574}],1611:[,27],1612:[,28],1613:[,29],1614:[,30],1615:[,31],1616:[,32],1617:[,33],1618:[,34],1619:[,230],1620:[,230],1621:[,220],1622:[,220],1623:[,230],1624:[,230],1625:[,230],1626:[,230],1627:[,230],1628:[,220],1629:[,230],1630:[,230],1631:[,220],1648:[,35],1653:[[1575,1652],256],1654:[[1608,1652],256],1655:[[1735,1652],256],1656:[[1610,1652],256],1728:[[1749,1620]],1729:[,,{1620:1730}],1730:[[1729,1620]],1746:[,,{1620:1747}],1747:[[1746,1620]],1749:[,,{1620:1728}],1750:[,230],1751:[,230],1752:[,230],1753:[,230],1754:[,230],1755:[,230],1756:[,230],1759:[,230],1760:[,230],1761:[,230],1762:[,230],1763:[,220],1764:[,230],1767:[,230],1768:[,230],1770:[,220],1771:[,230],1772:[,230],1773:[,220]},1792:{1809:[,36],1840:[,230],1841:[,220],1842:[,230],1843:[,230],1844:[,220],1845:[,230],1846:[,230],1847:[,220],1848:[,220],1849:[,220],1850:[,230],1851:[,220],1852:[,220],1853:[,230],1854:[,220],1855:[,230],1856:[,230],1857:[,230],1858:[,220],1859:[,230],1860:[,220],1861:[,230],1862:[,220],1863:[,230],1864:[,220],1865:[,230],1866:[,230],2027:[,230],2028:[,230],2029:[,230],2030:[,230],2031:[,230],2032:[,230],2033:[,230],2034:[,220],2035:[,230]},2048:{2070:[,230],2071:[,230],2072:[,230],2073:[,230],2075:[,230],2076:[,230],2077:[,230],2078:[,230],2079:[,230],2080:[,230],2081:[,230],2082:[,230],2083:[,230],2085:[,230],2086:[,230],2087:[,230],2089:[,230],2090:[,230],2091:[,230],2092:[,230],2093:[,230],2137:[,220],2138:[,220],2139:[,220],2276:[,230],2277:[,230],2278:[,220],2279:[,230],2280:[,230],2281:[,220],2282:[,230],2283:[,230],2284:[,230],2285:[,220],2286:[,220],2287:[,220],2288:[,27],2289:[,28],2290:[,29],2291:[,230],2292:[,230],2293:[,230],2294:[,220],2295:[,230],2296:[,230],2297:[,220],2298:[,220],2299:[,230],2300:[,230],2301:[,230],2302:[,230],2303:[,230]},2304:{2344:[,,{2364:2345}],2345:[[2344,2364]],2352:[,,{2364:2353}],2353:[[2352,2364]],2355:[,,{2364:2356}],2356:[[2355,2364]],2364:[,7],2381:[,9],2385:[,230],2386:[,220],2387:[,230],2388:[,230],2392:[[2325,2364],512],2393:[[2326,2364],512],2394:[[2327,2364],512],2395:[[2332,2364],512],2396:[[2337,2364],512],2397:[[2338,2364],512],2398:[[2347,2364],512],2399:[[2351,2364],512],2492:[,7],2503:[,,{2494:2507,2519:2508}],2507:[[2503,2494]],2508:[[2503,2519]],2509:[,9],2524:[[2465,2492],512],2525:[[2466,2492],512],2527:[[2479,2492],512]},2560:{2611:[[2610,2620],512],2614:[[2616,2620],512],2620:[,7],2637:[,9],2649:[[2582,2620],512],2650:[[2583,2620],512],2651:[[2588,2620],512],2654:[[2603,2620],512],2748:[,7],2765:[,9],68109:[,220],68111:[,230],68152:[,230],68153:[,1],68154:[,220],68159:[,9],68325:[,230],68326:[,220]},2816:{2876:[,7],2887:[,,{2878:2891,2902:2888,2903:2892}],2888:[[2887,2902]],2891:[[2887,2878]],2892:[[2887,2903]],2893:[,9],2908:[[2849,2876],512],2909:[[2850,2876],512],2962:[,,{3031:2964}],2964:[[2962,3031]],3014:[,,{3006:3018,3031:3020}],3015:[,,{3006:3019}],3018:[[3014,3006]],3019:[[3015,3006]],3020:[[3014,3031]],3021:[,9]},3072:{3142:[,,{3158:3144}],3144:[[3142,3158]],3149:[,9],3157:[,84],3158:[,91],3260:[,7],3263:[,,{3285:3264}],3264:[[3263,3285]],3270:[,,{3266:3274,3285:3271,3286:3272}],3271:[[3270,3285]],3272:[[3270,3286]],3274:[[3270,3266],,{3285:3275}],3275:[[3274,3285]],3277:[,9]},3328:{3398:[,,{3390:3402,3415:3404}],3399:[,,{3390:3403}],3402:[[3398,3390]],3403:[[3399,3390]],3404:[[3398,3415]],3405:[,9],3530:[,9],3545:[,,{3530:3546,3535:3548,3551:3550}],3546:[[3545,3530]],3548:[[3545,3535],,{3530:3549}],3549:[[3548,3530]],3550:[[3545,3551]]},3584:{3635:[[3661,3634],256],3640:[,103],3641:[,103],3642:[,9],3656:[,107],3657:[,107],3658:[,107],3659:[,107],3763:[[3789,3762],256],3768:[,118],3769:[,118],3784:[,122],3785:[,122],3786:[,122],3787:[,122],3804:[[3755,3737],256],3805:[[3755,3745],256]},3840:{3852:[[3851],256],3864:[,220],3865:[,220],3893:[,220],3895:[,220],3897:[,216],3907:[[3906,4023],512],3917:[[3916,4023],512],3922:[[3921,4023],512],3927:[[3926,4023],512],3932:[[3931,4023],512],3945:[[3904,4021],512],3953:[,129],3954:[,130],3955:[[3953,3954],512],3956:[,132],3957:[[3953,3956],512],3958:[[4018,3968],512],3959:[[4018,3969],256],3960:[[4019,3968],512],3961:[[4019,3969],256],3962:[,130],3963:[,130],3964:[,130],3965:[,130],3968:[,130],3969:[[3953,3968],512],3970:[,230],3971:[,230],3972:[,9],3974:[,230],3975:[,230],3987:[[3986,4023],512],3997:[[3996,4023],512],4002:[[4001,4023],512],4007:[[4006,4023],512],4012:[[4011,4023],512],4025:[[3984,4021],512],4038:[,220]},4096:{4133:[,,{4142:4134}],4134:[[4133,4142]],4151:[,7],4153:[,9],4154:[,9],4237:[,220],4348:[[4316],256],69702:[,9],69759:[,9],69785:[,,{69818:69786}],69786:[[69785,69818]],69787:[,,{69818:69788}],69788:[[69787,69818]],69797:[,,{69818:69803}],69803:[[69797,69818]],69817:[,9],69818:[,7]},4352:{69888:[,230],69889:[,230],69890:[,230],69934:[[69937,69927]],69935:[[69938,69927]],69937:[,,{69927:69934}],69938:[,,{69927:69935}],69939:[,9],69940:[,9],70003:[,7],70080:[,9]},4608:{70197:[,9],70198:[,7],70377:[,7],70378:[,9]},4864:{4957:[,230],4958:[,230],4959:[,230],70460:[,7],70471:[,,{70462:70475,70487:70476}],70475:[[70471,70462]],70476:[[70471,70487]],70477:[,9],70502:[,230],70503:[,230],70504:[,230],70505:[,230],70506:[,230],70507:[,230],70508:[,230],70512:[,230],70513:[,230],70514:[,230],70515:[,230],70516:[,230]},5120:{70841:[,,{70832:70844,70842:70843,70845:70846}],70843:[[70841,70842]],70844:[[70841,70832]],70846:[[70841,70845]],70850:[,9],70851:[,7]},5376:{71096:[,,{71087:71098}],71097:[,,{71087:71099}],71098:[[71096,71087]],71099:[[71097,71087]],71103:[,9],71104:[,7]},5632:{71231:[,9],71350:[,9],71351:[,7]},5888:{5908:[,9],5940:[,9],6098:[,9],6109:[,230]},6144:{6313:[,228]},6400:{6457:[,222],6458:[,230],6459:[,220]},6656:{6679:[,230],6680:[,220],6752:[,9],6773:[,230],6774:[,230],6775:[,230],6776:[,230],6777:[,230],6778:[,230],6779:[,230],6780:[,230],6783:[,220],6832:[,230],6833:[,230],6834:[,230],6835:[,230],6836:[,230],6837:[,220],6838:[,220],6839:[,220],6840:[,220],6841:[,220],6842:[,220],6843:[,230],6844:[,230],6845:[,220]},6912:{6917:[,,{6965:6918}],6918:[[6917,6965]],6919:[,,{6965:6920}],6920:[[6919,6965]],6921:[,,{6965:6922}],6922:[[6921,6965]],6923:[,,{6965:6924}],6924:[[6923,6965]],6925:[,,{6965:6926}],6926:[[6925,6965]],6929:[,,{6965:6930}],6930:[[6929,6965]],6964:[,7],6970:[,,{6965:6971}],6971:[[6970,6965]],6972:[,,{6965:6973}],6973:[[6972,6965]],6974:[,,{6965:6976}],6975:[,,{6965:6977}],6976:[[6974,6965]],6977:[[6975,6965]],6978:[,,{6965:6979}],6979:[[6978,6965]],6980:[,9],7019:[,230],7020:[,220],7021:[,230],7022:[,230],7023:[,230],7024:[,230],7025:[,230],7026:[,230],7027:[,230],7082:[,9],7083:[,9],7142:[,7],7154:[,9],7155:[,9]},7168:{7223:[,7],7376:[,230],7377:[,230],7378:[,230],7380:[,1],7381:[,220],7382:[,220],7383:[,220],7384:[,220],7385:[,220],7386:[,230],7387:[,230],7388:[,220],7389:[,220],7390:[,220],7391:[,220],7392:[,230],7394:[,1],7395:[,1],7396:[,1],7397:[,1],7398:[,1],7399:[,1],7400:[,1],7405:[,220],7412:[,230],7416:[,230],7417:[,230]},7424:{7468:[[65],256],7469:[[198],256],7470:[[66],256],7472:[[68],256],7473:[[69],256],7474:[[398],256],7475:[[71],256],7476:[[72],256],7477:[[73],256],7478:[[74],256],7479:[[75],256],7480:[[76],256],7481:[[77],256],7482:[[78],256],7484:[[79],256],7485:[[546],256],7486:[[80],256],7487:[[82],256],7488:[[84],256],7489:[[85],256],7490:[[87],256],7491:[[97],256],7492:[[592],256],7493:[[593],256],7494:[[7426],256],7495:[[98],256],7496:[[100],256],7497:[[101],256],7498:[[601],256],7499:[[603],256],7500:[[604],256],7501:[[103],256],7503:[[107],256],7504:[[109],256],7505:[[331],256],7506:[[111],256],7507:[[596],256],7508:[[7446],256],7509:[[7447],256],7510:[[112],256],7511:[[116],256],7512:[[117],256],7513:[[7453],256],7514:[[623],256],7515:[[118],256],7516:[[7461],256],7517:[[946],256],7518:[[947],256],7519:[[948],256],7520:[[966],256],7521:[[967],256],7522:[[105],256],7523:[[114],256],7524:[[117],256],7525:[[118],256],7526:[[946],256],7527:[[947],256],7528:[[961],256],7529:[[966],256],7530:[[967],256],7544:[[1085],256],7579:[[594],256],7580:[[99],256],7581:[[597],256],7582:[[240],256],7583:[[604],256],7584:[[102],256],7585:[[607],256],7586:[[609],256],7587:[[613],256],7588:[[616],256],7589:[[617],256],7590:[[618],256],7591:[[7547],256],7592:[[669],256],7593:[[621],256],7594:[[7557],256],7595:[[671],256],7596:[[625],256],7597:[[624],256],7598:[[626],256],7599:[[627],256],7600:[[628],256],7601:[[629],256],7602:[[632],256],7603:[[642],256],7604:[[643],256],7605:[[427],256],7606:[[649],256],7607:[[650],256],7608:[[7452],256],7609:[[651],256],7610:[[652],256],7611:[[122],256],7612:[[656],256],7613:[[657],256],7614:[[658],256],7615:[[952],256],7616:[,230],7617:[,230],7618:[,220],7619:[,230],7620:[,230],7621:[,230],7622:[,230],7623:[,230],7624:[,230],7625:[,230],7626:[,220],7627:[,230],7628:[,230],7629:[,234],7630:[,214],7631:[,220],7632:[,202],7633:[,230],7634:[,230],7635:[,230],7636:[,230],7637:[,230],7638:[,230],7639:[,230],7640:[,230],7641:[,230],7642:[,230],7643:[,230],7644:[,230],7645:[,230],7646:[,230],7647:[,230],7648:[,230],7649:[,230],7650:[,230],7651:[,230],7652:[,230],7653:[,230],7654:[,230],7655:[,230],7656:[,230],7657:[,230],7658:[,230],7659:[,230],7660:[,230],7661:[,230],7662:[,230],7663:[,230],7664:[,230],7665:[,230],7666:[,230],7667:[,230],7668:[,230],7669:[,230],7676:[,233],7677:[,220],7678:[,230],7679:[,220]},7680:{7680:[[65,805]],7681:[[97,805]],7682:[[66,775]],7683:[[98,775]],7684:[[66,803]],7685:[[98,803]],7686:[[66,817]],7687:[[98,817]],7688:[[199,769]],7689:[[231,769]],7690:[[68,775]],7691:[[100,775]],7692:[[68,803]],7693:[[100,803]],7694:[[68,817]],7695:[[100,817]],7696:[[68,807]],7697:[[100,807]],7698:[[68,813]],7699:[[100,813]],7700:[[274,768]],7701:[[275,768]],7702:[[274,769]],7703:[[275,769]],7704:[[69,813]],7705:[[101,813]],7706:[[69,816]],7707:[[101,816]],7708:[[552,774]],7709:[[553,774]],7710:[[70,775]],7711:[[102,775]],7712:[[71,772]],7713:[[103,772]],7714:[[72,775]],7715:[[104,775]],7716:[[72,803]],7717:[[104,803]],7718:[[72,776]],7719:[[104,776]],7720:[[72,807]],7721:[[104,807]],7722:[[72,814]],7723:[[104,814]],7724:[[73,816]],7725:[[105,816]],7726:[[207,769]],7727:[[239,769]],7728:[[75,769]],7729:[[107,769]],7730:[[75,803]],7731:[[107,803]],7732:[[75,817]],7733:[[107,817]],7734:[[76,803],,{772:7736}],7735:[[108,803],,{772:7737}],7736:[[7734,772]],7737:[[7735,772]],7738:[[76,817]],7739:[[108,817]],7740:[[76,813]],7741:[[108,813]],7742:[[77,769]],7743:[[109,769]],7744:[[77,775]],7745:[[109,775]],7746:[[77,803]],7747:[[109,803]],7748:[[78,775]],7749:[[110,775]],7750:[[78,803]],7751:[[110,803]],7752:[[78,817]],7753:[[110,817]],7754:[[78,813]],7755:[[110,813]],7756:[[213,769]],7757:[[245,769]],7758:[[213,776]],7759:[[245,776]],7760:[[332,768]],7761:[[333,768]],7762:[[332,769]],7763:[[333,769]],7764:[[80,769]],7765:[[112,769]],7766:[[80,775]],7767:[[112,775]],7768:[[82,775]],7769:[[114,775]],7770:[[82,803],,{772:7772}],7771:[[114,803],,{772:7773}],7772:[[7770,772]],7773:[[7771,772]],7774:[[82,817]],7775:[[114,817]],7776:[[83,775]],7777:[[115,775]],7778:[[83,803],,{775:7784}],7779:[[115,803],,{775:7785}],7780:[[346,775]],7781:[[347,775]],7782:[[352,775]],7783:[[353,775]],7784:[[7778,775]],7785:[[7779,775]],7786:[[84,775]],7787:[[116,775]],7788:[[84,803]],7789:[[116,803]],7790:[[84,817]],7791:[[116,817]],7792:[[84,813]],7793:[[116,813]],7794:[[85,804]],7795:[[117,804]],7796:[[85,816]],7797:[[117,816]],7798:[[85,813]],7799:[[117,813]],7800:[[360,769]],7801:[[361,769]],7802:[[362,776]],7803:[[363,776]],7804:[[86,771]],7805:[[118,771]],7806:[[86,803]],7807:[[118,803]],7808:[[87,768]],7809:[[119,768]],7810:[[87,769]],7811:[[119,769]],7812:[[87,776]],7813:[[119,776]],7814:[[87,775]],7815:[[119,775]],7816:[[87,803]],7817:[[119,803]],7818:[[88,775]],7819:[[120,775]],7820:[[88,776]],7821:[[120,776]],7822:[[89,775]],7823:[[121,775]],7824:[[90,770]],7825:[[122,770]],7826:[[90,803]],7827:[[122,803]],7828:[[90,817]],7829:[[122,817]],7830:[[104,817]],7831:[[116,776]],7832:[[119,778]],7833:[[121,778]],7834:[[97,702],256],7835:[[383,775]],7840:[[65,803],,{770:7852,774:7862}],7841:[[97,803],,{770:7853,774:7863}],7842:[[65,777]],7843:[[97,777]],7844:[[194,769]],7845:[[226,769]],7846:[[194,768]],7847:[[226,768]],7848:[[194,777]],7849:[[226,777]],7850:[[194,771]],7851:[[226,771]],7852:[[7840,770]],7853:[[7841,770]],7854:[[258,769]],7855:[[259,769]],7856:[[258,768]],7857:[[259,768]],7858:[[258,777]],7859:[[259,777]],7860:[[258,771]],7861:[[259,771]],7862:[[7840,774]],7863:[[7841,774]],7864:[[69,803],,{770:7878}],7865:[[101,803],,{770:7879}],7866:[[69,777]],7867:[[101,777]],7868:[[69,771]],7869:[[101,771]],7870:[[202,769]],7871:[[234,769]],7872:[[202,768]],7873:[[234,768]],7874:[[202,777]],7875:[[234,777]],7876:[[202,771]],7877:[[234,771]],7878:[[7864,770]],7879:[[7865,770]],7880:[[73,777]],7881:[[105,777]],7882:[[73,803]],7883:[[105,803]],7884:[[79,803],,{770:7896}],7885:[[111,803],,{770:7897}],7886:[[79,777]],7887:[[111,777]],7888:[[212,769]],7889:[[244,769]],7890:[[212,768]],7891:[[244,768]],7892:[[212,777]],7893:[[244,777]],7894:[[212,771]],7895:[[244,771]],7896:[[7884,770]],7897:[[7885,770]],7898:[[416,769]],7899:[[417,769]],7900:[[416,768]],7901:[[417,768]],7902:[[416,777]],7903:[[417,777]],7904:[[416,771]],7905:[[417,771]],7906:[[416,803]],7907:[[417,803]],7908:[[85,803]],7909:[[117,803]],7910:[[85,777]],7911:[[117,777]],7912:[[431,769]],7913:[[432,769]],7914:[[431,768]],7915:[[432,768]],7916:[[431,777]],7917:[[432,777]],7918:[[431,771]],7919:[[432,771]],7920:[[431,803]],7921:[[432,803]],7922:[[89,768]],7923:[[121,768]],7924:[[89,803]],7925:[[121,803]],7926:[[89,777]],7927:[[121,777]],7928:[[89,771]],7929:[[121,771]]},7936:{7936:[[945,787],,{768:7938,769:7940,834:7942,837:8064}],7937:[[945,788],,{768:7939,769:7941,834:7943,837:8065}],7938:[[7936,768],,{837:8066}],7939:[[7937,768],,{837:8067}],7940:[[7936,769],,{837:8068}],7941:[[7937,769],,{837:8069}],7942:[[7936,834],,{837:8070}],7943:[[7937,834],,{837:8071}],7944:[[913,787],,{768:7946,769:7948,834:7950,837:8072}],7945:[[913,788],,{768:7947,769:7949,834:7951,837:8073}],7946:[[7944,768],,{837:8074}],7947:[[7945,768],,{837:8075}],7948:[[7944,769],,{837:8076}],7949:[[7945,769],,{837:8077}],7950:[[7944,834],,{837:8078}],7951:[[7945,834],,{837:8079}],7952:[[949,787],,{768:7954,769:7956}],7953:[[949,788],,{768:7955,769:7957}],7954:[[7952,768]],7955:[[7953,768]],7956:[[7952,769]],7957:[[7953,769]],7960:[[917,787],,{768:7962,769:7964}],7961:[[917,788],,{768:7963,769:7965}],7962:[[7960,768]],7963:[[7961,768]],7964:[[7960,769]],7965:[[7961,769]],7968:[[951,787],,{768:7970,769:7972,834:7974,837:8080}],7969:[[951,788],,{768:7971,769:7973,834:7975,837:8081}],7970:[[7968,768],,{837:8082}],7971:[[7969,768],,{837:8083}],7972:[[7968,769],,{837:8084}],7973:[[7969,769],,{837:8085}],7974:[[7968,834],,{837:8086}],7975:[[7969,834],,{837:8087}],7976:[[919,787],,{768:7978,769:7980,834:7982,837:8088}],7977:[[919,788],,{768:7979,769:7981,834:7983,837:8089}],7978:[[7976,768],,{837:8090}],7979:[[7977,768],,{837:8091}],7980:[[7976,769],,{837:8092}],7981:[[7977,769],,{837:8093}],7982:[[7976,834],,{837:8094}],7983:[[7977,834],,{837:8095}],7984:[[953,787],,{768:7986,769:7988,834:7990}],7985:[[953,788],,{768:7987,769:7989,834:7991}],7986:[[7984,768]],7987:[[7985,768]],7988:[[7984,769]],7989:[[7985,769]],7990:[[7984,834]],7991:[[7985,834]],7992:[[921,787],,{768:7994,769:7996,834:7998}],7993:[[921,788],,{768:7995,769:7997,834:7999}],7994:[[7992,768]],7995:[[7993,768]],7996:[[7992,769]],7997:[[7993,769]],7998:[[7992,834]],7999:[[7993,834]],8
70123000
vendor: 25,898 bytes, line 70123
70123:[[959,787],,{768:8002,769:8004}],8001:[[959,788],,{768:8003,769:8005}],8002:[[8e3,768]],8003:[[8001,768]],8004:[[8e3,769]],8005:[[8001,769]],8008:[[927,787],,{768:8010,769:8012}],8009:[[927,788],,{768:8011,769:8013}],8010:[[8008,768]],8011:[[8009,768]],8012:[[8008,769]],8013:[[8009,769]],8016:[[965,787],,{768:8018,769:8020,834:8022}],8017:[[965,788],,{768:8019,769:8021,834:8023}],8018:[[8016,768]],8019:[[8017,768]],8020:[[8016,769]],8021:[[8017,769]],8022:[[8016,834]],8023:[[8017,834]],8025:[[933,788],,{768:8027,769:8029,834:8031}],8027:[[8025,768]],8029:[[8025,769]],8031:[[8025,834]],8032:[[969,787],,{768:8034,769:8036,834:8038,837:8096}],8033:[[969,788],,{768:8035,769:8037,834:8039,837:8097}],8034:[[8032,768],,{837:8098}],8035:[[8033,768],,{837:8099}],8036:[[8032,769],,{837:8100}],8037:[[8033,769],,{837:8101}],8038:[[8032,834],,{837:8102}],8039:[[8033,834],,{837:8103}],8040:[[937,787],,{768:8042,769:8044,834:8046,837:8104}],8041:[[937,788],,{768:8043,769:8045,834:8047,837:8105}],8042:[[8040,768],,{837:8106}],8043:[[8041,768],,{837:8107}],8044:[[8040,769],,{837:8108}],8045:[[8041,769],,{837:8109}],8046:[[8040,834],,{837:8110}],8047:[[8041,834],,{837:8111}],8048:[[945,768],,{837:8114}],8049:[[940]],8050:[[949,768]],8051:[[941]],8052:[[951,768],,{837:8130}],8053:[[942]],8054:[[953,768]],8055:[[943]],8056:[[959,768]],8057:[[972]],8058:[[965,768]],8059:[[973]],8060:[[969,768],,{837:8178}],8061:[[974]],8064:[[7936,837]],8065:[[7937,837]],8066:[[7938,837]],8067:[[7939,837]],8068:[[7940,837]],8069:[[7941,837]],8070:[[7942,837]],8071:[[7943,837]],8072:[[7944,837]],8073:[[7945,837]],8074:[[7946,837]],8075:[[7947,837]],8076:[[7948,837]],8077:[[7949,837]],8078:[[7950,837]],8079:[[7951,837]],8080:[[7968,837]],8081:[[7969,837]],8082:[[7970,837]],8083:[[7971,837]],8084:[[7972,837]],8085:[[7973,837]],8086:[[7974,837]],8087:[[7975,837]],8088:[[7976,837]],8089:[[7977,837]],8090:[[7978,837]],8091:[[7979,837]],8092:[[7980,837]],8093:[[7981,837]],8094:[[7982,837]],8095:[[7983,837]],8096:[[8032,837]],8097:[[8033,837]],8098:[[8034,837]],8099:[[8035,837]],8100:[[8036,837]],8101:[[8037,837]],8102:[[8038,837]],8103:[[8039,837]],8104:[[8040,837]],8105:[[8041,837]],8106:[[8042,837]],8107:[[8043,837]],8108:[[8044,837]],8109:[[8045,837]],8110:[[8046,837]],8111:[[8047,837]],8112:[[945,774]],8113:[[945,772]],8114:[[8048,837]],8115:[[945,837]],8116:[[940,837]],8118:[[945,834],,{837:8119}],8119:[[8118,837]],8120:[[913,774]],8121:[[913,772]],8122:[[913,768]],8123:[[902]],8124:[[913,837]],8125:[[32,787],256],8126:[[953]],8127:[[32,787],256,{768:8141,769:8142,834:8143}],8128:[[32,834],256],8129:[[168,834]],8130:[[8052,837]],8131:[[951,837]],8132:[[942,837]],8134:[[951,834],,{837:8135}],8135:[[8134,837]],8136:[[917,768]],8137:[[904]],8138:[[919,768]],8139:[[905]],8140:[[919,837]],8141:[[8127,768]],8142:[[8127,769]],8143:[[8127,834]],8144:[[953,774]],8145:[[953,772]],8146:[[970,768]],8147:[[912]],8150:[[953,834]],8151:[[970,834]],8152:[[921,774]],8153:[[921,772]],8154:[[921,768]],8155:[[906]],8157:[[8190,768]],8158:[[8190,769]],8159:[[8190,834]],8160:[[965,774]],8161:[[965,772]],8162:[[971,768]],8163:[[944]],8164:[[961,787]],8165:[[961,788]],8166:[[965,834]],8167:[[971,834]],8168:[[933,774]],8169:[[933,772]],8170:[[933,768]],8171:[[910]],8172:[[929,788]],8173:[[168,768]],8174:[[901]],8175:[[96]],8178:[[8060,837]],8179:[[969,837]],8180:[[974,837]],8182:[[969,834],,{837:8183}],8183:[[8182,837]],8184:[[927,768]],8185:[[908]],8186:[[937,768]],8187:[[911]],8188:[[937,837]],8189:[[180]],8190:[[32,788],256,{768:8157,769:8158,834:8159}]},8192:{8192:[[8194]],8193:[[8195]],8194:[[32],256],8195:[[32],256],8196:[[32],256],8197:[[32],256],8198:[[32],256],8199:[[32],256],8200:[[32],256],8201:[[32],256],8202:[[32],256],8209:[[8208],256],8215:[[32,819],256],8228:[[46],256],8229:[[46,46],256],8230:[[46,46,46],256],8239:[[32],256],8243:[[8242,8242],256],8244:[[8242,8242,8242],256],8246:[[8245,8245],256],8247:[[8245,8245,8245],256],8252:[[33,33],256],8254:[[32,773],256],8263:[[63,63],256],8264:[[63,33],256],8265:[[33,63],256],8279:[[8242,8242,8242,8242],256],8287:[[32],256],8304:[[48],256],8305:[[105],256],8308:[[52],256],8309:[[53],256],8310:[[54],256],8311:[[55],256],8312:[[56],256],8313:[[57],256],8314:[[43],256],8315:[[8722],256],8316:[[61],256],8317:[[40],256],8318:[[41],256],8319:[[110],256],8320:[[48],256],8321:[[49],256],8322:[[50],256],8323:[[51],256],8324:[[52],256],8325:[[53],256],8326:[[54],256],8327:[[55],256],8328:[[56],256],8329:[[57],256],8330:[[43],256],8331:[[8722],256],8332:[[61],256],8333:[[40],256],8334:[[41],256],8336:[[97],256],8337:[[101],256],8338:[[111],256],8339:[[120],256],8340:[[601],256],8341:[[104],256],8342:[[107],256],8343:[[108],256],8344:[[109],256],8345:[[110],256],8346:[[112],256],8347:[[115],256],8348:[[116],256],8360:[[82,115],256],8400:[,230],8401:[,230],8402:[,1],8403:[,1],8404:[,230],8405:[,230],8406:[,230],8407:[,230],8408:[,1],8409:[,1],8410:[,1],8411:[,230],8412:[,230],8417:[,230],8421:[,1],8422:[,1],8423:[,230],8424:[,220],8425:[,230],8426:[,1],8427:[,1],8428:[,220],8429:[,220],8430:[,220],8431:[,220],8432:[,230]},8448:{8448:[[97,47,99],256],8449:[[97,47,115],256],8450:[[67],256],8451:[[176,67],256],8453:[[99,47,111],256],8454:[[99,47,117],256],8455:[[400],256],8457:[[176,70],256],8458:[[103],256],8459:[[72],256],8460:[[72],256],8461:[[72],256],8462:[[104],256],8463:[[295],256],8464:[[73],256],8465:[[73],256],8466:[[76],256],8467:[[108],256],8469:[[78],256],8470:[[78,111],256],8473:[[80],256],8474:[[81],256],8475:[[82],256],8476:[[82],256],8477:[[82],256],8480:[[83,77],256],8481:[[84,69,76],256],8482:[[84,77],256],8484:[[90],256],8486:[[937]],8488:[[90],256],8490:[[75]],8491:[[197]],8492:[[66],256],8493:[[67],256],8495:[[101],256],8496:[[69],256],8497:[[70],256],8499:[[77],256],8500:[[111],256],8501:[[1488],256],8502:[[1489],256],8503:[[1490],256],8504:[[1491],256],8505:[[105],256],8507:[[70,65,88],256],8508:[[960],256],8509:[[947],256],8510:[[915],256],8511:[[928],256],8512:[[8721],256],8517:[[68],256],8518:[[100],256],8519:[[101],256],8520:[[105],256],8521:[[106],256],8528:[[49,8260,55],256],8529:[[49,8260,57],256],8530:[[49,8260,49,48],256],8531:[[49,8260,51],256],8532:[[50,8260,51],256],8533:[[49,8260,53],256],8534:[[50,8260,53],256],8535:[[51,8260,53],256],8536:[[52,8260,53],256],8537:[[49,8260,54],256],8538:[[53,8260,54],256],8539:[[49,8260,56],256],8540:[[51,8260,56],256],8541:[[53,8260,56],256],8542:[[55,8260,56],256],8543:[[49,8260],256],8544:[[73],256],8545:[[73,73],256],8546:[[73,73,73],256],8547:[[73,86],256],8548:[[86],256],8549:[[86,73],256],8550:[[86,73,73],256],8551:[[86,73,73,73],256],8552:[[73,88],256],8553:[[88],256],8554:[[88,73],256],8555:[[88,73,73],256],8556:[[76],256],8557:[[67],256],8558:[[68],256],8559:[[77],256],8560:[[105],256],8561:[[105,105],256],8562:[[105,105,105],256],8563:[[105,118],256],8564:[[118],256],8565:[[118,105],256],8566:[[118,105,105],256],8567:[[118,105,105,105],256],8568:[[105,120],256],8569:[[120],256],8570:[[120,105],256],8571:[[120,105,105],256],8572:[[108],256],8573:[[99],256],8574:[[100],256],8575:[[109],256],8585:[[48,8260,51],256],8592:[,,{824:8602}],8594:[,,{824:8603}],8596:[,,{824:8622}],8602:[[8592,824]],8603:[[8594,824]],8622:[[8596,824]],8653:[[8656,824]],8654:[[8660,824]],8655:[[8658,824]],8656:[,,{824:8653}],8658:[,,{824:8655}],8660:[,,{824:8654}]},8704:{8707:[,,{824:8708}],8708:[[8707,824]],8712:[,,{824:8713}],8713:[[8712,824]],8715:[,,{824:8716}],8716:[[8715,824]],8739:[,,{824:8740}],8740:[[8739,824]],8741:[,,{824:8742}],8742:[[8741,824]],8748:[[8747,8747],256],8749:[[8747,8747,8747],256],8751:[[8750,8750],256],8752:[[8750,8750,8750],256],8764:[,,{824:8769}],8769:[[8764,824]],8771:[,,{824:8772}],8772:[[8771,824]],8773:[,,{824:8775}],8775:[[8773,824]],8776:[,,{824:8777}],8777:[[8776,824]],8781:[,,{824:8813}],8800:[[61,824]],8801:[,,{824:8802}],8802:[[8801,824]],8804:[,,{824:8816}],8805:[,,{824:8817}],8813:[[8781,824]],8814:[[60,824]],8815:[[62,824]],8816:[[8804,824]],8817:[[8805,824]],8818:[,,{824:8820}],8819:[,,{824:8821}],8820:[[8818,824]],8821:[[8819,824]],8822:[,,{824:8824}],8823:[,,{824:8825}],8824:[[8822,824]],8825:[[8823,824]],8826:[,,{824:8832}],8827:[,,{824:8833}],8828:[,,{824:8928}],8829:[,,{824:8929}],8832:[[8826,824]],8833:[[8827,824]],8834:[,,{824:8836}],8835:[,,{824:8837}],8836:[[8834,824]],8837:[[8835,824]],8838:[,,{824:8840}],8839:[,,{824:8841}],8840:[[8838,824]],8841:[[8839,824]],8849:[,,{824:8930}],8850:[,,{824:8931}],8866:[,,{824:8876}],8872:[,,{824:8877}],8873:[,,{824:8878}],8875:[,,{824:8879}],8876:[[8866,824]],8877:[[8872,824]],8878:[[8873,824]],8879:[[8875,824]],8882:[,,{824:8938}],8883:[,,{824:8939}],8884:[,,{824:8940}],8885:[,,{824:8941}],8928:[[8828,824]],8929:[[8829,824]],8930:[[8849,824]],8931:[[8850,824]],8938:[[8882,824]],8939:[[8883,824]],8940:[[8884,824]],8941:[[8885,824]]},8960:{9001:[[12296]],9002:[[12297]]},9216:{9312:[[49],256],9313:[[50],256],9314:[[51],256],9315:[[52],256],9316:[[53],256],9317:[[54],256],9318:[[55],256],9319:[[56],256],9320:[[57],256],9321:[[49,48],256],9322:[[49,49],256],9323:[[49,50],256],9324:[[49,51],256],9325:[[49,52],256],9326:[[49,53],256],9327:[[49,54],256],9328:[[49,55],256],9329:[[49,56],256],9330:[[49,57],256],9331:[[50,48],256],9332:[[40,49,41],256],9333:[[40,50,41],256],9334:[[40,51,41],256],9335:[[40,52,41],256],9336:[[40,53,41],256],9337:[[40,54,41],256],9338:[[40,55,41],256],9339:[[40,56,41],256],9340:[[40,57,41],256],9341:[[40,49,48,41],256],9342:[[40,49,49,41],256],9343:[[40,49,50,41],256],9344:[[40,49,51,41],256],9345:[[40,49,52,41],256],9346:[[40,49,53,41],256],9347:[[40,49,54,41],256],9348:[[40,49,55,41],256],9349:[[40,49,56,41],256],9350:[[40,49,57,41],256],9351:[[40,50,48,41],256],9352:[[49,46],256],9353:[[50,46],256],9354:[[51,46],256],9355:[[52,46],256],9356:[[53,46],256],9357:[[54,46],256],9358:[[55,46],256],9359:[[56,46],256],9360:[[57,46],256],9361:[[49,48,46],256],9362:[[49,49,46],256],9363:[[49,50,46],256],9364:[[49,51,46],256],9365:[[49,52,46],256],9366:[[49,53,46],256],9367:[[49,54,46],256],9368:[[49,55,46],256],9369:[[49,56,46],256],9370:[[49,57,46],256],9371:[[50,48,46],256],9372:[[40,97,41],256],9373:[[40,98,41],256],9374:[[40,99,41],256],9375:[[40,100,41],256],9376:[[40,101,41],256],9377:[[40,102,41],256],9378:[[40,103,41],256],9379:[[40,104,41],256],9380:[[40,105,41],256],9381:[[40,106,41],256],9382:[[40,107,41],256],9383:[[40,108,41],256],9384:[[40,109,41],256],9385:[[40,110,41],256],9386:[[40,111,41],256],9387:[[40,112,41],256],9388:[[40,113,41],256],9389:[[40,114,41],256],9390:[[40,115,41],256],9391:[[40,116,41],256],9392:[[40,117,41],256],9393:[[40,118,41],256],9394:[[40,119,41],256],9395:[[40,120,41],256],9396:[[40,121,41],256],9397:[[40,122,41],256],9398:[[65],256],9399:[[66],256],9400:[[67],256],9401:[[68],256],9402:[[69],256],9403:[[70],256],9404:[[71],256],9405:[[72],256],9406:[[73],256],9407:[[74],256],9408:[[75],256],9409:[[76],256],9410:[[77],256],9411:[[78],256],9412:[[79],256],9413:[[80],256],9414:[[81],256],9415:[[82],256],9416:[[83],256],9417:[[84],256],9418:[[85],256],9419:[[86],256],9420:[[87],256],9421:[[88],256],9422:[[89],256],9423:[[90],256],9424:[[97],256],9425:[[98],256],9426:[[99],256],9427:[[100],256],9428:[[101],256],9429:[[102],256],9430:[[103],256],9431:[[104],256],9432:[[105],256],9433:[[106],256],9434:[[107],256],9435:[[108],256],9436:[[109],256],9437:[[110],256],9438:[[111],256],9439:[[112],256],9440:[[113],256],9441:[[114],256],9442:[[115],256],9443:[[116],256],9444:[[117],256],9445:[[118],256],9446:[[119],256],9447:[[120],256],9448:[[121],256],9449:[[122],256],9450:[[48],256]},10752:{10764:[[8747,8747,8747,8747],256],10868:[[58,58,61],256],10869:[[61,61],256],10870:[[61,61,61],256],10972:[[10973,824],512]},11264:{11388:[[106],256],11389:[[86],256],11503:[,230],11504:[,230],11505:[,230]},11520:{11631:[[11617],256],11647:[,9],11744:[,230],11745:[,230],11746:[,230],11747:[,230],11748:[,230],11749:[,230],11750:[,230],11751:[,230],11752:[,230],11753:[,230],11754:[,230],11755:[,230],11756:[,230],11757:[,230],11758:[,230],11759:[,230],11760:[,230],11761:[,230],11762:[,230],11763:[,230],11764:[,230],11765:[,230],11766:[,230],11767:[,230],11768:[,230],11769:[,230],11770:[,230],11771:[,230],11772:[,230],11773:[,230],11774:[,230],11775:[,230]},11776:{11935:[[27597],256],12019:[[40863],256]},12032:{12032:[[19968],256],12033:[[20008],256],12034:[[20022],256],12035:[[20031],256],12036:[[20057],256],12037:[[20101],256],12038:[[20108],256],12039:[[20128],256],12040:[[20154],256],12041:[[20799],256],12042:[[20837],256],12043:[[20843],256],12044:[[20866],256],12045:[[20886],256],12046:[[20907],256],12047:[[20960],256],12048:[[20981],256],12049:[[20992],256],12050:[[21147],256],12051:[[21241],256],12052:[[21269],256],12053:[[21274],256],12054:[[21304],256],12055:[[21313],256],12056:[[21340],256],12057:[[21353],256],12058:[[21378],256],12059:[[21430],256],12060:[[21448],256],12061:[[21475],256],12062:[[22231],256],12063:[[22303],256],12064:[[22763],256],12065:[[22786],256],12066:[[22794],256],12067:[[22805],256],12068:[[22823],256],12069:[[22899],256],12070:[[23376],256],12071:[[23424],256],12072:[[23544],256],12073:[[23567],256],12074:[[23586],256],12075:[[23608],256],12076:[[23662],256],12077:[[23665],256],12078:[[24027],256],12079:[[24037],256],12080:[[24049],256],12081:[[24062],256],12082:[[24178],256],12083:[[24186],256],12084:[[24191],256],12085:[[24308],256],12086:[[24318],256],12087:[[24331],256],12088:[[24339],256],12089:[[24400],256],12090:[[24417],256],12091:[[24435],256],12092:[[24515],256],12093:[[25096],256],12094:[[25142],256],12095:[[25163],256],12096:[[25903],256],12097:[[25908],256],12098:[[25991],256],12099:[[26007],256],12100:[[26020],256],12101:[[26041],256],12102:[[26080],256],12103:[[26085],256],12104:[[26352],256],12105:[[26376],256],12106:[[26408],256],12107:[[27424],256],12108:[[27490],256],12109:[[27513],256],12110:[[27571],256],12111:[[27595],256],12112:[[27604],256],12113:[[27611],256],12114:[[27663],256],12115:[[27668],256],12116:[[27700],256],12117:[[28779],256],12118:[[29226],256],12119:[[29238],256],12120:[[29243],256],12121:[[29247],256],12122:[[29255],256],12123:[[29273],256],12124:[[29275],256],12125:[[29356],256],12126:[[29572],256],12127:[[29577],256],12128:[[29916],256],12129:[[29926],256],12130:[[29976],256],12131:[[29983],256],12132:[[29992],256],12133:[[3e4],256],12134:[[30091],256],12135:[[30098],256],12136:[[30326],256],12137:[[30333],256],12138:[[30382],256],12139:[[30399],256],12140:[[30446],256],12141:[[30683],256],12142:[[30690],256],12143:[[30707],256],12144:[[31034],256],12145:[[31160],256],12146:[[31166],256],12147:[[31348],256],12148:[[31435],256],12149:[[31481],256],12150:[[31859],256],12151:[[31992],256],12152:[[32566],256],12153:[[32593],256],12154:[[32650],256],12155:[[32701],256],12156:[[32769],256],12157:[[32780],256],12158:[[32786],256],12159:[[32819],256],12160:[[32895],256],12161:[[32905],256],12162:[[33251],256],12163:[[33258],256],12164:[[33267],256],12165:[[33276],256],12166:[[33292],256],12167:[[33307],256],12168:[[33311],256],12169:[[33390],256],12170:[[33394],256],12171:[[33400],256],12172:[[34381],256],12173:[[34411],256],12174:[[34880],256],12175:[[34892],256],12176:[[34915],256],12177:[[35198],256],12178:[[35211],256],12179:[[35282],256],12180:[[35328],256],12181:[[35895],256],12182:[[35910],256],12183:[[35925],256],12184:[[35960],256],12185:[[35997],256],12186:[[36196],256],12187:[[36208],256],12188:[[36275],256],12189:[[36523],256],12190:[[36554],256],12191:[[36763],256],12192:[[36784],256],12193:[[36789],256],12194:[[37009],256],12195:[[37193],256],12196:[[37318],256],12197:[[37324],256],12198:[[37329],256],12199:[[38263],256],12200:[[38272],256],12201:[[38428],256],12202:[[38582],256],12203:[[38585],256],12204:[[38632],256],12205:[[38737],256],12206:[[38750],256],12207:[[38754],256],12208:[[38761],256],12209:[[38859],256],12210:[[38893],256],12211:[[38899],256],12212:[[38913],256],12213:[[39080],256],12214:[[39131],256],12215:[[39135],256],12216:[[39318],256],12217:[[39321],256],12218:[[39340],256],12219:[[39592],256],12220:[[39640],256],12221:[[39647],256],12222:[[39717],256],12223:[[39727],256],12224:[[39730],256],12225:[[39740],256],12226:[[39770],256],12227:[[40165],256],12228:[[40565],256],12229:[[40575],256],12230:[[40613],256],12231:[[40635],256],12232:[[40643],256],12233:[[40653],256],12234:[[40657],256],12235:[[40697],256],12236:[[40701],256],12237:[[40718],256],12238:[[40723],256],12239:[[40736],256],12240:[[40763],256],12241:[[40778],256],12242:[[40786],256],12243:[[40845],256],12244:[[40860],256],12245:[[40864],256]},12288:{12288:[[32],256],12330:[,218],12331:[,228],12332:[,232],12333:[,222],12334:[,224],12335:[,224],12342:[[12306],256],12344:[[21313],256],12345:[[21316],256],12346:[[21317],256],12358:[,,{12441:12436}],12363:[,,{12441:12364}],12364:[[12363,12441]],12365:[,,{12441:12366}],12366:[[12365,12441]],12367:[,,{12441:12368}],12368:[[12367,12441]],12369:[,,{12441:12370}],12370:[[12369,12441]],12371:[,,{12441:12372}],12372:[[12371,12441]],12373:[,,{12441:12374}],12374:[[12373,12441]],12375:[,,{12441:12376}],12376:[[12375,12441]],12377:[,,{12441:12378}],12378:[[12377,12441]],12379:[,,{12441:12380}],12380:[[12379,12441]],12381:[,,{12441:12382}],12382:[[12381,12441]],12383:[,,{12441:12384}],12384:[[12383,12441]],12385:[,,{12441:12386}],12386:[[12385,12441]],12388:[,,{12441:12389}],12389:[[12388,12441]],12390:[,,{12441:12391}],12391:[[12390,12441]],12392:[,,{12441:12393}],12393:[[12392,12441]],12399:[,,{12441:12400,12442:12401}],12400:[[12399,12441]],12401:[[12399,12442]],12402:[,,{12441:12403,12442:12404}],12403:[[12402,12441]],12404:[[12402,12442]],12405:[,,{12441:12406,12442:12407}],12406:[[12405,12441]],12407:[[12405,12442]],12408:[,,{12441:12409,12442:12410}],12409:[[12408,12441]],12410:[[12408,12442]],12411:[,,{12441:12412,12442:12413}],12412:[[12411,12441]],12413:[[12411,12442]],12436:[[12358,12441]],12441:[,8],12442:[,8],12443:[[32,12441],256],12444:[[32,12442],256],12445:[,,{12441:12446}],12446:[[12445,12441]],12447:[[12424,12426],256],12454:[,,{12441:12532}],12459:[,,{12441:12460}],12460:[[12459,12441]],12461:[,,{12441:12462}],12462:[[12461,12441]],12463:[,,{12441:12464}],12464:[[12463,12441]],12465:[,,{12441:12466}],12466:[[12465,12441]],12467:[,,{12441:12468}],12468:[[12467,12441]],12469:[,,{12441:12470}],12470:[[12469,12441]],12471:[,,{12441:12472}],12472:[[12471,12441]],12473:[,,{12441:12474}],12474:[[12473,12441]],12475:[,,{12441:12476}],12476:[[12475,12441]],12477:[,,{12441:12478}],12478:[[12477,12441]],12479:[,,{12441:12480}],12480:[[12479,12441]],12481:[,,{12441:12482}],12482:[[12481,12441]],12484:[,,{12441:12485}],12485:[[12484,12441]],12486:[,,{12441:12487}],12487:[[12486,12441]],12488:[,,{12441:12489}],12489:[[12488,12441]],12495:[,,{12441:12496,12442:12497}],12496:[[12495,12441]],12497:[[12495,12442]],12498:[,,{12441:12499,12442:12500}],12499:[[12498,12441]],12500:[[12498,12442]],12501:[,,{12441:12502,12442:12503}],12502:[[12501,12441]],12503:[[12501,12442]],12504:[,,{12441:12505,12442:12506}],12505:[[12504,12441]],12506:[[12504,12442]],12507:[,,{12441:12508,12442:12509}],12508:[[12507,12441]],12509:[[12507,12442]],12527:[,,{12441:12535}],12528:[,,{12441:12536}],12529:[,,{12441:12537}],12530:[,,{12441:12538}],12532:[[12454,12441]],12535:[[12527,12441]],12536:[[12528,12441]],12537:[[12529,12441]],12538:[[12530,12441]],12541:[,,{12441:12542}],12542:[[12541,12441]],12543:[[12467,12488],256]},12544:{12593:[[4352],256],12594:[[4353],256],12595:[[4522],256],12596:[[4354],256],12597:[[4524],256],12598:[[4525],256],12599:[[4355],256],12600:[[4356],256],12601:[[4357],256],12602:[[4528],256],12603:[[4529],256],12604:[[4530],256],12605:[[4531],256],12606:[[4532],256],12607:[[4533],256],12608:[[4378],256],12609:[[4358],256],12610:[[4359],256],12611:[[4360],256],12612:[[4385],256],12613:[[4361],256],12614:[[4362],256],12615:[[4363],256],12616:[[4364],256],12617:[[4365],256],12618:[[4366],256],12619:[[4367],256],12620:[[4368],256],12621:[[4369],256],12622:[[4370],256],12623:[[4449],256],12624:[[4450],256],12625:[[4451],256],12626:[[4452],256],12627:[[4453],256],12628:[[4454],256],12629:[[4455],256],12630:[[4456],256],12631:[[4457],256],12632:[[4458],256],12633:[[4459],256],12634:[[4460],256],12635:[[4461],256],12636:[[4462],256],12637:[[4463],256],12638:[[4464],256],12639:[[4465],256],12640:[[4466],256],12641:[[4467],256],12642:[[4468],256],12643:[[4469],256],12644:[[4448],256],12645:[[4372],256],12646:[[4373],256],12647:[[4551],256],12648:[[4552],256],12649:[[4556],256],12650:[[4558],256],12651:[[4563],256],12652:[[4567],256],12653:[[4569],256],12654:[[4380],256],12655:[[4573],256],12656:[[4575],256],12657:[[4381],256],12658:[[4382],256],12659:[[4384],256],12660:[[4386],256],12661:[[4387],256],12662:[[4391],256],12663:[[4393],256],12664:[[4395],256],12665:[[4396],256],12666:[[4397],256],12667:[[4398],256],12668:[[4399],256],12669:[[4402],256],12670:[[4406],256],12671:[[4416],256],12672:[[4423],256],12673:[[4428],256],12674:[[4593],256],12675:[[4594],256],12676:[[4439],256],12677:[[4440],256],12678:[[4441],256],12679:[[4484],256],12680:[[4485],256],12681:[[4488],256],12682:[[4497],256],12683:[[4498],256],12684:[[4500],256],12685:[[4510],256],12686:[[4513],256],12690:[[19968],256],12691:[[20108],256],12692:[[19977],256],12693:[[22235],256],12694:[[19978],256],12695:[[20013],256],12696:[[19979],256],12697:[[30002],256],12698:[[20057],256],12699:[[19993],256],12700:[[19969],256],12701:[[22825],256],12702:[[22320],256],12703:[[20154],256]},12800:{12800:[[40,4352,41],256],12801:[[40,4354,41],256],12802:[[40,4355,41],256],12803:[[40,4357,41],256],12804:[[40,4358,41],256],12805:[[40,4359,41],256],12806:[[40,4361,41],256],12807:[[40,4363,41],256],12808:[[40,4364,41],256],12809:[[40,4366,41],256],12810:[[40,4367,41],256],12811:[[40,4368,41],256],12812:[[40,4369,41],256],12813:[[40,4370,41],256],12814:[[40,4352,4449,41],256],12815:[[40,4354,4449,41],256],12816:[[40,4355,4449,41],256],12817:[[40,4357,4449,41],256],12818:[[40,4358,4449,41],256],12819:[[40,4359,4449,41],256],12820:[[40,4361,4449,41],256],12821:[[40,4363,4449,41],256],12822:[[40,4364,4449,41],256],12823:[[40,4366,4449,41],256],12824:[[40,4367,4449,41],256],12825:[[40,4368,4449,41],256],12826:[[40,4369,4449,41],256],12827:[[40,4370,4449,41],256],12828:[[40,4364,4462,41],256],12829:[[40,4363,4457,4364,4453,4523,41],256],12830:[[40,4363,4457,4370,4462,41],256],12832:[[40,19968,41],256],12833:[[40,20108,41],256],12834:[[40,19977,41],256],12835:[[40,22235,41],256],12836:[[40,20116,41],256],12837:[[40,20845,41],256],12838:[[40,19971,41],256],12839:[[40,20843,41],256],12840:[[40,20061,41],256],12841:[[40,21313,41],256],12842:[[40,26376,41],256],12843:[[40,28779,41],256],12844:[[40,27700,41],256],12845:[[40,26408,41],256],12846:[[40,37329,41],256],12847:[[40,22303,41],256],12848:[[40,26085,41],256],12849:[[40,26666,41],256],12850:[[40,26377,41],256],12851:[[40,31038,41],256],12852:[[40,21517,41],256],12853:[[40,29305,41],256],12854:[[40,36001,41],256],12855:[[40,31069,41],256],12856:[[40,21172,41],256],12857:[[40,20195,41],256],12858:[[40,21628,41],256],12859:[[40,23398,41],256],12860:[[40,30435,41],256],12861:[[40,20225,41],256],12862:[[40,36039,41],256],12863:[[40,21332,41],256],12864:[[40,31085,41],256],12865:[[40,20241,41],256],12866:[[40,33258,41],256],12867:[[40,33267,41],256],12868:[[21839],256],12869:[[24188],256],12870:[[25991],256],12871:[[31631],256],12880:[[80,84,69],256],12881:[[50,49],256],12882:[[50,50],256],12883:[[50,51],256],12884:[[50,52],256],12885:[[50,53],256],12886:[[50,54],256],12887:[[50,55],256],12888:[[50,56],256],12889:[[50,57],256],12890:[[51,48],256],12891:[[51,49],256],12892:[[51,50],256],12893:[[51,51],256],12894:[[51,52],256],12895:[[51,53],256],12896:[[4352],256],12897:[[4354],256],12898:[[4355],256],12899:[[4357],256],12900:[[4358],256],12901:[[4359],256],12902:[[4361],256],12903:[[4363],256],12904:[[4364],256],12905:[[4366],256],12906:[[4367],256],12907:[[4368],256],12908:[[4369],256],12909:[[4370],256],12910:[[4352,4449],256],12911:[[4354,4449],256],12912:[[4355,4449],256],12913:[[4357,4449],256],12914:[[4358,4449],256],12915:[[4359,4449],256],12916:[[4361,4449],256],12917:[[4363,4449],256],12918:[[4364,4449],256],12919:[[4366,4449],256],12920:[[4367,4449],256],12921:[[4368,4449],256],12922:[[4369,4449],256],12923:[[4370,4449],256],12924:[[4366,4449,4535,4352,4457],256],12925:[[4364,4462,4363,4468],256],12926:[[4363,4462],256],12928:[[19968],256],12929:[[20108],256],12930:[[19977],256],12931:[[22235],256],12932:[[20116],256],12933:[[20845],256],12934:[[19971],256],12935:[[20843],256],12936:[[20061],256],12937:[[21313],256],12938:[[26376],256],12939:[[28779],256],12940:[[27700],256],12941:[[26408],256],12942:[[37329],256],12943:[[22303],256],12944:[[26085],256],12945:[[26666],256],12946:[[26377],256],12947:[[31038],256],12948:[[21517],256],12949:[[29305],256],12950:[[36001],256],12951:[[31069],256],12952:[[21172],256],12953:[[31192],256],12954:[[30007],256],12955:[[22899],256],12956:[[36969],256],12957:[[20778],256],12958:[[21360],256],12959:[[27880],256],12960:[[38917],256],12961:[[20241],256],12962:[[20889],256],12963:[[27491],256],12964:[[19978],256],12965:[[20013],256],12966:[[19979],256],12967:[[24038],256],12968:[[21491],256],12969:[[21307],256],12970:[[23447],256],12971:[[23398],256],12972:[[30435],256],12973:[[20225],256],12974:[[36039],256],12975:[[21332],256],12976:[[22812],256],12977:[[51,54],256],12978:[[51,55],256],12979:[[51,56],256],12980:[[51,57],256],12981:[[52,48],256],12982:[[52,49],256],12983:[[52,50],256],12984:[[52,51],256],12985:[[52,52],256],12986:[[52,53],256],12987:[[52,54],256],12988:[[52,55],256],12989:[[52,56],256],12990:[[52,57],256],12991:[[53,48],256],12992:[[49,26376],256],12993:[[50,26376],256],12994:[[51,26376],256],12995:[[52,26376],256],12996:[[53,26376],256],12997:[[54,26376],256],12998:[[55,26376],256],12999:[[56,26376],256],13
70123000:[[57,26376],256],13001:[[49,48,26376],256],13002:[[49,49,26376],256],13003:[[49,50,26376],256],13004:[[72,103],256],13005:[[101,114,103],256],13006:[[101,86],256],13007:[[76,84,68],256],13008:[[12450],256],13009:[[12452],256],13010:[[12454],256],13011:[[12456],256],13012:[[12458],256],13013:[[12459],256],13014:[[12461],256],13015:[[12463],256],13016:[[12465],256],13017:[[12467],256],13018:[[12469],256],13019:[[12471],256],13020:[[12473],256],13021:[[12475],256],13022:[[12477],256],13023:[[12479],256],13024:[[12481],256],13025:[[12484],256],13026:[[12486],256],13027:[[12488],256],13028:[[12490],256],13029:[[12491],256],13030:[[12492],256],13031:[[12493],256],13032:[[12494],256],13033:[[12495],256],13034:[[12498],256],13035:[[12501],256],13036:[[12504],256],13037:[[12507],256],13038:[[12510],256],13039:[[12511],256],13040:[[12512],256],13041:[[12513],256],13042:[[12514],256],13043:[[12516],256],13044:[[12518],256],13045:[[12520],256],13046:[[12521],256],13047:[[12522],256],13048:[[12523],256],13049:[[12524],256],13050:[[12525],256],13051:[[12527],256],13052:[[12528],256],13053:[[12529],256],13054:[[12530],256]},13056:{13056:[[12450,12497,12540,12488],256],13057:[[12450,12523,12501,12449],256],13058:[[12450,12531,12506,12450],256],13059:[[12450,12540,12523],256],13060:[[12452,12491,12531,12464],256],13061:[[12452,12531,12481],256],13062:[[12454,12457,12531],256],13063:[[12456,12473,12463,12540,12489],256],13064:[[12456,12540,12459,12540],256],13065:[[12458,12531,12473],256],13066:[[12458,12540,12512],256],13067:[[12459,12452,12522],256],13068:[[12459,12521,12483,12488],256],13069:[[12459,12525,12522,12540],256],13070:[[12460,12525,12531],256],13071:[[12460,12531,12510],256],13072:[[12462,12460],256],13073:[[12462,12491,12540],256],13074:[[12461,12517,12522,12540],256],13075:[[12462,12523,12480,12540],256],13076:[[12461,12525],256],13077:[[12461,12525,12464,12521,12512],256],13078:[[12461,12525,12513,12540,12488,12523],256],13079:[[12461,12525,12527,12483,12488],256],13080:[[12464,12521,12512],256],13081:[[12464,12521,12512,12488,12531],256],13082:[[12463,12523,12476,12452,12525],256],13083:[[12463,12525,12540,12493],256],13084:[[12465,12540,12473],256],13085:[[12467,12523,12490],256],13086:[[12467,12540,12509],256],13087:[[12469,12452,12463,12523],256],13088:[[12469,12531,12481,12540,12512],256],13089:[[12471,12522,12531,12464],256],13090:[[12475,12531,12481],256],13091:[[12475,12531,12488],256],13092:[[12480,12540,12473],256],13093:[[12487,12471],256],13094:[[12489,12523],256],13095:[[12488,12531],256],13096:[[12490,12494],256],13097:[[12494,12483,12488],256],13098:[[12495,12452,12484],256],13099:[[12497,12540,12475,12531,12488],256],13100:[[12497,12540,12484],256],13101:[[12496,12540,12524,12523],256],13102:[[12500,12450,12473,12488,12523],256],13103:[[12500,12463,12523],256],13104:[[12500,12467],256],13105:[[12499,12523],256],13106:[[12501,12449,12521,12483,12489],256],13107:[[12501,12451,12540,12488],256],13108:[[12502,12483,12471,12455,12523],256],13109:[[12501,12521,12531],256],13110:[[12504,12463,12479,12540,12523],256],13111:[[12506,12477],256],13112:[[12506,12491,12498],256],13113:[[12504,12523,12484],256],13114:[[12506,12531,12473],256],13115:[[12506,12540,12472],256],13116:[[12505,12540,12479],256],13117:[[12509,12452,12531,12488],256],13118:[[12508,12523,12488],256],13119:[[12507,12531],256],13120:[[12509,12531,12489],256],13121:[[12507,12540,12523],256],13122:[[12507,12540,12531],256],13123:[[12510,12452,12463,12525],256],13124:[[12510,12452,12523],256],13125:[[12510,12483,12495],256],13126:[[12510,12523,12463],256],13127:[[12510,12531,12471,12519,12531],256],13128:[[12511,12463,12525,12531],256],13129:[[12511,12522],256],13130:[[12511,12522,12496,12540,12523],256],13131:[[12513,12460],256],13132:[[12513,12460,12488,12531],256],13133:[[12513,12540,12488,12523],256],13134:[[12516,12540,12489],256],13135:[[12516,12540,12523],256],13136:[[12518,12450,12531],256],13137:[[12522,12483,12488,12523],256],13138:[[12522,12521],256],13139:[[12523,12500,12540],256],13140:[[12523,12540,12502,12523],256],13141:[[12524,12512],256],13142:[[12524,12531,12488,12466,12531],256],13143:[[12527,12483,12488],256],13144:[[48,28857],256],13145:[[49,28857],256],13146:[[50,28857],256],13147:[[51,28857],256],13148:[[52,28857],256],13149:[[53,28857],256],13150:[[54,28857],256],13151:[[55,28857],256],13152:[[56,28857],256],13153:[[57,28857],256],13154:[[49,48,28857],256],13155:[[49,49,28857],256],13156:[[49,50,28857],256],13157:[[49,51,28857],256],13158:[[49,52,28857],256],13159:[[49,53,28857],256],13160:[[49,54,28857],256],13161:[[49,55,28857],256],13162:[[49,56,28857],256],13163:[[49,57,28857],256],13164:[[50,48,28857],256],13165:[[50,49,28857],256],13166:[[50,50,28857],256],13167:[[50,51,28857],256],13168:[[50,52,28857],256],13169:[[104,80,97],256],13170:[[100,97],256],13171:[[65,85],256],13172:[[98,97,114],256],13173:[[111,86],256],13174:[[112,99],256],13175:[[100,109],256],13176:[[100,109,178],256],13177:[[100,109,179],256],13178:[[73,85],256],13179:[[24179,25104],256],13180:[[26157,21644],256],13181:[[22823,27491],256],13182:[[26126,27835],256],13183:[[26666,24335,20250,31038],256],13184:[[112,65],256],13185:[[110,65],256],13186:[[956,65],256],13187:[[109,65],256],13188:[[107,65],256],13189:[[75,66],256],13190:[[77,66],256],13191:[[71,66],256],13192:[[99,97,108],256],13193:[[107,99,97,108],256],13194:[[112,70],256],13195:[[110,70],256],13196:[[956,70],256],13197:[[956,103],256],13198:[[109,103],256],13199:[[107,103],256],13200:[[72,122],256],13201:[[107,72,122],256],13202:[[77,72,122],256],13203:[[71,72,122],256],13204:[[84,72,122],256],13205:[[956,8467],256],13206:[[109,8467],256],13207:[[100,8467],256],13208:[[107,8467],256],13209:[[102,109],256],13210:[[110,109],256],13211:[[956,109],256],13212:[[109,109],256],13213:[[99,109],256],13214:[[107,109],256],13215:[[109,109,178],256],13216:[[99,109,178],256],13217:[[109,178],256],13218:[[107,109,178],256],13219:[[109,109,179],256],13220:[[99,109,179],256],13221:[[109,179],256],13222:[[107,109,179],256],13223:[[109,8725,115],256],13224:[[109,8725,115,178],256],13225:[[80,97],256],13226:[[107,80,97],256],13227:[[77,80,97],256],13228:[[71,80,97],256],13229:[[114,97,100],256],13230:[[114,97,100,8725,115],256],13231:[[114,97,100,8725,115,178],256],13232:[[112,115],256],13233:[[110,115],256],13234:[[956,115],256],13235:[[109,115],256],13236:[[112,86],256],13237:[[110,86],256],13238:[[956,86],256],13239:[[109,86],256],13240:[[107,86],256],13241:[[77,86],256],13242:[[112,87],256],13243:[[110,87],256],13244:[[956,87],256],13245:[[109,87],256],13246:[[107,87],256],13247:[[77,87],256],13248:[[107,937],256],13249:[[77,937],256],13250:[[97,46,109,46],256],13251:[[66,113],256],13252:[[99,99],256],13253:[[99,100],256],13254:[[67,8725,107,103],256],13255:[[67,111,46],256],13256:[[100,66],256],13257:[[71,121],256],13258:[[104,97],256],13259:[[72,80],256],13260:[[105,110],256],13261:[[75,75],256],13262:[[7
vendor: 6,453 bytes, line 70123
701235,77],256],13263:[[107,116],256],13264:[[108,109],256],13265:[[108,110],256],13266:[[108,111,103],256],13267:[[108,120],256],13268:[[109,98],256],13269:[[109,105,108],256],13270:[[109,111,108],256],13271:[[80,72],256],13272:[[112,46,109,46],256],13273:[[80,80,77],256],13274:[[80,82],256],13275:[[115,114],256],13276:[[83,118],256],13277:[[87,98],256],13278:[[86,8725,109],256],13279:[[65,8725,109],256],13280:[[49,26085],256],13281:[[50,26085],256],13282:[[51,26085],256],13283:[[52,26085],256],13284:[[53,26085],256],13285:[[54,26085],256],13286:[[55,26085],256],13287:[[56,26085],256],13288:[[57,26085],256],13289:[[49,48,26085],256],13290:[[49,49,26085],256],13291:[[49,50,26085],256],13292:[[49,51,26085],256],13293:[[49,52,26085],256],13294:[[49,53,26085],256],13295:[[49,54,26085],256],13296:[[49,55,26085],256],13297:[[49,56,26085],256],13298:[[49,57,26085],256],13299:[[50,48,26085],256],13300:[[50,49,26085],256],13301:[[50,50,26085],256],13302:[[50,51,26085],256],13303:[[50,52,26085],256],13304:[[50,53,26085],256],13305:[[50,54,26085],256],13306:[[50,55,26085],256],13307:[[50,56,26085],256],13308:[[50,57,26085],256],13309:[[51,48,26085],256],13310:[[51,49,26085],256],13311:[[103,97,108],256]},27136:{92912:[,1],92913:[,1],92914:[,1],92915:[,1],92916:[,1]},27392:{92976:[,230],92977:[,230],92978:[,230],92979:[,230],92980:[,230],92981:[,230],92982:[,230]},42496:{42607:[,230],42612:[,230],42613:[,230],42614:[,230],42615:[,230],42616:[,230],42617:[,230],42618:[,230],42619:[,230],42620:[,230],42621:[,230],42652:[[1098],256],42653:[[1100],256],42655:[,230],42736:[,230],42737:[,230]},42752:{42864:[[42863],256],43000:[[294],256],43001:[[339],256]},43008:{43014:[,9],43204:[,9],43232:[,230],43233:[,230],43234:[,230],43235:[,230],43236:[,230],43237:[,230],43238:[,230],43239:[,230],43240:[,230],43241:[,230],43242:[,230],43243:[,230],43244:[,230],43245:[,230],43246:[,230],43247:[,230],43248:[,230],43249:[,230]},43264:{43307:[,220],43308:[,220],43309:[,220],43347:[,9],43443:[,7],43456:[,9]},43520:{43696:[,230],43698:[,230],43699:[,230],43700:[,220],43703:[,230],43704:[,230],43710:[,230],43711:[,230],43713:[,230],43766:[,9]},43776:{43868:[[42791],256],43869:[[43831],256],43870:[[619],256],43871:[[43858],256],44013:[,9]},48128:{113822:[,1]},53504:{119134:[[119127,119141],512],119135:[[119128,119141],512],119136:[[119135,119150],512],119137:[[119135,119151],512],119138:[[119135,119152],512],119139:[[119135,119153],512],119140:[[119135,119154],512],119141:[,216],119142:[,216],119143:[,1],119144:[,1],119145:[,1],119149:[,226],119150:[,216],119151:[,216],119152:[,216],119153:[,216],119154:[,216],119163:[,220],119164:[,220],119165:[,220],119166:[,220],119167:[,220],119168:[,220],119169:[,220],119170:[,220],119173:[,230],119174:[,230],119175:[,230],119176:[,230],119177:[,230],119178:[,220],119179:[,220],119210:[,230],119211:[,230],119212:[,230],119213:[,230],119227:[[119225,119141],512],119228:[[119226,119141],512],119229:[[119227,119150],512],119230:[[119228,119150],512],119231:[[119227,119151],512],119232:[[119228,119151],512]},53760:{119362:[,230],119363:[,230],119364:[,230]},54272:{119808:[[65],256],119809:[[66],256],119810:[[67],256],119811:[[68],256],119812:[[69],256],119813:[[70],256],119814:[[71],256],119815:[[72],256],119816:[[73],256],119817:[[74],256],119818:[[75],256],119819:[[76],256],119820:[[77],256],119821:[[78],256],119822:[[79],256],119823:[[80],256],119824:[[81],256],119825:[[82],256],119826:[[83],256],119827:[[84],256],119828:[[85],256],119829:[[86],256],119830:[[87],256],119831:[[88],256],119832:[[89],256],119833:[[90],256],119834:[[97],256],119835:[[98],256],119836:[[99],256],119837:[[100],256],119838:[[101],256],119839:[[102],256],119840:[[103],256],119841:[[104],256],119842:[[105],256],119843:[[106],256],119844:[[107],256],119845:[[108],256],119846:[[109],256],119847:[[110],256],119848:[[111],256],119849:[[112],256],119850:[[113],256],119851:[[114],256],119852:[[115],256],119853:[[116],256],119854:[[117],256],119855:[[118],256],119856:[[119],256],119857:[[120],256],119858:[[121],256],119859:[[122],256],119860:[[65],256],119861:[[66],256],119862:[[67],256],119863:[[68],256],119864:[[69],256],119865:[[70],256],119866:[[71],256],119867:[[72],256],119868:[[73],256],119869:[[74],256],119870:[[75],256],119871:[[76],256],119872:[[77],256],119873:[[78],256],119874:[[79],256],119875:[[80],256],119876:[[81],256],119877:[[82],256],119878:[[83],256],119879:[[84],256],119880:[[85],256],119881:[[86],256],119882:[[87],256],119883:[[88],256],119884:[[89],256],119885:[[90],256],119886:[[97],256],119887:[[98],256],119888:[[99],256],119889:[[100],256],119890:[[101],256],119891:[[102],256],119892:[[103],256],119894:[[105],256],119895:[[106],256],119896:[[107],256],119897:[[108],256],119898:[[109],256],119899:[[110],256],119900:[[111],256],119901:[[112],256],119902:[[113],256],119903:[[114],256],119904:[[115],256],119905:[[116],256],119906:[[117],256],119907:[[118],256],119908:[[119],256],119909:[[120],256],119910:[[121],256],119911:[[122],256],119912:[[65],256],119913:[[66],256],119914:[[67],256],119915:[[68],256],119916:[[69],256],119917:[[70],256],119918:[[71],256],119919:[[72],256],119920:[[73],256],119921:[[74],256],119922:[[75],256],119923:[[76],256],119924:[[77],256],119925:[[78],256],119926:[[79],256],119927:[[80],256],119928:[[81],256],119929:[[82],256],119930:[[83],256],119931:[[84],256],119932:[[85],256],119933:[[86],256],119934:[[87],256],119935:[[88],256],119936:[[89],256],119937:[[90],256],119938:[[97],256],119939:[[98],256],119940:[[99],256],119941:[[100],256],119942:[[101],256],119943:[[102],256],119944:[[103],256],119945:[[104],256],119946:[[105],256],119947:[[106],256],119948:[[107],256],119949:[[108],256],119950:[[109],256],119951:[[110],256],119952:[[111],256],119953:[[112],256],119954:[[113],256],119955:[[114],256],119956:[[115],256],119957:[[116],256],119958:[[117],256],119959:[[118],256],119960:[[119],256],119961:[[120],256],119962:[[121],256],119963:[[122],256],119964:[[65],256],119966:[[67],256],119967:[[68],256],119970:[[71],256],119973:[[74],256],119974:[[75],256],119977:[[78],256],119978:[[79],256],119979:[[80],256],119980:[[81],256],119982:[[83],256],119983:[[84],256],119984:[[85],256],119985:[[86],256],119986:[[87],256],119987:[[88],256],119988:[[89],256],119989:[[90],256],119990:[[97],256],119991:[[98],256],119992:[[99],256],119993:[[100],256],119995:[[102],256],119997:[[104],256],119998:[[105],256],119999:[[106],256],120000
vendor: 32,798 bytes, line 70123
70123:[[107],256],120001:[[108],256],120002:[[109],256],120003:[[110],256],120005:[[112],256],120006:[[113],256],120007:[[114],256],120008:[[115],256],120009:[[116],256],120010:[[117],256],120011:[[118],256],120012:[[119],256],120013:[[120],256],120014:[[121],256],120015:[[122],256],120016:[[65],256],120017:[[66],256],120018:[[67],256],120019:[[68],256],120020:[[69],256],120021:[[70],256],120022:[[71],256],120023:[[72],256],120024:[[73],256],120025:[[74],256],120026:[[75],256],120027:[[76],256],120028:[[77],256],120029:[[78],256],120030:[[79],256],120031:[[80],256],120032:[[81],256],120033:[[82],256],120034:[[83],256],120035:[[84],256],120036:[[85],256],120037:[[86],256],120038:[[87],256],120039:[[88],256],120040:[[89],256],120041:[[90],256],120042:[[97],256],120043:[[98],256],120044:[[99],256],120045:[[100],256],120046:[[101],256],120047:[[102],256],120048:[[103],256],120049:[[104],256],120050:[[105],256],120051:[[106],256],120052:[[107],256],120053:[[108],256],120054:[[109],256],120055:[[110],256],120056:[[111],256],120057:[[112],256],120058:[[113],256],120059:[[114],256],120060:[[115],256],120061:[[116],256],120062:[[117],256],120063:[[118],256]},54528:{120064:[[119],256],120065:[[120],256],120066:[[121],256],120067:[[122],256],120068:[[65],256],120069:[[66],256],120071:[[68],256],120072:[[69],256],120073:[[70],256],120074:[[71],256],120077:[[74],256],120078:[[75],256],120079:[[76],256],120080:[[77],256],120081:[[78],256],120082:[[79],256],120083:[[80],256],120084:[[81],256],120086:[[83],256],120087:[[84],256],120088:[[85],256],120089:[[86],256],120090:[[87],256],120091:[[88],256],120092:[[89],256],120094:[[97],256],120095:[[98],256],120096:[[99],256],120097:[[100],256],120098:[[101],256],120099:[[102],256],120100:[[103],256],120101:[[104],256],120102:[[105],256],120103:[[106],256],120104:[[107],256],120105:[[108],256],120106:[[109],256],120107:[[110],256],120108:[[111],256],120109:[[112],256],120110:[[113],256],120111:[[114],256],120112:[[115],256],120113:[[116],256],120114:[[117],256],120115:[[118],256],120116:[[119],256],120117:[[120],256],120118:[[121],256],120119:[[122],256],120120:[[65],256],120121:[[66],256],120123:[[68],256],120124:[[69],256],120125:[[70],256],120126:[[71],256],120128:[[73],256],120129:[[74],256],120130:[[75],256],120131:[[76],256],120132:[[77],256],120134:[[79],256],120138:[[83],256],120139:[[84],256],120140:[[85],256],120141:[[86],256],120142:[[87],256],120143:[[88],256],120144:[[89],256],120146:[[97],256],120147:[[98],256],120148:[[99],256],120149:[[100],256],120150:[[101],256],120151:[[102],256],120152:[[103],256],120153:[[104],256],120154:[[105],256],120155:[[106],256],120156:[[107],256],120157:[[108],256],120158:[[109],256],120159:[[110],256],120160:[[111],256],120161:[[112],256],120162:[[113],256],120163:[[114],256],120164:[[115],256],120165:[[116],256],120166:[[117],256],120167:[[118],256],120168:[[119],256],120169:[[120],256],120170:[[121],256],120171:[[122],256],120172:[[65],256],120173:[[66],256],120174:[[67],256],120175:[[68],256],120176:[[69],256],120177:[[70],256],120178:[[71],256],120179:[[72],256],120180:[[73],256],120181:[[74],256],120182:[[75],256],120183:[[76],256],120184:[[77],256],120185:[[78],256],120186:[[79],256],120187:[[80],256],120188:[[81],256],120189:[[82],256],120190:[[83],256],120191:[[84],256],120192:[[85],256],120193:[[86],256],120194:[[87],256],120195:[[88],256],120196:[[89],256],120197:[[90],256],120198:[[97],256],120199:[[98],256],120200:[[99],256],120201:[[100],256],120202:[[101],256],120203:[[102],256],120204:[[103],256],120205:[[104],256],120206:[[105],256],120207:[[106],256],120208:[[107],256],120209:[[108],256],120210:[[109],256],120211:[[110],256],120212:[[111],256],120213:[[112],256],120214:[[113],256],120215:[[114],256],120216:[[115],256],120217:[[116],256],120218:[[117],256],120219:[[118],256],120220:[[119],256],120221:[[120],256],120222:[[121],256],120223:[[122],256],120224:[[65],256],120225:[[66],256],120226:[[67],256],120227:[[68],256],120228:[[69],256],120229:[[70],256],120230:[[71],256],120231:[[72],256],120232:[[73],256],120233:[[74],256],120234:[[75],256],120235:[[76],256],120236:[[77],256],120237:[[78],256],120238:[[79],256],120239:[[80],256],120240:[[81],256],120241:[[82],256],120242:[[83],256],120243:[[84],256],120244:[[85],256],120245:[[86],256],120246:[[87],256],120247:[[88],256],120248:[[89],256],120249:[[90],256],120250:[[97],256],120251:[[98],256],120252:[[99],256],120253:[[100],256],120254:[[101],256],120255:[[102],256],120256:[[103],256],120257:[[104],256],120258:[[105],256],120259:[[106],256],120260:[[107],256],120261:[[108],256],120262:[[109],256],120263:[[110],256],120264:[[111],256],120265:[[112],256],120266:[[113],256],120267:[[114],256],120268:[[115],256],120269:[[116],256],120270:[[117],256],120271:[[118],256],120272:[[119],256],120273:[[120],256],120274:[[121],256],120275:[[122],256],120276:[[65],256],120277:[[66],256],120278:[[67],256],120279:[[68],256],120280:[[69],256],120281:[[70],256],120282:[[71],256],120283:[[72],256],120284:[[73],256],120285:[[74],256],120286:[[75],256],120287:[[76],256],120288:[[77],256],120289:[[78],256],120290:[[79],256],120291:[[80],256],120292:[[81],256],120293:[[82],256],120294:[[83],256],120295:[[84],256],120296:[[85],256],120297:[[86],256],120298:[[87],256],120299:[[88],256],120300:[[89],256],120301:[[90],256],120302:[[97],256],120303:[[98],256],120304:[[99],256],120305:[[100],256],120306:[[101],256],120307:[[102],256],120308:[[103],256],120309:[[104],256],120310:[[105],256],120311:[[106],256],120312:[[107],256],120313:[[108],256],120314:[[109],256],120315:[[110],256],120316:[[111],256],120317:[[112],256],120318:[[113],256],120319:[[114],256]},54784:{120320:[[115],256],120321:[[116],256],120322:[[117],256],120323:[[118],256],120324:[[119],256],120325:[[120],256],120326:[[121],256],120327:[[122],256],120328:[[65],256],120329:[[66],256],120330:[[67],256],120331:[[68],256],120332:[[69],256],120333:[[70],256],120334:[[71],256],120335:[[72],256],120336:[[73],256],120337:[[74],256],120338:[[75],256],120339:[[76],256],120340:[[77],256],120341:[[78],256],120342:[[79],256],120343:[[80],256],120344:[[81],256],120345:[[82],256],120346:[[83],256],120347:[[84],256],120348:[[85],256],120349:[[86],256],120350:[[87],256],120351:[[88],256],120352:[[89],256],120353:[[90],256],120354:[[97],256],120355:[[98],256],120356:[[99],256],120357:[[100],256],120358:[[101],256],120359:[[102],256],120360:[[103],256],120361:[[104],256],120362:[[105],256],120363:[[106],256],120364:[[107],256],120365:[[108],256],120366:[[109],256],120367:[[110],256],120368:[[111],256],120369:[[112],256],120370:[[113],256],120371:[[114],256],120372:[[115],256],120373:[[116],256],120374:[[117],256],120375:[[118],256],120376:[[119],256],120377:[[120],256],120378:[[121],256],120379:[[122],256],120380:[[65],256],120381:[[66],256],120382:[[67],256],120383:[[68],256],120384:[[69],256],120385:[[70],256],120386:[[71],256],120387:[[72],256],120388:[[73],256],120389:[[74],256],120390:[[75],256],120391:[[76],256],120392:[[77],256],120393:[[78],256],120394:[[79],256],120395:[[80],256],120396:[[81],256],120397:[[82],256],120398:[[83],256],120399:[[84],256],120400:[[85],256],120401:[[86],256],120402:[[87],256],120403:[[88],256],120404:[[89],256],120405:[[90],256],120406:[[97],256],120407:[[98],256],120408:[[99],256],120409:[[100],256],120410:[[101],256],120411:[[102],256],120412:[[103],256],120413:[[104],256],120414:[[105],256],120415:[[106],256],120416:[[107],256],120417:[[108],256],120418:[[109],256],120419:[[110],256],120420:[[111],256],120421:[[112],256],120422:[[113],256],120423:[[114],256],120424:[[115],256],120425:[[116],256],120426:[[117],256],120427:[[118],256],120428:[[119],256],120429:[[120],256],120430:[[121],256],120431:[[122],256],120432:[[65],256],120433:[[66],256],120434:[[67],256],120435:[[68],256],120436:[[69],256],120437:[[70],256],120438:[[71],256],120439:[[72],256],120440:[[73],256],120441:[[74],256],120442:[[75],256],120443:[[76],256],120444:[[77],256],120445:[[78],256],120446:[[79],256],120447:[[80],256],120448:[[81],256],120449:[[82],256],120450:[[83],256],120451:[[84],256],120452:[[85],256],120453:[[86],256],120454:[[87],256],120455:[[88],256],120456:[[89],256],120457:[[90],256],120458:[[97],256],120459:[[98],256],120460:[[99],256],120461:[[100],256],120462:[[101],256],120463:[[102],256],120464:[[103],256],120465:[[104],256],120466:[[105],256],120467:[[106],256],120468:[[107],256],120469:[[108],256],120470:[[109],256],120471:[[110],256],120472:[[111],256],120473:[[112],256],120474:[[113],256],120475:[[114],256],120476:[[115],256],120477:[[116],256],120478:[[117],256],120479:[[118],256],120480:[[119],256],120481:[[120],256],120482:[[121],256],120483:[[122],256],120484:[[305],256],120485:[[567],256],120488:[[913],256],120489:[[914],256],120490:[[915],256],120491:[[916],256],120492:[[917],256],120493:[[918],256],120494:[[919],256],120495:[[920],256],120496:[[921],256],120497:[[922],256],120498:[[923],256],120499:[[924],256],120500:[[925],256],120501:[[926],256],120502:[[927],256],120503:[[928],256],120504:[[929],256],120505:[[1012],256],120506:[[931],256],120507:[[932],256],120508:[[933],256],120509:[[934],256],120510:[[935],256],120511:[[936],256],120512:[[937],256],120513:[[8711],256],120514:[[945],256],120515:[[946],256],120516:[[947],256],120517:[[948],256],120518:[[949],256],120519:[[950],256],120520:[[951],256],120521:[[952],256],120522:[[953],256],120523:[[954],256],120524:[[955],256],120525:[[956],256],120526:[[957],256],120527:[[958],256],120528:[[959],256],120529:[[960],256],120530:[[961],256],120531:[[962],256],120532:[[963],256],120533:[[964],256],120534:[[965],256],120535:[[966],256],120536:[[967],256],120537:[[968],256],120538:[[969],256],120539:[[8706],256],120540:[[1013],256],120541:[[977],256],120542:[[1008],256],120543:[[981],256],120544:[[1009],256],120545:[[982],256],120546:[[913],256],120547:[[914],256],120548:[[915],256],120549:[[916],256],120550:[[917],256],120551:[[918],256],120552:[[919],256],120553:[[920],256],120554:[[921],256],120555:[[922],256],120556:[[923],256],120557:[[924],256],120558:[[925],256],120559:[[926],256],120560:[[927],256],120561:[[928],256],120562:[[929],256],120563:[[1012],256],120564:[[931],256],120565:[[932],256],120566:[[933],256],120567:[[934],256],120568:[[935],256],120569:[[936],256],120570:[[937],256],120571:[[8711],256],120572:[[945],256],120573:[[946],256],120574:[[947],256],120575:[[948],256]},55040:{120576:[[949],256],120577:[[950],256],120578:[[951],256],120579:[[952],256],120580:[[953],256],120581:[[954],256],120582:[[955],256],120583:[[956],256],120584:[[957],256],120585:[[958],256],120586:[[959],256],120587:[[960],256],120588:[[961],256],120589:[[962],256],120590:[[963],256],120591:[[964],256],120592:[[965],256],120593:[[966],256],120594:[[967],256],120595:[[968],256],120596:[[969],256],120597:[[8706],256],120598:[[1013],256],120599:[[977],256],120600:[[1008],256],120601:[[981],256],120602:[[1009],256],120603:[[982],256],120604:[[913],256],120605:[[914],256],120606:[[915],256],120607:[[916],256],120608:[[917],256],120609:[[918],256],120610:[[919],256],120611:[[920],256],120612:[[921],256],120613:[[922],256],120614:[[923],256],120615:[[924],256],120616:[[925],256],120617:[[926],256],120618:[[927],256],120619:[[928],256],120620:[[929],256],120621:[[1012],256],120622:[[931],256],120623:[[932],256],120624:[[933],256],120625:[[934],256],120626:[[935],256],120627:[[936],256],120628:[[937],256],120629:[[8711],256],120630:[[945],256],120631:[[946],256],120632:[[947],256],120633:[[948],256],120634:[[949],256],120635:[[950],256],120636:[[951],256],120637:[[952],256],120638:[[953],256],120639:[[954],256],120640:[[955],256],120641:[[956],256],120642:[[957],256],120643:[[958],256],120644:[[959],256],120645:[[960],256],120646:[[961],256],120647:[[962],256],120648:[[963],256],120649:[[964],256],120650:[[965],256],120651:[[966],256],120652:[[967],256],120653:[[968],256],120654:[[969],256],120655:[[8706],256],120656:[[1013],256],120657:[[977],256],120658:[[1008],256],120659:[[981],256],120660:[[1009],256],120661:[[982],256],120662:[[913],256],120663:[[914],256],120664:[[915],256],120665:[[916],256],120666:[[917],256],120667:[[918],256],120668:[[919],256],120669:[[920],256],120670:[[921],256],120671:[[922],256],120672:[[923],256],120673:[[924],256],120674:[[925],256],120675:[[926],256],120676:[[927],256],120677:[[928],256],120678:[[929],256],120679:[[1012],256],120680:[[931],256],120681:[[932],256],120682:[[933],256],120683:[[934],256],120684:[[935],256],120685:[[936],256],120686:[[937],256],120687:[[8711],256],120688:[[945],256],120689:[[946],256],120690:[[947],256],120691:[[948],256],120692:[[949],256],120693:[[950],256],120694:[[951],256],120695:[[952],256],120696:[[953],256],120697:[[954],256],120698:[[955],256],120699:[[956],256],120700:[[957],256],120701:[[958],256],120702:[[959],256],120703:[[960],256],120704:[[961],256],120705:[[962],256],120706:[[963],256],120707:[[964],256],120708:[[965],256],120709:[[966],256],120710:[[967],256],120711:[[968],256],120712:[[969],256],120713:[[8706],256],120714:[[1013],256],120715:[[977],256],120716:[[1008],256],120717:[[981],256],120718:[[1009],256],120719:[[982],256],120720:[[913],256],120721:[[914],256],120722:[[915],256],120723:[[916],256],120724:[[917],256],120725:[[918],256],120726:[[919],256],120727:[[920],256],120728:[[921],256],120729:[[922],256],120730:[[923],256],120731:[[924],256],120732:[[925],256],120733:[[926],256],120734:[[927],256],120735:[[928],256],120736:[[929],256],120737:[[1012],256],120738:[[931],256],120739:[[932],256],120740:[[933],256],120741:[[934],256],120742:[[935],256],120743:[[936],256],120744:[[937],256],120745:[[8711],256],120746:[[945],256],120747:[[946],256],120748:[[947],256],120749:[[948],256],120750:[[949],256],120751:[[950],256],120752:[[951],256],120753:[[952],256],120754:[[953],256],120755:[[954],256],120756:[[955],256],120757:[[956],256],120758:[[957],256],120759:[[958],256],120760:[[959],256],120761:[[960],256],120762:[[961],256],120763:[[962],256],120764:[[963],256],120765:[[964],256],120766:[[965],256],120767:[[966],256],120768:[[967],256],120769:[[968],256],120770:[[969],256],120771:[[8706],256],120772:[[1013],256],120773:[[977],256],120774:[[1008],256],120775:[[981],256],120776:[[1009],256],120777:[[982],256],120778:[[988],256],120779:[[989],256],120782:[[48],256],120783:[[49],256],120784:[[50],256],120785:[[51],256],120786:[[52],256],120787:[[53],256],120788:[[54],256],120789:[[55],256],120790:[[56],256],120791:[[57],256],120792:[[48],256],120793:[[49],256],120794:[[50],256],120795:[[51],256],120796:[[52],256],120797:[[53],256],120798:[[54],256],120799:[[55],256],120800:[[56],256],120801:[[57],256],120802:[[48],256],120803:[[49],256],120804:[[50],256],120805:[[51],256],120806:[[52],256],120807:[[53],256],120808:[[54],256],120809:[[55],256],120810:[[56],256],120811:[[57],256],120812:[[48],256],120813:[[49],256],120814:[[50],256],120815:[[51],256],120816:[[52],256],120817:[[53],256],120818:[[54],256],120819:[[55],256],120820:[[56],256],120821:[[57],256],120822:[[48],256],120823:[[49],256],120824:[[50],256],120825:[[51],256],120826:[[52],256],120827:[[53],256],120828:[[54],256],120829:[[55],256],120830:[[56],256],120831:[[57],256]},59392:{125136:[,220],125137:[,220],125138:[,220],125139:[,220],125140:[,220],125141:[,220],125142:[,220]},60928:{126464:[[1575],256],126465:[[1576],256],126466:[[1580],256],126467:[[1583],256],126469:[[1608],256],126470:[[1586],256],126471:[[1581],256],126472:[[1591],256],126473:[[1610],256],126474:[[1603],256],126475:[[1604],256],126476:[[1605],256],126477:[[1606],256],126478:[[1587],256],126479:[[1593],256],126480:[[1601],256],126481:[[1589],256],126482:[[1602],256],126483:[[1585],256],126484:[[1588],256],126485:[[1578],256],126486:[[1579],256],126487:[[1582],256],126488:[[1584],256],126489:[[1590],256],126490:[[1592],256],126491:[[1594],256],126492:[[1646],256],126493:[[1722],256],126494:[[1697],256],126495:[[1647],256],126497:[[1576],256],126498:[[1580],256],126500:[[1607],256],126503:[[1581],256],126505:[[1610],256],126506:[[1603],256],126507:[[1604],256],126508:[[1605],256],126509:[[1606],256],126510:[[1587],256],126511:[[1593],256],126512:[[1601],256],126513:[[1589],256],126514:[[1602],256],126516:[[1588],256],126517:[[1578],256],126518:[[1579],256],126519:[[1582],256],126521:[[1590],256],126523:[[1594],256],126530:[[1580],256],126535:[[1581],256],126537:[[1610],256],126539:[[1604],256],126541:[[1606],256],126542:[[1587],256],126543:[[1593],256],126545:[[1589],256],126546:[[1602],256],126548:[[1588],256],126551:[[1582],256],126553:[[1590],256],126555:[[1594],256],126557:[[1722],256],126559:[[1647],256],126561:[[1576],256],126562:[[1580],256],126564:[[1607],256],126567:[[1581],256],126568:[[1591],256],126569:[[1610],256],126570:[[1603],256],126572:[[1605],256],126573:[[1606],256],126574:[[1587],256],126575:[[1593],256],126576:[[1601],256],126577:[[1589],256],126578:[[1602],256],126580:[[1588],256],126581:[[1578],256],126582:[[1579],256],126583:[[1582],256],126585:[[1590],256],126586:[[1592],256],126587:[[1594],256],126588:[[1646],256],126590:[[1697],256],126592:[[1575],256],126593:[[1576],256],126594:[[1580],256],126595:[[1583],256],126596:[[1607],256],126597:[[1608],256],126598:[[1586],256],126599:[[1581],256],126600:[[1591],256],126601:[[1610],256],126603:[[1604],256],126604:[[1605],256],126605:[[1606],256],126606:[[1587],256],126607:[[1593],256],126608:[[1601],256],126609:[[1589],256],126610:[[1602],256],126611:[[1585],256],126612:[[1588],256],126613:[[1578],256],126614:[[1579],256],126615:[[1582],256],126616:[[1584],256],126617:[[1590],256],126618:[[1592],256],126619:[[1594],256],126625:[[1576],256],126626:[[1580],256],126627:[[1583],256],126629:[[1608],256],126630:[[1586],256],126631:[[1581],256],126632:[[1591],256],126633:[[1610],256],126635:[[1604],256],126636:[[1605],256],126637:[[1606],256],126638:[[1587],256],126639:[[1593],256],126640:[[1601],256],126641:[[1589],256],126642:[[1602],256],126643:[[1585],256],126644:[[1588],256],126645:[[1578],256],126646:[[1579],256],126647:[[1582],256],126648:[[1584],256],126649:[[1590],256],126650:[[1592],256],126651:[[1594],256]},61696:{127232:[[48,46],256],127233:[[48,44],256],127234:[[49,44],256],127235:[[50,44],256],127236:[[51,44],256],127237:[[52,44],256],127238:[[53,44],256],127239:[[54,44],256],127240:[[55,44],256],127241:[[56,44],256],127242:[[57,44],256],127248:[[40,65,41],256],127249:[[40,66,41],256],127250:[[40,67,41],256],127251:[[40,68,41],256],127252:[[40,69,41],256],127253:[[40,70,41],256],127254:[[40,71,41],256],127255:[[40,72,41],256],127256:[[40,73,41],256],127257:[[40,74,41],256],127258:[[40,75,41],256],127259:[[40,76,41],256],127260:[[40,77,41],256],127261:[[40,78,41],256],127262:[[40,79,41],256],127263:[[40,80,41],256],127264:[[40,81,41],256],127265:[[40,82,41],256],127266:[[40,83,41],256],127267:[[40,84,41],256],127268:[[40,85,41],256],127269:[[40,86,41],256],127270:[[40,87,41],256],127271:[[40,88,41],256],127272:[[40,89,41],256],127273:[[40,90,41],256],127274:[[12308,83,12309],256],127275:[[67],256],127276:[[82],256],127277:[[67,68],256],127278:[[87,90],256],127280:[[65],256],127281:[[66],256],127282:[[67],256],127283:[[68],256],127284:[[69],256],127285:[[70],256],127286:[[71],256],127287:[[72],256],127288:[[73],256],127289:[[74],256],127290:[[75],256],127291:[[76],256],127292:[[77],256],127293:[[78],256],127294:[[79],256],127295:[[80],256],127296:[[81],256],127297:[[82],256],127298:[[83],256],127299:[[84],256],127300:[[85],256],127301:[[86],256],127302:[[87],256],127303:[[88],256],127304:[[89],256],127305:[[90],256],127306:[[72,86],256],127307:[[77,86],256],127308:[[83,68],256],127309:[[83,83],256],127310:[[80,80,86],256],127311:[[87,67],256],127338:[[77,67],256],127339:[[77,68],256],127376:[[68,74],256]},61952:{127488:[[12411,12363],256],127489:[[12467,12467],256],127490:[[12469],256],127504:[[25163],256],127505:[[23383],256],127506:[[21452],256],127507:[[12487],256],127508:[[20108],256],127509:[[22810],256],127510:[[35299],256],127511:[[22825],256],127512:[[20132],256],127513:[[26144],256],127514:[[28961],256],127515:[[26009],256],127516:[[21069],256],127517:[[24460],256],127518:[[20877],256],127519:[[26032],256],127520:[[21021],256],127521:[[32066],256],127522:[[29983],256],127523:[[36009],256],127524:[[22768],256],127525:[[21561],256],127526:[[28436],256],127527:[[25237],256],127528:[[25429],256],127529:[[19968],256],127530:[[19977],256],127531:[[36938],256],127532:[[24038],256],127533:[[20013],256],127534:[[21491],256],127535:[[25351],256],127536:[[36208],256],127537:[[25171],256],127538:[[31105],256],127539:[[31354],256],127540:[[21512],256],127541:[[28288],256],127542:[[26377],256],127543:[[26376],256],127544:[[30003],256],127545:[[21106],256],127546:[[21942],256],127552:[[12308,26412,12309],256],127553:[[12308,19977,12309],256],127554:[[12308,20108,12309],256],127555:[[12308,23433,12309],256],127556:[[12308,28857,12309],256],127557:[[12308,25171,12309],256],127558:[[12308,30423,12309],256],127559:[[12308,21213,12309],256],127560:[[12308,25943,12309],256],127568:[[24471],256],127569:[[21487],256]},63488:{194560:[[20029]],194561:[[20024]],194562:[[20033]],194563:[[131362]],194564:[[20320]],194565:[[20398]],194566:[[20411]],194567:[[20482]],194568:[[20602]],194569:[[20633]],194570:[[20711]],194571:[[20687]],194572:[[13470]],194573:[[132666]],194574:[[20813]],194575:[[20820]],194576:[[20836]],194577:[[20855]],194578:[[132380]],194579:[[13497]],194580:[[20839]],194581:[[20877]],194582:[[132427]],194583:[[20887]],194584:[[20900]],194585:[[20172]],194586:[[20908]],194587:[[20917]],194588:[[168415]],194589:[[20981]],194590:[[20995]],194591:[[13535]],194592:[[21051]],194593:[[21062]],194594:[[21106]],194595:[[21111]],194596:[[13589]],194597:[[21191]],194598:[[21193]],194599:[[21220]],194600:[[21242]],194601:[[21253]],194602:[[21254]],194603:[[21271]],194604:[[21321]],194605:[[21329]],194606:[[21338]],194607:[[21363]],194608:[[21373]],194609:[[21375]],194610:[[21375]],194611:[[21375]],194612:[[133676]],194613:[[28784]],194614:[[21450]],194615:[[21471]],194616:[[133987]],194617:[[21483]],194618:[[21489]],194619:[[21510]],194620:[[21662]],194621:[[21560]],194622:[[21576]],194623:[[21608]],194624:[[21666]],194625:[[21750]],194626:[[21776]],194627:[[21843]],194628:[[21859]],194629:[[21892]],194630:[[21892]],194631:[[21913]],194632:[[21931]],194633:[[21939]],194634:[[21954]],194635:[[22294]],194636:[[22022]],194637:[[22295]],194638:[[22097]],194639:[[22132]],194640:[[20999]],194641:[[22766]],194642:[[22478]],194643:[[22516]],194644:[[22541]],194645:[[22411]],194646:[[22578]],194647:[[22577]],194648:[[22700]],194649:[[136420]],194650:[[22770]],194651:[[22775]],194652:[[22790]],194653:[[22810]],194654:[[22818]],194655:[[22882]],194656:[[136872]],194657:[[136938]],194658:[[23020]],194659:[[23067]],194660:[[23079]],194661:[[23e3]],194662:[[23142]],194663:[[14062]],194664:[[14076]],194665:[[23304]],194666:[[23358]],194667:[[23358]],194668:[[137672]],194669:[[23491]],194670:[[23512]],194671:[[23527]],194672:[[23539]],194673:[[138008]],194674:[[23551]],194675:[[23558]],194676:[[24403]],194677:[[23586]],194678:[[14209]],194679:[[23648]],194680:[[23662]],194681:[[23744]],194682:[[23693]],194683:[[138724]],194684:[[23875]],194685:[[138726]],194686:[[23918]],194687:[[23915]],194688:[[23932]],194689:[[24033]],194690:[[24034]],194691:[[14383]],194692:[[24061]],194693:[[24104]],194694:[[24125]],194695:[[24169]],194696:[[14434]],194697:[[139651]],194698:[[14460]],194699:[[24240]],194700:[[24243]],194701:[[24246]],194702:[[24266]],194703:[[172946]],194704:[[24318]],194705:[[140081]],194706:[[140081]],194707:[[33281]],194708:[[24354]],194709:[[24354]],194710:[[14535]],194711:[[144056]],194712:[[156122]],194713:[[24418]],194714:[[24427]],194715:[[14563]],194716:[[24474]],194717:[[24525]],194718:[[24535]],194719:[[24569]],194720:[[24705]],194721:[[14650]],194722:[[14620]],194723:[[24724]],194724:[[141012]],194725:[[24775]],194726:[[24904]],194727:[[24908]],194728:[[24910]],194729:[[24908]],194730:[[24954]],194731:[[24974]],194732:[[25010]],194733:[[24996]],194734:[[25007]],194735:[[25054]],194736:[[25074]],194737:[[25078]],194738:[[25104]],194739:[[25115]],194740:[[25181]],194741:[[25265]],194742:[[25300]],194743:[[25424]],194744:[[142092]],194745:[[25405]],194746:[[25340]],194747:[[25448]],194748:[[25475]],194749:[[25572]],194750:[[142321]],194751:[[25634]],194752:[[25541]],194753:[[25513]],194754:[[14894]],194755:[[25705]],194756:[[25726]],194757:[[25757]],194758:[[25719]],194759:[[14956]],194760:[[25935]],194761:[[25964]],194762:[[143370]],194763:[[26083]],194764:[[26360]],194765:[[26185]],194766:[[15129]],194767:[[26257]],194768:[[15112]],194769:[[15076]],194770:[[20882]],194771:[[20885]],194772:[[26368]],194773:[[26268]],194774:[[32941]],194775:[[17369]],194776:[[26391]],194777:[[26395]],194778:[[26401]],194779:[[26462]],194780:[[26451]],194781:[[144323]],194782:[[15177]],194783:[[26618]],194784:[[26501]],194785:[[26706]],194786:[[26757]],194787:[[144493]],194788:[[26766]],194789:[[26655]],194790:[[26900]],194791:[[15261]],194792:[[26946]],194793:[[27043]],194794:[[27114]],194795:[[27304]],194796:[[145059]],194797:[[27355]],194798:[[15384]],194799:[[27425]],194800:[[145575]],194801:[[27476]],194802:[[15438]],194803:[[27506]],194804:[[27551]],194805:[[27578]],194806:[[27579]],194807:[[146061]],194808:[[138507]],194809:[[146170]],194810:[[27726]],194811:[[146620]],194812:[[27839]],194813:[[27853]],194814:[[27751]],194815:[[27926]]},63744:{63744:[[35912]],63745:[[26356]],63746:[[36554]],63747:[[36040]],63748:[[28369]],63749:[[20018]],63750:[[21477]],63751:[[40860]],63752:[[40860]],63753:[[22865]],63754:[[37329]],63755:[[21895]],63756:[[22856]],63757:[[25078]],63758:[[30313]],63759:[[32645]],63760:[[34367]],63761:[[34746]],63762:[[35064]],63763:[[37007]],63764:[[27138]],63765:[[27931]],63766:[[28889]],63767:[[29662]],63768:[[33853]],63769:[[37226]],63770:[[39409]],63771:[[20098]],63772:[[21365]],63773:[[27396]],63774:[[29211]],63775:[[34349]],63776:[[40478]],63777:[[23888]],63778:[[28651]],63779:[[34253]],63780:[[35172]],63781:[[25289]],63782:[[33240]],63783:[[34847]],63784:[[24266]],63785:[[26391]],63786:[[28010]],63787:[[29436]],63788:[[37070]],63789:[[20358]],63790:[[20919]],63791:[[21214]],63792:[[25796]],63793:[[27347]],63794:[[29200]],63795:[[30439]],63796:[[32769]],63797:[[34310]],63798:[[34396]],63799:[[36335]],63800:[[38706]],63801:[[39791]],63802:[[40442]],63803:[[30860]],63804:[[31103]],63805:[[32160]],63806:[[33737]],63807:[[37636]],63808:[[40575]],63809:[[35542]],63810:[[22751]],63811:[[24324]],63812:[[31840]],63813:[[32894]],63814:[[29282]],63815:[[30922]],63816:[[36034]],63817:[[38647]],63818:[[22744]],63819:[[23650]],63820:[[27155]],63821:[[28122]],63822:[[28431]],63823:[[32047]],63824:[[32311]],63825:[[38475]],63826:[[21202]],63827:[[32907]],63828:[[20956]],63829:[[20940]],63830:[[31260]],63831:[[32190]],63832:[[33777]],63833:[[38517]],63834:[[35712]],63835:[[25295]],63836:[[27138]],63837:[[35582]],63838:[[20025]],63839:[[23527]],63840:[[24594]],63841:[[29575]],63842:[[30064]],63843:[[21271]],63844:[[30971]],63845:[[20415]],63846:[[24489]],63847:[[19981]],63848:[[27852]],63849:[[25976]],63850:[[32034]],63851:[[21443]],63852:[[22622]],63853:[[30465]],63854:[[33865]],63855:[[35498]],63856:[[27578]],63857:[[36784]],63858:[[27784]],63859:[[25342]],63860:[[33509]],63861:[[25504]],63862:[[30053]],63863:[[20142]],63864:[[20841]],63865:[[20937]],63866:[[26753]],63867:[[31975]],63868:[[33391]],63869:[[35538]],63870:[[37327]],63871:[[21237]],63872:[[21570]],63873:[[22899]],63874:[[24300]],63875:[[26053]],63876:[[28670]],63877:[[31018]],63878:[[38317]],63879:[[39530]],63880:[[40599]],63881:[[40654]],63882:[[21147]],63883:[[26310]],63884:[[27511]],63885:[[36706]],63886:[[24180]],63887:[[24976]],63888:[[25088]],63889:[[25754]],63890:[[28451]],63891:[[29001]],63892:[[29833]],63893:[[31178]],63894:[[32244]],63895:[[32879]],63896:[[36646]],63897:[[34030]],63898:[[36899]],63899:[[37706]],63900:[[21015]],63901:[[21155]],63902:[[21693]],63903:[[28872]],63904:[[35010]],63905:[[35498]],63906:[[24265]],63907:[[24565]],63908:[[25467]],63909:[[27566]],63910:[[31806]],63911:[[29557]],63912:[[20196]],63913:[[22265]],63914:[[23527]],63915:[[23994]],63916:[[24604]],63917:[[29618]],63918:[[29801]],63919:[[32666]],63920:[[32838]],63921:[[37428]],63922:[[38646]],63923:[[38728]],63924:[[38936]],63925:[[20363]],63926:[[31150]],63927:[[37300]],63928:[[38584]],63929:[[24801]],63930:[[20102]],63931:[[20698]],63932:[[23534]],63933:[[23615]],63934:[[26009]],63935:[[27138]],63936:[[29134]],63937:[[30274]],63938:[[34044]],63939:[[36988]],63940:[[40845]],63941:[[26248]],63942:[[38446]],63943:[[21129]],63944:[[26491]],63945:[[26611]],63946:[[27969]],63947:[[28316]],63948:[[29705]],63949:[[30041]],63950:[[30827]],63951:[[32016]],63952:[[39006]],63953:[[20845]],63954:[[25134]],63955:[[38520]],63956:[[20523]],63957:[[23833]],63958:[[28138]],63959:[[36650]],63960:[[24459]],63961:[[24900]],63962:[[26647]],63963:[[29575]],63964:[[38534]],63965:[[21033]],63966:[[21519]],63967:[[23653]],63968:[[26131]],63969:[[26446]],63970:[[26792]],63971:[[27877]],63972:[[29702]],63973:[[30178]],63974:[[32633]],63975:[[35023]],63976:[[35041]],63977:[[37324]],63978:[[38626]],63979:[[21311]],63980:[[28346]],63981:[[21533]],63982:[[29136]],63983:[[29848]],63984:[[34298]],63985:[[38563]],63986:[[40023]],63987:[[40607]],63988:[[26519]],63989:[[28107]],63990:[[33256]],63991:[[31435]],63992:[[31520]],63993:[[31890]],63994:[[29376]],63995:[[28825]],63996:[[35672]],63997:[[20160]],63998:[[33590]],63999:[[21050]],194816:[[27966]],194817:[[28023]],194818:[[27969]],194819:[[28009]],194820:[[28024]],194821:[[28037]],194822:[[146718]],194823:[[27956]],194824:[[28207]],194825:[[28270]],194826:[[15667]],194827:[[28363]],194828:[[28359]],194829:[[147153]],194830:[[28153]],194831:[[28526]],194832:[[147294]],194833:[[147342]],194834:[[28614]],194835:[[28729]],194836:[[28702]],194837:[[28699]],194838:[[15766]],194839:[[28746]],194840:[[28797]],194841:[[28791]],194842:[[28845]],194843:[[132389]],194844:[[28997]],194845:[[148067]],194846:[[29084]],194847:[[148395]],194848:[[29224]],194849:[[29237]],194850:[[29264]],194851:[[149e3]],194852:[[29312]],194853:[[29333]],194854:[[149301]],194855:[[149524]],194856:[[29562]],194857:[[29579]],194858:[[16044]],194859:[[29605]],194860:[[16056]],194861:[[16056]],194862:[[29767]],194863:[[29788]],194864:[[29809]],194865:[[29829]],194866:[[29898]],194867:[[16155]],194868:[[29988]],194869:[[150582]],194870:[[30014]],194871:[[150674]],194872:[[30064]],194873:[[139679]],194874:[[30224]],194875:[[151457]],194876:[[151480]],194877:[[151620]],194878:[[16380]],194879:[[16392]],194880:[[30452]],194881:[[151795]],194882:[[151794]],194883:[[151833]],194884:[[151859]],194885:[[30494]],194886:[[30495]],194887:[[30495]],194888:[[30538]],194889:[[16441]],194890:[[30603]],194891:[[16454]],194892:[[16534]],194893:[[152605]],194894:[[30798]],194895:[[30860]],194896:[[30924]],194897:[[16611]],194898:[[153126]],194899:[[31062]],194900:[[153242]],194901:[[153285]],194902:[[31119]],194903:[[31211]],194904:[[16687]],194905:[[31296]],194906:[[31306]],194907:[[31311]],194908:[[153980]],194909:[[154279]],194910:[[154279]],194911:[[31470]],194912:[[16898]],194913:[[154539]],194914:[[31686]],194915:[[31689]],194916:[[16935]],194917:[[154752]],194918:[[31954]],194919:[[17056]],194920:[[31976]],194921:[[31971]],194922:[[32e3]],194923:[[155526]],194924:[[32099]],194925:[[17153]],194926:[[32199]],194927:[[32258]],194928:[[32325]],194929:[[17204]],194930:[[156200]],194931:[[156231]],194932:[[17241]],194933:[[156377]],194934:[[32634]],194935:[[156478]],194936:[[32661]],194937:[[32762]],194938:[[32773]],194939:[[156890]],194940:[[156963]],194941:[[32864]],194942:[[157096]],194943:[[32880]],194944:[[144223]],194945:[[17365]],194946:[[32946]],194947:[[33027]],194948:[[17419]],194949:[[33086]],194950:[[23221]],194951:[[157607]],194952:[[157621]],194953:[[144275]],194954:[[144284]],194955:[[33281]],194956:[[33284]],194957:[[36766]],194958:[[17515]],194959:[[33425]],194960:[[33419]],194961:[[33437]],194962:[[21171]],194963:[[33457]],194964:[[33459]],194965:[[33469]],194966:[[33510]],194967:[[158524]],194968:[[33509]],194969:[[33565]],194970:[[33635]],194971:[[33709]],194972:[[33571]],194973:[[33725]],194974:[[33767]],194975:[[33879]],194976:[[33619]],194977:[[33738]],194978:[[33740]],194979:[[33756]],194980:[[158774]],194981:[[159083]],194982:[[158933]],194983:[[17707]],194984:[[34033]],194985:[[34035]],194986:[[34070]],194987:[[160714]],194988:[[34148]],194989:[[159532]],194990:[[17757]],194991:[[17761]],194992:[[159665]],194993:[[159954]],194994:[[17771]],194995:[[34384]],194996:[[34396]],194997:[[34407]],194998:[[34409]],194999:[[34473]],195
70123000:[[34440]],195001:[[34574]],195002:[[34530]],195003:[[34681]],195004:[[34600]],195005:[[34667]],195006:[[34694]],195007:[[17879]],195008:[[34785]],195009:[[34817]],195010:[[17913]],195011:[[34912]],195012:[[34915]],195013:[[161383]],195014:[[35031]],195015:[[35038]],195016:[[17973]],195017:[[35066]],195018:[[13499]],195019:[[161966]],195020:[[162150]],195021:[[18110]],195022:[[18119]],195023:[[35488]],195024:[[35565]],195025:[[35722]],195026:[[35925]],195027:[[162984]],195028:[[36011]],195029:[[36033]],195030:[[36123]],195031:[[36215]],195032:[[163631]],195033:[[133124]],195034:[[36299]],195035:[[36284]],195036:[[36336]],195037:[[133342]],195038:[[36564]],195039:[[36664]],195040:[[165330]],195041:[[165357]],195042:[[37012]],195043:[[37105]],195044:[[37137]],195045:[[165678]],195046:[[37147]],195047:[[37432]],195048:[[37591]],195049:[[37592]],195050:[[37500]],195051:[[37881]],195052:[[37909]],195053:[[166906]],195054:[[38283]],195055:[[18837]],195056:[[38327]],195057:[[167287]],195058:[[18918]],195059:[[38595]],195060:[[23986]],195061:[[38691]],195062:[[168261]],195063:[[168474]],195064:[[19054]],195065:[[19062]],195066:[[38880]],195067:[[168970]],195068:[[19122]],195069:[[169110]],195070:[[38923]],195071:[[38923]]},64000:{64000
vendor: 27,897 bytes, line 70123
70123:[[20999]],64001:[[24230]],64002:[[25299]],64003:[[31958]],64004:[[23429]],64005:[[27934]],64006:[[26292]],64007:[[36667]],64008:[[34892]],64009:[[38477]],64010:[[35211]],64011:[[24275]],64012:[[20800]],64013:[[21952]],64016:[[22618]],64018:[[26228]],64021:[[20958]],64022:[[29482]],64023:[[30410]],64024:[[31036]],64025:[[31070]],64026:[[31077]],64027:[[31119]],64028:[[38742]],64029:[[31934]],64030:[[32701]],64032:[[34322]],64034:[[35576]],64037:[[36920]],64038:[[37117]],64042:[[39151]],64043:[[39164]],64044:[[39208]],64045:[[40372]],64046:[[37086]],64047:[[38583]],64048:[[20398]],64049:[[20711]],64050:[[20813]],64051:[[21193]],64052:[[21220]],64053:[[21329]],64054:[[21917]],64055:[[22022]],64056:[[22120]],64057:[[22592]],64058:[[22696]],64059:[[23652]],64060:[[23662]],64061:[[24724]],64062:[[24936]],64063:[[24974]],64064:[[25074]],64065:[[25935]],64066:[[26082]],64067:[[26257]],64068:[[26757]],64069:[[28023]],64070:[[28186]],64071:[[28450]],64072:[[29038]],64073:[[29227]],64074:[[29730]],64075:[[30865]],64076:[[31038]],64077:[[31049]],64078:[[31048]],64079:[[31056]],64080:[[31062]],64081:[[31069]],64082:[[31117]],64083:[[31118]],64084:[[31296]],64085:[[31361]],64086:[[31680]],64087:[[32244]],64088:[[32265]],64089:[[32321]],64090:[[32626]],64091:[[32773]],64092:[[33261]],64093:[[33401]],64094:[[33401]],64095:[[33879]],64096:[[35088]],64097:[[35222]],64098:[[35585]],64099:[[35641]],64100:[[36051]],64101:[[36104]],64102:[[36790]],64103:[[36920]],64104:[[38627]],64105:[[38911]],64106:[[38971]],64107:[[24693]],64108:[[148206]],64109:[[33304]],64112:[[20006]],64113:[[20917]],64114:[[20840]],64115:[[20352]],64116:[[20805]],64117:[[20864]],64118:[[21191]],64119:[[21242]],64120:[[21917]],64121:[[21845]],64122:[[21913]],64123:[[21986]],64124:[[22618]],64125:[[22707]],64126:[[22852]],64127:[[22868]],64128:[[23138]],64129:[[23336]],64130:[[24274]],64131:[[24281]],64132:[[24425]],64133:[[24493]],64134:[[24792]],64135:[[24910]],64136:[[24840]],64137:[[24974]],64138:[[24928]],64139:[[25074]],64140:[[25140]],64141:[[25540]],64142:[[25628]],64143:[[25682]],64144:[[25942]],64145:[[26228]],64146:[[26391]],64147:[[26395]],64148:[[26454]],64149:[[27513]],64150:[[27578]],64151:[[27969]],64152:[[28379]],64153:[[28363]],64154:[[28450]],64155:[[28702]],64156:[[29038]],64157:[[30631]],64158:[[29237]],64159:[[29359]],64160:[[29482]],64161:[[29809]],64162:[[29958]],64163:[[30011]],64164:[[30237]],64165:[[30239]],64166:[[30410]],64167:[[30427]],64168:[[30452]],64169:[[30538]],64170:[[30528]],64171:[[30924]],64172:[[31409]],64173:[[31680]],64174:[[31867]],64175:[[32091]],64176:[[32244]],64177:[[32574]],64178:[[32773]],64179:[[33618]],64180:[[33775]],64181:[[34681]],64182:[[35137]],64183:[[35206]],64184:[[35222]],64185:[[35519]],64186:[[35576]],64187:[[35531]],64188:[[35585]],64189:[[35582]],64190:[[35565]],64191:[[35641]],64192:[[35722]],64193:[[36104]],64194:[[36664]],64195:[[36978]],64196:[[37273]],64197:[[37494]],64198:[[38524]],64199:[[38627]],64200:[[38742]],64201:[[38875]],64202:[[38911]],64203:[[38923]],64204:[[38971]],64205:[[39698]],64206:[[40860]],64207:[[141386]],64208:[[141380]],64209:[[144341]],64210:[[15261]],64211:[[16408]],64212:[[16441]],64213:[[152137]],64214:[[154832]],64215:[[163539]],64216:[[40771]],64217:[[40846]],195072:[[38953]],195073:[[169398]],195074:[[39138]],195075:[[19251]],195076:[[39209]],195077:[[39335]],195078:[[39362]],195079:[[39422]],195080:[[19406]],195081:[[170800]],195082:[[39698]],195083:[[4e4]],195084:[[40189]],195085:[[19662]],195086:[[19693]],195087:[[40295]],195088:[[172238]],195089:[[19704]],195090:[[172293]],195091:[[172558]],195092:[[172689]],195093:[[40635]],195094:[[19798]],195095:[[40697]],195096:[[40702]],195097:[[40709]],195098:[[40719]],195099:[[40726]],195100:[[40763]],195101:[[173568]]},64256:{64256:[[102,102],256],64257:[[102,105],256],64258:[[102,108],256],64259:[[102,102,105],256],64260:[[102,102,108],256],64261:[[383,116],256],64262:[[115,116],256],64275:[[1396,1398],256],64276:[[1396,1381],256],64277:[[1396,1387],256],64278:[[1406,1398],256],64279:[[1396,1389],256],64285:[[1497,1460],512],64286:[,26],64287:[[1522,1463],512],64288:[[1506],256],64289:[[1488],256],64290:[[1491],256],64291:[[1492],256],64292:[[1499],256],64293:[[1500],256],64294:[[1501],256],64295:[[1512],256],64296:[[1514],256],64297:[[43],256],64298:[[1513,1473],512],64299:[[1513,1474],512],64300:[[64329,1473],512],64301:[[64329,1474],512],64302:[[1488,1463],512],64303:[[1488,1464],512],64304:[[1488,1468],512],64305:[[1489,1468],512],64306:[[1490,1468],512],64307:[[1491,1468],512],64308:[[1492,1468],512],64309:[[1493,1468],512],64310:[[1494,1468],512],64312:[[1496,1468],512],64313:[[1497,1468],512],64314:[[1498,1468],512],64315:[[1499,1468],512],64316:[[1500,1468],512],64318:[[1502,1468],512],64320:[[1504,1468],512],64321:[[1505,1468],512],64323:[[1507,1468],512],64324:[[1508,1468],512],64326:[[1510,1468],512],64327:[[1511,1468],512],64328:[[1512,1468],512],64329:[[1513,1468],512],64330:[[1514,1468],512],64331:[[1493,1465],512],64332:[[1489,1471],512],64333:[[1499,1471],512],64334:[[1508,1471],512],64335:[[1488,1500],256],64336:[[1649],256],64337:[[1649],256],64338:[[1659],256],64339:[[1659],256],64340:[[1659],256],64341:[[1659],256],64342:[[1662],256],64343:[[1662],256],64344:[[1662],256],64345:[[1662],256],64346:[[1664],256],64347:[[1664],256],64348:[[1664],256],64349:[[1664],256],64350:[[1658],256],64351:[[1658],256],64352:[[1658],256],64353:[[1658],256],64354:[[1663],256],64355:[[1663],256],64356:[[1663],256],64357:[[1663],256],64358:[[1657],256],64359:[[1657],256],64360:[[1657],256],64361:[[1657],256],64362:[[1700],256],64363:[[1700],256],64364:[[1700],256],64365:[[1700],256],64366:[[1702],256],64367:[[1702],256],64368:[[1702],256],64369:[[1702],256],64370:[[1668],256],64371:[[1668],256],64372:[[1668],256],64373:[[1668],256],64374:[[1667],256],64375:[[1667],256],64376:[[1667],256],64377:[[1667],256],64378:[[1670],256],64379:[[1670],256],64380:[[1670],256],64381:[[1670],256],64382:[[1671],256],64383:[[1671],256],64384:[[1671],256],64385:[[1671],256],64386:[[1677],256],64387:[[1677],256],64388:[[1676],256],64389:[[1676],256],64390:[[1678],256],64391:[[1678],256],64392:[[1672],256],64393:[[1672],256],64394:[[1688],256],64395:[[1688],256],64396:[[1681],256],64397:[[1681],256],64398:[[1705],256],64399:[[1705],256],64400:[[1705],256],64401:[[1705],256],64402:[[1711],256],64403:[[1711],256],64404:[[1711],256],64405:[[1711],256],64406:[[1715],256],64407:[[1715],256],64408:[[1715],256],64409:[[1715],256],64410:[[1713],256],64411:[[1713],256],64412:[[1713],256],64413:[[1713],256],64414:[[1722],256],64415:[[1722],256],64416:[[1723],256],64417:[[1723],256],64418:[[1723],256],64419:[[1723],256],64420:[[1728],256],64421:[[1728],256],64422:[[1729],256],64423:[[1729],256],64424:[[1729],256],64425:[[1729],256],64426:[[1726],256],64427:[[1726],256],64428:[[1726],256],64429:[[1726],256],64430:[[1746],256],64431:[[1746],256],64432:[[1747],256],64433:[[1747],256],64467:[[1709],256],64468:[[1709],256],64469:[[1709],256],64470:[[1709],256],64471:[[1735],256],64472:[[1735],256],64473:[[1734],256],64474:[[1734],256],64475:[[1736],256],64476:[[1736],256],64477:[[1655],256],64478:[[1739],256],64479:[[1739],256],64480:[[1733],256],64481:[[1733],256],64482:[[1737],256],64483:[[1737],256],64484:[[1744],256],64485:[[1744],256],64486:[[1744],256],64487:[[1744],256],64488:[[1609],256],64489:[[1609],256],64490:[[1574,1575],256],64491:[[1574,1575],256],64492:[[1574,1749],256],64493:[[1574,1749],256],64494:[[1574,1608],256],64495:[[1574,1608],256],64496:[[1574,1735],256],64497:[[1574,1735],256],64498:[[1574,1734],256],64499:[[1574,1734],256],64500:[[1574,1736],256],64501:[[1574,1736],256],64502:[[1574,1744],256],64503:[[1574,1744],256],64504:[[1574,1744],256],64505:[[1574,1609],256],64506:[[1574,1609],256],64507:[[1574,1609],256],64508:[[1740],256],64509:[[1740],256],64510:[[1740],256],64511:[[1740],256]},64512:{64512:[[1574,1580],256],64513:[[1574,1581],256],64514:[[1574,1605],256],64515:[[1574,1609],256],64516:[[1574,1610],256],64517:[[1576,1580],256],64518:[[1576,1581],256],64519:[[1576,1582],256],64520:[[1576,1605],256],64521:[[1576,1609],256],64522:[[1576,1610],256],64523:[[1578,1580],256],64524:[[1578,1581],256],64525:[[1578,1582],256],64526:[[1578,1605],256],64527:[[1578,1609],256],64528:[[1578,1610],256],64529:[[1579,1580],256],64530:[[1579,1605],256],64531:[[1579,1609],256],64532:[[1579,1610],256],64533:[[1580,1581],256],64534:[[1580,1605],256],64535:[[1581,1580],256],64536:[[1581,1605],256],64537:[[1582,1580],256],64538:[[1582,1581],256],64539:[[1582,1605],256],64540:[[1587,1580],256],64541:[[1587,1581],256],64542:[[1587,1582],256],64543:[[1587,1605],256],64544:[[1589,1581],256],64545:[[1589,1605],256],64546:[[1590,1580],256],64547:[[1590,1581],256],64548:[[1590,1582],256],64549:[[1590,1605],256],64550:[[1591,1581],256],64551:[[1591,1605],256],64552:[[1592,1605],256],64553:[[1593,1580],256],64554:[[1593,1605],256],64555:[[1594,1580],256],64556:[[1594,1605],256],64557:[[1601,1580],256],64558:[[1601,1581],256],64559:[[1601,1582],256],64560:[[1601,1605],256],64561:[[1601,1609],256],64562:[[1601,1610],256],64563:[[1602,1581],256],64564:[[1602,1605],256],64565:[[1602,1609],256],64566:[[1602,1610],256],64567:[[1603,1575],256],64568:[[1603,1580],256],64569:[[1603,1581],256],64570:[[1603,1582],256],64571:[[1603,1604],256],64572:[[1603,1605],256],64573:[[1603,1609],256],64574:[[1603,1610],256],64575:[[1604,1580],256],64576:[[1604,1581],256],64577:[[1604,1582],256],64578:[[1604,1605],256],64579:[[1604,1609],256],64580:[[1604,1610],256],64581:[[1605,1580],256],64582:[[1605,1581],256],64583:[[1605,1582],256],64584:[[1605,1605],256],64585:[[1605,1609],256],64586:[[1605,1610],256],64587:[[1606,1580],256],64588:[[1606,1581],256],64589:[[1606,1582],256],64590:[[1606,1605],256],64591:[[1606,1609],256],64592:[[1606,1610],256],64593:[[1607,1580],256],64594:[[1607,1605],256],64595:[[1607,1609],256],64596:[[1607,1610],256],64597:[[1610,1580],256],64598:[[1610,1581],256],64599:[[1610,1582],256],64600:[[1610,1605],256],64601:[[1610,1609],256],64602:[[1610,1610],256],64603:[[1584,1648],256],64604:[[1585,1648],256],64605:[[1609,1648],256],64606:[[32,1612,1617],256],64607:[[32,1613,1617],256],64608:[[32,1614,1617],256],64609:[[32,1615,1617],256],64610:[[32,1616,1617],256],64611:[[32,1617,1648],256],64612:[[1574,1585],256],64613:[[1574,1586],256],64614:[[1574,1605],256],64615:[[1574,1606],256],64616:[[1574,1609],256],64617:[[1574,1610],256],64618:[[1576,1585],256],64619:[[1576,1586],256],64620:[[1576,1605],256],64621:[[1576,1606],256],64622:[[1576,1609],256],64623:[[1576,1610],256],64624:[[1578,1585],256],64625:[[1578,1586],256],64626:[[1578,1605],256],64627:[[1578,1606],256],64628:[[1578,1609],256],64629:[[1578,1610],256],64630:[[1579,1585],256],64631:[[1579,1586],256],64632:[[1579,1605],256],64633:[[1579,1606],256],64634:[[1579,1609],256],64635:[[1579,1610],256],64636:[[1601,1609],256],64637:[[1601,1610],256],64638:[[1602,1609],256],64639:[[1602,1610],256],64640:[[1603,1575],256],64641:[[1603,1604],256],64642:[[1603,1605],256],64643:[[1603,1609],256],64644:[[1603,1610],256],64645:[[1604,1605],256],64646:[[1604,1609],256],64647:[[1604,1610],256],64648:[[1605,1575],256],64649:[[1605,1605],256],64650:[[1606,1585],256],64651:[[1606,1586],256],64652:[[1606,1605],256],64653:[[1606,1606],256],64654:[[1606,1609],256],64655:[[1606,1610],256],64656:[[1609,1648],256],64657:[[1610,1585],256],64658:[[1610,1586],256],64659:[[1610,1605],256],64660:[[1610,1606],256],64661:[[1610,1609],256],64662:[[1610,1610],256],64663:[[1574,1580],256],64664:[[1574,1581],256],64665:[[1574,1582],256],64666:[[1574,1605],256],64667:[[1574,1607],256],64668:[[1576,1580],256],64669:[[1576,1581],256],64670:[[1576,1582],256],64671:[[1576,1605],256],64672:[[1576,1607],256],64673:[[1578,1580],256],64674:[[1578,1581],256],64675:[[1578,1582],256],64676:[[1578,1605],256],64677:[[1578,1607],256],64678:[[1579,1605],256],64679:[[1580,1581],256],64680:[[1580,1605],256],64681:[[1581,1580],256],64682:[[1581,1605],256],64683:[[1582,1580],256],64684:[[1582,1605],256],64685:[[1587,1580],256],64686:[[1587,1581],256],64687:[[1587,1582],256],64688:[[1587,1605],256],64689:[[1589,1581],256],64690:[[1589,1582],256],64691:[[1589,1605],256],64692:[[1590,1580],256],64693:[[1590,1581],256],64694:[[1590,1582],256],64695:[[1590,1605],256],64696:[[1591,1581],256],64697:[[1592,1605],256],64698:[[1593,1580],256],64699:[[1593,1605],256],64700:[[1594,1580],256],64701:[[1594,1605],256],64702:[[1601,1580],256],64703:[[1601,1581],256],64704:[[1601,1582],256],64705:[[1601,1605],256],64706:[[1602,1581],256],64707:[[1602,1605],256],64708:[[1603,1580],256],64709:[[1603,1581],256],64710:[[1603,1582],256],64711:[[1603,1604],256],64712:[[1603,1605],256],64713:[[1604,1580],256],64714:[[1604,1581],256],64715:[[1604,1582],256],64716:[[1604,1605],256],64717:[[1604,1607],256],64718:[[1605,1580],256],64719:[[1605,1581],256],64720:[[1605,1582],256],64721:[[1605,1605],256],64722:[[1606,1580],256],64723:[[1606,1581],256],64724:[[1606,1582],256],64725:[[1606,1605],256],64726:[[1606,1607],256],64727:[[1607,1580],256],64728:[[1607,1605],256],64729:[[1607,1648],256],64730:[[1610,1580],256],64731:[[1610,1581],256],64732:[[1610,1582],256],64733:[[1610,1605],256],64734:[[1610,1607],256],64735:[[1574,1605],256],64736:[[1574,1607],256],64737:[[1576,1605],256],64738:[[1576,1607],256],64739:[[1578,1605],256],64740:[[1578,1607],256],64741:[[1579,1605],256],64742:[[1579,1607],256],64743:[[1587,1605],256],64744:[[1587,1607],256],64745:[[1588,1605],256],64746:[[1588,1607],256],64747:[[1603,1604],256],64748:[[1603,1605],256],64749:[[1604,1605],256],64750:[[1606,1605],256],64751:[[1606,1607],256],64752:[[1610,1605],256],64753:[[1610,1607],256],64754:[[1600,1614,1617],256],64755:[[1600,1615,1617],256],64756:[[1600,1616,1617],256],64757:[[1591,1609],256],64758:[[1591,1610],256],64759:[[1593,1609],256],64760:[[1593,1610],256],64761:[[1594,1609],256],64762:[[1594,1610],256],64763:[[1587,1609],256],64764:[[1587,1610],256],64765:[[1588,1609],256],64766:[[1588,1610],256],64767:[[1581,1609],256]},64768:{64768:[[1581,1610],256],64769:[[1580,1609],256],64770:[[1580,1610],256],64771:[[1582,1609],256],64772:[[1582,1610],256],64773:[[1589,1609],256],64774:[[1589,1610],256],64775:[[1590,1609],256],64776:[[1590,1610],256],64777:[[1588,1580],256],64778:[[1588,1581],256],64779:[[1588,1582],256],64780:[[1588,1605],256],64781:[[1588,1585],256],64782:[[1587,1585],256],64783:[[1589,1585],256],64784:[[1590,1585],256],64785:[[1591,1609],256],64786:[[1591,1610],256],64787:[[1593,1609],256],64788:[[1593,1610],256],64789:[[1594,1609],256],64790:[[1594,1610],256],64791:[[1587,1609],256],64792:[[1587,1610],256],64793:[[1588,1609],256],64794:[[1588,1610],256],64795:[[1581,1609],256],64796:[[1581,1610],256],64797:[[1580,1609],256],64798:[[1580,1610],256],64799:[[1582,1609],256],64800:[[1582,1610],256],64801:[[1589,1609],256],64802:[[1589,1610],256],64803:[[1590,1609],256],64804:[[1590,1610],256],64805:[[1588,1580],256],64806:[[1588,1581],256],64807:[[1588,1582],256],64808:[[1588,1605],256],64809:[[1588,1585],256],64810:[[1587,1585],256],64811:[[1589,1585],256],64812:[[1590,1585],256],64813:[[1588,1580],256],64814:[[1588,1581],256],64815:[[1588,1582],256],64816:[[1588,1605],256],64817:[[1587,1607],256],64818:[[1588,1607],256],64819:[[1591,1605],256],64820:[[1587,1580],256],64821:[[1587,1581],256],64822:[[1587,1582],256],64823:[[1588,1580],256],64824:[[1588,1581],256],64825:[[1588,1582],256],64826:[[1591,1605],256],64827:[[1592,1605],256],64828:[[1575,1611],256],64829:[[1575,1611],256],64848:[[1578,1580,1605],256],64849:[[1578,1581,1580],256],64850:[[1578,1581,1580],256],64851:[[1578,1581,1605],256],64852:[[1578,1582,1605],256],64853:[[1578,1605,1580],256],64854:[[1578,1605,1581],256],64855:[[1578,1605,1582],256],64856:[[1580,1605,1581],256],64857:[[1580,1605,1581],256],64858:[[1581,1605,1610],256],64859:[[1581,1605,1609],256],64860:[[1587,1581,1580],256],64861:[[1587,1580,1581],256],64862:[[1587,1580,1609],256],64863:[[1587,1605,1581],256],64864:[[1587,1605,1581],256],64865:[[1587,1605,1580],256],64866:[[1587,1605,1605],256],64867:[[1587,1605,1605],256],64868:[[1589,1581,1581],256],64869:[[1589,1581,1581],256],64870:[[1589,1605,1605],256],64871:[[1588,1581,1605],256],64872:[[1588,1581,1605],256],64873:[[1588,1580,1610],256],64874:[[1588,1605,1582],256],64875:[[1588,1605,1582],256],64876:[[1588,1605,1605],256],64877:[[1588,1605,1605],256],64878:[[1590,1581,1609],256],64879:[[1590,1582,1605],256],64880:[[1590,1582,1605],256],64881:[[1591,1605,1581],256],64882:[[1591,1605,1581],256],64883:[[1591,1605,1605],256],64884:[[1591,1605,1610],256],64885:[[1593,1580,1605],256],64886:[[1593,1605,1605],256],64887:[[1593,1605,1605],256],64888:[[1593,1605,1609],256],64889:[[1594,1605,1605],256],64890:[[1594,1605,1610],256],64891:[[1594,1605,1609],256],64892:[[1601,1582,1605],256],64893:[[1601,1582,1605],256],64894:[[1602,1605,1581],256],64895:[[1602,1605,1605],256],64896:[[1604,1581,1605],256],64897:[[1604,1581,1610],256],64898:[[1604,1581,1609],256],64899:[[1604,1580,1580],256],64900:[[1604,1580,1580],256],64901:[[1604,1582,1605],256],64902:[[1604,1582,1605],256],64903:[[1604,1605,1581],256],64904:[[1604,1605,1581],256],64905:[[1605,1581,1580],256],64906:[[1605,1581,1605],256],64907:[[1605,1581,1610],256],64908:[[1605,1580,1581],256],64909:[[1605,1580,1605],256],64910:[[1605,1582,1580],256],64911:[[1605,1582,1605],256],64914:[[1605,1580,1582],256],64915:[[1607,1605,1580],256],64916:[[1607,1605,1605],256],64917:[[1606,1581,1605],256],64918:[[1606,1581,1609],256],64919:[[1606,1580,1605],256],64920:[[1606,1580,1605],256],64921:[[1606,1580,1609],256],64922:[[1606,1605,1610],256],64923:[[1606,1605,1609],256],64924:[[1610,1605,1605],256],64925:[[1610,1605,1605],256],64926:[[1576,1582,1610],256],64927:[[1578,1580,1610],256],64928:[[1578,1580,1609],256],64929:[[1578,1582,1610],256],64930:[[1578,1582,1609],256],64931:[[1578,1605,1610],256],64932:[[1578,1605,1609],256],64933:[[1580,1605,1610],256],64934:[[1580,1581,1609],256],64935:[[1580,1605,1609],256],64936:[[1587,1582,1609],256],64937:[[1589,1581,1610],256],64938:[[1588,1581,1610],256],64939:[[1590,1581,1610],256],64940:[[1604,1580,1610],256],64941:[[1604,1605,1610],256],64942:[[1610,1581,1610],256],64943:[[1610,1580,1610],256],64944:[[1610,1605,1610],256],64945:[[1605,1605,1610],256],64946:[[1602,1605,1610],256],64947:[[1606,1581,1610],256],64948:[[1602,1605,1581],256],64949:[[1604,1581,1605],256],64950:[[1593,1605,1610],256],64951:[[1603,1605,1610],256],64952:[[1606,1580,1581],256],64953:[[1605,1582,1610],256],64954:[[1604,1580,1605],256],64955:[[1603,1605,1605],256],64956:[[1604,1580,1605],256],64957:[[1606,1580,1581],256],64958:[[1580,1581,1610],256],64959:[[1581,1580,1610],256],64960:[[1605,1580,1610],256],64961:[[1601,1605,1610],256],64962:[[1576,1581,1610],256],64963:[[1603,1605,1605],256],64964:[[1593,1580,1605],256],64965:[[1589,1605,1605],256],64966:[[1587,1582,1610],256],64967:[[1606,1580,1610],256],65008:[[1589,1604,1746],256],65009:[[1602,1604,1746],256],65010:[[1575,1604,1604,1607],256],65011:[[1575,1603,1576,1585],256],65012:[[1605,1581,1605,1583],256],65013:[[1589,1604,1593,1605],256],65014:[[1585,1587,1608,1604],256],65015:[[1593,1604,1610,1607],256],65016:[[1608,1587,1604,1605],256],65017:[[1589,1604,1609],256],65018:[[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605],256],65019:[[1580,1604,32,1580,1604,1575,1604,1607],256],65020:[[1585,1740,1575,1604],256]},65024:{65040:[[44],256],65041:[[12289],256],65042:[[12290],256],65043:[[58],256],65044:[[59],256],65045:[[33],256],65046:[[63],256],65047:[[12310],256],65048:[[12311],256],65049:[[8230],256],65056:[,230],65057:[,230],65058:[,230],65059:[,230],65060:[,230],65061:[,230],65062:[,230],65063:[,220],65064:[,220],65065:[,220],65066:[,220],65067:[,220],65068:[,220],65069:[,220],65072:[[8229],256],65073:[[8212],256],65074:[[8211],256],65075:[[95],256],65076:[[95],256],65077:[[40],256],65078:[[41],256],65079:[[123],256],65080:[[125],256],65081:[[12308],256],65082:[[12309],256],65083:[[12304],256],65084:[[12305],256],65085:[[12298],256],65086:[[12299],256],65087:[[12296],256],65088:[[12297],256],65089:[[12300],256],65090:[[12301],256],65091:[[12302],256],65092:[[12303],256],65095:[[91],256],65096:[[93],256],65097:[[8254],256],65098:[[8254],256],65099:[[8254],256],65100:[[8254],256],65101:[[95],256],65102:[[95],256],65103:[[95],256],65104:[[44],256],65105:[[12289],256],65106:[[46],256],65108:[[59],256],65109:[[58],256],65110:[[63],256],65111:[[33],256],65112:[[8212],256],65113:[[40],256],65114:[[41],256],65115:[[123],256],65116:[[125],256],65117:[[12308],256],65118:[[12309],256],65119:[[35],256],65120:[[38],256],65121:[[42],256],65122:[[43],256],65123:[[45],256],65124:[[60],256],65125:[[62],256],65126:[[61],256],65128:[[92],256],65129:[[36],256],65130:[[37],256],65131:[[64],256],65136:[[32,1611],256],65137:[[1600,1611],256],65138:[[32,1612],256],65140:[[32,1613],256],65142:[[32,1614],256],65143:[[1600,1614],256],65144:[[32,1615],256],65145:[[1600,1615],256],65146:[[32,1616],256],65147:[[1600,1616],256],65148:[[32,1617],256],65149:[[1600,1617],256],65150:[[32,1618],256],65151:[[1600,1618],256],65152:[[1569],256],65153:[[1570],256],65154:[[1570],256],65155:[[1571],256],65156:[[1571],256],65157:[[1572],256],65158:[[1572],256],65159:[[1573],256],65160:[[1573],256],65161:[[1574],256],65162:[[1574],256],65163:[[1574],256],65164:[[1574],256],65165:[[1575],256],65166:[[1575],256],65167:[[1576],256],65168:[[1576],256],65169:[[1576],256],65170:[[1576],256],65171:[[1577],256],65172:[[1577],256],65173:[[1578],256],65174:[[1578],256],65175:[[1578],256],65176:[[1578],256],65177:[[1579],256],65178:[[1579],256],65179:[[1579],256],65180:[[1579],256],65181:[[1580],256],65182:[[1580],256],65183:[[1580],256],65184:[[1580],256],65185:[[1581],256],65186:[[1581],256],65187:[[1581],256],65188:[[1581],256],65189:[[1582],256],65190:[[1582],256],65191:[[1582],256],65192:[[1582],256],65193:[[1583],256],65194:[[1583],256],65195:[[1584],256],65196:[[1584],256],65197:[[1585],256],65198:[[1585],256],65199:[[1586],256],65200:[[1586],256],65201:[[1587],256],65202:[[1587],256],65203:[[1587],256],65204:[[1587],256],65205:[[1588],256],65206:[[1588],256],65207:[[1588],256],65208:[[1588],256],65209:[[1589],256],65210:[[1589],256],65211:[[1589],256],65212:[[1589],256],65213:[[1590],256],65214:[[1590],256],65215:[[1590],256],65216:[[1590],256],65217:[[1591],256],65218:[[1591],256],65219:[[1591],256],65220:[[1591],256],65221:[[1592],256],65222:[[1592],256],65223:[[1592],256],65224:[[1592],256],65225:[[1593],256],65226:[[1593],256],65227:[[1593],256],65228:[[1593],256],65229:[[1594],256],65230:[[1594],256],65231:[[1594],256],65232:[[1594],256],65233:[[1601],256],65234:[[1601],256],65235:[[1601],256],65236:[[1601],256],65237:[[1602],256],65238:[[1602],256],65239:[[1602],256],65240:[[1602],256],65241:[[1603],256],65242:[[1603],256],65243:[[1603],256],65244:[[1603],256],65245:[[1604],256],65246:[[1604],256],65247:[[1604],256],65248:[[1604],256],65249:[[1605],256],65250:[[1605],256],65251:[[1605],256],65252:[[1605],256],65253:[[1606],256],65254:[[1606],256],65255:[[1606],256],65256:[[1606],256],65257:[[1607],256],65258:[[1607],256],65259:[[1607],256],65260:[[1607],256],65261:[[1608],256],65262:[[1608],256],65263:[[1609],256],65264:[[1609],256],65265:[[1610],256],65266:[[1610],256],65267:[[1610],256],65268:[[1610],256],65269:[[1604,1570],256],65270:[[1604,1570],256],65271:[[1604,1571],256],65272:[[1604,1571],256],65273:[[1604,1573],256],65274:[[1604,1573],256],65275:[[1604,1575],256],65276:[[1604,1575],256]},65280:{65281:[[33],256],65282:[[34],256],65283:[[35],256],65284:[[36],256],65285:[[37],256],65286:[[38],256],65287:[[39],256],65288:[[40],256],65289:[[41],256],65290:[[42],256],65291:[[43],256],65292:[[44],256],65293:[[45],256],65294:[[46],256],65295:[[47],256],65296:[[48],256],65297:[[49],256],65298:[[50],256],65299:[[51],256],65300:[[52],256],65301:[[53],256],65302:[[54],256],65303:[[55],256],65304:[[56],256],65305:[[57],256],65306:[[58],256],65307:[[59],256],65308:[[60],256],65309:[[61],256],65310:[[62],256],65311:[[63],256],65312:[[64],256],65313:[[65],256],65314:[[66],256],65315:[[67],256],65316:[[68],256],65317:[[69],256],65318:[[70],256],65319:[[71],256],65320:[[72],256],65321:[[73],256],65322:[[74],256],65323:[[75],256],65324:[[76],256],65325:[[77],256],65326:[[78],256],65327:[[79],256],65328:[[80],256],65329:[[81],256],65330:[[82],256],65331:[[83],256],65332:[[84],256],65333:[[85],256],65334:[[86],256],65335:[[87],256],65336:[[88],256],65337:[[89],256],65338:[[90],256],65339:[[91],256],65340:[[92],256],65341:[[93],256],65342:[[94],256],65343:[[95],256],65344:[[96],256],65345:[[97],256],65346:[[98],256],65347:[[99],256],65348:[[100],256],65349:[[101],256],65350:[[102],256],65351:[[103],256],65352:[[104],256],65353:[[105],256],65354:[[106],256],65355:[[107],256],65356:[[108],256],65357:[[109],256],65358:[[110],256],65359:[[111],256],65360:[[112],256],65361:[[113],256],65362:[[114],256],65363:[[115],256],65364:[[116],256],65365:[[117],256],65366:[[118],256],65367:[[119],256],65368:[[120],256],65369:[[121],256],65370:[[122],256],65371:[[123],256],65372:[[124],256],65373:[[125],256],65374:[[126],256],65375:[[10629],256],65376:[[10630],256],65377:[[12290],256],65378:[[12300],256],65379:[[12301],256],65380:[[12289],256],65381:[[12539],256],65382:[[12530],256],65383:[[12449],256],65384:[[12451],256],65385:[[12453],256],65386:[[12455],256],65387:[[12457],256],65388:[[12515],256],65389:[[12517],256],65390:[[12519],256],65391:[[12483],256],65392:[[12540],256],65393:[[12450],256],65394:[[12452],256],65395:[[12454],256],65396:[[12456],256],65397:[[12458],256],65398:[[12459],256],65399:[[12461],256],65400:[[12463],256],65401:[[12465],256],65402:[[12467],256],65403:[[12469],256],65404:[[12471],256],65405:[[12473],256],65406:[[12475],256],65407:[[12477],256],65408:[[12479],256],65409:[[12481],256],65410:[[12484],256],65411:[[12486],256],65412:[[12488],256],65413:[[12490],256],65414:[[12491],256],65415:[[12492],256],65416:[[12493],256],65417:[[12494],256],65418:[[12495],256],65419:[[12498],256],65420:[[12501],256],65421:[[12504],256],65422:[[12507],256],65423:[[12510],256],65424:[[12511],256],65425:[[12512],256],65426:[[12513],256],65427:[[12514],256],65428:[[12516],256],65429:[[12518],256],65430:[[12520],256],65431:[[12521],256],65432:[[12522],256],65433:[[12523],256],65434:[[12524],256],65435:[[12525],256],65436:[[12527],256],65437:[[12531],256],65438:[[12441],256],65439:[[12442],256],65440:[[12644],256],65441:[[12593],256],65442:[[12594],256],65443:[[12595],256],65444:[[12596],256],65445:[[12597],256],65446:[[12598],256],65447:[[12599],256],65448:[[12600],256],65449:[[12601],256],65450:[[12602],256],65451:[[12603],256],65452:[[12604],256],65453:[[12605],256],65454:[[12606],256],65455:[[12607],256],65456:[[12608],256],65457:[[12609],256],65458:[[12610],256],65459:[[12611],256],65460:[[12612],256],65461:[[12613],256],65462:[[12614],256],65463:[[12615],256],65464:[[12616],256],65465:[[12617],256],65466:[[12618],256],65467:[[12619],256],65468:[[12620],256],65469:[[12621],256],65470:[[12622],256],65474:[[12623],256],65475:[[12624],256],65476:[[12625],256],65477:[[12626],256],65478:[[12627],256],65479:[[12628],256],65482:[[12629],256],65483:[[12630],256],65484:[[12631],256],65485:[[12632],256],65486:[[12633],256],65487:[[12634],256],65490:[[12635],256],65491:[[12636],256],65492:[[12637],256],65493:[[12638],256],65494:[[12639],256],65495:[[12640],256],65498:[[12641],256],65499:[[12642],256],65500:[[12643],256],65504:[[162],256],65505:[[163],256],65506:[[172],256],65507:[[175],256],65508:[[166],256],65509:[[165],256],65510:[[8361],256],65512:[[9474],256],65513:[[8592],256],65514:[[8593],256],65515:[[8594],256],65516:[[8595],256],65517:[[9632],256],65518:[[9675],256]}};var
70123F={nfc:function(t){return y("NFC",t)},nfd:function(t){return y("NFD",t)},nfkc:function(t){return y("NFKC",t)},nfkd:function(t){return y("NFKD",t)}};"object"==typeof module?module.exports=F:"function"==typeof define&&define.amd?define("unorm",function(){return F}
vendor: 528 bytes, lines 70123-70124
70123):t.unorm=F,F.shimApplied=!1,String.prototype.normalize||(Object.defineProperty(String.prototype,"normalize",{enumerable:!1,configurable:!0,writable:!0,value:function(){var t=""+this,r=void 0===arguments[0]?"NFC":arguments[0];if(null==this)throw new TypeError("Cannot call method on "+Object.prototype.toString.call(this));if("NFC"===r)return F.nfc(t);if("NFD"===r)return F.nfd(t);if("NFKC"===r)return F.nfkc(t);if("NFKD"===r)return F.nfkd(t);throw new RangeError("Invalid normalization form: "+r)}}),F.shimApplied=!0)}(this); 70124
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.