GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.

third-party/angularjs/angular-1.5.0/docs/components/jquery-2.1.1/jquery.js   F
last analyzed

Complexity

Total Complexity 1695
Complexity/F 3.02

Size

Lines of Code 9176
Function Count 561

Duplication

Duplicated Lines 2723
Ratio 29.68 %

Importance

Changes 0
Metric Value
eloc 4654
dl 2723
loc 9176
rs 0.8
c 0
b 0
f 0
wmc 1695
mnd 1134
bc 1134
fnc 561
bpm 2.0213
cpm 3.0213
noi 40

62 Functions

Rating   Name   Duplication   Size   Complexity  
D jquery.js ➔ matcherFromTokens 0 54 12
B jquery.js ➔ curCSS 0 46 7
A jquery.js ➔ returnFalse 0 3 1
A jquery.js ➔ safeActiveElement 0 5 2
F jquery.js ➔ winnow 28 28 40
A jquery.js ➔ setPositiveNumber 0 7 2
F jquery.js ➔ manipulationTarget 0 8 156
F jquery.js ➔ dataAttr 0 28 33
A jquery.js ➔ defaultDisplay 0 30 3
A jquery.js ➔ getAll 0 9 4
F jquery.js ➔ toSelector 0 9 14
F jquery.js ➔ Tween 0 3 45
A jquery.js ➔ createInputPseudo 0 6 2
A jquery.js ➔ createTween 0 13 3
A jquery.js ➔ computePixelPositionAndBoxSizingReliable 0 16 3
A jquery.js ➔ restoreScript 0 11 2
F jquery.js ➔ addCombinator 0 52 14
F jquery.js ➔ Data 0 12 20
F jquery.js ➔ Animation 0 103 15
D jquery.js ➔ showHide 9 50 12
F jquery.js ➔ sibling 0 4 62
F jquery.js ➔ done 111 111 68
F jquery.js ➔ ajaxConvert 90 90 19
A jquery.js ➔ addHandle 0 8 2
A jquery.js ➔ condense 0 20 5
A jquery.js ➔ fixInput 0 12 3
F jquery.js ➔ defaultPrefilter 133 133 33
A jquery.js ➔ disableScript 0 4 1
A jquery.js ➔ addGetHookIf 0 18 3
F jquery.js ➔ isArraylike 0 15 94
A jquery.js ➔ testContext 0 3 1
B jquery.js ➔ propFilter 36 36 7
F jquery.js ➔ createOptions 0 7 22
F jquery.js ➔ setMatcher 0 92 23
F jquery.js ➔ matcherFromGroupMatchers 0 98 21
F jquery.js ➔ actualDisplay 0 17 92
D jquery.js ➔ ajaxHandleResponses 52 52 12
F jquery.js ➔ buildParams 27 27 35
F jquery.js ➔ addToPrefiltersOrTransports 30 30 193
D jquery.js ➔ vendorPropName 0 21 12
A jquery.js ➔ inspectPrefiltersOrTransports 23 23 5
C jquery.js ➔ augmentWidthOrHeight 38 38 10
B jquery.js ➔ cloneCopyEvent 0 33 7
B jquery.js ➔ siblingCheck 0 22 6
A jquery.js ➔ markFunction 0 4 1
A jquery.js ➔ createCache 0 13 3
A jquery.js ➔ ajaxExtend 0 15 5
A jquery.js ➔ elementMatcher 0 13 5
F jquery.js ➔ returnTrue 0 3 53
A jquery.js ➔ multipleContexts 0 8 2
B jquery.js ➔ getWidthOrHeight 0 43 6
A jquery.js ➔ setGlobalEval 0 10 2
A jquery.js ➔ genFx 19 19 4
A jquery.js ➔ createPositionalPseudo 0 17 5
A jquery.js ➔ createButtonPseudo 0 6 2
F jquery.js ➔ Sizzle 0 108 35
F jquery.js ➔ createFxNow 0 6 26
F jquery.js ➔ getWindow 0 3 84
F jquery.js ➔ completed 0 5 62
F jquery.js ➔ setFilters 0 1 206
F jquery.js ➔ add 13 13 16
A jquery.js ➔ assert 0 16 3

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like third-party/angularjs/angular-1.5.0/docs/components/jquery-2.1.1/jquery.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 v2.1.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:11Z
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 arr = [];
47
48
var slice = arr.slice;
49
50
var concat = arr.concat;
51
52
var push = arr.push;
53
54
var indexOf = arr.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
	// Use the correct document accordingly with window argument (sandbox)
68
	document = window.document,
69
70
	version = "2.1.1",
71
72
	// Define a local copy of jQuery
73
	jQuery = function( selector, context ) {
74
		// The jQuery object is actually just the init constructor 'enhanced'
75
		// Need init if jQuery is called (just allow error to be thrown if not included)
76
		return new jQuery.fn.init( selector, context );
77
	},
78
79
	// Support: Android<4.1
80
	// Make sure we trim BOM and NBSP
81
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
82
83
	// Matches dashed string for camelizing
84
	rmsPrefix = /^-ms-/,
85
	rdashAlpha = /-([\da-z])/gi,
86
87
	// Used by jQuery.camelCase as callback to replace()
88
	fcamelCase = function( all, letter ) {
89
		return letter.toUpperCase();
90
	};
91
92
jQuery.fn = jQuery.prototype = {
93
	// The current version of jQuery being used
94
	jquery: version,
95
96
	constructor: jQuery,
97
98
	// Start with an empty selector
99
	selector: "",
100
101
	// The default length of a jQuery object is 0
102
	length: 0,
103
104
	toArray: function() {
105
		return slice.call( this );
106
	},
107
108
	// Get the Nth element in the matched element set OR
109
	// Get the whole matched element set as a clean array
110
	get: function( num ) {
111
		return num != null ?
112
113
			// Return just the one element from the set
114
			( num < 0 ? this[ num + this.length ] : this[ num ] ) :
115
116
			// Return all the elements in a clean array
117
			slice.call( this );
118
	},
119
120
	// Take an array of elements and push it onto the stack
121
	// (returning the new matched element set)
122
	pushStack: function( elems ) {
123
124
		// Build a new jQuery matched element set
125
		var ret = jQuery.merge( this.constructor(), elems );
126
127
		// Add the old object onto the stack (as a reference)
128
		ret.prevObject = this;
129
		ret.context = this.context;
130
131
		// Return the newly-formed element set
132
		return ret;
133
	},
134
135
	// Execute a callback for every element in the matched set.
136
	// (You can seed the arguments with an array of args, but this is
137
	// only used internally.)
138
	each: function( callback, args ) {
139
		return jQuery.each( this, callback, args );
140
	},
141
142
	map: function( callback ) {
143
		return this.pushStack( jQuery.map(this, function( elem, i ) {
144
			return callback.call( elem, i, elem );
145
		}));
146
	},
147
148
	slice: function() {
149
		return this.pushStack( slice.apply( this, arguments ) );
150
	},
151
152
	first: function() {
153
		return this.eq( 0 );
154
	},
155
156
	last: function() {
157
		return this.eq( -1 );
158
	},
159
160
	eq: function( i ) {
161
		var len = this.length,
162
			j = +i + ( i < 0 ? len : 0 );
163
		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
164
	},
165
166
	end: function() {
167
		return this.prevObject || this.constructor(null);
168
	},
169
170
	// For internal use only.
171
	// Behaves like an Array's method, not like a jQuery method.
172
	push: push,
173
	sort: arr.sort,
174
	splice: arr.splice
175
};
176
177
jQuery.extend = jQuery.fn.extend = function() {
178
	var options, name, src, copy, copyIsArray, clone,
179
		target = arguments[0] || {},
180
		i = 1,
181
		length = arguments.length,
182
		deep = false;
183
184
	// Handle a deep copy situation
185
	if ( typeof target === "boolean" ) {
186
		deep = target;
187
188
		// skip the boolean and the target
189
		target = arguments[ i ] || {};
190
		i++;
191
	}
192
193
	// Handle case when target is a string or something (possible in deep copy)
194
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
195
		target = {};
196
	}
197
198
	// extend jQuery itself if only one argument is passed
199
	if ( i === length ) {
200
		target = this;
201
		i--;
202
	}
203
204
	for ( ; i < length; i++ ) {
205
		// Only deal with non-null/undefined values
206
		if ( (options = arguments[ i ]) != null ) {
207
			// Extend the base object
208
			for ( name in options ) {
209
				src = target[ name ];
210
				copy = options[ name ];
211
212
				// Prevent never-ending loop
213
				if ( target === copy ) {
214
					continue;
215
				}
216
217
				// Recurse if we're merging plain objects or arrays
218
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
219
					if ( copyIsArray ) {
220
						copyIsArray = false;
221
						clone = src && jQuery.isArray(src) ? src : [];
222
223
					} else {
224
						clone = src && jQuery.isPlainObject(src) ? src : {};
225
					}
226
227
					// Never move original objects, clone them
228
					target[ name ] = jQuery.extend( deep, clone, copy );
229
230
				// Don't bring in undefined values
231
				} else if ( copy !== undefined ) {
232
					target[ name ] = copy;
233
				}
234
			}
235
		}
236
	}
237
238
	// Return the modified object
239
	return target;
240
};
241
242
jQuery.extend({
243
	// Unique for each copy of jQuery on the page
244
	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
245
246
	// Assume jQuery is ready without the ready module
247
	isReady: true,
248
249
	error: function( msg ) {
250
		throw new Error( msg );
251
	},
252
253
	noop: function() {},
254
255
	// See test/unit/core.js for details concerning isFunction.
256
	// Since version 1.3, DOM methods and functions like alert
257
	// aren't supported. They return false on IE (#2968).
258
	isFunction: function( obj ) {
259
		return jQuery.type(obj) === "function";
260
	},
261
262
	isArray: Array.isArray,
263
264
	isWindow: function( obj ) {
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
	isPlainObject: function( obj ) {
276
		// Not plain objects:
277
		// - Any object or value whose internal [[Class]] property is not "[object Object]"
278
		// - DOM nodes
279
		// - window
280
		if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
281
			return false;
282
		}
283
284
		if ( obj.constructor &&
285
				!hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
286
			return false;
287
		}
288
289
		// If the function hasn't returned already, we're confident that
290
		// |obj| is a plain object, created by {} or constructed with new Object
291
		return true;
292
	},
293
294
	isEmptyObject: function( obj ) {
295
		var name;
296
		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...
297
			return false;
298
		}
299
		return true;
300
	},
301
302
	type: function( obj ) {
303
		if ( obj == null ) {
304
			return obj + "";
305
		}
306
		// Support: Android < 4.0, iOS < 6 (functionish RegExp)
307
		return typeof obj === "object" || typeof obj === "function" ?
308
			class2type[ toString.call(obj) ] || "object" :
309
			typeof obj;
310
	},
311
312
	// Evaluates a script in a global context
313
	globalEval: function( code ) {
314
		var script,
315
			indirect = eval;
0 ignored issues
show
Comprehensibility Best Practice introduced by
You seem to be aliasing the built-in name eval as indirect. This makes your code very difficult to follow, consider using the built-in name directly.
Loading history...
316
317
		code = jQuery.trim( code );
318
319
		if ( code ) {
320
			// If the code includes a valid, prologue position
321
			// strict mode pragma, execute code by injecting a
322
			// script tag into the document.
323
			if ( code.indexOf("use strict") === 1 ) {
324
				script = document.createElement("script");
325
				script.text = code;
326
				document.head.appendChild( script ).parentNode.removeChild( script );
327
			} else {
328
			// Otherwise, avoid the DOM node creation, insertion
329
			// and removal by using an indirect global eval
330
				indirect( code );
331
			}
332
		}
333
	},
334
335
	// Convert dashed to camelCase; used by the css and data modules
336
	// Microsoft forgot to hump their vendor prefix (#9572)
337
	camelCase: function( string ) {
338
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
339
	},
340
341
	nodeName: function( elem, name ) {
342
		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
343
	},
344
345
	// args is for internal usage only
346
	each: function( obj, callback, args ) {
347
		var value,
348
			i = 0,
349
			length = obj.length,
350
			isArray = isArraylike( obj );
351
352
		if ( args ) {
353
			if ( isArray ) {
354
				for ( ; i < length; i++ ) {
355
					value = callback.apply( obj[ i ], args );
356
357
					if ( value === false ) {
358
						break;
359
					}
360
				}
361
			} else {
362
				for ( i in obj ) {
363
					value = callback.apply( obj[ i ], args );
364
365
					if ( value === false ) {
366
						break;
367
					}
368
				}
369
			}
370
371
		// A special, fast, case for the most common use of each
372
		} else {
373
			if ( isArray ) {
374
				for ( ; i < length; i++ ) {
375
					value = callback.call( obj[ i ], i, obj[ i ] );
376
377
					if ( value === false ) {
378
						break;
379
					}
380
				}
381
			} else {
382
				for ( i in obj ) {
383
					value = callback.call( obj[ i ], i, obj[ i ] );
384
385
					if ( value === false ) {
386
						break;
387
					}
388
				}
389
			}
390
		}
391
392
		return obj;
393
	},
394
395
	// Support: Android<4.1
396
	trim: function( text ) {
397
		return text == null ?
398
			"" :
399
			( text + "" ).replace( rtrim, "" );
400
	},
401
402
	// results is for internal usage only
403
	makeArray: function( arr, results ) {
404
		var ret = results || [];
405
406
		if ( arr != null ) {
407
			if ( isArraylike( Object(arr) ) ) {
408
				jQuery.merge( ret,
409
					typeof arr === "string" ?
410
					[ arr ] : arr
411
				);
412
			} else {
413
				push.call( ret, arr );
414
			}
415
		}
416
417
		return ret;
418
	},
419
420
	inArray: function( elem, arr, i ) {
421
		return arr == null ? -1 : indexOf.call( arr, elem, i );
422
	},
423
424
	merge: function( first, second ) {
425
		var len = +second.length,
426
			j = 0,
427
			i = first.length;
428
429
		for ( ; j < len; j++ ) {
430
			first[ i++ ] = second[ j ];
431
		}
432
433
		first.length = i;
434
435
		return first;
436
	},
437
438
	grep: function( elems, callback, invert ) {
439
		var callbackInverse,
440
			matches = [],
441
			i = 0,
442
			length = elems.length,
443
			callbackExpect = !invert;
444
445
		// Go through the array, only saving the items
446
		// that pass the validator function
447
		for ( ; i < length; i++ ) {
448
			callbackInverse = !callback( elems[ i ], i );
449
			if ( callbackInverse !== callbackExpect ) {
450
				matches.push( elems[ i ] );
451
			}
452
		}
453
454
		return matches;
455
	},
456
457
	// arg is for internal usage only
458
	map: function( elems, callback, arg ) {
459
		var value,
460
			i = 0,
461
			length = elems.length,
462
			isArray = isArraylike( elems ),
463
			ret = [];
464
465
		// Go through the array, translating each of the items to their new values
466
		if ( isArray ) {
467
			for ( ; i < length; i++ ) {
468
				value = callback( elems[ i ], i, arg );
469
470
				if ( value != null ) {
471
					ret.push( value );
472
				}
473
			}
474
475
		// Go through every key on the object,
476
		} else {
477
			for ( i in elems ) {
478
				value = callback( elems[ i ], i, arg );
479
480
				if ( value != null ) {
481
					ret.push( value );
482
				}
483
			}
484
		}
485
486
		// Flatten any nested arrays
487
		return concat.apply( [], ret );
488
	},
489
490
	// A global GUID counter for objects
491
	guid: 1,
492
493
	// Bind a function to a context, optionally partially applying any
494
	// arguments.
495
	proxy: function( fn, context ) {
496
		var tmp, args, proxy;
497
498
		if ( typeof context === "string" ) {
499
			tmp = fn[ context ];
500
			context = fn;
501
			fn = tmp;
502
		}
503
504
		// Quick check to determine if target is callable, in the spec
505
		// this throws a TypeError, but we will just return undefined.
506
		if ( !jQuery.isFunction( fn ) ) {
507
			return undefined;
508
		}
509
510
		// Simulated bind
511
		args = slice.call( arguments, 2 );
512
		proxy = function() {
513
			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
514
		};
515
516
		// Set the guid of unique handler to the same of original handler, so it can be removed
517
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
518
519
		return proxy;
520
	},
521
522
	now: Date.now,
523
524
	// jQuery.support is not used in Core but other projects attach their
525
	// properties to it so it needs to exist.
526
	support: support
527
});
528
529
// Populate the class2type map
530
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
531
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
532
});
533
534
function isArraylike( obj ) {
535
	var length = obj.length,
536
		type = jQuery.type( obj );
537
538
	if ( type === "function" || jQuery.isWindow( obj ) ) {
539
		return false;
540
	}
541
542
	if ( obj.nodeType === 1 && length ) {
543
		return true;
544
	}
545
546
	return type === "array" || length === 0 ||
547
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
548
}
549
var Sizzle =
550
/*!
551
 * Sizzle CSS Selector Engine v1.10.19
552
 * http://sizzlejs.com/
553
 *
554
 * Copyright 2013 jQuery Foundation, Inc. and other contributors
555
 * Released under the MIT license
556
 * http://jquery.org/license
557
 *
558
 * Date: 2014-04-18
559
 */
560
(function( window ) {
561
562
var i,
563
	support,
564
	Expr,
565
	getText,
566
	isXML,
567
	tokenize,
568
	compile,
569
	select,
570
	outermostContext,
571
	sortInput,
572
	hasDuplicate,
573
574
	// Local document vars
575
	setDocument,
576
	document,
577
	docElem,
578
	documentIsHTML,
579
	rbuggyQSA,
580
	rbuggyMatches,
581
	matches,
582
	contains,
583
584
	// Instance-specific data
585
	expando = "sizzle" + -(new Date()),
586
	preferredDoc = window.document,
587
	dirruns = 0,
588
	done = 0,
589
	classCache = createCache(),
590
	tokenCache = createCache(),
591
	compilerCache = createCache(),
592
	sortOrder = function( a, b ) {
593
		if ( a === b ) {
594
			hasDuplicate = true;
595
		}
596
		return 0;
597
	},
598
599
	// General-purpose constants
600
	strundefined = typeof undefined,
601
	MAX_NEGATIVE = 1 << 31,
602
603
	// Instance methods
604
	hasOwn = ({}).hasOwnProperty,
605
	arr = [],
606
	pop = arr.pop,
607
	push_native = arr.push,
608
	push = arr.push,
609
	slice = arr.slice,
610
	// Use a stripped-down indexOf if we can't use a native one
611
	indexOf = arr.indexOf || function( elem ) {
612
		var i = 0,
613
			len = this.length;
614
		for ( ; i < len; i++ ) {
615
			if ( this[i] === elem ) {
616
				return i;
617
			}
618
		}
619
		return -1;
620
	},
621
622
	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
623
624
	// Regular expressions
625
626
	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
627
	whitespace = "[\\x20\\t\\r\\n\\f]",
628
	// http://www.w3.org/TR/css3-syntax/#characters
629
	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
630
631
	// Loosely modeled on CSS identifier characters
632
	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
633
	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
634
	identifier = characterEncoding.replace( "w", "w#" ),
635
636
	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
637
	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace +
638
		// Operator (capture 2)
639
		"*([*^$|!~]?=)" + whitespace +
640
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
641
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
642
		"*\\]",
643
644
	pseudos = ":(" + characterEncoding + ")(?:\\((" +
645
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
646
		// 1. quoted (capture 3; capture 4 or capture 5)
647
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
648
		// 2. simple (capture 6)
649
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
650
		// 3. anything else (capture 2)
651
		".*" +
652
		")\\)|)",
653
654
	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
655
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
656
657
	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
658
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
659
660
	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
661
662
	rpseudo = new RegExp( pseudos ),
663
	ridentifier = new RegExp( "^" + identifier + "$" ),
664
665
	matchExpr = {
666
		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
667
		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
668
		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
669
		"ATTR": new RegExp( "^" + attributes ),
670
		"PSEUDO": new RegExp( "^" + pseudos ),
671
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
672
			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
673
			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
674
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
675
		// For use in libraries implementing .is()
676
		// We use this for POS matching in `select`
677
		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
678
			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
679
	},
680
681
	rinputs = /^(?:input|select|textarea|button)$/i,
682
	rheader = /^h\d$/i,
683
684
	rnative = /^[^{]+\{\s*\[native \w/,
685
686
	// Easily-parseable/retrievable ID or TAG or CLASS selectors
687
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
688
689
	rsibling = /[+~]/,
690
	rescape = /'|\\/g,
691
692
	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
693
	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
694
	funescape = function( _, escaped, escapedWhitespace ) {
695
		var high = "0x" + escaped - 0x10000;
696
		// NaN means non-codepoint
697
		// Support: Firefox<24
698
		// Workaround erroneous numeric interpretation of +"0x"
699
		return high !== high || escapedWhitespace ?
700
			escaped :
701
			high < 0 ?
702
				// BMP codepoint
703
				String.fromCharCode( high + 0x10000 ) :
704
				// Supplemental Plane codepoint (surrogate pair)
705
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
706
	};
707
708
// Optimize for push.apply( _, NodeList )
709
try {
710
	push.apply(
711
		(arr = slice.call( preferredDoc.childNodes )),
712
		preferredDoc.childNodes
713
	);
714
	// Support: Android<4.0
715
	// Detect silently failing push.apply
716
	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...
717
} catch ( e ) {
718
	push = { apply: arr.length ?
719
720
		// Leverage slice if possible
721
		function( target, els ) {
722
			push_native.apply( target, slice.call(els) );
723
		} :
724
725
		// Support: IE<9
726
		// Otherwise append directly
727
		function( target, els ) {
728
			var j = target.length,
729
				i = 0;
730
			// Can't trust NodeList.length
731
			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...
732
			target.length = j - 1;
733
		}
734
	};
735
}
736
737
function Sizzle( selector, context, results, seed ) {
738
	var match, elem, m, nodeType,
739
		// QSA vars
740
		i, groups, old, nid, newContext, newSelector;
741
742
	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
743
		setDocument( context );
744
	}
745
746
	context = context || document;
747
	results = results || [];
748
749
	if ( !selector || typeof selector !== "string" ) {
750
		return results;
751
	}
752
753
	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
754
		return [];
755
	}
756
757
	if ( documentIsHTML && !seed ) {
758
759
		// Shortcuts
760
		if ( (match = rquickExpr.exec( selector )) ) {
761
			// Speed-up: Sizzle("#ID")
762
			if ( (m = match[1]) ) {
763
				if ( nodeType === 9 ) {
764
					elem = context.getElementById( m );
765
					// Check parentNode to catch when Blackberry 4.6 returns
766
					// nodes that are no longer in the document (jQuery #6963)
767
					if ( elem && elem.parentNode ) {
768
						// Handle the case where IE, Opera, and Webkit return items
769
						// by name instead of ID
770
						if ( elem.id === m ) {
771
							results.push( elem );
772
							return results;
773
						}
774
					} else {
775
						return results;
776
					}
777
				} else {
778
					// Context is not a document
779
					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
780
						contains( context, elem ) && elem.id === m ) {
781
						results.push( elem );
782
						return results;
783
					}
784
				}
785
786
			// Speed-up: Sizzle("TAG")
787
			} else if ( match[2] ) {
788
				push.apply( results, context.getElementsByTagName( selector ) );
789
				return results;
790
791
			// Speed-up: Sizzle(".CLASS")
792
			} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {
793
				push.apply( results, context.getElementsByClassName( m ) );
794
				return results;
795
			}
796
		}
797
798
		// QSA path
799
		if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
800
			nid = old = expando;
801
			newContext = context;
802
			newSelector = nodeType === 9 && selector;
803
804
			// qSA works strangely on Element-rooted queries
805
			// We can work around this by specifying an extra ID on the root
806
			// and working up from there (Thanks to Andrew Dupont for the technique)
807
			// IE 8 doesn't work on object elements
808
			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
809
				groups = tokenize( selector );
810
811
				if ( (old = context.getAttribute("id")) ) {
812
					nid = old.replace( rescape, "\\$&" );
813
				} else {
814
					context.setAttribute( "id", nid );
815
				}
816
				nid = "[id='" + nid + "'] ";
817
818
				i = groups.length;
819
				while ( i-- ) {
820
					groups[i] = nid + toSelector( groups[i] );
821
				}
822
				newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
823
				newSelector = groups.join(",");
824
			}
825
826
			if ( newSelector ) {
827
				try {
828
					push.apply( results,
829
						newContext.querySelectorAll( newSelector )
830
					);
831
					return results;
832
				} 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...
833
				} finally {
834
					if ( !old ) {
835
						context.removeAttribute("id");
836
					}
837
				}
838
			}
839
		}
840
	}
841
842
	// All others
843
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
844
}
845
846
/**
847
 * Create key-value caches of limited size
848
 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
849
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
850
 *	deleting the oldest entry
851
 */
852
function createCache() {
853
	var keys = [];
854
855
	function cache( key, value ) {
856
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
857
		if ( keys.push( key + " " ) > Expr.cacheLength ) {
858
			// Only keep the most recent entries
859
			delete cache[ keys.shift() ];
860
		}
861
		return (cache[ key + " " ] = value);
862
	}
863
	return cache;
864
}
865
866
/**
867
 * Mark a function for special use by Sizzle
868
 * @param {Function} fn The function to mark
869
 */
870
function markFunction( fn ) {
871
	fn[ expando ] = true;
872
	return fn;
873
}
874
875
/**
876
 * Support testing using an element
877
 * @param {Function} fn Passed the created div and expects a boolean result
878
 */
879
function assert( fn ) {
880
	var div = document.createElement("div");
881
882
	try {
883
		return !!fn( div );
884
	} catch (e) {
885
		return false;
886
	} finally {
887
		// Remove from its parent by default
888
		if ( div.parentNode ) {
889
			div.parentNode.removeChild( div );
890
		}
891
		// release memory in IE
892
		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...
893
	}
894
}
895
896
/**
897
 * Adds the same handler for all of the specified attrs
898
 * @param {String} attrs Pipe-separated list of attributes
899
 * @param {Function} handler The method that will be applied
900
 */
901
function addHandle( attrs, handler ) {
902
	var arr = attrs.split("|"),
903
		i = attrs.length;
904
905
	while ( i-- ) {
906
		Expr.attrHandle[ arr[i] ] = handler;
907
	}
908
}
909
910
/**
911
 * Checks document order of two siblings
912
 * @param {Element} a
913
 * @param {Element} b
914
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
915
 */
916
function siblingCheck( a, b ) {
917
	var cur = b && a,
918
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
919
			( ~b.sourceIndex || MAX_NEGATIVE ) -
920
			( ~a.sourceIndex || MAX_NEGATIVE );
921
922
	// Use IE sourceIndex if available on both nodes
923
	if ( diff ) {
924
		return diff;
925
	}
926
927
	// Check if b follows a
928
	if ( cur ) {
929
		while ( (cur = cur.nextSibling) ) {
930
			if ( cur === b ) {
931
				return -1;
932
			}
933
		}
934
	}
935
936
	return a ? 1 : -1;
937
}
938
939
/**
940
 * Returns a function to use in pseudos for input types
941
 * @param {String} type
942
 */
943
function createInputPseudo( type ) {
944
	return function( elem ) {
945
		var name = elem.nodeName.toLowerCase();
946
		return name === "input" && elem.type === type;
947
	};
948
}
949
950
/**
951
 * Returns a function to use in pseudos for buttons
952
 * @param {String} type
953
 */
954
function createButtonPseudo( type ) {
955
	return function( elem ) {
956
		var name = elem.nodeName.toLowerCase();
957
		return (name === "input" || name === "button") && elem.type === type;
958
	};
959
}
960
961
/**
962
 * Returns a function to use in pseudos for positionals
963
 * @param {Function} fn
964
 */
965
function createPositionalPseudo( fn ) {
966
	return markFunction(function( argument ) {
967
		argument = +argument;
968
		return markFunction(function( seed, matches ) {
969
			var j,
970
				matchIndexes = fn( [], seed.length, argument ),
971
				i = matchIndexes.length;
972
973
			// Match elements found at the specified indexes
974
			while ( i-- ) {
975
				if ( seed[ (j = matchIndexes[i]) ] ) {
976
					seed[j] = !(matches[j] = seed[j]);
977
				}
978
			}
979
		});
980
	});
981
}
982
983
/**
984
 * Checks a node for validity as a Sizzle context
985
 * @param {Element|Object=} context
986
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
987
 */
988
function testContext( context ) {
989
	return context && typeof context.getElementsByTagName !== strundefined && context;
990
}
991
992
// Expose support vars for convenience
993
support = Sizzle.support = {};
994
995
/**
996
 * Detects XML nodes
997
 * @param {Element|Object} elem An element or a document
998
 * @returns {Boolean} True iff elem is a non-HTML XML node
999
 */
1000
isXML = Sizzle.isXML = function( elem ) {
1001
	// documentElement is verified for cases where it doesn't yet exist
1002
	// (such as loading iframes in IE - #4833)
1003
	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
1004
	return documentElement ? documentElement.nodeName !== "HTML" : false;
1005
};
1006
1007
/**
1008
 * Sets document-related variables once based on the current document
1009
 * @param {Element|Object} [doc] An element or document object to use to set the document
1010
 * @returns {Object} Returns the current document
1011
 */
1012
setDocument = Sizzle.setDocument = function( node ) {
1013
	var hasCompare,
1014
		doc = node ? node.ownerDocument || node : preferredDoc,
1015
		parent = doc.defaultView;
1016
1017
	// If no document and documentElement is available, return
1018
	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
1019
		return document;
1020
	}
1021
1022
	// Set our document
1023
	document = doc;
1024
	docElem = doc.documentElement;
1025
1026
	// Support tests
1027
	documentIsHTML = !isXML( doc );
1028
1029
	// Support: IE>8
1030
	// If iframe document is assigned to "document" variable and if iframe has been reloaded,
1031
	// IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936
1032
	// IE6-8 do not support the defaultView property so parent will be undefined
1033
	if ( parent && parent !== parent.top ) {
1034
		// IE11 does not have attachEvent, so all must suffer
1035
		if ( parent.addEventListener ) {
1036
			parent.addEventListener( "unload", function() {
1037
				setDocument();
1038
			}, false );
1039
		} else if ( parent.attachEvent ) {
1040
			parent.attachEvent( "onunload", function() {
1041
				setDocument();
1042
			});
1043
		}
1044
	}
1045
1046
	/* Attributes
1047
	---------------------------------------------------------------------- */
1048
1049
	// Support: IE<8
1050
	// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
1051
	support.attributes = assert(function( div ) {
1052
		div.className = "i";
1053
		return !div.getAttribute("className");
1054
	});
1055
1056
	/* getElement(s)By*
1057
	---------------------------------------------------------------------- */
1058
1059
	// Check if getElementsByTagName("*") returns only elements
1060
	support.getElementsByTagName = assert(function( div ) {
1061
		div.appendChild( doc.createComment("") );
1062
		return !div.getElementsByTagName("*").length;
1063
	});
1064
1065
	// Check if getElementsByClassName can be trusted
1066
	support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
1067
		div.innerHTML = "<div class='a'></div><div class='a i'></div>";
1068
1069
		// Support: Safari<4
1070
		// Catch class over-caching
1071
		div.firstChild.className = "i";
1072
		// Support: Opera<10
1073
		// Catch gEBCN failure to find non-leading classes
1074
		return div.getElementsByClassName("i").length === 2;
1075
	});
1076
1077
	// Support: IE<10
1078
	// Check if getElementById returns elements by name
1079
	// The broken getElementById methods don't pick up programatically-set names,
1080
	// so use a roundabout getElementsByName test
1081
	support.getById = assert(function( div ) {
1082
		docElem.appendChild( div ).id = expando;
1083
		return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
1084
	});
1085
1086
	// ID find and filter
1087
	if ( support.getById ) {
1088
		Expr.find["ID"] = function( id, context ) {
1089
			if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
1090
				var m = context.getElementById( id );
1091
				// Check parentNode to catch when Blackberry 4.6 returns
1092
				// nodes that are no longer in the document #6963
1093
				return m && m.parentNode ? [ m ] : [];
1094
			}
1095
		};
1096
		Expr.filter["ID"] = function( id ) {
1097
			var attrId = id.replace( runescape, funescape );
1098
			return function( elem ) {
1099
				return elem.getAttribute("id") === attrId;
1100
			};
1101
		};
1102
	} else {
1103
		// Support: IE6/7
1104
		// getElementById is not reliable as a find shortcut
1105
		delete Expr.find["ID"];
1106
1107
		Expr.filter["ID"] =  function( id ) {
1108
			var attrId = id.replace( runescape, funescape );
1109
			return function( elem ) {
1110
				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
1111
				return node && node.value === attrId;
1112
			};
1113
		};
1114
	}
1115
1116
	// Tag
1117
	Expr.find["TAG"] = support.getElementsByTagName ?
1118
		function( tag, context ) {
1119
			if ( typeof context.getElementsByTagName !== strundefined ) {
1120
				return context.getElementsByTagName( tag );
1121
			}
1122
		} :
1123
		function( tag, context ) {
1124
			var elem,
1125
				tmp = [],
1126
				i = 0,
1127
				results = context.getElementsByTagName( tag );
1128
1129
			// Filter out possible comments
1130
			if ( tag === "*" ) {
1131
				while ( (elem = results[i++]) ) {
1132
					if ( elem.nodeType === 1 ) {
1133
						tmp.push( elem );
1134
					}
1135
				}
1136
1137
				return tmp;
1138
			}
1139
			return results;
1140
		};
1141
1142
	// Class
1143
	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
1144
		if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
1145
			return context.getElementsByClassName( className );
1146
		}
1147
	};
1148
1149
	/* QSA/matchesSelector
1150
	---------------------------------------------------------------------- */
1151
1152
	// QSA and matchesSelector support
1153
1154
	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
1155
	rbuggyMatches = [];
1156
1157
	// qSa(:focus) reports false when true (Chrome 21)
1158
	// We allow this because of a bug in IE8/9 that throws an error
1159
	// whenever `document.activeElement` is accessed on an iframe
1160
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
1161
	// See http://bugs.jquery.com/ticket/13378
1162
	rbuggyQSA = [];
1163
1164
	if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
1165
		// Build QSA regex
1166
		// Regex strategy adopted from Diego Perini
1167
		assert(function( div ) {
1168
			// Select is set to empty string on purpose
1169
			// This is to test IE's treatment of not explicitly
1170
			// setting a boolean content attribute,
1171
			// since its presence should be enough
1172
			// http://bugs.jquery.com/ticket/12359
1173
			div.innerHTML = "<select msallowclip=''><option selected=''></option></select>";
1174
1175
			// Support: IE8, Opera 11-12.16
1176
			// Nothing should be selected when empty strings follow ^= or $= or *=
1177
			// The test attribute must be unknown in Opera but "safe" for WinRT
1178
			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
1179
			if ( div.querySelectorAll("[msallowclip^='']").length ) {
1180
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
1181
			}
1182
1183
			// Support: IE8
1184
			// Boolean attributes and "value" are not treated correctly
1185
			if ( !div.querySelectorAll("[selected]").length ) {
1186
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
1187
			}
1188
1189
			// Webkit/Opera - :checked should return selected option elements
1190
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1191
			// IE8 throws error here and will not see later tests
1192
			if ( !div.querySelectorAll(":checked").length ) {
1193
				rbuggyQSA.push(":checked");
1194
			}
1195
		});
