Test Failed
Push — master ( 9811b7...5b4ca1 )
by Chad
16:14 queued 01:44
created

doc/build/_static/jquery-1.11.1.js   F

Complexity

Total Complexity 2374
Complexity/F 3.97

Size

Lines of Code 10294
Function Count 598

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 2374
dl 0
loc 10294
rs 2.4
c 1
b 0
f 0
cc 1
nc 0
mnd 10
bc 1747
fnc 598
bpm 2.9214
cpm 3.9698
noi 132

2 Functions

Rating   Name   Duplication   Size   Complexity  
A jquery-1.11.1.js ➔ ?!? 0 17 3
A jquery-1.11.1.js ➔ ??? 0 6 2

How to fix   Complexity   

Complexity

Complex classes like doc/build/_static/jquery-1.11.1.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
/*!
2
 * jQuery JavaScript Library v1.11.1
3
 * http://jquery.com/
4
 *
5
 * Includes Sizzle.js
6
 * http://sizzlejs.com/
7
 *
8
 * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors
9
 * Released under the MIT license
10
 * http://jquery.org/license
11
 *
12
 * Date: 2014-05-01T17:42Z
13
 */
14
15
(function( global, factory ) {
16
17
	if ( typeof module === "object" && typeof module.exports === "object" ) {
18
		// For CommonJS and CommonJS-like environments where a proper window is present,
19
		// execute the factory and get jQuery
20
		// For environments that do not inherently posses a window with a document
21
		// (such as Node.js), expose a jQuery-making factory as module.exports
22
		// This accentuates the need for the creation of a real window
23
		// e.g. var jQuery = require("jquery")(window);
24
		// See ticket #14549 for more info
25
		module.exports = global.document ?
26
			factory( global, true ) :
27
			function( w ) {
28
				if ( !w.document ) {
29
					throw new Error( "jQuery requires a window with a document" );
30
				}
31
				return factory( w );
32
			};
33
	} else {
34
		factory( global );
35
	}
36
37
// Pass this if window is not defined yet
38
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
39
40
// Can't do this because several apps including ASP.NET trace
41
// the stack via arguments.caller.callee and Firefox dies if
42
// you try to trace through "use strict" call chains. (#13335)
43
// Support: Firefox 18+
44
//
45
46
var deletedIds = [];
47
48
var slice = deletedIds.slice;
49
50
var concat = deletedIds.concat;
51
52
var push = deletedIds.push;
53
54
var indexOf = deletedIds.indexOf;
55
56
var class2type = {};
57
58
var toString = class2type.toString;
59
60
var hasOwn = class2type.hasOwnProperty;
61
62
var support = {};
63
64
65
66
var
67
	version = "1.11.1",
68
69
	// Define a local copy of jQuery
70
	jQuery = function( selector, context ) {
71
		// The jQuery object is actually just the init constructor 'enhanced'
72
		// Need init if jQuery is called (just allow error to be thrown if not included)
73
		return new jQuery.fn.init( selector, context );
74
	},
75
76
	// Support: Android<4.1, IE<9
77
	// Make sure we trim BOM and NBSP
78
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
79
80
	// Matches dashed string for camelizing
81
	rmsPrefix = /^-ms-/,
82
	rdashAlpha = /-([\da-z])/gi,
83
84
	// Used by jQuery.camelCase as callback to replace()
85
	fcamelCase = function( all, letter ) {
86
		return letter.toUpperCase();
87
	};
88
89
jQuery.fn = jQuery.prototype = {
90
	// The current version of jQuery being used
91
	jquery: version,
92
93
	constructor: jQuery,
94
95
	// Start with an empty selector
96
	selector: "",
97
98
	// The default length of a jQuery object is 0
99
	length: 0,
100
101
	toArray: function() {
102
		return slice.call( this );
103
	},
104
105
	// Get the Nth element in the matched element set OR
106
	// Get the whole matched element set as a clean array
107
	get: function( num ) {
108
		return num != null ?
109
110
			// Return just the one element from the set
111
			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
112
113
			// Return all the elements in a clean array
114
			slice.call( this );
115
	},
116
117
	// Take an array of elements and push it onto the stack
118
	// (returning the new matched element set)
119
	pushStack: function( elems ) {
120
121
		// Build a new jQuery matched element set
122
		var ret = jQuery.merge( this.constructor(), elems );
123
124
		// Add the old object onto the stack (as a reference)
125
		ret.prevObject = this;
126
		ret.context = this.context;
127
128
		// Return the newly-formed element set
129
		return ret;
130
	},
131
132
	// Execute a callback for every element in the matched set.
133
	// (You can seed the arguments with an array of args, but this is
134
	// only used internally.)
135
	each: function( callback, args ) {
136
		return jQuery.each( this, callback, args );
137
	},
138
139
	map: function( callback ) {
140
		return this.pushStack( jQuery.map(this, function( elem, i ) {
141
			return callback.call( elem, i, elem );
142
		}));
143
	},
144
145
	slice: function() {
146
		return this.pushStack( slice.apply( this, arguments ) );
147
	},
148
149
	first: function() {
150
		return this.eq( 0 );
151
	},
152
153
	last: function() {
154
		return this.eq( -1 );
155
	},
156
157
	eq: function( i ) {
158
		var len = this.length,
159
			j = +i + ( i < 0 ? len : 0 );
160
		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
161
	},
162
163
	end: function() {
164
		return this.prevObject || this.constructor(null);
165
	},
166
167
	// For internal use only.
168
	// Behaves like an Array's method, not like a jQuery method.
169
	push: push,
170
	sort: deletedIds.sort,
171
	splice: deletedIds.splice
172
};
173
174
jQuery.extend = jQuery.fn.extend = function() {
175
	var src, copyIsArray, copy, name, options, clone,
176
		target = arguments[0] || {},
177
		i = 1,
178
		length = arguments.length,
179
		deep = false;
180
181
	// Handle a deep copy situation
182
	if ( typeof target === "boolean" ) {
183
		deep = target;
184
185
		// skip the boolean and the target
186
		target = arguments[ i ] || {};
187
		i++;
188
	}
189
190
	// Handle case when target is a string or something (possible in deep copy)
191
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
192
		target = {};
193
	}
194
195
	// extend jQuery itself if only one argument is passed
196
	if ( i === length ) {
197
		target = this;
198
		i--;
199
	}
200
201
	for ( ; i < length; i++ ) {
202
		// Only deal with non-null/undefined values
203
		if ( (options = arguments[ i ]) != null ) {
204
			// Extend the base object
205
			for ( name in options ) {
206
				src = target[ name ];
207
				copy = options[ name ];
208
209
				// Prevent never-ending loop
210
				if ( target === copy ) {
211
					continue;
212
				}
213
214
				// Recurse if we're merging plain objects or arrays
215
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
216
					if ( copyIsArray ) {
217
						copyIsArray = false;
218
						clone = src && jQuery.isArray(src) ? src : [];
219
220
					} else {
221
						clone = src && jQuery.isPlainObject(src) ? src : {};
222
					}
223
224
					// Never move original objects, clone them
225
					target[ name ] = jQuery.extend( deep, clone, copy );
226
227
				// Don't bring in undefined values
228
				} else if ( copy !== undefined ) {
229
					target[ name ] = copy;
230
				}
231
			}
232
		}
233
	}
234
235
	// Return the modified object
236
	return target;
237
};
238
239
jQuery.extend({
240
	// Unique for each copy of jQuery on the page
241
	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
242
243
	// Assume jQuery is ready without the ready module
244
	isReady: true,
245
246
	error: function( msg ) {
247
		throw new Error( msg );
248
	},
249
250
	noop: function() {},
251
252
	// See test/unit/core.js for details concerning isFunction.
253
	// Since version 1.3, DOM methods and functions like alert
254
	// aren't supported. They return false on IE (#2968).
255
	isFunction: function( obj ) {
256
		return jQuery.type(obj) === "function";
257
	},
258
259
	isArray: Array.isArray || function( obj ) {
260
		return jQuery.type(obj) === "array";
261
	},
262
263
	isWindow: function( obj ) {
264
		/* jshint eqeqeq: false */
265
		return obj != null && obj == obj.window;
266
	},
267
268
	isNumeric: function( obj ) {
269
		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
270
		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
271
		// subtraction forces infinities to NaN
272
		return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0;
273
	},
274
275
	isEmptyObject: function( obj ) {
276
		var name;
277
		for ( name in obj ) {
0 ignored issues
show
Unused Code introduced by
The variable name seems to be never used. Consider removing it.
Loading history...
278
			return false;
279
		}
280
		return true;
281
	},
282
283
	isPlainObject: function( obj ) {
284
		var key;
285
286
		// Must be an Object.
287
		// Because of IE, we also have to check the presence of the constructor property.
288
		// Make sure that DOM nodes and window objects don't pass through, as well
289
		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
290
			return false;
291
		}
292
293
		try {
294
			// Not own constructor property must be Object
295
			if ( obj.constructor &&
296
				!hasOwn.call(obj, "constructor") &&
297
				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
298
				return false;
299
			}
300
		} catch ( e ) {
301
			// IE8,9 Will throw exceptions on certain host objects #9897
302
			return false;
303
		}
304
305
		// Support: IE<9
306
		// Handle iteration over inherited properties before own properties.
307
		if ( support.ownLast ) {
308
			for ( key in obj ) {
309
				return hasOwn.call( obj, key );
310
			}
311
		}
312
313
		// Own properties are enumerated firstly, so to speed up,
314
		// if last one is own, then all properties are own.
315
		for ( key in obj ) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
316
317
		return key === undefined || hasOwn.call( obj, key );
0 ignored issues
show
Bug introduced by
The variable key seems to not be initialized for all possible execution paths.
Loading history...
318
	},
319
320
	type: function( obj ) {
321
		if ( obj == null ) {
322
			return obj + "";
323
		}
324
		return typeof obj === "object" || typeof obj === "function" ?
325
			class2type[ toString.call(obj) ] || "object" :
326
			typeof obj;
327
	},
328
329
	// Evaluates a script in a global context
330
	// Workarounds based on findings by Jim Driscoll
331
	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
332
	globalEval: function( data ) {
333
		if ( data && jQuery.trim( data ) ) {
334
			// We use execScript on Internet Explorer
335
			// We use an anonymous function so that context is window
336
			// rather than jQuery in Firefox
337
			( window.execScript || function( data ) {
338
				window[ "eval" ].call( window, data );
339
			} )( data );
340
		}
341
	},
342
343
	// Convert dashed to camelCase; used by the css and data modules
344
	// Microsoft forgot to hump their vendor prefix (#9572)
345
	camelCase: function( string ) {
346
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
347
	},
348
349
	nodeName: function( elem, name ) {
350
		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
351
	},
352
353
	// args is for internal usage only
354
	each: function( obj, callback, args ) {
355
		var value,
356
			i = 0,
357
			length = obj.length,
358
			isArray = isArraylike( obj );
359
360
		if ( args ) {
361
			if ( isArray ) {
362
				for ( ; i < length; i++ ) {
363
					value = callback.apply( obj[ i ], args );
364
365
					if ( value === false ) {
366
						break;
367
					}
368
				}
369
			} else {
370
				for ( i in obj ) {
371
					value = callback.apply( obj[ i ], args );
372
373
					if ( value === false ) {
374
						break;
375
					}
376
				}
377
			}
378
379
		// A special, fast, case for the most common use of each
380
		} else {
381
			if ( isArray ) {
382
				for ( ; i < length; i++ ) {
383
					value = callback.call( obj[ i ], i, obj[ i ] );
384
385
					if ( value === false ) {
386
						break;
387
					}
388
				}
389
			} else {
390
				for ( i in obj ) {
391
					value = callback.call( obj[ i ], i, obj[ i ] );
392
393
					if ( value === false ) {
394
						break;
395
					}
396
				}
397
			}
398
		}
399
400
		return obj;
401
	},
402
403
	// Support: Android<4.1, IE<9
404
	trim: function( text ) {
405
		return text == null ?
406
			"" :
407
			( text + "" ).replace( rtrim, "" );
408
	},
409
410
	// results is for internal usage only
411
	makeArray: function( arr, results ) {
412
		var ret = results || [];
413
414
		if ( arr != null ) {
415
			if ( isArraylike( Object(arr) ) ) {
416
				jQuery.merge( ret,
417
					typeof arr === "string" ?
418
					[ arr ] : arr
419
				);
420
			} else {
421
				push.call( ret, arr );
422
			}
423
		}
424
425
		return ret;
426
	},
427
428
	inArray: function( elem, arr, i ) {
429
		var len;
430
431
		if ( arr ) {
432
			if ( indexOf ) {
433
				return indexOf.call( arr, elem, i );
434
			}
435
436
			len = arr.length;
437
			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
438
439
			for ( ; i < len; i++ ) {
440
				// Skip accessing in sparse arrays
441
				if ( i in arr && arr[ i ] === elem ) {
442
					return i;
443
				}
444
			}
445
		}
446
447
		return -1;
448
	},
449
450
	merge: function( first, second ) {
451
		var len = +second.length,
452
			j = 0,
453
			i = first.length;
454
455
		while ( j < len ) {
456
			first[ i++ ] = second[ j++ ];
457
		}
458
459
		// Support: IE<9
460
		// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)
461
		if ( len !== len ) {
462
			while ( second[j] !== undefined ) {
463
				first[ i++ ] = second[ j++ ];
464
			}
465
		}
466
467
		first.length = i;
468
469
		return first;
470
	},
471
472
	grep: function( elems, callback, invert ) {
473
		var callbackInverse,
474
			matches = [],
475
			i = 0,
476
			length = elems.length,
477
			callbackExpect = !invert;
478
479
		// Go through the array, only saving the items
480
		// that pass the validator function
481
		for ( ; i < length; i++ ) {
482
			callbackInverse = !callback( elems[ i ], i );
483
			if ( callbackInverse !== callbackExpect ) {
484
				matches.push( elems[ i ] );
485
			}
486
		}
487
488
		return matches;
489
	},
490
491
	// arg is for internal usage only
492
	map: function( elems, callback, arg ) {
493
		var value,
494
			i = 0,
495
			length = elems.length,
496
			isArray = isArraylike( elems ),
497
			ret = [];
498
499
		// Go through the array, translating each of the items to their new values
500
		if ( isArray ) {
501
			for ( ; i < length; i++ ) {
502
				value = callback( elems[ i ], i, arg );
503
504
				if ( value != null ) {
505
					ret.push( value );
506
				}
507
			}
508
509
		// Go through every key on the object,
510
		} else {
511
			for ( i in elems ) {
512
				value = callback( elems[ i ], i, arg );
513
514
				if ( value != null ) {
515
					ret.push( value );
516
				}
517
			}
518
		}
519
520
		// Flatten any nested arrays
521
		return concat.apply( [], ret );
522
	},
523
524
	// A global GUID counter for objects
525
	guid: 1,
526
527
	// Bind a function to a context, optionally partially applying any
528
	// arguments.
529
	proxy: function( fn, context ) {
530
		var args, proxy, tmp;
531
532
		if ( typeof context === "string" ) {
533
			tmp = fn[ context ];
534
			context = fn;
535
			fn = tmp;
536
		}
537
538
		// Quick check to determine if target is callable, in the spec
539
		// this throws a TypeError, but we will just return undefined.
540
		if ( !jQuery.isFunction( fn ) ) {
541
			return undefined;
542
		}
543
544
		// Simulated bind
545
		args = slice.call( arguments, 2 );
546
		proxy = function() {
547
			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
548
		};
549
550
		// Set the guid of unique handler to the same of original handler, so it can be removed
551
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
552
553
		return proxy;
554
	},
555
556
	now: function() {
557
		return +( new Date() );
558
	},
559
560
	// jQuery.support is not used in Core but other projects attach their
561
	// properties to it so it needs to exist.
562
	support: support
563
});
564
565
// Populate the class2type map
566
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
567
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
568
});
569
570
function isArraylike( obj ) {
571
	var length = obj.length,
572
		type = jQuery.type( obj );
573
574
	if ( type === "function" || jQuery.isWindow( obj ) ) {
575
		return false;
576
	}
577
578
	if ( obj.nodeType === 1 && length ) {
579
		return true;
580
	}
581
582
	return type === "array" || length === 0 ||
583
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
584
}
585
var Sizzle =
586
/*!
587
 * Sizzle CSS Selector Engine v1.10.19
588
 * http://sizzlejs.com/
589
 *
590
 * Copyright 2013 jQuery Foundation, Inc. and other contributors
591
 * Released under the MIT license
592
 * http://jquery.org/license
593
 *
594
 * Date: 2014-04-18
595
 */
596
(function( window ) {
597
598
var i,
599
	support,
600
	Expr,
601
	getText,
602
	isXML,
603
	tokenize,
604
	compile,
605
	select,
606
	outermostContext,
607
	sortInput,
608
	hasDuplicate,
609
610
	// Local document vars
611
	setDocument,
612
	document,
613
	docElem,
614
	documentIsHTML,
615
	rbuggyQSA,
616
	rbuggyMatches,
617
	matches,
618
	contains,
619
620
	// Instance-specific data
621
	expando = "sizzle" + -(new Date()),
622
	preferredDoc = window.document,
623
	dirruns = 0,
624
	done = 0,
625
	classCache = createCache(),
626
	tokenCache = createCache(),
627
	compilerCache = createCache(),
628
	sortOrder = function( a, b ) {
629
		if ( a === b ) {
630
			hasDuplicate = true;
631
		}
632
		return 0;
633
	},
634
635
	// General-purpose constants
636
	strundefined = typeof undefined,
637
	MAX_NEGATIVE = 1 << 31,
638
639
	// Instance methods
640
	hasOwn = ({}).hasOwnProperty,
641
	arr = [],
642
	pop = arr.pop,
643
	push_native = arr.push,
644
	push = arr.push,
645
	slice = arr.slice,
646
	// Use a stripped-down indexOf if we can't use a native one
647
	indexOf = arr.indexOf || function( elem ) {
648
		var i = 0,
649
			len = this.length;
650
		for ( ; i < len; i++ ) {
651
			if ( this[i] === elem ) {
652
				return i;
653
			}
654
		}
655
		return -1;
656
	},
657
658
	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
659
660
	// Regular expressions
661
662
	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
663
	whitespace = "[\\x20\\t\\r\\n\\f]",
664
	// http://www.w3.org/TR/css3-syntax/#characters
665
	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
666
667
	// Loosely modeled on CSS identifier characters
668
	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
669
	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
670
	identifier = characterEncoding.replace( "w", "w#" ),
671
672
	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
673
	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
674
		// Operator (capture 2)
675
		"*([*^$|!~]?=)" + whitespace +
676
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
677
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
678
		"*\\]",
679
680
	pseudos = ":(" + characterEncoding + ")(?:\\((" +
681
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
682
		// 1. quoted (capture 3; capture 4 or capture 5)
683
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
684
		// 2. simple (capture 6)
685
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
686
		// 3. anything else (capture 2)
687
		".*" +
688
		")\\)|)",
689
690
	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
691
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
692
693
	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
694
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
695
696
	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
697
698
	rpseudo = new RegExp( pseudos ),
699
	ridentifier = new RegExp( "^" + identifier + "$" ),
700
701
	matchExpr = {
702
		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
703
		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
704
		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
705
		"ATTR": new RegExp( "^" + attributes ),
706
		"PSEUDO": new RegExp( "^" + pseudos ),
707
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
708
			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
709
			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
710
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
711
		// For use in libraries implementing .is()
712
		// We use this for POS matching in `select`
713
		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
714
			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
715
	},
716
717
	rinputs = /^(?:input|select|textarea|button)$/i,
718
	rheader = /^h\d$/i,
719
720
	rnative = /^[^{]+\{\s*\[native \w/,
721
722
	// Easily-parseable/retrievable ID or TAG or CLASS selectors
723
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
724
725
	rsibling = /[+~]/,
726
	rescape = /'|\\/g,
727
728
	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
729
	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
730
	funescape = function( _, escaped, escapedWhitespace ) {
731
		var high = "0x" + escaped - 0x10000;
732
		// NaN means non-codepoint
733
		// Support: Firefox<24
734
		// Workaround erroneous numeric interpretation of +"0x"
735
		return high !== high || escapedWhitespace ?
736
			escaped :
737
			high < 0 ?
738
				// BMP codepoint
739
				String.fromCharCode( high + 0x10000 ) :
740
				// Supplemental Plane codepoint (surrogate pair)
741
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
742
	};
743
744
// Optimize for push.apply( _, NodeList )
745
try {
746
	push.apply(
747
		(arr = slice.call( preferredDoc.childNodes )),
748
		preferredDoc.childNodes
749
	);
750
	// Support: Android<4.0
751
	// Detect silently failing push.apply
752
	arr[ preferredDoc.childNodes.length ].nodeType;
0 ignored issues
show
introduced by
The result of the property access to arr.preferredDoc.childNodes.length.nodeType is not used.
Loading history...
753
} catch ( e ) {
754
	push = { apply: arr.length ?
755
756
		// Leverage slice if possible
757
		function( target, els ) {
758
			push_native.apply( target, slice.call(els) );
759
		} :
760
761
		// Support: IE<9
762
		// Otherwise append directly
763
		function( target, els ) {
764
			var j = target.length,
765
				i = 0;
766
			// Can't trust NodeList.length
767
			while ( (target[j++] = els[i++]) ) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
768
			target.length = j - 1;
769
		}
770
	};
771
}
772
773
function Sizzle( selector, context, results, seed ) {
774
	var match, elem, m, nodeType,
775
		// QSA vars
776
		i, groups, old, nid, newContext, newSelector;
777
778
	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
779
		setDocument( context );
780
	}
781
782
	context = context || document;
783
	results = results || [];
784
785
	if ( !selector || typeof selector !== "string" ) {
786
		return results;
787
	}
788
789
	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
790
		return [];
791
	}
792
793
	if ( documentIsHTML && !seed ) {
794
795
		// Shortcuts
796
		if ( (match = rquickExpr.exec( selector )) ) {
797
			// Speed-up: Sizzle("#ID")
798
			if ( (m = match[1]) ) {
799
				if ( nodeType === 9 ) {
800
					elem = context.getElementById( m );
801
					// Check parentNode to catch when Blackberry 4.6 returns
802
					// nodes that are no longer in the document (jQuery #6963)
803
					if ( elem && elem.parentNode ) {
804
						// Handle the case where IE, Opera, and Webkit return items
805
						// by name instead of ID
806
						if ( elem.id === m ) {
807
							results.push( elem );
808
							return results;
809
						}
810
					} else {
811
						return results;
812
					}
813
				} else {
814
					// Context is not a document
815
					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
816
						contains( context, elem ) && elem.id === m ) {
817
						results.push( elem );
818
						return results;
819
					}
820
				}
821
822
			// Speed-up: Sizzle("TAG")
823
			} else if ( match[2] ) {
824
				push.apply( results, context.getElementsByTagName( selector ) );
825
				return results;
826
827
			// Speed-up: Sizzle(".CLASS")
828
			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
829
				push.apply( results, context.getElementsByClassName( m ) );
830
				return results;
831
			}
832
		}
833
834
		// QSA path
835
		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
836
			nid = old = expando;
837
			newContext = context;
838
			newSelector = nodeType === 9 && selector;
839
840
			// qSA works strangely on Element-rooted queries
841
			// We can work around this by specifying an extra ID on the root
842
			// and working up from there (Thanks to Andrew Dupont for the technique)
843
			// IE 8 doesn't work on object elements
844
			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
845
				groups = tokenize( selector );
846
847
				if ( (old = context.getAttribute("id")) ) {
848
					nid = old.replace( rescape, "\\$&" );
849
				} else {
850
					context.setAttribute( "id", nid );
851
				}
852
				nid = "[id='" + nid + "'] ";
853
854
				i = groups.length;
855
				while ( i-- ) {
856
					groups[i] = nid + toSelector( groups[i] );
857
				}
858
				newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
859
				newSelector = groups.join(",");
860
			}
861
862
			if ( newSelector ) {
863
				try {
864
					push.apply( results,
865
						newContext.querySelectorAll( newSelector )
866
					);
867
					return results;
868
				} catch(qsaError) {
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
869
				} finally {
870
					if ( !old ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !old is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
871
						context.removeAttribute("id");
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
872
					}
873
				}
874
			}
875
		}
876
	}
877
878
	// All others
879
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
880
}
881
882
/**
883
 * Create key-value caches of limited size
884
 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
885
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
886
 *	deleting the oldest entry
887
 */
888
function createCache() {
889
	var keys = [];
890
891
	function cache( key, value ) {
892
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
893
		if ( keys.push( key + " " ) > Expr.cacheLength ) {
894
			// Only keep the most recent entries
895
			delete cache[ keys.shift() ];
896
		}
897
		return (cache[ key + " " ] = value);
898
	}
899
	return cache;
900
}
901
902
/**
903
 * Mark a function for special use by Sizzle
904
 * @param {Function} fn The function to mark
905
 */
906
function markFunction( fn ) {
907
	fn[ expando ] = true;
908
	return fn;
909
}
910
911
/**
912
 * Support testing using an element
913
 * @param {Function} fn Passed the created div and expects a boolean result
914
 */
915
function assert( fn ) {
916
	var div = document.createElement("div");
917
918
	try {
919
		return !!fn( div );
920
	} catch (e) {
921
		return false;
922
	} finally {
923
		// Remove from its parent by default
924
		if ( div.parentNode ) {
925
			div.parentNode.removeChild( div );
926
		}
927
		// release memory in IE
928
		div = null;
0 ignored issues
show
Unused Code introduced by
The assignment to div seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
929
	}
930
}
931
932
/**
933
 * Adds the same handler for all of the specified attrs
934
 * @param {String} attrs Pipe-separated list of attributes
935
 * @param {Function} handler The method that will be applied
936
 */
937
function addHandle( attrs, handler ) {
938
	var arr = attrs.split("|"),
939
		i = attrs.length;
940
941
	while ( i-- ) {
942
		Expr.attrHandle[ arr[i] ] = handler;
943
	}
944
}
945
946
/**
947
 * Checks document order of two siblings
948
 * @param {Element} a
949
 * @param {Element} b
950
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
951
 */
952
function siblingCheck( a, b ) {
953
	var cur = b && a,
954
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
955
			( ~b.sourceIndex || MAX_NEGATIVE ) -
956
			( ~a.sourceIndex || MAX_NEGATIVE );
957
958
	// Use IE sourceIndex if available on both nodes
959
	if ( diff ) {
960
		return diff;
961
	}
962
963
	// Check if b follows a
964
	if ( cur ) {
965
		while ( (cur = cur.nextSibling) ) {
966
			if ( cur === b ) {
967
				return -1;
968
			}
969
		}
970
	}
971
972
	return a ? 1 : -1;
973
}
974
975
/**
976
 * Returns a function to use in pseudos for input types
977
 * @param {String} type
978
 */
979
function createInputPseudo( type ) {
980
	return function( elem ) {
981
		var name = elem.nodeName.toLowerCase();
982
		return name === "input" && elem.type === type;
983
	};
984
}
985
986
/**
987
 * Returns a function to use in pseudos for buttons
988
 * @param {String} type
989
 */
990
function createButtonPseudo( type ) {
991
	return function( elem ) {
992
		var name = elem.nodeName.toLowerCase();
993
		return (name === "input" || name === "button") && elem.type === type;
994
	};
995
}
996
997
/**
998
 * Returns a function to use in pseudos for positionals
999
 * @param {Function} fn
1000
 */
1001
function createPositionalPseudo( fn ) {
1002
	return markFunction(function( argument ) {
1003
		argument = +argument;
1004
		return markFunction(function( seed, matches ) {
1005
			var j,
1006
				matchIndexes = fn( [], seed.length, argument ),
1007
				i = matchIndexes.length;
1008
1009
			// Match elements found at the specified indexes
1010
			while ( i-- ) {
1011
				if ( seed[ (j = matchIndexes[i]) ] ) {
1012
					seed[j] = !(matches[j] = seed[j]);
1013
				}
1014
			}
1015
		});
1016
	});
1017
}
1018
1019
/**
1020
 * Checks a node for validity as a Sizzle context
1021
 * @param {Element|Object=} context
1022
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
1023
 */
1024
function testContext( context ) {
1025
	return context && typeof context.getElementsByTagName !== strundefined && context;
1026
}
1027
1028
// Expose support vars for convenience
1029
support = Sizzle.support = {};
1030
1031
/**
1032
 * Detects XML nodes
1033
 * @param {Element|Object} elem An element or a document
1034
 * @returns {Boolean} True iff elem is a non-HTML XML node
1035
 */
1036
isXML = Sizzle.isXML = function( elem ) {
1037
	// documentElement is verified for cases where it doesn't yet exist
1038
	// (such as loading iframes in IE - #4833)
1039
	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1040
	return documentElement ? documentElement.nodeName !== "HTML" : false;
1041
};
1042
1043
/**
1044
 * Sets document-related variables once based on the current document
1045
 * @param {Element|Object} [doc] An element or document object to use to set the document
0 ignored issues
show
Documentation introduced by
The parameter doc does not exist. Did you maybe forget to remove this comment?
Loading history...
1046
 * @returns {Object} Returns the current document
1047
 */
1048
setDocument = Sizzle.setDocument = function( node ) {
1049
	var hasCompare,
1050
		doc = node ? node.ownerDocument || node : preferredDoc,
1051
		parent = doc.defaultView;
1052
1053
	// If no document and documentElement is available, return
1054
	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1055
		return document;
1056
	}
1057
1058
	// Set our document
1059
	document = doc;
1060
	docElem = doc.documentElement;
1061
1062
	// Support tests
1063
	documentIsHTML = !isXML( doc );
1064
1065
	// Support: IE>8
1066
	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
1067
	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
1068
	// IE6-8 do not support the defaultView property so parent will be undefined
1069
	if ( parent && parent !== parent.top ) {
1070
		// IE11 does not have attachEvent, so all must suffer
1071
		if ( parent.addEventListener ) {
1072
			parent.addEventListener( "unload", function() {
1073
				setDocument();
1074
			}, false );
1075
		} else if ( parent.attachEvent ) {
1076
			parent.attachEvent( "onunload", function() {
1077
				setDocument();
1078
			});
1079
		}
1080
	}
1081
1082
	/* Attributes
1083
	---------------------------------------------------------------------- */
1084
1085
	// Support: IE<8
1086
	// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
1087
	support.attributes = assert(function( div ) {
1088
		div.className = "i";
1089
		return !div.getAttribute("className");
1090
	});
1091
1092
	/* getElement(s)By*
1093
	---------------------------------------------------------------------- */
1094
1095
	// Check if getElementsByTagName("*") returns only elements
1096
	support.getElementsByTagName = assert(function( div ) {
1097
		div.appendChild( doc.createComment("") );
1098
		return !div.getElementsByTagName("*").length;
1099
	});
1100
1101
	// Check if getElementsByClassName can be trusted
1102
	support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
1103
		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
1104
1105
		// Support: Safari<4
1106
		// Catch class over-caching
1107
		div.firstChild.className = "i";
1108
		// Support: Opera<10
1109
		// Catch gEBCN failure to find non-leading classes
1110
		return div.getElementsByClassName("i").length === 2;
1111
	});
1112
1113
	// Support: IE<10
1114
	// Check if getElementById returns elements by name
1115
	// The broken getElementById methods don't pick up programatically-set names,
1116
	// so use a roundabout getElementsByName test
1117
	support.getById = assert(function( div ) {
1118
		docElem.appendChild( div ).id = expando;
1119
		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
1120
	});
1121
1122
	// ID find and filter
1123
	if ( support.getById ) {
1124
		Expr.find["ID"] = function( id, context ) {
1125
			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if typeof context.getElemen...fined && documentIsHTML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1126
				var m = context.getElementById( id );
1127
				// Check parentNode to catch when Blackberry 4.6 returns
1128
				// nodes that are no longer in the document #6963
1129
				return m && m.parentNode ? [ m ] : [];
1130
			}
1131
		};
1132
		Expr.filter["ID"] = function( id ) {
1133
			var attrId = id.replace( runescape, funescape );
1134
			return function( elem ) {
1135
				return elem.getAttribute("id") === attrId;
1136
			};
1137
		};
1138
	} else {
1139
		// Support: IE6/7
1140
		// getElementById is not reliable as a find shortcut
1141
		delete Expr.find["ID"];
1142
1143
		Expr.filter["ID"] =  function( id ) {
1144
			var attrId = id.replace( runescape, funescape );
1145
			return function( elem ) {
1146
				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
1147
				return node && node.value === attrId;
1148
			};
1149
		};
1150
	}
1151
1152
	// Tag
1153
	Expr.find["TAG"] = support.getElementsByTagName ?
1154
		function( tag, context ) {
1155
			if ( typeof context.getElementsByTagName !== strundefined ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if typeof context.getElemen...gName !== strundefined is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1156
				return context.getElementsByTagName( tag );
1157
			}
1158
		} :
1159
		function( tag, context ) {
1160
			var elem,
1161
				tmp = [],
1162
				i = 0,
1163
				results = context.getElementsByTagName( tag );
1164
1165
			// Filter out possible comments
1166
			if ( tag === "*" ) {
1167
				while ( (elem = results[i++]) ) {
1168
					if ( elem.nodeType === 1 ) {
1169
						tmp.push( elem );
1170
					}
1171
				}
1172
1173
				return tmp;
1174
			}
1175
			return results;
1176
		};
1177
1178
	// Class
1179
	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1180
		if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if typeof context.getElemen...fined && documentIsHTML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1181
			return context.getElementsByClassName( className );
1182
		}
1183
	};
1184
1185
	/* QSA/matchesSelector
1186
	---------------------------------------------------------------------- */
1187
1188
	// QSA and matchesSelector support
1189
1190
	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1191
	rbuggyMatches = [];
1192
1193
	// qSa(:focus) reports false when true (Chrome 21)
1194
	// We allow this because of a bug in IE8/9 that throws an error
1195
	// whenever `document.activeElement` is accessed on an iframe
1196
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1197
	// See http://bugs.jquery.com/ticket/13378
1198
	rbuggyQSA = [];
1199
1200
	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
1201
		// Build QSA regex
1202
		// Regex strategy adopted from Diego Perini
1203
		assert(function( div ) {
1204
			// Select is set to empty string on purpose
1205
			// This is to test IE's treatment of not explicitly
1206
			// setting a boolean content attribute,
1207
			// since its presence should be enough
1208
			// http://bugs.jquery.com/ticket/12359
1209
			div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
1210
1211
			// Support: IE8, Opera 11-12.16
1212
			// Nothing should be selected when empty strings follow ^= or $= or *=
1213
			// The test attribute must be unknown in Opera but "safe" for WinRT
1214
			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1215
			if ( div.querySelectorAll("[msallowclip^='']").length ) {
1216
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1217
			}
1218
1219
			// Support: IE8
1220
			// Boolean attributes and "value" are not treated correctly
1221
			if ( !div.querySelectorAll("[selected]").length ) {
1222
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1223
			}
1224
1225
			// Webkit/Opera - :checked should return selected option elements
1226
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1227
			// IE8 throws error here and will not see later tests
1228
			if ( !div.querySelectorAll(":checked").length ) {
1229
				rbuggyQSA.push(":checked");
1230
			}
1231
		});
1232
1233
		assert(function( div ) {
1234
			// Support: Windows 8 Native Apps
1235
			// The type and name attributes are restricted during .innerHTML assignment
1236
			var input = doc.createElement("input");
1237
			input.setAttribute( "type", "hidden" );
1238
			div.appendChild( input ).setAttribute( "name", "D" );
1239
1240
			// Support: IE8
1241
			// Enforce case-sensitivity of name attribute
1242
			if ( div.querySelectorAll("[name=d]").length ) {
1243
				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1244
			}
1245
1246
			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1247
			// IE8 throws error here and will not see later tests
1248
			if ( !div.querySelectorAll(":enabled").length ) {
1249
				rbuggyQSA.push( ":enabled", ":disabled" );
1250
			}
1251
1252
			// Opera 10-11 does not throw on post-comma invalid pseudos
1253
			div.querySelectorAll("*,:x");
1254
			rbuggyQSA.push(",.*:");
1255
		});
1256
	}
1257
1258
	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1259
		docElem.webkitMatchesSelector ||
1260
		docElem.mozMatchesSelector ||
1261
		docElem.oMatchesSelector ||
1262
		docElem.msMatchesSelector) )) ) {
1263
1264
		assert(function( div ) {
1265
			// Check to see if it's possible to do matchesSelector
1266
			// on a disconnected node (IE 9)
1267
			support.disconnectedMatch = matches.call( div, "div" );
1268
1269
			// This should fail with an exception
1270
			// Gecko does not error, returns false instead
1271
			matches.call( div, "[s!='']:x" );
1272
			rbuggyMatches.push( "!=", pseudos );
1273
		});
1274
	}
1275
1276
	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1277
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1278
1279
	/* Contains
1280
	---------------------------------------------------------------------- */
1281
	hasCompare = rnative.test( docElem.compareDocumentPosition );
1282
1283
	// Element contains another
1284
	// Purposefully does not implement inclusive descendent
1285
	// As in, an element does not contain itself
1286
	contains = hasCompare || rnative.test( docElem.contains ) ?
1287
		function( a, b ) {
1288
			var adown = a.nodeType === 9 ? a.documentElement : a,
1289
				bup = b && b.parentNode;
1290
			return a === bup || !!( bup && bup.nodeType === 1 && (
1291
				adown.contains ?
1292
					adown.contains( bup ) :
1293
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1294
			));
1295
		} :
1296
		function( a, b ) {
1297
			if ( b ) {
1298
				while ( (b = b.parentNode) ) {
1299
					if ( b === a ) {
1300
						return true;
1301
					}
1302
				}
1303
			}
1304
			return false;
1305
		};
1306
1307
	/* Sorting
1308
	---------------------------------------------------------------------- */
1309
1310
	// Document order sorting
1311
	sortOrder = hasCompare ?
1312
	function( a, b ) {
1313
1314
		// Flag for duplicate removal
1315
		if ( a === b ) {
1316
			hasDuplicate = true;
1317
			return 0;
1318
		}
1319
1320
		// Sort on method existence if only one input has compareDocumentPosition
1321
		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1322
		if ( compare ) {
1323
			return compare;
1324
		}
1325
1326
		// Calculate position if both inputs belong to the same document
1327
		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1328
			a.compareDocumentPosition( b ) :
1329
1330
			// Otherwise we know they are disconnected
1331
			1;
1332
1333
		// Disconnected nodes
1334
		if ( compare & 1 ||
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
1335
			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1336
1337
			// Choose the first element that is related to our preferred document
1338
			if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1339
				return -1;
1340
			}
1341
			if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1342
				return 1;
1343
			}
1344
1345
			// Maintain original order
1346
			return sortInput ?
1347
				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1348
				0;
1349
		}
1350
1351
		return compare & 4 ? -1 : 1;
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
1352
	} :
1353
	function( a, b ) {
1354
		// Exit early if the nodes are identical
1355
		if ( a === b ) {
1356
			hasDuplicate = true;
1357
			return 0;
1358
		}
1359
1360
		var cur,
1361
			i = 0,
1362
			aup = a.parentNode,
1363
			bup = b.parentNode,
1364
			ap = [ a ],
1365
			bp = [ b ];
1366
1367
		// Parentless nodes are either documents or disconnected
1368
		if ( !aup || !bup ) {
1369
			return a === doc ? -1 :
1370
				b === doc ? 1 :
1371
				aup ? -1 :
1372
				bup ? 1 :
1373
				sortInput ?
1374
				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1375
				0;
1376
1377
		// If the nodes are siblings, we can do a quick check
1378
		} else if ( aup === bup ) {
1379
			return siblingCheck( a, b );
1380
		}
1381
1382
		// Otherwise we need full lists of their ancestors for comparison
1383
		cur = a;
1384
		while ( (cur = cur.parentNode) ) {
1385
			ap.unshift( cur );
1386
		}
1387
		cur = b;
1388
		while ( (cur = cur.parentNode) ) {
1389
			bp.unshift( cur );
1390
		}
1391
1392
		// Walk down the tree looking for a discrepancy
1393
		while ( ap[i] === bp[i] ) {
1394
			i++;
1395
		}
1396
1397
		return i ?
1398
			// Do a sibling check if the nodes have a common ancestor
1399
			siblingCheck( ap[i], bp[i] ) :
1400
1401
			// Otherwise nodes in our document sort first
1402
			ap[i] === preferredDoc ? -1 :
1403
			bp[i] === preferredDoc ? 1 :
1404
			0;
1405
	};
1406
1407
	return doc;
1408
};
1409
1410
Sizzle.matches = function( expr, elements ) {
1411
	return Sizzle( expr, null, null, elements );
1412
};
1413
1414
Sizzle.matchesSelector = function( elem, expr ) {
1415
	// Set document vars if needed
1416
	if ( ( elem.ownerDocument || elem ) !== document ) {
1417
		setDocument( elem );
1418
	}
1419
1420
	// Make sure that attribute selectors are quoted
1421
	expr = expr.replace( rattributeQuotes, "='$1']" );
1422
1423
	if ( support.matchesSelector && documentIsHTML &&
1424
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1425
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1426
1427
		try {
1428
			var ret = matches.call( elem, expr );
1429
1430
			// IE 9's matchesSelector returns false on disconnected nodes
1431
			if ( ret || support.disconnectedMatch ||
1432
					// As well, disconnected nodes are said to be in a document
1433
					// fragment in IE 9
1434
					elem.document && elem.document.nodeType !== 11 ) {
1435
				return ret;
1436
			}
1437
		} catch(e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
1438
	}
1439
1440
	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1441
};
1442
1443
Sizzle.contains = function( context, elem ) {
1444
	// Set document vars if needed
1445
	if ( ( context.ownerDocument || context ) !== document ) {
1446
		setDocument( context );
1447
	}
1448
	return contains( context, elem );
1449
};
1450
1451
Sizzle.attr = function( elem, name ) {
1452
	// Set document vars if needed
1453
	if ( ( elem.ownerDocument || elem ) !== document ) {
1454
		setDocument( elem );
1455
	}
1456
1457
	var fn = Expr.attrHandle[ name.toLowerCase() ],
1458
		// Don't get fooled by Object.prototype properties (jQuery #13807)
1459
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1460
			fn( elem, name, !documentIsHTML ) :
1461
			undefined;
1462
1463
	return val !== undefined ?
1464
		val :
1465
		support.attributes || !documentIsHTML ?
1466
			elem.getAttribute( name ) :
1467
			(val = elem.getAttributeNode(name)) && val.specified ?
1468
				val.value :
1469
				null;
1470
};
1471
1472
Sizzle.error = function( msg ) {
1473
	throw new Error( "Syntax error, unrecognized expression: " + msg );
1474
};
1475
1476
/**
1477
 * Document sorting and removing duplicates
1478
 * @param {ArrayLike} results
1479
 */
1480
Sizzle.uniqueSort = function( results ) {
1481
	var elem,
1482
		duplicates = [],
1483
		j = 0,
1484
		i = 0;
1485
1486
	// Unless we *know* we can detect duplicates, assume their presence
1487
	hasDuplicate = !support.detectDuplicates;
1488
	sortInput = !support.sortStable && results.slice( 0 );
1489
	results.sort( sortOrder );
1490
1491
	if ( hasDuplicate ) {
1492
		while ( (elem = results[i++]) ) {
1493
			if ( elem === results[ i ] ) {
1494
				j = duplicates.push( i );
1495
			}
1496
		}
1497
		while ( j-- ) {
1498
			results.splice( duplicates[ j ], 1 );
1499
		}
1500
	}
1501
1502
	// Clear input after sorting to release objects
1503
	// See https://github.com/jquery/sizzle/pull/225
1504
	sortInput = null;
1505
1506
	return results;
1507
};
1508
1509
/**
1510
 * Utility function for retrieving the text value of an array of DOM nodes
1511
 * @param {Array|Element} elem
1512
 */
1513
getText = Sizzle.getText = function( elem ) {
1514
	var node,
1515
		ret = "",
1516
		i = 0,
1517
		nodeType = elem.nodeType;
1518
1519
	if ( !nodeType ) {
1520
		// If no nodeType, this is expected to be an array
1521
		while ( (node = elem[i++]) ) {
1522
			// Do not traverse comment nodes
1523
			ret += getText( node );
1524
		}
1525
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1526
		// Use textContent for elements
1527
		// innerText usage removed for consistency of new lines (jQuery #11153)
1528
		if ( typeof elem.textContent === "string" ) {
1529
			return elem.textContent;
1530
		} else {
1531
			// Traverse its children
1532
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1533
				ret += getText( elem );
1534
			}
1535
		}
1536
	} else if ( nodeType === 3 || nodeType === 4 ) {
1537
		return elem.nodeValue;
1538
	}
1539
	// Do not include comment or processing instruction nodes
1540
1541
	return ret;
1542
};
1543
1544
Expr = Sizzle.selectors = {
1545
1546
	// Can be adjusted by the user
1547
	cacheLength: 50,
1548
1549
	createPseudo: markFunction,
1550
1551
	match: matchExpr,
1552
1553
	attrHandle: {},
1554
1555
	find: {},
1556
1557
	relative: {
1558
		">": { dir: "parentNode", first: true },
1559
		" ": { dir: "parentNode" },
1560
		"+": { dir: "previousSibling", first: true },
1561
		"~": { dir: "previousSibling" }
1562
	},
1563
1564
	preFilter: {
1565
		"ATTR": function( match ) {
1566
			match[1] = match[1].replace( runescape, funescape );
1567
1568
			// Move the given value to match[3] whether quoted or unquoted
1569
			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1570
1571
			if ( match[2] === "~=" ) {
1572
				match[3] = " " + match[3] + " ";
1573
			}
1574
1575
			return match.slice( 0, 4 );
1576
		},
1577
1578
		"CHILD": function( match ) {
1579
			/* matches from matchExpr["CHILD"]
1580
				1 type (only|nth|...)
1581
				2 what (child|of-type)
1582
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1583
				4 xn-component of xn+y argument ([+-]?\d*n|)
1584
				5 sign of xn-component
1585
				6 x of xn-component
1586
				7 sign of y-component
1587
				8 y of y-component
1588
			*/
1589
			match[1] = match[1].toLowerCase();
1590
1591
			if ( match[1].slice( 0, 3 ) === "nth" ) {
1592
				// nth-* requires argument
1593
				if ( !match[3] ) {
1594
					Sizzle.error( match[0] );
1595
				}
1596
1597
				// numeric x and y parameters for Expr.filter.CHILD
1598
				// remember that false/true cast respectively to 0/1
1599
				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1600
				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1601
1602
			// other types prohibit arguments
1603
			} else if ( match[3] ) {
1604
				Sizzle.error( match[0] );
1605
			}
1606
1607
			return match;
1608
		},
1609
1610
		"PSEUDO": function( match ) {
1611
			var excess,
1612
				unquoted = !match[6] && match[2];
1613
1614
			if ( matchExpr["CHILD"].test( match[0] ) ) {
1615
				return null;
1616
			}
1617
1618
			// Accept quoted arguments as-is
1619
			if ( match[3] ) {
1620
				match[2] = match[4] || match[5] || "";
1621
1622
			// Strip excess characters from unquoted arguments
1623
			} else if ( unquoted && rpseudo.test( unquoted ) &&
1624
				// Get excess from tokenize (recursively)
1625
				(excess = tokenize( unquoted, true )) &&
1626
				// advance to the next closing parenthesis
1627
				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1628
1629
				// excess is a negative index
1630
				match[0] = match[0].slice( 0, excess );
1631
				match[2] = unquoted.slice( 0, excess );
1632
			}
1633
1634
			// Return only captures needed by the pseudo filter method (type and argument)
1635
			return match.slice( 0, 3 );
1636
		}
1637
	},
1638
1639
	filter: {
1640
1641
		"TAG": function( nodeNameSelector ) {
1642
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1643
			return nodeNameSelector === "*" ?
1644
				function() { return true; } :
1645
				function( elem ) {
1646
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1647
				};
1648
		},
1649
1650
		"CLASS": function( className ) {
1651
			var pattern = classCache[ className + " " ];
1652
1653
			return pattern ||
1654
				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1655
				classCache( className, function( elem ) {
1656
					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
1657
				});
1658
		},
1659
1660
		"ATTR": function( name, operator, check ) {
1661
			return function( elem ) {
1662
				var result = Sizzle.attr( elem, name );
1663
1664
				if ( result == null ) {
1665
					return operator === "!=";
1666
				}
1667
				if ( !operator ) {
1668
					return true;
1669
				}
1670
1671
				result += "";
1672
1673
				return operator === "=" ? result === check :
1674
					operator === "!=" ? result !== check :
1675
					operator === "^=" ? check && result.indexOf( check ) === 0 :
1676
					operator === "*=" ? check && result.indexOf( check ) > -1 :
1677
					operator === "$=" ? check && result.slice( -check.length ) === check :
1678
					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
1679
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1680
					false;
1681
			};
1682
		},
1683
1684
		"CHILD": function( type, what, argument, first, last ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1685
			var simple = type.slice( 0, 3 ) !== "nth",
1686
				forward = type.slice( -4 ) !== "last",
1687
				ofType = what === "of-type";
1688
1689
			return first === 1 && last === 0 ?
1690
1691
				// Shortcut for :nth-*(n)
1692
				function( elem ) {
1693
					return !!elem.parentNode;
1694
				} :
1695
1696
				function( elem, context, xml ) {
1697
					var cache, outerCache, node, diff, nodeIndex, start,
1698
						dir = simple !== forward ? "nextSibling" : "previousSibling",
1699
						parent = elem.parentNode,
1700
						name = ofType && elem.nodeName.toLowerCase(),
1701
						useCache = !xml && !ofType;
1702
1703
					if ( parent ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if parent is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
1704
1705
						// :(first|last|only)-(child|of-type)
1706
						if ( simple ) {
1707
							while ( dir ) {
1708
								node = elem;
1709
								while ( (node = node[ dir ]) ) {
1710
									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
1711
										return false;
1712
									}
1713
								}
1714
								// Reverse direction for :only-* (if we haven't yet done so)
1715
								start = dir = type === "only" && !start && "nextSibling";
1716
							}
1717
							return true;
1718
						}
1719
1720
						start = [ forward ? parent.firstChild : parent.lastChild ];
1721
1722
						// non-xml :nth-child(...) stores cache data on `parent`
1723
						if ( forward && useCache ) {
1724
							// Seek `elem` from a previously-cached index
1725
							outerCache = parent[ expando ] || (parent[ expando ] = {});
1726
							cache = outerCache[ type ] || [];
1727
							nodeIndex = cache[0] === dirruns && cache[1];
1728
							diff = cache[0] === dirruns && cache[2];
1729
							node = nodeIndex && parent.childNodes[ nodeIndex ];
1730
1731
							while ( (node = ++nodeIndex && node && node[ dir ] ||
1732
1733
								// Fallback to seeking `elem` from the start
1734
								(diff = nodeIndex = 0) || start.pop()) ) {
1735
1736
								// When found, cache indexes on `parent` and break
1737
								if ( node.nodeType === 1 && ++diff && node === elem ) {
1738
									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1739
									break;
1740
								}
1741
							}
1742
1743
						// Use previously-cached element index if available
1744
						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
1745
							diff = cache[1];
1746
1747
						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
1748
						} else {
1749
							// Use the same loop as above to seek `elem` from the start
1750
							while ( (node = ++nodeIndex && node && node[ dir ] ||
0 ignored issues
show
Comprehensibility Bug introduced by
The variable nodeIndex does not seem to be initialized in case the while loop on line 1750 is not entered. Are you sure this can never be the case?
Loading history...
1751
								(diff = nodeIndex = 0) || start.pop()) ) {
1752
1753
								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
0 ignored issues
show
Bug introduced by
The variable diff seems to not be initialized for all possible execution paths.
Loading history...
1754
									// Cache the index of each encountered element
1755
									if ( useCache ) {
1756
										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
1757
									}
1758
1759
									if ( node === elem ) {
1760
										break;
1761
									}
1762
								}
1763
							}
1764
						}
1765
1766
						// Incorporate the offset, then check against cycle size
1767
						diff -= last;
1768
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
1769
					}
1770
				};
1771
		},
1772
1773
		"PSEUDO": function( pseudo, argument ) {
1774
			// pseudo-class names are case-insensitive
1775
			// http://www.w3.org/TR/selectors/#pseudo-classes
1776
			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1777
			// Remember that setFilters inherits from pseudos
1778
			var args,
1779
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1780
					Sizzle.error( "unsupported pseudo: " + pseudo );
1781
1782
			// The user may use createPseudo to indicate that
1783
			// arguments are needed to create the filter function
1784
			// just as Sizzle does
1785
			if ( fn[ expando ] ) {
1786
				return fn( argument );
1787
			}
1788
1789
			// But maintain support for old signatures
1790
			if ( fn.length > 1 ) {
1791
				args = [ pseudo, pseudo, "", argument ];
1792
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1793
					markFunction(function( seed, matches ) {
1794
						var idx,
1795
							matched = fn( seed, argument ),
1796
							i = matched.length;
1797
						while ( i-- ) {
1798
							idx = indexOf.call( seed, matched[i] );
1799
							seed[ idx ] = !( matches[ idx ] = matched[i] );
1800
						}
1801
					}) :
1802
					function( elem ) {
1803
						return fn( elem, 0, args );
1804
					};
1805
			}
1806
1807
			return fn;
1808
		}
1809
	},
1810
1811
	pseudos: {
1812
		// Potentially complex pseudos
1813
		"not": markFunction(function( selector ) {
1814
			// Trim the selector passed to compile
1815
			// to avoid treating leading and trailing
1816
			// spaces as combinators
1817
			var input = [],
1818
				results = [],
1819
				matcher = compile( selector.replace( rtrim, "$1" ) );
1820
1821
			return matcher[ expando ] ?
1822
				markFunction(function( seed, matches, context, xml ) {
1823
					var elem,
1824
						unmatched = matcher( seed, null, xml, [] ),
1825
						i = seed.length;
1826
1827
					// Match elements unmatched by `matcher`
1828
					while ( i-- ) {
1829
						if ( (elem = unmatched[i]) ) {
1830
							seed[i] = !(matches[i] = elem);
1831
						}
1832
					}
1833
				}) :
1834
				function( elem, context, xml ) {
1835
					input[0] = elem;
1836
					matcher( input, null, xml, results );
1837
					return !results.pop();
1838
				};
1839
		}),
1840
1841
		"has": markFunction(function( selector ) {
1842
			return function( elem ) {
1843
				return Sizzle( selector, elem ).length > 0;
1844
			};
1845
		}),
1846
1847
		"contains": markFunction(function( text ) {
1848
			return function( elem ) {
1849
				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1850
			};
1851
		}),
1852
1853
		// "Whether an element is represented by a :lang() selector
1854
		// is based solely on the element's language value
1855
		// being equal to the identifier C,
1856
		// or beginning with the identifier C immediately followed by "-".
1857
		// The matching of C against the element's language value is performed case-insensitively.
1858
		// The identifier C does not have to be a valid language name."
1859
		// http://www.w3.org/TR/selectors/#lang-pseudo
1860
		"lang": markFunction( function( lang ) {
1861
			// lang value must be a valid identifier
1862
			if ( !ridentifier.test(lang || "") ) {
1863
				Sizzle.error( "unsupported lang: " + lang );
1864
			}
1865
			lang = lang.replace( runescape, funescape ).toLowerCase();
1866
			return function( elem ) {
1867
				var elemLang;
1868
				do {
1869
					if ( (elemLang = documentIsHTML ?
1870
						elem.lang :
1871
						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1872
1873
						elemLang = elemLang.toLowerCase();
1874
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1875
					}
1876
				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1877
				return false;
1878
			};
1879
		}),
1880
1881
		// Miscellaneous
1882
		"target": function( elem ) {
1883
			var hash = window.location && window.location.hash;
1884
			return hash && hash.slice( 1 ) === elem.id;
1885
		},
1886
1887
		"root": function( elem ) {
1888
			return elem === docElem;
1889
		},
1890
1891
		"focus": function( elem ) {
1892
			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1893
		},
1894
1895
		// Boolean properties
1896
		"enabled": function( elem ) {
1897
			return elem.disabled === false;
1898
		},
1899
1900
		"disabled": function( elem ) {
1901
			return elem.disabled === true;
1902
		},
1903
1904
		"checked": function( elem ) {
1905
			// In CSS3, :checked should return both checked and selected elements
1906
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1907
			var nodeName = elem.nodeName.toLowerCase();
1908
			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1909
		},
1910
1911
		"selected": function( elem ) {
1912
			// Accessing this property makes selected-by-default
1913
			// options in Safari work properly
1914
			if ( elem.parentNode ) {
1915
				elem.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to elem.parentNode.selectedIndex is not used.
Loading history...
1916
			}
1917
1918
			return elem.selected === true;
1919
		},
1920
1921
		// Contents
1922
		"empty": function( elem ) {
1923
			// http://www.w3.org/TR/selectors/#empty-pseudo
1924
			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1925
			//   but not by others (comment: 8; processing instruction: 7; etc.)
1926
			// nodeType < 6 works because attributes (2) do not appear as children
1927
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1928
				if ( elem.nodeType < 6 ) {
1929
					return false;
1930
				}
1931
			}
1932
			return true;
1933
		},
1934
1935
		"parent": function( elem ) {
1936
			return !Expr.pseudos["empty"]( elem );
1937
		},
1938
1939
		// Element/input types
1940
		"header": function( elem ) {
1941
			return rheader.test( elem.nodeName );
1942
		},
1943
1944
		"input": function( elem ) {
1945
			return rinputs.test( elem.nodeName );
1946
		},
1947
1948
		"button": function( elem ) {
1949
			var name = elem.nodeName.toLowerCase();
1950
			return name === "input" && elem.type === "button" || name === "button";
1951
		},
1952
1953
		"text": function( elem ) {
1954
			var attr;
1955
			return elem.nodeName.toLowerCase() === "input" &&
1956
				elem.type === "text" &&
1957
1958
				// Support: IE<8
1959
				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
1960
				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1961
		},
1962
1963
		// Position-in-collection
1964
		"first": createPositionalPseudo(function() {
1965
			return [ 0 ];
1966
		}),
1967
1968
		"last": createPositionalPseudo(function( matchIndexes, length ) {
1969
			return [ length - 1 ];
1970
		}),
1971
1972
		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
1973
			return [ argument < 0 ? argument + length : argument ];
1974
		}),
1975
1976
		"even": createPositionalPseudo(function( matchIndexes, length ) {
1977
			var i = 0;
1978
			for ( ; i < length; i += 2 ) {
1979
				matchIndexes.push( i );
1980
			}
1981
			return matchIndexes;
1982
		}),
1983
1984
		"odd": createPositionalPseudo(function( matchIndexes, length ) {
1985
			var i = 1;
1986
			for ( ; i < length; i += 2 ) {
1987
				matchIndexes.push( i );
1988
			}
1989
			return matchIndexes;
1990
		}),
1991
1992
		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1993
			var i = argument < 0 ? argument + length : argument;
1994
			for ( ; --i >= 0; ) {
1995
				matchIndexes.push( i );
1996
			}
1997
			return matchIndexes;
1998
		}),
1999
2000
		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
2001
			var i = argument < 0 ? argument + length : argument;
2002
			for ( ; ++i < length; ) {
2003
				matchIndexes.push( i );
2004
			}
2005
			return matchIndexes;
2006
		})
2007
	}
2008
};
2009
2010
Expr.pseudos["nth"] = Expr.pseudos["eq"];
2011
2012
// Add button/input type pseudos
2013
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
2014
	Expr.pseudos[ i ] = createInputPseudo( i );
2015
}
2016
for ( i in { submit: true, reset: true } ) {
2017
	Expr.pseudos[ i ] = createButtonPseudo( i );
2018
}
2019
2020
// Easy API for creating new setFilters
2021
function setFilters() {}
2022
setFilters.prototype = Expr.filters = Expr.pseudos;
2023
Expr.setFilters = new setFilters();
0 ignored issues
show
Coding Style Best Practice introduced by
By convention, constructors like setFilters should be capitalized.
Loading history...
2024
2025
tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
2026
	var matched, match, tokens, type,
2027
		soFar, groups, preFilters,
2028
		cached = tokenCache[ selector + " " ];
2029
2030
	if ( cached ) {
2031
		return parseOnly ? 0 : cached.slice( 0 );
2032
	}
2033
2034
	soFar = selector;
2035
	groups = [];
2036
	preFilters = Expr.preFilter;
2037
2038
	while ( soFar ) {
2039
2040
		// Comma and first run
2041
		if ( !matched || (match = rcomma.exec( soFar )) ) {
2042
			if ( match ) {
2043
				// Don't consume trailing commas as valid
2044
				soFar = soFar.slice( match[0].length ) || soFar;
2045
			}
2046
			groups.push( (tokens = []) );
2047
		}
2048
2049
		matched = false;
2050
2051
		// Combinators
2052
		if ( (match = rcombinators.exec( soFar )) ) {
2053
			matched = match.shift();
2054
			tokens.push({
0 ignored issues
show
Bug introduced by
The variable tokens seems to not be initialized for all possible execution paths.
Loading history...
2055
				value: matched,
2056
				// Cast descendant combinators to space
2057
				type: match[0].replace( rtrim, " " )
2058
			});
2059
			soFar = soFar.slice( matched.length );
2060
		}
2061
2062
		// Filters
2063
		for ( type in Expr.filter ) {
2064
			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2065
				(match = preFilters[ type ]( match ))) ) {
2066
				matched = match.shift();
2067
				tokens.push({
2068
					value: matched,
2069
					type: type,
2070
					matches: match
2071
				});
2072
				soFar = soFar.slice( matched.length );
2073
			}
2074
		}
2075
2076
		if ( !matched ) {
2077
			break;
2078
		}
2079
	}
2080
2081
	// Return the length of the invalid excess
2082
	// if we're just parsing
2083
	// Otherwise, throw an error or return tokens
2084
	return parseOnly ?
2085
		soFar.length :
2086
		soFar ?
2087
			Sizzle.error( selector ) :
2088
			// Cache the tokens
2089
			tokenCache( selector, groups ).slice( 0 );
2090
};
2091
2092
function toSelector( tokens ) {
2093
	var i = 0,
2094
		len = tokens.length,
2095
		selector = "";
2096
	for ( ; i < len; i++ ) {
2097
		selector += tokens[i].value;
2098
	}
2099
	return selector;
2100
}
2101
2102
function addCombinator( matcher, combinator, base ) {
2103
	var dir = combinator.dir,
2104
		checkNonElements = base && dir === "parentNode",
2105
		doneName = done++;
2106
2107
	return combinator.first ?
2108
		// Check against closest ancestor/preceding element
2109
		function( elem, context, xml ) {
2110
			while ( (elem = elem[ dir ]) ) {
2111
				if ( elem.nodeType === 1 || checkNonElements ) {
2112
					return matcher( elem, context, xml );
2113
				}
2114
			}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2115
		} :
2116
2117
		// Check against all ancestor/preceding elements
2118
		function( elem, context, xml ) {
2119
			var oldCache, outerCache,
2120
				newCache = [ dirruns, doneName ];
2121
2122
			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
2123
			if ( xml ) {
2124
				while ( (elem = elem[ dir ]) ) {
2125
					if ( elem.nodeType === 1 || checkNonElements ) {
2126
						if ( matcher( elem, context, xml ) ) {
2127
							return true;
2128
						}
2129
					}
2130
				}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2131
			} else {
2132
				while ( (elem = elem[ dir ]) ) {
2133
					if ( elem.nodeType === 1 || checkNonElements ) {
2134
						outerCache = elem[ expando ] || (elem[ expando ] = {});
2135
						if ( (oldCache = outerCache[ dir ]) &&
2136
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2137
2138
							// Assign to newCache so results back-propagate to previous elements
2139
							return (newCache[ 2 ] = oldCache[ 2 ]);
2140
						} else {
2141
							// Reuse newcache so results back-propagate to previous elements
2142
							outerCache[ dir ] = newCache;
2143
2144
							// A match means we're done; a fail means we have to keep checking
2145
							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2146
								return true;
2147
							}
2148
						}
2149
					}
2150
				}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2151
			}
2152
		};
2153
}
2154
2155
function elementMatcher( matchers ) {
2156
	return matchers.length > 1 ?
2157
		function( elem, context, xml ) {
2158
			var i = matchers.length;
2159
			while ( i-- ) {
2160
				if ( !matchers[i]( elem, context, xml ) ) {
2161
					return false;
2162
				}
2163
			}
2164
			return true;
2165
		} :
2166
		matchers[0];
2167
}
2168
2169
function multipleContexts( selector, contexts, results ) {
2170
	var i = 0,
2171
		len = contexts.length;
2172
	for ( ; i < len; i++ ) {
2173
		Sizzle( selector, contexts[i], results );
2174
	}
2175
	return results;
2176
}
2177
2178
function condense( unmatched, map, filter, context, xml ) {
2179
	var elem,
2180
		newUnmatched = [],
2181
		i = 0,
2182
		len = unmatched.length,
2183
		mapped = map != null;
2184
2185
	for ( ; i < len; i++ ) {
2186
		if ( (elem = unmatched[i]) ) {
2187
			if ( !filter || filter( elem, context, xml ) ) {
2188
				newUnmatched.push( elem );
2189
				if ( mapped ) {
2190
					map.push( i );
2191
				}
2192
			}
2193
		}
2194
	}
2195
2196
	return newUnmatched;
2197
}
2198
2199
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2200
	if ( postFilter && !postFilter[ expando ] ) {
2201
		postFilter = setMatcher( postFilter );
2202
	}
2203
	if ( postFinder && !postFinder[ expando ] ) {
2204
		postFinder = setMatcher( postFinder, postSelector );
2205
	}
2206
	return markFunction(function( seed, results, context, xml ) {
2207
		var temp, i, elem,
2208
			preMap = [],
2209
			postMap = [],
2210
			preexisting = results.length,
2211
2212
			// Get initial elements from seed or context
2213
			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2214
2215
			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2216
			matcherIn = preFilter && ( seed || !selector ) ?
2217
				condense( elems, preMap, preFilter, context, xml ) :
2218
				elems,
2219
2220
			matcherOut = matcher ?
2221
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2222
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2223
2224
					// ...intermediate processing is necessary
2225
					[] :
2226
2227
					// ...otherwise use results directly
2228
					results :
2229
				matcherIn;
2230
2231
		// Find primary matches
2232
		if ( matcher ) {
2233
			matcher( matcherIn, matcherOut, context, xml );
2234
		}
2235
2236
		// Apply postFilter
2237
		if ( postFilter ) {
2238
			temp = condense( matcherOut, postMap );
2239
			postFilter( temp, [], context, xml );
2240
2241
			// Un-match failing elements by moving them back to matcherIn
2242
			i = temp.length;
2243
			while ( i-- ) {
2244
				if ( (elem = temp[i]) ) {
2245
					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2246
				}
2247
			}
2248
		}
2249
2250
		if ( seed ) {
2251
			if ( postFinder || preFilter ) {
2252
				if ( postFinder ) {
2253
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2254
					temp = [];
2255
					i = matcherOut.length;
2256
					while ( i-- ) {
2257
						if ( (elem = matcherOut[i]) ) {
2258
							// Restore matcherIn since elem is not yet a final match
2259
							temp.push( (matcherIn[i] = elem) );
2260
						}
2261
					}
2262
					postFinder( null, (matcherOut = []), temp, xml );
2263
				}
2264
2265
				// Move matched elements from seed to results to keep them synchronized
2266
				i = matcherOut.length;
2267
				while ( i-- ) {
2268
					if ( (elem = matcherOut[i]) &&
2269
						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
2270
2271
						seed[temp] = !(results[temp] = elem);
2272
					}
2273
				}
2274
			}
2275
2276
		// Add elements to results, through postFinder if defined
2277
		} else {
2278
			matcherOut = condense(
2279
				matcherOut === results ?
2280
					matcherOut.splice( preexisting, matcherOut.length ) :
2281
					matcherOut
2282
			);
2283
			if ( postFinder ) {
2284
				postFinder( null, results, matcherOut, xml );
2285
			} else {
2286
				push.apply( results, matcherOut );
2287
			}
2288
		}
2289
	});
2290
}
2291
2292
function matcherFromTokens( tokens ) {
2293
	var checkContext, matcher, j,
2294
		len = tokens.length,
2295
		leadingRelative = Expr.relative[ tokens[0].type ],
2296
		implicitRelative = leadingRelative || Expr.relative[" "],
2297
		i = leadingRelative ? 1 : 0,
2298
2299
		// The foundational matcher ensures that elements are reachable from top-level context(s)
2300
		matchContext = addCombinator( function( elem ) {
2301
			return elem === checkContext;
2302
		}, implicitRelative, true ),
2303
		matchAnyContext = addCombinator( function( elem ) {
2304
			return indexOf.call( checkContext, elem ) > -1;
2305
		}, implicitRelative, true ),
2306
		matchers = [ function( elem, context, xml ) {
2307
			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2308
				(checkContext = context).nodeType ?
2309
					matchContext( elem, context, xml ) :
2310
					matchAnyContext( elem, context, xml ) );
2311
		} ];
2312
2313
	for ( ; i < len; i++ ) {
2314
		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2315
			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2316
		} else {
2317
			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2318
2319
			// Return special upon seeing a positional matcher
2320
			if ( matcher[ expando ] ) {
2321
				// Find the next relative operator (if any) for proper handling
2322
				j = ++i;
2323
				for ( ; j < len; j++ ) {
2324
					if ( Expr.relative[ tokens[j].type ] ) {
2325
						break;
2326
					}
2327
				}
2328
				return setMatcher(
2329
					i > 1 && elementMatcher( matchers ),
2330
					i > 1 && toSelector(
2331
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2332
						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2333
					).replace( rtrim, "$1" ),
2334
					matcher,
2335
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2336
					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2337
					j < len && toSelector( tokens )
2338
				);
2339
			}
2340
			matchers.push( matcher );
2341
		}
2342
	}
2343
2344
	return elementMatcher( matchers );
2345
}
2346
2347
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2348
	var bySet = setMatchers.length > 0,
2349
		byElement = elementMatchers.length > 0,
2350
		superMatcher = function( seed, context, xml, results, outermost ) {
2351
			var elem, j, matcher,
2352
				matchedCount = 0,
2353
				i = "0",
2354
				unmatched = seed && [],
2355
				setMatched = [],
2356
				contextBackup = outermostContext,
2357
				// We must always have either seed elements or outermost context
2358
				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2359
				// Use integer dirruns iff this is the outermost matcher
2360
				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2361
				len = elems.length;
2362
2363
			if ( outermost ) {
2364
				outermostContext = context !== document && context;
2365
			}
2366
2367
			// Add elements passing elementMatchers directly to results
2368
			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
2369
			// Support: IE<9, Safari
2370
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2371
			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2372
				if ( byElement && elem ) {
2373
					j = 0;
2374
					while ( (matcher = elementMatchers[j++]) ) {
2375
						if ( matcher( elem, context, xml ) ) {
2376
							results.push( elem );
2377
							break;
2378
						}
2379
					}
2380
					if ( outermost ) {
2381
						dirruns = dirrunsUnique;
2382
					}
2383
				}
2384
2385
				// Track unmatched elements for set filters
2386
				if ( bySet ) {
2387
					// They will have gone through all possible matchers
2388
					if ( (elem = !matcher && elem) ) {
2389
						matchedCount--;
2390
					}
2391
2392
					// Lengthen the array for every element, matched or not
2393
					if ( seed ) {
2394
						unmatched.push( elem );
2395
					}
2396
				}
2397
			}
2398
2399
			// Apply set filters to unmatched elements
2400
			matchedCount += i;
2401
			if ( bySet && i !== matchedCount ) {
2402
				j = 0;
2403
				while ( (matcher = setMatchers[j++]) ) {
2404
					matcher( unmatched, setMatched, context, xml );
2405
				}
2406
2407
				if ( seed ) {
2408
					// Reintegrate element matches to eliminate the need for sorting
2409
					if ( matchedCount > 0 ) {
2410
						while ( i-- ) {
2411
							if ( !(unmatched[i] || setMatched[i]) ) {
2412
								setMatched[i] = pop.call( results );
2413
							}
2414
						}
2415
					}
2416
2417
					// Discard index placeholder values to get only actual matches
2418
					setMatched = condense( setMatched );
2419
				}
2420
2421
				// Add matches to results
2422
				push.apply( results, setMatched );
2423
2424
				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2425
				if ( outermost && !seed && setMatched.length > 0 &&
2426
					( matchedCount + setMatchers.length ) > 1 ) {
2427
2428
					Sizzle.uniqueSort( results );
2429
				}
2430
			}
2431
2432
			// Override manipulation of globals by nested matchers
2433
			if ( outermost ) {
2434
				dirruns = dirrunsUnique;
2435
				outermostContext = contextBackup;
2436
			}
2437
2438
			return unmatched;
2439
		};
2440
2441
	return bySet ?
2442
		markFunction( superMatcher ) :
2443
		superMatcher;
2444
}
2445
2446
compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2447
	var i,
2448
		setMatchers = [],
2449
		elementMatchers = [],
2450
		cached = compilerCache[ selector + " " ];
2451
2452
	if ( !cached ) {
2453
		// Generate a function of recursive functions that can be used to check each element
2454
		if ( !match ) {
2455
			match = tokenize( selector );
2456
		}
2457
		i = match.length;
2458
		while ( i-- ) {
2459
			cached = matcherFromTokens( match[i] );
2460
			if ( cached[ expando ] ) {
2461
				setMatchers.push( cached );
2462
			} else {
2463
				elementMatchers.push( cached );
2464
			}
2465
		}
2466
2467
		// Cache the compiled function
2468
		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2469
2470
		// Save selector and tokenization
2471
		cached.selector = selector;
2472
	}
2473
	return cached;
2474
};
2475
2476
/**
2477
 * A low-level selection function that works with Sizzle's compiled
2478
 *  selector functions
2479
 * @param {String|Function} selector A selector or a pre-compiled
2480
 *  selector function built with Sizzle.compile
2481
 * @param {Element} context
2482
 * @param {Array} [results]
2483
 * @param {Array} [seed] A set of elements to match against
2484
 */
2485
select = Sizzle.select = function( selector, context, results, seed ) {
2486
	var i, tokens, token, type, find,
2487
		compiled = typeof selector === "function" && selector,
2488
		match = !seed && tokenize( (selector = compiled.selector || selector) );
2489
2490
	results = results || [];
2491
2492
	// Try to minimize operations if there is no seed and only one group
2493
	if ( match.length === 1 ) {
2494
2495
		// Take a shortcut and set the context if the root selector is an ID
2496
		tokens = match[0] = match[0].slice( 0 );
2497
		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2498
				support.getById && context.nodeType === 9 && documentIsHTML &&
2499
				Expr.relative[ tokens[1].type ] ) {
2500
2501
			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2502
			if ( !context ) {
2503
				return results;
2504
2505
			// Precompiled matchers will still verify ancestry, so step up a level
2506
			} else if ( compiled ) {
2507
				context = context.parentNode;
2508
			}
2509
2510
			selector = selector.slice( tokens.shift().value.length );
2511
		}
2512
2513
		// Fetch a seed set for right-to-left matching
2514
		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2515
		while ( i-- ) {
2516
			token = tokens[i];
2517
2518
			// Abort if we hit a combinator
2519
			if ( Expr.relative[ (type = token.type) ] ) {
2520
				break;
2521
			}
2522
			if ( (find = Expr.find[ type ]) ) {
2523
				// Search, expanding context for leading sibling combinators
2524
				if ( (seed = find(
2525
					token.matches[0].replace( runescape, funescape ),
2526
					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2527
				)) ) {
2528
2529
					// If seed is empty or no tokens remain, we can return early
2530
					tokens.splice( i, 1 );
2531
					selector = seed.length && toSelector( tokens );
2532
					if ( !selector ) {
2533
						push.apply( results, seed );
2534
						return results;
2535
					}
2536
2537
					break;
2538
				}
2539
			}
2540
		}
2541
	}
2542
2543
	// Compile and execute a filtering function if one is not provided
2544
	// Provide `match` to avoid retokenization if we modified the selector above
2545
	( compiled || compile( selector, match ) )(
2546
		seed,
2547
		context,
2548
		!documentIsHTML,
0 ignored issues
show
Bug introduced by
The variable documentIsHTML seems to not be initialized for all possible execution paths.
Loading history...
2549
		results,
2550
		rsibling.test( selector ) && testContext( context.parentNode ) || context
2551
	);
2552
	return results;
2553
};
2554
2555
// One-time assignments
2556
2557
// Sort stability
2558
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2559
2560
// Support: Chrome<14
2561
// Always assume duplicates if they aren't passed to the comparison function
2562
support.detectDuplicates = !!hasDuplicate;
2563
2564
// Initialize against the default document
2565
setDocument();
2566
2567
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2568
// Detached nodes confoundingly follow *each other*
2569
support.sortDetached = assert(function( div1 ) {
2570
	// Should return 1, but returns 4 (following)
2571
	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
2572
});
2573
2574
// Support: IE<8
2575
// Prevent attribute/property "interpolation"
2576
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2577
if ( !assert(function( div ) {
2578
	div.innerHTML = "<a href='#'></a>";
2579
	return div.firstChild.getAttribute("href") === "#" ;
2580
}) ) {
2581
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2582
		if ( !isXML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !isXML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
2583
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2584
		}
2585
	});
2586
}
2587
2588
// Support: IE<9
2589
// Use defaultValue in place of getAttribute("value")
2590
if ( !support.attributes || !assert(function( div ) {
2591
	div.innerHTML = "<input/>";
2592
	div.firstChild.setAttribute( "value", "" );
2593
	return div.firstChild.getAttribute( "value" ) === "";
2594
}) ) {
2595
	addHandle( "value", function( elem, name, isXML ) {
2596
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !isXML && elem.nodeName.toLowerCase() === "input" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
2597
			return elem.defaultValue;
2598
		}
2599
	});
2600
}
2601
2602
// Support: IE<9
2603
// Use getAttributeNode to fetch booleans when getAttribute lies
2604
if ( !assert(function( div ) {
2605
	return div.getAttribute("disabled") == null;
2606
}) ) {
2607
	addHandle( booleans, function( elem, name, isXML ) {
2608
		var val;
2609
		if ( !isXML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !isXML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
2610
			return elem[ name ] === true ? name.toLowerCase() :
2611
					(val = elem.getAttributeNode( name )) && val.specified ?
2612
					val.value :
2613
				null;
2614
		}
2615
	});
2616
}
2617
2618
return Sizzle;
2619
2620
})( window );
2621
2622
2623
2624
jQuery.find = Sizzle;
2625
jQuery.expr = Sizzle.selectors;
2626
jQuery.expr[":"] = jQuery.expr.pseudos;
2627
jQuery.unique = Sizzle.uniqueSort;
2628
jQuery.text = Sizzle.getText;
2629
jQuery.isXMLDoc = Sizzle.isXML;
2630
jQuery.contains = Sizzle.contains;
2631
2632
2633
2634
var rneedsContext = jQuery.expr.match.needsContext;
2635
2636
var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
2637
2638
2639
2640
var risSimple = /^.[^:#\[\.,]*$/;
2641
2642
// Implement the identical functionality for filter and not
2643
function winnow( elements, qualifier, not ) {
2644
	if ( jQuery.isFunction( qualifier ) ) {
2645
		return jQuery.grep( elements, function( elem, i ) {
2646
			/* jshint -W018 */
2647
			return !!qualifier.call( elem, i, elem ) !== not;
2648
		});
2649
2650
	}
2651
2652
	if ( qualifier.nodeType ) {
2653
		return jQuery.grep( elements, function( elem ) {
2654
			return ( elem === qualifier ) !== not;
2655
		});
2656
2657
	}
2658
2659
	if ( typeof qualifier === "string" ) {
2660
		if ( risSimple.test( qualifier ) ) {
2661
			return jQuery.filter( qualifier, elements, not );
2662
		}
2663
2664
		qualifier = jQuery.filter( qualifier, elements );
2665
	}
2666
2667
	return jQuery.grep( elements, function( elem ) {
2668
		return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;
2669
	});
2670
}
2671
2672
jQuery.filter = function( expr, elems, not ) {
2673
	var elem = elems[ 0 ];
2674
2675
	if ( not ) {
2676
		expr = ":not(" + expr + ")";
2677
	}
2678
2679
	return elems.length === 1 && elem.nodeType === 1 ?
2680
		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
2681
		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2682
			return elem.nodeType === 1;
2683
		}));
2684
};
2685
2686
jQuery.fn.extend({
2687
	find: function( selector ) {
2688
		var i,
2689
			ret = [],
2690
			self = this,
2691
			len = self.length;
2692
2693
		if ( typeof selector !== "string" ) {
2694
			return this.pushStack( jQuery( selector ).filter(function() {
2695
				for ( i = 0; i < len; i++ ) {
0 ignored issues
show
Bug introduced by
The variable i is changed as part of the for loop for example by i++ on line 2695. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
2696
					if ( jQuery.contains( self[ i ], this ) ) {
2697
						return true;
2698
					}
2699
				}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2700
			}) );
2701
		}
2702
2703
		for ( i = 0; i < len; i++ ) {
2704
			jQuery.find( selector, self[ i ], ret );
2705
		}
2706
2707
		// Needed because $( selector, context ) becomes $( context ).find( selector )
2708
		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
2709
		ret.selector = this.selector ? this.selector + " " + selector : selector;
2710
		return ret;
2711
	},
2712
	filter: function( selector ) {
2713
		return this.pushStack( winnow(this, selector || [], false) );
2714
	},
2715
	not: function( selector ) {
2716
		return this.pushStack( winnow(this, selector || [], true) );
2717
	},
2718
	is: function( selector ) {
2719
		return !!winnow(
2720
			this,
2721
2722
			// If this is a positional/relative selector, check membership in the returned set
2723
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
2724
			typeof selector === "string" && rneedsContext.test( selector ) ?
2725
				jQuery( selector ) :
2726
				selector || [],
2727
			false
2728
		).length;
2729
	}
2730
});
2731
2732
2733
// Initialize a jQuery object
2734
2735
2736
// A central reference to the root jQuery(document)
2737
var rootjQuery,
2738
2739
	// Use the correct document accordingly with window argument (sandbox)
2740
	document = window.document,
2741
2742
	// A simple way to check for HTML strings
2743
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2744
	// Strict HTML recognition (#11290: must start with <)
2745
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
2746
2747
	init = jQuery.fn.init = function( selector, context ) {
2748
		var match, elem;
2749
2750
		// HANDLE: $(""), $(null), $(undefined), $(false)
2751
		if ( !selector ) {
2752
			return this;
2753
		}
2754
2755
		// Handle HTML strings
2756
		if ( typeof selector === "string" ) {
2757
			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
2758
				// Assume that strings that start and end with <> are HTML and skip the regex check
2759
				match = [ null, selector, null ];
2760
2761
			} else {
2762
				match = rquickExpr.exec( selector );
2763
			}
2764
2765
			// Match html or make sure no context is specified for #id
2766
			if ( match && (match[1] || !context) ) {
2767
2768
				// HANDLE: $(html) -> $(array)
2769
				if ( match[1] ) {
2770
					context = context instanceof jQuery ? context[0] : context;
2771
2772
					// scripts is true for back-compat
2773
					// Intentionally let the error be thrown if parseHTML is not present
2774
					jQuery.merge( this, jQuery.parseHTML(
2775
						match[1],
2776
						context && context.nodeType ? context.ownerDocument || context : document,
2777
						true
2778
					) );
2779
2780
					// HANDLE: $(html, props)
2781
					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
2782
						for ( match in context ) {
2783
							// Properties of context are called as methods if possible
2784
							if ( jQuery.isFunction( this[ match ] ) ) {
2785
								this[ match ]( context[ match ] );
2786
2787
							// ...and otherwise set as attributes
2788
							} else {
2789
								this.attr( match, context[ match ] );
2790
							}
2791
						}
2792
					}
2793
2794
					return this;
2795
2796
				// HANDLE: $(#id)
2797
				} else {
2798
					elem = document.getElementById( match[2] );
2799
2800
					// Check parentNode to catch when Blackberry 4.6 returns
2801
					// nodes that are no longer in the document #6963
2802
					if ( elem && elem.parentNode ) {
2803
						// Handle the case where IE and Opera return items
2804
						// by name instead of ID
2805
						if ( elem.id !== match[2] ) {
2806
							return rootjQuery.find( selector );
2807
						}
2808
2809
						// Otherwise, we inject the element directly into the jQuery object
2810
						this.length = 1;
2811
						this[0] = elem;
2812
					}
2813
2814
					this.context = document;
2815
					this.selector = selector;
2816
					return this;
2817
				}
2818
2819
			// HANDLE: $(expr, $(...))
2820
			} else if ( !context || context.jquery ) {
2821
				return ( context || rootjQuery ).find( selector );
2822
2823
			// HANDLE: $(expr, context)
2824
			// (which is just equivalent to: $(context).find(expr)
2825
			} else {
2826
				return this.constructor( context ).find( selector );
2827
			}
2828
2829
		// HANDLE: $(DOMElement)
2830
		} else if ( selector.nodeType ) {
2831
			this.context = this[0] = selector;
2832
			this.length = 1;
2833
			return this;
2834
2835
		// HANDLE: $(function)
2836
		// Shortcut for document ready
2837
		} else if ( jQuery.isFunction( selector ) ) {
2838
			return typeof rootjQuery.ready !== "undefined" ?
2839
				rootjQuery.ready( selector ) :
2840
				// Execute immediately if ready is not present
2841
				selector( jQuery );
2842
		}
2843
2844
		if ( selector.selector !== undefined ) {
2845
			this.selector = selector.selector;
2846
			this.context = selector.context;
2847
		}
2848
2849
		return jQuery.makeArray( selector, this );
2850
	};
2851
2852
// Give the init function the jQuery prototype for later instantiation
2853
init.prototype = jQuery.fn;
2854
2855
// Initialize central reference
2856
rootjQuery = jQuery( document );
2857
2858
2859
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2860
	// methods guaranteed to produce a unique set when starting from a unique set
2861
	guaranteedUnique = {
2862
		children: true,
2863
		contents: true,
2864
		next: true,
2865
		prev: true
2866
	};
2867
2868
jQuery.extend({
2869
	dir: function( elem, dir, until ) {
2870
		var matched = [],
2871
			cur = elem[ dir ];
2872
2873
		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
2874
			if ( cur.nodeType === 1 ) {
2875
				matched.push( cur );
2876
			}
2877
			cur = cur[dir];
2878
		}
2879
		return matched;
2880
	},
2881
2882
	sibling: function( n, elem ) {
2883
		var r = [];
2884
2885
		for ( ; n; n = n.nextSibling ) {
2886
			if ( n.nodeType === 1 && n !== elem ) {
2887
				r.push( n );
2888
			}
2889
		}
2890
2891
		return r;
2892
	}
2893
});
2894
2895
jQuery.fn.extend({
2896
	has: function( target ) {
2897
		var i,
2898
			targets = jQuery( target, this ),
2899
			len = targets.length;
2900
2901
		return this.filter(function() {
2902
			for ( i = 0; i < len; i++ ) {
0 ignored issues
show
Bug introduced by
The variable i is changed as part of the for loop for example by i++ on line 2902. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
2903
				if ( jQuery.contains( this, targets[i] ) ) {
2904
					return true;
2905
				}
2906
			}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2907
		});
2908
	},
2909
2910
	closest: function( selectors, context ) {
2911
		var cur,
2912
			i = 0,
2913
			l = this.length,
2914
			matched = [],
2915
			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
2916
				jQuery( selectors, context || this.context ) :
2917
				0;
2918
2919
		for ( ; i < l; i++ ) {
2920
			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
2921
				// Always skip document fragments
2922
				if ( cur.nodeType < 11 && (pos ?
2923
					pos.index(cur) > -1 :
2924
2925
					// Don't pass non-elements to Sizzle
2926
					cur.nodeType === 1 &&
2927
						jQuery.find.matchesSelector(cur, selectors)) ) {
2928
2929
					matched.push( cur );
2930
					break;
2931
				}
2932
			}
2933
		}
2934
2935
		return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
2936
	},
2937
2938
	// Determine the position of an element within
2939
	// the matched set of elements
2940
	index: function( elem ) {
2941
2942
		// No argument, return index in parent
2943
		if ( !elem ) {
2944
			return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
2945
		}
2946
2947
		// index in selector
2948
		if ( typeof elem === "string" ) {
2949
			return jQuery.inArray( this[0], jQuery( elem ) );
2950
		}
2951
2952
		// Locate the position of the desired element
2953
		return jQuery.inArray(
2954
			// If it receives a jQuery object, the first element is used
2955
			elem.jquery ? elem[0] : elem, this );
2956
	},
2957
2958
	add: function( selector, context ) {
2959
		return this.pushStack(
2960
			jQuery.unique(
2961
				jQuery.merge( this.get(), jQuery( selector, context ) )
2962
			)
2963
		);
2964
	},
2965
2966
	addBack: function( selector ) {
2967
		return this.add( selector == null ?
2968
			this.prevObject : this.prevObject.filter(selector)
2969
		);
2970
	}
2971
});
2972
2973
function sibling( cur, dir ) {
2974
	do {
2975
		cur = cur[ dir ];
2976
	} while ( cur && cur.nodeType !== 1 );
2977
2978
	return cur;
2979
}
2980
2981
jQuery.each({
2982
	parent: function( elem ) {
2983
		var parent = elem.parentNode;
2984
		return parent && parent.nodeType !== 11 ? parent : null;
2985
	},
2986
	parents: function( elem ) {
2987
		return jQuery.dir( elem, "parentNode" );
2988
	},
2989
	parentsUntil: function( elem, i, until ) {
2990
		return jQuery.dir( elem, "parentNode", until );
2991
	},
2992
	next: function( elem ) {
2993
		return sibling( elem, "nextSibling" );
2994
	},
2995
	prev: function( elem ) {
2996
		return sibling( elem, "previousSibling" );
2997
	},
2998
	nextAll: function( elem ) {
2999
		return jQuery.dir( elem, "nextSibling" );
3000
	},
3001
	prevAll: function( elem ) {
3002
		return jQuery.dir( elem, "previousSibling" );
3003
	},
3004
	nextUntil: function( elem, i, until ) {
3005
		return jQuery.dir( elem, "nextSibling", until );
3006
	},
3007
	prevUntil: function( elem, i, until ) {
3008
		return jQuery.dir( elem, "previousSibling", until );
3009
	},
3010
	siblings: function( elem ) {
3011
		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
3012
	},
3013
	children: function( elem ) {
3014
		return jQuery.sibling( elem.firstChild );
3015
	},
3016
	contents: function( elem ) {
3017
		return jQuery.nodeName( elem, "iframe" ) ?
3018
			elem.contentDocument || elem.contentWindow.document :
3019
			jQuery.merge( [], elem.childNodes );
3020
	}
3021
}, function( name, fn ) {
3022
	jQuery.fn[ name ] = function( until, selector ) {
3023
		var ret = jQuery.map( this, fn, until );
3024
3025
		if ( name.slice( -5 ) !== "Until" ) {
3026
			selector = until;
3027
		}
3028
3029
		if ( selector && typeof selector === "string" ) {
3030
			ret = jQuery.filter( selector, ret );
3031
		}
3032
3033
		if ( this.length > 1 ) {
3034
			// Remove duplicates
3035
			if ( !guaranteedUnique[ name ] ) {
3036
				ret = jQuery.unique( ret );
3037
			}
3038
3039
			// Reverse order for parents* and prev-derivatives
3040
			if ( rparentsprev.test( name ) ) {
3041
				ret = ret.reverse();
3042
			}
3043
		}
3044
3045
		return this.pushStack( ret );
3046
	};
3047
});
3048
var rnotwhite = (/\S+/g);
3049
3050
3051
3052
// String to Object options format cache
3053
var optionsCache = {};
3054
3055
// Convert String-formatted options into Object-formatted ones and store in cache
3056
function createOptions( options ) {
3057
	var object = optionsCache[ options ] = {};
3058
	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
3059
		object[ flag ] = true;
3060
	});
3061
	return object;
3062
}
3063
3064
/*
3065
 * Create a callback list using the following parameters:
3066
 *
3067
 *	options: an optional list of space-separated options that will change how
3068
 *			the callback list behaves or a more traditional option object
3069
 *
3070
 * By default a callback list will act like an event callback list and can be
3071
 * "fired" multiple times.
3072
 *
3073
 * Possible options:
3074
 *
3075
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3076
 *
3077
 *	memory:			will keep track of previous values and will call any callback added
3078
 *					after the list has been fired right away with the latest "memorized"
3079
 *					values (like a Deferred)
3080
 *
3081
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3082
 *
3083
 *	stopOnFalse:	interrupt callings when a callback returns false
3084
 *
3085
 */
3086
jQuery.Callbacks = function( options ) {
3087
3088
	// Convert options from String-formatted to Object-formatted if needed
3089
	// (we check in cache first)
3090
	options = typeof options === "string" ?
3091
		( optionsCache[ options ] || createOptions( options ) ) :
3092
		jQuery.extend( {}, options );
3093
3094
	var // Flag to know if list is currently firing
3095
		firing,
3096
		// Last fire value (for non-forgettable lists)
3097
		memory,
3098
		// Flag to know if list was already fired
3099
		fired,
3100
		// End of the loop when firing
3101
		firingLength,
3102
		// Index of currently firing callback (modified by remove if needed)
3103
		firingIndex,
3104
		// First callback to fire (used internally by add and fireWith)
3105
		firingStart,
3106
		// Actual callback list
3107
		list = [],
3108
		// Stack of fire calls for repeatable lists
3109
		stack = !options.once && [],
3110
		// Fire callbacks
3111
		fire = function( data ) {
3112
			memory = options.memory && data;
3113
			fired = true;
3114
			firingIndex = firingStart || 0;
3115
			firingStart = 0;
3116
			firingLength = list.length;
3117
			firing = true;
3118
			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
0 ignored issues
show
Bug introduced by
The variable firingIndex is changed as part of the for loop for example by firingIndex++ on line 3118. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
3119
				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
3120
					memory = false; // To prevent further calls using add
3121
					break;
3122
				}
3123
			}
3124
			firing = false;
3125
			if ( list ) {
3126
				if ( stack ) {
3127
					if ( stack.length ) {
3128
						fire( stack.shift() );
3129
					}
3130
				} else if ( memory ) {
3131
					list = [];
3132
				} else {
3133
					self.disable();
3134
				}
3135
			}
3136
		},
3137
		// Actual Callbacks object
3138
		self = {
3139
			// Add a callback or a collection of callbacks to the list
3140
			add: function() {
3141
				if ( list ) {
3142
					// First, we save the current length
3143
					var start = list.length;
3144
					(function add( args ) {
3145
						jQuery.each( args, function( _, arg ) {
3146
							var type = jQuery.type( arg );
3147
							if ( type === "function" ) {
3148
								if ( !options.unique || !self.has( arg ) ) {
3149
									list.push( arg );
3150
								}
3151
							} else if ( arg && arg.length && type !== "string" ) {
3152
								// Inspect recursively
3153
								add( arg );
3154
							}
3155
						});
3156
					})( arguments );
3157
					// Do we need to add the callbacks to the
3158
					// current firing batch?
3159
					if ( firing ) {
3160
						firingLength = list.length;
3161
					// With memory, if we're not firing then
3162
					// we should call right away
3163
					} else if ( memory ) {
3164
						firingStart = start;
3165
						fire( memory );
3166
					}
3167
				}
3168
				return this;
3169
			},
3170
			// Remove a callback from the list
3171
			remove: function() {
3172
				if ( list ) {
3173
					jQuery.each( arguments, function( _, arg ) {
3174
						var index;
3175
						while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
0 ignored issues
show
introduced by
The variable index does not seem to be initialized in case the while loop on line 3175 is not entered. Are you sure the function inArray handles undefined variables?
Loading history...
3176
							list.splice( index, 1 );
3177
							// Handle firing indexes
3178
							if ( firing ) {
3179
								if ( index <= firingLength ) {
0 ignored issues
show
Bug introduced by
The variable firingLength seems to not be initialized for all possible execution paths.
Loading history...
3180
									firingLength--;
3181
								}
3182
								if ( index <= firingIndex ) {
0 ignored issues
show
Bug introduced by
The variable firingIndex seems to not be initialized for all possible execution paths.
Loading history...
3183
									firingIndex--;
3184
								}
3185
							}
3186
						}
3187
					});
3188
				}
3189
				return this;
3190
			},
3191
			// Check if a given callback is in the list.
3192
			// If no argument is given, return whether or not list has callbacks attached.
3193
			has: function( fn ) {
3194
				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
3195
			},
3196
			// Remove all callbacks from the list
3197
			empty: function() {
3198
				list = [];
3199
				firingLength = 0;
3200
				return this;
3201
			},
3202
			// Have the list do nothing anymore
3203
			disable: function() {
3204
				list = stack = memory = undefined;
3205
				return this;
3206
			},
3207
			// Is it disabled?
3208
			disabled: function() {
3209
				return !list;
3210
			},
3211
			// Lock the list in its current state
3212
			lock: function() {
3213
				stack = undefined;
3214
				if ( !memory ) {
3215
					self.disable();
3216
				}
3217
				return this;
3218
			},
3219
			// Is it locked?
3220
			locked: function() {
3221
				return !stack;
3222
			},
3223
			// Call all callbacks with the given context and arguments
3224
			fireWith: function( context, args ) {
3225
				if ( list && ( !fired || stack ) ) {
3226
					args = args || [];
3227
					args = [ context, args.slice ? args.slice() : args ];
3228
					if ( firing ) {
3229
						stack.push( args );
3230
					} else {
3231
						fire( args );
3232
					}
3233
				}
3234
				return this;
3235
			},
3236
			// Call all the callbacks with the given arguments
3237
			fire: function() {
3238
				self.fireWith( this, arguments );
3239
				return this;
3240
			},
3241
			// To know if the callbacks have already been called at least once
3242
			fired: function() {
3243
				return !!fired;
3244
			}
3245
		};
3246
3247
	return self;
3248
};
3249
3250
3251
jQuery.extend({
3252
3253
	Deferred: function( func ) {
3254
		var tuples = [
3255
				// action, add listener, listener list, final state
3256
				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
3257
				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
3258
				[ "notify", "progress", jQuery.Callbacks("memory") ]
3259
			],
3260
			state = "pending",
3261
			promise = {
3262
				state: function() {
3263
					return state;
3264
				},
3265
				always: function() {
3266
					deferred.done( arguments ).fail( arguments );
3267
					return this;
3268
				},
3269
				then: function( /* fnDone, fnFail, fnProgress */ ) {
3270
					var fns = arguments;
3271
					return jQuery.Deferred(function( newDefer ) {
3272
						jQuery.each( tuples, function( i, tuple ) {
3273
							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
3274
							// deferred[ done | fail | progress ] for forwarding actions to newDefer
3275
							deferred[ tuple[1] ](function() {
3276
								var returned = fn && fn.apply( this, arguments );
3277
								if ( returned && jQuery.isFunction( returned.promise ) ) {
3278
									returned.promise()
3279
										.done( newDefer.resolve )
3280
										.fail( newDefer.reject )
3281
										.progress( newDefer.notify );
3282
								} else {
3283
									newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
3284
								}
3285
							});
3286
						});
3287
						fns = null;
3288
					}).promise();
3289
				},
3290
				// Get a promise for this deferred
3291
				// If obj is provided, the promise aspect is added to the object
3292
				promise: function( obj ) {
3293
					return obj != null ? jQuery.extend( obj, promise ) : promise;
3294
				}
3295
			},
3296
			deferred = {};
3297
3298
		// Keep pipe for back-compat
3299
		promise.pipe = promise.then;
3300
3301
		// Add list-specific methods
3302
		jQuery.each( tuples, function( i, tuple ) {
3303
			var list = tuple[ 2 ],
3304
				stateString = tuple[ 3 ];
3305
3306
			// promise[ done | fail | progress ] = list.add
3307
			promise[ tuple[1] ] = list.add;
3308
3309
			// Handle state
3310
			if ( stateString ) {
3311
				list.add(function() {
3312
					// state = [ resolved | rejected ]
3313
					state = stateString;
3314
3315
				// [ reject_list | resolve_list ].disable; progress_list.lock
3316
				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
3317
			}
3318
3319
			// deferred[ resolve | reject | notify ]
3320
			deferred[ tuple[0] ] = function() {
3321
				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
3322
				return this;
3323
			};
3324
			deferred[ tuple[0] + "With" ] = list.fireWith;
3325
		});
3326
3327
		// Make the deferred a promise
3328
		promise.promise( deferred );
3329
3330
		// Call given func if any
3331
		if ( func ) {
3332
			func.call( deferred, deferred );
3333
		}
3334
3335
		// All done!
3336
		return deferred;
3337
	},
3338
3339
	// Deferred helper
3340
	when: function( subordinate /* , ..., subordinateN */ ) {
3341
		var i = 0,
3342
			resolveValues = slice.call( arguments ),
3343
			length = resolveValues.length,
3344
3345
			// the count of uncompleted subordinates
3346
			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
3347
3348
			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
3349
			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3350
3351
			// Update function for both resolve and progress values
3352
			updateFunc = function( i, contexts, values ) {
3353
				return function( value ) {
3354
					contexts[ i ] = this;
3355
					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3356
					if ( values === progressValues ) {
3357
						deferred.notifyWith( contexts, values );
3358
3359
					} else if ( !(--remaining) ) {
3360
						deferred.resolveWith( contexts, values );
3361
					}
3362
				};
3363
			},
3364
3365
			progressValues, progressContexts, resolveContexts;
3366
3367
		// add listeners to Deferred subordinates; treat others as resolved
3368
		if ( length > 1 ) {
3369
			progressValues = new Array( length );
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
3370
			progressContexts = new Array( length );
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
3371
			resolveContexts = new Array( length );
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
3372
			for ( ; i < length; i++ ) {
3373
				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
3374
					resolveValues[ i ].promise()
3375
						.done( updateFunc( i, resolveContexts, resolveValues ) )
3376
						.fail( deferred.reject )
3377
						.progress( updateFunc( i, progressContexts, progressValues ) );
3378
				} else {
3379
					--remaining;
3380
				}
3381
			}
3382
		}
3383
3384
		// if we're not waiting on anything, resolve the master
3385
		if ( !remaining ) {
3386
			deferred.resolveWith( resolveContexts, resolveValues );
0 ignored issues
show
Bug introduced by
The variable resolveContexts does not seem to be initialized in case length > 1 on line 3368 is false. Are you sure the function resolveWith handles undefined variables?
Loading history...
3387
		}
3388
3389
		return deferred.promise();
3390
	}
3391
});
3392
3393
3394
// The deferred used on DOM ready
3395
var readyList;
3396
3397
jQuery.fn.ready = function( fn ) {
3398
	// Add the callback
3399
	jQuery.ready.promise().done( fn );
3400
3401
	return this;
3402
};
3403
3404
jQuery.extend({
3405
	// Is the DOM ready to be used? Set to true once it occurs.
3406
	isReady: false,
3407
3408
	// A counter to track how many items to wait for before
3409
	// the ready event fires. See #6781
3410
	readyWait: 1,
3411
3412
	// Hold (or release) the ready event
3413
	holdReady: function( hold ) {
3414
		if ( hold ) {
3415
			jQuery.readyWait++;
3416
		} else {
3417
			jQuery.ready( true );
3418
		}
3419
	},
3420
3421
	// Handle when the DOM is ready
3422
	ready: function( wait ) {
3423
3424
		// Abort if there are pending holds or we're already ready
3425
		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3426
			return;
3427
		}
3428
3429
		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
3430
		if ( !document.body ) {
3431
			return setTimeout( jQuery.ready );
3432
		}
3433
3434
		// Remember that the DOM is ready
3435
		jQuery.isReady = true;
3436
3437
		// If a normal DOM Ready event fired, decrement, and wait if need be
3438
		if ( wait !== true && --jQuery.readyWait > 0 ) {
3439
			return;
3440
		}
3441
3442
		// If there are functions bound, to execute
3443
		readyList.resolveWith( document, [ jQuery ] );
3444
3445
		// Trigger any bound ready events
3446
		if ( jQuery.fn.triggerHandler ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if jQuery.fn.triggerHandler is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
3447
			jQuery( document ).triggerHandler( "ready" );
3448
			jQuery( document ).off( "ready" );
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
3449
		}
3450
	}
3451
});
3452
3453
/**
3454
 * Clean-up method for dom ready events
3455
 */
3456
function detach() {
3457
	if ( document.addEventListener ) {
3458
		document.removeEventListener( "DOMContentLoaded", completed, false );
3459
		window.removeEventListener( "load", completed, false );
3460
3461
	} else {
3462
		document.detachEvent( "onreadystatechange", completed );
3463
		window.detachEvent( "onload", completed );
3464
	}
3465
}
3466
3467
/**
3468
 * The ready event handler and self cleanup method
3469
 */
3470
function completed() {
3471
	// readyState === "complete" is good enough for us to call the dom ready in oldIE
3472
	if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
3473
		detach();
3474
		jQuery.ready();
3475
	}
3476
}
3477
3478
jQuery.ready.promise = function( obj ) {
3479
	if ( !readyList ) {
3480
3481
		readyList = jQuery.Deferred();
3482
3483
		// Catch cases where $(document).ready() is called after the browser event has already occurred.
3484
		// we once tried to use readyState "interactive" here, but it caused issues like the one
3485
		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
3486
		if ( document.readyState === "complete" ) {
3487
			// Handle it asynchronously to allow scripts the opportunity to delay ready
3488
			setTimeout( jQuery.ready );
3489
3490
		// Standards-based browsers support DOMContentLoaded
3491
		} else if ( document.addEventListener ) {
3492
			// Use the handy event callback
3493
			document.addEventListener( "DOMContentLoaded", completed, false );
3494
3495
			// A fallback to window.onload, that will always work
3496
			window.addEventListener( "load", completed, false );
3497
3498
		// If IE event model is used
3499
		} else {
3500
			// Ensure firing before onload, maybe late but safe also for iframes
3501
			document.attachEvent( "onreadystatechange", completed );
3502
3503
			// A fallback to window.onload, that will always work
3504
			window.attachEvent( "onload", completed );
3505
3506
			// If IE and not a frame
3507
			// continually check to see if the document is ready
3508
			var top = false;
0 ignored issues
show
Unused Code introduced by
The assignment to variable top seems to be never used. Consider removing it.
Loading history...
3509
3510
			try {
3511
				top = window.frameElement == null && document.documentElement;
3512
			} catch(e) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
3513
3514
			if ( top && top.doScroll ) {
3515
				(function doScrollCheck() {
3516
					if ( !jQuery.isReady ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !jQuery.isReady is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
3517
3518
						try {
3519
							// Use the trick by Diego Perini
3520
							// http://javascript.nwbox.com/IEContentLoaded/
3521
							top.doScroll("left");
3522
						} catch(e) {
3523
							return setTimeout( doScrollCheck, 50 );
3524
						}
3525
3526
						// detach all dom ready events
3527
						detach();
3528
3529
						// and execute any waiting functions
3530
						jQuery.ready();
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
3531
					}
3532
				})();
3533
			}
3534
		}
3535
	}
3536
	return readyList.promise( obj );
3537
};
3538
3539
3540
var strundefined = typeof undefined;
3541
3542
3543
3544
// Support: IE<9
3545
// Iteration over object's inherited properties before its own
3546
var i;
3547
for ( i in jQuery( support ) ) {
3548
	break;
3549
}
3550
support.ownLast = i !== "0";
0 ignored issues
show
Bug introduced by
The variable i seems to not be initialized for all possible execution paths.
Loading history...
3551
3552
// Note: most support tests are defined in their respective modules.
3553
// false until the test is run
3554
support.inlineBlockNeedsLayout = false;
3555
3556
// Execute ASAP in case we need to set body.style.zoom
3557
jQuery(function() {
3558
	// Minified: var a,b,c,d
3559
	var val, div, body, container;
3560
3561
	body = document.getElementsByTagName( "body" )[ 0 ];
3562
	if ( !body || !body.style ) {
3563
		// Return for frameset docs that don't have a body
3564
		return;
3565
	}
3566
3567
	// Setup
3568
	div = document.createElement( "div" );
3569
	container = document.createElement( "div" );
3570
	container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
3571
	body.appendChild( container ).appendChild( div );
3572
3573
	if ( typeof div.style.zoom !== strundefined ) {
3574
		// Support: IE<8
3575
		// Check if natively block-level elements act like inline-block
3576
		// elements when setting their display to 'inline' and giving
3577
		// them layout
3578
		div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";
3579
3580
		support.inlineBlockNeedsLayout = val = div.offsetWidth === 3;
3581
		if ( val ) {
3582
			// Prevent IE 6 from affecting layout for positioned elements #11048
3583
			// Prevent IE from shrinking the body in IE 7 mode #12869
3584
			// Support: IE<8
3585
			body.style.zoom = 1;
3586
		}
3587
	}
3588
3589
	body.removeChild( container );
3590
});
3591
3592
3593
3594
3595
(function() {
3596
	var div = document.createElement( "div" );
3597
3598
	// Execute the test only if not already executed in another module.
3599
	if (support.deleteExpando == null) {
3600
		// Support: IE<9
3601
		support.deleteExpando = true;
3602
		try {
3603
			delete div.test;
3604
		} catch( e ) {
3605
			support.deleteExpando = false;
3606
		}
3607
	}
3608
3609
	// Null elements to avoid leaks in IE.
3610
	div = null;
0 ignored issues
show
Unused Code introduced by
The assignment to div seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
3611
})();
3612
3613
3614
/**
3615
 * Determines whether an object can have data
3616
 */
3617
jQuery.acceptData = function( elem ) {
3618
	var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ],
3619
		nodeType = +elem.nodeType || 1;
3620
3621
	// Do not set data on non-element DOM nodes because it will not be cleared (#8335).
3622
	return nodeType !== 1 && nodeType !== 9 ?
3623
		false :
3624
3625
		// Nodes accept data unless otherwise specified; rejection can be conditional
3626
		!noData || noData !== true && elem.getAttribute("classid") === noData;
3627
};
3628
3629
3630
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
3631
	rmultiDash = /([A-Z])/g;
3632
3633
function dataAttr( elem, key, data ) {
3634
	// If nothing was found internally, try to fetch any
3635
	// data from the HTML5 data-* attribute
3636
	if ( data === undefined && elem.nodeType === 1 ) {
3637
3638
		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3639
3640
		data = elem.getAttribute( name );
3641
3642
		if ( typeof data === "string" ) {
3643
			try {
3644
				data = data === "true" ? true :
3645
					data === "false" ? false :
3646
					data === "null" ? null :
3647
					// Only convert to a number if it doesn't change the string
3648
					+data + "" === data ? +data :
3649
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
3650
					data;
3651
			} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
3652
3653
			// Make sure we set the data so it isn't changed later
3654
			jQuery.data( elem, key, data );
3655
3656
		} else {
3657
			data = undefined;
3658
		}
3659
	}
3660
3661
	return data;
3662
}
3663
3664
// checks a cache object for emptiness
3665
function isEmptyDataObject( obj ) {
3666
	var name;
3667
	for ( name in obj ) {
3668
3669
		// if the public data object is empty, the private is still empty
3670
		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
3671
			continue;
3672
		}
3673
		if ( name !== "toJSON" ) {
3674
			return false;
3675
		}
3676
	}
3677
3678
	return true;
3679
}
3680
3681
function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
3682
	if ( !jQuery.acceptData( elem ) ) {
3683
		return;
3684
	}
3685
3686
	var ret, thisCache,
3687
		internalKey = jQuery.expando,
3688
3689
		// We have to handle DOM nodes and JS objects differently because IE6-7
3690
		// can't GC object references properly across the DOM-JS boundary
3691
		isNode = elem.nodeType,
3692
3693
		// Only DOM nodes need the global jQuery cache; JS object data is
3694
		// attached directly to the object so GC can occur automatically
3695
		cache = isNode ? jQuery.cache : elem,
3696
3697
		// Only defining an ID for JS objects if its cache already exists allows
3698
		// the code to shortcut on the same path as a DOM node with no cache
3699
		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
3700
3701
	// Avoid doing any more work than we need to when trying to get data on an
3702
	// object that has no data at all
3703
	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) {
3704
		return;
3705
	}
3706
3707
	if ( !id ) {
3708
		// Only DOM nodes need a new unique ID for each element since their data
3709
		// ends up in the global cache
3710
		if ( isNode ) {
3711
			id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;
3712
		} else {
3713
			id = internalKey;
3714
		}
3715
	}
3716
3717
	if ( !cache[ id ] ) {
3718
		// Avoid exposing jQuery metadata on plain JS objects when the object
3719
		// is serialized using JSON.stringify
3720
		cache[ id ] = isNode ? {} : { toJSON: jQuery.noop };
3721
	}
3722
3723
	// An object can be passed to jQuery.data instead of a key/value pair; this gets
3724
	// shallow copied over onto the existing cache
3725
	if ( typeof name === "object" || typeof name === "function" ) {
3726
		if ( pvt ) {
3727
			cache[ id ] = jQuery.extend( cache[ id ], name );
3728
		} else {
3729
			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
3730
		}
3731
	}
3732
3733
	thisCache = cache[ id ];
3734
3735
	// jQuery data() is stored in a separate object inside the object's internal data
3736
	// cache in order to avoid key collisions between internal data and user-defined
3737
	// data.
3738
	if ( !pvt ) {
3739
		if ( !thisCache.data ) {
3740
			thisCache.data = {};
3741
		}
3742
3743
		thisCache = thisCache.data;
3744
	}
3745
3746
	if ( data !== undefined ) {
3747
		thisCache[ jQuery.camelCase( name ) ] = data;
3748
	}
3749
3750
	// Check for both converted-to-camel and non-converted data property names
3751
	// If a data property was specified
3752
	if ( typeof name === "string" ) {
3753
3754
		// First Try to find as-is property data
3755
		ret = thisCache[ name ];
3756
3757
		// Test for null|undefined property data
3758
		if ( ret == null ) {
3759
3760
			// Try to find the camelCased property
3761
			ret = thisCache[ jQuery.camelCase( name ) ];
3762
		}
3763
	} else {
3764
		ret = thisCache;
3765
	}
3766
3767
	return ret;
3768
}
3769
3770
function internalRemoveData( elem, name, pvt ) {
3771
	if ( !jQuery.acceptData( elem ) ) {
3772
		return;
3773
	}
3774
3775
	var thisCache, i,
3776
		isNode = elem.nodeType,
3777
3778
		// See jQuery.data for more information
3779
		cache = isNode ? jQuery.cache : elem,
3780
		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
3781
3782
	// If there is already no cache entry for this object, there is no
3783
	// purpose in continuing
3784
	if ( !cache[ id ] ) {
3785
		return;
3786
	}
3787
3788
	if ( name ) {
3789
3790
		thisCache = pvt ? cache[ id ] : cache[ id ].data;
3791
3792
		if ( thisCache ) {
3793
3794
			// Support array or space separated string names for data keys
3795
			if ( !jQuery.isArray( name ) ) {
3796
3797
				// try the string as a key before any manipulation
3798
				if ( name in thisCache ) {
3799
					name = [ name ];
3800
				} else {
3801
3802
					// split the camel cased version by spaces unless a key with the spaces exists
3803
					name = jQuery.camelCase( name );
3804
					if ( name in thisCache ) {
3805
						name = [ name ];
3806
					} else {
3807
						name = name.split(" ");
3808
					}
3809
				}
3810
			} else {
3811
				// If "name" is an array of keys...
3812
				// When data is initially created, via ("key", "val") signature,
3813
				// keys will be converted to camelCase.
3814
				// Since there is no way to tell _how_ a key was added, remove
3815
				// both plain key and camelCase key. #12786
3816
				// This will only penalize the array argument path.
3817
				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
3818
			}
3819
3820
			i = name.length;
3821
			while ( i-- ) {
3822
				delete thisCache[ name[i] ];
3823
			}
3824
3825
			// If there is no data left in the cache, we want to continue
3826
			// and let the cache object itself get destroyed
3827
			if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {
3828
				return;
3829
			}
3830
		}
3831
	}
3832
3833
	// See jQuery.data for more information
3834
	if ( !pvt ) {
3835
		delete cache[ id ].data;
3836
3837
		// Don't destroy the parent cache unless the internal data object
3838
		// had been the only thing left in it
3839
		if ( !isEmptyDataObject( cache[ id ] ) ) {
3840
			return;
3841
		}
3842
	}
3843
3844
	// Destroy the cache
3845
	if ( isNode ) {
3846
		jQuery.cleanData( [ elem ], true );
3847
3848
	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
3849
	/* jshint eqeqeq: false */
3850
	} else if ( support.deleteExpando || cache != cache.window ) {
3851
		/* jshint eqeqeq: true */
3852
		delete cache[ id ];
3853
3854
	// When all else fails, null
3855
	} else {
3856
		cache[ id ] = null;
3857
	}
3858
}
3859
3860
jQuery.extend({
3861
	cache: {},
3862
3863
	// The following elements (space-suffixed to avoid Object.prototype collisions)
3864
	// throw uncatchable exceptions if you attempt to set expando properties
3865
	noData: {
3866
		"applet ": true,
3867
		"embed ": true,
3868
		// ...but Flash objects (which have this classid) *can* handle expandos
3869
		"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
3870
	},
3871
3872
	hasData: function( elem ) {
3873
		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
3874
		return !!elem && !isEmptyDataObject( elem );
3875
	},
3876
3877
	data: function( elem, name, data ) {
3878
		return internalData( elem, name, data );
3879
	},
3880
3881
	removeData: function( elem, name ) {
3882
		return internalRemoveData( elem, name );
3883
	},
3884
3885
	// For internal use only.
3886
	_data: function( elem, name, data ) {
3887
		return internalData( elem, name, data, true );
3888
	},
3889
3890
	_removeData: function( elem, name ) {
3891
		return internalRemoveData( elem, name, true );
3892
	}
3893
});
3894
3895
jQuery.fn.extend({
3896
	data: function( key, value ) {
3897
		var i, name, data,
3898
			elem = this[0],
3899
			attrs = elem && elem.attributes;
3900
3901
		// Special expections of .data basically thwart jQuery.access,
3902
		// so implement the relevant behavior ourselves
3903
3904
		// Gets all values
3905
		if ( key === undefined ) {
3906
			if ( this.length ) {
3907
				data = jQuery.data( elem );
3908
3909
				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
3910
					i = attrs.length;
3911
					while ( i-- ) {
3912
3913
						// Support: IE11+
3914
						// The attrs elements can be null (#14894)
3915
						if ( attrs[ i ] ) {
3916
							name = attrs[ i ].name;
3917
							if ( name.indexOf( "data-" ) === 0 ) {
3918
								name = jQuery.camelCase( name.slice(5) );
3919
								dataAttr( elem, name, data[ name ] );
3920
							}
3921
						}
3922
					}
3923
					jQuery._data( elem, "parsedAttrs", true );
3924
				}
3925
			}
3926
3927
			return data;
0 ignored issues
show
Bug introduced by
The variable data does not seem to be initialized in case this.length on line 3906 is false. Are you sure this can never be the case?
Loading history...
3928
		}
3929
3930
		// Sets multiple values
3931
		if ( typeof key === "object" ) {
3932
			return this.each(function() {
3933
				jQuery.data( this, key );
3934
			});
3935
		}
3936
3937
		return arguments.length > 1 ?
3938
3939
			// Sets one value
3940
			this.each(function() {
3941
				jQuery.data( this, key, value );
3942
			}) :
3943
3944
			// Gets one value
3945
			// Try to fetch any internally stored data first
3946
			elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;
3947
	},
3948
3949
	removeData: function( key ) {
3950
		return this.each(function() {
3951
			jQuery.removeData( this, key );
3952
		});
3953
	}
3954
});
3955
3956
3957
jQuery.extend({
3958
	queue: function( elem, type, data ) {
3959
		var queue;
3960
3961
		if ( elem ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if elem is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
3962
			type = ( type || "fx" ) + "queue";
3963
			queue = jQuery._data( elem, type );
3964
3965
			// Speed up dequeue by getting out quickly if this is just a lookup
3966
			if ( data ) {
3967
				if ( !queue || jQuery.isArray(data) ) {
3968
					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
3969
				} else {
3970
					queue.push( data );
3971
				}
3972
			}
3973
			return queue || [];
3974
		}
3975
	},
3976
3977
	dequeue: function( elem, type ) {
3978
		type = type || "fx";
3979
3980
		var queue = jQuery.queue( elem, type ),
3981
			startLength = queue.length,
3982
			fn = queue.shift(),
3983
			hooks = jQuery._queueHooks( elem, type ),
3984
			next = function() {
3985
				jQuery.dequeue( elem, type );
3986
			};
3987
3988
		// If the fx queue is dequeued, always remove the progress sentinel
3989
		if ( fn === "inprogress" ) {
3990
			fn = queue.shift();
3991
			startLength--;
3992
		}
3993
3994
		if ( fn ) {
3995
3996
			// Add a progress sentinel to prevent the fx queue from being
3997
			// automatically dequeued
3998
			if ( type === "fx" ) {
3999
				queue.unshift( "inprogress" );
4000
			}
4001
4002
			// clear up the last queue stop function
4003
			delete hooks.stop;
4004
			fn.call( elem, next, hooks );
4005
		}
4006
4007
		if ( !startLength && hooks ) {
4008
			hooks.empty.fire();
4009
		}
4010
	},
4011
4012
	// not intended for public consumption - generates a queueHooks object, or returns the current one
4013
	_queueHooks: function( elem, type ) {
4014
		var key = type + "queueHooks";
4015
		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
4016
			empty: jQuery.Callbacks("once memory").add(function() {
4017
				jQuery._removeData( elem, type + "queue" );
4018
				jQuery._removeData( elem, key );
4019
			})
4020
		});
4021
	}
4022
});
4023
4024
jQuery.fn.extend({
4025
	queue: function( type, data ) {
4026
		var setter = 2;
4027
4028
		if ( typeof type !== "string" ) {
4029
			data = type;
4030
			type = "fx";
4031
			setter--;
4032
		}
4033
4034
		if ( arguments.length < setter ) {
4035
			return jQuery.queue( this[0], type );
4036
		}
4037
4038
		return data === undefined ?
4039
			this :
4040
			this.each(function() {
4041
				var queue = jQuery.queue( this, type, data );
4042
4043
				// ensure a hooks for this queue
4044
				jQuery._queueHooks( this, type );
4045
4046
				if ( type === "fx" && queue[0] !== "inprogress" ) {
4047
					jQuery.dequeue( this, type );
4048
				}
4049
			});
4050
	},
4051
	dequeue: function( type ) {
4052
		return this.each(function() {
4053
			jQuery.dequeue( this, type );
4054
		});
4055
	},
4056
	clearQueue: function( type ) {
4057
		return this.queue( type || "fx", [] );
4058
	},
4059
	// Get a promise resolved when queues of a certain type
4060
	// are emptied (fx is the type by default)
4061
	promise: function( type, obj ) {
4062
		var tmp,
4063
			count = 1,
4064
			defer = jQuery.Deferred(),
4065
			elements = this,
4066
			i = this.length,
4067
			resolve = function() {
4068
				if ( !( --count ) ) {
4069
					defer.resolveWith( elements, [ elements ] );
4070
				}
4071
			};
4072
4073
		if ( typeof type !== "string" ) {
4074
			obj = type;
4075
			type = undefined;
4076
		}
4077
		type = type || "fx";
4078
4079
		while ( i-- ) {
4080
			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
4081
			if ( tmp && tmp.empty ) {
4082
				count++;
4083
				tmp.empty.add( resolve );
4084
			}
4085
		}
4086
		resolve();
4087
		return defer.promise( obj );
4088
	}
4089
});
4090
var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
4091
4092
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
4093
4094
var isHidden = function( elem, el ) {
4095
		// isHidden might be called from jQuery#filter function;
4096
		// in that case, element will be second argument
4097
		elem = el || elem;
4098
		return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
4099
	};
4100
4101
4102
4103
// Multifunctional method to get and set values of a collection
4104
// The value/s can optionally be executed if it's a function
4105
var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
4106
	var i = 0,
4107
		length = elems.length,
4108
		bulk = key == null;
4109
4110
	// Sets many values
4111
	if ( jQuery.type( key ) === "object" ) {
4112
		chainable = true;
4113
		for ( i in key ) {
4114
			jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
4115
		}
4116
4117
	// Sets one value
4118
	} else if ( value !== undefined ) {
4119
		chainable = true;
4120
4121
		if ( !jQuery.isFunction( value ) ) {
4122
			raw = true;
4123
		}
4124
4125
		if ( bulk ) {
4126
			// Bulk operations run against the entire set
4127
			if ( raw ) {
4128
				fn.call( elems, value );
4129
				fn = null;
4130
4131
			// ...except when executing function values
4132
			} else {
4133
				bulk = fn;
4134
				fn = function( elem, key, value ) {
4135
					return bulk.call( jQuery( elem ), value );
4136
				};
4137
			}
4138
		}
4139
4140
		if ( fn ) {
4141
			for ( ; i < length; i++ ) {
4142
				fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
4143
			}
4144
		}
4145
	}
4146
4147
	return chainable ?
4148
		elems :
4149
4150
		// Gets
4151
		bulk ?
4152
			fn.call( elems ) :
4153
			length ? fn( elems[0], key ) : emptyGet;
4154
};
4155
var rcheckableType = (/^(?:checkbox|radio)$/i);
4156
4157
4158
4159
(function() {
4160
	// Minified: var a,b,c
4161
	var input = document.createElement( "input" ),
4162
		div = document.createElement( "div" ),
4163
		fragment = document.createDocumentFragment();
4164
4165
	// Setup
4166
	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
4167
4168
	// IE strips leading whitespace when .innerHTML is used
4169
	support.leadingWhitespace = div.firstChild.nodeType === 3;
4170
4171
	// Make sure that tbody elements aren't automatically inserted
4172
	// IE will insert them into empty tables
4173
	support.tbody = !div.getElementsByTagName( "tbody" ).length;
4174
4175
	// Make sure that link elements get serialized correctly by innerHTML
4176
	// This requires a wrapper element in IE
4177
	support.htmlSerialize = !!div.getElementsByTagName( "link" ).length;
4178
4179
	// Makes sure cloning an html5 element does not cause problems
4180
	// Where outerHTML is undefined, this still works
4181
	support.html5Clone =
4182
		document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav></:nav>";
4183
4184
	// Check if a disconnected checkbox will retain its checked
4185
	// value of true after appended to the DOM (IE6/7)
4186
	input.type = "checkbox";
4187
	input.checked = true;
4188
	fragment.appendChild( input );
4189
	support.appendChecked = input.checked;
4190
4191
	// Make sure textarea (and checkbox) defaultValue is properly cloned
4192
	// Support: IE6-IE11+
4193
	div.innerHTML = "<textarea>x</textarea>";
4194
	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4195
4196
	// #11217 - WebKit loses check when the name is after the checked attribute
4197
	fragment.appendChild( div );
4198
	div.innerHTML = "<input type='radio' checked='checked' name='t'/>";
4199
4200
	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
4201
	// old WebKit doesn't clone checked state correctly in fragments
4202
	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4203
4204
	// Support: IE<9
4205
	// Opera does not clone events (and typeof div.attachEvent === undefined).
4206
	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
4207
	support.noCloneEvent = true;
4208
	if ( div.attachEvent ) {
4209
		div.attachEvent( "onclick", function() {
4210
			support.noCloneEvent = false;
4211
		});
4212
4213
		div.cloneNode( true ).click();
4214
	}
4215
4216
	// Execute the test only if not already executed in another module.
4217
	if (support.deleteExpando == null) {
4218
		// Support: IE<9
4219
		support.deleteExpando = true;
4220
		try {
4221
			delete div.test;
4222
		} catch( e ) {
4223
			support.deleteExpando = false;
4224
		}
4225
	}
4226
})();
4227
4228
4229
(function() {
4230
	var i, eventName,
4231
		div = document.createElement( "div" );
4232
4233
	// Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)
4234
	for ( i in { submit: true, change: true, focusin: true }) {
4235
		eventName = "on" + i;
4236
4237
		if ( !(support[ i + "Bubbles" ] = eventName in window) ) {
4238
			// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)
4239
			div.setAttribute( eventName, "t" );
4240
			support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false;
4241
		}
4242
	}
4243
4244
	// Null elements to avoid leaks in IE.
4245
	div = null;
0 ignored issues
show
Unused Code introduced by
The assignment to div seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
4246
})();
4247
4248
4249
var rformElems = /^(?:input|select|textarea)$/i,
4250
	rkeyEvent = /^key/,
4251
	rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
4252
	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4253
	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
4254
4255
function returnTrue() {
4256
	return true;
4257
}
4258
4259
function returnFalse() {
4260
	return false;
4261
}
4262
4263
function safeActiveElement() {
4264
	try {
4265
		return document.activeElement;
4266
	} catch ( err ) { }
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
4267
}
4268
4269
/*
4270
 * Helper functions for managing events -- not part of the public interface.
4271
 * Props to Dean Edwards' addEvent library for many of the ideas.
4272
 */
4273
jQuery.event = {
4274
4275
	global: {},
4276
4277
	add: function( elem, types, handler, data, selector ) {
4278
		var tmp, events, t, handleObjIn,
4279
			special, eventHandle, handleObj,
4280
			handlers, type, namespaces, origType,
4281
			elemData = jQuery._data( elem );
4282
4283
		// Don't attach events to noData or text/comment nodes (but allow plain objects)
4284
		if ( !elemData ) {
4285
			return;
4286
		}
4287
4288
		// Caller can pass in an object of custom data in lieu of the handler
4289
		if ( handler.handler ) {
4290
			handleObjIn = handler;
4291
			handler = handleObjIn.handler;
4292
			selector = handleObjIn.selector;
4293
		}
4294
4295
		// Make sure that the handler has a unique ID, used to find/remove it later
4296
		if ( !handler.guid ) {
4297
			handler.guid = jQuery.guid++;
4298
		}
4299
4300
		// Init the element's event structure and main handler, if this is the first
4301
		if ( !(events = elemData.events) ) {
4302
			events = elemData.events = {};
4303
		}
4304
		if ( !(eventHandle = elemData.handle) ) {
4305
			eventHandle = elemData.handle = function( e ) {
4306
				// Discard the second event of a jQuery.event.trigger() and
4307
				// when an event is called after a page has unloaded
4308
				return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?
4309
					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
4310
					undefined;
4311
			};
4312
			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
4313
			eventHandle.elem = elem;
4314
		}
4315
4316
		// Handle multiple events separated by a space
4317
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
4318
		t = types.length;
4319
		while ( t-- ) {
4320
			tmp = rtypenamespace.exec( types[t] ) || [];
4321
			type = origType = tmp[1];
4322
			namespaces = ( tmp[2] || "" ).split( "." ).sort();
4323
4324
			// There *must* be a type, no attaching namespace-only handlers
4325
			if ( !type ) {
4326
				continue;
4327
			}
4328
4329
			// If event changes its type, use the special event handlers for the changed type
4330
			special = jQuery.event.special[ type ] || {};
4331
4332
			// If selector defined, determine special event api type, otherwise given type
4333
			type = ( selector ? special.delegateType : special.bindType ) || type;
4334
4335
			// Update special based on newly reset type
4336
			special = jQuery.event.special[ type ] || {};
4337
4338
			// handleObj is passed to all event handlers
4339
			handleObj = jQuery.extend({
4340
				type: type,
4341
				origType: origType,
4342
				data: data,
4343
				handler: handler,
4344
				guid: handler.guid,
4345
				selector: selector,
4346
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4347
				namespace: namespaces.join(".")
4348
			}, handleObjIn );
0 ignored issues
show
Bug introduced by
The variable handleObjIn does not seem to be initialized in case handler.handler on line 4289 is false. Are you sure the function extend handles undefined variables?
Loading history...
4349
4350
			// Init the event handler queue if we're the first
4351
			if ( !(handlers = events[ type ]) ) {
4352
				handlers = events[ type ] = [];
4353
				handlers.delegateCount = 0;
4354
4355
				// Only use addEventListener/attachEvent if the special events handler returns false
4356
				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4357
					// Bind the global event handler to the element
4358
					if ( elem.addEventListener ) {
4359
						elem.addEventListener( type, eventHandle, false );
4360
4361
					} else if ( elem.attachEvent ) {
4362
						elem.attachEvent( "on" + type, eventHandle );
4363
					}
4364
				}
4365
			}
4366
4367
			if ( special.add ) {
4368
				special.add.call( elem, handleObj );
4369
4370
				if ( !handleObj.handler.guid ) {
4371
					handleObj.handler.guid = handler.guid;
4372
				}
4373
			}
4374
4375
			// Add to the element's handler list, delegates in front
4376
			if ( selector ) {
4377
				handlers.splice( handlers.delegateCount++, 0, handleObj );
4378
			} else {
4379
				handlers.push( handleObj );
4380
			}
4381
4382
			// Keep track of which events have ever been used, for event optimization
4383
			jQuery.event.global[ type ] = true;
4384
		}
4385
4386
		// Nullify elem to prevent memory leaks in IE
4387
		elem = null;
4388
	},
4389
4390
	// Detach an event or set of events from an element
4391
	remove: function( elem, types, handler, selector, mappedTypes ) {
4392
		var j, handleObj, tmp,
4393
			origCount, t, events,
4394
			special, handlers, type,
4395
			namespaces, origType,
4396
			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
4397
4398
		if ( !elemData || !(events = elemData.events) ) {
4399
			return;
4400
		}
4401
4402
		// Once for each type.namespace in types; type may be omitted
4403
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
4404
		t = types.length;
4405
		while ( t-- ) {
4406
			tmp = rtypenamespace.exec( types[t] ) || [];
4407
			type = origType = tmp[1];
4408
			namespaces = ( tmp[2] || "" ).split( "." ).sort();
4409
4410
			// Unbind all events (on this namespace, if provided) for the element
4411
			if ( !type ) {
4412
				for ( type in events ) {
4413
					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
4414
				}
4415
				continue;
4416
			}
4417
4418
			special = jQuery.event.special[ type ] || {};
4419
			type = ( selector ? special.delegateType : special.bindType ) || type;
4420
			handlers = events[ type ] || [];
4421
			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
4422
4423
			// Remove matching events
4424
			origCount = j = handlers.length;
4425
			while ( j-- ) {
4426
				handleObj = handlers[ j ];
4427
4428
				if ( ( mappedTypes || origType === handleObj.origType ) &&
4429
					( !handler || handler.guid === handleObj.guid ) &&
4430
					( !tmp || tmp.test( handleObj.namespace ) ) &&
4431
					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
4432
					handlers.splice( j, 1 );
4433
4434
					if ( handleObj.selector ) {
4435
						handlers.delegateCount--;
4436
					}
4437
					if ( special.remove ) {
4438
						special.remove.call( elem, handleObj );
4439
					}
4440
				}
4441
			}
4442
4443
			// Remove generic event handler if we removed something and no more handlers exist
4444
			// (avoids potential for endless recursion during removal of special event handlers)
4445
			if ( origCount && !handlers.length ) {
4446
				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
4447
					jQuery.removeEvent( elem, type, elemData.handle );
4448
				}
4449
4450
				delete events[ type ];
4451
			}
4452
		}
4453
4454
		// Remove the expando if it's no longer used
4455
		if ( jQuery.isEmptyObject( events ) ) {
4456
			delete elemData.handle;
4457
4458
			// removeData also checks for emptiness and clears the expando if empty
4459
			// so use it instead of delete
4460
			jQuery._removeData( elem, "events" );
4461
		}
4462
	},
4463
4464
	trigger: function( event, data, elem, onlyHandlers ) {
4465
		var handle, ontype, cur,
4466
			bubbleType, special, tmp, i,
4467
			eventPath = [ elem || document ],
4468
			type = hasOwn.call( event, "type" ) ? event.type : event,
4469
			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
4470
4471
		cur = tmp = elem = elem || document;
4472
4473
		// Don't do events on text and comment nodes
4474
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
4475
			return;
4476
		}
4477
4478
		// focus/blur morphs to focusin/out; ensure we're not firing them right now
4479
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
4480
			return;
4481
		}
4482
4483
		if ( type.indexOf(".") >= 0 ) {
4484
			// Namespaced trigger; create a regexp to match event type in handle()
4485
			namespaces = type.split(".");
4486
			type = namespaces.shift();
4487
			namespaces.sort();
4488
		}
4489
		ontype = type.indexOf(":") < 0 && "on" + type;
4490
4491
		// Caller can pass in a jQuery.Event object, Object, or just an event type string
4492
		event = event[ jQuery.expando ] ?
4493
			event :
4494
			new jQuery.Event( type, typeof event === "object" && event );
4495
4496
		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4497
		event.isTrigger = onlyHandlers ? 2 : 3;
4498
		event.namespace = namespaces.join(".");
4499
		event.namespace_re = event.namespace ?
4500
			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
4501
			null;
4502
4503
		// Clean up the event in case it is being reused
4504
		event.result = undefined;
4505
		if ( !event.target ) {
4506
			event.target = elem;
4507
		}
4508
4509
		// Clone any incoming data and prepend the event, creating the handler arg list
4510
		data = data == null ?
4511
			[ event ] :
4512
			jQuery.makeArray( data, [ event ] );
4513
4514
		// Allow special events to draw outside the lines
4515
		special = jQuery.event.special[ type ] || {};
4516
		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
4517
			return;
4518
		}
4519
4520
		// Determine event propagation path in advance, per W3C events spec (#9951)
4521
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4522
		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
4523
4524
			bubbleType = special.delegateType || type;
4525
			if ( !rfocusMorph.test( bubbleType + type ) ) {
4526
				cur = cur.parentNode;
4527
			}
4528
			for ( ; cur; cur = cur.parentNode ) {
4529
				eventPath.push( cur );
4530
				tmp = cur;
4531
			}
4532
4533
			// Only add window if we got to document (e.g., not plain obj or detached DOM)
4534
			if ( tmp === (elem.ownerDocument || document) ) {
4535
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
4536
			}
4537
		}
4538
4539
		// Fire handlers on the event path
4540
		i = 0;
4541
		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
4542
4543
			event.type = i > 1 ?
4544
				bubbleType :
0 ignored issues
show
Bug introduced by
The variable bubbleType does not seem to be initialized in case !onlyHandlers && !specia... !jQuery.isWindow(elem) on line 4522 is false. Are you sure this can never be the case?
Loading history...
4545
				special.bindType || type;
4546
4547
			// jQuery handler
4548
			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
4549
			if ( handle ) {
4550
				handle.apply( cur, data );
4551
			}
4552
4553
			// Native handler
4554
			handle = ontype && cur[ ontype ];
4555
			if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
4556
				event.result = handle.apply( cur, data );
4557
				if ( event.result === false ) {
4558
					event.preventDefault();
4559
				}
4560
			}
4561
		}
4562
		event.type = type;
4563
4564
		// If nobody prevented the default action, do it now
4565
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
4566
4567
			if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
4568
				jQuery.acceptData( elem ) ) {
4569
4570
				// Call a native DOM method on the target with the same name name as the event.
4571
				// Can't use an .isFunction() check here because IE6/7 fails that test.
4572
				// Don't do default actions on window, that's where global variables be (#6170)
4573
				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
4574
4575
					// Don't re-trigger an onFOO event when we call its FOO() method
4576
					tmp = elem[ ontype ];
4577
4578
					if ( tmp ) {
4579
						elem[ ontype ] = null;
4580
					}
4581
4582
					// Prevent re-triggering of the same event, since we already bubbled it above
4583
					jQuery.event.triggered = type;
4584
					try {
4585
						elem[ type ]();
4586
					} catch ( e ) {
4587
						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
4588
						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
4589
					}
4590
					jQuery.event.triggered = undefined;
4591
4592
					if ( tmp ) {
4593
						elem[ ontype ] = tmp;
4594
					}
4595
				}
4596
			}
4597
		}
4598
4599
		return event.result;
4600
	},
4601
4602
	dispatch: function( event ) {
4603
4604
		// Make a writable jQuery.Event from the native event object
4605
		event = jQuery.event.fix( event );
4606
4607
		var i, ret, handleObj, matched, j,
4608
			handlerQueue = [],
0 ignored issues
show
Unused Code introduced by
The assignment to variable handlerQueue seems to be never used. Consider removing it.
Loading history...
4609
			args = slice.call( arguments ),
4610
			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
4611
			special = jQuery.event.special[ event.type ] || {};
4612
4613
		// Use the fix-ed jQuery.Event rather than the (read-only) native event
4614
		args[0] = event;
4615
		event.delegateTarget = this;
4616
4617
		// Call the preDispatch hook for the mapped type, and let it bail if desired
4618
		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
4619
			return;
4620
		}
4621
4622
		// Determine handlers
4623
		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
4624
4625
		// Run delegates first; they may want to stop propagation beneath us
4626
		i = 0;
4627
		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
4628
			event.currentTarget = matched.elem;
4629
4630
			j = 0;
4631
			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
4632
4633
				// Triggered event must either 1) have no namespace, or
4634
				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
4635
				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
4636
4637
					event.handleObj = handleObj;
4638
					event.data = handleObj.data;
4639
4640
					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
4641
							.apply( matched.elem, args );
4642
4643
					if ( ret !== undefined ) {
4644
						if ( (event.result = ret) === false ) {
4645
							event.preventDefault();
4646
							event.stopPropagation();
4647
						}
4648
					}
4649
				}
4650
			}
4651
		}
4652
4653
		// Call the postDispatch hook for the mapped type
4654
		if ( special.postDispatch ) {
4655
			special.postDispatch.call( this, event );
4656
		}
4657
4658
		return event.result;
4659
	},
4660
4661
	handlers: function( event, handlers ) {
4662
		var sel, handleObj, matches, i,
4663
			handlerQueue = [],
4664
			delegateCount = handlers.delegateCount,
4665
			cur = event.target;
4666
4667
		// Find delegate handlers
4668
		// Black-hole SVG <use> instance trees (#13180)
4669
		// Avoid non-left-click bubbling in Firefox (#3861)
4670
		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
4671
4672
			/* jshint eqeqeq: false */
4673
			for ( ; cur != this; cur = cur.parentNode || this ) {
4674
				/* jshint eqeqeq: true */
4675
4676
				// Don't check non-elements (#13208)
4677
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
4678
				if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
4679
					matches = [];
4680
					for ( i = 0; i < delegateCount; i++ ) {
4681
						handleObj = handlers[ i ];
4682
4683
						// Don't conflict with Object.prototype properties (#13203)
4684
						sel = handleObj.selector + " ";
4685
4686
						if ( matches[ sel ] === undefined ) {
4687
							matches[ sel ] = handleObj.needsContext ?
4688
								jQuery( sel, this ).index( cur ) >= 0 :
4689
								jQuery.find( sel, this, null, [ cur ] ).length;
4690
						}
4691
						if ( matches[ sel ] ) {
4692
							matches.push( handleObj );
4693
						}
4694
					}
4695
					if ( matches.length ) {
4696
						handlerQueue.push({ elem: cur, handlers: matches });
4697
					}
4698
				}
4699
			}
4700
		}
4701
4702
		// Add the remaining (directly-bound) handlers
4703
		if ( delegateCount < handlers.length ) {
4704
			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
4705
		}
4706
4707
		return handlerQueue;
4708
	},
4709
4710
	fix: function( event ) {
4711
		if ( event[ jQuery.expando ] ) {
4712
			return event;
4713
		}
4714
4715
		// Create a writable copy of the event object and normalize some properties
4716
		var i, prop, copy,
4717
			type = event.type,
4718
			originalEvent = event,
4719
			fixHook = this.fixHooks[ type ];
4720
4721
		if ( !fixHook ) {
4722
			this.fixHooks[ type ] = fixHook =
4723
				rmouseEvent.test( type ) ? this.mouseHooks :
4724
				rkeyEvent.test( type ) ? this.keyHooks :
4725
				{};
4726
		}
4727
		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
4728
4729
		event = new jQuery.Event( originalEvent );
4730
4731
		i = copy.length;
4732
		while ( i-- ) {
4733
			prop = copy[ i ];
4734
			event[ prop ] = originalEvent[ prop ];
4735
		}
4736
4737
		// Support: IE<9
4738
		// Fix target property (#1925)
4739
		if ( !event.target ) {
4740
			event.target = originalEvent.srcElement || document;
4741
		}
4742
4743
		// Support: Chrome 23+, Safari?
4744
		// Target should not be a text node (#504, #13143)
4745
		if ( event.target.nodeType === 3 ) {
4746
			event.target = event.target.parentNode;
4747
		}
4748
4749
		// Support: IE<9
4750
		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
4751
		event.metaKey = !!event.metaKey;
4752
4753
		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
4754
	},
4755
4756
	// Includes some event props shared by KeyEvent and MouseEvent
4757
	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
4758
4759
	fixHooks: {},
4760
4761
	keyHooks: {
4762
		props: "char charCode key keyCode".split(" "),
4763
		filter: function( event, original ) {
4764
4765
			// Add which for key events
4766
			if ( event.which == null ) {
4767
				event.which = original.charCode != null ? original.charCode : original.keyCode;
4768
			}
4769
4770
			return event;
4771
		}
4772
	},
4773
4774
	mouseHooks: {
4775
		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
4776
		filter: function( event, original ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
4777
			var body, eventDoc, doc,
4778
				button = original.button,
4779
				fromElement = original.fromElement;
4780
4781
			// Calculate pageX/Y if missing and clientX/Y available
4782
			if ( event.pageX == null && original.clientX != null ) {
4783
				eventDoc = event.target.ownerDocument || document;
4784
				doc = eventDoc.documentElement;
4785
				body = eventDoc.body;
4786
4787
				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
4788
				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
4789
			}
4790
4791
			// Add relatedTarget, if necessary
4792
			if ( !event.relatedTarget && fromElement ) {
4793
				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
4794
			}
4795
4796
			// Add which for click: 1 === left; 2 === middle; 3 === right
4797
			// Note: button is not normalized, so don't use it
4798
			if ( !event.which && button !== undefined ) {
4799
				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
4800
			}
4801
4802
			return event;
4803
		}
4804
	},
4805
4806
	special: {
4807
		load: {
4808
			// Prevent triggered image.load events from bubbling to window.load
4809
			noBubble: true
4810
		},
4811
		focus: {
4812
			// Fire native event if possible so blur/focus sequence is correct
4813
			trigger: function() {
4814
				if ( this !== safeActiveElement() && this.focus ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if this !== safeActiveElement() && this.focus is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
4815
					try {
4816
						this.focus();
4817
						return false;
4818
					} catch ( e ) {
4819
						// Support: IE<9
4820
						// If we error on focus to hidden element (#1486, #12518),
4821
						// let .trigger() run the handlers
4822
					}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
4823
				}
4824
			},
4825
			delegateType: "focusin"
4826
		},
4827
		blur: {
4828
			trigger: function() {
4829
				if ( this === safeActiveElement() && this.blur ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if this === safeActiveElement() && this.blur is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
4830
					this.blur();
4831
					return false;
4832
				}
4833
			},
4834
			delegateType: "focusout"
4835
		},
4836
		click: {
4837
			// For checkbox, fire native event so checked state will be right
4838
			trigger: function() {
4839
				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if jQuery.nodeName(this, "i...checkbox" && this.click is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
4840
					this.click();
4841
					return false;
4842
				}
4843
			},
4844
4845
			// For cross-browser consistency, don't fire native .click() on links
4846
			_default: function( event ) {
4847
				return jQuery.nodeName( event.target, "a" );
4848
			}
4849
		},
4850
4851
		beforeunload: {
4852
			postDispatch: function( event ) {
4853
4854
				// Support: Firefox 20+
4855
				// Firefox doesn't alert if the returnValue field is not set.
4856
				if ( event.result !== undefined && event.originalEvent ) {
4857
					event.originalEvent.returnValue = event.result;
4858
				}
4859
			}
4860
		}
4861
	},
4862
4863
	simulate: function( type, elem, event, bubble ) {
4864
		// Piggyback on a donor event to simulate a different one.
4865
		// Fake originalEvent to avoid donor's stopPropagation, but if the
4866
		// simulated event prevents default then we do the same on the donor.
4867
		var e = jQuery.extend(
4868
			new jQuery.Event(),
4869
			event,
4870
			{
4871
				type: type,
4872
				isSimulated: true,
4873
				originalEvent: {}
4874
			}
4875
		);
4876
		if ( bubble ) {
4877
			jQuery.event.trigger( e, null, elem );
4878
		} else {
4879
			jQuery.event.dispatch.call( elem, e );
4880
		}
4881
		if ( e.isDefaultPrevented() ) {
4882
			event.preventDefault();
4883
		}
4884
	}
4885
};
4886
4887
jQuery.removeEvent = document.removeEventListener ?
4888
	function( elem, type, handle ) {
4889
		if ( elem.removeEventListener ) {
4890
			elem.removeEventListener( type, handle, false );
4891
		}
4892
	} :
4893
	function( elem, type, handle ) {
4894
		var name = "on" + type;
4895
4896
		if ( elem.detachEvent ) {
4897
4898
			// #8545, #7054, preventing memory leaks for custom events in IE6-8
4899
			// detachEvent needed property on element, by name of that event, to properly expose it to GC
4900
			if ( typeof elem[ name ] === strundefined ) {
4901
				elem[ name ] = null;
4902
			}
4903
4904
			elem.detachEvent( name, handle );
4905
		}
4906
	};
4907
4908
jQuery.Event = function( src, props ) {
4909
	// Allow instantiation without the 'new' keyword
4910
	if ( !(this instanceof jQuery.Event) ) {
4911
		return new jQuery.Event( src, props );
4912
	}
4913
4914
	// Event object
4915
	if ( src && src.type ) {
4916
		this.originalEvent = src;
4917
		this.type = src.type;
4918
4919
		// Events bubbling up the document may have been marked as prevented
4920
		// by a handler lower down the tree; reflect the correct value.
4921
		this.isDefaultPrevented = src.defaultPrevented ||
4922
				src.defaultPrevented === undefined &&
4923
				// Support: IE < 9, Android < 4.0
4924
				src.returnValue === false ?
4925
			returnTrue :
4926
			returnFalse;
4927
4928
	// Event type
4929
	} else {
4930
		this.type = src;
4931
	}
4932
4933
	// Put explicitly provided properties onto the event object
4934
	if ( props ) {
4935
		jQuery.extend( this, props );
4936
	}
4937
4938
	// Create a timestamp if incoming event doesn't have one
4939
	this.timeStamp = src && src.timeStamp || jQuery.now();
4940
4941
	// Mark it as fixed
4942
	this[ jQuery.expando ] = true;
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
4943
};
4944
4945
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
4946
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
4947
jQuery.Event.prototype = {
4948
	isDefaultPrevented: returnFalse,
4949
	isPropagationStopped: returnFalse,
4950
	isImmediatePropagationStopped: returnFalse,
4951
4952
	preventDefault: function() {
4953
		var e = this.originalEvent;
4954
4955
		this.isDefaultPrevented = returnTrue;
4956
		if ( !e ) {
4957
			return;
4958
		}
4959
4960
		// If preventDefault exists, run it on the original event
4961
		if ( e.preventDefault ) {
4962
			e.preventDefault();
4963
4964
		// Support: IE
4965
		// Otherwise set the returnValue property of the original event to false
4966
		} else {
4967
			e.returnValue = false;
4968
		}
4969
	},
4970
	stopPropagation: function() {
4971
		var e = this.originalEvent;
4972
4973
		this.isPropagationStopped = returnTrue;
4974
		if ( !e ) {
4975
			return;
4976
		}
4977
		// If stopPropagation exists, run it on the original event
4978
		if ( e.stopPropagation ) {
4979
			e.stopPropagation();
4980
		}
4981
4982
		// Support: IE
4983
		// Set the cancelBubble property of the original event to true
4984
		e.cancelBubble = true;
4985
	},
4986
	stopImmediatePropagation: function() {
4987
		var e = this.originalEvent;
4988
4989
		this.isImmediatePropagationStopped = returnTrue;
4990
4991
		if ( e && e.stopImmediatePropagation ) {
4992
			e.stopImmediatePropagation();
4993
		}
4994
4995
		this.stopPropagation();
4996
	}
4997
};
4998
4999
// Create mouseenter/leave events using mouseover/out and event-time checks
5000
jQuery.each({
5001
	mouseenter: "mouseover",
5002
	mouseleave: "mouseout",
5003
	pointerenter: "pointerover",
5004
	pointerleave: "pointerout"
5005
}, function( orig, fix ) {
5006
	jQuery.event.special[ orig ] = {
5007
		delegateType: fix,
5008
		bindType: fix,
5009
5010
		handle: function( event ) {
5011
			var ret,
5012
				target = this,
5013
				related = event.relatedTarget,
5014
				handleObj = event.handleObj;
5015
5016
			// For mousenter/leave call the handler if related is outside the target.
5017
			// NB: No relatedTarget if the mouse left/entered the browser window
5018
			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
5019
				event.type = handleObj.origType;
5020
				ret = handleObj.handler.apply( this, arguments );
5021
				event.type = fix;
5022
			}
5023
			return ret;
0 ignored issues
show
Bug introduced by
The variable ret does not seem to be initialized in case !related || related !== ...ntains(target, related) on line 5018 is false. Are you sure this can never be the case?
Loading history...
5024
		}
5025
	};
5026
});
5027
5028
// IE submit delegation
5029
if ( !support.submitBubbles ) {
5030
5031
	jQuery.event.special.submit = {
5032
		setup: function() {
5033
			// Only need this for delegated form submit events
5034
			if ( jQuery.nodeName( this, "form" ) ) {
5035
				return false;
5036
			}
5037
5038
			// Lazy-add a submit handler when a descendant form may potentially be submitted
5039
			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
5040
				// Node name check avoids a VML-related crash in IE (#9807)
5041
				var elem = e.target,
5042
					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
5043
				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
5044
					jQuery.event.add( form, "submit._submit", function( event ) {
5045
						event._submit_bubble = true;
5046
					});
5047
					jQuery._data( form, "submitBubbles", true );
5048
				}
5049
			});
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5050
			// return undefined since we don't need an event listener
5051
		},
5052
5053
		postDispatch: function( event ) {
5054
			// If form was submitted by the user, bubble the event up the tree
5055
			if ( event._submit_bubble ) {
5056
				delete event._submit_bubble;
5057
				if ( this.parentNode && !event.isTrigger ) {
5058
					jQuery.event.simulate( "submit", this.parentNode, event, true );
5059
				}
5060
			}
5061
		},
5062
5063
		teardown: function() {
5064
			// Only need this for delegated form submit events
5065
			if ( jQuery.nodeName( this, "form" ) ) {
5066
				return false;
5067
			}
5068
5069
			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
5070
			jQuery.event.remove( this, "._submit" );
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5071
		}
5072
	};
5073
}
5074
5075
// IE change delegation and checkbox/radio fix
5076
if ( !support.changeBubbles ) {
5077
5078
	jQuery.event.special.change = {
5079
5080
		setup: function() {
5081
5082
			if ( rformElems.test( this.nodeName ) ) {
5083
				// IE doesn't fire change on a check/radio until blur; trigger it on click
5084
				// after a propertychange. Eat the blur-change in special.change.handle.
5085
				// This still fires onchange a second time for check/radio after blur.
5086
				if ( this.type === "checkbox" || this.type === "radio" ) {
5087
					jQuery.event.add( this, "propertychange._change", function( event ) {
5088
						if ( event.originalEvent.propertyName === "checked" ) {
5089
							this._just_changed = true;
5090
						}
5091
					});
5092
					jQuery.event.add( this, "click._change", function( event ) {
5093
						if ( this._just_changed && !event.isTrigger ) {
5094
							this._just_changed = false;
5095
						}
5096
						// Allow triggered, simulated change events (#11500)
5097
						jQuery.event.simulate( "change", this, event, true );
5098
					});
5099
				}
5100
				return false;
5101
			}
5102
			// Delegated event; lazy-add a change handler on descendant inputs
5103
			jQuery.event.add( this, "beforeactivate._change", function( e ) {
5104
				var elem = e.target;
5105
5106
				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
5107
					jQuery.event.add( elem, "change._change", function( event ) {
5108
						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
5109
							jQuery.event.simulate( "change", this.parentNode, event, true );
5110
						}
5111
					});
5112
					jQuery._data( elem, "changeBubbles", true );
5113
				}
5114
			});
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5115
		},
5116
5117
		handle: function( event ) {
5118
			var elem = event.target;
5119
5120
			// Swallow native change events from checkbox/radio, we already triggered them above
5121
			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if this !== elem || event.i...lem.type !== "checkbox" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
5122
				return event.handleObj.handler.apply( this, arguments );
5123
			}
5124
		},
5125
5126
		teardown: function() {
5127
			jQuery.event.remove( this, "._change" );
5128
5129
			return !rformElems.test( this.nodeName );
5130
		}
5131
	};
5132
}
5133
5134
// Create "bubbling" focus and blur events
5135
if ( !support.focusinBubbles ) {
5136
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
5137
5138
		// Attach a single capturing handler on the document while someone wants focusin/focusout
5139
		var handler = function( event ) {
5140
				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
5141
			};
5142
5143
		jQuery.event.special[ fix ] = {
5144
			setup: function() {
5145
				var doc = this.ownerDocument || this,
5146
					attaches = jQuery._data( doc, fix );
5147
5148
				if ( !attaches ) {
5149
					doc.addEventListener( orig, handler, true );
5150
				}
5151
				jQuery._data( doc, fix, ( attaches || 0 ) + 1 );
5152
			},
5153
			teardown: function() {
5154
				var doc = this.ownerDocument || this,
5155
					attaches = jQuery._data( doc, fix ) - 1;
5156
5157
				if ( !attaches ) {
5158
					doc.removeEventListener( orig, handler, true );
5159
					jQuery._removeData( doc, fix );
5160
				} else {
5161
					jQuery._data( doc, fix, attaches );
5162
				}
5163
			}
5164
		};
5165
	});
5166
}
5167
5168
jQuery.fn.extend({
5169
5170
	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
5171
		var type, origFn;
5172
5173
		// Types can be a map of types/handlers
5174
		if ( typeof types === "object" ) {
5175
			// ( types-Object, selector, data )
5176
			if ( typeof selector !== "string" ) {
5177
				// ( types-Object, data )
5178
				data = data || selector;
5179
				selector = undefined;
5180
			}
5181
			for ( type in types ) {
5182
				this.on( type, selector, data, types[ type ], one );
5183
			}
5184
			return this;
5185
		}
5186
5187
		if ( data == null && fn == null ) {
5188
			// ( types, fn )
5189
			fn = selector;
5190
			data = selector = undefined;
5191
		} else if ( fn == null ) {
5192
			if ( typeof selector === "string" ) {
5193
				// ( types, selector, fn )
5194
				fn = data;
5195
				data = undefined;
5196
			} else {
5197
				// ( types, data, fn )
5198
				fn = data;
5199
				data = selector;
5200
				selector = undefined;
5201
			}
5202
		}
5203
		if ( fn === false ) {
5204
			fn = returnFalse;
5205
		} else if ( !fn ) {
5206
			return this;
5207
		}
5208
5209
		if ( one === 1 ) {
5210
			origFn = fn;
5211
			fn = function( event ) {
5212
				// Can use an empty set, since event contains the info
5213
				jQuery().off( event );
5214
				return origFn.apply( this, arguments );
5215
			};
5216
			// Use same guid so caller can remove using origFn
5217
			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
5218
		}
5219
		return this.each( function() {
5220
			jQuery.event.add( this, types, fn, data, selector );
5221
		});
5222
	},
5223
	one: function( types, selector, data, fn ) {
5224
		return this.on( types, selector, data, fn, 1 );
5225
	},
5226
	off: function( types, selector, fn ) {
5227
		var handleObj, type;
5228
		if ( types && types.preventDefault && types.handleObj ) {
5229
			// ( event )  dispatched jQuery.Event
5230
			handleObj = types.handleObj;
5231
			jQuery( types.delegateTarget ).off(
5232
				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
5233
				handleObj.selector,
5234
				handleObj.handler
5235
			);
5236
			return this;
5237
		}
5238
		if ( typeof types === "object" ) {
5239
			// ( types-object [, selector] )
5240
			for ( type in types ) {
5241
				this.off( type, selector, types[ type ] );
5242
			}
5243
			return this;
5244
		}
5245
		if ( selector === false || typeof selector === "function" ) {
5246
			// ( types [, fn] )
5247
			fn = selector;
5248
			selector = undefined;
5249
		}
5250
		if ( fn === false ) {
5251
			fn = returnFalse;
5252
		}
5253
		return this.each(function() {
5254
			jQuery.event.remove( this, types, fn, selector );
5255
		});
5256
	},
5257
5258
	trigger: function( type, data ) {
5259
		return this.each(function() {
5260
			jQuery.event.trigger( type, data, this );
5261
		});
5262
	},
5263
	triggerHandler: function( type, data ) {
5264
		var elem = this[0];
5265
		if ( elem ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if elem is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
5266
			return jQuery.event.trigger( type, data, elem, true );
5267
		}
5268
	}
5269
});
5270
5271
5272
function createSafeFragment( document ) {
5273
	var list = nodeNames.split( "|" ),
5274
		safeFrag = document.createDocumentFragment();
5275
5276
	if ( safeFrag.createElement ) {
5277
		while ( list.length ) {
5278
			safeFrag.createElement(
5279
				list.pop()
5280
			);
5281
		}
5282
	}
5283
	return safeFrag;
5284
}
5285
5286
var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
5287
		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
5288
	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
5289
	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
5290
	rleadingWhitespace = /^\s+/,
5291
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
5292
	rtagName = /<([\w:]+)/,
5293
	rtbody = /<tbody/i,
5294
	rhtml = /<|&#?\w+;/,
5295
	rnoInnerhtml = /<(?:script|style|link)/i,
5296
	// checked="checked" or checked
5297
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5298
	rscriptType = /^$|\/(?:java|ecma)script/i,
5299
	rscriptTypeMasked = /^true\/(.*)/,
5300
	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
5301
5302
	// We have to close these tags to support XHTML (#13200)
5303
	wrapMap = {
5304
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
5305
		legend: [ 1, "<fieldset>", "</fieldset>" ],
5306
		area: [ 1, "<map>", "</map>" ],
5307
		param: [ 1, "<object>", "</object>" ],
5308
		thead: [ 1, "<table>", "</table>" ],
5309
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5310
		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5311
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5312
5313
		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
5314
		// unless wrapped in a div with non-breaking characters in front of it.
5315
		_default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
5316
	},
5317
	safeFragment = createSafeFragment( document ),
5318
	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
5319
5320
wrapMap.optgroup = wrapMap.option;
5321
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5322
wrapMap.th = wrapMap.td;
5323
5324
function getAll( context, tag ) {
5325
	var elems, elem,
5326
		i = 0,
5327
		found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) :
5328
			typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) :
5329
			undefined;
5330
5331
	if ( !found ) {
5332
		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
5333
			if ( !tag || jQuery.nodeName( elem, tag ) ) {
5334
				found.push( elem );
5335
			} else {
5336
				jQuery.merge( found, getAll( elem, tag ) );
5337
			}
5338
		}
5339
	}
5340
5341
	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
5342
		jQuery.merge( [ context ], found ) :
5343
		found;
5344
}
5345
5346
// Used in buildFragment, fixes the defaultChecked property
5347
function fixDefaultChecked( elem ) {
5348
	if ( rcheckableType.test( elem.type ) ) {
5349
		elem.defaultChecked = elem.checked;
5350
	}
5351
}
5352
5353
// Support: IE<8
5354
// Manipulating tables requires a tbody
5355
function manipulationTarget( elem, content ) {
5356
	return jQuery.nodeName( elem, "table" ) &&
5357
		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
5358
5359
		elem.getElementsByTagName("tbody")[0] ||
5360
			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
5361
		elem;
5362
}
5363
5364
// Replace/restore the type attribute of script elements for safe DOM manipulation
5365
function disableScript( elem ) {
5366
	elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type;
5367
	return elem;
5368
}
5369
function restoreScript( elem ) {
5370
	var match = rscriptTypeMasked.exec( elem.type );
5371
	if ( match ) {
5372
		elem.type = match[1];
5373
	} else {
5374
		elem.removeAttribute("type");
5375
	}
5376
	return elem;
5377
}
5378
5379
// Mark scripts as having already been evaluated
5380
function setGlobalEval( elems, refElements ) {
5381
	var elem,
5382
		i = 0;
5383
	for ( ; (elem = elems[i]) != null; i++ ) {
5384
		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
5385
	}
5386
}
5387
5388
function cloneCopyEvent( src, dest ) {
5389
5390
	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5391
		return;
5392
	}
5393
5394
	var type, i, l,
5395
		oldData = jQuery._data( src ),
5396
		curData = jQuery._data( dest, oldData ),
5397
		events = oldData.events;
5398
5399
	if ( events ) {
5400
		delete curData.handle;
5401
		curData.events = {};
5402
5403
		for ( type in events ) {
5404
			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
5405
				jQuery.event.add( dest, type, events[ type ][ i ] );
5406
			}
5407
		}
5408
	}
5409
5410
	// make the cloned public data object a copy from the original
5411
	if ( curData.data ) {
5412
		curData.data = jQuery.extend( {}, curData.data );
5413
	}
5414
}
5415
5416
function fixCloneNodeIssues( src, dest ) {
5417
	var nodeName, e, data;
5418
5419
	// We do not need to do anything for non-Elements
5420
	if ( dest.nodeType !== 1 ) {
5421
		return;
5422
	}
5423
5424
	nodeName = dest.nodeName.toLowerCase();
5425
5426
	// IE6-8 copies events bound via attachEvent when using cloneNode.
5427
	if ( !support.noCloneEvent && dest[ jQuery.expando ] ) {
5428
		data = jQuery._data( dest );
5429
5430
		for ( e in data.events ) {
5431
			jQuery.removeEvent( dest, e, data.handle );
5432
		}
5433
5434
		// Event data gets referenced instead of copied if the expando gets copied too
5435
		dest.removeAttribute( jQuery.expando );
5436
	}
5437
5438
	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
5439
	if ( nodeName === "script" && dest.text !== src.text ) {
5440
		disableScript( dest ).text = src.text;
5441
		restoreScript( dest );
5442
5443
	// IE6-10 improperly clones children of object elements using classid.
5444
	// IE10 throws NoModificationAllowedError if parent is null, #12132.
5445
	} else if ( nodeName === "object" ) {
5446
		if ( dest.parentNode ) {
5447
			dest.outerHTML = src.outerHTML;
5448
		}
5449
5450
		// This path appears unavoidable for IE9. When cloning an object
5451
		// element in IE9, the outerHTML strategy above is not sufficient.
5452
		// If the src has innerHTML and the destination does not,
5453
		// copy the src.innerHTML into the dest.innerHTML. #10324
5454
		if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
5455
			dest.innerHTML = src.innerHTML;
5456
		}
5457
5458
	} else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5459
		// IE6-8 fails to persist the checked state of a cloned checkbox
5460
		// or radio button. Worse, IE6-7 fail to give the cloned element
5461
		// a checked appearance if the defaultChecked value isn't also set
5462
5463
		dest.defaultChecked = dest.checked = src.checked;
5464
5465
		// IE6-7 get confused and end up setting the value of a cloned
5466
		// checkbox/radio button to an empty string instead of "on"
5467
		if ( dest.value !== src.value ) {
5468
			dest.value = src.value;
5469
		}
5470
5471
	// IE6-8 fails to return the selected option to the default selected
5472
	// state when cloning options
5473
	} else if ( nodeName === "option" ) {
5474
		dest.defaultSelected = dest.selected = src.defaultSelected;
5475
5476
	// IE6-8 fails to set the defaultValue to the correct value when
5477
	// cloning other types of input fields
5478
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5479
		dest.defaultValue = src.defaultValue;
5480
	}
5481
}
5482
5483
jQuery.extend({
5484
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5485
		var destElements, node, clone, i, srcElements,
5486
			inPage = jQuery.contains( elem.ownerDocument, elem );
5487
5488
		if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
5489
			clone = elem.cloneNode( true );
5490
5491
		// IE<=8 does not properly clone detached, unknown element nodes
5492
		} else {
5493
			fragmentDiv.innerHTML = elem.outerHTML;
5494
			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
5495
		}
5496
5497
		if ( (!support.noCloneEvent || !support.noCloneChecked) &&
5498
				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
5499
5500
			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
5501
			destElements = getAll( clone );
5502
			srcElements = getAll( elem );
5503
5504
			// Fix all IE cloning issues
5505
			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
5506
				// Ensure that the destination node is not null; Fixes #9587
5507
				if ( destElements[i] ) {
5508
					fixCloneNodeIssues( node, destElements[i] );
5509
				}
5510
			}
5511
		}
5512
5513
		// Copy the events from the original to the clone
5514
		if ( dataAndEvents ) {
5515
			if ( deepDataAndEvents ) {
5516
				srcElements = srcElements || getAll( elem );
5517
				destElements = destElements || getAll( clone );
5518
5519
				for ( i = 0; (node = srcElements[i]) != null; i++ ) {
5520
					cloneCopyEvent( node, destElements[i] );
5521
				}
5522
			} else {
5523
				cloneCopyEvent( elem, clone );
5524
			}
5525
		}
5526
5527
		// Preserve script evaluation history
5528
		destElements = getAll( clone, "script" );
5529
		if ( destElements.length > 0 ) {
5530
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
5531
		}
5532
5533
		destElements = srcElements = node = null;
0 ignored issues
show
Unused Code introduced by
The assignment to variable srcElements seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to node seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
Unused Code introduced by
The assignment to variable destElements seems to be never used. Consider removing it.
Loading history...
5534
5535
		// Return the cloned set
5536
		return clone;
5537
	},
5538
5539
	buildFragment: function( elems, context, scripts, selection ) {
5540
		var j, elem, contains,
5541
			tmp, tag, tbody, wrap,
5542
			l = elems.length,
5543
5544
			// Ensure a safe fragment
5545
			safe = createSafeFragment( context ),
5546
5547
			nodes = [],
5548
			i = 0;
5549
5550
		for ( ; i < l; i++ ) {
5551
			elem = elems[ i ];
5552
5553
			if ( elem || elem === 0 ) {
5554
5555
				// Add nodes directly
5556
				if ( jQuery.type( elem ) === "object" ) {
5557
					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5558
5559
				// Convert non-html into a text node
5560
				} else if ( !rhtml.test( elem ) ) {
5561
					nodes.push( context.createTextNode( elem ) );
5562
5563
				// Convert html into DOM nodes
5564
				} else {
5565
					tmp = tmp || safe.appendChild( context.createElement("div") );
5566
5567
					// Deserialize a standard representation
5568
					tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase();
5569
					wrap = wrapMap[ tag ] || wrapMap._default;
5570
5571
					tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
5572
5573
					// Descend through wrappers to the right content
5574
					j = wrap[0];
5575
					while ( j-- ) {
5576
						tmp = tmp.lastChild;
5577
					}
5578
5579
					// Manually add leading whitespace removed by IE
5580
					if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
5581
						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
5582
					}
5583
5584
					// Remove IE's autoinserted <tbody> from table fragments
5585
					if ( !support.tbody ) {
5586
5587
						// String was a <table>, *may* have spurious <tbody>
5588
						elem = tag === "table" && !rtbody.test( elem ) ?
5589
							tmp.firstChild :
5590
5591
							// String was a bare <thead> or <tfoot>
5592
							wrap[1] === "<table>" && !rtbody.test( elem ) ?
5593
								tmp :
5594
								0;
5595
5596
						j = elem && elem.childNodes.length;
5597
						while ( j-- ) {
5598
							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
5599
								elem.removeChild( tbody );
5600
							}
5601
						}
5602
					}
5603
5604
					jQuery.merge( nodes, tmp.childNodes );
5605
5606
					// Fix #12392 for WebKit and IE > 9
5607
					tmp.textContent = "";
5608
5609
					// Fix #12392 for oldIE
5610
					while ( tmp.firstChild ) {
5611
						tmp.removeChild( tmp.firstChild );
5612
					}
5613
5614
					// Remember the top-level container for proper cleanup
5615
					tmp = safe.lastChild;
5616
				}
5617
			}
5618
		}
5619
5620
		// Fix #11356: Clear elements from fragment
5621
		if ( tmp ) {
5622
			safe.removeChild( tmp );
5623
		}
5624
5625
		// Reset defaultChecked for any radios and checkboxes
5626
		// about to be appended to the DOM in IE 6/7 (#8060)
5627
		if ( !support.appendChecked ) {
5628
			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
5629
		}
5630
5631
		i = 0;
5632
		while ( (elem = nodes[ i++ ]) ) {
5633
5634
			// #4087 - If origin and destination elements are the same, and this is
5635
			// that element, do not do anything
5636
			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
5637
				continue;
5638
			}
5639
5640
			contains = jQuery.contains( elem.ownerDocument, elem );
5641
5642
			// Append to fragment
5643
			tmp = getAll( safe.appendChild( elem ), "script" );
5644
5645
			// Preserve script evaluation history
5646
			if ( contains ) {
5647
				setGlobalEval( tmp );
5648
			}
5649
5650
			// Capture executables
5651
			if ( scripts ) {
5652
				j = 0;
5653
				while ( (elem = tmp[ j++ ]) ) {
5654
					if ( rscriptType.test( elem.type || "" ) ) {
5655
						scripts.push( elem );
5656
					}
5657
				}
5658
			}
5659
		}
5660
5661
		tmp = null;
0 ignored issues
show
Unused Code introduced by
The assignment to tmp seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
5662
5663
		return safe;
5664
	},
5665
5666
	cleanData: function( elems, /* internal */ acceptData ) {
5667
		var elem, type, id, data,
5668
			i = 0,
5669
			internalKey = jQuery.expando,
5670
			cache = jQuery.cache,
5671
			deleteExpando = support.deleteExpando,
5672
			special = jQuery.event.special;
5673
5674
		for ( ; (elem = elems[i]) != null; i++ ) {
5675
			if ( acceptData || jQuery.acceptData( elem ) ) {
5676
5677
				id = elem[ internalKey ];
5678
				data = id && cache[ id ];
5679
5680
				if ( data ) {
5681
					if ( data.events ) {
5682
						for ( type in data.events ) {
5683
							if ( special[ type ] ) {
5684
								jQuery.event.remove( elem, type );
5685
5686
							// This is a shortcut to avoid jQuery.event.remove's overhead
5687
							} else {
5688
								jQuery.removeEvent( elem, type, data.handle );
5689
							}
5690
						}
5691
					}
5692
5693
					// Remove cache only if it was not already removed by jQuery.event.remove
5694
					if ( cache[ id ] ) {
5695
5696
						delete cache[ id ];
5697
5698
						// IE does not allow us to delete expando properties from nodes,
5699
						// nor does it have a removeAttribute function on Document nodes;
5700
						// we must handle all of these cases
5701
						if ( deleteExpando ) {
5702
							delete elem[ internalKey ];
5703
5704
						} else if ( typeof elem.removeAttribute !== strundefined ) {
5705
							elem.removeAttribute( internalKey );
5706
5707
						} else {
5708
							elem[ internalKey ] = null;
5709
						}
5710
5711
						deletedIds.push( id );
5712
					}
5713
				}
5714
			}
5715
		}
5716
	}
5717
});
5718
5719
jQuery.fn.extend({
5720
	text: function( value ) {
5721
		return access( this, function( value ) {
5722
			return value === undefined ?
5723
				jQuery.text( this ) :
5724
				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
5725
		}, null, value, arguments.length );
5726
	},
5727
5728
	append: function() {
5729
		return this.domManip( arguments, function( elem ) {
5730
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5731
				var target = manipulationTarget( this, elem );
5732
				target.appendChild( elem );
5733
			}
5734
		});
5735
	},
5736
5737
	prepend: function() {
5738
		return this.domManip( arguments, function( elem ) {
5739
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5740
				var target = manipulationTarget( this, elem );
5741
				target.insertBefore( elem, target.firstChild );
5742
			}
5743
		});
5744
	},
5745
5746
	before: function() {
5747
		return this.domManip( arguments, function( elem ) {
5748
			if ( this.parentNode ) {
5749
				this.parentNode.insertBefore( elem, this );
5750
			}
5751
		});
5752
	},
5753
5754
	after: function() {
5755
		return this.domManip( arguments, function( elem ) {
5756
			if ( this.parentNode ) {
5757
				this.parentNode.insertBefore( elem, this.nextSibling );
5758
			}
5759
		});
5760
	},
5761
5762
	remove: function( selector, keepData /* Internal Use Only */ ) {
5763
		var elem,
5764
			elems = selector ? jQuery.filter( selector, this ) : this,
5765
			i = 0;
5766
5767
		for ( ; (elem = elems[i]) != null; i++ ) {
5768
5769
			if ( !keepData && elem.nodeType === 1 ) {
5770
				jQuery.cleanData( getAll( elem ) );
5771
			}
5772
5773
			if ( elem.parentNode ) {
5774
				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
5775
					setGlobalEval( getAll( elem, "script" ) );
5776
				}
5777
				elem.parentNode.removeChild( elem );
5778
			}
5779
		}
5780
5781
		return this;
5782
	},
5783
5784
	empty: function() {
5785
		var elem,
5786
			i = 0;
5787
5788
		for ( ; (elem = this[i]) != null; i++ ) {
5789
			// Remove element nodes and prevent memory leaks
5790
			if ( elem.nodeType === 1 ) {
5791
				jQuery.cleanData( getAll( elem, false ) );
5792
			}
5793
5794
			// Remove any remaining nodes
5795
			while ( elem.firstChild ) {
5796
				elem.removeChild( elem.firstChild );
5797
			}
5798
5799
			// If this is a select, ensure that it displays empty (#12336)
5800
			// Support: IE<9
5801
			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
5802
				elem.options.length = 0;
5803
			}
5804
		}
5805
5806
		return this;
5807
	},
5808
5809
	clone: function( dataAndEvents, deepDataAndEvents ) {
5810
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5811
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5812
5813
		return this.map(function() {
5814
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5815
		});
5816
	},
5817
5818
	html: function( value ) {
5819
		return access( this, function( value ) {
5820
			var elem = this[ 0 ] || {},
5821
				i = 0,
5822
				l = this.length;
5823
5824
			if ( value === undefined ) {
5825
				return elem.nodeType === 1 ?
5826
					elem.innerHTML.replace( rinlinejQuery, "" ) :
5827
					undefined;
5828
			}
5829
5830
			// See if we can take a shortcut and just use innerHTML
5831
			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5832
				( support.htmlSerialize || !rnoshimcache.test( value )  ) &&
5833
				( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
5834
				!wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) {
5835
5836
				value = value.replace( rxhtmlTag, "<$1></$2>" );
5837
5838
				try {
5839
					for (; i < l; i++ ) {
5840
						// Remove element nodes and prevent memory leaks
5841
						elem = this[i] || {};
5842
						if ( elem.nodeType === 1 ) {
5843
							jQuery.cleanData( getAll( elem, false ) );
5844
							elem.innerHTML = value;
5845
						}
5846
					}
5847
5848
					elem = 0;
5849
5850
				// If using innerHTML throws an exception, use the fallback method
5851
				} catch(e) {}
5852
			}
5853
5854
			if ( elem ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if elem is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
5855
				this.empty().append( value );
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
5856
			}
5857
		}, null, value, arguments.length );
5858
	},
5859
5860
	replaceWith: function() {
5861
		var arg = arguments[ 0 ];
5862
5863
		// Make the changes, replacing each context element with the new content
5864
		this.domManip( arguments, function( elem ) {
5865
			arg = this.parentNode;
5866
5867
			jQuery.cleanData( getAll( this ) );
5868
5869
			if ( arg ) {
5870
				arg.replaceChild( elem, this );
5871
			}
5872
		});
5873
5874
		// Force removal if there was no new content (e.g., from empty arguments)
5875
		return arg && (arg.length || arg.nodeType) ? this : this.remove();
5876
	},
5877
5878
	detach: function( selector ) {
5879
		return this.remove( selector, true );
5880
	},
5881
5882
	domManip: function( args, callback ) {
5883
5884
		// Flatten any nested arrays
5885
		args = concat.apply( [], args );
5886
5887
		var first, node, hasScripts,
5888
			scripts, doc, fragment,
5889
			i = 0,
5890
			l = this.length,
5891
			set = this,
5892
			iNoClone = l - 1,
5893
			value = args[0],
5894
			isFunction = jQuery.isFunction( value );
5895
5896
		// We can't cloneNode fragments that contain checked, in WebKit
5897
		if ( isFunction ||
5898
				( l > 1 && typeof value === "string" &&
5899
					!support.checkClone && rchecked.test( value ) ) ) {
5900
			return this.each(function( index ) {
5901
				var self = set.eq( index );
5902
				if ( isFunction ) {
5903
					args[0] = value.call( this, index, self.html() );
5904
				}
5905
				self.domManip( args, callback );
5906
			});
5907
		}
5908
5909
		if ( l ) {
5910
			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
5911
			first = fragment.firstChild;
5912
5913
			if ( fragment.childNodes.length === 1 ) {
5914
				fragment = first;
5915
			}
5916
5917
			if ( first ) {
5918
				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5919
				hasScripts = scripts.length;
5920
5921
				// Use the original fragment for the last item instead of the first because it can end up
5922
				// being emptied incorrectly in certain situations (#8070).
5923
				for ( ; i < l; i++ ) {
5924
					node = fragment;
5925
5926
					if ( i !== iNoClone ) {
5927
						node = jQuery.clone( node, true, true );
5928
5929
						// Keep references to cloned scripts for later restoration
5930
						if ( hasScripts ) {
5931
							jQuery.merge( scripts, getAll( node, "script" ) );
5932
						}
5933
					}
5934
5935
					callback.call( this[i], node, i );
5936
				}
5937
5938
				if ( hasScripts ) {
5939
					doc = scripts[ scripts.length - 1 ].ownerDocument;
5940
5941
					// Reenable scripts
5942
					jQuery.map( scripts, restoreScript );
5943
5944
					// Evaluate executable scripts on first document insertion
5945
					for ( i = 0; i < hasScripts; i++ ) {
5946
						node = scripts[ i ];
5947
						if ( rscriptType.test( node.type || "" ) &&
5948
							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
5949
5950
							if ( node.src ) {
5951
								// Optional AJAX dependency, but won't run scripts if not present
5952
								if ( jQuery._evalUrl ) {
5953
									jQuery._evalUrl( node.src );
5954
								}
5955
							} else {
5956
								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
5957
							}
5958
						}
5959
					}
5960
				}
5961
5962
				// Fix #11809: Avoid leaking memory
5963
				fragment = first = null;
0 ignored issues
show
Unused Code introduced by
The assignment to first seems to be never used. If you intend to free memory here, this is not necessary since the variable leaves the scope anyway.
Loading history...
Unused Code introduced by
The assignment to variable fragment seems to be never used. Consider removing it.
Loading history...
5964
			}
5965
		}
5966
5967
		return this;
5968
	}
5969
});
5970
5971
jQuery.each({
5972
	appendTo: "append",
5973
	prependTo: "prepend",
5974
	insertBefore: "before",
5975
	insertAfter: "after",
5976
	replaceAll: "replaceWith"
5977
}, function( name, original ) {
5978
	jQuery.fn[ name ] = function( selector ) {
5979
		var elems,
5980
			i = 0,
5981
			ret = [],
5982
			insert = jQuery( selector ),
5983
			last = insert.length - 1;
5984
5985
		for ( ; i <= last; i++ ) {
5986
			elems = i === last ? this : this.clone(true);
5987
			jQuery( insert[i] )[ original ]( elems );
5988
5989
			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
5990
			push.apply( ret, elems.get() );
5991
		}
5992
5993
		return this.pushStack( ret );
5994
	};
5995
});
5996
5997
5998
var iframe,
5999
	elemdisplay = {};
6000
6001
/**
6002
 * Retrieve the actual display of a element
6003
 * @param {String} name nodeName of the element
6004
 * @param {Object} doc Document object
6005
 */
6006
// Called only from within defaultDisplay
6007
function actualDisplay( name, doc ) {
6008
	var style,
6009
		elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
6010
6011
		// getDefaultComputedStyle might be reliably used only on attached element
6012
		display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
6013
6014
			// Use of this method is a temporary fix (more like optmization) until something better comes along,
6015
			// since it was removed from specification and supported only in FF
6016
			style.display : jQuery.css( elem[ 0 ], "display" );
0 ignored issues
show
Bug introduced by
The variable style seems to not be initialized for all possible execution paths.
Loading history...
6017
6018
	// We don't have any data stored on the element,
6019
	// so use "detach" method as fast way to get rid of the element
6020
	elem.detach();
6021
6022
	return display;
6023
}
6024
6025
/**
6026
 * Try to determine the default display value of an element
6027
 * @param {String} nodeName
6028
 */
6029
function defaultDisplay( nodeName ) {
6030
	var doc = document,
6031
		display = elemdisplay[ nodeName ];
6032
6033
	if ( !display ) {
6034
		display = actualDisplay( nodeName, doc );
6035
6036
		// If the simple way fails, read from inside an iframe
6037
		if ( display === "none" || !display ) {
6038
6039
			// Use the already-created iframe if possible
6040
			iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
6041
6042
			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
6043
			doc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;
6044
6045
			// Support: IE
6046
			doc.write();
6047
			doc.close();
6048
6049
			display = actualDisplay( nodeName, doc );
6050
			iframe.detach();
6051
		}
6052
6053
		// Store the correct default display
6054
		elemdisplay[ nodeName ] = display;
6055
	}
6056
6057
	return display;
6058
}
6059
6060
6061
(function() {
6062
	var shrinkWrapBlocksVal;
6063
6064
	support.shrinkWrapBlocks = function() {
6065
		if ( shrinkWrapBlocksVal != null ) {
6066
			return shrinkWrapBlocksVal;
6067
		}
6068
6069
		// Will be changed later if needed.
6070
		shrinkWrapBlocksVal = false;
6071
6072
		// Minified: var b,c,d
6073
		var div, body, container;
6074
6075
		body = document.getElementsByTagName( "body" )[ 0 ];
6076
		if ( !body || !body.style ) {
6077
			// Test fired too early or in an unsupported environment, exit.
6078
			return;
6079
		}
6080
6081
		// Setup
6082
		div = document.createElement( "div" );
6083
		container = document.createElement( "div" );
6084
		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
6085
		body.appendChild( container ).appendChild( div );
6086
6087
		// Support: IE6
6088
		// Check if elements with layout shrink-wrap their children
6089
		if ( typeof div.style.zoom !== strundefined ) {
6090
			// Reset CSS: box-sizing; display; margin; border
6091
			div.style.cssText =
6092
				// Support: Firefox<29, Android 2.3
6093
				// Vendor-prefix box-sizing
6094
				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
6095
				"box-sizing:content-box;display:block;margin:0;border:0;" +
6096
				"padding:1px;width:1px;zoom:1";
6097
			div.appendChild( document.createElement( "div" ) ).style.width = "5px";
6098
			shrinkWrapBlocksVal = div.offsetWidth !== 3;
6099
		}
6100
6101
		body.removeChild( container );
6102
6103
		return shrinkWrapBlocksVal;
6104
	};
6105
6106
})();
6107
var rmargin = (/^margin/);
6108
6109
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
6110
6111
6112
6113
var getStyles, curCSS,
6114
	rposition = /^(top|right|bottom|left)$/;
6115
6116
if ( window.getComputedStyle ) {
6117
	getStyles = function( elem ) {
6118
		return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
6119
	};
6120
6121
	curCSS = function( elem, name, computed ) {
6122
		var width, minWidth, maxWidth, ret,
6123
			style = elem.style;
6124
6125
		computed = computed || getStyles( elem );
6126
6127
		// getPropertyValue is only needed for .css('filter') in IE9, see #12537
6128
		ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;
6129
6130
		if ( computed ) {
6131
6132
			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
6133
				ret = jQuery.style( elem, name );
6134
			}
6135
6136
			// A tribute to the "awesome hack by Dean Edwards"
6137
			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
6138
			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
6139
			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
6140
			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
6141
6142
				// Remember the original values
6143
				width = style.width;
6144
				minWidth = style.minWidth;
6145
				maxWidth = style.maxWidth;
6146
6147
				// Put in the new values to get a computed value out
6148
				style.minWidth = style.maxWidth = style.width = ret;
6149
				ret = computed.width;
6150
6151
				// Revert the changed values
6152
				style.width = width;
6153
				style.minWidth = minWidth;
6154
				style.maxWidth = maxWidth;
6155
			}
6156
		}
6157
6158
		// Support: IE
6159
		// IE returns zIndex value as an integer.
6160
		return ret === undefined ?
6161
			ret :
6162
			ret + "";
6163
	};
6164
} else if ( document.documentElement.currentStyle ) {
6165
	getStyles = function( elem ) {
6166
		return elem.currentStyle;
6167
	};
6168
6169
	curCSS = function( elem, name, computed ) {
6170
		var left, rs, rsLeft, ret,
6171
			style = elem.style;
6172
6173
		computed = computed || getStyles( elem );
6174
		ret = computed ? computed[ name ] : undefined;
6175
6176
		// Avoid setting ret to empty string here
6177
		// so we don't default to auto
6178
		if ( ret == null && style && style[ name ] ) {
6179
			ret = style[ name ];
6180
		}
6181
6182
		// From the awesome hack by Dean Edwards
6183
		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6184
6185
		// If we're not dealing with a regular pixel number
6186
		// but a number that has a weird ending, we need to convert it to pixels
6187
		// but not position css attributes, as those are proportional to the parent element instead
6188
		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
6189
		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
6190
6191
			// Remember the original values
6192
			left = style.left;
6193
			rs = elem.runtimeStyle;
6194
			rsLeft = rs && rs.left;
6195
6196
			// Put in the new values to get a computed value out
6197
			if ( rsLeft ) {
6198
				rs.left = elem.currentStyle.left;
6199
			}
6200
			style.left = name === "fontSize" ? "1em" : ret;
6201
			ret = style.pixelLeft + "px";
6202
6203
			// Revert the changed values
6204
			style.left = left;
6205
			if ( rsLeft ) {
6206
				rs.left = rsLeft;
6207
			}
6208
		}
6209
6210
		// Support: IE
6211
		// IE returns zIndex value as an integer.
6212
		return ret === undefined ?
6213
			ret :
6214
			ret + "" || "auto";
6215
	};
6216
}
6217
6218
6219
6220
6221
function addGetHookIf( conditionFn, hookFn ) {
6222
	// Define the hook, we'll check on the first run if it's really needed.
6223
	return {
6224
		get: function() {
6225
			var condition = conditionFn();
6226
6227
			if ( condition == null ) {
6228
				// The test was not ready at this point; screw the hook this time
6229
				// but check again when needed next time.
6230
				return;
6231
			}
6232
6233
			if ( condition ) {
6234
				// Hook not needed (or it's not possible to use it due to missing dependency),
6235
				// remove it.
6236
				// Since there are no other hooks for marginRight, remove the whole object.
6237
				delete this.get;
6238
				return;
6239
			}
6240
6241
			// Hook needed; redefine it so that the support test is not executed again.
6242
6243
			return (this.get = hookFn).apply( this, arguments );
6244
		}
6245
	};
6246
}
6247
6248
6249
(function() {
6250
	// Minified: var b,c,d,e,f,g, h,i
6251
	var div, style, a, pixelPositionVal, boxSizingReliableVal,
6252
		reliableHiddenOffsetsVal, reliableMarginRightVal;
6253
6254
	// Setup
6255
	div = document.createElement( "div" );
6256
	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
6257
	a = div.getElementsByTagName( "a" )[ 0 ];
6258
	style = a && a.style;
6259
6260
	// Finish early in limited (non-browser) environments
6261
	if ( !style ) {
6262
		return;
6263
	}
6264
6265
	style.cssText = "float:left;opacity:.5";
6266
6267
	// Support: IE<9
6268
	// Make sure that element opacity exists (as opposed to filter)
6269
	support.opacity = style.opacity === "0.5";
6270
6271
	// Verify style float existence
6272
	// (IE uses styleFloat instead of cssFloat)
6273
	support.cssFloat = !!style.cssFloat;
6274
6275
	div.style.backgroundClip = "content-box";
6276
	div.cloneNode( true ).style.backgroundClip = "";
6277
	support.clearCloneStyle = div.style.backgroundClip === "content-box";
6278
6279
	// Support: Firefox<29, Android 2.3
6280
	// Vendor-prefix box-sizing
6281
	support.boxSizing = style.boxSizing === "" || style.MozBoxSizing === "" ||
6282
		style.WebkitBoxSizing === "";
6283
6284
	jQuery.extend(support, {
6285
		reliableHiddenOffsets: function() {
6286
			if ( reliableHiddenOffsetsVal == null ) {
6287
				computeStyleTests();
6288
			}
6289
			return reliableHiddenOffsetsVal;
6290
		},
6291
6292
		boxSizingReliable: function() {
6293
			if ( boxSizingReliableVal == null ) {
6294
				computeStyleTests();
6295
			}
6296
			return boxSizingReliableVal;
6297
		},
6298
6299
		pixelPosition: function() {
6300
			if ( pixelPositionVal == null ) {
6301
				computeStyleTests();
6302
			}
6303
			return pixelPositionVal;
6304
		},
6305
6306
		// Support: Android 2.3
6307
		reliableMarginRight: function() {
6308
			if ( reliableMarginRightVal == null ) {
6309
				computeStyleTests();
6310
			}
6311
			return reliableMarginRightVal;
6312
		}
6313
	});
6314
6315
	function computeStyleTests() {
6316
		// Minified: var b,c,d,j
6317
		var div, body, container, contents;
6318
6319
		body = document.getElementsByTagName( "body" )[ 0 ];
6320
		if ( !body || !body.style ) {
6321
			// Test fired too early or in an unsupported environment, exit.
6322
			return;
6323
		}
6324
6325
		// Setup
6326
		div = document.createElement( "div" );
6327
		container = document.createElement( "div" );
6328
		container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px";
6329
		body.appendChild( container ).appendChild( div );
6330
6331
		div.style.cssText =
6332
			// Support: Firefox<29, Android 2.3
6333
			// Vendor-prefix box-sizing
6334
			"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
6335
			"box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
6336
			"border:1px;padding:1px;width:4px;position:absolute";
6337
6338
		// Support: IE<9
6339
		// Assume reasonable values in the absence of getComputedStyle
6340
		pixelPositionVal = boxSizingReliableVal = false;
6341
		reliableMarginRightVal = true;
6342
6343
		// Check for getComputedStyle so that this code is not run in IE<9.
6344
		if ( window.getComputedStyle ) {
6345
			pixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
6346
			boxSizingReliableVal =
6347
				( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
6348
6349
			// Support: Android 2.3
6350
			// Div with explicit width and no margin-right incorrectly
6351
			// gets computed margin-right based on width of container (#3333)
6352
			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6353
			contents = div.appendChild( document.createElement( "div" ) );
6354
6355
			// Reset CSS: box-sizing; display; margin; border; padding
6356
			contents.style.cssText = div.style.cssText =
6357
				// Support: Firefox<29, Android 2.3
6358
				// Vendor-prefix box-sizing
6359
				"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
6360
				"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
6361
			contents.style.marginRight = contents.style.width = "0";
6362
			div.style.width = "1px";
6363
6364
			reliableMarginRightVal =
6365
				!parseFloat( ( window.getComputedStyle( contents, null ) || {} ).marginRight );
6366
		}
6367
6368
		// Support: IE8
6369
		// Check if table cells still have offsetWidth/Height when they are set
6370
		// to display:none and there are still other visible table cells in a
6371
		// table row; if so, offsetWidth/Height are not reliable for use when
6372
		// determining if an element has been hidden directly using
6373
		// display:none (it is still safe to use offsets if a parent element is
6374
		// hidden; don safety goggles and see bug #4512 for more information).
6375
		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
6376
		contents = div.getElementsByTagName( "td" );
6377
		contents[ 0 ].style.cssText = "margin:0;border:0;padding:0;display:none";
6378
		reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
6379
		if ( reliableHiddenOffsetsVal ) {
6380
			contents[ 0 ].style.display = "";
6381
			contents[ 1 ].style.display = "none";
6382
			reliableHiddenOffsetsVal = contents[ 0 ].offsetHeight === 0;
6383
		}
6384
6385
		body.removeChild( container );
6386
	}
6387
6388
})();
6389
6390
6391
// A method for quickly swapping in/out CSS properties to get correct calculations.
6392
jQuery.swap = function( elem, options, callback, args ) {
6393
	var ret, name,
6394
		old = {};
6395
6396
	// Remember the old values, and insert the new ones
6397
	for ( name in options ) {
6398
		old[ name ] = elem.style[ name ];
6399
		elem.style[ name ] = options[ name ];
6400
	}
6401
6402
	ret = callback.apply( elem, args || [] );
6403
6404
	// Revert the old values
6405
	for ( name in options ) {
6406
		elem.style[ name ] = old[ name ];
6407
	}
6408
6409
	return ret;
6410
};
6411
6412
6413
var
6414
		ralpha = /alpha\([^)]*\)/i,
6415
	ropacity = /opacity\s*=\s*([^)]*)/,
6416
6417
	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
6418
	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
6419
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
6420
	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
6421
	rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
6422
6423
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6424
	cssNormalTransform = {
6425
		letterSpacing: "0",
6426
		fontWeight: "400"
6427
	},
6428
6429
	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
6430
6431
6432
// return a css property mapped to a potentially vendor prefixed property
6433
function vendorPropName( style, name ) {
6434
6435
	// shortcut for names that are not vendor prefixed
6436
	if ( name in style ) {
6437
		return name;
6438
	}
6439
6440
	// check for vendor prefixed names
6441
	var capName = name.charAt(0).toUpperCase() + name.slice(1),
6442
		origName = name,
6443
		i = cssPrefixes.length;
6444
6445
	while ( i-- ) {
6446
		name = cssPrefixes[ i ] + capName;
6447
		if ( name in style ) {
6448
			return name;
6449
		}
6450
	}
6451
6452
	return origName;
6453
}
6454
6455
function showHide( elements, show ) {
6456
	var display, elem, hidden,
6457
		values = [],
6458
		index = 0,
6459
		length = elements.length;
6460
6461
	for ( ; index < length; index++ ) {
6462
		elem = elements[ index ];
6463
		if ( !elem.style ) {
6464
			continue;
6465
		}
6466
6467
		values[ index ] = jQuery._data( elem, "olddisplay" );
6468
		display = elem.style.display;
6469
		if ( show ) {
6470
			// Reset the inline display of this element to learn if it is
6471
			// being hidden by cascaded rules or not
6472
			if ( !values[ index ] && display === "none" ) {
6473
				elem.style.display = "";
6474
			}
6475
6476
			// Set elements which have been overridden with display: none
6477
			// in a stylesheet to whatever the default browser style is
6478
			// for such an element
6479
			if ( elem.style.display === "" && isHidden( elem ) ) {
6480
				values[ index ] = jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
6481
			}
6482
		} else {
6483
			hidden = isHidden( elem );
6484
6485
			if ( display && display !== "none" || !hidden ) {
6486
				jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
6487
			}
6488
		}
6489
	}
6490
6491
	// Set the display of most of the elements in a second loop
6492
	// to avoid the constant reflow
6493
	for ( index = 0; index < length; index++ ) {
6494
		elem = elements[ index ];
6495
		if ( !elem.style ) {
6496
			continue;
6497
		}
6498
		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
6499
			elem.style.display = show ? values[ index ] || "" : "none";
6500
		}
6501
	}
6502
6503
	return elements;
6504
}
6505
6506
function setPositiveNumber( elem, value, subtract ) {
6507
	var matches = rnumsplit.exec( value );
6508
	return matches ?
6509
		// Guard against undefined "subtract", e.g., when used as in cssHooks
6510
		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
6511
		value;
6512
}
6513
6514
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
6515
	var i = extra === ( isBorderBox ? "border" : "content" ) ?
6516
		// If we already have the right measurement, avoid augmentation
6517
		4 :
6518
		// Otherwise initialize for horizontal or vertical properties
6519
		name === "width" ? 1 : 0,
6520
6521
		val = 0;
6522
6523
	for ( ; i < 4; i += 2 ) {
6524
		// both box models exclude margin, so add it if we want it
6525
		if ( extra === "margin" ) {
6526
			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
6527
		}
6528
6529
		if ( isBorderBox ) {
6530
			// border-box includes padding, so remove it if we want content
6531
			if ( extra === "content" ) {
6532
				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6533
			}
6534
6535
			// at this point, extra isn't border nor margin, so remove border
6536
			if ( extra !== "margin" ) {
6537
				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6538
			}
6539
		} else {
6540
			// at this point, extra isn't content, so add padding
6541
			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
6542
6543
			// at this point, extra isn't content nor padding, so add border
6544
			if ( extra !== "padding" ) {
6545
				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
6546
			}
6547
		}
6548
	}
6549
6550
	return val;
6551
}
6552
6553
function getWidthOrHeight( elem, name, extra ) {
6554
6555
	// Start with offset property, which is equivalent to the border-box value
6556
	var valueIsBorderBox = true,
6557
		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6558
		styles = getStyles( elem ),
6559
		isBorderBox = support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
6560
6561
	// some non-html elements return undefined for offsetWidth, so check for null/undefined
6562
	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
6563
	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
6564
	if ( val <= 0 || val == null ) {
6565
		// Fall back to computed then uncomputed css if necessary
6566
		val = curCSS( elem, name, styles );
6567
		if ( val < 0 || val == null ) {
6568
			val = elem.style[ name ];
6569
		}
6570
6571
		// Computed unit is not pixels. Stop here and return.
6572
		if ( rnumnonpx.test(val) ) {
6573
			return val;
6574
		}
6575
6576
		// we need the check for style in case a browser which returns unreliable values
6577
		// for getComputedStyle silently falls back to the reliable elem.style
6578
		valueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );
6579
6580
		// Normalize "", auto, and prepare for extra
6581
		val = parseFloat( val ) || 0;
6582
	}
6583
6584
	// use the active box-sizing model to add/subtract irrelevant styles
6585
	return ( val +
6586
		augmentWidthOrHeight(
6587
			elem,
6588
			name,
6589
			extra || ( isBorderBox ? "border" : "content" ),
6590
			valueIsBorderBox,
6591
			styles
6592
		)
6593
	) + "px";
6594
}
6595
6596
jQuery.extend({
6597
	// Add in style property hooks for overriding the default
6598
	// behavior of getting and setting a style property
6599
	cssHooks: {
6600
		opacity: {
6601
			get: function( elem, computed ) {
6602
				if ( computed ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if computed is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
6603
					// We should always get a number back from opacity
6604
					var ret = curCSS( elem, "opacity" );
6605
					return ret === "" ? "1" : ret;
6606
				}
6607
			}
6608
		}
6609
	},
6610
6611
	// Don't automatically add "px" to these possibly-unitless properties
6612
	cssNumber: {
6613
		"columnCount": true,
6614
		"fillOpacity": true,
6615
		"flexGrow": true,
6616
		"flexShrink": true,
6617
		"fontWeight": true,
6618
		"lineHeight": true,
6619
		"opacity": true,
6620
		"order": true,
6621
		"orphans": true,
6622
		"widows": true,
6623
		"zIndex": true,
6624
		"zoom": true
6625
	},
6626
6627
	// Add in properties whose names you wish to fix before
6628
	// setting or getting the value
6629
	cssProps: {
6630
		// normalize float css property
6631
		"float": support.cssFloat ? "cssFloat" : "styleFloat"
6632
	},
6633
6634
	// Get and set the style property on a DOM Node
6635
	style: function( elem, name, value, extra ) {
6636
		// Don't set styles on text and comment nodes
6637
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6638
			return;
6639
		}
6640
6641
		// Make sure that we're working with the right name
6642
		var ret, type, hooks,
6643
			origName = jQuery.camelCase( name ),
6644
			style = elem.style;
6645
6646
		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
6647
6648
		// gets hook for the prefixed version
6649
		// followed by the unprefixed version
6650
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6651
6652
		// Check if we're setting a value
6653
		if ( value !== undefined ) {
6654
			type = typeof value;
6655
6656
			// convert relative number strings (+= or -=) to relative numbers. #7345
6657
			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
6658
				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
6659
				// Fixes bug #9237
6660
				type = "number";
6661
			}
6662
6663
			// Make sure that null and NaN values aren't set. See: #7116
6664
			if ( value == null || value !== value ) {
6665
				return;
6666
			}
6667
6668
			// If a number was passed in, add 'px' to the (except for certain CSS properties)
6669
			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6670
				value += "px";
6671
			}
6672
6673
			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
6674
			// but it would mean to define eight (for every problematic property) identical functions
6675
			if ( !support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
6676
				style[ name ] = "inherit";
6677
			}
6678
6679
			// If a hook was provided, use that value, otherwise just set the specified value
6680
			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !hooks || !("set" in hoo...e, extra) !== undefined is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
6681
6682
				// Support: IE
6683
				// Swallow errors from 'invalid' CSS values (#5509)
6684
				try {
6685
					style[ name ] = value;
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
6686
				} catch(e) {}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
6687
			}
6688
6689
		} else {
6690
			// If a hook was provided get the non-computed value from there
6691
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6692
				return ret;
6693
			}
6694
6695
			// Otherwise just get the value from the style object
6696
			return style[ name ];
6697
		}
6698
	},
6699
6700
	css: function( elem, name, extra, styles ) {
6701
		var num, val, hooks,
6702
			origName = jQuery.camelCase( name );
6703
6704
		// Make sure that we're working with the right name
6705
		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
6706
6707
		// gets hook for the prefixed version
6708
		// followed by the unprefixed version
6709
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
6710
6711
		// If a hook was provided get the computed value from there
6712
		if ( hooks && "get" in hooks ) {
6713
			val = hooks.get( elem, true, extra );
6714
		}
6715
6716
		// Otherwise, if a way to get the computed value exists, use that
6717
		if ( val === undefined ) {
0 ignored issues
show
Bug introduced by
The variable val does not seem to be initialized in case hooks && "get" in hooks on line 6712 is false. Are you sure this can never be the case?
Loading history...
6718
			val = curCSS( elem, name, styles );
6719
		}
6720
6721
		//convert "normal" to computed value
6722
		if ( val === "normal" && name in cssNormalTransform ) {
6723
			val = cssNormalTransform[ name ];
6724
		}
6725
6726
		// Return, converting to number if forced or a qualifier was provided and val looks numeric
6727
		if ( extra === "" || extra ) {
6728
			num = parseFloat( val );
6729
			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
6730
		}
6731
		return val;
6732
	}
6733
});
6734
6735
jQuery.each([ "height", "width" ], function( i, name ) {
6736
	jQuery.cssHooks[ name ] = {
6737
		get: function( elem, computed, extra ) {
6738
			if ( computed ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if computed is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
6739
				// certain elements can have dimension info if we invisibly show them
6740
				// however, it must have a current display style that would benefit from this
6741
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
6742
					jQuery.swap( elem, cssShow, function() {
6743
						return getWidthOrHeight( elem, name, extra );
6744
					}) :
6745
					getWidthOrHeight( elem, name, extra );
6746
			}
6747
		},
6748
6749
		set: function( elem, value, extra ) {
6750
			var styles = extra && getStyles( elem );
6751
			return setPositiveNumber( elem, value, extra ?
6752
				augmentWidthOrHeight(
6753
					elem,
6754
					name,
6755
					extra,
6756
					support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6757
					styles
6758
				) : 0
6759
			);
6760
		}
6761
	};
6762
});
6763
6764
if ( !support.opacity ) {
6765
	jQuery.cssHooks.opacity = {
6766
		get: function( elem, computed ) {
6767
			// IE uses filters for opacity
6768
			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6769
				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
6770
				computed ? "1" : "";
6771
		},
6772
6773
		set: function( elem, value ) {
6774
			var style = elem.style,
6775
				currentStyle = elem.currentStyle,
6776
				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
6777
				filter = currentStyle && currentStyle.filter || style.filter || "";
6778
6779
			// IE has trouble with opacity if it does not have layout
6780
			// Force it by setting the zoom level
6781
			style.zoom = 1;
6782
6783
			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
6784
			// if value === "", then remove inline opacity #12685
6785
			if ( ( value >= 1 || value === "" ) &&
6786
					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
6787
					style.removeAttribute ) {
6788
6789
				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
6790
				// if "filter:" is present at all, clearType is disabled, we want to avoid this
6791
				// style.removeAttribute is IE Only, but so apparently is this code path...
6792
				style.removeAttribute( "filter" );
6793
6794
				// if there is no filter style applied in a css rule or unset inline opacity, we are done
6795
				if ( value === "" || currentStyle && !currentStyle.filter ) {
6796
					return;
6797
				}
6798
			}
6799
6800
			// otherwise, set new filter values
6801
			style.filter = ralpha.test( filter ) ?
6802
				filter.replace( ralpha, opacity ) :
6803
				filter + " " + opacity;
6804
		}
6805
	};
6806
}
6807
6808
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
6809
	function( elem, computed ) {
6810
		if ( computed ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if computed is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
6811
			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6812
			// Work around by temporarily setting element display to inline-block
6813
			return jQuery.swap( elem, { "display": "inline-block" },
6814
				curCSS, [ elem, "marginRight" ] );
0 ignored issues
show
Bug introduced by
The variable curCSS does not seem to be initialized in case document.documentElement.currentStyle on line 6164 is false. Are you sure the function swap handles undefined variables?
Loading history...
6815
		}
6816
	}
6817
);
6818
6819
// These hooks are used by animate to expand properties
6820
jQuery.each({
6821
	margin: "",
6822
	padding: "",
6823
	border: "Width"
6824
}, function( prefix, suffix ) {
6825
	jQuery.cssHooks[ prefix + suffix ] = {
6826
		expand: function( value ) {
6827
			var i = 0,
6828
				expanded = {},
6829
6830
				// assumes a single number if not a string
6831
				parts = typeof value === "string" ? value.split(" ") : [ value ];
6832
6833
			for ( ; i < 4; i++ ) {
6834
				expanded[ prefix + cssExpand[ i ] + suffix ] =
6835
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6836
			}
6837
6838
			return expanded;
6839
		}
6840
	};
6841
6842
	if ( !rmargin.test( prefix ) ) {
6843
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6844
	}
6845
});
6846
6847
jQuery.fn.extend({
6848
	css: function( name, value ) {
6849
		return access( this, function( elem, name, value ) {
6850
			var styles, len,
6851
				map = {},
6852
				i = 0;
6853
6854
			if ( jQuery.isArray( name ) ) {
6855
				styles = getStyles( elem );
6856
				len = name.length;
6857
6858
				for ( ; i < len; i++ ) {
6859
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6860
				}
6861
6862
				return map;
6863
			}
6864
6865
			return value !== undefined ?
6866
				jQuery.style( elem, name, value ) :
6867
				jQuery.css( elem, name );
6868
		}, name, value, arguments.length > 1 );
6869
	},
6870
	show: function() {
6871
		return showHide( this, true );
6872
	},
6873
	hide: function() {
6874
		return showHide( this );
6875
	},
6876
	toggle: function( state ) {
6877
		if ( typeof state === "boolean" ) {
6878
			return state ? this.show() : this.hide();
6879
		}
6880
6881
		return this.each(function() {
6882
			if ( isHidden( this ) ) {
6883
				jQuery( this ).show();
6884
			} else {
6885
				jQuery( this ).hide();
6886
			}
6887
		});
6888
	}
6889
});
6890
6891
6892
function Tween( elem, options, prop, end, easing ) {
6893
	return new Tween.prototype.init( elem, options, prop, end, easing );
6894
}
6895
jQuery.Tween = Tween;
6896
6897
Tween.prototype = {
6898
	constructor: Tween,
6899
	init: function( elem, options, prop, end, easing, unit ) {
6900
		this.elem = elem;
6901
		this.prop = prop;
6902
		this.easing = easing || "swing";
6903
		this.options = options;
6904
		this.start = this.now = this.cur();
6905
		this.end = end;
6906
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6907
	},
6908
	cur: function() {
6909
		var hooks = Tween.propHooks[ this.prop ];
6910
6911
		return hooks && hooks.get ?
6912
			hooks.get( this ) :
6913
			Tween.propHooks._default.get( this );
6914
	},
6915
	run: function( percent ) {
6916
		var eased,
6917
			hooks = Tween.propHooks[ this.prop ];
6918
6919
		if ( this.options.duration ) {
6920
			this.pos = eased = jQuery.easing[ this.easing ](
6921
				percent, this.options.duration * percent, 0, 1, this.options.duration
6922
			);
6923
		} else {
6924
			this.pos = eased = percent;
6925
		}
6926
		this.now = ( this.end - this.start ) * eased + this.start;
6927
6928
		if ( this.options.step ) {
6929
			this.options.step.call( this.elem, this.now, this );
6930
		}
6931
6932
		if ( hooks && hooks.set ) {
6933
			hooks.set( this );
6934
		} else {
6935
			Tween.propHooks._default.set( this );
6936
		}
6937
		return this;
6938
	}
6939
};
6940
6941
Tween.prototype.init.prototype = Tween.prototype;
6942
6943
Tween.propHooks = {
6944
	_default: {
6945
		get: function( tween ) {
6946
			var result;
6947
6948
			if ( tween.elem[ tween.prop ] != null &&
6949
				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
6950
				return tween.elem[ tween.prop ];
6951
			}
6952
6953
			// passing an empty string as a 3rd parameter to .css will automatically
6954
			// attempt a parseFloat and fallback to a string if the parse fails
6955
			// so, simple values such as "10px" are parsed to Float.
6956
			// complex values such as "rotate(1rad)" are returned as is.
6957
			result = jQuery.css( tween.elem, tween.prop, "" );
6958
			// Empty strings, null, undefined and "auto" are converted to 0.
6959
			return !result || result === "auto" ? 0 : result;
6960
		},
6961
		set: function( tween ) {
6962
			// use step hook for back compat - use cssHook if its there - use .style if its
6963
			// available and use plain properties where available
6964
			if ( jQuery.fx.step[ tween.prop ] ) {
6965
				jQuery.fx.step[ tween.prop ]( tween );
6966
			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
6967
				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6968
			} else {
6969
				tween.elem[ tween.prop ] = tween.now;
6970
			}
6971
		}
6972
	}
6973
};
6974
6975
// Support: IE <=9
6976
// Panic based approach to setting things on disconnected nodes
6977
6978
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6979
	set: function( tween ) {
6980
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
6981
			tween.elem[ tween.prop ] = tween.now;
6982
		}
6983
	}
6984
};
6985
6986
jQuery.easing = {
6987
	linear: function( p ) {
6988
		return p;
6989
	},
6990
	swing: function( p ) {
6991
		return 0.5 - Math.cos( p * Math.PI ) / 2;
6992
	}
6993
};
6994
6995
jQuery.fx = Tween.prototype.init;
6996
6997
// Back Compat <1.8 extension point
6998
jQuery.fx.step = {};
6999
7000
7001
7002
7003
var
7004
	fxNow, timerId,
7005
	rfxtypes = /^(?:toggle|show|hide)$/,
7006
	rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
7007
	rrun = /queueHooks$/,
7008
	animationPrefilters = [ defaultPrefilter ],
7009
	tweeners = {
7010
		"*": [ function( prop, value ) {
7011
			var tween = this.createTween( prop, value ),
7012
				target = tween.cur(),
7013
				parts = rfxnum.exec( value ),
7014
				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
7015
7016
				// Starting value computation is required for potential unit mismatches
7017
				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
7018
					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
7019
				scale = 1,
7020
				maxIterations = 20;
7021
7022
			if ( start && start[ 3 ] !== unit ) {
7023
				// Trust units reported by jQuery.css
7024
				unit = unit || start[ 3 ];
7025
7026
				// Make sure we update the tween properties later on
7027
				parts = parts || [];
7028
7029
				// Iteratively approximate from a nonzero starting point
7030
				start = +target || 1;
7031
7032
				do {
7033
					// If previous iteration zeroed out, double until we get *something*
7034
					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
7035
					scale = scale || ".5";
7036
7037
					// Adjust and apply
7038
					start = start / scale;
7039
					jQuery.style( tween.elem, prop, start + unit );
7040
7041
				// Update scale, tolerating zero or NaN from tween.cur()
7042
				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
7043
				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
7044
			}
7045
7046
			// Update tween properties
7047
			if ( parts ) {
7048
				start = tween.start = +start || +target || 0;
7049
				tween.unit = unit;
7050
				// If a +=/-= token was provided, we're doing a relative animation
7051
				tween.end = parts[ 1 ] ?
7052
					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
7053
					+parts[ 2 ];
7054
			}
7055
7056
			return tween;
7057
		} ]
7058
	};
7059
7060
// Animations created synchronously will run synchronously
7061
function createFxNow() {
7062
	setTimeout(function() {
7063
		fxNow = undefined;
7064
	});
7065
	return ( fxNow = jQuery.now() );
7066
}
7067
7068
// Generate parameters to create a standard animation
7069
function genFx( type, includeWidth ) {
7070
	var which,
7071
		attrs = { height: type },
7072
		i = 0;
7073
7074
	// if we include width, step value is 1 to do all cssExpand values,
7075
	// if we don't include width, step value is 2 to skip over Left and Right
7076
	includeWidth = includeWidth ? 1 : 0;
7077
	for ( ; i < 4 ; i += 2 - includeWidth ) {
7078
		which = cssExpand[ i ];
7079
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
7080
	}
7081
7082
	if ( includeWidth ) {
7083
		attrs.opacity = attrs.width = type;
7084
	}
7085
7086
	return attrs;
7087
}
7088
7089
function createTween( value, prop, animation ) {
7090
	var tween,
7091
		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
7092
		index = 0,
7093
		length = collection.length;
7094
	for ( ; index < length; index++ ) {
7095
		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
7096
7097
			// we're done with this property
7098
			return tween;
7099
		}
7100
	}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
7101
}
7102
7103
function defaultPrefilter( elem, props, opts ) {
7104
	/* jshint validthis: true */
7105
	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
7106
		anim = this,
7107
		orig = {},
7108
		style = elem.style,
7109
		hidden = elem.nodeType && isHidden( elem ),
7110
		dataShow = jQuery._data( elem, "fxshow" );
7111
7112
	// handle queue: false promises
7113
	if ( !opts.queue ) {
7114
		hooks = jQuery._queueHooks( elem, "fx" );
7115
		if ( hooks.unqueued == null ) {
7116
			hooks.unqueued = 0;
7117
			oldfire = hooks.empty.fire;
7118
			hooks.empty.fire = function() {
7119
				if ( !hooks.unqueued ) {
7120
					oldfire();
7121
				}
7122
			};
7123
		}
7124
		hooks.unqueued++;
7125
7126
		anim.always(function() {
7127
			// doing this makes sure that the complete handler will be called
7128
			// before this completes
7129
			anim.always(function() {
7130
				hooks.unqueued--;
7131
				if ( !jQuery.queue( elem, "fx" ).length ) {
7132
					hooks.empty.fire();
7133
				}
7134
			});
7135
		});
7136
	}
7137
7138
	// height/width overflow pass
7139
	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
7140
		// Make sure that nothing sneaks out
7141
		// Record all 3 overflow attributes because IE does not
7142
		// change the overflow attribute when overflowX and
7143
		// overflowY are set to the same value
7144
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
7145
7146
		// Set display property to inline-block for height/width
7147
		// animations on inline elements that are having width/height animated
7148
		display = jQuery.css( elem, "display" );
7149
7150
		// Test default display if display is currently "none"
7151
		checkDisplay = display === "none" ?
7152
			jQuery._data( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
7153
7154
		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
7155
7156
			// inline-level elements accept inline-block;
7157
			// block-level elements need to be inline with layout
7158
			if ( !support.inlineBlockNeedsLayout || defaultDisplay( elem.nodeName ) === "inline" ) {
7159
				style.display = "inline-block";
7160
			} else {
7161
				style.zoom = 1;
7162
			}
7163
		}
7164
	}
7165
7166
	if ( opts.overflow ) {
7167
		style.overflow = "hidden";
7168
		if ( !support.shrinkWrapBlocks() ) {
7169
			anim.always(function() {
7170
				style.overflow = opts.overflow[ 0 ];
7171
				style.overflowX = opts.overflow[ 1 ];
7172
				style.overflowY = opts.overflow[ 2 ];
7173
			});
7174
		}
7175
	}
7176
7177
	// show/hide pass
7178
	for ( prop in props ) {
7179
		value = props[ prop ];
7180
		if ( rfxtypes.exec( value ) ) {
7181
			delete props[ prop ];
7182
			toggle = toggle || value === "toggle";
7183
			if ( value === ( hidden ? "hide" : "show" ) ) {
7184
7185
				// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
7186
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
7187
					hidden = true;
7188
				} else {
7189
					continue;
7190
				}
7191
			}
7192
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
7193
7194
		// Any non-fx value stops us from restoring the original display value
7195
		} else {
7196
			display = undefined;
7197
		}
7198
	}
7199
7200
	if ( !jQuery.isEmptyObject( orig ) ) {
7201
		if ( dataShow ) {
7202
			if ( "hidden" in dataShow ) {
7203
				hidden = dataShow.hidden;
7204
			}
7205
		} else {
7206
			dataShow = jQuery._data( elem, "fxshow", {} );
7207
		}
7208
7209
		// store state if its toggle - enables .stop().toggle() to "reverse"
7210
		if ( toggle ) {
7211
			dataShow.hidden = !hidden;
7212
		}
7213
		if ( hidden ) {
7214
			jQuery( elem ).show();
7215
		} else {
7216
			anim.done(function() {
7217
				jQuery( elem ).hide();
7218
			});
7219
		}
7220
		anim.done(function() {
7221
			var prop;
7222
			jQuery._removeData( elem, "fxshow" );
7223
			for ( prop in orig ) {
7224
				jQuery.style( elem, prop, orig[ prop ] );
7225
			}
7226
		});
7227
		for ( prop in orig ) {
7228
			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
7229
7230
			if ( !( prop in dataShow ) ) {
7231
				dataShow[ prop ] = tween.start;
7232
				if ( hidden ) {
7233
					tween.end = tween.start;
7234
					tween.start = prop === "width" || prop === "height" ? 1 : 0;
7235
				}
7236
			}
7237
		}
7238
7239
	// If this is a noop like .hide().hide(), restore an overwritten display value
7240
	} else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
0 ignored issues
show
Bug introduced by
The variable display does not seem to be initialized in case elem.nodeType === 1 && "...ops || "width" in props on line 7139 is false. Are you sure this can never be the case?
Loading history...
7241
		style.display = display;
7242
	}
7243
}
7244
7245
function propFilter( props, specialEasing ) {
7246
	var index, name, easing, value, hooks;
7247
7248
	// camelCase, specialEasing and expand cssHook pass
7249
	for ( index in props ) {
7250
		name = jQuery.camelCase( index );
7251
		easing = specialEasing[ name ];
7252
		value = props[ index ];
7253
		if ( jQuery.isArray( value ) ) {
7254
			easing = value[ 1 ];
7255
			value = props[ index ] = value[ 0 ];
7256
		}
7257
7258
		if ( index !== name ) {
7259
			props[ name ] = value;
7260
			delete props[ index ];
7261
		}
7262
7263
		hooks = jQuery.cssHooks[ name ];
7264
		if ( hooks && "expand" in hooks ) {
7265
			value = hooks.expand( value );
7266
			delete props[ name ];
7267
7268
			// not quite $.extend, this wont overwrite keys already present.
7269
			// also - reusing 'index' from above because we have the correct "name"
7270
			for ( index in value ) {
7271
				if ( !( index in props ) ) {
7272
					props[ index ] = value[ index ];
7273
					specialEasing[ index ] = easing;
7274
				}
7275
			}
7276
		} else {
7277
			specialEasing[ name ] = easing;
7278
		}
7279
	}
7280
}
7281
7282
function Animation( elem, properties, options ) {
7283
	var result,
7284
		stopped,
7285
		index = 0,
7286
		length = animationPrefilters.length,
7287
		deferred = jQuery.Deferred().always( function() {
7288
			// don't match elem in the :animated selector
7289
			delete tick.elem;
7290
		}),
7291
		tick = function() {
7292
			if ( stopped ) {
7293
				return false;
7294
			}
7295
			var currentTime = fxNow || createFxNow(),
7296
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
7297
				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
7298
				temp = remaining / animation.duration || 0,
7299
				percent = 1 - temp,
7300
				index = 0,
7301
				length = animation.tweens.length;
7302
7303
			for ( ; index < length ; index++ ) {
7304
				animation.tweens[ index ].run( percent );
7305
			}
7306
7307
			deferred.notifyWith( elem, [ animation, percent, remaining ]);
7308
7309
			if ( percent < 1 && length ) {
7310
				return remaining;
7311
			} else {
7312
				deferred.resolveWith( elem, [ animation ] );
7313
				return false;
7314
			}
7315
		},
7316
		animation = deferred.promise({
7317
			elem: elem,
7318
			props: jQuery.extend( {}, properties ),
7319
			opts: jQuery.extend( true, { specialEasing: {} }, options ),
7320
			originalProperties: properties,
7321
			originalOptions: options,
7322
			startTime: fxNow || createFxNow(),
7323
			duration: options.duration,
7324
			tweens: [],
7325
			createTween: function( prop, end ) {
7326
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
7327
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
7328
				animation.tweens.push( tween );
7329
				return tween;
7330
			},
7331
			stop: function( gotoEnd ) {
7332
				var index = 0,
7333
					// if we are going to the end, we want to run all the tweens
7334
					// otherwise we skip this part
7335
					length = gotoEnd ? animation.tweens.length : 0;
7336
				if ( stopped ) {
7337
					return this;
7338
				}
7339
				stopped = true;
7340
				for ( ; index < length ; index++ ) {
7341
					animation.tweens[ index ].run( 1 );
7342
				}
7343
7344
				// resolve when we played the last frame
7345
				// otherwise, reject
7346
				if ( gotoEnd ) {
7347
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
7348
				} else {
7349
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
7350
				}
7351
				return this;
7352
			}
7353
		}),
7354
		props = animation.props;
7355
7356
	propFilter( props, animation.opts.specialEasing );
7357
7358
	for ( ; index < length ; index++ ) {
7359
		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
7360
		if ( result ) {
7361
			return result;
7362
		}
7363
	}
7364
7365
	jQuery.map( props, createTween, animation );
7366
7367
	if ( jQuery.isFunction( animation.opts.start ) ) {
7368
		animation.opts.start.call( elem, animation );
7369
	}
7370
7371
	jQuery.fx.timer(
7372
		jQuery.extend( tick, {
7373
			elem: elem,
7374
			anim: animation,
7375
			queue: animation.opts.queue
7376
		})
7377
	);
7378
7379
	// attach callbacks from options
7380
	return animation.progress( animation.opts.progress )
7381
		.done( animation.opts.done, animation.opts.complete )
7382
		.fail( animation.opts.fail )
7383
		.always( animation.opts.always );
7384
}
7385
7386
jQuery.Animation = jQuery.extend( Animation, {
7387
	tweener: function( props, callback ) {
7388
		if ( jQuery.isFunction( props ) ) {
7389
			callback = props;
7390
			props = [ "*" ];
7391
		} else {
7392
			props = props.split(" ");
7393
		}
7394
7395
		var prop,
7396
			index = 0,
7397
			length = props.length;
7398
7399
		for ( ; index < length ; index++ ) {
7400
			prop = props[ index ];
7401
			tweeners[ prop ] = tweeners[ prop ] || [];
7402
			tweeners[ prop ].unshift( callback );
7403
		}
7404
	},
7405
7406
	prefilter: function( callback, prepend ) {
7407
		if ( prepend ) {
7408
			animationPrefilters.unshift( callback );
7409
		} else {
7410
			animationPrefilters.push( callback );
7411
		}
7412
	}
7413
});
7414
7415
jQuery.speed = function( speed, easing, fn ) {
7416
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
7417
		complete: fn || !fn && easing ||
7418
			jQuery.isFunction( speed ) && speed,
7419
		duration: speed,
7420
		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
7421
	};
7422
7423
	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
7424
		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
7425
7426
	// normalize opt.queue - true/undefined/null -> "fx"
7427
	if ( opt.queue == null || opt.queue === true ) {
7428
		opt.queue = "fx";
7429
	}
7430
7431
	// Queueing
7432
	opt.old = opt.complete;
7433
7434
	opt.complete = function() {
7435
		if ( jQuery.isFunction( opt.old ) ) {
7436
			opt.old.call( this );
7437
		}
7438
7439
		if ( opt.queue ) {
7440
			jQuery.dequeue( this, opt.queue );
7441
		}
7442
	};
7443
7444
	return opt;
7445
};
7446
7447
jQuery.fn.extend({
7448
	fadeTo: function( speed, to, easing, callback ) {
7449
7450
		// show any hidden elements after setting opacity to 0
7451
		return this.filter( isHidden ).css( "opacity", 0 ).show()
7452
7453
			// animate to the value specified
7454
			.end().animate({ opacity: to }, speed, easing, callback );
7455
	},
7456
	animate: function( prop, speed, easing, callback ) {
7457
		var empty = jQuery.isEmptyObject( prop ),
7458
			optall = jQuery.speed( speed, easing, callback ),
7459
			doAnimation = function() {
7460
				// Operate on a copy of prop so per-property easing won't be lost
7461
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
7462
7463
				// Empty animations, or finishing resolves immediately
7464
				if ( empty || jQuery._data( this, "finish" ) ) {
7465
					anim.stop( true );
7466
				}
7467
			};
7468
			doAnimation.finish = doAnimation;
7469
7470
		return empty || optall.queue === false ?
7471
			this.each( doAnimation ) :
7472
			this.queue( optall.queue, doAnimation );
7473
	},
7474
	stop: function( type, clearQueue, gotoEnd ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
7475
		var stopQueue = function( hooks ) {
7476
			var stop = hooks.stop;
7477
			delete hooks.stop;
7478
			stop( gotoEnd );
7479
		};
7480
7481
		if ( typeof type !== "string" ) {
7482
			gotoEnd = clearQueue;
7483
			clearQueue = type;
7484
			type = undefined;
7485
		}
7486
		if ( clearQueue && type !== false ) {
7487
			this.queue( type || "fx", [] );
7488
		}
7489
7490
		return this.each(function() {
7491
			var dequeue = true,
7492
				index = type != null && type + "queueHooks",
7493
				timers = jQuery.timers,
7494
				data = jQuery._data( this );
7495
7496
			if ( index ) {
7497
				if ( data[ index ] && data[ index ].stop ) {
7498
					stopQueue( data[ index ] );
7499
				}
7500
			} else {
7501
				for ( index in data ) {
7502
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
7503
						stopQueue( data[ index ] );
7504
					}
7505
				}
7506
			}
7507
7508
			for ( index = timers.length; index--; ) {
7509
				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
7510
					timers[ index ].anim.stop( gotoEnd );
7511
					dequeue = false;
7512
					timers.splice( index, 1 );
7513
				}
7514
			}
7515
7516
			// start the next in the queue if the last step wasn't forced
7517
			// timers currently will call their complete callbacks, which will dequeue
7518
			// but only if they were gotoEnd
7519
			if ( dequeue || !gotoEnd ) {
7520
				jQuery.dequeue( this, type );
7521
			}
7522
		});
7523
	},
7524
	finish: function( type ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
7525
		if ( type !== false ) {
7526
			type = type || "fx";
7527
		}
7528
		return this.each(function() {
7529
			var index,
7530
				data = jQuery._data( this ),
7531
				queue = data[ type + "queue" ],
7532
				hooks = data[ type + "queueHooks" ],
7533
				timers = jQuery.timers,
7534
				length = queue ? queue.length : 0;
7535
7536
			// enable finishing flag on private data
7537
			data.finish = true;
7538
7539
			// empty the queue first
7540
			jQuery.queue( this, type, [] );
7541
7542
			if ( hooks && hooks.stop ) {
7543
				hooks.stop.call( this, true );
7544
			}
7545
7546
			// look for any active animations, and finish them
7547
			for ( index = timers.length; index--; ) {
7548
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
7549
					timers[ index ].anim.stop( true );
7550
					timers.splice( index, 1 );
7551
				}
7552
			}
7553
7554
			// look for any animations in the old queue and finish them
7555
			for ( index = 0; index < length; index++ ) {
7556
				if ( queue[ index ] && queue[ index ].finish ) {
7557
					queue[ index ].finish.call( this );
7558
				}
7559
			}
7560
7561
			// turn off finishing flag
7562
			delete data.finish;
7563
		});
7564
	}
7565
});
7566
7567
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
7568
	var cssFn = jQuery.fn[ name ];
7569
	jQuery.fn[ name ] = function( speed, easing, callback ) {
7570
		return speed == null || typeof speed === "boolean" ?
7571
			cssFn.apply( this, arguments ) :
7572
			this.animate( genFx( name, true ), speed, easing, callback );
7573
	};
7574
});
7575
7576
// Generate shortcuts for custom animations
7577
jQuery.each({
7578
	slideDown: genFx("show"),
7579
	slideUp: genFx("hide"),
7580
	slideToggle: genFx("toggle"),
7581
	fadeIn: { opacity: "show" },
7582
	fadeOut: { opacity: "hide" },
7583
	fadeToggle: { opacity: "toggle" }
7584
}, function( name, props ) {
7585
	jQuery.fn[ name ] = function( speed, easing, callback ) {
7586
		return this.animate( props, speed, easing, callback );
7587
	};
7588
});
7589
7590
jQuery.timers = [];
7591
jQuery.fx.tick = function() {
7592
	var timer,
7593
		timers = jQuery.timers,
7594
		i = 0;
7595
7596
	fxNow = jQuery.now();
7597
7598
	for ( ; i < timers.length; i++ ) {
7599
		timer = timers[ i ];
7600
		// Checks the timer has not already been removed
7601
		if ( !timer() && timers[ i ] === timer ) {
7602
			timers.splice( i--, 1 );
7603
		}
7604
	}
7605
7606
	if ( !timers.length ) {
7607
		jQuery.fx.stop();
7608
	}
7609
	fxNow = undefined;
7610
};
7611
7612
jQuery.fx.timer = function( timer ) {
7613
	jQuery.timers.push( timer );
7614
	if ( timer() ) {
7615
		jQuery.fx.start();
7616
	} else {
7617
		jQuery.timers.pop();
7618
	}
7619
};
7620
7621
jQuery.fx.interval = 13;
7622
7623
jQuery.fx.start = function() {
7624
	if ( !timerId ) {
7625
		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
7626
	}
7627
};
7628
7629
jQuery.fx.stop = function() {
7630
	clearInterval( timerId );
7631
	timerId = null;
7632
};
7633
7634
jQuery.fx.speeds = {
7635
	slow: 600,
7636
	fast: 200,
7637
	// Default speed
7638
	_default: 400
7639
};
7640
7641
7642
// Based off of the plugin by Clint Helfers, with permission.
7643
// http://blindsignals.com/index.php/2009/07/jquery-delay/
7644
jQuery.fn.delay = function( time, type ) {
7645
	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
7646
	type = type || "fx";
7647
7648
	return this.queue( type, function( next, hooks ) {
7649
		var timeout = setTimeout( next, time );
7650
		hooks.stop = function() {
7651
			clearTimeout( timeout );
7652
		};
7653
	});
7654
};
7655
7656
7657
(function() {
7658
	// Minified: var a,b,c,d,e
7659
	var input, div, select, a, opt;
7660
7661
	// Setup
7662
	div = document.createElement( "div" );
7663
	div.setAttribute( "className", "t" );
7664
	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
7665
	a = div.getElementsByTagName("a")[ 0 ];
7666
7667
	// First batch of tests.
7668
	select = document.createElement("select");
7669
	opt = select.appendChild( document.createElement("option") );
7670
	input = div.getElementsByTagName("input")[ 0 ];
7671
7672
	a.style.cssText = "top:1px";
7673
7674
	// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
7675
	support.getSetAttribute = div.className !== "t";
7676
7677
	// Get the style information from getAttribute
7678
	// (IE uses .cssText instead)
7679
	support.style = /top/.test( a.getAttribute("style") );
7680
7681
	// Make sure that URLs aren't manipulated
7682
	// (IE normalizes it by default)
7683
	support.hrefNormalized = a.getAttribute("href") === "/a";
7684
7685
	// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
7686
	support.checkOn = !!input.value;
7687
7688
	// Make sure that a selected-by-default option has a working selected property.
7689
	// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
7690
	support.optSelected = opt.selected;
7691
7692
	// Tests for enctype support on a form (#6743)
7693
	support.enctype = !!document.createElement("form").enctype;
7694
7695
	// Make sure that the options inside disabled selects aren't marked as disabled
7696
	// (WebKit marks them as disabled)
7697
	select.disabled = true;
7698
	support.optDisabled = !opt.disabled;
7699
7700
	// Support: IE8 only
7701
	// Check if we can trust getAttribute("value")
7702
	input = document.createElement( "input" );
7703
	input.setAttribute( "value", "" );
7704
	support.input = input.getAttribute( "value" ) === "";
7705
7706
	// Check if an input maintains its value after becoming a radio
7707
	input.value = "t";
7708
	input.setAttribute( "type", "radio" );
7709
	support.radioValue = input.value === "t";
7710
})();
7711
7712
7713
var rreturn = /\r/g;
7714
7715
jQuery.fn.extend({
7716
	val: function( value ) {
7717
		var hooks, ret, isFunction,
7718
			elem = this[0];
7719
7720
		if ( !arguments.length ) {
7721
			if ( elem ) {
7722
				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
7723
7724
				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
7725
					return ret;
7726
				}
7727
7728
				ret = elem.value;
7729
7730
				return typeof ret === "string" ?
7731
					// handle most common string cases
7732
					ret.replace(rreturn, "") :
7733
					// handle cases where value is null/undef or number
7734
					ret == null ? "" : ret;
7735
			}
7736
7737
			return;
7738
		}
7739
7740
		isFunction = jQuery.isFunction( value );
7741
7742
		return this.each(function( i ) {
7743
			var val;
7744
7745
			if ( this.nodeType !== 1 ) {
7746
				return;
7747
			}
7748
7749
			if ( isFunction ) {
7750
				val = value.call( this, i, jQuery( this ).val() );
7751
			} else {
7752
				val = value;
7753
			}
7754
7755
			// Treat null/undefined as ""; convert numbers to string
7756
			if ( val == null ) {
7757
				val = "";
7758
			} else if ( typeof val === "number" ) {
7759
				val += "";
7760
			} else if ( jQuery.isArray( val ) ) {
7761
				val = jQuery.map( val, function( value ) {
7762
					return value == null ? "" : value + "";
7763
				});
7764
			}
7765
7766
			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
7767
7768
			// If set returns undefined, fall back to normal setting
7769
			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
7770
				this.value = val;
7771
			}
7772
		});
7773
	}
7774
});
7775
7776
jQuery.extend({
7777
	valHooks: {
7778
		option: {
7779
			get: function( elem ) {
7780
				var val = jQuery.find.attr( elem, "value" );
7781
				return val != null ?
7782
					val :
7783
					// Support: IE10-11+
7784
					// option.text throws exceptions (#14686, #14858)
7785
					jQuery.trim( jQuery.text( elem ) );
7786
			}
7787
		},
7788
		select: {
7789
			get: function( elem ) {
7790
				var value, option,
7791
					options = elem.options,
7792
					index = elem.selectedIndex,
7793
					one = elem.type === "select-one" || index < 0,
7794
					values = one ? null : [],
7795
					max = one ? index + 1 : options.length,
7796
					i = index < 0 ?
7797
						max :
7798
						one ? index : 0;
7799
7800
				// Loop through all the selected options
7801
				for ( ; i < max; i++ ) {
7802
					option = options[ i ];
7803
7804
					// oldIE doesn't update selected after form reset (#2551)
7805
					if ( ( option.selected || i === index ) &&
7806
							// Don't return options that are disabled or in a disabled optgroup
7807
							( support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
7808
							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
7809
7810
						// Get the specific value for the option
7811
						value = jQuery( option ).val();
7812
7813
						// We don't need an array for one selects
7814
						if ( one ) {
7815
							return value;
7816
						}
7817
7818
						// Multi-Selects return an array
7819
						values.push( value );
7820
					}
7821
				}
7822
7823
				return values;
7824
			},
7825
7826
			set: function( elem, value ) {
7827
				var optionSet, option,
7828
					options = elem.options,
7829
					values = jQuery.makeArray( value ),
7830
					i = options.length;
7831
7832
				while ( i-- ) {
7833
					option = options[ i ];
7834
7835
					if ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {
7836
7837
						// Support: IE6
7838
						// When new option element is added to select box we need to
7839
						// force reflow of newly added node in order to workaround delay
7840
						// of initialization properties
7841
						try {
7842
							option.selected = optionSet = true;
7843
7844
						} catch ( _ ) {
7845
7846
							// Will be executed only in IE6
7847
							option.scrollHeight;
0 ignored issues
show
introduced by
The result of the property access to option.scrollHeight is not used.
Loading history...
7848
						}
7849
7850
					} else {
7851
						option.selected = false;
7852
					}
7853
				}
7854
7855
				// Force browsers to behave consistently when non-matching value is set
7856
				if ( !optionSet ) {
7857
					elem.selectedIndex = -1;
7858
				}
7859
7860
				return options;
7861
			}
7862
		}
7863
	}
7864
});
7865
7866
// Radios and checkboxes getter/setter
7867
jQuery.each([ "radio", "checkbox" ], function() {
7868
	jQuery.valHooks[ this ] = {
7869
		set: function( elem, value ) {
7870
			if ( jQuery.isArray( value ) ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if jQuery.isArray(value) is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
7871
				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
7872
			}
7873
		}
7874
	};
7875
	if ( !support.checkOn ) {
7876
		jQuery.valHooks[ this ].get = function( elem ) {
7877
			// Support: Webkit
7878
			// "" is returned instead of "on" if a value isn't specified
7879
			return elem.getAttribute("value") === null ? "on" : elem.value;
7880
		};
7881
	}
7882
});
7883
7884
7885
7886
7887
var nodeHook, boolHook,
7888
	attrHandle = jQuery.expr.attrHandle,
7889
	ruseDefault = /^(?:checked|selected)$/i,
7890
	getSetAttribute = support.getSetAttribute,
7891
	getSetInput = support.input;
7892
7893
jQuery.fn.extend({
7894
	attr: function( name, value ) {
7895
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
7896
	},
7897
7898
	removeAttr: function( name ) {
7899
		return this.each(function() {
7900
			jQuery.removeAttr( this, name );
7901
		});
7902
	}
7903
});
7904
7905
jQuery.extend({
7906
	attr: function( elem, name, value ) {
7907
		var hooks, ret,
7908
			nType = elem.nodeType;
7909
7910
		// don't get/set attributes on text, comment and attribute nodes
7911
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
7912
			return;
7913
		}
7914
7915
		// Fallback to prop when attributes are not supported
7916
		if ( typeof elem.getAttribute === strundefined ) {
7917
			return jQuery.prop( elem, name, value );
7918
		}
7919
7920
		// All attributes are lowercase
7921
		// Grab necessary hook if one is defined
7922
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
7923
			name = name.toLowerCase();
7924
			hooks = jQuery.attrHooks[ name ] ||
7925
				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
7926
		}
7927
7928
		if ( value !== undefined ) {
7929
7930
			if ( value === null ) {
7931
				jQuery.removeAttr( elem, name );
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
7932
7933
			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
7934
				return ret;
7935
7936
			} else {
7937
				elem.setAttribute( name, value + "" );
7938
				return value;
7939
			}
7940
7941
		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
7942
			return ret;
7943
7944
		} else {
7945
			ret = jQuery.find.attr( elem, name );
7946
7947
			// Non-existent attributes return null, we normalize to undefined
7948
			return ret == null ?
7949
				undefined :
7950
				ret;
7951
		}
7952
	},
7953
7954
	removeAttr: function( elem, value ) {
7955
		var name, propName,
7956
			i = 0,
7957
			attrNames = value && value.match( rnotwhite );
7958
7959
		if ( attrNames && elem.nodeType === 1 ) {
7960
			while ( (name = attrNames[i++]) ) {
7961
				propName = jQuery.propFix[ name ] || name;
7962
7963
				// Boolean attributes get special treatment (#10870)
7964
				if ( jQuery.expr.match.bool.test( name ) ) {
7965
					// Set corresponding property to false
7966
					if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
7967
						elem[ propName ] = false;
7968
					// Support: IE<9
7969
					// Also clear defaultChecked/defaultSelected (if appropriate)
7970
					} else {
7971
						elem[ jQuery.camelCase( "default-" + name ) ] =
7972
							elem[ propName ] = false;
7973
					}
7974
7975
				// See #9699 for explanation of this approach (setting first, then removal)
7976
				} else {
7977
					jQuery.attr( elem, name, "" );
7978
				}
7979
7980
				elem.removeAttribute( getSetAttribute ? name : propName );
7981
			}
7982
		}
7983
	},
7984
7985
	attrHooks: {
7986
		type: {
7987
			set: function( elem, value ) {
7988
				if ( !support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !support.radioValue && v...nodeName(elem, "input") is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
7989
					// Setting the type on a radio button after the value resets the value in IE6-9
7990
					// Reset value to default in case type is set after value during creation
7991
					var val = elem.value;
7992
					elem.setAttribute( "type", value );
7993
					if ( val ) {
7994
						elem.value = val;
7995
					}
7996
					return value;
7997
				}
7998
			}
7999
		}
8000
	}
8001
});
8002
8003
// Hook for boolean attributes
8004
boolHook = {
8005
	set: function( elem, value, name ) {
8006
		if ( value === false ) {
8007
			// Remove boolean attributes when set to false
8008
			jQuery.removeAttr( elem, name );
8009
		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
8010
			// IE<8 needs the *property* name
8011
			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
8012
8013
		// Use defaultChecked and defaultSelected for oldIE
8014
		} else {
8015
			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
8016
		}
8017
8018
		return name;
8019
	}
8020
};
8021
8022
// Retrieve booleans specially
8023
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
8024
8025
	var getter = attrHandle[ name ] || jQuery.find.attr;
8026
8027
	attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?
8028
		function( elem, name, isXML ) {
8029
			var ret, handle;
8030
			if ( !isXML ) {
8031
				// Avoid an infinite loop by temporarily removing this function from the getter
8032
				handle = attrHandle[ name ];
8033
				attrHandle[ name ] = ret;
0 ignored issues
show
Bug introduced by
The variable ret seems to be never initialized.
Loading history...
8034
				ret = getter( elem, name, isXML ) != null ?
8035
					name.toLowerCase() :
8036
					null;
8037
				attrHandle[ name ] = handle;
8038
			}
8039
			return ret;
0 ignored issues
show
Bug introduced by
The variable ret does not seem to be initialized in case !isXML on line 8030 is false. Are you sure this can never be the case?
Loading history...
8040
		} :
8041
		function( elem, name, isXML ) {
8042
			if ( !isXML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !isXML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8043
				return elem[ jQuery.camelCase( "default-" + name ) ] ?
8044
					name.toLowerCase() :
8045
					null;
8046
			}
8047
		};
8048
});
8049
8050
// fix oldIE attroperties
8051
if ( !getSetInput || !getSetAttribute ) {
8052
	jQuery.attrHooks.value = {
8053
		set: function( elem, value, name ) {
8054
			if ( jQuery.nodeName( elem, "input" ) ) {
8055
				// Does not return so that setAttribute is also used
8056
				elem.defaultValue = value;
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
8057
			} else {
8058
				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
8059
				return nodeHook && nodeHook.set( elem, value, name );
8060
			}
8061
		}
8062
	};
8063
}
8064
8065
// IE6/7 do not support getting/setting some attributes with get/setAttribute
8066
if ( !getSetAttribute ) {
8067
8068
	// Use this for any attribute in IE6/7
8069
	// This fixes almost every IE6/7 issue
8070
	nodeHook = {
8071
		set: function( elem, value, name ) {
8072
			// Set the existing or create a new attribute node
8073
			var ret = elem.getAttributeNode( name );
8074
			if ( !ret ) {
8075
				elem.setAttributeNode(
8076
					(ret = elem.ownerDocument.createAttribute( name ))
8077
				);
8078
			}
8079
8080
			ret.value = value += "";
8081
8082
			// Break association with cloned elements by also using setAttribute (#9646)
8083
			if ( name === "value" || value === elem.getAttribute( name ) ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if name === "value" || valu...elem.getAttribute(name) is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8084
				return value;
8085
			}
8086
		}
8087
	};
8088
8089
	// Some attributes are constructed with empty-string values when not defined
8090
	attrHandle.id = attrHandle.name = attrHandle.coords =
8091
		function( elem, name, isXML ) {
8092
			var ret;
8093
			if ( !isXML ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !isXML is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8094
				return (ret = elem.getAttributeNode( name )) && ret.value !== "" ?
8095
					ret.value :
8096
					null;
8097
			}
8098
		};
8099
8100
	// Fixing value retrieval on a button requires this module
8101
	jQuery.valHooks.button = {
8102
		get: function( elem, name ) {
8103
			var ret = elem.getAttributeNode( name );
8104
			if ( ret && ret.specified ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if ret && ret.specified is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8105
				return ret.value;
8106
			}
8107
		},
8108
		set: nodeHook.set
8109
	};
8110
8111
	// Set contenteditable to false on removals(#10429)
8112
	// Setting to empty string throws an error as an invalid value
8113
	jQuery.attrHooks.contenteditable = {
8114
		set: function( elem, value, name ) {
8115
			nodeHook.set( elem, value === "" ? false : value, name );
8116
		}
8117
	};
8118
8119
	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
8120
	// This is for removals
8121
	jQuery.each([ "width", "height" ], function( i, name ) {
8122
		jQuery.attrHooks[ name ] = {
8123
			set: function( elem, value ) {
8124
				if ( value === "" ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if value === "" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8125
					elem.setAttribute( name, "auto" );
8126
					return value;
8127
				}
8128
			}
8129
		};
8130
	});
8131
}
8132
8133
if ( !support.style ) {
8134
	jQuery.attrHooks.style = {
8135
		get: function( elem ) {
8136
			// Return undefined in the case of empty string
8137
			// Note: IE uppercases css property names, but if we were to .toLowerCase()
8138
			// .cssText, that would destroy case senstitivity in URL's, like in "background"
8139
			return elem.style.cssText || undefined;
8140
		},
8141
		set: function( elem, value ) {
8142
			return ( elem.style.cssText = value + "" );
8143
		}
8144
	};
8145
}
8146
8147
8148
8149
8150
var rfocusable = /^(?:input|select|textarea|button|object)$/i,
8151
	rclickable = /^(?:a|area)$/i;
8152
8153
jQuery.fn.extend({
8154
	prop: function( name, value ) {
8155
		return access( this, jQuery.prop, name, value, arguments.length > 1 );
8156
	},
8157
8158
	removeProp: function( name ) {
8159
		name = jQuery.propFix[ name ] || name;
8160
		return this.each(function() {
8161
			// try/catch handles cases where IE balks (such as removing a property on window)
8162
			try {
8163
				this[ name ] = undefined;
8164
				delete this[ name ];
8165
			} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
8166
		});
8167
	}
8168
});
8169
8170
jQuery.extend({
8171
	propFix: {
8172
		"for": "htmlFor",
8173
		"class": "className"
8174
	},
8175
8176
	prop: function( elem, name, value ) {
8177
		var ret, hooks, notxml,
8178
			nType = elem.nodeType;
8179
8180
		// don't get/set properties on text, comment and attribute nodes
8181
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
8182
			return;
8183
		}
8184
8185
		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
8186
8187
		if ( notxml ) {
8188
			// Fix name and attach hooks
8189
			name = jQuery.propFix[ name ] || name;
8190
			hooks = jQuery.propHooks[ name ];
8191
		}
8192
8193
		if ( value !== undefined ) {
8194
			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
8195
				ret :
0 ignored issues
show
Bug introduced by
The variable ret seems to not be initialized for all possible execution paths.
Loading history...
8196
				( elem[ name ] = value );
8197
8198
		} else {
8199
			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
8200
				ret :
8201
				elem[ name ];
8202
		}
8203
	},
8204
8205
	propHooks: {
8206
		tabIndex: {
8207
			get: function( elem ) {
8208
				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
8209
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
8210
				// Use proper attribute retrieval(#12072)
8211
				var tabindex = jQuery.find.attr( elem, "tabindex" );
8212
8213
				return tabindex ?
8214
					parseInt( tabindex, 10 ) :
8215
					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
8216
						0 :
8217
						-1;
8218
			}
8219
		}
8220
	}
8221
});
8222
8223
// Some attributes require a special call on IE
8224
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
8225
if ( !support.hrefNormalized ) {
8226
	// href/src property should get the full normalized URL (#10299/#12915)
8227
	jQuery.each([ "href", "src" ], function( i, name ) {
8228
		jQuery.propHooks[ name ] = {
8229
			get: function( elem ) {
8230
				return elem.getAttribute( name, 4 );
8231
			}
8232
		};
8233
	});
8234
}
8235
8236
// Support: Safari, IE9+
8237
// mis-reports the default selected property of an option
8238
// Accessing the parent's selectedIndex property fixes it
8239
if ( !support.optSelected ) {
8240
	jQuery.propHooks.selected = {
8241
		get: function( elem ) {
8242
			var parent = elem.parentNode;
8243
8244
			if ( parent ) {
8245
				parent.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.selectedIndex is not used.
Loading history...
8246
8247
				// Make sure that it also works with optgroups, see #5701
8248
				if ( parent.parentNode ) {
8249
					parent.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.parentNode.selectedIndex is not used.
Loading history...
8250
				}
8251
			}
8252
			return null;
8253
		}
8254
	};
8255
}
8256
8257
jQuery.each([
8258
	"tabIndex",
8259
	"readOnly",
8260
	"maxLength",
8261
	"cellSpacing",
8262
	"cellPadding",
8263
	"rowSpan",
8264
	"colSpan",
8265
	"useMap",
8266
	"frameBorder",
8267
	"contentEditable"
8268
], function() {
8269
	jQuery.propFix[ this.toLowerCase() ] = this;
8270
});
8271
8272
// IE6/7 call enctype encoding
8273
if ( !support.enctype ) {
8274
	jQuery.propFix.enctype = "encoding";
8275
}
8276
8277
8278
8279
8280
var rclass = /[\t\r\n\f]/g;
8281
8282
jQuery.fn.extend({
8283
	addClass: function( value ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
8284
		var classes, elem, cur, clazz, j, finalValue,
8285
			i = 0,
8286
			len = this.length,
8287
			proceed = typeof value === "string" && value;
8288
8289
		if ( jQuery.isFunction( value ) ) {
8290
			return this.each(function( j ) {
8291
				jQuery( this ).addClass( value.call( this, j, this.className ) );
8292
			});
8293
		}
8294
8295
		if ( proceed ) {
8296
			// The disjunction here is for better compressibility (see removeClass)
8297
			classes = ( value || "" ).match( rnotwhite ) || [];
8298
8299
			for ( ; i < len; i++ ) {
8300
				elem = this[ i ];
8301
				cur = elem.nodeType === 1 && ( elem.className ?
8302
					( " " + elem.className + " " ).replace( rclass, " " ) :
8303
					" "
8304
				);
8305
8306
				if ( cur ) {
8307
					j = 0;
8308
					while ( (clazz = classes[j++]) ) {
8309
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
8310
							cur += clazz + " ";
8311
						}
8312
					}
8313
8314
					// only assign if different to avoid unneeded rendering.
8315
					finalValue = jQuery.trim( cur );
8316
					if ( elem.className !== finalValue ) {
8317
						elem.className = finalValue;
8318
					}
8319
				}
8320
			}
8321
		}
8322
8323
		return this;
8324
	},
8325
8326
	removeClass: function( value ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
8327
		var classes, elem, cur, clazz, j, finalValue,
8328
			i = 0,
8329
			len = this.length,
8330
			proceed = arguments.length === 0 || typeof value === "string" && value;
8331
8332
		if ( jQuery.isFunction( value ) ) {
8333
			return this.each(function( j ) {
8334
				jQuery( this ).removeClass( value.call( this, j, this.className ) );
8335
			});
8336
		}
8337
		if ( proceed ) {
8338
			classes = ( value || "" ).match( rnotwhite ) || [];
8339
8340
			for ( ; i < len; i++ ) {
8341
				elem = this[ i ];
8342
				// This expression is here for better compressibility (see addClass)
8343
				cur = elem.nodeType === 1 && ( elem.className ?
8344
					( " " + elem.className + " " ).replace( rclass, " " ) :
8345
					""
8346
				);
8347
8348
				if ( cur ) {
8349
					j = 0;
8350
					while ( (clazz = classes[j++]) ) {
8351
						// Remove *all* instances
8352
						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
8353
							cur = cur.replace( " " + clazz + " ", " " );
8354
						}
8355
					}
8356
8357
					// only assign if different to avoid unneeded rendering.
8358
					finalValue = value ? jQuery.trim( cur ) : "";
8359
					if ( elem.className !== finalValue ) {
8360
						elem.className = finalValue;
8361
					}
8362
				}
8363
			}
8364
		}
8365
8366
		return this;
8367
	},
8368
8369
	toggleClass: function( value, stateVal ) {
8370
		var type = typeof value;
8371
8372
		if ( typeof stateVal === "boolean" && type === "string" ) {
8373
			return stateVal ? this.addClass( value ) : this.removeClass( value );
8374
		}
8375
8376
		if ( jQuery.isFunction( value ) ) {
8377
			return this.each(function( i ) {
8378
				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
8379
			});
8380
		}
8381
8382
		return this.each(function() {
8383
			if ( type === "string" ) {
8384
				// toggle individual class names
8385
				var className,
8386
					i = 0,
8387
					self = jQuery( this ),
8388
					classNames = value.match( rnotwhite ) || [];
8389
8390
				while ( (className = classNames[ i++ ]) ) {
8391
					// check each className given, space separated list
8392
					if ( self.hasClass( className ) ) {
8393
						self.removeClass( className );
8394
					} else {
8395
						self.addClass( className );
8396
					}
8397
				}
8398
8399
			// Toggle whole class name
8400
			} else if ( type === strundefined || type === "boolean" ) {
8401
				if ( this.className ) {
8402
					// store className if set
8403
					jQuery._data( this, "__className__", this.className );
8404
				}
8405
8406
				// If the element has a class name or if we're passed "false",
8407
				// then remove the whole classname (if there was one, the above saved it).
8408
				// Otherwise bring back whatever was previously saved (if anything),
8409
				// falling back to the empty string if nothing was stored.
8410
				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
8411
			}
8412
		});
8413
	},
8414
8415
	hasClass: function( selector ) {
8416
		var className = " " + selector + " ",
8417
			i = 0,
8418
			l = this.length;
8419
		for ( ; i < l; i++ ) {
8420
			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
8421
				return true;
8422
			}
8423
		}
8424
8425
		return false;
8426
	}
8427
});
8428
8429
8430
8431
8432
// Return jQuery for attributes-only inclusion
8433
8434
8435
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
8436
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
8437
	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
8438
8439
	// Handle event binding
8440
	jQuery.fn[ name ] = function( data, fn ) {
8441
		return arguments.length > 0 ?
8442
			this.on( name, null, data, fn ) :
8443
			this.trigger( name );
8444
	};
8445
});
8446
8447
jQuery.fn.extend({
8448
	hover: function( fnOver, fnOut ) {
8449
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
8450
	},
8451
8452
	bind: function( types, data, fn ) {
8453
		return this.on( types, null, data, fn );
8454
	},
8455
	unbind: function( types, fn ) {
8456
		return this.off( types, null, fn );
8457
	},
8458
8459
	delegate: function( selector, types, data, fn ) {
8460
		return this.on( types, selector, data, fn );
8461
	},
8462
	undelegate: function( selector, types, fn ) {
8463
		// ( namespace ) or ( selector, types [, fn] )
8464
		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
8465
	}
8466
});
8467
8468
8469
var nonce = jQuery.now();
8470
8471
var rquery = (/\?/);
8472
8473
8474
8475
var rvalidtokens = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
8476
8477
jQuery.parseJSON = function( data ) {
8478
	// Attempt to parse using the native JSON parser first
8479
	if ( window.JSON && window.JSON.parse ) {
8480
		// Support: Android 2.3
8481
		// Workaround failure to string-cast null input
8482
		return window.JSON.parse( data + "" );
8483
	}
8484
8485
	var requireNonComma,
8486
		depth = null,
8487
		str = jQuery.trim( data + "" );
8488
8489
	// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains
8490
	// after removing valid tokens
8491
	return str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {
8492
8493
		// Force termination if we see a misplaced comma
8494
		if ( requireNonComma && comma ) {
8495
			depth = 0;
8496
		}
8497
8498
		// Perform no more replacements after returning to outermost depth
8499
		if ( depth === 0 ) {
8500
			return token;
8501
		}
8502
8503
		// Commas must not follow "[", "{", or ","
8504
		requireNonComma = open || comma;
8505
8506
		// Determine new depth
8507
		// array/object open ("[" or "{"): depth += true - false (increment)
8508
		// array/object close ("]" or "}"): depth += false - true (decrement)
8509
		// other cases ("," or primitive): depth += true - true (numeric cast)
8510
		depth += !close - !open;
8511
8512
		// Remove this token
8513
		return "";
8514
	}) ) ?
8515
		( Function( "return " + str ) )() :
0 ignored issues
show
Performance Best Practice introduced by
Using new Function() to create a function is slow and difficult to debug. Such functions do not create a closure. Consider using another way to define your function.
Loading history...
8516
		jQuery.error( "Invalid JSON: " + data );
8517
};
8518
8519
8520
// Cross-browser xml parsing
8521
jQuery.parseXML = function( data ) {
8522
	var xml, tmp;
8523
	if ( !data || typeof data !== "string" ) {
8524
		return null;
8525
	}
8526
	try {
8527
		if ( window.DOMParser ) { // Standard
8528
			tmp = new DOMParser();
0 ignored issues
show
Bug introduced by
The variable DOMParser seems to be never declared. If this is a global, consider adding a /** global: DOMParser */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
8529
			xml = tmp.parseFromString( data, "text/xml" );
8530
		} else { // IE
8531
			xml = new ActiveXObject( "Microsoft.XMLDOM" );
0 ignored issues
show
Bug introduced by
The variable ActiveXObject seems to be never declared. If this is a global, consider adding a /** global: ActiveXObject */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
8532
			xml.async = "false";
8533
			xml.loadXML( data );
8534
		}
8535
	} catch( e ) {
8536
		xml = undefined;
8537
	}
8538
	if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
8539
		jQuery.error( "Invalid XML: " + data );
8540
	}
8541
	return xml;
8542
};
8543
8544
8545
var
8546
	// Document location
8547
	ajaxLocParts,
8548
	ajaxLocation,
8549
8550
	rhash = /#.*$/,
8551
	rts = /([?&])_=[^&]*/,
8552
	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
8553
	// #7653, #8125, #8152: local protocol detection
8554
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
8555
	rnoContent = /^(?:GET|HEAD)$/,
8556
	rprotocol = /^\/\//,
8557
	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
8558
8559
	/* Prefilters
8560
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
8561
	 * 2) These are called:
8562
	 *    - BEFORE asking for a transport
8563
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
8564
	 * 3) key is the dataType
8565
	 * 4) the catchall symbol "*" can be used
8566
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
8567
	 */
8568
	prefilters = {},
8569
8570
	/* Transports bindings
8571
	 * 1) key is the dataType
8572
	 * 2) the catchall symbol "*" can be used
8573
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
8574
	 */
8575
	transports = {},
8576
8577
	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
8578
	allTypes = "*/".concat("*");
8579
8580
// #8138, IE may throw an exception when accessing
8581
// a field from window.location if document.domain has been set
8582
try {
8583
	ajaxLocation = location.href;
8584
} catch( e ) {
8585
	// Use the href attribute of an A element
8586
	// since IE will modify it given document.location
8587
	ajaxLocation = document.createElement( "a" );
8588
	ajaxLocation.href = "";
8589
	ajaxLocation = ajaxLocation.href;
8590
}
8591
8592
// Segment location into parts
8593
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
8594
8595
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
8596
function addToPrefiltersOrTransports( structure ) {
8597
8598
	// dataTypeExpression is optional and defaults to "*"
8599
	return function( dataTypeExpression, func ) {
8600
8601
		if ( typeof dataTypeExpression !== "string" ) {
8602
			func = dataTypeExpression;
8603
			dataTypeExpression = "*";
8604
		}
8605
8606
		var dataType,
8607
			i = 0,
8608
			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
8609
8610
		if ( jQuery.isFunction( func ) ) {
8611
			// For each dataType in the dataTypeExpression
8612
			while ( (dataType = dataTypes[i++]) ) {
8613
				// Prepend if requested
8614
				if ( dataType.charAt( 0 ) === "+" ) {
8615
					dataType = dataType.slice( 1 ) || "*";
8616
					(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
8617
8618
				// Otherwise append
8619
				} else {
8620
					(structure[ dataType ] = structure[ dataType ] || []).push( func );
8621
				}
8622
			}
8623
		}
8624
	};
8625
}
8626
8627
// Base inspection function for prefilters and transports
8628
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
8629
8630
	var inspected = {},
8631
		seekingTransport = ( structure === transports );
8632
8633
	function inspect( dataType ) {
8634
		var selected;
8635
		inspected[ dataType ] = true;
8636
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
8637
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
8638
			if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
8639
				options.dataTypes.unshift( dataTypeOrTransport );
8640
				inspect( dataTypeOrTransport );
8641
				return false;
8642
			} else if ( seekingTransport ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if seekingTransport is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8643
				return !( selected = dataTypeOrTransport );
8644
			}
8645
		});
8646
		return selected;
8647
	}
8648
8649
	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
8650
}
8651
8652
// A special extend for ajax options
8653
// that takes "flat" options (not to be deep extended)
8654
// Fixes #9887
8655
function ajaxExtend( target, src ) {
8656
	var deep, key,
8657
		flatOptions = jQuery.ajaxSettings.flatOptions || {};
8658
8659
	for ( key in src ) {
8660
		if ( src[ key ] !== undefined ) {
8661
			( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
8662
		}
8663
	}
8664
	if ( deep ) {
8665
		jQuery.extend( true, target, deep );
8666
	}
8667
8668
	return target;
8669
}
8670
8671
/* Handles responses to an ajax request:
8672
 * - finds the right dataType (mediates between content-type and expected dataType)
8673
 * - returns the corresponding response
8674
 */
8675
function ajaxHandleResponses( s, jqXHR, responses ) {
8676
	var firstDataType, ct, finalDataType, type,
8677
		contents = s.contents,
8678
		dataTypes = s.dataTypes;
8679
8680
	// Remove auto dataType and get content-type in the process
8681
	while ( dataTypes[ 0 ] === "*" ) {
8682
		dataTypes.shift();
8683
		if ( ct === undefined ) {
0 ignored issues
show
Bug introduced by
The variable ct seems to not be initialized for all possible execution paths.
Loading history...
8684
			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
8685
		}
8686
	}
8687
8688
	// Check if we're dealing with a known content-type
8689
	if ( ct ) {
8690
		for ( type in contents ) {
8691
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
8692
				dataTypes.unshift( type );
8693
				break;
8694
			}
8695
		}
8696
	}
8697
8698
	// Check to see if we have a response for the expected dataType
8699
	if ( dataTypes[ 0 ] in responses ) {
8700
		finalDataType = dataTypes[ 0 ];
8701
	} else {
8702
		// Try convertible dataTypes
8703
		for ( type in responses ) {
8704
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
8705
				finalDataType = type;
8706
				break;
8707
			}
8708
			if ( !firstDataType ) {
8709
				firstDataType = type;
8710
			}
8711
		}
8712
		// Or just use first one
8713
		finalDataType = finalDataType || firstDataType;
8714
	}
8715
8716
	// If we found a dataType
8717
	// We add the dataType to the list if needed
8718
	// and return the corresponding response
8719
	if ( finalDataType ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if finalDataType is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
8720
		if ( finalDataType !== dataTypes[ 0 ] ) {
8721
			dataTypes.unshift( finalDataType );
8722
		}
8723
		return responses[ finalDataType ];
8724
	}
8725
}
8726
8727
/* Chain conversions given the request and the original response
8728
 * Also sets the responseXXX fields on the jqXHR instance
8729
 */
8730
function ajaxConvert( s, response, jqXHR, isSuccess ) {
8731
	var conv2, current, conv, tmp, prev,
8732
		converters = {},
8733
		// Work with a copy of dataTypes in case we need to modify it for conversion
8734
		dataTypes = s.dataTypes.slice();
8735
8736
	// Create converters map with lowercased keys
8737
	if ( dataTypes[ 1 ] ) {
8738
		for ( conv in s.converters ) {
8739
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
8740
		}
8741
	}
8742
8743
	current = dataTypes.shift();
8744
8745
	// Convert to each sequential dataType
8746
	while ( current ) {
8747
8748
		if ( s.responseFields[ current ] ) {
8749
			jqXHR[ s.responseFields[ current ] ] = response;
8750
		}
8751
8752
		// Apply the dataFilter if provided
8753
		if ( !prev && isSuccess && s.dataFilter ) {
8754
			response = s.dataFilter( response, s.dataType );
8755
		}
8756
8757
		prev = current;
8758
		current = dataTypes.shift();
8759
8760
		if ( current ) {
8761
8762
			// There's only work to do if current dataType is non-auto
8763
			if ( current === "*" ) {
8764
8765
				current = prev;
8766
8767
			// Convert response if prev dataType is non-auto and differs from current
8768
			} else if ( prev !== "*" && prev !== current ) {
8769
8770
				// Seek a direct converter
8771
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
8772
8773
				// If none found, seek a pair
8774
				if ( !conv ) {
8775
					for ( conv2 in converters ) {
8776
8777
						// If conv2 outputs current
8778
						tmp = conv2.split( " " );
8779
						if ( tmp[ 1 ] === current ) {
8780
8781
							// If prev can be converted to accepted input
8782
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
8783
								converters[ "* " + tmp[ 0 ] ];
8784
							if ( conv ) {
8785
								// Condense equivalence converters
8786
								if ( conv === true ) {
8787
									conv = converters[ conv2 ];
8788
8789
								// Otherwise, insert the intermediate dataType
8790
								} else if ( converters[ conv2 ] !== true ) {
8791
									current = tmp[ 0 ];
8792
									dataTypes.unshift( tmp[ 1 ] );
8793
								}
8794
								break;
8795
							}
8796
						}
8797
					}
8798
				}
8799
8800
				// Apply converter (if not an equivalence)
8801
				if ( conv !== true ) {
8802
8803
					// Unless errors are allowed to bubble, catch and return them
8804
					if ( conv && s[ "throws" ] ) {
8805
						response = conv( response );
8806
					} else {
8807
						try {
8808
							response = conv( response );
8809
						} catch ( e ) {
8810
							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
8811
						}
8812
					}
8813
				}
8814
			}
8815
		}
8816
	}
8817
8818
	return { state: "success", data: response };
8819
}
8820
8821
jQuery.extend({
8822
8823
	// Counter for holding the number of active queries
8824
	active: 0,
8825
8826
	// Last-Modified header cache for next request
8827
	lastModified: {},
8828
	etag: {},
8829
8830
	ajaxSettings: {
8831
		url: ajaxLocation,
8832
		type: "GET",
8833
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
8834
		global: true,
8835
		processData: true,
8836
		async: true,
8837
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
8838
		/*
8839
		timeout: 0,
8840
		data: null,
8841
		dataType: null,
8842
		username: null,
8843
		password: null,
8844
		cache: null,
8845
		throws: false,
8846
		traditional: false,
8847
		headers: {},
8848
		*/
8849
8850
		accepts: {
8851
			"*": allTypes,
8852
			text: "text/plain",
8853
			html: "text/html",
8854
			xml: "application/xml, text/xml",
8855
			json: "application/json, text/javascript"
8856
		},
8857
8858
		contents: {
8859
			xml: /xml/,
8860
			html: /html/,
8861
			json: /json/
8862
		},
8863
8864
		responseFields: {
8865
			xml: "responseXML",
8866
			text: "responseText",
8867
			json: "responseJSON"
8868
		},
8869
8870
		// Data converters
8871
		// Keys separate source (or catchall "*") and destination types with a single space
8872
		converters: {
8873
8874
			// Convert anything to text
8875
			"* text": String,
8876
8877
			// Text to html (true = no transformation)
8878
			"text html": true,
8879
8880
			// Evaluate text as a json expression
8881
			"text json": jQuery.parseJSON,
8882
8883
			// Parse text as xml
8884
			"text xml": jQuery.parseXML
8885
		},
8886
8887
		// For options that shouldn't be deep extended:
8888
		// you can add your own custom options here if
8889
		// and when you create one that shouldn't be
8890
		// deep extended (see ajaxExtend)
8891
		flatOptions: {
8892
			url: true,
8893
			context: true
8894
		}
8895
	},
8896
8897
	// Creates a full fledged settings object into target
8898
	// with both ajaxSettings and settings fields.
8899
	// If target is omitted, writes into ajaxSettings.
8900
	ajaxSetup: function( target, settings ) {
8901
		return settings ?
8902
8903
			// Building a settings object
8904
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
8905
8906
			// Extending ajaxSettings
8907
			ajaxExtend( jQuery.ajaxSettings, target );
8908
	},
8909
8910
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
8911
	ajaxTransport: addToPrefiltersOrTransports( transports ),
8912
8913
	// Main method
8914
	ajax: function( url, options ) {
8915
8916
		// If url is an object, simulate pre-1.5 signature
8917
		if ( typeof url === "object" ) {
8918
			options = url;
8919
			url = undefined;
8920
		}
8921
8922
		// Force options to be an object
8923
		options = options || {};
8924
8925
		var // Cross-domain detection vars
8926
			parts,
8927
			// Loop variable
8928
			i,
8929
			// URL without anti-cache param
8930
			cacheURL,
8931
			// Response headers as string
8932
			responseHeadersString,
8933
			// timeout handle
8934
			timeoutTimer,
8935
8936
			// To know if global events are to be dispatched
8937
			fireGlobals,
8938
8939
			transport,
8940
			// Response headers
8941
			responseHeaders,
8942
			// Create the final options object
8943
			s = jQuery.ajaxSetup( {}, options ),
8944
			// Callbacks context
8945
			callbackContext = s.context || s,
8946
			// Context for global events is callbackContext if it is a DOM node or jQuery collection
8947
			globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
8948
				jQuery( callbackContext ) :
8949
				jQuery.event,
8950
			// Deferreds
8951
			deferred = jQuery.Deferred(),
8952
			completeDeferred = jQuery.Callbacks("once memory"),
8953
			// Status-dependent callbacks
8954
			statusCode = s.statusCode || {},
8955
			// Headers (they are sent all at once)
8956
			requestHeaders = {},
8957
			requestHeadersNames = {},
8958
			// The jqXHR state
8959
			state = 0,
8960
			// Default abort message
8961
			strAbort = "canceled",
8962
			// Fake xhr
8963
			jqXHR = {
8964
				readyState: 0,
8965
8966
				// Builds headers hashtable if needed
8967
				getResponseHeader: function( key ) {
8968
					var match;
8969
					if ( state === 2 ) {
8970
						if ( !responseHeaders ) {
8971
							responseHeaders = {};
8972
							while ( (match = rheaders.exec( responseHeadersString )) ) {
8973
								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
8974
							}
8975
						}
8976
						match = responseHeaders[ key.toLowerCase() ];
8977
					}
8978
					return match == null ? null : match;
0 ignored issues
show
Bug introduced by
The variable match does not seem to be initialized in case state === 2 on line 8969 is false. Are you sure this can never be the case?
Loading history...
8979
				},
8980
8981
				// Raw string
8982
				getAllResponseHeaders: function() {
8983
					return state === 2 ? responseHeadersString : null;
8984
				},
8985
8986
				// Caches the header
8987
				setRequestHeader: function( name, value ) {
8988
					var lname = name.toLowerCase();
8989
					if ( !state ) {
8990
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
8991
						requestHeaders[ name ] = value;
8992
					}
8993
					return this;
8994
				},
8995
8996
				// Overrides response content-type header
8997
				overrideMimeType: function( type ) {
8998
					if ( !state ) {
8999
						s.mimeType = type;
9000
					}
9001
					return this;
9002
				},
9003
9004
				// Status-dependent callbacks
9005
				statusCode: function( map ) {
9006
					var code;
9007
					if ( map ) {
9008
						if ( state < 2 ) {
9009
							for ( code in map ) {
9010
								// Lazy-add the new callback in a way that preserves old ones
9011
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
9012
							}
9013
						} else {
9014
							// Execute the appropriate callbacks
9015
							jqXHR.always( map[ jqXHR.status ] );
9016
						}
9017
					}
9018
					return this;
9019
				},
9020
9021
				// Cancel the request
9022
				abort: function( statusText ) {
9023
					var finalText = statusText || strAbort;
9024
					if ( transport ) {
9025
						transport.abort( finalText );
9026
					}
9027
					done( 0, finalText );
9028
					return this;
9029
				}
9030
			};
9031
9032
		// Attach deferreds
9033
		deferred.promise( jqXHR ).complete = completeDeferred.add;
9034
		jqXHR.success = jqXHR.done;
9035
		jqXHR.error = jqXHR.fail;
9036
9037
		// Remove hash character (#7531: and string promotion)
9038
		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
9039
		// Handle falsy url in the settings object (#10093: consistency with old signature)
9040
		// We also use the url parameter if available
9041
		s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
9042
9043
		// Alias method option to type as per ticket #12004
9044
		s.type = options.method || options.type || s.method || s.type;
9045
9046
		// Extract dataTypes list
9047
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
9048
9049
		// A cross-domain request is in order when we have a protocol:host:port mismatch
9050
		if ( s.crossDomain == null ) {
9051
			parts = rurl.exec( s.url.toLowerCase() );
9052
			s.crossDomain = !!( parts &&
9053
				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
9054
					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
9055
						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
9056
			);
9057
		}
9058
9059
		// Convert data if not already a string
9060
		if ( s.data && s.processData && typeof s.data !== "string" ) {
9061
			s.data = jQuery.param( s.data, s.traditional );
9062
		}
9063
9064
		// Apply prefilters
9065
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
9066
9067
		// If request was aborted inside a prefilter, stop there
9068
		if ( state === 2 ) {
9069
			return jqXHR;
9070
		}
9071
9072
		// We can fire global events as of now if asked to
9073
		fireGlobals = s.global;
9074
9075
		// Watch for a new set of requests
9076
		if ( fireGlobals && jQuery.active++ === 0 ) {
9077
			jQuery.event.trigger("ajaxStart");
9078
		}
9079
9080
		// Uppercase the type
9081
		s.type = s.type.toUpperCase();
9082
9083
		// Determine if request has content
9084
		s.hasContent = !rnoContent.test( s.type );
9085
9086
		// Save the URL in case we're toying with the If-Modified-Since
9087
		// and/or If-None-Match header later on
9088
		cacheURL = s.url;
9089
9090
		// More options handling for requests with no content
9091
		if ( !s.hasContent ) {
9092
9093
			// If data is available, append data to url
9094
			if ( s.data ) {
9095
				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
9096
				// #9682: remove data so that it's not used in an eventual retry
9097
				delete s.data;
9098
			}
9099
9100
			// Add anti-cache in url if needed
9101
			if ( s.cache === false ) {
9102
				s.url = rts.test( cacheURL ) ?
9103
9104
					// If there is already a '_' parameter, set its value
9105
					cacheURL.replace( rts, "$1_=" + nonce++ ) :
9106
9107
					// Otherwise add one to the end
9108
					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
9109
			}
9110
		}
9111
9112
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9113
		if ( s.ifModified ) {
9114
			if ( jQuery.lastModified[ cacheURL ] ) {
9115
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
9116
			}
9117
			if ( jQuery.etag[ cacheURL ] ) {
9118
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
9119
			}
9120
		}
9121
9122
		// Set the correct header, if data is being sent
9123
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
9124
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
9125
		}
9126
9127
		// Set the Accepts header for the server, depending on the dataType
9128
		jqXHR.setRequestHeader(
9129
			"Accept",
9130
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
9131
				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
9132
				s.accepts[ "*" ]
9133
		);
9134
9135
		// Check for headers option
9136
		for ( i in s.headers ) {
9137
			jqXHR.setRequestHeader( i, s.headers[ i ] );
9138
		}
9139
9140
		// Allow custom headers/mimetypes and early abort
9141
		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
9142
			// Abort if not done already and return
9143
			return jqXHR.abort();
9144
		}
9145
9146
		// aborting is no longer a cancellation
9147
		strAbort = "abort";
9148
9149
		// Install callbacks on deferreds
9150
		for ( i in { success: 1, error: 1, complete: 1 } ) {
9151
			jqXHR[ i ]( s[ i ] );
9152
		}
9153
9154
		// Get transport
9155
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
9156
9157
		// If no transport, we auto-abort
9158
		if ( !transport ) {
9159
			done( -1, "No Transport" );
9160
		} else {
9161
			jqXHR.readyState = 1;
9162
9163
			// Send global event
9164
			if ( fireGlobals ) {
9165
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
9166
			}
9167
			// Timeout
9168
			if ( s.async && s.timeout > 0 ) {
9169
				timeoutTimer = setTimeout(function() {
9170
					jqXHR.abort("timeout");
9171
				}, s.timeout );
9172
			}
9173
9174
			try {
9175
				state = 1;
9176
				transport.send( requestHeaders, done );
9177
			} catch ( e ) {
9178
				// Propagate exception as error if not done
9179
				if ( state < 2 ) {
9180
					done( -1, e );
9181
				// Simply rethrow otherwise
9182
				} else {
9183
					throw e;
9184
				}
9185
			}
9186
		}
9187
9188
		// Callback for when everything is done
9189
		function done( status, nativeStatusText, responses, headers ) {
9190
			var isSuccess, success, error, response, modified,
9191
				statusText = nativeStatusText;
9192
9193
			// Called once
9194
			if ( state === 2 ) {
9195
				return;
9196
			}
9197
9198
			// State is "done" now
9199
			state = 2;
9200
9201
			// Clear timeout if it exists
9202
			if ( timeoutTimer ) {
9203
				clearTimeout( timeoutTimer );
9204
			}
9205
9206
			// Dereference transport for early garbage collection
9207
			// (no matter how long the jqXHR object will be used)
9208
			transport = undefined;
9209
9210
			// Cache response headers
9211
			responseHeadersString = headers || "";
9212
9213
			// Set readyState
9214
			jqXHR.readyState = status > 0 ? 4 : 0;
9215
9216
			// Determine if successful
9217
			isSuccess = status >= 200 && status < 300 || status === 304;
9218
9219
			// Get response data
9220
			if ( responses ) {
9221
				response = ajaxHandleResponses( s, jqXHR, responses );
9222
			}
9223
9224
			// Convert no matter what (that way responseXXX fields are always set)
9225
			response = ajaxConvert( s, response, jqXHR, isSuccess );
0 ignored issues
show
Bug introduced by
The variable response does not seem to be initialized in case responses on line 9220 is false. Are you sure the function ajaxConvert handles undefined variables?
Loading history...
9226
9227
			// If successful, handle type chaining
9228
			if ( isSuccess ) {
9229
9230
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
9231
				if ( s.ifModified ) {
9232
					modified = jqXHR.getResponseHeader("Last-Modified");
9233
					if ( modified ) {
9234
						jQuery.lastModified[ cacheURL ] = modified;
9235
					}
9236
					modified = jqXHR.getResponseHeader("etag");
9237
					if ( modified ) {
9238
						jQuery.etag[ cacheURL ] = modified;
9239
					}
9240
				}
9241
9242
				// if no content
9243
				if ( status === 204 || s.type === "HEAD" ) {
9244
					statusText = "nocontent";
9245
9246
				// if not modified
9247
				} else if ( status === 304 ) {
9248
					statusText = "notmodified";
9249
9250
				// If we have data, let's convert it
9251
				} else {
9252
					statusText = response.state;
9253
					success = response.data;
9254
					error = response.error;
9255
					isSuccess = !error;
9256
				}
9257
			} else {
9258
				// We extract error from statusText
9259
				// then normalize statusText and status for non-aborts
9260
				error = statusText;
9261
				if ( status || !statusText ) {
9262
					statusText = "error";
9263
					if ( status < 0 ) {
9264
						status = 0;
9265
					}
9266
				}
9267
			}
9268
9269
			// Set data for the fake xhr object
9270
			jqXHR.status = status;
9271
			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
9272
9273
			// Success/Error
9274
			if ( isSuccess ) {
9275
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
0 ignored issues
show
Bug introduced by
The variable success seems to not be initialized for all possible execution paths.
Loading history...
9276
			} else {
9277
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
0 ignored issues
show
Bug introduced by
The variable error seems to not be initialized for all possible execution paths.
Loading history...
9278
			}
9279
9280
			// Status-dependent callbacks
9281
			jqXHR.statusCode( statusCode );
9282
			statusCode = undefined;
9283
9284
			if ( fireGlobals ) {
9285
				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
9286
					[ jqXHR, s, isSuccess ? success : error ] );
9287
			}
9288
9289
			// Complete
9290
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
9291
9292
			if ( fireGlobals ) {
9293
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
9294
				// Handle the global AJAX counter
9295
				if ( !( --jQuery.active ) ) {
9296
					jQuery.event.trigger("ajaxStop");
9297
				}
9298
			}
9299
		}
9300
9301
		return jqXHR;
9302
	},
9303
9304
	getJSON: function( url, data, callback ) {
9305
		return jQuery.get( url, data, callback, "json" );
9306
	},
9307
9308
	getScript: function( url, callback ) {
9309
		return jQuery.get( url, undefined, callback, "script" );
9310
	}
9311
});
9312
9313
jQuery.each( [ "get", "post" ], function( i, method ) {
9314
	jQuery[ method ] = function( url, data, callback, type ) {
9315
		// shift arguments if data argument was omitted
9316
		if ( jQuery.isFunction( data ) ) {
9317
			type = type || callback;
9318
			callback = data;
9319
			data = undefined;
9320
		}
9321
9322
		return jQuery.ajax({
9323
			url: url,
9324
			type: method,
9325
			dataType: type,
9326
			data: data,
9327
			success: callback
9328
		});
9329
	};
9330
});
9331
9332
// Attach a bunch of functions for handling common AJAX events
9333
jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
9334
	jQuery.fn[ type ] = function( fn ) {
9335
		return this.on( type, fn );
9336
	};
9337
});
9338
9339
9340
jQuery._evalUrl = function( url ) {
9341
	return jQuery.ajax({
9342
		url: url,
9343
		type: "GET",
9344
		dataType: "script",
9345
		async: false,
9346
		global: false,
9347
		"throws": true
9348
	});
9349
};
9350
9351
9352
jQuery.fn.extend({
9353
	wrapAll: function( html ) {
9354
		if ( jQuery.isFunction( html ) ) {
9355
			return this.each(function(i) {
9356
				jQuery(this).wrapAll( html.call(this, i) );
9357
			});
9358
		}
9359
9360
		if ( this[0] ) {
9361
			// The elements to wrap the target around
9362
			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
9363
9364
			if ( this[0].parentNode ) {
9365
				wrap.insertBefore( this[0] );
9366
			}
9367
9368
			wrap.map(function() {
9369
				var elem = this;
9370
9371
				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
9372
					elem = elem.firstChild;
9373
				}
9374
9375
				return elem;
9376
			}).append( this );
9377
		}
9378
9379
		return this;
9380
	},
9381
9382
	wrapInner: function( html ) {
9383
		if ( jQuery.isFunction( html ) ) {
9384
			return this.each(function(i) {
9385
				jQuery(this).wrapInner( html.call(this, i) );
9386
			});
9387
		}
9388
9389
		return this.each(function() {
9390
			var self = jQuery( this ),
9391
				contents = self.contents();
9392
9393
			if ( contents.length ) {
9394
				contents.wrapAll( html );
9395
9396
			} else {
9397
				self.append( html );
9398
			}
9399
		});
9400
	},
9401
9402
	wrap: function( html ) {
9403
		var isFunction = jQuery.isFunction( html );
9404
9405
		return this.each(function(i) {
9406
			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
9407
		});
9408
	},
9409
9410
	unwrap: function() {
9411
		return this.parent().each(function() {
9412
			if ( !jQuery.nodeName( this, "body" ) ) {
9413
				jQuery( this ).replaceWith( this.childNodes );
9414
			}
9415
		}).end();
9416
	}
9417
});
9418
9419
9420
jQuery.expr.filters.hidden = function( elem ) {
9421
	// Support: Opera <= 12.12
9422
	// Opera reports offsetWidths and offsetHeights less than zero on some elements
9423
	return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
9424
		(!support.reliableHiddenOffsets() &&
9425
			((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
9426
};
9427
9428
jQuery.expr.filters.visible = function( elem ) {
9429
	return !jQuery.expr.filters.hidden( elem );
9430
};
9431
9432
9433
9434
9435
var r20 = /%20/g,
9436
	rbracket = /\[\]$/,
9437
	rCRLF = /\r?\n/g,
9438
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
9439
	rsubmittable = /^(?:input|select|textarea|keygen)/i;
9440
9441
function buildParams( prefix, obj, traditional, add ) {
9442
	var name;
9443
9444
	if ( jQuery.isArray( obj ) ) {
9445
		// Serialize array item.
9446
		jQuery.each( obj, function( i, v ) {
9447
			if ( traditional || rbracket.test( prefix ) ) {
9448
				// Treat each array item as a scalar.
9449
				add( prefix, v );
9450
9451
			} else {
9452
				// Item is non-scalar (array or object), encode its numeric index.
9453
				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
9454
			}
9455
		});
9456
9457
	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
9458
		// Serialize object item.
9459
		for ( name in obj ) {
9460
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
9461
		}
9462
9463
	} else {
9464
		// Serialize scalar item.
9465
		add( prefix, obj );
9466
	}
9467
}
9468
9469
// Serialize an array of form elements or a set of
9470
// key/values into a query string
9471
jQuery.param = function( a, traditional ) {
9472
	var prefix,
9473
		s = [],
9474
		add = function( key, value ) {
9475
			// If value is a function, invoke it and return its value
9476
			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
9477
			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
9478
		};
9479
9480
	// Set traditional to true for jQuery <= 1.3.2 behavior.
9481
	if ( traditional === undefined ) {
9482
		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
9483
	}
9484
9485
	// If an array was passed in, assume that it is an array of form elements.
9486
	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
9487
		// Serialize the form elements
9488
		jQuery.each( a, function() {
9489
			add( this.name, this.value );
9490
		});
9491
9492
	} else {
9493
		// If traditional, encode the "old" way (the way 1.3.2 or older
9494
		// did it), otherwise encode params recursively.
9495
		for ( prefix in a ) {
9496
			buildParams( prefix, a[ prefix ], traditional, add );
9497
		}
9498
	}
9499
9500
	// Return the resulting serialization
9501
	return s.join( "&" ).replace( r20, "+" );
9502
};
9503
9504
jQuery.fn.extend({
9505
	serialize: function() {
9506
		return jQuery.param( this.serializeArray() );
9507
	},
9508
	serializeArray: function() {
9509
		return this.map(function() {
9510
			// Can add propHook for "elements" to filter or add form elements
9511
			var elements = jQuery.prop( this, "elements" );
9512
			return elements ? jQuery.makeArray( elements ) : this;
9513
		})
9514
		.filter(function() {
9515
			var type = this.type;
9516
			// Use .is(":disabled") so that fieldset[disabled] works
9517
			return this.name && !jQuery( this ).is( ":disabled" ) &&
9518
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
9519
				( this.checked || !rcheckableType.test( type ) );
9520
		})
9521
		.map(function( i, elem ) {
9522
			var val = jQuery( this ).val();
9523
9524
			return val == null ?
9525
				null :
9526
				jQuery.isArray( val ) ?
9527
					jQuery.map( val, function( val ) {
9528
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9529
					}) :
9530
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
9531
		}).get();
9532
	}
9533
});
9534
9535
9536
// Create the request object
9537
// (This is still attached to ajaxSettings for backward compatibility)
9538
jQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?
9539
	// Support: IE6+
9540
	function() {
9541
9542
		// XHR cannot access local files, always use ActiveX for that case
9543
		return !this.isLocal &&
9544
9545
			// Support: IE7-8
9546
			// oldIE XHR does not support non-RFC2616 methods (#13240)
9547
			// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx
9548
			// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9
9549
			// Although this check for six methods instead of eight
9550
			// since IE also does not support "trace" and "connect"
9551
			/^(get|post|head|put|delete|options)$/i.test( this.type ) &&
9552
9553
			createStandardXHR() || createActiveXHR();
9554
	} :
9555
	// For all other browsers, use the standard XMLHttpRequest object
9556
	createStandardXHR;
9557
9558
var xhrId = 0,
9559
	xhrCallbacks = {},
9560
	xhrSupported = jQuery.ajaxSettings.xhr();
9561
9562
// Support: IE<10
9563
// Open requests must be manually aborted on unload (#5280)
9564
if ( window.ActiveXObject ) {
9565
	jQuery( window ).on( "unload", function() {
9566
		for ( var key in xhrCallbacks ) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
9567
			xhrCallbacks[ key ]( undefined, true );
9568
		}
9569
	});
9570
}
9571
9572
// Determine support properties
9573
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
9574
xhrSupported = support.ajax = !!xhrSupported;
9575
9576
// Create transport if the browser can provide an xhr
9577
if ( xhrSupported ) {
9578
9579
	jQuery.ajaxTransport(function( options ) {
9580
		// Cross domain only allowed if supported through XMLHttpRequest
9581
		if ( !options.crossDomain || support.cors ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if !options.crossDomain || support.cors is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
9582
9583
			var callback;
9584
9585
			return {
9586
				send: function( headers, complete ) {
9587
					var i,
9588
						xhr = options.xhr(),
9589
						id = ++xhrId;
9590
9591
					// Open the socket
9592
					xhr.open( options.type, options.url, options.async, options.username, options.password );
9593
9594
					// Apply custom fields if provided
9595
					if ( options.xhrFields ) {
9596
						for ( i in options.xhrFields ) {
9597
							xhr[ i ] = options.xhrFields[ i ];
9598
						}
9599
					}
9600
9601
					// Override mime type if needed
9602
					if ( options.mimeType && xhr.overrideMimeType ) {
9603
						xhr.overrideMimeType( options.mimeType );
9604
					}
9605
9606
					// X-Requested-With header
9607
					// For cross-domain requests, seeing as conditions for a preflight are
9608
					// akin to a jigsaw puzzle, we simply never set it to be sure.
9609
					// (it can always be set on a per-request basis or even using ajaxSetup)
9610
					// For same-domain requests, won't change header if already provided.
9611
					if ( !options.crossDomain && !headers["X-Requested-With"] ) {
9612
						headers["X-Requested-With"] = "XMLHttpRequest";
9613
					}
9614
9615
					// Set headers
9616
					for ( i in headers ) {
9617
						// Support: IE<9
9618
						// IE's ActiveXObject throws a 'Type Mismatch' exception when setting
9619
						// request header to a null-value.
9620
						//
9621
						// To keep consistent with other XHR implementations, cast the value
9622
						// to string and ignore `undefined`.
9623
						if ( headers[ i ] !== undefined ) {
9624
							xhr.setRequestHeader( i, headers[ i ] + "" );
9625
						}
9626
					}
9627
9628
					// Do send the request
9629
					// This may raise an exception which is actually
9630
					// handled in jQuery.ajax (so no try/catch here)
9631
					xhr.send( ( options.hasContent && options.data ) || null );
9632
9633
					// Listener
9634
					callback = function( _, isAbort ) {
9635
						var status, statusText, responses;
9636
9637
						// Was never called and is aborted or complete
9638
						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
9639
							// Clean up
9640
							delete xhrCallbacks[ id ];
9641
							callback = undefined;
9642
							xhr.onreadystatechange = jQuery.noop;
9643
9644
							// Abort manually if needed
9645
							if ( isAbort ) {
9646
								if ( xhr.readyState !== 4 ) {
9647
									xhr.abort();
9648
								}
9649
							} else {
9650
								responses = {};
9651
								status = xhr.status;
9652
9653
								// Support: IE<10
9654
								// Accessing binary-data responseText throws an exception
9655
								// (#11426)
9656
								if ( typeof xhr.responseText === "string" ) {
9657
									responses.text = xhr.responseText;
9658
								}
9659
9660
								// Firefox throws an exception when accessing
9661
								// statusText for faulty cross-domain requests
9662
								try {
9663
									statusText = xhr.statusText;
9664
								} catch( e ) {
9665
									// We normalize with Webkit giving an empty statusText
9666
									statusText = "";
9667
								}
9668
9669
								// Filter status for non standard behaviors
9670
9671
								// If the request is local and we have data: assume a success
9672
								// (success with no data won't get notified, that's the best we
9673
								// can do given current implementations)
9674
								if ( !status && options.isLocal && !options.crossDomain ) {
9675
									status = responses.text ? 200 : 404;
9676
								// IE - #1450: sometimes returns 1223 when it should be 204
9677
								} else if ( status === 1223 ) {
9678
									status = 204;
9679
								}
9680
							}
9681
						}
9682
9683
						// Call complete if needed
9684
						if ( responses ) {
9685
							complete( status, statusText, responses, xhr.getAllResponseHeaders() );
0 ignored issues
show
Bug introduced by
The variable status seems to not be initialized for all possible execution paths. Are you sure complete handles undefined variables?
Loading history...
Bug introduced by
The variable statusText seems to not be initialized for all possible execution paths. Are you sure complete handles undefined variables?
Loading history...
9686
						}
9687
					};
9688
9689
					if ( !options.async ) {
9690
						// if we're in sync mode we fire the callback
9691
						callback();
9692
					} else if ( xhr.readyState === 4 ) {
9693
						// (IE6 & IE7) if it's in cache and has been
9694
						// retrieved directly we need to fire the callback
9695
						setTimeout( callback );
9696
					} else {
9697
						// Add to the list of active xhr callbacks
9698
						xhr.onreadystatechange = xhrCallbacks[ id ] = callback;
9699
					}
9700
				},
9701
9702
				abort: function() {
9703
					if ( callback ) {
9704
						callback( undefined, true );
9705
					}
9706
				}
9707
			};
9708
		}
9709
	});
9710
}
9711
9712
// Functions to create xhrs
9713
function createStandardXHR() {
9714
	try {
9715
		return new window.XMLHttpRequest();
9716
	} catch( e ) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
9717
}
9718
9719
function createActiveXHR() {
9720
	try {
9721
		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
9722
	} catch( e ) {}
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
9723
}
9724
9725
9726
9727
9728
// Install script dataType
9729
jQuery.ajaxSetup({
9730
	accepts: {
9731
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
9732
	},
9733
	contents: {
9734
		script: /(?:java|ecma)script/
9735
	},
9736
	converters: {
9737
		"text script": function( text ) {
9738
			jQuery.globalEval( text );
9739
			return text;
9740
		}
9741
	}
9742
});
9743
9744
// Handle cache's special case and global
9745
jQuery.ajaxPrefilter( "script", function( s ) {
9746
	if ( s.cache === undefined ) {
9747
		s.cache = false;
9748
	}
9749
	if ( s.crossDomain ) {
9750
		s.type = "GET";
9751
		s.global = false;
9752
	}
9753
});
9754
9755
// Bind script tag hack transport
9756
jQuery.ajaxTransport( "script", function(s) {
9757
9758
	// This transport only deals with cross domain requests
9759
	if ( s.crossDomain ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if s.crossDomain is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
9760
9761
		var script,
9762
			head = document.head || jQuery("head")[0] || document.documentElement;
9763
9764
		return {
9765
9766
			send: function( _, callback ) {
9767
9768
				script = document.createElement("script");
9769
9770
				script.async = true;
9771
9772
				if ( s.scriptCharset ) {
9773
					script.charset = s.scriptCharset;
9774
				}
9775
9776
				script.src = s.url;
9777
9778
				// Attach handlers for all browsers
9779
				script.onload = script.onreadystatechange = function( _, isAbort ) {
9780
9781
					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
9782
9783
						// Handle memory leak in IE
9784
						script.onload = script.onreadystatechange = null;
9785
9786
						// Remove the script
9787
						if ( script.parentNode ) {
9788
							script.parentNode.removeChild( script );
9789
						}
9790
9791
						// Dereference the script
9792
						script = null;
9793
9794
						// Callback if not abort
9795
						if ( !isAbort ) {
9796
							callback( 200, "success" );
9797
						}
9798
					}
9799
				};
9800
9801
				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
9802
				// Use native DOM manipulation to avoid our domManip AJAX trickery
9803
				head.insertBefore( script, head.firstChild );
9804
			},
9805
9806
			abort: function() {
9807
				if ( script ) {
9808
					script.onload( undefined, true );
9809
				}
9810
			}
9811
		};
9812
	}
9813
});
9814
9815
9816
9817
9818
var oldCallbacks = [],
9819
	rjsonp = /(=)\?(?=&|$)|\?\?/;
9820
9821
// Default jsonp settings
9822
jQuery.ajaxSetup({
9823
	jsonp: "callback",
9824
	jsonpCallback: function() {
9825
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
9826
		this[ callback ] = true;
9827
		return callback;
9828
	}
9829
});
9830
9831
// Detect, normalize options and install callbacks for jsonp requests
9832
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
9833
9834
	var callbackName, overwritten, responseContainer,
9835
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
9836
			"url" :
9837
			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
9838
		);
9839
9840
	// Handle iff the expected data type is "jsonp" or we have a parameter to set
9841
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if jsonProp || s.dataTypes.0 === "jsonp" is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
9842
9843
		// Get callback name, remembering preexisting value associated with it
9844
		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
9845
			s.jsonpCallback() :
9846
			s.jsonpCallback;
9847
9848
		// Insert callback into url or form data
9849
		if ( jsonProp ) {
9850
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
9851
		} else if ( s.jsonp !== false ) {
9852
			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
9853
		}
9854
9855
		// Use data converter to retrieve json after script execution
9856
		s.converters["script json"] = function() {
9857
			if ( !responseContainer ) {
9858
				jQuery.error( callbackName + " was not called" );
9859
			}
9860
			return responseContainer[ 0 ];
0 ignored issues
show
Bug introduced by
The variable responseContainer seems to not be initialized for all possible execution paths.
Loading history...
9861
		};
9862
9863
		// force json dataType
9864
		s.dataTypes[ 0 ] = "json";
9865
9866
		// Install callback
9867
		overwritten = window[ callbackName ];
9868
		window[ callbackName ] = function() {
9869
			responseContainer = arguments;
9870
		};
9871
9872
		// Clean-up function (fires after converters)
9873
		jqXHR.always(function() {
9874
			// Restore preexisting value
9875
			window[ callbackName ] = overwritten;
9876
9877
			// Save back as free
9878
			if ( s[ callbackName ] ) {
9879
				// make sure that re-using the options doesn't screw things around
9880
				s.jsonpCallback = originalSettings.jsonpCallback;
9881
9882
				// save the callback name for future use
9883
				oldCallbacks.push( callbackName );
9884
			}
9885
9886
			// Call if it was a function and we have a response
9887
			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
9888
				overwritten( responseContainer[ 0 ] );
9889
			}
9890
9891
			responseContainer = overwritten = undefined;
9892
		});
9893
9894
		// Delegate to script
9895
		return "script";
9896
	}
9897
});
9898
9899
9900
9901
9902
// data: string of html
9903
// context (optional): If specified, the fragment will be created in this context, defaults to document
9904
// keepScripts (optional): If true, will include scripts passed in the html string
9905
jQuery.parseHTML = function( data, context, keepScripts ) {
9906
	if ( !data || typeof data !== "string" ) {
9907
		return null;
9908
	}
9909
	if ( typeof context === "boolean" ) {
9910
		keepScripts = context;
9911
		context = false;
9912
	}
9913
	context = context || document;
9914
9915
	var parsed = rsingleTag.exec( data ),
9916
		scripts = !keepScripts && [];
9917
9918
	// Single tag
9919
	if ( parsed ) {
9920
		return [ context.createElement( parsed[1] ) ];
9921
	}
9922
9923
	parsed = jQuery.buildFragment( [ data ], context, scripts );
9924
9925
	if ( scripts && scripts.length ) {
9926
		jQuery( scripts ).remove();
9927
	}
9928
9929
	return jQuery.merge( [], parsed.childNodes );
9930
};
9931
9932
9933
// Keep a copy of the old load method
9934
var _load = jQuery.fn.load;
9935
9936
/**
9937
 * Load a url into a page
9938
 */
9939
jQuery.fn.load = function( url, params, callback ) {
9940
	if ( typeof url !== "string" && _load ) {
9941
		return _load.apply( this, arguments );
9942
	}
9943
9944
	var selector, response, type,
9945
		self = this,
9946
		off = url.indexOf(" ");
9947
9948
	if ( off >= 0 ) {
9949
		selector = jQuery.trim( url.slice( off, url.length ) );
9950
		url = url.slice( 0, off );
9951
	}
9952
9953
	// If it's a function
9954
	if ( jQuery.isFunction( params ) ) {
9955
9956
		// We assume that it's the callback
9957
		callback = params;
9958
		params = undefined;
9959
9960
	// Otherwise, build a param string
9961
	} else if ( params && typeof params === "object" ) {
9962
		type = "POST";
9963
	}
9964
9965
	// If we have elements to modify, make the request
9966
	if ( self.length > 0 ) {
9967
		jQuery.ajax({
9968
			url: url,
9969
9970
			// if "type" variable is undefined, then "GET" method will be used
9971
			type: type,
0 ignored issues
show
Bug introduced by
The variable type seems to not be initialized for all possible execution paths.
Loading history...
9972
			dataType: "html",
9973
			data: params
9974
		}).done(function( responseText ) {
9975
9976
			// Save response for use in complete callback
9977
			response = arguments;
9978
9979
			self.html( selector ?
9980
9981
				// If a selector was specified, locate the right elements in a dummy div
9982
				// Exclude scripts to avoid IE 'Permission Denied' errors
9983
				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
9984
9985
				// Otherwise use the full result
9986
				responseText );
9987
9988
		}).complete( callback && function( jqXHR, status ) {
9989
			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
9990
		});
9991
	}
9992
9993
	return this;
9994
};
9995
9996
9997
9998
9999
jQuery.expr.filters.animated = function( elem ) {
10000
	return jQuery.grep(jQuery.timers, function( fn ) {
10001
		return elem === fn.elem;
10002
	}).length;
10003
};
10004
10005
10006
10007
10008
10009
var docElem = window.document.documentElement;
10010
10011
/**
10012
 * Gets a window from an element
10013
 */
10014
function getWindow( elem ) {
10015
	return jQuery.isWindow( elem ) ?
10016
		elem :
10017
		elem.nodeType === 9 ?
10018
			elem.defaultView || elem.parentWindow :
10019
			false;
10020
}
10021
10022
jQuery.offset = {
10023
	setOffset: function( elem, options, i ) {
10024
		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
10025
			position = jQuery.css( elem, "position" ),
10026
			curElem = jQuery( elem ),
10027
			props = {};
10028
10029
		// set position first, in-case top/left are set even on static elem
10030
		if ( position === "static" ) {
10031
			elem.style.position = "relative";
10032
		}
10033
10034
		curOffset = curElem.offset();
10035
		curCSSTop = jQuery.css( elem, "top" );
10036
		curCSSLeft = jQuery.css( elem, "left" );
10037
		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
10038
			jQuery.inArray("auto", [ curCSSTop, curCSSLeft ] ) > -1;
10039
10040
		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
10041
		if ( calculatePosition ) {
10042
			curPosition = curElem.position();
10043
			curTop = curPosition.top;
10044
			curLeft = curPosition.left;
10045
		} else {
10046
			curTop = parseFloat( curCSSTop ) || 0;
10047
			curLeft = parseFloat( curCSSLeft ) || 0;
10048
		}
10049
10050
		if ( jQuery.isFunction( options ) ) {
10051
			options = options.call( elem, i, curOffset );
10052
		}
10053
10054
		if ( options.top != null ) {
10055
			props.top = ( options.top - curOffset.top ) + curTop;
10056
		}
10057
		if ( options.left != null ) {
10058
			props.left = ( options.left - curOffset.left ) + curLeft;
10059
		}
10060
10061
		if ( "using" in options ) {
10062
			options.using.call( elem, props );
10063
		} else {
10064
			curElem.css( props );
10065
		}
10066
	}
10067
};
10068
10069
jQuery.fn.extend({
10070
	offset: function( options ) {
10071
		if ( arguments.length ) {
10072
			return options === undefined ?
10073
				this :
10074
				this.each(function( i ) {
10075
					jQuery.offset.setOffset( this, options, i );
10076
				});
10077
		}
10078
10079
		var docElem, win,
10080
			box = { top: 0, left: 0 },
10081
			elem = this[ 0 ],
10082
			doc = elem && elem.ownerDocument;
10083
10084
		if ( !doc ) {
10085
			return;
10086
		}
10087
10088
		docElem = doc.documentElement;
10089
10090
		// Make sure it's not a disconnected DOM node
10091
		if ( !jQuery.contains( docElem, elem ) ) {
10092
			return box;
10093
		}
10094
10095
		// If we don't have gBCR, just use 0,0 rather than error
10096
		// BlackBerry 5, iOS 3 (original iPhone)
10097
		if ( typeof elem.getBoundingClientRect !== strundefined ) {
10098
			box = elem.getBoundingClientRect();
10099
		}
10100
		win = getWindow( doc );
10101
		return {
10102
			top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
10103
			left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
10104
		};
10105
	},
10106
10107
	position: function() {
10108
		if ( !this[ 0 ] ) {
10109
			return;
10110
		}
10111
10112
		var offsetParent, offset,
10113
			parentOffset = { top: 0, left: 0 },
10114
			elem = this[ 0 ];
10115
10116
		// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
10117
		if ( jQuery.css( elem, "position" ) === "fixed" ) {
10118
			// we assume that getBoundingClientRect is available when computed position is fixed
10119
			offset = elem.getBoundingClientRect();
10120
		} else {
10121
			// Get *real* offsetParent
10122
			offsetParent = this.offsetParent();
10123
10124
			// Get correct offsets
10125
			offset = this.offset();
10126
			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
10127
				parentOffset = offsetParent.offset();
10128
			}
10129
10130
			// Add offsetParent borders
10131
			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
10132
			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
10133
		}
10134
10135
		// Subtract parent offsets and element margins
10136
		// note: when an element has margin: auto the offsetLeft and marginLeft
10137
		// are the same in Safari causing offset.left to incorrectly be 0
10138
		return {
10139
			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
10140
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
10141
		};
10142
	},
10143
10144
	offsetParent: function() {
10145
		return this.map(function() {
10146
			var offsetParent = this.offsetParent || docElem;
10147
10148
			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
10149
				offsetParent = offsetParent.offsetParent;
10150
			}
10151
			return offsetParent || docElem;
10152
		});
10153
	}
10154
});
10155
10156
// Create scrollLeft and scrollTop methods
10157
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
10158
	var top = /Y/.test( prop );
10159
10160
	jQuery.fn[ method ] = function( val ) {
10161
		return access( this, function( elem, method, val ) {
10162
			var win = getWindow( elem );
10163
10164
			if ( val === undefined ) {
10165
				return win ? (prop in win) ? win[ prop ] :
10166
					win.document.documentElement[ method ] :
10167
					elem[ method ];
10168
			}
10169
10170
			if ( win ) {
10171
				win.scrollTo(
10172
					!top ? val : jQuery( win ).scrollLeft(),
10173
					top ? val : jQuery( win ).scrollTop()
10174
				);
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
10175
10176
			} else {
10177
				elem[ method ] = val;
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
10178
			}
10179
		}, method, val, arguments.length, null );
10180
	};
10181
});
10182
10183
// Add the top/left cssHooks using jQuery.fn.position
10184
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
10185
// getComputedStyle returns percent when specified for top/left/bottom/right
10186
// rather than make the css module depend on the offset module, we just check for it here
10187
jQuery.each( [ "top", "left" ], function( i, prop ) {
10188
	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
10189
		function( elem, computed ) {
10190
			if ( computed ) {
0 ignored issues
show
Complexity Best Practice introduced by
There is no return statement if computed is false. Are you sure this is correct? If so, consider adding return; explicitly.

This check looks for functions where a return statement is found in some execution paths, but not in all.

Consider this little piece of code

function isBig(a) {
    if (a > 5000) {
        return "yes";
    }
}

console.log(isBig(5001)); //returns yes
console.log(isBig(42)); //returns undefined

The function isBig will only return a specific value when its parameter is bigger than 5000. In any other case, it will implicitly return undefined.

This behaviour may not be what you had intended. In any case, you can add a return undefined to the other execution path to make the return value explicit.

Loading history...
10191
				computed = curCSS( elem, prop );
10192
				// if curCSS returns percentage, fallback to offset
10193
				return rnumnonpx.test( computed ) ?
10194
					jQuery( elem ).position()[ prop ] + "px" :
10195
					computed;
10196
			}
10197
		}
10198
	);
10199
});
10200
10201
10202
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
10203
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
10204
	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
10205
		// margin is only for outerHeight, outerWidth
10206
		jQuery.fn[ funcName ] = function( margin, value ) {
10207
			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
10208
				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
10209
10210
			return access( this, function( elem, type, value ) {
10211
				var doc;
10212
10213
				if ( jQuery.isWindow( elem ) ) {
10214
					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
10215
					// isn't a whole lot we can do. See pull request at this URL for discussion:
10216
					// https://github.com/jquery/jquery/pull/764
10217
					return elem.document.documentElement[ "client" + name ];
10218
				}
10219
10220
				// Get document width or height
10221
				if ( elem.nodeType === 9 ) {
10222
					doc = elem.documentElement;
10223
10224
					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
10225
					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
10226
					return Math.max(
10227
						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
10228
						elem.body[ "offset" + name ], doc[ "offset" + name ],
10229
						doc[ "client" + name ]
10230
					);
10231
				}
10232
10233
				return value === undefined ?
10234
					// Get width or height on the element, requesting but not forcing parseFloat
10235
					jQuery.css( elem, type, extra ) :
10236
10237
					// Set width or height on the element
10238
					jQuery.style( elem, type, value, extra );
10239
			}, type, chainable ? margin : undefined, chainable, null );
10240
		};
10241
	});
10242
});
10243
10244
10245
// The number of elements contained in the matched element set
10246
jQuery.fn.size = function() {
10247
	return this.length;
10248
};
10249
10250
jQuery.fn.andSelf = jQuery.fn.addBack;
10251
10252
10253
10254
10255
// Register as a named AMD module, since jQuery can be concatenated with other
10256
// files that may use define, but not via a proper concatenation script that
10257
// understands anonymous AMD modules. A named AMD is safest and most robust
10258
// way to register. Lowercase jquery is used because AMD module names are
10259
// derived from file names, and jQuery is normally delivered in a lowercase
10260
// file name. Do this after creating the global so that if an AMD module wants
10261
// to call noConflict to hide this version of jQuery, it will work.
10262
10263
// Note that for maximum portability, libraries that are not jQuery should
10264
// declare themselves as anonymous modules, and avoid setting a global if an
10265
// AMD loader is present. jQuery is a special case. For more information, see
10266
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
10267
10268
if ( typeof define === "function" && define.amd ) {
0 ignored issues
show
Bug introduced by
The variable define seems to be never declared. If this is a global, consider adding a /** global: define */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
10269
	define( "jquery", [], function() {
10270
		return jQuery;
10271
	});
10272
}
10273
10274
10275
10276
10277
var
10278
	// Map over jQuery in case of overwrite
10279
	_jQuery = window.jQuery,
10280
10281
	// Map over the $ in case of overwrite
10282
	_$ = window.$;
10283
10284
jQuery.noConflict = function( deep ) {
10285
	if ( window.$ === jQuery ) {
10286
		window.$ = _$;
10287
	}
10288
10289
	if ( deep && window.jQuery === jQuery ) {
10290
		window.jQuery = _jQuery;
10291
	}
10292
10293
	return jQuery;
10294
};
10295
10296
// Expose jQuery and $ identifiers, even in
10297
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
10298
// and CommonJS for browser emulators (#13566)
10299
if ( typeof noGlobal === strundefined ) {
10300
	window.jQuery = window.$ = jQuery;
10301
}
10302
10303
10304
10305
10306
return jQuery;
10307
10308
}));
10309