1196
1197
		assert(function( div ) {
1198
			// Support: Windows 8 Native Apps
1199
			// The type and name attributes are restricted during .innerHTML assignment
1200
			var input = doc.createElement("input");
1201
			input.setAttribute( "type", "hidden" );
1202
			div.appendChild( input ).setAttribute( "name", "D" );
1203
1204
			// Support: IE8
1205
			// Enforce case-sensitivity of name attribute
1206
			if ( div.querySelectorAll("[name=d]").length ) {
1207
				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
1208
			}
1209
1210
			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
1211
			// IE8 throws error here and will not see later tests
1212
			if ( !div.querySelectorAll(":enabled").length ) {
1213
				rbuggyQSA.push( ":enabled", ":disabled" );
1214
			}
1215
1216
			// Opera 10-11 does not throw on post-comma invalid pseudos
1217
			div.querySelectorAll("*,:x");
1218
			rbuggyQSA.push(",.*:");
1219
		});
1220
	}
1221
1222
	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
1223
		docElem.webkitMatchesSelector ||
1224
		docElem.mozMatchesSelector ||
1225
		docElem.oMatchesSelector ||
1226
		docElem.msMatchesSelector) )) ) {
1227
1228
		assert(function( div ) {
1229
			// Check to see if it's possible to do matchesSelector
1230
			// on a disconnected node (IE 9)
1231
			support.disconnectedMatch = matches.call( div, "div" );
1232
1233
			// This should fail with an exception
1234
			// Gecko does not error, returns false instead
1235
			matches.call( div, "[s!='']:x" );
1236
			rbuggyMatches.push( "!=", pseudos );
1237
		});
1238
	}
1239
1240
	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
1241
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
1242
1243
	/* Contains
1244
	---------------------------------------------------------------------- */
1245
	hasCompare = rnative.test( docElem.compareDocumentPosition );
1246
1247
	// Element contains another
1248
	// Purposefully does not implement inclusive descendent
1249
	// As in, an element does not contain itself
1250
	contains = hasCompare || rnative.test( docElem.contains ) ?
1251
		function( a, b ) {
1252
			var adown = a.nodeType === 9 ? a.documentElement : a,
1253
				bup = b && b.parentNode;
1254
			return a === bup || !!( bup && bup.nodeType === 1 && (
1255
				adown.contains ?
1256
					adown.contains( bup ) :
1257
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
1258
			));
1259
		} :
1260
		function( a, b ) {
1261
			if ( b ) {
1262
				while ( (b = b.parentNode) ) {
1263
					if ( b === a ) {
1264
						return true;
1265
					}
1266
				}
1267
			}
1268
			return false;
1269
		};
1270
1271
	/* Sorting
1272
	---------------------------------------------------------------------- */
1273
1274
	// Document order sorting
1275
	sortOrder = hasCompare ?
1276
	function( a, b ) {
1277
1278
		// Flag for duplicate removal
1279
		if ( a === b ) {
1280
			hasDuplicate = true;
1281
			return 0;
1282
		}
1283
1284
		// Sort on method existence if only one input has compareDocumentPosition
1285
		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
1286
		if ( compare ) {
1287
			return compare;
1288
		}
1289
1290
		// Calculate position if both inputs belong to the same document
1291
		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
1292
			a.compareDocumentPosition( b ) :
1293
1294
			// Otherwise we know they are disconnected
1295
			1;
1296
1297
		// Disconnected nodes
1298
		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...
1299
			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
1300
1301
			// Choose the first element that is related to our preferred document
1302
			if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
1303
				return -1;
1304
			}
1305
			if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
1306
				return 1;
1307
			}
1308
1309
			// Maintain original order
1310
			return sortInput ?
1311
				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1312
				0;
1313
		}
1314
1315
		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...
1316
	} :
1317
	function( a, b ) {
1318
		// Exit early if the nodes are identical
1319
		if ( a === b ) {
1320
			hasDuplicate = true;
1321
			return 0;
1322
		}
1323
1324
		var cur,
1325
			i = 0,
1326
			aup = a.parentNode,
1327
			bup = b.parentNode,
1328
			ap = [ a ],
1329
			bp = [ b ];
1330
1331
		// Parentless nodes are either documents or disconnected
1332
		if ( !aup || !bup ) {
1333
			return a === doc ? -1 :
1334
				b === doc ? 1 :
1335
				aup ? -1 :
1336
				bup ? 1 :
1337
				sortInput ?
1338
				( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
1339
				0;
1340
1341
		// If the nodes are siblings, we can do a quick check
1342
		} else if ( aup === bup ) {
1343
			return siblingCheck( a, b );
1344
		}
1345
1346
		// Otherwise we need full lists of their ancestors for comparison
1347
		cur = a;
1348
		while ( (cur = cur.parentNode) ) {
1349
			ap.unshift( cur );
1350
		}
1351
		cur = b;
1352
		while ( (cur = cur.parentNode) ) {
1353
			bp.unshift( cur );
1354
		}
1355
1356
		// Walk down the tree looking for a discrepancy
1357
		while ( ap[i] === bp[i] ) {
1358
			i++;
1359
		}
1360
1361
		return i ?
1362
			// Do a sibling check if the nodes have a common ancestor
1363
			siblingCheck( ap[i], bp[i] ) :
1364
1365
			// Otherwise nodes in our document sort first
1366
			ap[i] === preferredDoc ? -1 :
1367
			bp[i] === preferredDoc ? 1 :
1368
			0;
1369
	};
1370
1371
	return doc;
1372
};
1373
1374
Sizzle.matches = function( expr, elements ) {
1375
	return Sizzle( expr, null, null, elements );
1376
};
1377
1378
Sizzle.matchesSelector = function( elem, expr ) {
1379
	// Set document vars if needed
1380
	if ( ( elem.ownerDocument || elem ) !== document ) {
1381
		setDocument( elem );
1382
	}
1383
1384
	// Make sure that attribute selectors are quoted
1385
	expr = expr.replace( rattributeQuotes, "='$1']" );
1386
1387
	if ( support.matchesSelector && documentIsHTML &&
1388
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
1389
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {
1390
1391
		try {
1392
			var ret = matches.call( elem, expr );
1393
1394
			// IE 9's matchesSelector returns false on disconnected nodes
1395
			if ( ret || support.disconnectedMatch ||
1396
					// As well, disconnected nodes are said to be in a document
1397
					// fragment in IE 9
1398
					elem.document && elem.document.nodeType !== 11 ) {
1399
				return ret;
1400
			}
1401
		} 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...
1402
	}
1403
1404
	return Sizzle( expr, document, null, [ elem ] ).length > 0;
1405
};
1406
1407
Sizzle.contains = function( context, elem ) {
1408
	// Set document vars if needed
1409
	if ( ( context.ownerDocument || context ) !== document ) {
1410
		setDocument( context );
1411
	}
1412
	return contains( context, elem );
1413
};
1414
1415
Sizzle.attr = function( elem, name ) {
1416
	// Set document vars if needed
1417
	if ( ( elem.ownerDocument || elem ) !== document ) {
1418
		setDocument( elem );
1419
	}
1420
1421
	var fn = Expr.attrHandle[ name.toLowerCase() ],
1422
		// Don't get fooled by Object.prototype properties (jQuery #13807)
1423
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
1424
			fn( elem, name, !documentIsHTML ) :
1425
			undefined;
1426
1427
	return val !== undefined ?
1428
		val :
1429
		support.attributes || !documentIsHTML ?
1430
			elem.getAttribute( name ) :
1431
			(val = elem.getAttributeNode(name)) && val.specified ?
1432
				val.value :
1433
				null;
1434
};
1435
1436
Sizzle.error = function( msg ) {
1437
	throw new Error( "Syntax error, unrecognized expression: " + msg );
1438
};
1439
1440
/**
1441
 * Document sorting and removing duplicates
1442
 * @param {ArrayLike} results
1443
 */
1444
Sizzle.uniqueSort = function( results ) {
1445
	var elem,
1446
		duplicates = [],
1447
		j = 0,
1448
		i = 0;
1449
1450
	// Unless we *know* we can detect duplicates, assume their presence
1451
	hasDuplicate = !support.detectDuplicates;
1452
	sortInput = !support.sortStable && results.slice( 0 );
1453
	results.sort( sortOrder );
1454
1455
	if ( hasDuplicate ) {
1456
		while ( (elem = results[i++]) ) {
1457
			if ( elem === results[ i ] ) {
1458
				j = duplicates.push( i );
1459
			}
1460
		}
1461
		while ( j-- ) {
1462
			results.splice( duplicates[ j ], 1 );
1463
		}
1464
	}
1465
1466
	// Clear input after sorting to release objects
1467
	// See https://github.com/jquery/sizzle/pull/225
1468
	sortInput = null;
1469
1470
	return results;
1471
};
1472
1473
/**
1474
 * Utility function for retrieving the text value of an array of DOM nodes
1475
 * @param {Array|Element} elem
1476
 */
1477
getText = Sizzle.getText = function( elem ) {
1478
	var node,
1479
		ret = "",
1480
		i = 0,
1481
		nodeType = elem.nodeType;
1482
1483
	if ( !nodeType ) {
1484
		// If no nodeType, this is expected to be an array
1485
		while ( (node = elem[i++]) ) {
1486
			// Do not traverse comment nodes
1487
			ret += getText( node );
1488
		}
1489
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
1490
		// Use textContent for elements
1491
		// innerText usage removed for consistency of new lines (jQuery #11153)
1492
		if ( typeof elem.textContent === "string" ) {
1493
			return elem.textContent;
1494
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
1495
			// Traverse its children
1496
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1497
				ret += getText( elem );
1498
			}
1499
		}
1500
	} else if ( nodeType === 3 || nodeType === 4 ) {
1501
		return elem.nodeValue;
1502
	}
1503
	// Do not include comment or processing instruction nodes
1504
1505
	return ret;
1506
};
1507
1508
Expr = Sizzle.selectors = {
1509
1510
	// Can be adjusted by the user
1511
	cacheLength: 50,
1512
1513
	createPseudo: markFunction,
1514
1515
	match: matchExpr,
1516
1517
	attrHandle: {},
1518
1519
	find: {},
1520
1521
	relative: {
1522
		">": { dir: "parentNode", first: true },
1523
		" ": { dir: "parentNode" },
1524
		"+": { dir: "previousSibling", first: true },
1525
		"~": { dir: "previousSibling" }
1526
	},
1527
1528
	preFilter: {
1529
		"ATTR": function( match ) {
1530
			match[1] = match[1].replace( runescape, funescape );
1531
1532
			// Move the given value to match[3] whether quoted or unquoted
1533
			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
1534
1535
			if ( match[2] === "~=" ) {
1536
				match[3] = " " + match[3] + " ";
1537
			}
1538
1539
			return match.slice( 0, 4 );
1540
		},
1541
1542
		"CHILD": function( match ) {
1543
			/* matches from matchExpr["CHILD"]
1544
				1 type (only|nth|...)
1545
				2 what (child|of-type)
1546
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
1547
				4 xn-component of xn+y argument ([+-]?\d*n|)
1548
				5 sign of xn-component
1549
				6 x of xn-component
1550
				7 sign of y-component
1551
				8 y of y-component
1552
			*/
1553
			match[1] = match[1].toLowerCase();
1554
1555
			if ( match[1].slice( 0, 3 ) === "nth" ) {
1556
				// nth-* requires argument
1557
				if ( !match[3] ) {
1558
					Sizzle.error( match[0] );
1559
				}
1560
1561
				// numeric x and y parameters for Expr.filter.CHILD
1562
				// remember that false/true cast respectively to 0/1
1563
				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
1564
				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
1565
1566
			// other types prohibit arguments
1567
			} else if ( match[3] ) {
1568
				Sizzle.error( match[0] );
1569
			}
1570
1571
			return match;
1572
		},
1573
1574
		"PSEUDO": function( match ) {
1575
			var excess,
1576
				unquoted = !match[6] && match[2];
1577
1578
			if ( matchExpr["CHILD"].test( match[0] ) ) {
1579
				return null;
1580
			}
1581
1582
			// Accept quoted arguments as-is
1583
			if ( match[3] ) {
1584
				match[2] = match[4] || match[5] || "";
1585
1586
			// Strip excess characters from unquoted arguments
1587
			} else if ( unquoted && rpseudo.test( unquoted ) &&
1588
				// Get excess from tokenize (recursively)
1589
				(excess = tokenize( unquoted, true )) &&
1590
				// advance to the next closing parenthesis
1591
				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
1592
1593
				// excess is a negative index
1594
				match[0] = match[0].slice( 0, excess );
1595
				match[2] = unquoted.slice( 0, excess );
1596
			}
1597
1598
			// Return only captures needed by the pseudo filter method (type and argument)
1599
			return match.slice( 0, 3 );
1600
		}
1601
	},
1602
1603
	filter: {
1604
1605
		"TAG": function( nodeNameSelector ) {
1606
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
1607
			return nodeNameSelector === "*" ?
1608
				function() { return true; } :
1609
				function( elem ) {
1610
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
1611
				};
1612
		},
1613
1614
		"CLASS": function( className ) {
1615
			var pattern = classCache[ className + " " ];
1616
1617
			return pattern ||
1618
				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
1619
				classCache( className, function( elem ) {
1620
					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );
1621
				});
1622
		},
1623
1624
		"ATTR": function( name, operator, check ) {
1625
			return function( elem ) {
1626
				var result = Sizzle.attr( elem, name );
1627
1628
				if ( result == null ) {
1629
					return operator === "!=";
1630
				}
1631
				if ( !operator ) {
1632
					return true;
1633
				}
1634
1635
				result += "";
1636
1637
				return operator === "=" ? result === check :
1638
					operator === "!=" ? result !== check :
1639
					operator === "^=" ? check && result.indexOf( check ) === 0 :
1640
					operator === "*=" ? check && result.indexOf( check ) > -1 :
1641
					operator === "$=" ? check && result.slice( -check.length ) === check :
1642
					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
1643
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
1644
					false;
1645
			};
1646
		},
1647
1648
		"CHILD": function( type, what, argument, first, last ) {
1649
			var simple = type.slice( 0, 3 ) !== "nth",
1650
				forward = type.slice( -4 ) !== "last",
1651
				ofType = what === "of-type";
1652
1653
			return first === 1 && last === 0 ?
1654
1655
				// Shortcut for :nth-*(n)
1656
				function( elem ) {
1657
					return !!elem.parentNode;
1658
				} :
1659
1660
				function( elem, context, xml ) {
1661
					var cache, outerCache, node, diff, nodeIndex, start,
1662
						dir = simple !== forward ? "nextSibling" : "previousSibling",
1663
						parent = elem.parentNode,
1664
						name = ofType && elem.nodeName.toLowerCase(),
1665
						useCache = !xml && !ofType;
1666
1667
					if ( parent ) {
1668
1669
						// :(first|last|only)-(child|of-type)
1670
						if ( simple ) {
1671
							while ( dir ) {
1672
								node = elem;
1673
								while ( (node = node[ dir ]) ) {
1674
									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
1675
										return false;
1676
									}
1677
								}
1678
								// Reverse direction for :only-* (if we haven't yet done so)
1679
								start = dir = type === "only" && !start && "nextSibling";
1680
							}
1681
							return true;
1682
						}
1683
1684
						start = [ forward ? parent.firstChild : parent.lastChild ];
1685
1686
						// non-xml :nth-child(...) stores cache data on `parent`
1687
						if ( forward && useCache ) {
1688
							// Seek `elem` from a previously-cached index
1689
							outerCache = parent[ expando ] || (parent[ expando ] = {});
1690
							cache = outerCache[ type ] || [];
1691
							nodeIndex = cache[0] === dirruns && cache[1];
1692
							diff = cache[0] === dirruns && cache[2];
1693
							node = nodeIndex && parent.childNodes[ nodeIndex ];
1694
1695
							while ( (node = ++nodeIndex && node && node[ dir ] ||
1696
1697
								// Fallback to seeking `elem` from the start
1698
								(diff = nodeIndex = 0) || start.pop()) ) {
1699
1700
								// When found, cache indexes on `parent` and break
1701
								if ( node.nodeType === 1 && ++diff && node === elem ) {
1702
									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
1703
									break;
1704
								}
1705
							}
1706
1707
						// Use previously-cached element index if available
1708
						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
1709
							diff = cache[1];
1710
1711
						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
1712
						} else {
1713
							// Use the same loop as above to seek `elem` from the start
1714
							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 1714 is not entered. Are you sure this can never be the case?
Loading history...
1715
								(diff = nodeIndex = 0) || start.pop()) ) {
1716
1717
								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
1718
									// Cache the index of each encountered element
1719
									if ( useCache ) {
1720
										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
1721
									}
1722
1723
									if ( node === elem ) {
1724
										break;
1725
									}
1726
								}
1727
							}
1728
						}
1729
1730
						// Incorporate the offset, then check against cycle size
1731
						diff -= last;
1732
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
1733
					}
1734
				};
1735
		},
1736
1737
		"PSEUDO": function( pseudo, argument ) {
1738
			// pseudo-class names are case-insensitive
1739
			// http://www.w3.org/TR/selectors/#pseudo-classes
1740
			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
1741
			// Remember that setFilters inherits from pseudos
1742
			var args,
1743
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
1744
					Sizzle.error( "unsupported pseudo: " + pseudo );
1745
1746
			// The user may use createPseudo to indicate that
1747
			// arguments are needed to create the filter function
1748
			// just as Sizzle does
1749
			if ( fn[ expando ] ) {
1750
				return fn( argument );
1751
			}
1752
1753
			// But maintain support for old signatures
1754
			if ( fn.length > 1 ) {
1755
				args = [ pseudo, pseudo, "", argument ];
1756
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
1757
					markFunction(function( seed, matches ) {
1758
						var idx,
1759
							matched = fn( seed, argument ),
1760
							i = matched.length;
1761
						while ( i-- ) {
1762
							idx = indexOf.call( seed, matched[i] );
1763
							seed[ idx ] = !( matches[ idx ] = matched[i] );
1764
						}
1765
					}) :
1766
					function( elem ) {
1767
						return fn( elem, 0, args );
1768
					};
1769
			}
1770
1771
			return fn;
1772
		}
1773
	},
1774
1775
	pseudos: {
1776
		// Potentially complex pseudos
1777
		"not": markFunction(function( selector ) {
1778
			// Trim the selector passed to compile
1779
			// to avoid treating leading and trailing
1780
			// spaces as combinators
1781
			var input = [],
1782
				results = [],
1783
				matcher = compile( selector.replace( rtrim, "$1" ) );
1784
1785
			return matcher[ expando ] ?
1786
				markFunction(function( seed, matches, context, xml ) {
1787
					var elem,
1788
						unmatched = matcher( seed, null, xml, [] ),
1789
						i = seed.length;
1790
1791
					// Match elements unmatched by `matcher`
1792
					while ( i-- ) {
1793
						if ( (elem = unmatched[i]) ) {
1794
							seed[i] = !(matches[i] = elem);
1795
						}
1796
					}
1797
				}) :
1798
				function( elem, context, xml ) {
1799
					input[0] = elem;
1800
					matcher( input, null, xml, results );
1801
					return !results.pop();
1802
				};
1803
		}),
1804
1805
		"has": markFunction(function( selector ) {
1806
			return function( elem ) {
1807
				return Sizzle( selector, elem ).length > 0;
1808
			};
1809
		}),
1810
1811
		"contains": markFunction(function( text ) {
1812
			return function( elem ) {
1813
				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
1814
			};
1815
		}),
1816
1817
		// "Whether an element is represented by a :lang() selector
1818
		// is based solely on the element's language value
1819
		// being equal to the identifier C,
1820
		// or beginning with the identifier C immediately followed by "-".
1821
		// The matching of C against the element's language value is performed case-insensitively.
1822
		// The identifier C does not have to be a valid language name."
1823
		// http://www.w3.org/TR/selectors/#lang-pseudo
1824
		"lang": markFunction( function( lang ) {
1825
			// lang value must be a valid identifier
1826
			if ( !ridentifier.test(lang || "") ) {
1827
				Sizzle.error( "unsupported lang: " + lang );
1828
			}
1829
			lang = lang.replace( runescape, funescape ).toLowerCase();
1830
			return function( elem ) {
1831
				var elemLang;
1832
				do {
1833
					if ( (elemLang = documentIsHTML ?
1834
						elem.lang :
1835
						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
1836
1837
						elemLang = elemLang.toLowerCase();
1838
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
1839
					}
1840
				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
1841
				return false;
1842
			};
1843
		}),
1844
1845
		// Miscellaneous
1846
		"target": function( elem ) {
1847
			var hash = window.location && window.location.hash;
1848
			return hash && hash.slice( 1 ) === elem.id;
1849
		},
1850
1851
		"root": function( elem ) {
1852
			return elem === docElem;
1853
		},
1854
1855
		"focus": function( elem ) {
1856
			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
1857
		},
1858
1859
		// Boolean properties
1860
		"enabled": function( elem ) {
1861
			return elem.disabled === false;
1862
		},
1863
1864
		"disabled": function( elem ) {
1865
			return elem.disabled === true;
1866
		},
1867
1868
		"checked": function( elem ) {
1869
			// In CSS3, :checked should return both checked and selected elements
1870
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
1871
			var nodeName = elem.nodeName.toLowerCase();
1872
			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
1873
		},
1874
1875
		"selected": function( elem ) {
1876
			// Accessing this property makes selected-by-default
1877
			// options in Safari work properly
1878
			if ( elem.parentNode ) {
1879
				elem.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to elem.parentNode.selectedIndex is not used.
Loading history...
1880
			}
1881
1882
			return elem.selected === true;
1883
		},
1884
1885
		// Contents
1886
		"empty": function( elem ) {
1887
			// http://www.w3.org/TR/selectors/#empty-pseudo
1888
			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
1889
			//   but not by others (comment: 8; processing instruction: 7; etc.)
1890
			// nodeType < 6 works because attributes (2) do not appear as children
1891
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
1892
				if ( elem.nodeType < 6 ) {
1893
					return false;
1894
				}
1895
			}
1896
			return true;
1897
		},
1898
1899
		"parent": function( elem ) {
1900
			return !Expr.pseudos["empty"]( elem );
1901
		},
1902
1903
		// Element/input types
1904
		"header": function( elem ) {
1905
			return rheader.test( elem.nodeName );
1906
		},
1907
1908
		"input": function( elem ) {
1909
			return rinputs.test( elem.nodeName );
1910
		},
1911
1912
		"button": function( elem ) {
1913
			var name = elem.nodeName.toLowerCase();
1914
			return name === "input" && elem.type === "button" || name === "button";
1915
		},
1916
1917
		"text": function( elem ) {
1918
			var attr;
1919
			return elem.nodeName.toLowerCase() === "input" &&
1920
				elem.type === "text" &&
1921
1922
				// Support: IE<8
1923
				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
1924
				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
1925
		},
1926
1927
		// Position-in-collection
1928
		"first": createPositionalPseudo(function() {
1929
			return [ 0 ];
1930
		}),
1931
1932
		"last": createPositionalPseudo(function( matchIndexes, length ) {
1933
			return [ length - 1 ];
1934
		}),
1935
1936
		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
1937
			return [ argument < 0 ? argument + length : argument ];
1938
		}),
1939
1940
		"even": createPositionalPseudo(function( matchIndexes, length ) {
1941
			var i = 0;
1942
			for ( ; i < length; i += 2 ) {
1943
				matchIndexes.push( i );
1944
			}
1945
			return matchIndexes;
1946
		}),
1947
1948
		"odd": createPositionalPseudo(function( matchIndexes, length ) {
1949
			var i = 1;
1950
			for ( ; i < length; i += 2 ) {
1951
				matchIndexes.push( i );
1952
			}
1953
			return matchIndexes;
1954
		}),
1955
1956
		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1957
			var i = argument < 0 ? argument + length : argument;
1958
			for ( ; --i >= 0; ) {
1959
				matchIndexes.push( i );
1960
			}
1961
			return matchIndexes;
1962
		}),
1963
1964
		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
1965
			var i = argument < 0 ? argument + length : argument;
1966
			for ( ; ++i < length; ) {
1967
				matchIndexes.push( i );
1968
			}
1969
			return matchIndexes;
1970
		})
1971
	}
1972
};
1973
1974
Expr.pseudos["nth"] = Expr.pseudos["eq"];
1975
1976
// Add button/input type pseudos
1977
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
1978
	Expr.pseudos[ i ] = createInputPseudo( i );
1979
}
1980
for ( i in { submit: true, reset: true } ) {
1981
	Expr.pseudos[ i ] = createButtonPseudo( i );
1982
}
1983
1984
// Easy API for creating new setFilters
1985
function setFilters() {}
1986
setFilters.prototype = Expr.filters = Expr.pseudos;
1987
Expr.setFilters = new setFilters();
0 ignored issues
show
Coding Style Best Practice introduced by
By convention, constructors like setFilters should be capitalized.
Loading history...
1988
1989
tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
1990
	var matched, match, tokens, type,
1991
		soFar, groups, preFilters,
1992
		cached = tokenCache[ selector + " " ];
1993
1994
	if ( cached ) {
1995
		return parseOnly ? 0 : cached.slice( 0 );
1996
	}
1997
1998
	soFar = selector;
1999
	groups = [];
2000
	preFilters = Expr.preFilter;
2001
2002
	while ( soFar ) {
2003
2004
		// Comma and first run
2005
		if ( !matched || (match = rcomma.exec( soFar )) ) {
2006
			if ( match ) {
2007
				// Don't consume trailing commas as valid
2008
				soFar = soFar.slice( match[0].length ) || soFar;
2009
			}
2010
			groups.push( (tokens = []) );
2011
		}
2012
2013
		matched = false;
2014
2015
		// Combinators
2016
		if ( (match = rcombinators.exec( soFar )) ) {
2017
			matched = match.shift();
2018
			tokens.push({
2019
				value: matched,
2020
				// Cast descendant combinators to space
2021
				type: match[0].replace( rtrim, " " )
2022
			});
2023
			soFar = soFar.slice( matched.length );
2024
		}
2025
2026
		// Filters
2027
		for ( type in Expr.filter ) {
2028
			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
2029
				(match = preFilters[ type ]( match ))) ) {
2030
				matched = match.shift();
2031
				tokens.push({
2032
					value: matched,
2033
					type: type,
2034
					matches: match
2035
				});
2036
				soFar = soFar.slice( matched.length );
2037
			}
2038
		}
2039
2040
		if ( !matched ) {
2041
			break;
2042
		}
2043
	}
2044
2045
	// Return the length of the invalid excess
2046
	// if we're just parsing
2047
	// Otherwise, throw an error or return tokens
2048
	return parseOnly ?
2049
		soFar.length :
2050
		soFar ?
2051
			Sizzle.error( selector ) :
2052
			// Cache the tokens
2053
			tokenCache( selector, groups ).slice( 0 );
2054
};
2055
2056
function toSelector( tokens ) {
2057
	var i = 0,
2058
		len = tokens.length,
2059
		selector = "";
2060
	for ( ; i < len; i++ ) {
2061
		selector += tokens[i].value;
2062
	}
2063
	return selector;
2064
}
2065
2066
function addCombinator( matcher, combinator, base ) {
2067
	var dir = combinator.dir,
2068
		checkNonElements = base && dir === "parentNode",
2069
		doneName = done++;
2070
2071
	return combinator.first ?
2072
		// Check against closest ancestor/preceding element
2073
		function( elem, context, xml ) {
2074
			while ( (elem = elem[ dir ]) ) {
2075
				if ( elem.nodeType === 1 || checkNonElements ) {
2076
					return matcher( elem, context, xml );
2077
				}
2078
			}
2079
		} :
2080
2081
		// Check against all ancestor/preceding elements
2082
		function( elem, context, xml ) {
2083
			var oldCache, outerCache,
2084
				newCache = [ dirruns, doneName ];
2085
2086
			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
2087
			if ( xml ) {
2088
				while ( (elem = elem[ dir ]) ) {
2089
					if ( elem.nodeType === 1 || checkNonElements ) {
2090
						if ( matcher( elem, context, xml ) ) {
2091
							return true;
2092
						}
2093
					}
2094
				}
2095
			} else {
2096
				while ( (elem = elem[ dir ]) ) {
2097
					if ( elem.nodeType === 1 || checkNonElements ) {
2098
						outerCache = elem[ expando ] || (elem[ expando ] = {});
2099
						if ( (oldCache = outerCache[ dir ]) &&
2100
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
2101
2102
							// Assign to newCache so results back-propagate to previous elements
2103
							return (newCache[ 2 ] = oldCache[ 2 ]);
2104
						} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2105
							// Reuse newcache so results back-propagate to previous elements
2106
							outerCache[ dir ] = newCache;
2107
2108
							// A match means we're done; a fail means we have to keep checking
2109
							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
2110
								return true;
2111
							}
2112
						}
2113
					}
2114
				}
2115
			}
2116
		};
2117
}
2118
2119
function elementMatcher( matchers ) {
2120
	return matchers.length > 1 ?
2121
		function( elem, context, xml ) {
2122
			var i = matchers.length;
2123
			while ( i-- ) {
2124
				if ( !matchers[i]( elem, context, xml ) ) {
2125
					return false;
2126
				}
2127
			}
2128
			return true;
2129
		} :
2130
		matchers[0];
2131
}
2132
2133
function multipleContexts( selector, contexts, results ) {
2134
	var i = 0,
2135
		len = contexts.length;
2136
	for ( ; i < len; i++ ) {
2137
		Sizzle( selector, contexts[i], results );
2138
	}
2139
	return results;
2140
}
2141
2142
function condense( unmatched, map, filter, context, xml ) {
2143
	var elem,
2144
		newUnmatched = [],
2145
		i = 0,
2146
		len = unmatched.length,
2147
		mapped = map != null;
2148
2149
	for ( ; i < len; i++ ) {
2150
		if ( (elem = unmatched[i]) ) {
2151
			if ( !filter || filter( elem, context, xml ) ) {
2152
				newUnmatched.push( elem );
2153
				if ( mapped ) {
2154
					map.push( i );
2155
				}
2156
			}
2157
		}
2158
	}
2159
2160
	return newUnmatched;
2161
}
2162
2163
function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
2164
	if ( postFilter && !postFilter[ expando ] ) {
2165
		postFilter = setMatcher( postFilter );
2166
	}
2167
	if ( postFinder && !postFinder[ expando ] ) {
2168
		postFinder = setMatcher( postFinder, postSelector );
2169
	}
2170
	return markFunction(function( seed, results, context, xml ) {
2171
		var temp, i, elem,
2172
			preMap = [],
2173
			postMap = [],
2174
			preexisting = results.length,
2175
2176
			// Get initial elements from seed or context
2177
			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
2178
2179
			// Prefilter to get matcher input, preserving a map for seed-results synchronization
2180
			matcherIn = preFilter && ( seed || !selector ) ?
2181
				condense( elems, preMap, preFilter, context, xml ) :
2182
				elems,
2183
2184
			matcherOut = matcher ?
2185
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
2186
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
2187
2188
					// ...intermediate processing is necessary
2189
					[] :
2190
2191
					// ...otherwise use results directly
2192
					results :
2193
				matcherIn;
2194
2195
		// Find primary matches
2196
		if ( matcher ) {
2197
			matcher( matcherIn, matcherOut, context, xml );
2198
		}
2199
2200
		// Apply postFilter
2201
		if ( postFilter ) {
2202
			temp = condense( matcherOut, postMap );
2203
			postFilter( temp, [], context, xml );
2204
2205
			// Un-match failing elements by moving them back to matcherIn
2206
			i = temp.length;
2207
			while ( i-- ) {
2208
				if ( (elem = temp[i]) ) {
2209
					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
2210
				}
2211
			}
2212
		}
2213
2214
		if ( seed ) {
2215
			if ( postFinder || preFilter ) {
2216
				if ( postFinder ) {
2217
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
2218
					temp = [];
2219
					i = matcherOut.length;
2220
					while ( i-- ) {
2221
						if ( (elem = matcherOut[i]) ) {
2222
							// Restore matcherIn since elem is not yet a final match
2223
							temp.push( (matcherIn[i] = elem) );
2224
						}
2225
					}
2226
					postFinder( null, (matcherOut = []), temp, xml );
2227
				}
2228
2229
				// Move matched elements from seed to results to keep them synchronized
2230
				i = matcherOut.length;
2231
				while ( i-- ) {
2232
					if ( (elem = matcherOut[i]) &&
2233
						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
2234
2235
						seed[temp] = !(results[temp] = elem);
2236
					}
2237
				}
2238
			}
2239
2240
		// Add elements to results, through postFinder if defined
2241
		} else {
2242
			matcherOut = condense(
2243
				matcherOut === results ?
2244
					matcherOut.splice( preexisting, matcherOut.length ) :
2245
					matcherOut
2246
			);
2247
			if ( postFinder ) {
2248
				postFinder( null, results, matcherOut, xml );
2249
			} else {
2250
				push.apply( results, matcherOut );
2251
			}
2252
		}
2253
	});
2254
}
2255
2256
function matcherFromTokens( tokens ) {
2257
	var checkContext, matcher, j,
2258
		len = tokens.length,
2259
		leadingRelative = Expr.relative[ tokens[0].type ],
2260
		implicitRelative = leadingRelative || Expr.relative[" "],
2261
		i = leadingRelative ? 1 : 0,
2262
2263
		// The foundational matcher ensures that elements are reachable from top-level context(s)
2264
		matchContext = addCombinator( function( elem ) {
2265
			return elem === checkContext;
2266
		}, implicitRelative, true ),
2267
		matchAnyContext = addCombinator( function( elem ) {
2268
			return indexOf.call( checkContext, elem ) > -1;
2269
		}, implicitRelative, true ),
2270
		matchers = [ function( elem, context, xml ) {
2271
			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
2272
				(checkContext = context).nodeType ?
2273
					matchContext( elem, context, xml ) :
2274
					matchAnyContext( elem, context, xml ) );
2275
		} ];
2276
2277
	for ( ; i < len; i++ ) {
2278
		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
2279
			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
2280
		} else {
2281
			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
2282
2283
			// Return special upon seeing a positional matcher
2284
			if ( matcher[ expando ] ) {
2285
				// Find the next relative operator (if any) for proper handling
2286
				j = ++i;
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable i here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
2287
				for ( ; j < len; j++ ) {
2288
					if ( Expr.relative[ tokens[j].type ] ) {
2289
						break;
2290
					}
2291
				}
2292
				return setMatcher(
2293
					i > 1 && elementMatcher( matchers ),
2294
					i > 1 && toSelector(
2295
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
2296
						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
2297
					).replace( rtrim, "$1" ),
2298
					matcher,
2299
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
2300
					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
2301
					j < len && toSelector( tokens )
2302
				);
2303
			}
2304
			matchers.push( matcher );
2305
		}
2306
	}
2307
2308
	return elementMatcher( matchers );
2309
}
2310
2311
function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
2312
	var bySet = setMatchers.length > 0,
2313
		byElement = elementMatchers.length > 0,
2314
		superMatcher = function( seed, context, xml, results, outermost ) {
2315
			var elem, j, matcher,
2316
				matchedCount = 0,
2317
				i = "0",
2318
				unmatched = seed && [],
2319
				setMatched = [],
2320
				contextBackup = outermostContext,
2321
				// We must always have either seed elements or outermost context
2322
				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
2323
				// Use integer dirruns iff this is the outermost matcher
2324
				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
2325
				len = elems.length;
2326
2327
			if ( outermost ) {
2328
				outermostContext = context !== document && context;
2329
			}
2330
2331
			// Add elements passing elementMatchers directly to results
2332
			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
2333
			// Support: IE<9, Safari
2334
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
2335
			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
2336
				if ( byElement && elem ) {
2337
					j = 0;
2338
					while ( (matcher = elementMatchers[j++]) ) {
2339
						if ( matcher( elem, context, xml ) ) {
2340
							results.push( elem );
2341
							break;
2342
						}
2343
					}
2344
					if ( outermost ) {
2345
						dirruns = dirrunsUnique;
2346
					}
2347
				}
2348
2349
				// Track unmatched elements for set filters
2350
				if ( bySet ) {
2351
					// They will have gone through all possible matchers
2352
					if ( (elem = !matcher && elem) ) {
2353
						matchedCount--;
2354
					}
2355
2356
					// Lengthen the array for every element, matched or not
2357
					if ( seed ) {
2358
						unmatched.push( elem );
2359
					}
2360
				}
2361
			}
2362
2363
			// Apply set filters to unmatched elements
2364
			matchedCount += i;
2365
			if ( bySet && i !== matchedCount ) {
2366
				j = 0;
2367
				while ( (matcher = setMatchers[j++]) ) {
2368
					matcher( unmatched, setMatched, context, xml );
2369
				}
2370
2371
				if ( seed ) {
2372
					// Reintegrate element matches to eliminate the need for sorting
2373
					if ( matchedCount > 0 ) {
2374
						while ( i-- ) {
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable i here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
2375
							if ( !(unmatched[i] || setMatched[i]) ) {
2376
								setMatched[i] = pop.call( results );
2377
							}
2378
						}
2379
					}
2380
2381
					// Discard index placeholder values to get only actual matches
2382
					setMatched = condense( setMatched );
2383
				}
2384
2385
				// Add matches to results
2386
				push.apply( results, setMatched );
2387
2388
				// Seedless set matches succeeding multiple successful matchers stipulate sorting
2389
				if ( outermost && !seed && setMatched.length > 0 &&
2390
					( matchedCount + setMatchers.length ) > 1 ) {
2391
2392
					Sizzle.uniqueSort( results );
2393
				}
2394
			}
2395
2396
			// Override manipulation of globals by nested matchers
2397
			if ( outermost ) {
2398
				dirruns = dirrunsUnique;
2399
				outermostContext = contextBackup;
2400
			}
2401
2402
			return unmatched;
2403
		};
2404
2405
	return bySet ?
2406
		markFunction( superMatcher ) :
2407
		superMatcher;
2408
}
2409
2410
compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
2411
	var i,
2412
		setMatchers = [],
2413
		elementMatchers = [],
2414
		cached = compilerCache[ selector + " " ];
2415
2416
	if ( !cached ) {
2417
		// Generate a function of recursive functions that can be used to check each element
2418
		if ( !match ) {
2419
			match = tokenize( selector );
2420
		}
2421
		i = match.length;
2422
		while ( i-- ) {
2423
			cached = matcherFromTokens( match[i] );
2424
			if ( cached[ expando ] ) {
2425
				setMatchers.push( cached );
2426
			} else {
2427
				elementMatchers.push( cached );
2428
			}
2429
		}
2430
2431
		// Cache the compiled function
2432
		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
2433
2434
		// Save selector and tokenization
2435
		cached.selector = selector;
2436
	}
2437
	return cached;
2438
};
2439
2440
/**
2441
 * A low-level selection function that works with Sizzle's compiled
2442
 *  selector functions
2443
 * @param {String|Function} selector A selector or a pre-compiled
2444
 *  selector function built with Sizzle.compile
2445
 * @param {Element} context
2446
 * @param {Array} [results]
2447
 * @param {Array} [seed] A set of elements to match against
2448
 */
2449
select = Sizzle.select = function( selector, context, results, seed ) {
2450
	var i, tokens, token, type, find,
2451
		compiled = typeof selector === "function" && selector,
2452
		match = !seed && tokenize( (selector = compiled.selector || selector) );
2453
2454
	results = results || [];
2455
2456
	// Try to minimize operations if there is no seed and only one group
2457
	if ( match.length === 1 ) {
2458
2459
		// Take a shortcut and set the context if the root selector is an ID
2460
		tokens = match[0] = match[0].slice( 0 );
2461
		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
2462
				support.getById && context.nodeType === 9 && documentIsHTML &&
2463
				Expr.relative[ tokens[1].type ] ) {
2464
2465
			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
2466
			if ( !context ) {
2467
				return results;
2468
2469
			// Precompiled matchers will still verify ancestry, so step up a level
2470
			} else if ( compiled ) {
2471
				context = context.parentNode;
2472
			}
2473
2474
			selector = selector.slice( tokens.shift().value.length );
2475
		}
2476
2477
		// Fetch a seed set for right-to-left matching
2478
		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
2479
		while ( i-- ) {
2480
			token = tokens[i];
2481
2482
			// Abort if we hit a combinator
2483
			if ( Expr.relative[ (type = token.type) ] ) {
2484
				break;
2485
			}
2486
			if ( (find = Expr.find[ type ]) ) {
2487
				// Search, expanding context for leading sibling combinators
2488
				if ( (seed = find(
2489
					token.matches[0].replace( runescape, funescape ),
2490
					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
2491
				)) ) {
2492
2493
					// If seed is empty or no tokens remain, we can return early
2494
					tokens.splice( i, 1 );
2495
					selector = seed.length && toSelector( tokens );
2496
					if ( !selector ) {
2497
						push.apply( results, seed );
2498
						return results;
2499
					}
2500
2501
					break;
2502
				}
2503
			}
2504
		}
2505
	}
2506
2507
	// Compile and execute a filtering function if one is not provided
2508
	// Provide `match` to avoid retokenization if we modified the selector above
2509
	( compiled || compile( selector, match ) )(
2510
		seed,
2511
		context,
2512
		!documentIsHTML,
2513
		results,
2514
		rsibling.test( selector ) && testContext( context.parentNode ) || context
2515
	);
2516
	return results;
2517
};
2518
2519
// One-time assignments
2520
2521
// Sort stability
2522
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
2523
2524
// Support: Chrome<14
2525
// Always assume duplicates if they aren't passed to the comparison function
2526
support.detectDuplicates = !!hasDuplicate;
2527
2528
// Initialize against the default document
2529
setDocument();
2530
2531
// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
2532
// Detached nodes confoundingly follow *each other*
2533
support.sortDetached = assert(function( div1 ) {
2534
	// Should return 1, but returns 4 (following)
2535
	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
2536
});
2537
2538
// Support: IE<8
2539
// Prevent attribute/property "interpolation"
2540
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
2541
if ( !assert(function( div ) {
2542
	div.innerHTML = "<a href='#'></a>";
2543
	return div.firstChild.getAttribute("href") === "#" ;
2544
}) ) {
2545
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
2546
		if ( !isXML ) {
2547
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
2548
		}
2549
	});
2550
}
2551
2552
// Support: IE<9
2553
// Use defaultValue in place of getAttribute("value")
2554
if ( !support.attributes || !assert(function( div ) {
2555
	div.innerHTML = "<input/>";
2556
	div.firstChild.setAttribute( "value", "" );
2557
	return div.firstChild.getAttribute( "value" ) === "";
2558
}) ) {
2559
	addHandle( "value", function( elem, name, isXML ) {
2560
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
2561
			return elem.defaultValue;
2562
		}
2563
	});
2564
}
2565
2566
// Support: IE<9
2567
// Use getAttributeNode to fetch booleans when getAttribute lies
2568
if ( !assert(function( div ) {
2569
	return div.getAttribute("disabled") == null;
2570
}) ) {
2571
	addHandle( booleans, function( elem, name, isXML ) {
2572
		var val;
2573
		if ( !isXML ) {
2574
			return elem[ name ] === true ? name.toLowerCase() :
2575
					(val = elem.getAttributeNode( name )) && val.specified ?
2576
					val.value :
2577
				null;
2578
		}
2579
	});
2580
}
2581
2582
return Sizzle;
2583
2584
})( window );
2585
2586
2587
2588
jQuery.find = Sizzle;
2589
jQuery.expr = Sizzle.selectors;
2590
jQuery.expr[":"] = jQuery.expr.pseudos;
2591
jQuery.unique = Sizzle.uniqueSort;
2592
jQuery.text = Sizzle.getText;
2593
jQuery.isXMLDoc = Sizzle.isXML;
2594
jQuery.contains = Sizzle.contains;
2595
2596
2597
2598
var rneedsContext = jQuery.expr.match.needsContext;
2599
2600
var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);
2601
2602
2603
2604
var risSimple = /^.[^:#\[\.,]*$/;
2605
2606
// Implement the identical functionality for filter and not
2607 View Code Duplication
function winnow( elements, qualifier, not ) {
2608
	if ( jQuery.isFunction( qualifier ) ) {
2609
		return jQuery.grep( elements, function( elem, i ) {
2610
			/* jshint -W018 */
2611
			return !!qualifier.call( elem, i, elem ) !== not;
2612
		});
2613
2614
	}
2615
2616
	if ( qualifier.nodeType ) {
2617
		return jQuery.grep( elements, function( elem ) {
2618
			return ( elem === qualifier ) !== not;
2619
		});
2620
2621
	}
2622
2623
	if ( typeof qualifier === "string" ) {
2624
		if ( risSimple.test( qualifier ) ) {
2625
			return jQuery.filter( qualifier, elements, not );
2626
		}
2627
2628
		qualifier = jQuery.filter( qualifier, elements );
2629
	}
2630
2631
	return jQuery.grep( elements, function( elem ) {
2632
		return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
2633
	});
2634
}
2635
2636 View Code Duplication
jQuery.filter = function( expr, elems, not ) {
2637
	var elem = elems[ 0 ];
2638
2639
	if ( not ) {
2640
		expr = ":not(" + expr + ")";
2641
	}
2642
2643
	return elems.length === 1 && elem.nodeType === 1 ?
2644
		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
2645
		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
2646
			return elem.nodeType === 1;
2647
		}));
2648
};
2649
2650
jQuery.fn.extend({
2651 View Code Duplication
	find: function( selector ) {
2652
		var i,
2653
			len = this.length,
2654
			ret = [],
2655
			self = this;
2656
2657
		if ( typeof selector !== "string" ) {
2658
			return this.pushStack( jQuery( selector ).filter(function() {
2659
				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 2659. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
2660
					if ( jQuery.contains( self[ i ], this ) ) {
2661
						return true;
2662
					}
2663
				}
2664
			}) );
2665
		}
2666
2667
		for ( i = 0; i < len; i++ ) {
2668
			jQuery.find( selector, self[ i ], ret );
2669
		}
2670
2671
		// Needed because $( selector, context ) becomes $( context ).find( selector )
2672
		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
2673
		ret.selector = this.selector ? this.selector + " " + selector : selector;
2674
		return ret;
2675
	},
2676
	filter: function( selector ) {
2677
		return this.pushStack( winnow(this, selector || [], false) );
2678
	},
2679
	not: function( selector ) {
2680
		return this.pushStack( winnow(this, selector || [], true) );
2681
	},
2682
	is: function( selector ) {
2683
		return !!winnow(
2684
			this,
2685
2686
			// If this is a positional/relative selector, check membership in the returned set
2687
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
2688
			typeof selector === "string" && rneedsContext.test( selector ) ?
2689
				jQuery( selector ) :
2690
				selector || [],
2691
			false
2692
		).length;
2693
	}
2694
});
2695
2696
2697
// Initialize a jQuery object
2698
2699
2700
// A central reference to the root jQuery(document)
2701
var rootjQuery,
2702
2703
	// A simple way to check for HTML strings
2704
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
2705
	// Strict HTML recognition (#11290: must start with <)
2706
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
2707
2708 View Code Duplication
	init = jQuery.fn.init = function( selector, context ) {
2709
		var match, elem;
2710
2711
		// HANDLE: $(""), $(null), $(undefined), $(false)
2712
		if ( !selector ) {
2713
			return this;
2714
		}
2715
2716
		// Handle HTML strings
2717
		if ( typeof selector === "string" ) {
2718
			if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {
2719
				// Assume that strings that start and end with <> are HTML and skip the regex check
2720
				match = [ null, selector, null ];
2721
2722
			} else {
2723
				match = rquickExpr.exec( selector );
2724
			}
2725
2726
			// Match html or make sure no context is specified for #id
2727
			if ( match && (match[1] || !context) ) {
2728
2729
				// HANDLE: $(html) -> $(array)
2730
				if ( match[1] ) {
2731
					context = context instanceof jQuery ? context[0] : context;
2732
2733
					// scripts is true for back-compat
2734
					// Intentionally let the error be thrown if parseHTML is not present
2735
					jQuery.merge( this, jQuery.parseHTML(
2736
						match[1],
2737
						context && context.nodeType ? context.ownerDocument || context : document,
2738
						true
2739
					) );
2740
2741
					// HANDLE: $(html, props)
2742
					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
2743
						for ( match in context ) {
2744
							// Properties of context are called as methods if possible
2745
							if ( jQuery.isFunction( this[ match ] ) ) {
2746
								this[ match ]( context[ match ] );
2747
2748
							// ...and otherwise set as attributes
2749
							} else {
2750
								this.attr( match, context[ match ] );
2751
							}
2752
						}
2753
					}
2754
2755
					return this;
2756
2757
				// HANDLE: $(#id)
2758
				} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
2759
					elem = document.getElementById( match[2] );
2760
2761
					// Check parentNode to catch when Blackberry 4.6 returns
2762
					// nodes that are no longer in the document #6963
2763
					if ( elem && elem.parentNode ) {
2764
						// Inject the element directly into the jQuery object
2765
						this.length = 1;
2766
						this[0] = elem;
2767
					}
2768
2769
					this.context = document;
2770
					this.selector = selector;
2771
					return this;
2772
				}
2773
2774
			// HANDLE: $(expr, $(...))
2775
			} else if ( !context || context.jquery ) {
2776
				return ( context || rootjQuery ).find( selector );
2777
2778
			// HANDLE: $(expr, context)
2779
			// (which is just equivalent to: $(context).find(expr)
2780
			} else {
2781
				return this.constructor( context ).find( selector );
2782
			}
2783
2784
		// HANDLE: $(DOMElement)
2785
		} else if ( selector.nodeType ) {
2786
			this.context = this[0] = selector;
2787
			this.length = 1;
2788
			return this;
2789
2790
		// HANDLE: $(function)
2791
		// Shortcut for document ready
2792
		} else if ( jQuery.isFunction( selector ) ) {
2793
			return typeof rootjQuery.ready !== "undefined" ?
2794
				rootjQuery.ready( selector ) :
2795
				// Execute immediately if ready is not present
2796
				selector( jQuery );
2797
		}
2798
2799
		if ( selector.selector !== undefined ) {
2800
			this.selector = selector.selector;
2801
			this.context = selector.context;
2802
		}
2803
2804
		return jQuery.makeArray( selector, this );
2805
	};
2806
2807
// Give the init function the jQuery prototype for later instantiation
2808
init.prototype = jQuery.fn;
2809
2810
// Initialize central reference
2811
rootjQuery = jQuery( document );
2812
2813
2814
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
2815
	// methods guaranteed to produce a unique set when starting from a unique set
2816
	guaranteedUnique = {
2817
		children: true,
2818
		contents: true,
2819
		next: true,
2820
		prev: true
2821
	};
2822
2823
jQuery.extend({
2824
	dir: function( elem, dir, until ) {
2825
		var matched = [],
2826
			truncate = until !== undefined;
2827
2828
		while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {
2829
			if ( elem.nodeType === 1 ) {
2830
				if ( truncate && jQuery( elem ).is( until ) ) {
2831
					break;
2832
				}
2833
				matched.push( elem );
2834
			}
2835
		}
2836
		return matched;
2837
	},
2838
2839
	sibling: function( n, elem ) {
2840
		var matched = [];
2841
2842
		for ( ; n; n = n.nextSibling ) {
2843
			if ( n.nodeType === 1 && n !== elem ) {
2844
				matched.push( n );
2845
			}
2846
		}
2847
2848
		return matched;
2849
	}
2850
});
2851
2852
jQuery.fn.extend({
2853
	has: function( target ) {
2854
		var targets = jQuery( target, this ),
2855
			l = targets.length;
2856
2857
		return this.filter(function() {
2858
			var i = 0;
2859
			for ( ; i < l; i++ ) {
2860
				if ( jQuery.contains( this, targets[i] ) ) {
2861
					return true;
2862
				}
2863
			}
2864
		});
2865
	},
2866
2867
	closest: function( selectors, context ) {
2868
		var cur,
2869
			i = 0,
2870
			l = this.length,
2871
			matched = [],
2872
			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
2873
				jQuery( selectors, context || this.context ) :
2874
				0;
2875
2876
		for ( ; i < l; i++ ) {
2877
			for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
2878
				// Always skip document fragments
2879
				if ( cur.nodeType < 11 && (pos ?
2880
					pos.index(cur) > -1 :
2881
2882
					// Don't pass non-elements to Sizzle
2883
					cur.nodeType === 1 &&
2884
						jQuery.find.matchesSelector(cur, selectors)) ) {
2885
2886
					matched.push( cur );
2887
					break;
2888
				}
2889
			}
2890
		}
2891
2892
		return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );
2893
	},
2894
2895
	// Determine the position of an element within
2896
	// the matched set of elements
2897
	index: function( elem ) {
2898
2899
		// No argument, return index in parent
2900
		if ( !elem ) {
2901
			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
2902
		}
2903
2904
		// index in selector
2905
		if ( typeof elem === "string" ) {
2906
			return indexOf.call( jQuery( elem ), this[ 0 ] );
2907
		}
2908
2909
		// Locate the position of the desired element
2910
		return indexOf.call( this,
2911
2912
			// If it receives a jQuery object, the first element is used
2913
			elem.jquery ? elem[ 0 ] : elem
2914
		);
2915
	},
2916
2917
	add: function( selector, context ) {
2918
		return this.pushStack(
2919
			jQuery.unique(
2920
				jQuery.merge( this.get(), jQuery( selector, context ) )
2921
			)
2922
		);
2923
	},
2924
2925
	addBack: function( selector ) {
2926
		return this.add( selector == null ?
2927
			this.prevObject : this.prevObject.filter(selector)
2928
		);
2929
	}
2930
});
2931
2932
function sibling( cur, dir ) {
2933
	while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}
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...
2934
	return cur;
2935
}
2936
2937
jQuery.each({
2938
	parent: function( elem ) {
2939
		var parent = elem.parentNode;
2940
		return parent && parent.nodeType !== 11 ? parent : null;
2941
	},
2942
	parents: function( elem ) {
2943
		return jQuery.dir( elem, "parentNode" );
2944
	},
2945
	parentsUntil: function( elem, i, until ) {
2946
		return jQuery.dir( elem, "parentNode", until );
2947
	},
2948
	next: function( elem ) {
2949
		return sibling( elem, "nextSibling" );
2950
	},
2951
	prev: function( elem ) {
2952
		return sibling( elem, "previousSibling" );
2953
	},
2954
	nextAll: function( elem ) {
2955
		return jQuery.dir( elem, "nextSibling" );
2956
	},
2957
	prevAll: function( elem ) {
2958
		return jQuery.dir( elem, "previousSibling" );
2959
	},
2960
	nextUntil: function( elem, i, until ) {
2961
		return jQuery.dir( elem, "nextSibling", until );
2962
	},
2963
	prevUntil: function( elem, i, until ) {
2964
		return jQuery.dir( elem, "previousSibling", until );
2965
	},
2966
	siblings: function( elem ) {
2967
		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
2968
	},
2969
	children: function( elem ) {
2970
		return jQuery.sibling( elem.firstChild );
2971
	},
2972
	contents: function( elem ) {
2973
		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
2974
	}
2975
}, function( name, fn ) {
2976
	jQuery.fn[ name ] = function( until, selector ) {
2977
		var matched = jQuery.map( this, fn, until );
2978
2979
		if ( name.slice( -5 ) !== "Until" ) {
2980
			selector = until;
2981
		}
2982
2983
		if ( selector && typeof selector === "string" ) {
2984
			matched = jQuery.filter( selector, matched );
2985
		}
2986
2987
		if ( this.length > 1 ) {
2988
			// Remove duplicates
2989
			if ( !guaranteedUnique[ name ] ) {
2990
				jQuery.unique( matched );
2991
			}
2992
2993
			// Reverse order for parents* and prev-derivatives
2994
			if ( rparentsprev.test( name ) ) {
2995
				matched.reverse();
2996
			}
2997
		}
2998
2999
		return this.pushStack( matched );
3000
	};
3001
});
3002
var rnotwhite = (/\S+/g);
3003
3004
3005
3006
// String to Object options format cache
3007
var optionsCache = {};
3008
3009
// Convert String-formatted options into Object-formatted ones and store in cache
3010
function createOptions( options ) {
3011
	var object = optionsCache[ options ] = {};
3012
	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
3013
		object[ flag ] = true;
3014
	});
3015
	return object;
3016
}
3017
3018
/*
3019
 * Create a callback list using the following parameters:
3020
 *
3021
 *	options: an optional list of space-separated options that will change how
3022
 *			the callback list behaves or a more traditional option object
3023
 *
3024
 * By default a callback list will act like an event callback list and can be
3025
 * "fired" multiple times.
3026
 *
3027
 * Possible options:
3028
 *
3029
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
3030
 *
3031
 *	memory:			will keep track of previous values and will call any callback added
3032
 *					after the list has been fired right away with the latest "memorized"
3033
 *					values (like a Deferred)
3034
 *
3035
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
3036
 *
3037
 *	stopOnFalse:	interrupt callings when a callback returns false
3038
 *
3039
 */
3040 View Code Duplication
jQuery.Callbacks = function( options ) {
3041
3042
	// Convert options from String-formatted to Object-formatted if needed
3043
	// (we check in cache first)
3044
	options = typeof options === "string" ?
3045
		( optionsCache[ options ] || createOptions( options ) ) :
3046
		jQuery.extend( {}, options );
3047
3048
	var // Last fire value (for non-forgettable lists)
3049
		memory,
3050
		// Flag to know if list was already fired
3051
		fired,
3052
		// Flag to know if list is currently firing
3053
		firing,
3054
		// First callback to fire (used internally by add and fireWith)
3055
		firingStart,
3056
		// End of the loop when firing
3057
		firingLength,
3058
		// Index of currently firing callback (modified by remove if needed)
3059
		firingIndex,
3060
		// Actual callback list
3061
		list = [],
3062
		// Stack of fire calls for repeatable lists
3063
		stack = !options.once && [],
3064
		// Fire callbacks
3065
		fire = function( data ) {
3066
			memory = options.memory && data;
3067
			fired = true;
3068
			firingIndex = firingStart || 0;
3069
			firingStart = 0;
3070
			firingLength = list.length;
3071
			firing = true;
3072
			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 3072. Only the value of the last iteration will be visible in this function if it is called after the loop.
Loading history...
3073
				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
3074
					memory = false; // To prevent further calls using add
3075
					break;
3076
				}
3077
			}
3078
			firing = false;
3079
			if ( list ) {
3080
				if ( stack ) {
3081
					if ( stack.length ) {
3082
						fire( stack.shift() );
3083
					}
3084
				} else if ( memory ) {
3085
					list = [];
3086
				} else {
3087
					self.disable();
3088
				}
3089
			}
3090
		},
3091
		// Actual Callbacks object
3092
		self = {
3093
			// Add a callback or a collection of callbacks to the list
3094
			add: function() {
3095
				if ( list ) {
3096
					// First, we save the current length
3097
					var start = list.length;
3098
					(function add( args ) {
3099
						jQuery.each( args, function( _, arg ) {
3100
							var type = jQuery.type( arg );
3101
							if ( type === "function" ) {
3102
								if ( !options.unique || !self.has( arg ) ) {
3103
									list.push( arg );
3104
								}
3105
							} else if ( arg && arg.length && type !== "string" ) {
3106
								// Inspect recursively
3107
								add( arg );
3108
							}
3109
						});
3110
					})( arguments );
3111
					// Do we need to add the callbacks to the
3112
					// current firing batch?
3113
					if ( firing ) {
3114
						firingLength = list.length;
3115
					// With memory, if we're not firing then
3116
					// we should call right away
3117
					} else if ( memory ) {
3118
						firingStart = start;
3119
						fire( memory );
3120
					}
3121
				}
3122
				return this;
3123
			},
3124
			// Remove a callback from the list
3125
			remove: function() {
3126
				if ( list ) {
3127
					jQuery.each( arguments, function( _, arg ) {
3128
						var index;
3129
						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 3129 is not entered. Are you sure the function inArray handles undefined variables?
Loading history...
3130
							list.splice( index, 1 );
3131
							// Handle firing indexes
3132
							if ( firing ) {
3133
								if ( index <= firingLength ) {
3134
									firingLength--;
3135
								}
3136
								if ( index <= firingIndex ) {
3137
									firingIndex--;
3138
								}
3139
							}
3140
						}
3141
					});
3142
				}
3143
				return this;
3144
			},
3145
			// Check if a given callback is in the list.
3146
			// If no argument is given, return whether or not list has callbacks attached.
3147
			has: function( fn ) {
3148
				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
3149
			},
3150
			// Remove all callbacks from the list
3151
			empty: function() {
3152
				list = [];
3153
				firingLength = 0;
3154
				return this;
3155
			},
3156
			// Have the list do nothing anymore
3157
			disable: function() {
3158
				list = stack = memory = undefined;
3159
				return this;
3160
			},
3161
			// Is it disabled?
3162
			disabled: function() {
3163
				return !list;
3164
			},
3165
			// Lock the list in its current state
3166
			lock: function() {
3167
				stack = undefined;
3168
				if ( !memory ) {
3169
					self.disable();
3170
				}
3171
				return this;
3172
			},
3173
			// Is it locked?
3174
			locked: function() {
3175
				return !stack;
3176
			},
3177
			// Call all callbacks with the given context and arguments
3178
			fireWith: function( context, args ) {
3179
				if ( list && ( !fired || stack ) ) {
3180
					args = args || [];
3181
					args = [ context, args.slice ? args.slice() : args ];
3182
					if ( firing ) {
3183
						stack.push( args );
3184
					} else {
3185
						fire( args );
3186
					}
3187
				}
3188
				return this;
3189
			},
3190
			// Call all the callbacks with the given arguments
3191
			fire: function() {
3192
				self.fireWith( this, arguments );
3193
				return this;
3194
			},
3195
			// To know if the callbacks have already been called at least once
3196
			fired: function() {
3197
				return !!fired;
3198
			}
3199
		};
3200
3201
	return self;
3202
};
3203
3204
3205
jQuery.extend({
3206
3207 View Code Duplication
	Deferred: function( func ) {
3208
		var tuples = [
3209
				// action, add listener, listener list, final state
3210
				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
3211
				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
3212
				[ "notify", "progress", jQuery.Callbacks("memory") ]
3213
			],
3214
			state = "pending",
3215
			promise = {
3216
				state: function() {
3217
					return state;
3218
				},
3219
				always: function() {
3220
					deferred.done( arguments ).fail( arguments );
3221
					return this;
3222
				},
3223
				then: function( /* fnDone, fnFail, fnProgress */ ) {
3224
					var fns = arguments;
3225
					return jQuery.Deferred(function( newDefer ) {
3226
						jQuery.each( tuples, function( i, tuple ) {
3227
							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
3228
							// deferred[ done | fail | progress ] for forwarding actions to newDefer
3229
							deferred[ tuple[1] ](function() {
3230
								var returned = fn && fn.apply( this, arguments );
3231
								if ( returned && jQuery.isFunction( returned.promise ) ) {
3232
									returned.promise()
3233
										.done( newDefer.resolve )
3234
										.fail( newDefer.reject )
3235
										.progress( newDefer.notify );
3236
								} else {
3237
									newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
3238
								}
3239
							});
3240
						});
3241
						fns = null;
3242
					}).promise();
3243
				},
3244
				// Get a promise for this deferred
3245
				// If obj is provided, the promise aspect is added to the object
3246
				promise: function( obj ) {
3247
					return obj != null ? jQuery.extend( obj, promise ) : promise;
3248
				}
3249
			},
3250
			deferred = {};
3251
3252
		// Keep pipe for back-compat
3253
		promise.pipe = promise.then;
3254
3255
		// Add list-specific methods
3256
		jQuery.each( tuples, function( i, tuple ) {
3257
			var list = tuple[ 2 ],
3258
				stateString = tuple[ 3 ];
3259
3260
			// promise[ done | fail | progress ] = list.add
3261
			promise[ tuple[1] ] = list.add;
3262
3263
			// Handle state
3264
			if ( stateString ) {
3265
				list.add(function() {
3266
					// state = [ resolved | rejected ]
3267
					state = stateString;
3268
3269
				// [ reject_list | resolve_list ].disable; progress_list.lock
3270
				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
3271
			}
3272
3273
			// deferred[ resolve | reject | notify ]
3274
			deferred[ tuple[0] ] = function() {
3275
				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
3276
				return this;
3277
			};
3278
			deferred[ tuple[0] + "With" ] = list.fireWith;
3279
		});
3280
3281
		// Make the deferred a promise
3282
		promise.promise( deferred );
3283
3284
		// Call given func if any
3285
		if ( func ) {
3286
			func.call( deferred, deferred );
3287
		}
3288
3289
		// All done!
3290
		return deferred;
3291
	},
3292
3293
	// Deferred helper
3294 View Code Duplication
	when: function( subordinate /* , ..., subordinateN */ ) {
3295
		var i = 0,
3296
			resolveValues = slice.call( arguments ),
3297
			length = resolveValues.length,
3298
3299
			// the count of uncompleted subordinates
3300
			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
3301
3302
			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
3303
			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
3304
3305
			// Update function for both resolve and progress values
3306
			updateFunc = function( i, contexts, values ) {
3307
				return function( value ) {
3308
					contexts[ i ] = this;
3309
					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
3310
					if ( values === progressValues ) {
3311
						deferred.notifyWith( contexts, values );
3312
					} else if ( !( --remaining ) ) {
3313
						deferred.resolveWith( contexts, values );
3314
					}
3315
				};
3316
			},
3317
3318
			progressValues, progressContexts, resolveContexts;
3319
3320
		// add listeners to Deferred subordinates; treat others as resolved
3321
		if ( length > 1 ) {
3322
			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...
3323
			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...
3324
			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...
3325
			for ( ; i < length; i++ ) {
3326
				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
3327
					resolveValues[ i ].promise()
3328
						.done( updateFunc( i, resolveContexts, resolveValues ) )
3329
						.fail( deferred.reject )
3330
						.progress( updateFunc( i, progressContexts, progressValues ) );
3331
				} else {
3332
					--remaining;
3333
				}
3334
			}
3335
		}
3336
3337
		// if we're not waiting on anything, resolve the master
3338
		if ( !remaining ) {
3339
			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 3321 is false. Are you sure the function resolveWith handles undefined variables?
Loading history...
3340
		}
3341
3342
		return deferred.promise();
3343
	}
3344
});
3345
3346
3347
// The deferred used on DOM ready
3348
var readyList;
3349
3350
jQuery.fn.ready = function( fn ) {
3351
	// Add the callback
3352
	jQuery.ready.promise().done( fn );
3353
3354
	return this;
3355
};
3356
3357
jQuery.extend({
3358
	// Is the DOM ready to be used? Set to true once it occurs.
3359
	isReady: false,
3360
3361
	// A counter to track how many items to wait for before
3362
	// the ready event fires. See #6781
3363
	readyWait: 1,
3364
3365
	// Hold (or release) the ready event
3366
	holdReady: function( hold ) {
3367
		if ( hold ) {
3368
			jQuery.readyWait++;
3369
		} else {
3370
			jQuery.ready( true );
3371
		}
3372
	},
3373
3374
	// Handle when the DOM is ready
3375
	ready: function( wait ) {
3376
3377
		// Abort if there are pending holds or we're already ready
3378
		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
3379
			return;
3380
		}
3381
3382
		// Remember that the DOM is ready
3383
		jQuery.isReady = true;
3384
3385
		// If a normal DOM Ready event fired, decrement, and wait if need be
3386
		if ( wait !== true && --jQuery.readyWait > 0 ) {
3387
			return;
3388
		}
3389
3390
		// If there are functions bound, to execute
3391
		readyList.resolveWith( document, [ jQuery ] );
3392
3393
		// Trigger any bound ready events
3394
		if ( jQuery.fn.triggerHandler ) {
3395
			jQuery( document ).triggerHandler( "ready" );
3396
			jQuery( document ).off( "ready" );
3397
		}
3398
	}
3399
});
3400
3401
/**
3402
 * The ready event handler and self cleanup method
3403
 */
3404
function completed() {
3405
	document.removeEventListener( "DOMContentLoaded", completed, false );
3406
	window.removeEventListener( "load", completed, false );
3407
	jQuery.ready();
3408
}
3409
3410
jQuery.ready.promise = function( obj ) {
3411
	if ( !readyList ) {
3412
3413
		readyList = jQuery.Deferred();
3414
3415
		// Catch cases where $(document).ready() is called after the browser event has already occurred.
3416
		// we once tried to use readyState "interactive" here, but it caused issues like the one
3417
		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
3418
		if ( document.readyState === "complete" ) {
3419
			// Handle it asynchronously to allow scripts the opportunity to delay ready
3420
			setTimeout( jQuery.ready );
3421
3422
		} else {
3423
3424
			// Use the handy event callback
3425
			document.addEventListener( "DOMContentLoaded", completed, false );
3426
3427
			// A fallback to window.onload, that will always work
3428
			window.addEventListener( "load", completed, false );
3429
		}
3430
	}
3431
	return readyList.promise( obj );
3432
};
3433
3434
// Kick off the DOM ready check even if the user does not
3435
jQuery.ready.promise();
3436
3437
3438
3439
3440
// Multifunctional method to get and set values of a collection
3441
// The value/s can optionally be executed if it's a function
3442 View Code Duplication
var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
3443
	var i = 0,
3444
		len = elems.length,
3445
		bulk = key == null;
3446
3447
	// Sets many values
3448
	if ( jQuery.type( key ) === "object" ) {
3449
		chainable = true;
3450
		for ( i in key ) {
3451
			jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
3452
		}
3453
3454
	// Sets one value
3455
	} else if ( value !== undefined ) {
3456
		chainable = true;
3457
3458
		if ( !jQuery.isFunction( value ) ) {
3459
			raw = true;
3460
		}
3461
3462
		if ( bulk ) {
3463
			// Bulk operations run against the entire set
3464
			if ( raw ) {
3465
				fn.call( elems, value );
3466
				fn = null;
3467
3468
			// ...except when executing function values
3469
			} else {
3470
				bulk = fn;
3471
				fn = function( elem, key, value ) {
3472
					return bulk.call( jQuery( elem ), value );
3473
				};
3474
			}
3475
		}
3476
3477
		if ( fn ) {
3478
			for ( ; i < len; i++ ) {
3479
				fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
3480
			}
3481
		}
3482
	}
3483
3484
	return chainable ?
3485
		elems :
3486
3487
		// Gets
3488
		bulk ?
3489
			fn.call( elems ) :
3490
			len ? fn( elems[0], key ) : emptyGet;
3491
};
3492
3493
3494
/**
3495
 * Determines whether an object can have data
3496
 */
3497
jQuery.acceptData = function( owner ) {
3498
	// Accepts only:
3499
	//  - Node
3500
	//    - Node.ELEMENT_NODE
3501
	//    - Node.DOCUMENT_NODE
3502
	//  - Object
3503
	//    - Any
3504
	/* jshint -W018 */
3505
	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
3506
};
3507
3508
3509
function Data() {
3510
	// Support: Android < 4,
3511
	// Old WebKit does not have Object.preventExtensions/freeze method,
3512
	// return new empty object instead with no [[set]] accessor
3513
	Object.defineProperty( this.cache = {}, 0, {
3514
		get: function() {
3515
			return {};
3516
		}
3517
	});
3518
3519
	this.expando = jQuery.expando + Math.random();
3520
}
3521
3522
Data.uid = 1;
3523
Data.accepts = jQuery.acceptData;
3524
3525
Data.prototype = {
3526
	key: function( owner ) {
3527
		// We can accept data for non-element nodes in modern browsers,
3528
		// but we should not, see #8335.
3529
		// Always return the key for a frozen object.
3530
		if ( !Data.accepts( owner ) ) {
3531
			return 0;
3532
		}
3533
3534
		var descriptor = {},
3535
			// Check if the owner object already has a cache key
3536
			unlock = owner[ this.expando ];
3537
3538
		// If not, create one
3539
		if ( !unlock ) {
3540
			unlock = Data.uid++;
3541
3542
			// Secure it in a non-enumerable, non-writable property
3543
			try {
3544
				descriptor[ this.expando ] = { value: unlock };
3545
				Object.defineProperties( owner, descriptor );
3546
3547
			// Support: Android < 4
3548
			// Fallback to a less secure definition
3549
			} catch ( e ) {
3550
				descriptor[ this.expando ] = unlock;
3551
				jQuery.extend( owner, descriptor );
3552
			}
3553
		}
3554
3555
		// Ensure the cache object
3556
		if ( !this.cache[ unlock ] ) {
3557
			this.cache[ unlock ] = {};
3558
		}
3559
3560
		return unlock;
3561
	},
3562
	set: function( owner, data, value ) {
3563
		var prop,
3564
			// There may be an unlock assigned to this node,
3565
			// if there is no entry for this "owner", create one inline
3566
			// and set the unlock as though an owner entry had always existed
3567
			unlock = this.key( owner ),
3568
			cache = this.cache[ unlock ];
3569
3570
		// Handle: [ owner, key, value ] args
3571
		if ( typeof data === "string" ) {
3572
			cache[ data ] = value;
3573
3574
		// Handle: [ owner, { properties } ] args
3575
		} else {
3576
			// Fresh assignments by object are shallow copied
3577
			if ( jQuery.isEmptyObject( cache ) ) {
3578
				jQuery.extend( this.cache[ unlock ], data );
3579
			// Otherwise, copy the properties one-by-one to the cache object
3580
			} else {
3581
				for ( prop in data ) {
3582
					cache[ prop ] = data[ prop ];
3583
				}
3584
			}
3585
		}
3586
		return cache;
3587
	},
3588
	get: function( owner, key ) {
3589
		// Either a valid cache is found, or will be created.
3590
		// New caches will be created and the unlock returned,
3591
		// allowing direct access to the newly created
3592
		// empty data object. A valid owner object must be provided.
3593
		var cache = this.cache[ this.key( owner ) ];
3594
3595
		return key === undefined ?
3596
			cache : cache[ key ];
3597
	},
3598 View Code Duplication
	access: function( owner, key, value ) {
3599
		var stored;
3600
		// In cases where either:
3601
		//
3602
		//   1. No key was specified
3603
		//   2. A string key was specified, but no value provided
3604
		//
3605
		// Take the "read" path and allow the get method to determine
3606
		// which value to return, respectively either:
3607
		//
3608
		//   1. The entire cache object
3609
		//   2. The data stored at the key
3610
		//
3611
		if ( key === undefined ||
3612
				((key && typeof key === "string") && value === undefined) ) {
3613
3614
			stored = this.get( owner, key );
3615
3616
			return stored !== undefined ?
3617
				stored : this.get( owner, jQuery.camelCase(key) );
3618
		}
3619
3620
		// [*]When the key is not a string, or both a key and value
3621
		// are specified, set or extend (existing objects) with either:
3622
		//
3623
		//   1. An object of properties
3624
		//   2. A key and value
3625
		//
3626
		this.set( owner, key, value );
3627
3628
		// Since the "set" path can have two possible entry points
3629
		// return the expected data based on which path was taken[*]
3630
		return value !== undefined ? value : key;
3631
	},
3632
	remove: function( owner, key ) {
3633
		var i, name, camel,
3634
			unlock = this.key( owner ),
3635
			cache = this.cache[ unlock ];
3636
3637
		if ( key === undefined ) {
3638
			this.cache[ unlock ] = {};
3639
3640
		} else {
3641
			// Support array or space separated string of keys
3642
			if ( jQuery.isArray( key ) ) {
3643
				// If "name" is an array of keys...
3644
				// When data is initially created, via ("key", "val") signature,
3645
				// keys will be converted to camelCase.
3646
				// Since there is no way to tell _how_ a key was added, remove
3647
				// both plain key and camelCase key. #12786
3648
				// This will only penalize the array argument path.
3649
				name = key.concat( key.map( jQuery.camelCase ) );
3650
			} else {
3651
				camel = jQuery.camelCase( key );
3652
				// Try the string as a key before any manipulation
3653
				if ( key in cache ) {
3654
					name = [ key, camel ];
3655
				} else {
3656
					// If a key with the spaces exists, use it.
3657
					// Otherwise, create an array by matching non-whitespace
3658
					name = camel;
3659
					name = name in cache ?
3660
						[ name ] : ( name.match( rnotwhite ) || [] );
3661
				}
3662
			}
3663
3664
			i = name.length;
3665
			while ( i-- ) {
3666
				delete cache[ name[ i ] ];
3667
			}
3668
		}
3669
	},
3670
	hasData: function( owner ) {
3671
		return !jQuery.isEmptyObject(
3672
			this.cache[ owner[ this.expando ] ] || {}
3673
		);
3674
	},
3675
	discard: function( owner ) {
3676
		if ( owner[ this.expando ] ) {
3677
			delete this.cache[ owner[ this.expando ] ];
3678
		}
3679
	}
3680
};
3681
var data_priv = new Data();
3682
3683
var data_user = new Data();
3684
3685
3686
3687
/*
3688
	Implementation Summary
3689
3690
	1. Enforce API surface and semantic compatibility with 1.9.x branch
3691
	2. Improve the module's maintainability by reducing the storage
3692
		paths to a single mechanism.
3693
	3. Use the same single mechanism to support "private" and "user" data.
3694
	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
3695
	5. Avoid exposing implementation details on user objects (eg. expando properties)
3696
	6. Provide a clear path for implementation upgrade to WeakMap in 2014
3697
*/
3698
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
3699
	rmultiDash = /([A-Z])/g;
3700
3701
function dataAttr( elem, key, data ) {
3702
	var name;
3703
3704
	// If nothing was found internally, try to fetch any
3705
	// data from the HTML5 data-* attribute
3706
	if ( data === undefined && elem.nodeType === 1 ) {
3707
		name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
3708
		data = elem.getAttribute( name );
3709
3710
		if ( typeof data === "string" ) {
3711
			try {
3712
				data = data === "true" ? true :
3713
					data === "false" ? false :
3714
					data === "null" ? null :
3715
					// Only convert to a number if it doesn't change the string
3716
					+data + "" === data ? +data :
3717
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
3718
					data;
3719
			} 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...
3720
3721
			// Make sure we set the data so it isn't changed later
3722
			data_user.set( elem, key, data );
3723
		} else {
3724
			data = undefined;
3725
		}
3726
	}
3727
	return data;
3728
}
3729
3730
jQuery.extend({
3731
	hasData: function( elem ) {
3732
		return data_user.hasData( elem ) || data_priv.hasData( elem );
3733
	},
3734
3735
	data: function( elem, name, data ) {
3736
		return data_user.access( elem, name, data );
3737
	},
3738
3739
	removeData: function( elem, name ) {
3740
		data_user.remove( elem, name );
3741
	},
3742
3743
	// TODO: Now that all calls to _data and _removeData have been replaced
3744
	// with direct calls to data_priv methods, these can be deprecated.
3745
	_data: function( elem, name, data ) {
3746
		return data_priv.access( elem, name, data );
3747
	},
3748
3749
	_removeData: function( elem, name ) {
3750
		data_priv.remove( elem, name );
3751
	}
3752
});
3753
3754
jQuery.fn.extend({
3755
	data: function( key, value ) {
3756
		var i, name, data,
3757
			elem = this[ 0 ],
3758
			attrs = elem && elem.attributes;
3759
3760
		// Gets all values
3761
		if ( key === undefined ) {
3762
			if ( this.length ) {
3763
				data = data_user.get( elem );
3764
3765
				if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
3766
					i = attrs.length;
3767
					while ( i-- ) {
3768
3769
						// Support: IE11+
3770
						// The attrs elements can be null (#14894)
3771
						if ( attrs[ i ] ) {
3772
							name = attrs[ i ].name;
3773
							if ( name.indexOf( "data-" ) === 0 ) {
3774
								name = jQuery.camelCase( name.slice(5) );
3775
								dataAttr( elem, name, data[ name ] );
3776
							}
3777
						}
3778
					}
3779
					data_priv.set( elem, "hasDataAttrs", true );
3780
				}
3781
			}
3782
3783
			return data;
3784
		}
3785
3786
		// Sets multiple values
3787
		if ( typeof key === "object" ) {
3788
			return this.each(function() {
3789
				data_user.set( this, key );
3790
			});
3791
		}
3792
3793
		return access( this, function( value ) {
3794
			var data,
3795
				camelKey = jQuery.camelCase( key );
3796
3797
			// The calling jQuery object (element matches) is not empty
3798
			// (and therefore has an element appears at this[ 0 ]) and the
3799
			// `value` parameter was not undefined. An empty jQuery object
3800
			// will result in `undefined` for elem = this[ 0 ] which will
3801
			// throw an exception if an attempt to read a data cache is made.
3802
			if ( elem && value === undefined ) {
3803
				// Attempt to get data from the cache
3804
				// with the key as-is
3805
				data = data_user.get( elem, key );
3806
				if ( data !== undefined ) {
3807
					return data;
3808
				}
3809
3810
				// Attempt to get data from the cache
3811
				// with the key camelized
3812
				data = data_user.get( elem, camelKey );
3813
				if ( data !== undefined ) {
3814
					return data;
3815
				}
3816
3817
				// Attempt to "discover" the data in
3818
				// HTML5 custom data-* attrs
3819
				data = dataAttr( elem, camelKey, undefined );
3820
				if ( data !== undefined ) {
3821
					return data;
3822
				}
3823
3824
				// We tried really hard, but the data doesn't exist.
3825
				return;
3826
			}
3827
3828
			// Set the data...
3829
			this.each(function() {
3830
				// First, attempt to store a copy or reference of any
3831
				// data that might've been store with a camelCased key.
3832
				var data = data_user.get( this, camelKey );
3833
3834
				// For HTML5 data-* attribute interop, we have to
3835
				// store property names with dashes in a camelCase form.
3836
				// This might not apply to all properties...*
3837
				data_user.set( this, camelKey, value );
3838
3839
				// *... In the case of properties that might _actually_
3840
				// have dashes, we need to also store a copy of that
3841
				// unchanged property.
3842
				if ( key.indexOf("-") !== -1 && data !== undefined ) {
3843
					data_user.set( this, key, value );
3844
				}
3845
			});
3846
		}, null, value, arguments.length > 1, null, true );
3847
	},
3848
3849
	removeData: function( key ) {
3850
		return this.each(function() {
3851
			data_user.remove( this, key );
3852
		});
3853
	}
3854
});
3855
3856
3857
jQuery.extend({
3858
	queue: function( elem, type, data ) {
3859
		var queue;
3860
3861
		if ( elem ) {
3862
			type = ( type || "fx" ) + "queue";
3863
			queue = data_priv.get( elem, type );
3864
3865
			// Speed up dequeue by getting out quickly if this is just a lookup
3866
			if ( data ) {
3867
				if ( !queue || jQuery.isArray( data ) ) {
3868
					queue = data_priv.access( elem, type, jQuery.makeArray(data) );
3869
				} else {
3870
					queue.push( data );
3871
				}
3872
			}
3873
			return queue || [];
3874
		}
3875
	},
3876
3877 View Code Duplication
	dequeue: function( elem, type ) {
3878
		type = type || "fx";
3879
3880
		var queue = jQuery.queue( elem, type ),
3881
			startLength = queue.length,
3882
			fn = queue.shift(),
3883
			hooks = jQuery._queueHooks( elem, type ),
3884
			next = function() {
3885
				jQuery.dequeue( elem, type );
3886
			};
3887
3888
		// If the fx queue is dequeued, always remove the progress sentinel
3889
		if ( fn === "inprogress" ) {
3890
			fn = queue.shift();
3891
			startLength--;
3892
		}
3893
3894
		if ( fn ) {
3895
3896
			// Add a progress sentinel to prevent the fx queue from being
3897
			// automatically dequeued
3898
			if ( type === "fx" ) {
3899
				queue.unshift( "inprogress" );
3900
			}
3901
3902
			// clear up the last queue stop function
3903
			delete hooks.stop;
3904
			fn.call( elem, next, hooks );
3905
		}
3906
3907
		if ( !startLength && hooks ) {
3908
			hooks.empty.fire();
3909
		}
3910
	},
3911
3912
	// not intended for public consumption - generates a queueHooks object, or returns the current one
3913
	_queueHooks: function( elem, type ) {
3914
		var key = type + "queueHooks";
3915
		return data_priv.get( elem, key ) || data_priv.access( elem, key, {
3916
			empty: jQuery.Callbacks("once memory").add(function() {
3917
				data_priv.remove( elem, [ type + "queue", key ] );
3918
			})
3919
		});
3920
	}
3921
});
3922
3923
jQuery.fn.extend({
3924 View Code Duplication
	queue: function( type, data ) {
3925
		var setter = 2;
3926
3927
		if ( typeof type !== "string" ) {
3928
			data = type;
3929
			type = "fx";
3930
			setter--;
3931
		}
3932
3933
		if ( arguments.length < setter ) {
3934
			return jQuery.queue( this[0], type );
3935
		}
3936
3937
		return data === undefined ?
3938
			this :
3939
			this.each(function() {
3940
				var queue = jQuery.queue( this, type, data );
3941
3942
				// ensure a hooks for this queue
3943
				jQuery._queueHooks( this, type );
3944
3945
				if ( type === "fx" && queue[0] !== "inprogress" ) {
3946
					jQuery.dequeue( this, type );
3947
				}
3948
			});
3949
	},
3950
	dequeue: function( type ) {
3951
		return this.each(function() {
3952
			jQuery.dequeue( this, type );
3953
		});
3954
	},
3955
	clearQueue: function( type ) {
3956
		return this.queue( type || "fx", [] );
3957
	},
3958
	// Get a promise resolved when queues of a certain type
3959
	// are emptied (fx is the type by default)
3960
	promise: function( type, obj ) {
3961
		var tmp,
3962
			count = 1,
3963
			defer = jQuery.Deferred(),
3964
			elements = this,
3965
			i = this.length,
3966
			resolve = function() {
3967
				if ( !( --count ) ) {
3968
					defer.resolveWith( elements, [ elements ] );
3969
				}
3970
			};
3971
3972
		if ( typeof type !== "string" ) {
3973
			obj = type;
3974
			type = undefined;
3975
		}
3976
		type = type || "fx";
3977
3978
		while ( i-- ) {
3979
			tmp = data_priv.get( elements[ i ], type + "queueHooks" );
3980
			if ( tmp && tmp.empty ) {
3981
				count++;
3982
				tmp.empty.add( resolve );
3983
			}
3984
		}
3985
		resolve();
3986
		return defer.promise( obj );
3987
	}
3988
});
3989
var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
3990
3991
var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
3992
3993
var isHidden = function( elem, el ) {
3994
		// isHidden might be called from jQuery#filter function;
3995
		// in that case, element will be second argument
3996
		elem = el || elem;
3997
		return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
3998
	};
3999
4000
var rcheckableType = (/^(?:checkbox|radio)$/i);
4001
4002
4003
4004
(function() {
4005
	var fragment = document.createDocumentFragment(),
4006
		div = fragment.appendChild( document.createElement( "div" ) ),
4007
		input = document.createElement( "input" );
4008
4009
	// #11217 - WebKit loses check when the name is after the checked attribute
4010
	// Support: Windows Web Apps (WWA)
4011
	// `name` and `type` need .setAttribute for WWA
4012
	input.setAttribute( "type", "radio" );
4013
	input.setAttribute( "checked", "checked" );
4014
	input.setAttribute( "name", "t" );
4015
4016
	div.appendChild( input );
4017
4018
	// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3
4019
	// old WebKit doesn't clone checked state correctly in fragments
4020
	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
4021
4022
	// Make sure textarea (and checkbox) defaultValue is properly cloned
4023
	// Support: IE9-IE11+
4024
	div.innerHTML = "<textarea>x</textarea>";
4025
	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
4026
})();
4027
var strundefined = typeof undefined;
4028
4029
4030
4031
support.focusinBubbles = "onfocusin" in window;
4032
4033
4034
var
4035
	rkeyEvent = /^key/,
4036
	rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
4037
	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
4038
	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
4039
4040
function returnTrue() {
4041
	return true;
4042
}
4043
4044
function returnFalse() {
4045
	return false;
4046
}
4047
4048
function safeActiveElement() {
4049
	try {
4050
		return document.activeElement;
4051
	} 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...
4052
}
4053
4054
/*
4055
 * Helper functions for managing events -- not part of the public interface.
4056
 * Props to Dean Edwards' addEvent library for many of the ideas.
4057
 */
4058
jQuery.event = {
4059
4060
	global: {},
4061
4062 View Code Duplication
	add: function( elem, types, handler, data, selector ) {
4063
4064
		var handleObjIn, eventHandle, tmp,
4065
			events, t, handleObj,
4066
			special, handlers, type, namespaces, origType,
4067
			elemData = data_priv.get( elem );
4068
4069
		// Don't attach events to noData or text/comment nodes (but allow plain objects)
4070
		if ( !elemData ) {
4071
			return;
4072
		}
4073
4074
		// Caller can pass in an object of custom data in lieu of the handler
4075
		if ( handler.handler ) {
4076
			handleObjIn = handler;
4077
			handler = handleObjIn.handler;
4078
			selector = handleObjIn.selector;
4079
		}
4080
4081
		// Make sure that the handler has a unique ID, used to find/remove it later
4082
		if ( !handler.guid ) {
4083
			handler.guid = jQuery.guid++;
4084
		}
4085
4086
		// Init the element's event structure and main handler, if this is the first
4087
		if ( !(events = elemData.events) ) {
4088
			events = elemData.events = {};
4089
		}
4090
		if ( !(eventHandle = elemData.handle) ) {
4091
			eventHandle = elemData.handle = function( e ) {
4092
				// Discard the second event of a jQuery.event.trigger() and
4093
				// when an event is called after a page has unloaded
4094
				return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
4095
					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
4096
			};
4097
		}
4098
4099
		// Handle multiple events separated by a space
4100
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
4101
		t = types.length;
4102
		while ( t-- ) {
4103
			tmp = rtypenamespace.exec( types[t] ) || [];
4104
			type = origType = tmp[1];
4105
			namespaces = ( tmp[2] || "" ).split( "." ).sort();
4106
4107
			// There *must* be a type, no attaching namespace-only handlers
4108
			if ( !type ) {
4109
				continue;
4110
			}
4111
4112
			// If event changes its type, use the special event handlers for the changed type
4113
			special = jQuery.event.special[ type ] || {};
4114
4115
			// If selector defined, determine special event api type, otherwise given type
4116
			type = ( selector ? special.delegateType : special.bindType ) || type;
4117
4118
			// Update special based on newly reset type
4119
			special = jQuery.event.special[ type ] || {};
4120
4121
			// handleObj is passed to all event handlers
4122
			handleObj = jQuery.extend({
4123
				type: type,
4124
				origType: origType,
4125
				data: data,
4126
				handler: handler,
4127
				guid: handler.guid,
4128
				selector: selector,
4129
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
4130
				namespace: namespaces.join(".")
4131
			}, handleObjIn );
0 ignored issues
show
Bug introduced by
The variable handleObjIn does not seem to be initialized in case handler.handler on line 4075 is false. Are you sure the function extend handles undefined variables?
Loading history...
4132
4133
			// Init the event handler queue if we're the first
4134
			if ( !(handlers = events[ type ]) ) {
4135
				handlers = events[ type ] = [];
4136
				handlers.delegateCount = 0;
4137
4138
				// Only use addEventListener if the special events handler returns false
4139
				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
4140
					if ( elem.addEventListener ) {
4141
						elem.addEventListener( type, eventHandle, false );
4142
					}
4143
				}
4144
			}
4145
4146
			if ( special.add ) {
4147
				special.add.call( elem, handleObj );
4148
4149
				if ( !handleObj.handler.guid ) {
4150
					handleObj.handler.guid = handler.guid;
4151
				}
4152
			}
4153
4154
			// Add to the element's handler list, delegates in front
4155
			if ( selector ) {
4156
				handlers.splice( handlers.delegateCount++, 0, handleObj );
4157
			} else {
4158
				handlers.push( handleObj );
4159
			}
4160
4161
			// Keep track of which events have ever been used, for event optimization
4162
			jQuery.event.global[ type ] = true;
4163
		}
4164
4165
	},
4166
4167
	// Detach an event or set of events from an element
4168 View Code Duplication
	remove: function( elem, types, handler, selector, mappedTypes ) {
4169
4170
		var j, origCount, tmp,
4171
			events, t, handleObj,
4172
			special, handlers, type, namespaces, origType,
4173
			elemData = data_priv.hasData( elem ) && data_priv.get( elem );
4174
4175
		if ( !elemData || !(events = elemData.events) ) {
4176
			return;
4177
		}
4178
4179
		// Once for each type.namespace in types; type may be omitted
4180
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
4181
		t = types.length;
4182
		while ( t-- ) {
4183
			tmp = rtypenamespace.exec( types[t] ) || [];
4184
			type = origType = tmp[1];
4185
			namespaces = ( tmp[2] || "" ).split( "." ).sort();
4186
4187
			// Unbind all events (on this namespace, if provided) for the element
4188
			if ( !type ) {
4189
				for ( type in events ) {
4190
					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
4191
				}
4192
				continue;
4193
			}
4194
4195
			special = jQuery.event.special[ type ] || {};
4196
			type = ( selector ? special.delegateType : special.bindType ) || type;
4197
			handlers = events[ type ] || [];
4198
			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
4199
4200
			// Remove matching events
4201
			origCount = j = handlers.length;
4202
			while ( j-- ) {
4203
				handleObj = handlers[ j ];
4204
4205
				if ( ( mappedTypes || origType === handleObj.origType ) &&
4206
					( !handler || handler.guid === handleObj.guid ) &&
4207
					( !tmp || tmp.test( handleObj.namespace ) ) &&
4208
					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
4209
					handlers.splice( j, 1 );
4210
4211
					if ( handleObj.selector ) {
4212
						handlers.delegateCount--;
4213
					}
4214
					if ( special.remove ) {
4215
						special.remove.call( elem, handleObj );
4216
					}
4217
				}
4218
			}
4219
4220
			// Remove generic event handler if we removed something and no more handlers exist
4221
			// (avoids potential for endless recursion during removal of special event handlers)
4222
			if ( origCount && !handlers.length ) {
4223
				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
4224
					jQuery.removeEvent( elem, type, elemData.handle );
4225
				}
4226
4227
				delete events[ type ];
4228
			}
4229
		}
4230
4231
		// Remove the expando if it's no longer used
4232
		if ( jQuery.isEmptyObject( events ) ) {
4233
			delete elemData.handle;
4234
			data_priv.remove( elem, "events" );
4235
		}
4236
	},
4237
4238 View Code Duplication
	trigger: function( event, data, elem, onlyHandlers ) {
4239
4240
		var i, cur, tmp, bubbleType, ontype, handle, special,
4241
			eventPath = [ elem || document ],
4242
			type = hasOwn.call( event, "type" ) ? event.type : event,
4243
			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
4244
4245
		cur = tmp = elem = elem || document;
4246
4247
		// Don't do events on text and comment nodes
4248
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
4249
			return;
4250
		}
4251
4252
		// focus/blur morphs to focusin/out; ensure we're not firing them right now
4253
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
4254
			return;
4255
		}
4256
4257
		if ( type.indexOf(".") >= 0 ) {
4258
			// Namespaced trigger; create a regexp to match event type in handle()
4259
			namespaces = type.split(".");
4260
			type = namespaces.shift();
4261
			namespaces.sort();
4262
		}
4263
		ontype = type.indexOf(":") < 0 && "on" + type;
4264
4265
		// Caller can pass in a jQuery.Event object, Object, or just an event type string
4266
		event = event[ jQuery.expando ] ?
4267
			event :
4268
			new jQuery.Event( type, typeof event === "object" && event );
4269
4270
		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
4271
		event.isTrigger = onlyHandlers ? 2 : 3;
4272
		event.namespace = namespaces.join(".");
4273
		event.namespace_re = event.namespace ?
4274
			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
4275
			null;
4276
4277
		// Clean up the event in case it is being reused
4278
		event.result = undefined;
4279
		if ( !event.target ) {
4280
			event.target = elem;
4281
		}
4282
4283
		// Clone any incoming data and prepend the event, creating the handler arg list
4284
		data = data == null ?
4285
			[ event ] :
4286
			jQuery.makeArray( data, [ event ] );
4287
4288
		// Allow special events to draw outside the lines
4289
		special = jQuery.event.special[ type ] || {};
4290
		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
4291
			return;
4292
		}
4293
4294
		// Determine event propagation path in advance, per W3C events spec (#9951)
4295
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
4296
		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
4297
4298
			bubbleType = special.delegateType || type;
4299
			if ( !rfocusMorph.test( bubbleType + type ) ) {
4300
				cur = cur.parentNode;
4301
			}
4302
			for ( ; cur; cur = cur.parentNode ) {
4303
				eventPath.push( cur );
4304
				tmp = cur;
4305
			}
4306
4307
			// Only add window if we got to document (e.g., not plain obj or detached DOM)
4308
			if ( tmp === (elem.ownerDocument || document) ) {
4309
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
4310
			}
4311
		}
4312
4313
		// Fire handlers on the event path
4314
		i = 0;
4315
		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
4316
4317
			event.type = i > 1 ?
4318
				bubbleType :
4319
				special.bindType || type;
4320
4321
			// jQuery handler
4322
			handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );
4323
			if ( handle ) {
4324
				handle.apply( cur, data );
4325
			}
4326
4327
			// Native handler
4328
			handle = ontype && cur[ ontype ];
4329
			if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
4330
				event.result = handle.apply( cur, data );
4331
				if ( event.result === false ) {
4332
					event.preventDefault();
4333
				}
4334
			}
4335
		}
4336
		event.type = type;
4337
4338
		// If nobody prevented the default action, do it now
4339
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
4340
4341
			if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
4342
				jQuery.acceptData( elem ) ) {
4343
4344
				// Call a native DOM method on the target with the same name name as the event.
4345
				// Don't do default actions on window, that's where global variables be (#6170)
4346
				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
4347
4348
					// Don't re-trigger an onFOO event when we call its FOO() method
4349
					tmp = elem[ ontype ];
4350
4351
					if ( tmp ) {
4352
						elem[ ontype ] = null;
4353
					}
4354
4355
					// Prevent re-triggering of the same event, since we already bubbled it above
4356
					jQuery.event.triggered = type;
4357
					elem[ type ]();
4358
					jQuery.event.triggered = undefined;
4359
4360
					if ( tmp ) {
4361
						elem[ ontype ] = tmp;
4362
					}
4363
				}
4364
			}
4365
		}
4366
4367
		return event.result;
4368
	},
4369
4370
	dispatch: function( event ) {
4371
4372
		// Make a writable jQuery.Event from the native event object
4373
		event = jQuery.event.fix( event );
4374
4375
		var i, j, ret, matched, handleObj,
4376
			handlerQueue = [],
4377
			args = slice.call( arguments ),
4378
			handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],
4379
			special = jQuery.event.special[ event.type ] || {};
4380
4381
		// Use the fix-ed jQuery.Event rather than the (read-only) native event
4382
		args[0] = event;
4383
		event.delegateTarget = this;
4384
4385
		// Call the preDispatch hook for the mapped type, and let it bail if desired
4386
		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
4387
			return;
4388
		}
4389
4390
		// Determine handlers
4391
		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
4392
4393
		// Run delegates first; they may want to stop propagation beneath us
4394
		i = 0;
4395
		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
4396
			event.currentTarget = matched.elem;
4397
4398
			j = 0;
4399
			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
4400
4401
				// Triggered event must either 1) have no namespace, or
4402
				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
4403
				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
4404
4405
					event.handleObj = handleObj;
4406
					event.data = handleObj.data;
4407
4408
					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
4409
							.apply( matched.elem, args );
4410
4411
					if ( ret !== undefined ) {
4412
						if ( (event.result = ret) === false ) {
4413
							event.preventDefault();
4414
							event.stopPropagation();
4415
						}
4416
					}
4417
				}
4418
			}
4419
		}
4420
4421
		// Call the postDispatch hook for the mapped type
4422
		if ( special.postDispatch ) {
4423
			special.postDispatch.call( this, event );
4424
		}
4425
4426
		return event.result;
4427
	},
4428
4429 View Code Duplication
	handlers: function( event, handlers ) {
4430
		var i, matches, sel, handleObj,
4431
			handlerQueue = [],
4432
			delegateCount = handlers.delegateCount,
4433
			cur = event.target;
4434
4435
		// Find delegate handlers
4436
		// Black-hole SVG <use> instance trees (#13180)
4437
		// Avoid non-left-click bubbling in Firefox (#3861)
4438
		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
4439
4440
			for ( ; cur !== this; cur = cur.parentNode || this ) {
4441
4442
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
4443
				if ( cur.disabled !== true || event.type !== "click" ) {
4444
					matches = [];
4445
					for ( i = 0; i < delegateCount; i++ ) {
4446
						handleObj = handlers[ i ];
4447
4448
						// Don't conflict with Object.prototype properties (#13203)
4449
						sel = handleObj.selector + " ";
4450
4451
						if ( matches[ sel ] === undefined ) {
4452
							matches[ sel ] = handleObj.needsContext ?
4453
								jQuery( sel, this ).index( cur ) >= 0 :
4454
								jQuery.find( sel, this, null, [ cur ] ).length;
4455
						}
4456
						if ( matches[ sel ] ) {
4457
							matches.push( handleObj );
4458
						}
4459
					}
4460
					if ( matches.length ) {
4461
						handlerQueue.push({ elem: cur, handlers: matches });
4462
					}
4463
				}
4464
			}
4465
		}
4466
4467
		// Add the remaining (directly-bound) handlers
4468
		if ( delegateCount < handlers.length ) {
4469
			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
4470
		}
4471
4472
		return handlerQueue;
4473
	},
4474
4475
	// Includes some event props shared by KeyEvent and MouseEvent
4476
	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
4477
4478
	fixHooks: {},
4479
4480
	keyHooks: {
4481
		props: "char charCode key keyCode".split(" "),
4482
		filter: function( event, original ) {
4483
4484
			// Add which for key events
4485
			if ( event.which == null ) {
4486
				event.which = original.charCode != null ? original.charCode : original.keyCode;
4487
			}
4488
4489
			return event;
4490
		}
4491
	},
4492
4493
	mouseHooks: {
4494
		props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
4495 View Code Duplication
		filter: function( event, original ) {
4496
			var eventDoc, doc, body,
4497
				button = original.button;
4498
4499
			// Calculate pageX/Y if missing and clientX/Y available
4500
			if ( event.pageX == null && original.clientX != null ) {
4501
				eventDoc = event.target.ownerDocument || document;
4502
				doc = eventDoc.documentElement;
4503
				body = eventDoc.body;
4504
4505
				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
4506
				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
4507
			}
4508
4509
			// Add which for click: 1 === left; 2 === middle; 3 === right
4510
			// Note: button is not normalized, so don't use it
4511
			if ( !event.which && button !== undefined ) {
4512
				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...
4513
			}
4514
4515
			return event;
4516
		}
4517
	},
4518
4519 View Code Duplication
	fix: function( event ) {
4520
		if ( event[ jQuery.expando ] ) {
4521
			return event;
4522
		}
4523
4524
		// Create a writable copy of the event object and normalize some properties
4525
		var i, prop, copy,
4526
			type = event.type,
4527
			originalEvent = event,
4528
			fixHook = this.fixHooks[ type ];
4529
4530
		if ( !fixHook ) {
4531
			this.fixHooks[ type ] = fixHook =
4532
				rmouseEvent.test( type ) ? this.mouseHooks :
4533
				rkeyEvent.test( type ) ? this.keyHooks :
4534
				{};
4535
		}
4536
		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
4537
4538
		event = new jQuery.Event( originalEvent );
4539
4540
		i = copy.length;
4541
		while ( i-- ) {
4542
			prop = copy[ i ];
4543
			event[ prop ] = originalEvent[ prop ];
4544
		}
4545
4546
		// Support: Cordova 2.5 (WebKit) (#13255)
4547
		// All events should have a target; Cordova deviceready doesn't
4548
		if ( !event.target ) {
4549
			event.target = document;
4550
		}
4551
4552
		// Support: Safari 6.0+, Chrome < 28
4553
		// Target should not be a text node (#504, #13143)
4554
		if ( event.target.nodeType === 3 ) {
4555
			event.target = event.target.parentNode;
4556
		}
4557
4558
		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
4559
	},
4560
4561
	special: {
4562
		load: {
4563
			// Prevent triggered image.load events from bubbling to window.load
4564
			noBubble: true
4565
		},
4566
		focus: {
4567
			// Fire native event if possible so blur/focus sequence is correct
4568
			trigger: function() {
4569
				if ( this !== safeActiveElement() && this.focus ) {
4570
					this.focus();
4571
					return false;
4572
				}
4573
			},
4574
			delegateType: "focusin"
4575
		},
4576
		blur: {
4577
			trigger: function() {
4578
				if ( this === safeActiveElement() && this.blur ) {
4579
					this.blur();
4580
					return false;
4581
				}
4582
			},
4583
			delegateType: "focusout"
4584
		},
4585
		click: {
4586
			// For checkbox, fire native event so checked state will be right
4587
			trigger: function() {
4588
				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
4589
					this.click();
4590
					return false;
4591
				}
4592
			},
4593
4594
			// For cross-browser consistency, don't fire native .click() on links
4595
			_default: function( event ) {
4596
				return jQuery.nodeName( event.target, "a" );
4597
			}
4598
		},
4599
4600
		beforeunload: {
4601
			postDispatch: function( event ) {
4602
4603
				// Support: Firefox 20+
4604
				// Firefox doesn't alert if the returnValue field is not set.
4605
				if ( event.result !== undefined && event.originalEvent ) {
4606
					event.originalEvent.returnValue = event.result;
4607
				}
4608
			}
4609
		}
4610
	},
4611
4612
	simulate: function( type, elem, event, bubble ) {
4613
		// Piggyback on a donor event to simulate a different one.
4614
		// Fake originalEvent to avoid donor's stopPropagation, but if the
4615
		// simulated event prevents default then we do the same on the donor.
4616
		var e = jQuery.extend(
4617
			new jQuery.Event(),
4618
			event,
4619
			{
4620
				type: type,
4621
				isSimulated: true,
4622
				originalEvent: {}
4623
			}
4624
		);
4625
		if ( bubble ) {
4626
			jQuery.event.trigger( e, null, elem );
4627
		} else {
4628
			jQuery.event.dispatch.call( elem, e );
4629
		}
4630
		if ( e.isDefaultPrevented() ) {
4631
			event.preventDefault();
4632
		}
4633
	}
4634
};
4635
4636
jQuery.removeEvent = function( elem, type, handle ) {
4637
	if ( elem.removeEventListener ) {
4638
		elem.removeEventListener( type, handle, false );
4639
	}
4640
};
4641
4642 View Code Duplication
jQuery.Event = function( src, props ) {
4643
	// Allow instantiation without the 'new' keyword
4644
	if ( !(this instanceof jQuery.Event) ) {
4645
		return new jQuery.Event( src, props );
4646
	}
4647
4648
	// Event object
4649
	if ( src && src.type ) {
4650
		this.originalEvent = src;
4651
		this.type = src.type;
4652
4653
		// Events bubbling up the document may have been marked as prevented
4654
		// by a handler lower down the tree; reflect the correct value.
4655
		this.isDefaultPrevented = src.defaultPrevented ||
4656
				src.defaultPrevented === undefined &&
4657
				// Support: Android < 4.0
4658
				src.returnValue === false ?
4659
			returnTrue :
4660
			returnFalse;
4661
4662
	// Event type
4663
	} else {
4664
		this.type = src;
4665
	}
4666
4667
	// Put explicitly provided properties onto the event object
4668
	if ( props ) {
4669
		jQuery.extend( this, props );
4670
	}
4671
4672
	// Create a timestamp if incoming event doesn't have one
4673
	this.timeStamp = src && src.timeStamp || jQuery.now();
4674
4675
	// Mark it as fixed
4676
	this[ jQuery.expando ] = true;
4677
};
4678
4679
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
4680
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
4681
jQuery.Event.prototype = {
4682
	isDefaultPrevented: returnFalse,
4683
	isPropagationStopped: returnFalse,
4684
	isImmediatePropagationStopped: returnFalse,
4685
4686
	preventDefault: function() {
4687
		var e = this.originalEvent;
4688
4689
		this.isDefaultPrevented = returnTrue;
4690
4691
		if ( e && e.preventDefault ) {
4692
			e.preventDefault();
4693
		}
4694
	},
4695
	stopPropagation: function() {
4696
		var e = this.originalEvent;
4697
4698
		this.isPropagationStopped = returnTrue;
4699
4700
		if ( e && e.stopPropagation ) {
4701
			e.stopPropagation();
4702
		}
4703
	},
4704
	stopImmediatePropagation: function() {
4705
		var e = this.originalEvent;
4706
4707
		this.isImmediatePropagationStopped = returnTrue;
4708
4709
		if ( e && e.stopImmediatePropagation ) {
4710
			e.stopImmediatePropagation();
4711
		}
4712
4713
		this.stopPropagation();
4714
	}
4715
};
4716
4717
// Create mouseenter/leave events using mouseover/out and event-time checks
4718
// Support: Chrome 15+
4719
jQuery.each({
4720
	mouseenter: "mouseover",
4721
	mouseleave: "mouseout",
4722
	pointerenter: "pointerover",
4723
	pointerleave: "pointerout"
4724 View Code Duplication
}, function( orig, fix ) {
4725
	jQuery.event.special[ orig ] = {
4726
		delegateType: fix,
4727
		bindType: fix,
4728
4729
		handle: function( event ) {
4730
			var ret,
4731
				target = this,
4732
				related = event.relatedTarget,
4733
				handleObj = event.handleObj;
4734
4735
			// For mousenter/leave call the handler if related is outside the target.
4736
			// NB: No relatedTarget if the mouse left/entered the browser window
4737
			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
4738
				event.type = handleObj.origType;
4739
				ret = handleObj.handler.apply( this, arguments );
4740
				event.type = fix;
4741
			}
4742
			return ret;
4743
		}
4744
	};
4745
});
4746
4747
// Create "bubbling" focus and blur events
4748
// Support: Firefox, Chrome, Safari
4749
if ( !support.focusinBubbles ) {
4750
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
4751
4752
		// Attach a single capturing handler on the document while someone wants focusin/focusout
4753
		var handler = function( event ) {
4754
				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
4755
			};
4756
4757
		jQuery.event.special[ fix ] = {
4758
			setup: function() {
4759
				var doc = this.ownerDocument || this,
4760
					attaches = data_priv.access( doc, fix );
4761
4762
				if ( !attaches ) {
4763
					doc.addEventListener( orig, handler, true );
4764
				}
4765
				data_priv.access( doc, fix, ( attaches || 0 ) + 1 );
4766
			},
4767
			teardown: function() {
4768
				var doc = this.ownerDocument || this,
4769
					attaches = data_priv.access( doc, fix ) - 1;
4770
4771
				if ( !attaches ) {
4772
					doc.removeEventListener( orig, handler, true );
4773
					data_priv.remove( doc, fix );
4774
4775
				} else {
4776
					data_priv.access( doc, fix, attaches );
4777
				}
4778
			}
4779
		};
4780
	});
4781
}
4782
4783
jQuery.fn.extend({
4784
4785
	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
4786
		var origFn, type;
4787
4788
		// Types can be a map of types/handlers
4789
		if ( typeof types === "object" ) {
4790
			// ( types-Object, selector, data )
4791
			if ( typeof selector !== "string" ) {
4792
				// ( types-Object, data )
4793
				data = data || selector;
4794
				selector = undefined;
4795
			}
4796
			for ( type in types ) {
4797
				this.on( type, selector, data, types[ type ], one );
4798
			}
4799
			return this;
4800
		}
4801
4802
		if ( data == null && fn == null ) {
4803
			// ( types, fn )
4804
			fn = selector;
4805
			data = selector = undefined;
4806
		} else if ( fn == null ) {
4807
			if ( typeof selector === "string" ) {
4808
				// ( types, selector, fn )
4809
				fn = data;
4810
				data = undefined;
4811
			} else {
4812
				// ( types, data, fn )
4813
				fn = data;
4814
				data = selector;
4815
				selector = undefined;
4816
			}
4817
		}
4818
		if ( fn === false ) {
4819
			fn = returnFalse;
4820
		} else if ( !fn ) {
4821
			return this;
4822
		}
4823
4824
		if ( one === 1 ) {
4825
			origFn = fn;
4826
			fn = function( event ) {
4827
				// Can use an empty set, since event contains the info
4828
				jQuery().off( event );
4829
				return origFn.apply( this, arguments );
4830
			};
4831
			// Use same guid so caller can remove using origFn
4832
			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
4833
		}
4834
		return this.each( function() {
4835
			jQuery.event.add( this, types, fn, data, selector );
4836
		});
4837
	},
4838
	one: function( types, selector, data, fn ) {
4839
		return this.on( types, selector, data, fn, 1 );
4840
	},
4841 View Code Duplication
	off: function( types, selector, fn ) {
4842
		var handleObj, type;
4843
		if ( types && types.preventDefault && types.handleObj ) {
4844
			// ( event )  dispatched jQuery.Event
4845
			handleObj = types.handleObj;
4846
			jQuery( types.delegateTarget ).off(
4847
				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
4848
				handleObj.selector,
4849
				handleObj.handler
4850
			);
4851
			return this;
4852
		}
4853
		if ( typeof types === "object" ) {
4854
			// ( types-object [, selector] )
4855
			for ( type in types ) {
4856
				this.off( type, selector, types[ type ] );
4857
			}
4858
			return this;
4859
		}
4860
		if ( selector === false || typeof selector === "function" ) {
4861
			// ( types [, fn] )
4862
			fn = selector;
4863
			selector = undefined;
4864
		}
4865
		if ( fn === false ) {
4866
			fn = returnFalse;
4867
		}
4868
		return this.each(function() {
4869
			jQuery.event.remove( this, types, fn, selector );
4870
		});
4871
	},
4872
4873
	trigger: function( type, data ) {
4874
		return this.each(function() {
4875
			jQuery.event.trigger( type, data, this );
4876
		});
4877
	},
4878
	triggerHandler: function( type, data ) {
4879
		var elem = this[0];
4880
		if ( elem ) {
4881
			return jQuery.event.trigger( type, data, elem, true );
4882
		}
4883
	}
4884
});
4885
4886
4887
var
4888
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
4889
	rtagName = /<([\w:]+)/,
4890
	rhtml = /<|&#?\w+;/,
4891
	rnoInnerhtml = /<(?:script|style|link)/i,
4892
	// checked="checked" or checked
4893
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
4894
	rscriptType = /^$|\/(?:java|ecma)script/i,
4895
	rscriptTypeMasked = /^true\/(.*)/,
4896
	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
4897
4898
	// We have to close these tags to support XHTML (#13200)
4899
	wrapMap = {
4900
4901
		// Support: IE 9
4902
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
4903
4904
		thead: [ 1, "<table>", "</table>" ],
4905
		col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
4906
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4907
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4908
4909
		_default: [ 0, "", "" ]
4910
	};
4911
4912
// Support: IE 9
4913
wrapMap.optgroup = wrapMap.option;
4914
4915
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4916
wrapMap.th = wrapMap.td;
4917
4918
// Support: 1.x compatibility
4919
// Manipulating tables requires a tbody
4920
function manipulationTarget( elem, content ) {
4921
	return jQuery.nodeName( elem, "table" ) &&
4922
		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?
4923
4924
		elem.getElementsByTagName("tbody")[0] ||
4925
			elem.appendChild( elem.ownerDocument.createElement("tbody") ) :
4926
		elem;
4927
}
4928
4929
// Replace/restore the type attribute of script elements for safe DOM manipulation
4930
function disableScript( elem ) {
4931
	elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
4932
	return elem;
4933
}
4934
function restoreScript( elem ) {
4935
	var match = rscriptTypeMasked.exec( elem.type );
4936
4937
	if ( match ) {
4938
		elem.type = match[ 1 ];
4939
	} else {
4940
		elem.removeAttribute("type");
4941
	}
4942
4943
	return elem;
4944
}
4945
4946
// Mark scripts as having already been evaluated
4947
function setGlobalEval( elems, refElements ) {
4948
	var i = 0,
4949
		l = elems.length;
4950
4951
	for ( ; i < l; i++ ) {
4952
		data_priv.set(
4953
			elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )
4954
		);
4955
	}
4956
}
4957
4958
function cloneCopyEvent( src, dest ) {
4959
	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
4960
4961
	if ( dest.nodeType !== 1 ) {
4962
		return;
4963
	}
4964
4965
	// 1. Copy private data: events, handlers, etc.
4966
	if ( data_priv.hasData( src ) ) {
4967
		pdataOld = data_priv.access( src );
4968
		pdataCur = data_priv.set( dest, pdataOld );
4969
		events = pdataOld.events;
4970
4971
		if ( events ) {
4972
			delete pdataCur.handle;
4973
			pdataCur.events = {};
4974
4975
			for ( type in events ) {
4976
				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
4977
					jQuery.event.add( dest, type, events[ type ][ i ] );
4978
				}
4979
			}
4980
		}
4981
	}
4982
4983
	// 2. Copy user data
4984
	if ( data_user.hasData( src ) ) {
4985
		udataOld = data_user.access( src );
4986
		udataCur = jQuery.extend( {}, udataOld );
4987
4988
		data_user.set( dest, udataCur );
4989
	}
4990
}
4991
4992
function getAll( context, tag ) {
4993
	var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :
4994
			context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :
4995
			[];
4996
4997
	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
4998
		jQuery.merge( [ context ], ret ) :
4999
		ret;
5000
}
5001
5002
// Support: IE >= 9
5003
function fixInput( src, dest ) {
5004
	var nodeName = dest.nodeName.toLowerCase();
5005
5006
	// Fails to persist the checked state of a cloned checkbox or radio button.
5007
	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
5008
		dest.checked = src.checked;
5009
5010
	// Fails to return the selected option to the default selected state when cloning options
5011
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5012
		dest.defaultValue = src.defaultValue;
5013
	}
5014
}
5015
5016
jQuery.extend({
5017 View Code Duplication
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5018
		var i, l, srcElements, destElements,
5019
			clone = elem.cloneNode( true ),
5020
			inPage = jQuery.contains( elem.ownerDocument, elem );
5021
5022
		// Support: IE >= 9
5023
		// Fix Cloning issues
5024
		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
5025
				!jQuery.isXMLDoc( elem ) ) {
5026
5027
			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
5028
			destElements = getAll( clone );
5029
			srcElements = getAll( elem );
5030
5031
			for ( i = 0, l = srcElements.length; i < l; i++ ) {
5032
				fixInput( srcElements[ i ], destElements[ i ] );
5033
			}
5034
		}
5035
5036
		// Copy the events from the original to the clone
5037
		if ( dataAndEvents ) {
5038
			if ( deepDataAndEvents ) {
5039
				srcElements = srcElements || getAll( elem );
5040
				destElements = destElements || getAll( clone );
5041
5042
				for ( i = 0, l = srcElements.length; i < l; i++ ) {
5043
					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
5044
				}
5045
			} else {
5046
				cloneCopyEvent( elem, clone );
5047
			}
5048
		}
5049
5050
		// Preserve script evaluation history
5051
		destElements = getAll( clone, "script" );
5052
		if ( destElements.length > 0 ) {
5053
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
5054
		}
5055
5056
		// Return the cloned set
5057
		return clone;
5058
	},
5059
5060
	buildFragment: function( elems, context, scripts, selection ) {
5061
		var elem, tmp, tag, wrap, contains, j,
5062
			fragment = context.createDocumentFragment(),
5063
			nodes = [],
5064
			i = 0,
5065
			l = elems.length;
5066
5067 View Code Duplication
		for ( ; i < l; i++ ) {
5068
			elem = elems[ i ];
5069
5070
			if ( elem || elem === 0 ) {
5071
5072
				// Add nodes directly
5073
				if ( jQuery.type( elem ) === "object" ) {
5074
					// Support: QtWebKit
5075
					// jQuery.merge because push.apply(_, arraylike) throws
5076
					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
5077
5078
				// Convert non-html into a text node
5079
				} else if ( !rhtml.test( elem ) ) {
5080
					nodes.push( context.createTextNode( elem ) );
5081
5082
				// Convert html into DOM nodes
5083
				} else {
5084
					tmp = tmp || fragment.appendChild( context.createElement("div") );
5085
5086
					// Deserialize a standard representation
5087
					tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
5088
					wrap = wrapMap[ tag ] || wrapMap._default;
5089
					tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];
5090
5091
					// Descend through wrappers to the right content
5092
					j = wrap[ 0 ];
5093
					while ( j-- ) {
5094
						tmp = tmp.lastChild;
5095
					}
5096
5097
					// Support: QtWebKit
5098
					// jQuery.merge because push.apply(_, arraylike) throws
5099
					jQuery.merge( nodes, tmp.childNodes );
5100
5101
					// Remember the top-level container
5102
					tmp = fragment.firstChild;
5103
5104
					// Fixes #12346
5105
					// Support: Webkit, IE
5106
					tmp.textContent = "";
5107
				}
5108
			}
5109
		}
5110
5111
		// Remove wrapper from fragment
5112
		fragment.textContent = "";
5113
5114
		i = 0;
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable i here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
5115 View Code Duplication
		while ( (elem = nodes[ i++ ]) ) {
5116
5117
			// #4087 - If origin and destination elements are the same, and this is
5118
			// that element, do not do anything
5119
			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
5120
				continue;
5121
			}
5122
5123
			contains = jQuery.contains( elem.ownerDocument, elem );
5124
5125
			// Append to fragment
5126
			tmp = getAll( fragment.appendChild( elem ), "script" );
5127
5128
			// Preserve script evaluation history
5129
			if ( contains ) {
5130
				setGlobalEval( tmp );
5131
			}
5132
5133
			// Capture executables
5134
			if ( scripts ) {
5135
				j = 0;
5136
				while ( (elem = tmp[ j++ ]) ) {
5137
					if ( rscriptType.test( elem.type || "" ) ) {
5138
						scripts.push( elem );
5139
					}
5140
				}
5141
			}
5142
		}
5143
5144
		return fragment;
5145
	},
5146
5147
	cleanData: function( elems ) {
5148
		var data, elem, type, key,
5149
			special = jQuery.event.special,
5150
			i = 0;
5151
5152
		for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
5153
			if ( jQuery.acceptData( elem ) ) {
5154
				key = elem[ data_priv.expando ];
5155
5156
				if ( key && (data = data_priv.cache[ key ]) ) {
5157
					if ( data.events ) {
5158
						for ( type in data.events ) {
5159
							if ( special[ type ] ) {
5160
								jQuery.event.remove( elem, type );
5161
5162
							// This is a shortcut to avoid jQuery.event.remove's overhead
5163
							} else {
5164
								jQuery.removeEvent( elem, type, data.handle );
5165
							}
5166
						}
5167
					}
5168
					if ( data_priv.cache[ key ] ) {
5169
						// Discard any remaining `private` data
5170
						delete data_priv.cache[ key ];
5171
					}
5172
				}
5173
			}
5174
			// Discard any remaining `user` data
5175
			delete data_user.cache[ elem[ data_user.expando ] ];
5176
		}
5177
	}
5178
});
5179
5180
jQuery.fn.extend({
5181
	text: function( value ) {
5182
		return access( this, function( value ) {
5183
			return value === undefined ?
5184
				jQuery.text( this ) :
5185
				this.empty().each(function() {
5186
					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5187
						this.textContent = value;
5188
					}
5189
				});
5190
		}, null, value, arguments.length );
5191
	},
5192
5193
	append: function() {
5194
		return this.domManip( arguments, function( elem ) {
5195
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5196
				var target = manipulationTarget( this, elem );
5197
				target.appendChild( elem );
5198
			}
5199
		});
5200
	},
5201
5202
	prepend: function() {
5203
		return this.domManip( arguments, function( elem ) {
5204
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
5205
				var target = manipulationTarget( this, elem );
5206
				target.insertBefore( elem, target.firstChild );
5207
			}
5208
		});
5209
	},
5210
5211
	before: function() {
5212
		return this.domManip( arguments, function( elem ) {
5213
			if ( this.parentNode ) {
5214
				this.parentNode.insertBefore( elem, this );
5215
			}
5216
		});
5217
	},
5218
5219
	after: function() {
5220
		return this.domManip( arguments, function( elem ) {
5221
			if ( this.parentNode ) {
5222
				this.parentNode.insertBefore( elem, this.nextSibling );
5223
			}
5224
		});
5225
	},
5226
5227
	remove: function( selector, keepData /* Internal Use Only */ ) {
5228
		var elem,
5229
			elems = selector ? jQuery.filter( selector, this ) : this,
5230
			i = 0;
5231
5232
		for ( ; (elem = elems[i]) != null; i++ ) {
5233
			if ( !keepData && elem.nodeType === 1 ) {
5234
				jQuery.cleanData( getAll( elem ) );
5235
			}
5236
5237
			if ( elem.parentNode ) {
5238
				if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
5239
					setGlobalEval( getAll( elem, "script" ) );
5240
				}
5241
				elem.parentNode.removeChild( elem );
5242
			}
5243
		}
5244
5245
		return this;
5246
	},
5247
5248
	empty: function() {
5249
		var elem,
5250
			i = 0;
5251
5252
		for ( ; (elem = this[i]) != null; i++ ) {
5253
			if ( elem.nodeType === 1 ) {
5254
5255
				// Prevent memory leaks
5256
				jQuery.cleanData( getAll( elem, false ) );
5257
5258
				// Remove any remaining nodes
5259
				elem.textContent = "";
5260
			}
5261
		}
5262
5263
		return this;
5264
	},
5265
5266
	clone: function( dataAndEvents, deepDataAndEvents ) {
5267
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5268
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5269
5270
		return this.map(function() {
5271
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5272
		});
5273
	},
5274
5275
	html: function( value ) {
5276
		return access( this, function( value ) {
5277
			var elem = this[ 0 ] || {},
5278
				i = 0,
5279
				l = this.length;
5280
5281
			if ( value === undefined && elem.nodeType === 1 ) {
5282
				return elem.innerHTML;
5283
			}
5284
5285
			// See if we can take a shortcut and just use innerHTML
5286
			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
5287
				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
5288
5289
				value = value.replace( rxhtmlTag, "<$1></$2>" );
5290
5291
				try {
5292
					for ( ; i < l; i++ ) {
5293
						elem = this[ i ] || {};
5294
5295
						// Remove element nodes and prevent memory leaks
5296
						if ( elem.nodeType === 1 ) {
5297
							jQuery.cleanData( getAll( elem, false ) );
5298
							elem.innerHTML = value;
5299
						}
5300
					}
5301
5302
					elem = 0;
5303
5304
				// If using innerHTML throws an exception, use the fallback method
5305
				} 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...
5306
			}
5307
5308
			if ( elem ) {
5309
				this.empty().append( value );
5310
			}
5311
		}, null, value, arguments.length );
5312
	},
5313
5314
	replaceWith: function() {
5315
		var arg = arguments[ 0 ];
5316
5317
		// Make the changes, replacing each context element with the new content
5318
		this.domManip( arguments, function( elem ) {
5319
			arg = this.parentNode;
5320
5321
			jQuery.cleanData( getAll( this ) );
5322
5323
			if ( arg ) {
5324
				arg.replaceChild( elem, this );
5325
			}
5326
		});
5327
5328
		// Force removal if there was no new content (e.g., from empty arguments)
5329
		return arg && (arg.length || arg.nodeType) ? this : this.remove();
5330
	},
5331
5332
	detach: function( selector ) {
5333
		return this.remove( selector, true );
5334
	},
5335
5336
	domManip: function( args, callback ) {
5337
5338
		// Flatten any nested arrays
5339
		args = concat.apply( [], args );
5340
5341
		var fragment, first, scripts, hasScripts, node, doc,
5342
			i = 0,
5343
			l = this.length,
5344
			set = this,
5345
			iNoClone = l - 1,
5346
			value = args[ 0 ],
5347
			isFunction = jQuery.isFunction( value );
5348
5349
		// We can't cloneNode fragments that contain checked, in WebKit
5350
		if ( isFunction ||
5351
				( l > 1 && typeof value === "string" &&
5352
					!support.checkClone && rchecked.test( value ) ) ) {
5353
			return this.each(function( index ) {
5354
				var self = set.eq( index );
5355
				if ( isFunction ) {
5356
					args[ 0 ] = value.call( this, index, self.html() );
5357
				}
5358
				self.domManip( args, callback );
5359
			});
5360
		}
5361
5362
		if ( l ) {
5363
			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
5364
			first = fragment.firstChild;
5365
5366
			if ( fragment.childNodes.length === 1 ) {
5367
				fragment = first;
5368
			}
5369
5370
			if ( first ) {
5371
				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
5372
				hasScripts = scripts.length;
5373
5374
				// Use the original fragment for the last item instead of the first because it can end up
5375
				// being emptied incorrectly in certain situations (#8070).
5376
				for ( ; i < l; i++ ) {
5377
					node = fragment;
5378
5379
					if ( i !== iNoClone ) {
5380
						node = jQuery.clone( node, true, true );
5381
5382
						// Keep references to cloned scripts for later restoration
5383
						if ( hasScripts ) {
5384
							// Support: QtWebKit
5385
							// jQuery.merge because push.apply(_, arraylike) throws
5386
							jQuery.merge( scripts, getAll( node, "script" ) );
5387
						}
5388
					}
5389
5390
					callback.call( this[ i ], node, i );
5391
				}
5392
5393
				if ( hasScripts ) {
5394
					doc = scripts[ scripts.length - 1 ].ownerDocument;
5395
5396
					// Reenable scripts
5397
					jQuery.map( scripts, restoreScript );
5398
5399
					// Evaluate executable scripts on first document insertion
5400
					for ( i = 0; i < hasScripts; i++ ) {
5401
						node = scripts[ i ];
5402
						if ( rscriptType.test( node.type || "" ) &&
5403
							!data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
5404
5405
							if ( node.src ) {
5406
								// Optional AJAX dependency, but won't run scripts if not present
5407
								if ( jQuery._evalUrl ) {
5408
									jQuery._evalUrl( node.src );
5409
								}
5410
							} else {
5411
								jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
5412
							}
5413
						}
5414
					}
5415
				}
5416
			}
5417
		}
5418
5419
		return this;
5420
	}
5421
});
5422
5423
jQuery.each({
5424
	appendTo: "append",
5425
	prependTo: "prepend",
5426
	insertBefore: "before",
5427
	insertAfter: "after",
5428
	replaceAll: "replaceWith"
5429
}, function( name, original ) {
5430
	jQuery.fn[ name ] = function( selector ) {
5431
		var elems,
5432
			ret = [],
5433
			insert = jQuery( selector ),
5434
			last = insert.length - 1,
5435
			i = 0;
5436
5437
		for ( ; i <= last; i++ ) {
5438
			elems = i === last ? this : this.clone( true );
5439
			jQuery( insert[ i ] )[ original ]( elems );
5440
5441
			// Support: QtWebKit
5442
			// .get() because push.apply(_, arraylike) throws
5443
			push.apply( ret, elems.get() );
5444
		}
5445
5446
		return this.pushStack( ret );
5447
	};
5448
});
5449
5450
5451
var iframe,
5452
	elemdisplay = {};
5453
5454
/**
5455
 * Retrieve the actual display of a element
5456
 * @param {String} name nodeName of the element
5457
 * @param {Object} doc Document object
5458
 */
5459
// Called only from within defaultDisplay
5460
function actualDisplay( name, doc ) {
5461
	var style,
5462
		elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
5463
5464
		// getDefaultComputedStyle might be reliably used only on attached element
5465
		display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
5466
5467
			// Use of this method is a temporary fix (more like optmization) until something better comes along,
5468
			// since it was removed from specification and supported only in FF
5469
			style.display : jQuery.css( elem[ 0 ], "display" );
5470
5471
	// We don't have any data stored on the element,
5472
	// so use "detach" method as fast way to get rid of the element
5473
	elem.detach();
5474
5475
	return display;
5476
}
5477
5478
/**
5479
 * Try to determine the default display value of an element
5480
 * @param {String} nodeName
5481
 */
5482
function defaultDisplay( nodeName ) {
5483
	var doc = document,
5484
		display = elemdisplay[ nodeName ];
5485
5486
	if ( !display ) {
5487
		display = actualDisplay( nodeName, doc );
5488
5489
		// If the simple way fails, read from inside an iframe
5490
		if ( display === "none" || !display ) {
5491
5492
			// Use the already-created iframe if possible
5493
			iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );
5494
5495
			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
5496
			doc = iframe[ 0 ].contentDocument;
5497
5498
			// Support: IE
5499
			doc.write();
5500
			doc.close();
5501
5502
			display = actualDisplay( nodeName, doc );
5503
			iframe.detach();
5504
		}
5505
5506
		// Store the correct default display
5507
		elemdisplay[ nodeName ] = display;
5508
	}
5509
5510
	return display;
5511
}
5512
var rmargin = (/^margin/);
5513
5514
var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
5515
5516
var getStyles = function( elem ) {
5517
		return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
5518
	};
5519
5520
5521
5522
function curCSS( elem, name, computed ) {
5523
	var width, minWidth, maxWidth, ret,
5524
		style = elem.style;
5525
5526
	computed = computed || getStyles( elem );
5527
5528
	// Support: IE9
5529
	// getPropertyValue is only needed for .css('filter') in IE9, see #12537
5530
	if ( computed ) {
5531
		ret = computed.getPropertyValue( name ) || computed[ name ];
5532
	}
5533
5534
	if ( computed ) {
5535
5536
		if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
5537
			ret = jQuery.style( elem, name );
5538
		}
5539
5540
		// Support: iOS < 6
5541
		// A tribute to the "awesome hack by Dean Edwards"
5542
		// iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
5543
		// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
5544
		if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
5545
5546
			// Remember the original values
5547
			width = style.width;
5548
			minWidth = style.minWidth;
5549
			maxWidth = style.maxWidth;
5550
5551
			// Put in the new values to get a computed value out
5552
			style.minWidth = style.maxWidth = style.width = ret;
5553
			ret = computed.width;
5554
5555
			// Revert the changed values
5556
			style.width = width;
5557
			style.minWidth = minWidth;
5558
			style.maxWidth = maxWidth;
5559
		}
5560
	}
5561
5562
	return ret !== undefined ?
5563
		// Support: IE
5564
		// IE returns zIndex value as an integer.
5565
		ret + "" :
5566
		ret;
5567
}
5568
5569
5570
function addGetHookIf( conditionFn, hookFn ) {
5571
	// Define the hook, we'll check on the first run if it's really needed.
5572
	return {
5573
		get: function() {
5574
			if ( conditionFn() ) {
5575
				// Hook not needed (or it's not possible to use it due to missing dependency),
5576
				// remove it.
5577
				// Since there are no other hooks for marginRight, remove the whole object.
5578
				delete this.get;
5579
				return;
5580
			}
5581
5582
			// Hook needed; redefine it so that the support test is not executed again.
5583
5584
			return (this.get = hookFn).apply( this, arguments );
5585
		}
5586
	};
5587
}
5588
5589
5590
(function() {
5591
	var pixelPositionVal, boxSizingReliableVal,
5592
		docElem = document.documentElement,
5593
		container = document.createElement( "div" ),
5594
		div = document.createElement( "div" );
5595
5596
	if ( !div.style ) {
5597
		return;
5598
	}
5599
5600
	div.style.backgroundClip = "content-box";
5601
	div.cloneNode( true ).style.backgroundClip = "";
5602
	support.clearCloneStyle = div.style.backgroundClip === "content-box";
5603
5604
	container.style.cssText = "border:0;width:0;height:0;top:0;left:-9999px;margin-top:1px;" +
5605
		"position:absolute";
5606
	container.appendChild( div );
5607
5608
	// Executing both pixelPosition & boxSizingReliable tests require only one layout
5609
	// so they're executed at the same time to save the second computation.
5610
	function computePixelPositionAndBoxSizingReliable() {
5611
		div.style.cssText =
5612
			// Support: Firefox<29, Android 2.3
5613
			// Vendor-prefix box-sizing
5614
			"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" +
5615
			"box-sizing:border-box;display:block;margin-top:1%;top:1%;" +
5616
			"border:1px;padding:1px;width:4px;position:absolute";
5617
		div.innerHTML = "";
5618
		docElem.appendChild( container );
5619
5620
		var divStyle = window.getComputedStyle( div, null );
5621
		pixelPositionVal = divStyle.top !== "1%";
5622
		boxSizingReliableVal = divStyle.width === "4px";
5623
5624
		docElem.removeChild( container );
5625
	}
5626
5627
	// Support: node.js jsdom
5628
	// Don't assume that getComputedStyle is a property of the global object
5629
	if ( window.getComputedStyle ) {
5630
		jQuery.extend( support, {
5631
			pixelPosition: function() {
5632
				// This test is executed only once but we still do memoizing
5633
				// since we can use the boxSizingReliable pre-computing.
5634
				// No need to check if the test was already performed, though.
5635
				computePixelPositionAndBoxSizingReliable();
5636
				return pixelPositionVal;
5637
			},
5638
			boxSizingReliable: function() {
5639
				if ( boxSizingReliableVal == null ) {
5640
					computePixelPositionAndBoxSizingReliable();
5641
				}
5642
				return boxSizingReliableVal;
5643
			},
5644
			reliableMarginRight: function() {
5645
				// Support: Android 2.3
5646
				// Check if div with explicit width and no margin-right incorrectly
5647
				// gets computed margin-right based on width of container. (#3333)
5648
				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
5649
				// This support function is only executed once so no memoizing is needed.
5650
				var ret,
5651
					marginDiv = div.appendChild( document.createElement( "div" ) );
5652
5653
				// Reset CSS: box-sizing; display; margin; border; padding
5654
				marginDiv.style.cssText = div.style.cssText =
5655
					// Support: Firefox<29, Android 2.3
5656
					// Vendor-prefix box-sizing
5657
					"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
5658
					"box-sizing:content-box;display:block;margin:0;border:0;padding:0";
5659
				marginDiv.style.marginRight = marginDiv.style.width = "0";
5660
				div.style.width = "1px";
5661
				docElem.appendChild( container );
5662
5663
				ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
5664
5665
				docElem.removeChild( container );
5666
5667
				return ret;
5668
			}
5669
		});
5670
	}
5671
})();
5672
5673
5674
// A method for quickly swapping in/out CSS properties to get correct calculations.
5675
jQuery.swap = function( elem, options, callback, args ) {
5676
	var ret, name,
5677
		old = {};
5678
5679
	// Remember the old values, and insert the new ones
5680
	for ( name in options ) {
5681
		old[ name ] = elem.style[ name ];
5682
		elem.style[ name ] = options[ name ];
5683
	}
5684
5685
	ret = callback.apply( elem, args || [] );
5686
5687
	// Revert the old values
5688
	for ( name in options ) {
5689
		elem.style[ name ] = old[ name ];
5690
	}
5691
5692
	return ret;
5693
};
5694
5695
5696
var
5697
	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
5698
	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
5699
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
5700
	rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),
5701
	rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),
5702
5703
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
5704
	cssNormalTransform = {
5705
		letterSpacing: "0",
5706
		fontWeight: "400"
5707
	},
5708
5709
	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
5710
5711
// return a css property mapped to a potentially vendor prefixed property
5712
function vendorPropName( style, name ) {
5713
5714
	// shortcut for names that are not vendor prefixed
5715
	if ( name in style ) {
5716
		return name;
5717
	}
5718
5719
	// check for vendor prefixed names
5720
	var capName = name[0].toUpperCase() + name.slice(1),
5721
		origName = name,
5722
		i = cssPrefixes.length;
5723
5724
	while ( i-- ) {
5725
		name = cssPrefixes[ i ] + capName;
5726
		if ( name in style ) {
5727
			return name;
5728
		}
5729
	}
5730
5731
	return origName;
5732
}
5733
5734
function setPositiveNumber( elem, value, subtract ) {
5735
	var matches = rnumsplit.exec( value );
5736
	return matches ?
5737
		// Guard against undefined "subtract", e.g., when used as in cssHooks
5738
		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
5739
		value;
5740
}
5741
5742 View Code Duplication
function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
5743
	var i = extra === ( isBorderBox ? "border" : "content" ) ?
5744
		// If we already have the right measurement, avoid augmentation
5745
		4 :
5746
		// Otherwise initialize for horizontal or vertical properties
5747
		name === "width" ? 1 : 0,
5748
5749
		val = 0;
5750
5751
	for ( ; i < 4; i += 2 ) {
5752
		// both box models exclude margin, so add it if we want it
5753
		if ( extra === "margin" ) {
5754
			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
5755
		}
5756
5757
		if ( isBorderBox ) {
5758
			// border-box includes padding, so remove it if we want content
5759
			if ( extra === "content" ) {
5760
				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
5761
			}
5762
5763
			// at this point, extra isn't border nor margin, so remove border
5764
			if ( extra !== "margin" ) {
5765
				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
5766
			}
5767
		} else {
5768
			// at this point, extra isn't content, so add padding
5769
			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
5770
5771
			// at this point, extra isn't content nor padding, so add border
5772
			if ( extra !== "padding" ) {
5773
				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
5774
			}
5775
		}
5776
	}
5777
5778
	return val;
5779
}
5780
5781
function getWidthOrHeight( elem, name, extra ) {
5782
5783
	// Start with offset property, which is equivalent to the border-box value
5784
	var valueIsBorderBox = true,
5785
		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
5786
		styles = getStyles( elem ),
5787
		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
5788
5789
	// some non-html elements return undefined for offsetWidth, so check for null/undefined
5790
	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
5791
	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
5792
	if ( val <= 0 || val == null ) {
5793
		// Fall back to computed then uncomputed css if necessary
5794
		val = curCSS( elem, name, styles );
5795
		if ( val < 0 || val == null ) {
5796
			val = elem.style[ name ];
5797
		}
5798
5799
		// Computed unit is not pixels. Stop here and return.
5800
		if ( rnumnonpx.test(val) ) {
5801
			return val;
5802
		}
5803
5804
		// we need the check for style in case a browser which returns unreliable values
5805
		// for getComputedStyle silently falls back to the reliable elem.style
5806
		valueIsBorderBox = isBorderBox &&
5807
			( support.boxSizingReliable() || val === elem.style[ name ] );
5808
5809
		// Normalize "", auto, and prepare for extra
5810
		val = parseFloat( val ) || 0;
5811
	}
5812
5813
	// use the active box-sizing model to add/subtract irrelevant styles
5814
	return ( val +
5815
		augmentWidthOrHeight(
5816
			elem,
5817
			name,
5818
			extra || ( isBorderBox ? "border" : "content" ),
5819
			valueIsBorderBox,
5820
			styles
5821
		)
5822
	) + "px";
5823
}
5824
5825
function showHide( elements, show ) {
5826
	var display, elem, hidden,
5827
		values = [],
5828
		index = 0,
5829
		length = elements.length;
5830
5831
	for ( ; index < length; index++ ) {
5832
		elem = elements[ index ];
5833
		if ( !elem.style ) {
5834
			continue;
5835
		}
5836
5837
		values[ index ] = data_priv.get( elem, "olddisplay" );
5838
		display = elem.style.display;
5839
		if ( show ) {
5840
			// Reset the inline display of this element to learn if it is
5841
			// being hidden by cascaded rules or not
5842
			if ( !values[ index ] && display === "none" ) {
5843
				elem.style.display = "";
5844
			}
5845
5846
			// Set elements which have been overridden with display: none
5847
			// in a stylesheet to whatever the default browser style is
5848
			// for such an element
5849
			if ( elem.style.display === "" && isHidden( elem ) ) {
5850
				values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );
5851
			}
5852
		} else {
5853
			hidden = isHidden( elem );
5854
5855
			if ( display !== "none" || !hidden ) {
5856
				data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
5857
			}
5858
		}
5859
	}
5860
5861
	// Set the display of most of the elements in a second loop
5862
	// to avoid the constant reflow
5863 View Code Duplication
	for ( index = 0; index < length; index++ ) {
5864
		elem = elements[ index ];
5865
		if ( !elem.style ) {
5866
			continue;
5867
		}
5868
		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
5869
			elem.style.display = show ? values[ index ] || "" : "none";
5870
		}
5871
	}
5872
5873
	return elements;
5874
}
5875
5876
jQuery.extend({
5877
	// Add in style property hooks for overriding the default
5878
	// behavior of getting and setting a style property
5879
	cssHooks: {
5880
		opacity: {
5881
			get: function( elem, computed ) {
5882
				if ( computed ) {
5883
					// We should always get a number back from opacity
5884
					var ret = curCSS( elem, "opacity" );
5885
					return ret === "" ? "1" : ret;
5886
				}
5887
			}
5888
		}
5889
	},
5890
5891
	// Don't automatically add "px" to these possibly-unitless properties
5892
	cssNumber: {
5893
		"columnCount": true,
5894
		"fillOpacity": true,
5895
		"flexGrow": true,
5896
		"flexShrink": true,
5897
		"fontWeight": true,
5898
		"lineHeight": true,
5899
		"opacity": true,
5900
		"order": true,
5901
		"orphans": true,
5902
		"widows": true,
5903
		"zIndex": true,
5904
		"zoom": true
5905
	},
5906
5907
	// Add in properties whose names you wish to fix before
5908
	// setting or getting the value
5909
	cssProps: {
5910
		// normalize float css property
5911
		"float": "cssFloat"
5912
	},
5913
5914
	// Get and set the style property on a DOM Node
5915
	style: function( elem, name, value, extra ) {
5916
		// Don't set styles on text and comment nodes
5917
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
5918
			return;
5919
		}
5920
5921
		// Make sure that we're working with the right name
5922
		var ret, type, hooks,
5923
			origName = jQuery.camelCase( name ),
5924
			style = elem.style;
5925
5926
		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
5927
5928
		// gets hook for the prefixed version
5929
		// followed by the unprefixed version
5930
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
5931
5932
		// Check if we're setting a value
5933
		if ( value !== undefined ) {
5934
			type = typeof value;
5935
5936
			// convert relative number strings (+= or -=) to relative numbers. #7345
5937
			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
5938
				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
5939
				// Fixes bug #9237
5940
				type = "number";
5941
			}
5942
5943
			// Make sure that null and NaN values aren't set. See: #7116
5944
			if ( value == null || value !== value ) {
5945
				return;
5946
			}
5947
5948
			// If a number was passed in, add 'px' to the (except for certain CSS properties)
5949
			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
5950
				value += "px";
5951
			}
5952
5953
			// Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
5954
			// but it would mean to define eight (for every problematic property) identical functions
5955
			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
5956
				style[ name ] = "inherit";
5957
			}
5958
5959
			// If a hook was provided, use that value, otherwise just set the specified value
5960
			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
5961
				style[ name ] = value;
5962
			}
5963
5964
		} else {
5965
			// If a hook was provided get the non-computed value from there
5966
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
5967
				return ret;
5968
			}
5969
5970
			// Otherwise just get the value from the style object
5971
			return style[ name ];
5972
		}
5973
	},
5974
5975
	css: function( elem, name, extra, styles ) {
5976
		var val, num, hooks,
5977
			origName = jQuery.camelCase( name );
5978
5979
		// Make sure that we're working with the right name
5980
		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
5981
5982
		// gets hook for the prefixed version
5983
		// followed by the unprefixed version
5984
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
5985
5986
		// If a hook was provided get the computed value from there
5987
		if ( hooks && "get" in hooks ) {
5988
			val = hooks.get( elem, true, extra );
5989
		}
5990
5991
		// Otherwise, if a way to get the computed value exists, use that
5992
		if ( val === undefined ) {
5993
			val = curCSS( elem, name, styles );
5994
		}
5995
5996
		//convert "normal" to computed value
5997
		if ( val === "normal" && name in cssNormalTransform ) {
5998
			val = cssNormalTransform[ name ];
5999
		}
6000
6001
		// Return, converting to number if forced or a qualifier was provided and val looks numeric
6002
		if ( extra === "" || extra ) {
6003
			num = parseFloat( val );
6004
			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
6005
		}
6006
		return val;
6007
	}
6008
});
6009
6010
jQuery.each([ "height", "width" ], function( i, name ) {
6011
	jQuery.cssHooks[ name ] = {
6012
		get: function( elem, computed, extra ) {
6013
			if ( computed ) {
6014
				// certain elements can have dimension info if we invisibly show them
6015
				// however, it must have a current display style that would benefit from this
6016
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) && elem.offsetWidth === 0 ?
6017
					jQuery.swap( elem, cssShow, function() {
6018
						return getWidthOrHeight( elem, name, extra );
6019
					}) :
6020
					getWidthOrHeight( elem, name, extra );
6021
			}
6022
		},
6023
6024
		set: function( elem, value, extra ) {
6025
			var styles = extra && getStyles( elem );
6026
			return setPositiveNumber( elem, value, extra ?
6027
				augmentWidthOrHeight(
6028
					elem,
6029
					name,
6030
					extra,
6031
					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
6032
					styles
6033
				) : 0
6034
			);
6035
		}
6036
	};
6037
});
6038
6039
// Support: Android 2.3
6040
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
6041
	function( elem, computed ) {
6042
		if ( computed ) {
6043
			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6044
			// Work around by temporarily setting element display to inline-block
6045
			return jQuery.swap( elem, { "display": "inline-block" },
6046
				curCSS, [ elem, "marginRight" ] );
6047
		}
6048
	}
6049
);
6050
6051
// These hooks are used by animate to expand properties
6052
jQuery.each({
6053
	margin: "",
6054
	padding: "",
6055
	border: "Width"
6056 View Code Duplication
}, function( prefix, suffix ) {
6057
	jQuery.cssHooks[ prefix + suffix ] = {
6058
		expand: function( value ) {
6059
			var i = 0,
6060
				expanded = {},
6061
6062
				// assumes a single number if not a string
6063
				parts = typeof value === "string" ? value.split(" ") : [ value ];
6064
6065
			for ( ; i < 4; i++ ) {
6066
				expanded[ prefix + cssExpand[ i ] + suffix ] =
6067
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
6068
			}
6069
6070
			return expanded;
6071
		}
6072
	};
6073
6074
	if ( !rmargin.test( prefix ) ) {
6075
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
6076
	}
6077
});
6078
6079
jQuery.fn.extend({
6080 View Code Duplication
	css: function( name, value ) {
6081
		return access( this, function( elem, name, value ) {
6082
			var styles, len,
6083
				map = {},
6084
				i = 0;
6085
6086
			if ( jQuery.isArray( name ) ) {
6087
				styles = getStyles( elem );
6088
				len = name.length;
6089
6090
				for ( ; i < len; i++ ) {
6091
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
6092
				}
6093
6094
				return map;
6095
			}
6096
6097
			return value !== undefined ?
6098
				jQuery.style( elem, name, value ) :
6099
				jQuery.css( elem, name );
6100
		}, name, value, arguments.length > 1 );
6101
	},
6102
	show: function() {
6103
		return showHide( this, true );
6104
	},
6105
	hide: function() {
6106
		return showHide( this );
6107
	},
6108
	toggle: function( state ) {
6109
		if ( typeof state === "boolean" ) {
6110
			return state ? this.show() : this.hide();
6111
		}
6112
6113
		return this.each(function() {
6114
			if ( isHidden( this ) ) {
6115
				jQuery( this ).show();
6116
			} else {
6117
				jQuery( this ).hide();
6118
			}
6119
		});
6120
	}
6121
});
6122
6123
6124
function Tween( elem, options, prop, end, easing ) {
6125
	return new Tween.prototype.init( elem, options, prop, end, easing );
6126
}
6127
jQuery.Tween = Tween;
6128
6129
Tween.prototype = {
6130
	constructor: Tween,
6131
	init: function( elem, options, prop, end, easing, unit ) {
6132
		this.elem = elem;
6133
		this.prop = prop;
6134
		this.easing = easing || "swing";
6135
		this.options = options;
6136
		this.start = this.now = this.cur();
6137
		this.end = end;
6138
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
6139
	},
6140
	cur: function() {
6141
		var hooks = Tween.propHooks[ this.prop ];
6142
6143
		return hooks && hooks.get ?
6144
			hooks.get( this ) :
6145
			Tween.propHooks._default.get( this );
6146
	},
6147 View Code Duplication
	run: function( percent ) {
6148
		var eased,
6149
			hooks = Tween.propHooks[ this.prop ];
6150
6151
		if ( this.options.duration ) {
6152
			this.pos = eased = jQuery.easing[ this.easing ](
6153
				percent, this.options.duration * percent, 0, 1, this.options.duration
6154
			);
6155
		} else {
6156
			this.pos = eased = percent;
6157
		}
6158
		this.now = ( this.end - this.start ) * eased + this.start;
6159
6160
		if ( this.options.step ) {
6161
			this.options.step.call( this.elem, this.now, this );
6162
		}
6163
6164
		if ( hooks && hooks.set ) {
6165
			hooks.set( this );
6166
		} else {
6167
			Tween.propHooks._default.set( this );
6168
		}
6169
		return this;
6170
	}
6171
};
6172
6173
Tween.prototype.init.prototype = Tween.prototype;
6174
6175
Tween.propHooks = {
6176
	_default: {
6177
		get: function( tween ) {
6178
			var result;
6179
6180
			if ( tween.elem[ tween.prop ] != null &&
6181
				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
6182
				return tween.elem[ tween.prop ];
6183
			}
6184
6185
			// passing an empty string as a 3rd parameter to .css will automatically
6186
			// attempt a parseFloat and fallback to a string if the parse fails
6187
			// so, simple values such as "10px" are parsed to Float.
6188
			// complex values such as "rotate(1rad)" are returned as is.
6189
			result = jQuery.css( tween.elem, tween.prop, "" );
6190
			// Empty strings, null, undefined and "auto" are converted to 0.
6191
			return !result || result === "auto" ? 0 : result;
6192
		},
6193
		set: function( tween ) {
6194
			// use step hook for back compat - use cssHook if its there - use .style if its
6195
			// available and use plain properties where available
6196
			if ( jQuery.fx.step[ tween.prop ] ) {
6197
				jQuery.fx.step[ tween.prop ]( tween );
6198
			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
6199
				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
6200
			} else {
6201
				tween.elem[ tween.prop ] = tween.now;
6202
			}
6203
		}
6204
	}
6205
};
6206
6207
// Support: IE9
6208
// Panic based approach to setting things on disconnected nodes
6209
6210
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
6211
	set: function( tween ) {
6212
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
6213
			tween.elem[ tween.prop ] = tween.now;
6214
		}
6215
	}
6216
};
6217
6218
jQuery.easing = {
6219
	linear: function( p ) {
6220
		return p;
6221
	},
6222
	swing: function( p ) {
6223
		return 0.5 - Math.cos( p * Math.PI ) / 2;
6224
	}
6225
};
6226
6227
jQuery.fx = Tween.prototype.init;
6228
6229
// Back Compat <1.8 extension point
6230
jQuery.fx.step = {};
6231
6232
6233
6234
6235
var
6236
	fxNow, timerId,
6237
	rfxtypes = /^(?:toggle|show|hide)$/,
6238
	rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),
6239
	rrun = /queueHooks$/,
6240
	animationPrefilters = [ defaultPrefilter ],
6241
	tweeners = {
6242
		"*": [ function( prop, value ) {
6243
			var tween = this.createTween( prop, value ),
6244
				target = tween.cur(),
6245
				parts = rfxnum.exec( value ),
6246
				unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
6247
6248
				// Starting value computation is required for potential unit mismatches
6249
				start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&
6250
					rfxnum.exec( jQuery.css( tween.elem, prop ) ),
6251
				scale = 1,
6252
				maxIterations = 20;
6253
6254
			if ( start && start[ 3 ] !== unit ) {
6255
				// Trust units reported by jQuery.css
6256
				unit = unit || start[ 3 ];
6257
6258
				// Make sure we update the tween properties later on
6259
				parts = parts || [];
6260
6261
				// Iteratively approximate from a nonzero starting point
6262
				start = +target || 1;
6263
6264
				do {
6265
					// If previous iteration zeroed out, double until we get *something*
6266
					// Use a string for doubling factor so we don't accidentally see scale as unchanged below
6267
					scale = scale || ".5";
6268
6269
					// Adjust and apply
6270
					start = start / scale;
6271
					jQuery.style( tween.elem, prop, start + unit );
6272
6273
				// Update scale, tolerating zero or NaN from tween.cur()
6274
				// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
6275
				} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
6276
			}
6277
6278
			// Update tween properties
6279
			if ( parts ) {
6280
				start = tween.start = +start || +target || 0;
6281
				tween.unit = unit;
6282
				// If a +=/-= token was provided, we're doing a relative animation
6283
				tween.end = parts[ 1 ] ?
6284
					start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
6285
					+parts[ 2 ];
6286
			}
6287
6288
			return tween;
6289
		} ]
6290
	};
6291
6292
// Animations created synchronously will run synchronously
6293
function createFxNow() {
6294
	setTimeout(function() {
6295
		fxNow = undefined;
6296
	});
6297
	return ( fxNow = jQuery.now() );
6298
}
6299
6300
// Generate parameters to create a standard animation
6301 View Code Duplication
function genFx( type, includeWidth ) {
6302
	var which,
6303
		i = 0,
6304
		attrs = { height: type };
6305
6306
	// if we include width, step value is 1 to do all cssExpand values,
6307
	// if we don't include width, step value is 2 to skip over Left and Right
6308
	includeWidth = includeWidth ? 1 : 0;
6309
	for ( ; i < 4 ; i += 2 - includeWidth ) {
6310
		which = cssExpand[ i ];
6311
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
6312
	}
6313
6314
	if ( includeWidth ) {
6315
		attrs.opacity = attrs.width = type;
6316
	}
6317
6318
	return attrs;
6319
}
6320
6321
function createTween( value, prop, animation ) {
6322
	var tween,
6323
		collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
6324
		index = 0,
6325
		length = collection.length;
6326
	for ( ; index < length; index++ ) {
6327
		if ( (tween = collection[ index ].call( animation, prop, value )) ) {
6328
6329
			// we're done with this property
6330
			return tween;
6331
		}
6332
	}
6333
}
6334
6335 View Code Duplication
function defaultPrefilter( elem, props, opts ) {
6336
	/* jshint validthis: true */
6337
	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
6338
		anim = this,
6339
		orig = {},
6340
		style = elem.style,
6341
		hidden = elem.nodeType && isHidden( elem ),
6342
		dataShow = data_priv.get( elem, "fxshow" );
6343
6344
	// handle queue: false promises
6345
	if ( !opts.queue ) {
6346
		hooks = jQuery._queueHooks( elem, "fx" );
6347
		if ( hooks.unqueued == null ) {
6348
			hooks.unqueued = 0;
6349
			oldfire = hooks.empty.fire;
6350
			hooks.empty.fire = function() {
6351
				if ( !hooks.unqueued ) {
6352
					oldfire();
6353
				}
6354
			};
6355
		}
6356
		hooks.unqueued++;
6357
6358
		anim.always(function() {
6359
			// doing this makes sure that the complete handler will be called
6360
			// before this completes
6361
			anim.always(function() {
6362
				hooks.unqueued--;
6363
				if ( !jQuery.queue( elem, "fx" ).length ) {
6364
					hooks.empty.fire();
6365
				}
6366
			});
6367
		});
6368
	}
6369
6370
	// height/width overflow pass
6371
	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
6372
		// Make sure that nothing sneaks out
6373
		// Record all 3 overflow attributes because IE9-10 do not
6374
		// change the overflow attribute when overflowX and
6375
		// overflowY are set to the same value
6376
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
6377
6378
		// Set display property to inline-block for height/width
6379
		// animations on inline elements that are having width/height animated
6380
		display = jQuery.css( elem, "display" );
6381
6382
		// Test default display if display is currently "none"
6383
		checkDisplay = display === "none" ?
6384
			data_priv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;
6385
6386
		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
6387
			style.display = "inline-block";
6388
		}
6389
	}
6390
6391
	if ( opts.overflow ) {
6392
		style.overflow = "hidden";
6393
		anim.always(function() {
6394
			style.overflow = opts.overflow[ 0 ];
6395
			style.overflowX = opts.overflow[ 1 ];
6396
			style.overflowY = opts.overflow[ 2 ];
6397
		});
6398
	}
6399
6400
	// show/hide pass
6401
	for ( prop in props ) {
6402
		value = props[ prop ];
6403
		if ( rfxtypes.exec( value ) ) {
6404
			delete props[ prop ];
6405
			toggle = toggle || value === "toggle";
6406
			if ( value === ( hidden ? "hide" : "show" ) ) {
6407
6408
				// 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
6409
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
6410
					hidden = true;
6411
				} else {
6412
					continue;
6413
				}
6414
			}
6415
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
6416
6417
		// Any non-fx value stops us from restoring the original display value
6418
		} else {
6419
			display = undefined;
6420
		}
6421
	}
6422
6423
	if ( !jQuery.isEmptyObject( orig ) ) {
6424
		if ( dataShow ) {
6425
			if ( "hidden" in dataShow ) {
6426
				hidden = dataShow.hidden;
6427
			}
6428
		} else {
6429
			dataShow = data_priv.access( elem, "fxshow", {} );
6430
		}
6431
6432
		// store state if its toggle - enables .stop().toggle() to "reverse"
6433
		if ( toggle ) {
6434
			dataShow.hidden = !hidden;
6435
		}
6436
		if ( hidden ) {
6437
			jQuery( elem ).show();
6438
		} else {
6439
			anim.done(function() {
6440
				jQuery( elem ).hide();
6441
			});
6442
		}
6443
		anim.done(function() {
6444
			var prop;
6445
6446
			data_priv.remove( elem, "fxshow" );
6447
			for ( prop in orig ) {
6448
				jQuery.style( elem, prop, orig[ prop ] );
6449
			}
6450
		});
6451
		for ( prop in orig ) {
6452
			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
6453
6454
			if ( !( prop in dataShow ) ) {
6455
				dataShow[ prop ] = tween.start;
6456
				if ( hidden ) {
6457
					tween.end = tween.start;
6458
					tween.start = prop === "width" || prop === "height" ? 1 : 0;
6459
				}
6460
			}
6461
		}
6462
6463
	// If this is a noop like .hide().hide(), restore an overwritten display value
6464
	} else if ( (display === "none" ? defaultDisplay( elem.nodeName ) : display) === "inline" ) {
6465
		style.display = display;
6466
	}
6467
}
6468
6469 View Code Duplication
function propFilter( props, specialEasing ) {
6470
	var index, name, easing, value, hooks;
6471
6472
	// camelCase, specialEasing and expand cssHook pass
6473
	for ( index in props ) {
6474
		name = jQuery.camelCase( index );
6475
		easing = specialEasing[ name ];
6476
		value = props[ index ];
6477
		if ( jQuery.isArray( value ) ) {
6478
			easing = value[ 1 ];
6479
			value = props[ index ] = value[ 0 ];
6480
		}
6481
6482
		if ( index !== name ) {
6483
			props[ name ] = value;
6484
			delete props[ index ];
6485
		}
6486
6487
		hooks = jQuery.cssHooks[ name ];
6488
		if ( hooks && "expand" in hooks ) {
6489
			value = hooks.expand( value );
6490
			delete props[ name ];
6491
6492
			// not quite $.extend, this wont overwrite keys already present.
6493
			// also - reusing 'index' from above because we have the correct "name"
6494
			for ( index in value ) {
6495
				if ( !( index in props ) ) {
6496
					props[ index ] = value[ index ];
6497
					specialEasing[ index ] = easing;
6498
				}
6499
			}
6500
		} else {
6501
			specialEasing[ name ] = easing;
6502
		}
6503
	}
6504
}
6505
6506
function Animation( elem, properties, options ) {
6507
	var result,
6508
		stopped,
6509
		index = 0,
6510
		length = animationPrefilters.length,
6511
		deferred = jQuery.Deferred().always( function() {
6512
			// don't match elem in the :animated selector
6513
			delete tick.elem;
6514
		}),
6515
		tick = function() {
6516
			if ( stopped ) {
6517
				return false;
6518
			}
6519
			var currentTime = fxNow || createFxNow(),
6520
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
6521
				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
6522
				temp = remaining / animation.duration || 0,
6523
				percent = 1 - temp,
6524
				index = 0,
6525
				length = animation.tweens.length;
6526
6527
			for ( ; index < length ; index++ ) {
6528
				animation.tweens[ index ].run( percent );
6529
			}
6530
6531
			deferred.notifyWith( elem, [ animation, percent, remaining ]);
6532
6533
			if ( percent < 1 && length ) {
6534
				return remaining;
6535
			} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
6536
				deferred.resolveWith( elem, [ animation ] );
6537
				return false;
6538
			}
6539
		},
6540
		animation = deferred.promise({
6541
			elem: elem,
6542
			props: jQuery.extend( {}, properties ),
6543
			opts: jQuery.extend( true, { specialEasing: {} }, options ),
6544
			originalProperties: properties,
6545
			originalOptions: options,
6546
			startTime: fxNow || createFxNow(),
6547
			duration: options.duration,
6548
			tweens: [],
6549
			createTween: function( prop, end ) {
6550
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
6551
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
6552
				animation.tweens.push( tween );
6553
				return tween;
6554
			},
6555
			stop: function( gotoEnd ) {
6556
				var index = 0,
6557
					// if we are going to the end, we want to run all the tweens
6558
					// otherwise we skip this part
6559
					length = gotoEnd ? animation.tweens.length : 0;
6560
				if ( stopped ) {
6561
					return this;
6562
				}
6563
				stopped = true;
6564
				for ( ; index < length ; index++ ) {
6565
					animation.tweens[ index ].run( 1 );
6566
				}
6567
6568
				// resolve when we played the last frame
6569
				// otherwise, reject
6570
				if ( gotoEnd ) {
6571
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
6572
				} else {
6573
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
6574
				}
6575
				return this;
6576
			}
6577
		}),
6578
		props = animation.props;
6579
6580
	propFilter( props, animation.opts.specialEasing );
6581
6582
	for ( ; index < length ; index++ ) {
6583
		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
6584
		if ( result ) {
6585
			return result;
6586
		}
6587
	}
6588
6589
	jQuery.map( props, createTween, animation );
6590
6591
	if ( jQuery.isFunction( animation.opts.start ) ) {
6592
		animation.opts.start.call( elem, animation );
6593
	}
6594
6595
	jQuery.fx.timer(
6596
		jQuery.extend( tick, {
6597
			elem: elem,
6598
			anim: animation,
6599
			queue: animation.opts.queue
6600
		})
6601
	);
6602
6603
	// attach callbacks from options
6604
	return animation.progress( animation.opts.progress )
6605
		.done( animation.opts.done, animation.opts.complete )
6606
		.fail( animation.opts.fail )
6607
		.always( animation.opts.always );
6608
}
6609
6610
jQuery.Animation = jQuery.extend( Animation, {
6611
6612
	tweener: function( props, callback ) {
6613
		if ( jQuery.isFunction( props ) ) {
6614
			callback = props;
6615
			props = [ "*" ];
6616
		} else {
6617
			props = props.split(" ");
6618
		}
6619
6620
		var prop,
6621
			index = 0,
6622
			length = props.length;
6623
6624
		for ( ; index < length ; index++ ) {
6625
			prop = props[ index ];
6626
			tweeners[ prop ] = tweeners[ prop ] || [];
6627
			tweeners[ prop ].unshift( callback );
6628
		}
6629
	},
6630
6631
	prefilter: function( callback, prepend ) {
6632
		if ( prepend ) {
6633
			animationPrefilters.unshift( callback );
6634
		} else {
6635
			animationPrefilters.push( callback );
6636
		}
6637
	}
6638
});
6639
6640 View Code Duplication
jQuery.speed = function( speed, easing, fn ) {
6641
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
6642
		complete: fn || !fn && easing ||
6643
			jQuery.isFunction( speed ) && speed,
6644
		duration: speed,
6645
		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
6646
	};
6647
6648
	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
6649
		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
6650
6651
	// normalize opt.queue - true/undefined/null -> "fx"
6652
	if ( opt.queue == null || opt.queue === true ) {
6653
		opt.queue = "fx";
6654
	}
6655
6656
	// Queueing
6657
	opt.old = opt.complete;
6658
6659
	opt.complete = function() {
6660
		if ( jQuery.isFunction( opt.old ) ) {
6661
			opt.old.call( this );
6662
		}
6663
6664
		if ( opt.queue ) {
6665
			jQuery.dequeue( this, opt.queue );
6666
		}
6667
	};
6668
6669
	return opt;
6670
};
6671
6672
jQuery.fn.extend({
6673
	fadeTo: function( speed, to, easing, callback ) {
6674
6675
		// show any hidden elements after setting opacity to 0
6676
		return this.filter( isHidden ).css( "opacity", 0 ).show()
6677
6678
			// animate to the value specified
6679
			.end().animate({ opacity: to }, speed, easing, callback );
6680
	},
6681
	animate: function( prop, speed, easing, callback ) {
6682
		var empty = jQuery.isEmptyObject( prop ),
6683
			optall = jQuery.speed( speed, easing, callback ),
6684
			doAnimation = function() {
6685
				// Operate on a copy of prop so per-property easing won't be lost
6686
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
6687
6688
				// Empty animations, or finishing resolves immediately
6689
				if ( empty || data_priv.get( this, "finish" ) ) {
6690
					anim.stop( true );
6691
				}
6692
			};
6693
			doAnimation.finish = doAnimation;
6694
6695
		return empty || optall.queue === false ?
6696
			this.each( doAnimation ) :
6697
			this.queue( optall.queue, doAnimation );
6698
	},
6699
	stop: function( type, clearQueue, gotoEnd ) {
6700
		var stopQueue = function( hooks ) {
6701
			var stop = hooks.stop;
6702
			delete hooks.stop;
6703
			stop( gotoEnd );
6704
		};
6705
6706
		if ( typeof type !== "string" ) {
6707
			gotoEnd = clearQueue;
6708
			clearQueue = type;
6709
			type = undefined;
6710
		}
6711
		if ( clearQueue && type !== false ) {
6712
			this.queue( type || "fx", [] );
6713
		}
6714
6715
		return this.each(function() {
6716
			var dequeue = true,
6717
				index = type != null && type + "queueHooks",
6718
				timers = jQuery.timers,
6719
				data = data_priv.get( this );
6720
6721
			if ( index ) {
6722
				if ( data[ index ] && data[ index ].stop ) {
6723
					stopQueue( data[ index ] );
6724
				}
6725
			} else {
6726
				for ( index in data ) {
6727
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
6728
						stopQueue( data[ index ] );
6729
					}
6730
				}
6731
			}
6732
6733
			for ( index = timers.length; index--; ) {
6734
				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
6735
					timers[ index ].anim.stop( gotoEnd );
6736
					dequeue = false;
6737
					timers.splice( index, 1 );
6738
				}
6739
			}
6740
6741
			// start the next in the queue if the last step wasn't forced
6742
			// timers currently will call their complete callbacks, which will dequeue
6743
			// but only if they were gotoEnd
6744
			if ( dequeue || !gotoEnd ) {
6745
				jQuery.dequeue( this, type );
6746
			}
6747
		});
6748
	},
6749
	finish: function( type ) {
6750
		if ( type !== false ) {
6751
			type = type || "fx";
6752
		}
6753
		return this.each(function() {
6754
			var index,
6755
				data = data_priv.get( this ),
6756
				queue = data[ type + "queue" ],
6757
				hooks = data[ type + "queueHooks" ],
6758
				timers = jQuery.timers,
6759
				length = queue ? queue.length : 0;
6760
6761
			// enable finishing flag on private data
6762
			data.finish = true;
6763
6764
			// empty the queue first
6765
			jQuery.queue( this, type, [] );
6766
6767
			if ( hooks && hooks.stop ) {
6768
				hooks.stop.call( this, true );
6769
			}
6770
6771
			// look for any active animations, and finish them
6772
			for ( index = timers.length; index--; ) {
6773
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
6774
					timers[ index ].anim.stop( true );
6775
					timers.splice( index, 1 );
6776
				}
6777
			}
6778
6779
			// look for any animations in the old queue and finish them
6780
			for ( index = 0; index < length; index++ ) {
6781
				if ( queue[ index ] && queue[ index ].finish ) {
6782
					queue[ index ].finish.call( this );
6783
				}
6784
			}
6785
6786
			// turn off finishing flag
6787
			delete data.finish;
6788
		});
6789
	}
6790
});
6791
6792
jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
6793
	var cssFn = jQuery.fn[ name ];
6794
	jQuery.fn[ name ] = function( speed, easing, callback ) {
6795
		return speed == null || typeof speed === "boolean" ?
6796
			cssFn.apply( this, arguments ) :
6797
			this.animate( genFx( name, true ), speed, easing, callback );
6798
	};
6799
});
6800
6801
// Generate shortcuts for custom animations
6802
jQuery.each({
6803
	slideDown: genFx("show"),
6804
	slideUp: genFx("hide"),
6805
	slideToggle: genFx("toggle"),
6806
	fadeIn: { opacity: "show" },
6807
	fadeOut: { opacity: "hide" },
6808
	fadeToggle: { opacity: "toggle" }
6809
}, function( name, props ) {
6810
	jQuery.fn[ name ] = function( speed, easing, callback ) {
6811
		return this.animate( props, speed, easing, callback );
6812
	};
6813
});
6814
6815
jQuery.timers = [];
6816
jQuery.fx.tick = function() {
6817
	var timer,
6818
		i = 0,
6819
		timers = jQuery.timers;
6820
6821
	fxNow = jQuery.now();
6822
6823
	for ( ; i < timers.length; i++ ) {
6824
		timer = timers[ i ];
6825
		// Checks the timer has not already been removed
6826
		if ( !timer() && timers[ i ] === timer ) {
6827
			timers.splice( i--, 1 );
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable i here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
6828
		}
6829
	}
6830
6831
	if ( !timers.length ) {
6832
		jQuery.fx.stop();
6833
	}
6834
	fxNow = undefined;
6835
};
6836
6837
jQuery.fx.timer = function( timer ) {
6838
	jQuery.timers.push( timer );
6839
	if ( timer() ) {
6840
		jQuery.fx.start();
6841
	} else {
6842
		jQuery.timers.pop();
6843
	}
6844
};
6845
6846
jQuery.fx.interval = 13;
6847
6848
jQuery.fx.start = function() {
6849
	if ( !timerId ) {
6850
		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
6851
	}
6852
};
6853
6854
jQuery.fx.stop = function() {
6855
	clearInterval( timerId );
6856
	timerId = null;
6857
};
6858
6859
jQuery.fx.speeds = {
6860
	slow: 600,
6861
	fast: 200,
6862
	// Default speed
6863
	_default: 400
6864
};
6865
6866
6867
// Based off of the plugin by Clint Helfers, with permission.
6868
// http://blindsignals.com/index.php/2009/07/jquery-delay/
6869
jQuery.fn.delay = function( time, type ) {
6870
	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
6871
	type = type || "fx";
6872
6873
	return this.queue( type, function( next, hooks ) {
6874
		var timeout = setTimeout( next, time );
6875
		hooks.stop = function() {
6876
			clearTimeout( timeout );
6877
		};
6878
	});
6879
};
6880
6881
6882
(function() {
6883
	var input = document.createElement( "input" ),
6884
		select = document.createElement( "select" ),
6885
		opt = select.appendChild( document.createElement( "option" ) );
6886
6887
	input.type = "checkbox";
6888
6889
	// Support: iOS 5.1, Android 4.x, Android 2.3
6890
	// Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)
6891
	support.checkOn = input.value !== "";
6892
6893
	// Must access the parent to make an option select properly
6894
	// Support: IE9, IE10
6895
	support.optSelected = opt.selected;
6896
6897
	// Make sure that the options inside disabled selects aren't marked as disabled
6898
	// (WebKit marks them as disabled)
6899
	select.disabled = true;
6900
	support.optDisabled = !opt.disabled;
6901
6902
	// Check if an input maintains its value after becoming a radio
6903
	// Support: IE9, IE10
6904
	input = document.createElement( "input" );
6905
	input.value = "t";
6906
	input.type = "radio";
6907
	support.radioValue = input.value === "t";
6908
})();
6909
6910
6911
var nodeHook, boolHook,
6912
	attrHandle = jQuery.expr.attrHandle;
6913
6914
jQuery.fn.extend({
6915
	attr: function( name, value ) {
6916
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
6917
	},
6918
6919
	removeAttr: function( name ) {
6920
		return this.each(function() {
6921
			jQuery.removeAttr( this, name );
6922
		});
6923
	}
6924
});
6925
6926
jQuery.extend({
6927 View Code Duplication
	attr: function( elem, name, value ) {
6928
		var hooks, ret,
6929
			nType = elem.nodeType;
6930
6931
		// don't get/set attributes on text, comment and attribute nodes
6932
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
6933
			return;
6934
		}
6935
6936
		// Fallback to prop when attributes are not supported
6937
		if ( typeof elem.getAttribute === strundefined ) {
6938
			return jQuery.prop( elem, name, value );
6939
		}
6940
6941
		// All attributes are lowercase
6942
		// Grab necessary hook if one is defined
6943
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
6944
			name = name.toLowerCase();
6945
			hooks = jQuery.attrHooks[ name ] ||
6946
				( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
0 ignored issues
show
Bug introduced by
The variable nodeHook seems to be never initialized.
Loading history...
6947
		}
6948
6949
		if ( value !== undefined ) {
6950
6951
			if ( value === null ) {
6952
				jQuery.removeAttr( elem, name );
6953
6954
			} else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
6955
				return ret;
6956
6957
			} else {
6958
				elem.setAttribute( name, value + "" );
6959
				return value;
6960
			}
6961
6962
		} else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
6963
			return ret;
6964
6965
		} else {
6966
			ret = jQuery.find.attr( elem, name );
6967
6968
			// Non-existent attributes return null, we normalize to undefined
6969
			return ret == null ?
6970
				undefined :
6971
				ret;
6972
		}
6973
	},
6974
6975
	removeAttr: function( elem, value ) {
6976
		var name, propName,
6977
			i = 0,
6978
			attrNames = value && value.match( rnotwhite );
6979
6980
		if ( attrNames && elem.nodeType === 1 ) {
6981
			while ( (name = attrNames[i++]) ) {
6982
				propName = jQuery.propFix[ name ] || name;
6983
6984
				// Boolean attributes get special treatment (#10870)
6985
				if ( jQuery.expr.match.bool.test( name ) ) {
6986
					// Set corresponding property to false
6987
					elem[ propName ] = false;
6988
				}
6989
6990
				elem.removeAttribute( name );
6991
			}
6992
		}
6993
	},
6994
6995
	attrHooks: {
6996
		type: {
6997
			set: function( elem, value ) {
6998
				if ( !support.radioValue && value === "radio" &&
6999
					jQuery.nodeName( elem, "input" ) ) {
7000
					// Setting the type on a radio button after the value resets the value in IE6-9
7001
					// Reset value to default in case type is set after value during creation
7002
					var val = elem.value;
7003
					elem.setAttribute( "type", value );
7004
					if ( val ) {
7005
						elem.value = val;
7006
					}
7007
					return value;
7008
				}
7009
			}
7010
		}
7011
	}
7012
});
7013
7014
// Hooks for boolean attributes
7015
boolHook = {
7016
	set: function( elem, value, name ) {
7017
		if ( value === false ) {
7018
			// Remove boolean attributes when set to false
7019
			jQuery.removeAttr( elem, name );
7020
		} else {
7021
			elem.setAttribute( name, name );
7022
		}
7023
		return name;
7024
	}
7025
};
7026
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
7027
	var getter = attrHandle[ name ] || jQuery.find.attr;
7028
7029
	attrHandle[ name ] = function( elem, name, isXML ) {
7030
		var ret, handle;
7031
		if ( !isXML ) {
7032
			// Avoid an infinite loop by temporarily removing this function from the getter
7033
			handle = attrHandle[ name ];
7034
			attrHandle[ name ] = ret;
0 ignored issues
show
Bug introduced by
The variable ret seems to be never initialized.
Loading history...
7035
			ret = getter( elem, name, isXML ) != null ?
7036
				name.toLowerCase() :
7037
				null;
7038
			attrHandle[ name ] = handle;
7039
		}
7040
		return ret;
7041
	};
7042
});
7043
7044
7045
7046
7047
var rfocusable = /^(?:input|select|textarea|button)$/i;
7048
7049
jQuery.fn.extend({
7050
	prop: function( name, value ) {
7051
		return access( this, jQuery.prop, name, value, arguments.length > 1 );
7052
	},
7053
7054
	removeProp: function( name ) {
7055
		return this.each(function() {
7056
			delete this[ jQuery.propFix[ name ] || name ];
7057
		});
7058
	}
7059
});
7060
7061
jQuery.extend({
7062
	propFix: {
7063
		"for": "htmlFor",
7064
		"class": "className"
7065
	},
7066
7067 View Code Duplication
	prop: function( elem, name, value ) {
7068
		var ret, hooks, notxml,
7069
			nType = elem.nodeType;
7070
7071
		// don't get/set properties on text, comment and attribute nodes
7072
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
7073
			return;
7074
		}
7075
7076
		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
7077
7078
		if ( notxml ) {
7079
			// Fix name and attach hooks
7080
			name = jQuery.propFix[ name ] || name;
7081
			hooks = jQuery.propHooks[ name ];
7082
		}
7083
7084
		if ( value !== undefined ) {
7085
			return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
7086
				ret :
7087
				( elem[ name ] = value );
7088
7089
		} else {
0 ignored issues
show
Comprehensibility introduced by
else is not necessary here since all if branches return, consider removing it to reduce nesting and make code more readable.
Loading history...
7090
			return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?
7091
				ret :
7092
				elem[ name ];
7093
		}
7094
	},
7095
7096
	propHooks: {
7097
		tabIndex: {
7098
			get: function( elem ) {
7099
				return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
7100
					elem.tabIndex :
7101
					-1;
7102
			}
7103
		}
7104
	}
7105
});
7106
7107
// Support: IE9+
7108
// Selectedness for an option in an optgroup can be inaccurate
7109
if ( !support.optSelected ) {
7110
	jQuery.propHooks.selected = {
7111
		get: function( elem ) {
7112
			var parent = elem.parentNode;
7113
			if ( parent && parent.parentNode ) {
7114
				parent.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.parentNode.selectedIndex is not used.
Loading history...
7115
			}
7116
			return null;
7117
		}
7118
	};
7119
}
7120
7121
jQuery.each([
7122
	"tabIndex",
7123
	"readOnly",
7124
	"maxLength",
7125
	"cellSpacing",
7126
	"cellPadding",
7127
	"rowSpan",
7128
	"colSpan",
7129
	"useMap",
7130
	"frameBorder",
7131
	"contentEditable"
7132
], function() {
7133
	jQuery.propFix[ this.toLowerCase() ] = this;
7134
});
7135
7136
7137
7138
7139
var rclass = /[\t\r\n\f]/g;
7140
7141
jQuery.fn.extend({
7142
	addClass: function( value ) {
7143
		var classes, elem, cur, clazz, j, finalValue,
7144
			proceed = typeof value === "string" && value,
7145
			i = 0,
7146
			len = this.length;
7147
7148
		if ( jQuery.isFunction( value ) ) {
7149
			return this.each(function( j ) {
7150
				jQuery( this ).addClass( value.call( this, j, this.className ) );
7151
			});
7152
		}
7153
7154 View Code Duplication
		if ( proceed ) {
7155
			// The disjunction here is for better compressibility (see removeClass)
7156
			classes = ( value || "" ).match( rnotwhite ) || [];
7157
7158
			for ( ; i < len; i++ ) {
7159
				elem = this[ i ];
7160
				cur = elem.nodeType === 1 && ( elem.className ?
7161
					( " " + elem.className + " " ).replace( rclass, " " ) :
7162
					" "
7163
				);
7164
7165
				if ( cur ) {
7166
					j = 0;
7167
					while ( (clazz = classes[j++]) ) {
7168
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
7169
							cur += clazz + " ";
7170
						}
7171
					}
7172
7173
					// only assign if different to avoid unneeded rendering.
7174
					finalValue = jQuery.trim( cur );
7175
					if ( elem.className !== finalValue ) {
7176
						elem.className = finalValue;
7177
					}
7178
				}
7179
			}
7180
		}
7181
7182
		return this;
7183
	},
7184
7185
	removeClass: function( value ) {
7186
		var classes, elem, cur, clazz, j, finalValue,
7187
			proceed = arguments.length === 0 || typeof value === "string" && value,
7188
			i = 0,
7189
			len = this.length;
7190
7191
		if ( jQuery.isFunction( value ) ) {
7192
			return this.each(function( j ) {
7193
				jQuery( this ).removeClass( value.call( this, j, this.className ) );
7194
			});
7195
		}
7196 View Code Duplication
		if ( proceed ) {
7197
			classes = ( value || "" ).match( rnotwhite ) || [];
7198
7199
			for ( ; i < len; i++ ) {
7200
				elem = this[ i ];
7201
				// This expression is here for better compressibility (see addClass)
7202
				cur = elem.nodeType === 1 && ( elem.className ?
7203
					( " " + elem.className + " " ).replace( rclass, " " ) :
7204
					""
7205
				);
7206
7207
				if ( cur ) {
7208
					j = 0;
7209
					while ( (clazz = classes[j++]) ) {
7210
						// Remove *all* instances
7211
						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
7212
							cur = cur.replace( " " + clazz + " ", " " );
7213
						}
7214
					}
7215
7216
					// only assign if different to avoid unneeded rendering.
7217
					finalValue = value ? jQuery.trim( cur ) : "";
7218
					if ( elem.className !== finalValue ) {
7219
						elem.className = finalValue;
7220
					}
7221
				}
7222
			}
7223
		}
7224
7225
		return this;
7226
	},
7227
7228
	toggleClass: function( value, stateVal ) {
7229
		var type = typeof value;
7230
7231
		if ( typeof stateVal === "boolean" && type === "string" ) {
7232
			return stateVal ? this.addClass( value ) : this.removeClass( value );
7233
		}
7234
7235
		if ( jQuery.isFunction( value ) ) {
7236
			return this.each(function( i ) {
7237
				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
7238
			});
7239
		}
7240
7241
		return this.each(function() {
7242
			if ( type === "string" ) {
7243
				// toggle individual class names
7244
				var className,
7245
					i = 0,
7246
					self = jQuery( this ),
7247
					classNames = value.match( rnotwhite ) || [];
7248
7249
				while ( (className = classNames[ i++ ]) ) {
7250
					// check each className given, space separated list
7251
					if ( self.hasClass( className ) ) {
7252
						self.removeClass( className );
7253
					} else {
7254
						self.addClass( className );
7255
					}
7256
				}
7257
7258
			// Toggle whole class name
7259
			} else if ( type === strundefined || type === "boolean" ) {
7260
				if ( this.className ) {
7261
					// store className if set
7262
					data_priv.set( this, "__className__", this.className );
7263
				}
7264
7265
				// If the element has a class name or if we're passed "false",
7266
				// then remove the whole classname (if there was one, the above saved it).
7267
				// Otherwise bring back whatever was previously saved (if anything),
7268
				// falling back to the empty string if nothing was stored.
7269
				this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";
7270
			}
7271
		});
7272
	},
7273
7274
	hasClass: function( selector ) {
7275
		var className = " " + selector + " ",
7276
			i = 0,
7277
			l = this.length;
7278
		for ( ; i < l; i++ ) {
7279
			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
7280
				return true;
7281
			}
7282
		}
7283
7284
		return false;
7285
	}
7286
});
7287
7288
7289
7290
7291
var rreturn = /\r/g;
7292
7293
jQuery.fn.extend({
7294 View Code Duplication
	val: function( value ) {
7295
		var hooks, ret, isFunction,
7296
			elem = this[0];
7297
7298
		if ( !arguments.length ) {
7299
			if ( elem ) {
7300
				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
7301
7302
				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
7303
					return ret;
7304
				}
7305
7306
				ret = elem.value;
7307
7308
				return typeof ret === "string" ?
7309
					// handle most common string cases
7310
					ret.replace(rreturn, "") :
7311
					// handle cases where value is null/undef or number
7312
					ret == null ? "" : ret;
7313
			}
7314
7315
			return;
7316
		}
7317
7318
		isFunction = jQuery.isFunction( value );
7319
7320
		return this.each(function( i ) {
7321
			var val;
7322
7323
			if ( this.nodeType !== 1 ) {
7324
				return;
7325
			}
7326
7327
			if ( isFunction ) {
7328
				val = value.call( this, i, jQuery( this ).val() );
7329
			} else {
7330
				val = value;
7331
			}
7332
7333
			// Treat null/undefined as ""; convert numbers to string
7334
			if ( val == null ) {
7335
				val = "";
7336
7337
			} else if ( typeof val === "number" ) {
7338
				val += "";
7339
7340
			} else if ( jQuery.isArray( val ) ) {
7341
				val = jQuery.map( val, function( value ) {
7342
					return value == null ? "" : value + "";
7343
				});
7344
			}
7345
7346
			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
7347
7348
			// If set returns undefined, fall back to normal setting
7349
			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
7350
				this.value = val;
7351
			}
7352
		});
7353
	}
7354
});
7355
7356
jQuery.extend({
7357
	valHooks: {
7358
		option: {
7359
			get: function( elem ) {
7360
				var val = jQuery.find.attr( elem, "value" );
7361
				return val != null ?
7362
					val :
7363
					// Support: IE10-11+
7364
					// option.text throws exceptions (#14686, #14858)
7365
					jQuery.trim( jQuery.text( elem ) );
7366
			}
7367
		},
7368
		select: {
7369 View Code Duplication
			get: function( elem ) {
7370
				var value, option,
7371
					options = elem.options,
7372
					index = elem.selectedIndex,
7373
					one = elem.type === "select-one" || index < 0,
7374
					values = one ? null : [],
7375
					max = one ? index + 1 : options.length,
7376
					i = index < 0 ?
7377
						max :
7378
						one ? index : 0;
7379
7380
				// Loop through all the selected options
7381
				for ( ; i < max; i++ ) {
7382
					option = options[ i ];
7383
7384
					// IE6-9 doesn't update selected after form reset (#2551)
7385
					if ( ( option.selected || i === index ) &&
7386
							// Don't return options that are disabled or in a disabled optgroup
7387
							( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&
7388
							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
7389
7390
						// Get the specific value for the option
7391
						value = jQuery( option ).val();
7392
7393
						// We don't need an array for one selects
7394
						if ( one ) {
7395
							return value;
7396
						}
7397
7398
						// Multi-Selects return an array
7399
						values.push( value );
7400
					}
7401
				}
7402
7403
				return values;
7404
			},
7405
7406
			set: function( elem, value ) {
7407
				var optionSet, option,
7408
					options = elem.options,
7409
					values = jQuery.makeArray( value ),
7410
					i = options.length;
7411
7412
				while ( i-- ) {
7413
					option = options[ i ];
7414
					if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
7415
						optionSet = true;
7416
					}
7417
				}
7418
7419
				// force browsers to behave consistently when non-matching value is set
7420
				if ( !optionSet ) {
7421
					elem.selectedIndex = -1;
7422
				}
7423
				return values;
7424
			}
7425
		}
7426
	}
7427
});
7428
7429
// Radios and checkboxes getter/setter
7430
jQuery.each([ "radio", "checkbox" ], function() {
7431
	jQuery.valHooks[ this ] = {
7432
		set: function( elem, value ) {
7433
			if ( jQuery.isArray( value ) ) {
7434
				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
7435
			}
7436
		}
7437
	};
7438
	if ( !support.checkOn ) {
7439
		jQuery.valHooks[ this ].get = function( elem ) {
7440
			// Support: Webkit
7441
			// "" is returned instead of "on" if a value isn't specified
7442
			return elem.getAttribute("value") === null ? "on" : elem.value;
7443
		};
7444
	}
7445
});
7446
7447
7448
7449
7450
// Return jQuery for attributes-only inclusion
7451
7452
7453
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
7454
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
7455
	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
7456
7457
	// Handle event binding
7458
	jQuery.fn[ name ] = function( data, fn ) {
7459
		return arguments.length > 0 ?
7460
			this.on( name, null, data, fn ) :
7461
			this.trigger( name );
7462
	};
7463
});
7464
7465
jQuery.fn.extend({
7466
	hover: function( fnOver, fnOut ) {
7467
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
7468
	},
7469
7470
	bind: function( types, data, fn ) {
7471
		return this.on( types, null, data, fn );
7472
	},
7473
	unbind: function( types, fn ) {
7474
		return this.off( types, null, fn );
7475
	},
7476
7477
	delegate: function( selector, types, data, fn ) {
7478
		return this.on( types, selector, data, fn );
7479
	},
7480
	undelegate: function( selector, types, fn ) {
7481
		// ( namespace ) or ( selector, types [, fn] )
7482
		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
7483
	}
7484
});
7485
7486
7487
var nonce = jQuery.now();
7488
7489
var rquery = (/\?/);
7490
7491
7492
7493
// Support: Android 2.3
7494
// Workaround failure to string-cast null input
7495
jQuery.parseJSON = function( data ) {
7496
	return JSON.parse( data + "" );
7497
};
7498
7499
7500
// Cross-browser xml parsing
7501
jQuery.parseXML = function( data ) {
7502
	var xml, tmp;
7503
	if ( !data || typeof data !== "string" ) {
7504
		return null;
7505
	}
7506
7507
	// Support: IE9
7508
	try {
7509
		tmp = new DOMParser();
7510
		xml = tmp.parseFromString( data, "text/xml" );
7511
	} catch ( e ) {
7512
		xml = undefined;
7513
	}
7514
7515
	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
7516
		jQuery.error( "Invalid XML: " + data );
7517
	}
7518
	return xml;
7519
};
7520
7521
7522
var
7523
	// Document location
7524
	ajaxLocParts,
7525
	ajaxLocation,
7526
7527
	rhash = /#.*$/,
7528
	rts = /([?&])_=[^&]*/,
7529
	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
7530
	// #7653, #8125, #8152: local protocol detection
7531
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
7532
	rnoContent = /^(?:GET|HEAD)$/,
7533
	rprotocol = /^\/\//,
7534
	rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
7535
7536
	/* Prefilters
7537
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
7538
	 * 2) These are called:
7539
	 *    - BEFORE asking for a transport
7540
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
7541
	 * 3) key is the dataType
7542
	 * 4) the catchall symbol "*" can be used
7543
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
7544
	 */
7545
	prefilters = {},
7546
7547
	/* Transports bindings
7548
	 * 1) key is the dataType
7549
	 * 2) the catchall symbol "*" can be used
7550
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
7551
	 */
7552
	transports = {},
7553
7554
	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
7555
	allTypes = "*/".concat("*");
7556
7557
// #8138, IE may throw an exception when accessing
7558
// a field from window.location if document.domain has been set
7559
try {
7560
	ajaxLocation = location.href;
7561
} catch( e ) {
7562
	// Use the href attribute of an A element
7563
	// since IE will modify it given document.location
7564
	ajaxLocation = document.createElement( "a" );
7565
	ajaxLocation.href = "";
7566
	ajaxLocation = ajaxLocation.href;
7567
}
7568
7569
// Segment location into parts
7570
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
7571
7572
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
7573 View Code Duplication
function addToPrefiltersOrTransports( structure ) {
7574
7575
	// dataTypeExpression is optional and defaults to "*"
7576
	return function( dataTypeExpression, func ) {
7577
7578
		if ( typeof dataTypeExpression !== "string" ) {
7579
			func = dataTypeExpression;
7580
			dataTypeExpression = "*";
7581
		}
7582
7583
		var dataType,
7584
			i = 0,
7585
			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
7586
7587
		if ( jQuery.isFunction( func ) ) {
7588
			// For each dataType in the dataTypeExpression
7589
			while ( (dataType = dataTypes[i++]) ) {
7590
				// Prepend if requested
7591
				if ( dataType[0] === "+" ) {
7592
					dataType = dataType.slice( 1 ) || "*";
7593
					(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
7594
7595
				// Otherwise append
7596
				} else {
7597
					(structure[ dataType ] = structure[ dataType ] || []).push( func );
7598
				}
7599
			}
7600
		}
7601
	};
7602
}
7603
7604
// Base inspection function for prefilters and transports
7605 View Code Duplication
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
7606
7607
	var inspected = {},
7608
		seekingTransport = ( structure === transports );
7609
7610
	function inspect( dataType ) {
7611
		var selected;
7612
		inspected[ dataType ] = true;
7613
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
7614
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
7615
			if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
7616
				options.dataTypes.unshift( dataTypeOrTransport );
7617
				inspect( dataTypeOrTransport );
7618
				return false;
7619
			} else if ( seekingTransport ) {
7620
				return !( selected = dataTypeOrTransport );
7621
			}
7622
		});
7623
		return selected;
7624
	}
7625
7626
	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
7627
}
7628
7629
// A special extend for ajax options
7630
// that takes "flat" options (not to be deep extended)
7631
// Fixes #9887
7632
function ajaxExtend( target, src ) {
7633
	var key, deep,
7634
		flatOptions = jQuery.ajaxSettings.flatOptions || {};
7635
7636
	for ( key in src ) {
7637
		if ( src[ key ] !== undefined ) {
7638
			( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
7639
		}
7640
	}
7641
	if ( deep ) {
7642
		jQuery.extend( true, target, deep );
7643
	}
7644
7645
	return target;
7646
}
7647
7648
/* Handles responses to an ajax request:
7649
 * - finds the right dataType (mediates between content-type and expected dataType)
7650
 * - returns the corresponding response
7651
 */
7652 View Code Duplication
function ajaxHandleResponses( s, jqXHR, responses ) {
7653
7654
	var ct, type, finalDataType, firstDataType,
7655
		contents = s.contents,
7656
		dataTypes = s.dataTypes;
7657
7658
	// Remove auto dataType and get content-type in the process
7659
	while ( dataTypes[ 0 ] === "*" ) {
7660
		dataTypes.shift();
7661
		if ( ct === undefined ) {
7662
			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
7663
		}
7664
	}
7665
7666
	// Check if we're dealing with a known content-type
7667
	if ( ct ) {
7668
		for ( type in contents ) {
7669
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
7670
				dataTypes.unshift( type );
7671
				break;
7672
			}
7673
		}
7674
	}
7675
7676
	// Check to see if we have a response for the expected dataType
7677
	if ( dataTypes[ 0 ] in responses ) {
7678
		finalDataType = dataTypes[ 0 ];
7679
	} else {
7680
		// Try convertible dataTypes
7681
		for ( type in responses ) {
7682
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
7683
				finalDataType = type;
7684
				break;
7685
			}
7686
			if ( !firstDataType ) {
7687
				firstDataType = type;
7688
			}
7689
		}
7690
		// Or just use first one
7691
		finalDataType = finalDataType || firstDataType;
7692
	}
7693
7694
	// If we found a dataType
7695
	// We add the dataType to the list if needed
7696
	// and return the corresponding response
7697
	if ( finalDataType ) {
7698
		if ( finalDataType !== dataTypes[ 0 ] ) {
7699
			dataTypes.unshift( finalDataType );
7700
		}
7701
		return responses[ finalDataType ];
7702
	}
7703
}
7704
7705
/* Chain conversions given the request and the original response
7706
 * Also sets the responseXXX fields on the jqXHR instance
7707
 */
7708 View Code Duplication
function ajaxConvert( s, response, jqXHR, isSuccess ) {
7709
	var conv2, current, conv, tmp, prev,
7710
		converters = {},
7711
		// Work with a copy of dataTypes in case we need to modify it for conversion
7712
		dataTypes = s.dataTypes.slice();
7713
7714
	// Create converters map with lowercased keys
7715
	if ( dataTypes[ 1 ] ) {
7716
		for ( conv in s.converters ) {
7717
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
7718
		}
7719
	}
7720
7721
	current = dataTypes.shift();
7722
7723
	// Convert to each sequential dataType
7724
	while ( current ) {
7725
7726
		if ( s.responseFields[ current ] ) {
7727
			jqXHR[ s.responseFields[ current ] ] = response;
7728
		}
7729
7730
		// Apply the dataFilter if provided
7731
		if ( !prev && isSuccess && s.dataFilter ) {
7732
			response = s.dataFilter( response, s.dataType );
7733
		}
7734
7735
		prev = current;
7736
		current = dataTypes.shift();
7737
7738
		if ( current ) {
7739
7740
		// There's only work to do if current dataType is non-auto
7741
			if ( current === "*" ) {
7742
7743
				current = prev;
7744
7745
			// Convert response if prev dataType is non-auto and differs from current
7746
			} else if ( prev !== "*" && prev !== current ) {
7747
7748
				// Seek a direct converter
7749
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
7750
7751
				// If none found, seek a pair
7752
				if ( !conv ) {
7753
					for ( conv2 in converters ) {
7754
7755
						// If conv2 outputs current
7756
						tmp = conv2.split( " " );
7757
						if ( tmp[ 1 ] === current ) {
7758
7759
							// If prev can be converted to accepted input
7760
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
7761
								converters[ "* " + tmp[ 0 ] ];
7762
							if ( conv ) {
7763
								// Condense equivalence converters
7764
								if ( conv === true ) {
7765
									conv = converters[ conv2 ];
7766
7767
								// Otherwise, insert the intermediate dataType
7768
								} else if ( converters[ conv2 ] !== true ) {
7769
									current = tmp[ 0 ];
7770
									dataTypes.unshift( tmp[ 1 ] );
7771
								}
7772
								break;
7773
							}
7774
						}
7775
					}
7776
				}
7777
7778
				// Apply converter (if not an equivalence)
7779
				if ( conv !== true ) {
7780
7781
					// Unless errors are allowed to bubble, catch and return them
7782
					if ( conv && s[ "throws" ] ) {
7783
						response = conv( response );
7784
					} else {
7785
						try {
7786
							response = conv( response );
7787
						} catch ( e ) {
7788
							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
7789
						}
7790
					}
7791
				}
7792
			}
7793
		}
7794
	}
7795
7796
	return { state: "success", data: response };
7797
}
7798
7799
jQuery.extend({
7800
7801
	// Counter for holding the number of active queries
7802
	active: 0,
7803
7804
	// Last-Modified header cache for next request
7805
	lastModified: {},
7806
	etag: {},
7807
7808
	ajaxSettings: {
7809
		url: ajaxLocation,
7810
		type: "GET",
7811
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
7812
		global: true,
7813
		processData: true,
7814
		async: true,
7815
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
7816
		/*
7817
		timeout: 0,
7818
		data: null,
7819
		dataType: null,
7820
		username: null,
7821
		password: null,
7822
		cache: null,
7823
		throws: false,
7824
		traditional: false,
7825
		headers: {},
7826
		*/
7827
7828
		accepts: {
7829
			"*": allTypes,
7830
			text: "text/plain",
7831
			html: "text/html",
7832
			xml: "application/xml, text/xml",
7833
			json: "application/json, text/javascript"
7834
		},
7835
7836
		contents: {
7837
			xml: /xml/,
7838
			html: /html/,
7839
			json: /json/
7840
		},
7841
7842
		responseFields: {
7843
			xml: "responseXML",
7844
			text: "responseText",
7845
			json: "responseJSON"
7846
		},
7847
7848
		// Data converters
7849
		// Keys separate source (or catchall "*") and destination types with a single space
7850
		converters: {
7851
7852
			// Convert anything to text
7853
			"* text": String,
7854
7855
			// Text to html (true = no transformation)
7856
			"text html": true,
7857
7858
			// Evaluate text as a json expression
7859
			"text json": jQuery.parseJSON,
7860
7861
			// Parse text as xml
7862
			"text xml": jQuery.parseXML
7863
		},
7864
7865
		// For options that shouldn't be deep extended:
7866
		// you can add your own custom options here if
7867
		// and when you create one that shouldn't be
7868
		// deep extended (see ajaxExtend)
7869
		flatOptions: {
7870
			url: true,
7871
			context: true
7872
		}
7873
	},
7874
7875
	// Creates a full fledged settings object into target
7876
	// with both ajaxSettings and settings fields.
7877
	// If target is omitted, writes into ajaxSettings.
7878
	ajaxSetup: function( target, settings ) {
7879
		return settings ?
7880
7881
			// Building a settings object
7882
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
7883
7884
			// Extending ajaxSettings
7885
			ajaxExtend( jQuery.ajaxSettings, target );
7886
	},
7887
7888
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
7889
	ajaxTransport: addToPrefiltersOrTransports( transports ),
7890
7891
	// Main method
7892 View Code Duplication
	ajax: function( url, options ) {
7893
7894
		// If url is an object, simulate pre-1.5 signature
7895
		if ( typeof url === "object" ) {
7896
			options = url;
7897
			url = undefined;
7898
		}
7899
7900
		// Force options to be an object
7901
		options = options || {};
7902
7903
		var transport,
7904
			// URL without anti-cache param
7905
			cacheURL,
7906
			// Response headers
7907
			responseHeadersString,
7908
			responseHeaders,
7909
			// timeout handle
7910
			timeoutTimer,
7911
			// Cross-domain detection vars
7912
			parts,
7913
			// To know if global events are to be dispatched
7914
			fireGlobals,
7915
			// Loop variable
7916
			i,
7917
			// Create the final options object
7918
			s = jQuery.ajaxSetup( {}, options ),
7919
			// Callbacks context
7920
			callbackContext = s.context || s,
7921
			// Context for global events is callbackContext if it is a DOM node or jQuery collection
7922
			globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
7923
				jQuery( callbackContext ) :
7924
				jQuery.event,
7925
			// Deferreds
7926
			deferred = jQuery.Deferred(),
7927
			completeDeferred = jQuery.Callbacks("once memory"),
7928
			// Status-dependent callbacks
7929
			statusCode = s.statusCode || {},
7930
			// Headers (they are sent all at once)
7931
			requestHeaders = {},
7932
			requestHeadersNames = {},
7933
			// The jqXHR state
7934
			state = 0,
7935
			// Default abort message
7936
			strAbort = "canceled",
7937
			// Fake xhr
7938
			jqXHR = {
7939
				readyState: 0,
7940
7941
				// Builds headers hashtable if needed
7942
				getResponseHeader: function( key ) {
7943
					var match;
7944
					if ( state === 2 ) {
7945
						if ( !responseHeaders ) {
7946
							responseHeaders = {};
7947
							while ( (match = rheaders.exec( responseHeadersString )) ) {
7948
								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7949
							}
7950
						}
7951
						match = responseHeaders[ key.toLowerCase() ];
7952
					}
7953
					return match == null ? null : match;
7954
				},
7955
7956
				// Raw string
7957
				getAllResponseHeaders: function() {
7958
					return state === 2 ? responseHeadersString : null;
7959
				},
7960
7961
				// Caches the header
7962
				setRequestHeader: function( name, value ) {
7963
					var lname = name.toLowerCase();
7964
					if ( !state ) {
7965
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7966
						requestHeaders[ name ] = value;
7967
					}
7968
					return this;
7969
				},
7970
7971
				// Overrides response content-type header
7972
				overrideMimeType: function( type ) {
7973
					if ( !state ) {
7974
						s.mimeType = type;
7975
					}
7976
					return this;
7977
				},
7978
7979
				// Status-dependent callbacks
7980
				statusCode: function( map ) {
7981
					var code;
7982
					if ( map ) {
7983
						if ( state < 2 ) {
7984
							for ( code in map ) {
7985
								// Lazy-add the new callback in a way that preserves old ones
7986
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
7987
							}
7988
						} else {
7989
							// Execute the appropriate callbacks
7990
							jqXHR.always( map[ jqXHR.status ] );
7991
						}
7992
					}
7993
					return this;
7994
				},
7995
7996
				// Cancel the request
7997
				abort: function( statusText ) {
7998
					var finalText = statusText || strAbort;
7999
					if ( transport ) {
8000
						transport.abort( finalText );
8001
					}
8002
					done( 0, finalText );
8003
					return this;
8004
				}
8005
			};
8006
8007
		// Attach deferreds
8008
		deferred.promise( jqXHR ).complete = completeDeferred.add;
8009
		jqXHR.success = jqXHR.done;
8010
		jqXHR.error = jqXHR.fail;
8011
8012
		// Remove hash character (#7531: and string promotion)
8013
		// Add protocol if not provided (prefilters might expect it)
8014
		// Handle falsy url in the settings object (#10093: consistency with old signature)
8015
		// We also use the url parameter if available
8016
		s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
8017
			.replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
8018
8019
		// Alias method option to type as per ticket #12004
8020
		s.type = options.method || options.type || s.method || s.type;
8021
8022
		// Extract dataTypes list
8023
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];
8024
8025
		// A cross-domain request is in order when we have a protocol:host:port mismatch
8026
		if ( s.crossDomain == null ) {
8027
			parts = rurl.exec( s.url.toLowerCase() );
8028
			s.crossDomain = !!( parts &&
8029
				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
8030
					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==
8031
						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )
8032
			);
8033
		}
8034
8035
		// Convert data if not already a string
8036
		if ( s.data && s.processData && typeof s.data !== "string" ) {
8037
			s.data = jQuery.param( s.data, s.traditional );
8038
		}
8039
8040
		// Apply prefilters
8041
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
8042
8043
		// If request was aborted inside a prefilter, stop there
8044
		if ( state === 2 ) {
8045
			return jqXHR;
8046
		}
8047
8048
		// We can fire global events as of now if asked to
8049
		fireGlobals = s.global;
8050
8051
		// Watch for a new set of requests
8052
		if ( fireGlobals && jQuery.active++ === 0 ) {
8053
			jQuery.event.trigger("ajaxStart");
8054
		}
8055
8056
		// Uppercase the type
8057
		s.type = s.type.toUpperCase();
8058
8059
		// Determine if request has content
8060
		s.hasContent = !rnoContent.test( s.type );
8061
8062
		// Save the URL in case we're toying with the If-Modified-Since
8063
		// and/or If-None-Match header later on
8064
		cacheURL = s.url;
8065
8066
		// More options handling for requests with no content
8067
		if ( !s.hasContent ) {
8068
8069
			// If data is available, append data to url
8070
			if ( s.data ) {
8071
				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
8072
				// #9682: remove data so that it's not used in an eventual retry
8073
				delete s.data;
8074
			}
8075
8076
			// Add anti-cache in url if needed
8077
			if ( s.cache === false ) {
8078
				s.url = rts.test( cacheURL ) ?
8079
8080
					// If there is already a '_' parameter, set its value
8081
					cacheURL.replace( rts, "$1_=" + nonce++ ) :
8082
8083
					// Otherwise add one to the end
8084
					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
8085
			}
8086
		}
8087
8088
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8089
		if ( s.ifModified ) {
8090
			if ( jQuery.lastModified[ cacheURL ] ) {
8091
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
8092
			}
8093
			if ( jQuery.etag[ cacheURL ] ) {
8094
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
8095
			}
8096
		}
8097
8098
		// Set the correct header, if data is being sent
8099
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
8100
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
8101
		}
8102
8103
		// Set the Accepts header for the server, depending on the dataType
8104
		jqXHR.setRequestHeader(
8105
			"Accept",
8106
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
8107
				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
8108
				s.accepts[ "*" ]
8109
		);
8110
8111
		// Check for headers option
8112
		for ( i in s.headers ) {
8113
			jqXHR.setRequestHeader( i, s.headers[ i ] );
8114
		}
8115
8116
		// Allow custom headers/mimetypes and early abort
8117
		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
8118
			// Abort if not done already and return
8119
			return jqXHR.abort();
8120
		}
8121
8122
		// aborting is no longer a cancellation
8123
		strAbort = "abort";
8124
8125
		// Install callbacks on deferreds
8126
		for ( i in { success: 1, error: 1, complete: 1 } ) {
8127
			jqXHR[ i ]( s[ i ] );
8128
		}
8129
8130
		// Get transport
8131
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
8132
8133
		// If no transport, we auto-abort
8134
		if ( !transport ) {
8135
			done( -1, "No Transport" );
8136
		} else {
8137
			jqXHR.readyState = 1;
8138
8139
			// Send global event
8140
			if ( fireGlobals ) {
8141
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
8142
			}
8143
			// Timeout
8144
			if ( s.async && s.timeout > 0 ) {
8145
				timeoutTimer = setTimeout(function() {
8146
					jqXHR.abort("timeout");
8147
				}, s.timeout );
8148
			}
8149
8150
			try {
8151
				state = 1;
8152
				transport.send( requestHeaders, done );
8153
			} catch ( e ) {
8154
				// Propagate exception as error if not done
8155
				if ( state < 2 ) {
8156
					done( -1, e );
8157
				// Simply rethrow otherwise
8158
				} else {
8159
					throw e;
8160
				}
8161
			}
8162
		}
8163
8164
		// Callback for when everything is done
8165
		function done( status, nativeStatusText, responses, headers ) {
8166
			var isSuccess, success, error, response, modified,
8167
				statusText = nativeStatusText;
8168
8169
			// Called once
8170
			if ( state === 2 ) {
8171
				return;
8172
			}
8173
8174
			// State is "done" now
8175
			state = 2;
8176
8177
			// Clear timeout if it exists
8178
			if ( timeoutTimer ) {
8179
				clearTimeout( timeoutTimer );
8180
			}
8181
8182
			// Dereference transport for early garbage collection
8183
			// (no matter how long the jqXHR object will be used)
8184
			transport = undefined;
8185
8186
			// Cache response headers
8187
			responseHeadersString = headers || "";
8188
8189
			// Set readyState
8190
			jqXHR.readyState = status > 0 ? 4 : 0;
8191
8192
			// Determine if successful
8193
			isSuccess = status >= 200 && status < 300 || status === 304;
8194
8195
			// Get response data
8196
			if ( responses ) {
8197
				response = ajaxHandleResponses( s, jqXHR, responses );
8198
			}
8199
8200
			// Convert no matter what (that way responseXXX fields are always set)
8201
			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 8196 is false. Are you sure the function ajaxConvert handles undefined variables?
Loading history...
8202
8203
			// If successful, handle type chaining
8204
			if ( isSuccess ) {
8205
8206
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
8207
				if ( s.ifModified ) {
8208
					modified = jqXHR.getResponseHeader("Last-Modified");
8209
					if ( modified ) {
8210
						jQuery.lastModified[ cacheURL ] = modified;
8211
					}
8212
					modified = jqXHR.getResponseHeader("etag");
8213
					if ( modified ) {
8214
						jQuery.etag[ cacheURL ] = modified;
8215
					}
8216
				}
8217
8218
				// if no content
8219
				if ( status === 204 || s.type === "HEAD" ) {
8220
					statusText = "nocontent";
8221
8222
				// if not modified
8223
				} else if ( status === 304 ) {
8224
					statusText = "notmodified";
8225
8226
				// If we have data, let's convert it
8227
				} else {
8228
					statusText = response.state;
8229
					success = response.data;
8230
					error = response.error;
8231
					isSuccess = !error;
8232
				}
8233
			} else {
8234
				// We extract error from statusText
8235
				// then normalize statusText and status for non-aborts
8236
				error = statusText;
8237
				if ( status || !statusText ) {
8238
					statusText = "error";
8239
					if ( status < 0 ) {
8240
						status = 0;
8241
					}
8242
				}
8243
			}
8244
8245
			// Set data for the fake xhr object
8246
			jqXHR.status = status;
8247
			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
8248
8249
			// Success/Error
8250
			if ( isSuccess ) {
8251
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
8252
			} else {
8253
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
8254
			}
8255
8256
			// Status-dependent callbacks
8257
			jqXHR.statusCode( statusCode );
8258
			statusCode = undefined;
8259
8260
			if ( fireGlobals ) {
8261
				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
8262
					[ jqXHR, s, isSuccess ? success : error ] );
8263
			}
8264
8265
			// Complete
8266
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
8267
8268
			if ( fireGlobals ) {
8269
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
8270
				// Handle the global AJAX counter
8271
				if ( !( --jQuery.active ) ) {
8272
					jQuery.event.trigger("ajaxStop");
8273
				}
8274
			}
8275
		}
8276
8277
		return jqXHR;
8278
	},
8279
8280
	getJSON: function( url, data, callback ) {
8281
		return jQuery.get( url, data, callback, "json" );
8282
	},
8283
8284
	getScript: function( url, callback ) {
8285
		return jQuery.get( url, undefined, callback, "script" );
8286
	}
8287
});
8288
8289
jQuery.each( [ "get", "post" ], function( i, method ) {
8290
	jQuery[ method ] = function( url, data, callback, type ) {
8291
		// shift arguments if data argument was omitted
8292
		if ( jQuery.isFunction( data ) ) {
8293
			type = type || callback;
8294
			callback = data;
8295
			data = undefined;
8296
		}
8297
8298
		return jQuery.ajax({
8299
			url: url,
8300
			type: method,
8301
			dataType: type,
8302
			data: data,
8303
			success: callback
8304
		});
8305
	};
8306
});
8307
8308
// Attach a bunch of functions for handling common AJAX events
8309
jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {
8310
	jQuery.fn[ type ] = function( fn ) {
8311
		return this.on( type, fn );
8312
	};
8313
});
8314
8315
8316
jQuery._evalUrl = function( url ) {
8317
	return jQuery.ajax({
8318
		url: url,
8319
		type: "GET",
8320
		dataType: "script",
8321
		async: false,
8322
		global: false,
8323
		"throws": true
8324
	});
8325
};
8326
8327
8328
jQuery.fn.extend({
8329
	wrapAll: function( html ) {
8330
		var wrap;
8331
8332
		if ( jQuery.isFunction( html ) ) {
8333
			return this.each(function( i ) {
8334
				jQuery( this ).wrapAll( html.call(this, i) );
8335
			});
8336
		}
8337
8338
		if ( this[ 0 ] ) {
8339
8340
			// The elements to wrap the target around
8341
			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
8342
8343
			if ( this[ 0 ].parentNode ) {
8344
				wrap.insertBefore( this[ 0 ] );
8345
			}
8346
8347
			wrap.map(function() {
8348
				var elem = this;
8349
8350
				while ( elem.firstElementChild ) {
8351
					elem = elem.firstElementChild;
8352
				}
8353
8354
				return elem;
8355
			}).append( this );
8356
		}
8357
8358
		return this;
8359
	},
8360
8361
	wrapInner: function( html ) {
8362
		if ( jQuery.isFunction( html ) ) {
8363
			return this.each(function( i ) {
8364
				jQuery( this ).wrapInner( html.call(this, i) );
8365
			});
8366
		}
8367
8368
		return this.each(function() {
8369
			var self = jQuery( this ),
8370
				contents = self.contents();
8371
8372
			if ( contents.length ) {
8373
				contents.wrapAll( html );
8374
8375
			} else {
8376
				self.append( html );
8377
			}
8378
		});
8379
	},
8380
8381
	wrap: function( html ) {
8382
		var isFunction = jQuery.isFunction( html );
8383
8384
		return this.each(function( i ) {
8385
			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
8386
		});
8387
	},
8388
8389
	unwrap: function() {
8390
		return this.parent().each(function() {
8391
			if ( !jQuery.nodeName( this, "body" ) ) {
8392
				jQuery( this ).replaceWith( this.childNodes );
8393
			}
8394
		}).end();
8395
	}
8396
});
8397
8398
8399
jQuery.expr.filters.hidden = function( elem ) {
8400
	// Support: Opera <= 12.12
8401
	// Opera reports offsetWidths and offsetHeights less than zero on some elements
8402
	return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
8403
};
8404
jQuery.expr.filters.visible = function( elem ) {
8405
	return !jQuery.expr.filters.hidden( elem );
8406
};
8407
8408
8409
8410
8411
var r20 = /%20/g,
8412
	rbracket = /\[\]$/,
8413
	rCRLF = /\r?\n/g,
8414
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
8415
	rsubmittable = /^(?:input|select|textarea|keygen)/i;
8416
8417 View Code Duplication
function buildParams( prefix, obj, traditional, add ) {
8418
	var name;
8419
8420
	if ( jQuery.isArray( obj ) ) {
8421
		// Serialize array item.
8422
		jQuery.each( obj, function( i, v ) {
8423
			if ( traditional || rbracket.test( prefix ) ) {
8424
				// Treat each array item as a scalar.
8425
				add( prefix, v );
8426
8427
			} else {
8428
				// Item is non-scalar (array or object), encode its numeric index.
8429
				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
8430
			}
8431
		});
8432
8433
	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
8434
		// Serialize object item.
8435
		for ( name in obj ) {
8436
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
8437
		}
8438
8439
	} else {
8440
		// Serialize scalar item.
8441
		add( prefix, obj );
8442
	}
8443
}
8444
8445
// Serialize an array of form elements or a set of
8446
// key/values into a query string
8447 View Code Duplication
jQuery.param = function( a, traditional ) {
8448
	var prefix,
8449
		s = [],
8450
		add = function( key, value ) {
8451
			// If value is a function, invoke it and return its value
8452
			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
8453
			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
8454
		};
8455
8456
	// Set traditional to true for jQuery <= 1.3.2 behavior.
8457
	if ( traditional === undefined ) {
8458
		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
8459
	}
8460
8461
	// If an array was passed in, assume that it is an array of form elements.
8462
	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
8463
		// Serialize the form elements
8464
		jQuery.each( a, function() {
8465
			add( this.name, this.value );
8466
		});
8467
8468
	} else {
8469
		// If traditional, encode the "old" way (the way 1.3.2 or older
8470
		// did it), otherwise encode params recursively.
8471
		for ( prefix in a ) {
8472
			buildParams( prefix, a[ prefix ], traditional, add );
8473
		}
8474
	}
8475
8476
	// Return the resulting serialization
8477
	return s.join( "&" ).replace( r20, "+" );
8478
};
8479
8480
jQuery.fn.extend({
8481
	serialize: function() {
8482
		return jQuery.param( this.serializeArray() );
8483
	},
8484 View Code Duplication
	serializeArray: function() {
8485
		return this.map(function() {
8486
			// Can add propHook for "elements" to filter or add form elements
8487
			var elements = jQuery.prop( this, "elements" );
8488
			return elements ? jQuery.makeArray( elements ) : this;
8489
		})
8490
		.filter(function() {
8491
			var type = this.type;
8492
8493
			// Use .is( ":disabled" ) so that fieldset[disabled] works
8494
			return this.name && !jQuery( this ).is( ":disabled" ) &&
8495
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
8496
				( this.checked || !rcheckableType.test( type ) );
8497
		})
8498
		.map(function( i, elem ) {
8499
			var val = jQuery( this ).val();
8500
8501
			return val == null ?
8502
				null :
8503
				jQuery.isArray( val ) ?
8504
					jQuery.map( val, function( val ) {
8505
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8506
					}) :
8507
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
8508
		}).get();
8509
	}
8510
});
8511
8512
8513
jQuery.ajaxSettings.xhr = function() {
8514
	try {
8515
		return new XMLHttpRequest();
8516
	} 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...
8517
};
8518
8519
var xhrId = 0,
8520
	xhrCallbacks = {},
8521
	xhrSuccessStatus = {
8522
		// file protocol always yields status code 0, assume 200
8523
		0: 200,
8524
		// Support: IE9
8525
		// #1450: sometimes IE returns 1223 when it should be 204
8526
		1223: 204
8527
	},
8528
	xhrSupported = jQuery.ajaxSettings.xhr();
8529
8530
// Support: IE9
8531
// Open requests must be manually aborted on unload (#5280)
8532
if ( window.ActiveXObject ) {
8533
	jQuery( window ).on( "unload", function() {
8534
		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...
8535
			xhrCallbacks[ key ]();
8536
		}
8537
	});
8538
}
8539
8540
support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
8541
support.ajax = xhrSupported = !!xhrSupported;
8542
8543
jQuery.ajaxTransport(function( options ) {
8544
	var callback;
8545
8546
	// Cross domain only allowed if supported through XMLHttpRequest
8547
	if ( support.cors || xhrSupported && !options.crossDomain ) {
8548
		return {
8549
			send: function( headers, complete ) {
8550
				var i,
8551
					xhr = options.xhr(),
8552
					id = ++xhrId;
8553
8554
				xhr.open( options.type, options.url, options.async, options.username, options.password );
8555
8556
				// Apply custom fields if provided
8557
				if ( options.xhrFields ) {
8558
					for ( i in options.xhrFields ) {
8559
						xhr[ i ] = options.xhrFields[ i ];
8560
					}
8561
				}
8562
8563
				// Override mime type if needed
8564
				if ( options.mimeType && xhr.overrideMimeType ) {
8565
					xhr.overrideMimeType( options.mimeType );
8566
				}
8567
8568
				// X-Requested-With header
8569
				// For cross-domain requests, seeing as conditions for a preflight are
8570
				// akin to a jigsaw puzzle, we simply never set it to be sure.
8571
				// (it can always be set on a per-request basis or even using ajaxSetup)
8572
				// For same-domain requests, won't change header if already provided.
8573
				if ( !options.crossDomain && !headers["X-Requested-With"] ) {
8574
					headers["X-Requested-With"] = "XMLHttpRequest";
8575
				}
8576
8577
				// Set headers
8578
				for ( i in headers ) {
8579
					xhr.setRequestHeader( i, headers[ i ] );
8580
				}
8581
8582
				// Callback
8583
				callback = function( type ) {
8584
					return function() {
8585
						if ( callback ) {
8586
							delete xhrCallbacks[ id ];
8587
							callback = xhr.onload = xhr.onerror = null;
8588
8589
							if ( type === "abort" ) {
8590
								xhr.abort();
8591
							} else if ( type === "error" ) {
8592
								complete(
8593
									// file: protocol always yields status 0; see #8605, #14207
8594
									xhr.status,
8595
									xhr.statusText
8596
								);
8597
							} else {
8598
								complete(
8599
									xhrSuccessStatus[ xhr.status ] || xhr.status,
8600
									xhr.statusText,
8601
									// Support: IE9
8602
									// Accessing binary-data responseText throws an exception
8603
									// (#11426)
8604
									typeof xhr.responseText === "string" ? {
8605
										text: xhr.responseText
8606
									} : undefined,
8607
									xhr.getAllResponseHeaders()
8608
								);
8609
							}
8610
						}
8611
					};
8612
				};
8613
8614
				// Listen to events
8615
				xhr.onload = callback();
8616
				xhr.onerror = callback("error");
8617
8618
				// Create the abort callback
8619
				callback = xhrCallbacks[ id ] = callback("abort");
8620
8621
				try {
8622
					// Do send the request (this may raise an exception)
8623
					xhr.send( options.hasContent && options.data || null );
8624
				} catch ( e ) {
8625
					// #14683: Only rethrow if this hasn't been notified as an error yet
8626
					if ( callback ) {
8627
						throw e;
8628
					}
8629
				}
8630
			},
8631
8632
			abort: function() {
8633
				if ( callback ) {
8634
					callback();
8635
				}
8636
			}
8637
		};
8638
	}
8639
});
8640
8641
8642
8643
8644
// Install script dataType
8645
jQuery.ajaxSetup({
8646
	accepts: {
8647
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
8648
	},
8649
	contents: {
8650
		script: /(?:java|ecma)script/
8651
	},
8652
	converters: {
8653
		"text script": function( text ) {
8654
			jQuery.globalEval( text );
8655
			return text;
8656
		}
8657
	}
8658
});
8659
8660
// Handle cache's special case and crossDomain
8661
jQuery.ajaxPrefilter( "script", function( s ) {
8662
	if ( s.cache === undefined ) {
8663
		s.cache = false;
8664
	}
8665
	if ( s.crossDomain ) {
8666
		s.type = "GET";
8667
	}
8668
});
8669
8670
// Bind script tag hack transport
8671 View Code Duplication
jQuery.ajaxTransport( "script", function( s ) {
8672
	// This transport only deals with cross domain requests
8673
	if ( s.crossDomain ) {
8674
		var script, callback;
8675
		return {
8676
			send: function( _, complete ) {
8677
				script = jQuery("<script>").prop({
8678
					async: true,
8679
					charset: s.scriptCharset,
8680
					src: s.url
8681
				}).on(
8682
					"load error",
8683
					callback = function( evt ) {
8684
						script.remove();
8685
						callback = null;
8686
						if ( evt ) {
8687
							complete( evt.type === "error" ? 404 : 200, evt.type );
8688
						}
8689
					}
8690
				);
8691
				document.head.appendChild( script[ 0 ] );
8692
			},
8693
			abort: function() {
8694
				if ( callback ) {
8695
					callback();
8696
				}
8697
			}
8698
		};
8699
	}
8700
});
8701
8702
8703
8704
8705
var oldCallbacks = [],
8706
	rjsonp = /(=)\?(?=&|$)|\?\?/;
8707
8708
// Default jsonp settings
8709
jQuery.ajaxSetup({
8710
	jsonp: "callback",
8711
	jsonpCallback: function() {
8712
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
8713
		this[ callback ] = true;
8714
		return callback;
8715
	}
8716
});
8717
8718
// Detect, normalize options and install callbacks for jsonp requests
8719 View Code Duplication
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
8720
8721
	var callbackName, overwritten, responseContainer,
8722
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
8723
			"url" :
8724
			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
8725
		);
8726
8727
	// Handle iff the expected data type is "jsonp" or we have a parameter to set
8728
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
8729
8730
		// Get callback name, remembering preexisting value associated with it
8731
		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
8732
			s.jsonpCallback() :
8733
			s.jsonpCallback;
8734
8735
		// Insert callback into url or form data
8736
		if ( jsonProp ) {
8737
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
8738
		} else if ( s.jsonp !== false ) {
8739
			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
8740
		}
8741
8742
		// Use data converter to retrieve json after script execution
8743
		s.converters["script json"] = function() {
8744
			if ( !responseContainer ) {
8745
				jQuery.error( callbackName + " was not called" );
8746
			}
8747
			return responseContainer[ 0 ];
8748
		};
8749
8750
		// force json dataType
8751
		s.dataTypes[ 0 ] = "json";
8752
8753
		// Install callback
8754
		overwritten = window[ callbackName ];
8755
		window[ callbackName ] = function() {
8756
			responseContainer = arguments;
8757
		};
8758
8759
		// Clean-up function (fires after converters)
8760
		jqXHR.always(function() {
8761
			// Restore preexisting value
8762
			window[ callbackName ] = overwritten;
8763
8764
			// Save back as free
8765
			if ( s[ callbackName ] ) {
8766
				// make sure that re-using the options doesn't screw things around
8767
				s.jsonpCallback = originalSettings.jsonpCallback;
8768
8769
				// save the callback name for future use
8770
				oldCallbacks.push( callbackName );
8771
			}
8772
8773
			// Call if it was a function and we have a response
8774
			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
8775
				overwritten( responseContainer[ 0 ] );
8776
			}
8777
8778
			responseContainer = overwritten = undefined;
8779
		});
8780
8781
		// Delegate to script
8782
		return "script";
8783
	}
8784
});
8785
8786
8787
8788
8789
// data: string of html
8790
// context (optional): If specified, the fragment will be created in this context, defaults to document
8791
// keepScripts (optional): If true, will include scripts passed in the html string
8792
jQuery.parseHTML = function( data, context, keepScripts ) {
8793
	if ( !data || typeof data !== "string" ) {
8794
		return null;
8795
	}
8796
	if ( typeof context === "boolean" ) {
8797
		keepScripts = context;
8798
		context = false;
8799
	}
8800
	context = context || document;
8801
8802
	var parsed = rsingleTag.exec( data ),
8803
		scripts = !keepScripts && [];
8804
8805
	// Single tag
8806
	if ( parsed ) {
8807
		return [ context.createElement( parsed[1] ) ];
8808
	}
8809
8810
	parsed = jQuery.buildFragment( [ data ], context, scripts );
8811
8812
	if ( scripts && scripts.length ) {
8813
		jQuery( scripts ).remove();
8814
	}
8815
8816
	return jQuery.merge( [], parsed.childNodes );
8817
};
8818
8819
8820
// Keep a copy of the old load method
8821
var _load = jQuery.fn.load;
8822
8823
/**
8824
 * Load a url into a page
8825
 */
8826
jQuery.fn.load = function( url, params, callback ) {
8827
	if ( typeof url !== "string" && _load ) {
8828
		return _load.apply( this, arguments );
8829
	}
8830
8831
	var selector, type, response,
8832
		self = this,
8833
		off = url.indexOf(" ");
8834
8835
	if ( off >= 0 ) {
8836
		selector = jQuery.trim( url.slice( off ) );
8837
		url = url.slice( 0, off );
8838
	}
8839
8840
	// If it's a function
8841
	if ( jQuery.isFunction( params ) ) {
8842
8843
		// We assume that it's the callback
8844
		callback = params;
8845
		params = undefined;
8846
8847
	// Otherwise, build a param string
8848
	} else if ( params && typeof params === "object" ) {
8849
		type = "POST";
8850
	}
8851
8852
	// If we have elements to modify, make the request
8853
	if ( self.length > 0 ) {
8854
		jQuery.ajax({
8855
			url: url,
8856
8857
			// if "type" variable is undefined, then "GET" method will be used
8858
			type: type,
8859
			dataType: "html",
8860
			data: params
8861
		}).done(function( responseText ) {
8862
8863
			// Save response for use in complete callback
8864
			response = arguments;
8865
8866
			self.html( selector ?
8867
8868
				// If a selector was specified, locate the right elements in a dummy div
8869
				// Exclude scripts to avoid IE 'Permission Denied' errors
8870
				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
8871
8872
				// Otherwise use the full result
8873
				responseText );
8874
8875
		}).complete( callback && function( jqXHR, status ) {
8876
			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
8877
		});
8878
	}
8879
8880
	return this;
8881
};
8882
8883
8884
8885
8886
jQuery.expr.filters.animated = function( elem ) {
8887
	return jQuery.grep(jQuery.timers, function( fn ) {
8888
		return elem === fn.elem;
8889
	}).length;
8890
};
8891
8892
8893
8894
8895
var docElem = window.document.documentElement;
8896
8897
/**
8898
 * Gets a window from an element
8899
 */
8900
function getWindow( elem ) {
8901
	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
8902
}
8903
8904
jQuery.offset = {
8905 View Code Duplication
	setOffset: function( elem, options, i ) {
8906
		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
8907
			position = jQuery.css( elem, "position" ),
8908
			curElem = jQuery( elem ),
8909
			props = {};
8910
8911
		// Set position first, in-case top/left are set even on static elem
8912
		if ( position === "static" ) {
8913
			elem.style.position = "relative";
8914
		}
8915
8916
		curOffset = curElem.offset();
8917
		curCSSTop = jQuery.css( elem, "top" );
8918
		curCSSLeft = jQuery.css( elem, "left" );
8919
		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
8920
			( curCSSTop + curCSSLeft ).indexOf("auto") > -1;
8921
8922
		// Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
8923
		if ( calculatePosition ) {
8924
			curPosition = curElem.position();
8925
			curTop = curPosition.top;
8926
			curLeft = curPosition.left;
8927
8928
		} else {
8929
			curTop = parseFloat( curCSSTop ) || 0;
8930
			curLeft = parseFloat( curCSSLeft ) || 0;
8931
		}
8932
8933
		if ( jQuery.isFunction( options ) ) {
8934
			options = options.call( elem, i, curOffset );
8935
		}
8936
8937
		if ( options.top != null ) {
8938
			props.top = ( options.top - curOffset.top ) + curTop;
8939
		}
8940
		if ( options.left != null ) {
8941
			props.left = ( options.left - curOffset.left ) + curLeft;
8942
		}
8943
8944
		if ( "using" in options ) {
8945
			options.using.call( elem, props );
8946
8947
		} else {
8948
			curElem.css( props );
8949
		}
8950
	}
8951
};
8952
8953
jQuery.fn.extend({
8954 View Code Duplication
	offset: function( options ) {
8955
		if ( arguments.length ) {
8956
			return options === undefined ?
8957
				this :
8958
				this.each(function( i ) {
8959
					jQuery.offset.setOffset( this, options, i );
8960
				});
8961
		}
8962
8963
		var docElem, win,
8964
			elem = this[ 0 ],
8965
			box = { top: 0, left: 0 },
8966
			doc = elem && elem.ownerDocument;
8967
8968
		if ( !doc ) {
8969
			return;
8970
		}
8971
8972
		docElem = doc.documentElement;
8973
8974
		// Make sure it's not a disconnected DOM node
8975
		if ( !jQuery.contains( docElem, elem ) ) {
8976
			return box;
8977
		}
8978
8979
		// If we don't have gBCR, just use 0,0 rather than error
8980
		// BlackBerry 5, iOS 3 (original iPhone)
8981
		if ( typeof elem.getBoundingClientRect !== strundefined ) {
8982
			box = elem.getBoundingClientRect();
8983
		}
8984
		win = getWindow( doc );
8985
		return {
8986
			top: box.top + win.pageYOffset - docElem.clientTop,
8987
			left: box.left + win.pageXOffset - docElem.clientLeft
8988
		};
8989
	},
8990
8991 View Code Duplication
	position: function() {
8992
		if ( !this[ 0 ] ) {
8993
			return;
8994
		}
8995
8996
		var offsetParent, offset,
8997
			elem = this[ 0 ],
8998
			parentOffset = { top: 0, left: 0 };
8999
9000
		// Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
9001
		if ( jQuery.css( elem, "position" ) === "fixed" ) {
9002
			// We assume that getBoundingClientRect is available when computed position is fixed
9003
			offset = elem.getBoundingClientRect();
9004
9005
		} else {
9006
			// Get *real* offsetParent
9007
			offsetParent = this.offsetParent();
9008
9009
			// Get correct offsets
9010
			offset = this.offset();
9011
			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
9012
				parentOffset = offsetParent.offset();
9013
			}
9014
9015
			// Add offsetParent borders
9016
			parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
9017
			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
9018
		}
9019
9020
		// Subtract parent offsets and element margins
9021
		return {
9022
			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
9023
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
9024
		};
9025
	},
9026
9027
	offsetParent: function() {
9028
		return this.map(function() {
9029
			var offsetParent = this.offsetParent || docElem;
9030
9031
			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {
9032
				offsetParent = offsetParent.offsetParent;
9033
			}
9034
9035
			return offsetParent || docElem;
9036
		});
9037
	}
9038
});
9039
9040
// Create scrollLeft and scrollTop methods
9041 View Code Duplication
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
9042
	var top = "pageYOffset" === prop;
9043
9044
	jQuery.fn[ method ] = function( val ) {
9045
		return access( this, function( elem, method, val ) {
9046
			var win = getWindow( elem );
9047
9048
			if ( val === undefined ) {
9049
				return win ? win[ prop ] : elem[ method ];
9050
			}
9051
9052
			if ( win ) {
9053
				win.scrollTo(
9054
					!top ? val : window.pageXOffset,
9055
					top ? val : window.pageYOffset
9056
				);
9057
9058
			} else {
9059
				elem[ method ] = val;
9060
			}
9061
		}, method, val, arguments.length, null );
9062
	};
9063
});
9064
9065
// Add the top/left cssHooks using jQuery.fn.position
9066
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
9067
// getComputedStyle returns percent when specified for top/left/bottom/right
9068
// rather than make the css module depend on the offset module, we just check for it here
9069
jQuery.each( [ "top", "left" ], function( i, prop ) {
9070
	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
9071
		function( elem, computed ) {
9072
			if ( computed ) {
9073
				computed = curCSS( elem, prop );
9074
				// if curCSS returns percentage, fallback to offset
9075
				return rnumnonpx.test( computed ) ?
9076
					jQuery( elem ).position()[ prop ] + "px" :
9077
					computed;
9078
			}
9079
		}
9080
	);
9081
});
9082
9083
9084
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
9085 View Code Duplication
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
9086
	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
9087
		// margin is only for outerHeight, outerWidth
9088
		jQuery.fn[ funcName ] = function( margin, value ) {
9089
			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
9090
				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
9091
9092
			return access( this, function( elem, type, value ) {
9093
				var doc;
9094
9095
				if ( jQuery.isWindow( elem ) ) {
9096
					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
9097
					// isn't a whole lot we can do. See pull request at this URL for discussion:
9098
					// https://github.com/jquery/jquery/pull/764
9099
					return elem.document.documentElement[ "client" + name ];
9100
				}
9101
9102
				// Get document width or height
9103
				if ( elem.nodeType === 9 ) {
9104
					doc = elem.documentElement;
9105
9106
					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
9107
					// whichever is greatest
9108
					return Math.max(
9109
						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
9110
						elem.body[ "offset" + name ], doc[ "offset" + name ],
9111
						doc[ "client" + name ]
9112
					);
9113
				}
9114
9115
				return value === undefined ?
9116
					// Get width or height on the element, requesting but not forcing parseFloat
9117
					jQuery.css( elem, type, extra ) :
9118
9119
					// Set width or height on the element
9120
					jQuery.style( elem, type, value, extra );
9121
			}, type, chainable ? margin : undefined, chainable, null );
9122
		};
9123
	});
9124
});
9125
9126
9127
// The number of elements contained in the matched element set
9128
jQuery.fn.size = function() {
9129
	return this.length;
9130
};
9131
9132
jQuery.fn.andSelf = jQuery.fn.addBack;
9133
9134
9135
9136
9137
// Register as a named AMD module, since jQuery can be concatenated with other
9138
// files that may use define, but not via a proper concatenation script that
9139
// understands anonymous AMD modules. A named AMD is safest and most robust
9140
// way to register. Lowercase jquery is used because AMD module names are
9141
// derived from file names, and jQuery is normally delivered in a lowercase
9142
// file name. Do this after creating the global so that if an AMD module wants
9143
// to call noConflict to hide this version of jQuery, it will work.
9144
9145
// Note that for maximum portability, libraries that are not jQuery should
9146
// declare themselves as anonymous modules, and avoid setting a global if an
9147
// AMD loader is present. jQuery is a special case. For more information, see
9148
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
9149
9150
if ( typeof define === "function" && define.amd ) {
9151
	define( "jquery", [], function() {
9152
		return jQuery;
9153
	});
9154
}
9155
9156
9157
9158
9159
var
9160
	// Map over jQuery in case of overwrite
9161
	_jQuery = window.jQuery,
9162
9163
	// Map over the $ in case of overwrite
9164
	_$ = window.$;
9165
9166
jQuery.noConflict = function( deep ) {
9167
	if ( window.$ === jQuery ) {
9168
		window.$ = _$;
9169
	}
9170
9171
	if ( deep && window.jQuery === jQuery ) {
9172
		window.jQuery = _jQuery;
9173
	}
9174
9175
	return jQuery;
9176
};
9177
9178
// Expose jQuery and $ identifiers, even in
9179
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
9180
// and CommonJS for browser emulators (#13566)
9181
if ( typeof noGlobal === strundefined ) {
9182
	window.jQuery = window.$ = jQuery;
9183
}
9184
9185
9186
9187
9188
return jQuery;
9189
9190
}));
9191