jquery.js ➔ doScrollCheck   F
last analyzed

Complexity

Conditions 14

Size

Total Lines 17
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 14
eloc 9
dl 0
loc 17
rs 3.6
c 0
b 0
f 0

How to fix   Complexity   

Complexity

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

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

1
/*!
2
 * jQuery JavaScript Library v1.5
3
 * http://jquery.com/
4
 *
5
 * Copyright 2011, John Resig
6
 * Dual licensed under the MIT or GPL Version 2 licenses.
7
 * http://jquery.org/license
8
 *
9
 * Includes Sizzle.js
10
 * http://sizzlejs.com/
11
 * Copyright 2011, The Dojo Foundation
12
 * Released under the MIT, BSD, and GPL Licenses.
13
 *
14
 * Date: Mon Jan 31 08:31:29 2011 -0500
15
 */
16
(function( window, undefined ) {
17
18
// Use the correct document accordingly with window argument (sandbox)
19
var document = window.document;
20
var jQuery = (function() {
21
22
// Define a local copy of jQuery
23
var jQuery = function( selector, context ) {
24
		// The jQuery object is actually just the init constructor 'enhanced'
25
		return new jQuery.fn.init( selector, context, rootjQuery );
26
	},
27
28
	// Map over jQuery in case of overwrite
29
	_jQuery = window.jQuery,
30
31
	// Map over the $ in case of overwrite
32
	_$ = window.$,
33
34
	// A central reference to the root jQuery(document)
35
	rootjQuery,
36
37
	// A simple way to check for HTML strings or ID strings
38
	// (both of which we optimize for)
39
	quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
40
41
	// Check if a string has a non-whitespace character in it
42
	rnotwhite = /\S/,
43
44
	// Used for trimming whitespace
45
	trimLeft = /^\s+/,
46
	trimRight = /\s+$/,
47
48
	// Check for digits
49
	rdigit = /\d/,
50
51
	// Match a standalone tag
52
	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
53
54
	// JSON RegExp
55
	rvalidchars = /^[\],:{}\s]*$/,
56
	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
57
	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
58
	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
59
60
	// Useragent RegExp
61
	rwebkit = /(webkit)[ \/]([\w.]+)/,
62
	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
63
	rmsie = /(msie) ([\w.]+)/,
64
	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
65
66
	// Keep a UserAgent string for use with jQuery.browser
67
	userAgent = navigator.userAgent,
68
69
	// For matching the engine and version of the browser
70
	browserMatch,
71
72
	// Has the ready events already been bound?
73
	readyBound = false,
74
75
	// The deferred used on DOM ready
76
	readyList,
77
78
	// Promise methods
79
	promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
80
81
	// The ready event handler
82
	DOMContentLoaded,
83
84
	// Save a reference to some core methods
85
	toString = Object.prototype.toString,
86
	hasOwn = Object.prototype.hasOwnProperty,
87
	push = Array.prototype.push,
88
	slice = Array.prototype.slice,
89
	trim = String.prototype.trim,
90
	indexOf = Array.prototype.indexOf,
91
92
	// [[Class]] -> type pairs
93
	class2type = {};
94
95
jQuery.fn = jQuery.prototype = {
96
	constructor: jQuery,
97 View Code Duplication
	init: function( selector, context, rootjQuery ) {
98
		var match, elem, ret, doc;
99
100
		// Handle $(""), $(null), or $(undefined)
101
		if ( !selector ) {
102
			return this;
103
		}
104
105
		// Handle $(DOMElement)
106
		if ( selector.nodeType ) {
107
			this.context = this[0] = selector;
108
			this.length = 1;
109
			return this;
110
		}
111
112
		// The body element only exists once, optimize finding it
113
		if ( selector === "body" && !context && document.body ) {
114
			this.context = document;
115
			this[0] = document.body;
116
			this.selector = "body";
117
			this.length = 1;
118
			return this;
119
		}
120
121
		// Handle HTML strings
122
		if ( typeof selector === "string" ) {
123
			// Are we dealing with HTML string or an ID?
124
			match = quickExpr.exec( selector );
125
126
			// Verify a match, and that no context was specified for #id
127
			if ( match && (match[1] || !context) ) {
128
129
				// HANDLE: $(html) -> $(array)
130
				if ( match[1] ) {
131
					context = context instanceof jQuery ? context[0] : context;
132
					doc = (context ? context.ownerDocument || context : document);
133
134
					// If a single string is passed in and it's a single tag
135
					// just do a createElement and skip the rest
136
					ret = rsingleTag.exec( selector );
137
138
					if ( ret ) {
139
						if ( jQuery.isPlainObject( context ) ) {
140
							selector = [ document.createElement( ret[1] ) ];
141
							jQuery.fn.attr.call( selector, context, true );
142
143
						} else {
144
							selector = [ doc.createElement( ret[1] ) ];
145
						}
146
147
					} else {
148
						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
149
						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
150
					}
151
152
					return jQuery.merge( this, selector );
153
154
				// HANDLE: $("#id")
155
				} 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...
156
					elem = document.getElementById( match[2] );
157
158
					// Check parentNode to catch when Blackberry 4.6 returns
159
					// nodes that are no longer in the document #6963
160
					if ( elem && elem.parentNode ) {
161
						// Handle the case where IE and Opera return items
162
						// by name instead of ID
163
						if ( elem.id !== match[2] ) {
164
							return rootjQuery.find( selector );
165
						}
166
167
						// Otherwise, we inject the element directly into the jQuery object
168
						this.length = 1;
169
						this[0] = elem;
170
					}
171
172
					this.context = document;
173
					this.selector = selector;
174
					return this;
175
				}
176
177
			// HANDLE: $(expr, $(...))
178
			} else if ( !context || context.jquery ) {
179
				return (context || rootjQuery).find( selector );
180
181
			// HANDLE: $(expr, context)
182
			// (which is just equivalent to: $(context).find(expr)
183
			} else {
184
				return this.constructor( context ).find( selector );
185
			}
186
187
		// HANDLE: $(function)
188
		// Shortcut for document ready
189
		} else if ( jQuery.isFunction( selector ) ) {
190
			return rootjQuery.ready( selector );
191
		}
192
193
		if (selector.selector !== undefined) {
194
			this.selector = selector.selector;
195
			this.context = selector.context;
196
		}
197
198
		return jQuery.makeArray( selector, this );
199
	},
200
201
	// Start with an empty selector
202
	selector: "",
203
204
	// The current version of jQuery being used
205
	jquery: "1.5",
206
207
	// The default length of a jQuery object is 0
208
	length: 0,
209
210
	// The number of elements contained in the matched element set
211
	size: function() {
212
		return this.length;
213
	},
214
215
	toArray: function() {
216
		return slice.call( this, 0 );
217
	},
218
219
	// Get the Nth element in the matched element set OR
220
	// Get the whole matched element set as a clean array
221
	get: function( num ) {
222
		return num == null ?
223
224
			// Return a 'clean' array
225
			this.toArray() :
226
227
			// Return just the object
228
			( num < 0 ? this[ this.length + num ] : this[ num ] );
229
	},
230
231
	// Take an array of elements and push it onto the stack
232
	// (returning the new matched element set)
233 View Code Duplication
	pushStack: function( elems, name, selector ) {
234
		// Build a new jQuery matched element set
235
		var ret = this.constructor();
236
237
		if ( jQuery.isArray( elems ) ) {
238
			push.apply( ret, elems );
239
240
		} else {
241
			jQuery.merge( ret, elems );
242
		}
243
244
		// Add the old object onto the stack (as a reference)
245
		ret.prevObject = this;
246
247
		ret.context = this.context;
248
249
		if ( name === "find" ) {
250
			ret.selector = this.selector + (this.selector ? " " : "") + selector;
251
		} else if ( name ) {
252
			ret.selector = this.selector + "." + name + "(" + selector + ")";
253
		}
254
255
		// Return the newly-formed element set
256
		return ret;
257
	},
258
259
	// Execute a callback for every element in the matched set.
260
	// (You can seed the arguments with an array of args, but this is
261
	// only used internally.)
262
	each: function( callback, args ) {
263
		return jQuery.each( this, callback, args );
264
	},
265
266
	ready: function( fn ) {
267
		// Attach the listeners
268
		jQuery.bindReady();
269
270
		// Add the callback
271
		readyList.done( fn );
272
273
		return this;
274
	},
275
276
	eq: function( i ) {
277
		return i === -1 ?
278
			this.slice( i ) :
279
			this.slice( i, +i + 1 );
280
	},
281
282
	first: function() {
283
		return this.eq( 0 );
284
	},
285
286
	last: function() {
287
		return this.eq( -1 );
288
	},
289
290
	slice: function() {
291
		return this.pushStack( slice.apply( this, arguments ),
292
			"slice", slice.call(arguments).join(",") );
293
	},
294
295
	map: function( callback ) {
296
		return this.pushStack( jQuery.map(this, function( elem, i ) {
297
			return callback.call( elem, i, elem );
298
		}));
299
	},
300
301
	end: function() {
302
		return this.prevObject || this.constructor(null);
303
	},
304
305
	// For internal use only.
306
	// Behaves like an Array's method, not like a jQuery method.
307
	push: push,
308
	sort: [].sort,
309
	splice: [].splice
310
};
311
312
// Give the init function the jQuery prototype for later instantiation
313
jQuery.fn.init.prototype = jQuery.fn;
314
315 View Code Duplication
jQuery.extend = jQuery.fn.extend = function() {
316
	 var options, name, src, copy, copyIsArray, clone,
317
		target = arguments[0] || {},
318
		i = 1,
319
		length = arguments.length,
320
		deep = false;
321
322
	// Handle a deep copy situation
323
	if ( typeof target === "boolean" ) {
324
		deep = target;
325
		target = arguments[1] || {};
326
		// skip the boolean and the target
327
		i = 2;
328
	}
329
330
	// Handle case when target is a string or something (possible in deep copy)
331
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
332
		target = {};
333
	}
334
335
	// extend jQuery itself if only one argument is passed
336
	if ( length === i ) {
337
		target = this;
338
		--i;
339
	}
340
341
	for ( ; i < length; i++ ) {
342
		// Only deal with non-null/undefined values
343
		if ( (options = arguments[ i ]) != null ) {
344
			// Extend the base object
345
			for ( name in options ) {
346
				src = target[ name ];
347
				copy = options[ name ];
348
349
				// Prevent never-ending loop
350
				if ( target === copy ) {
351
					continue;
352
				}
353
354
				// Recurse if we're merging plain objects or arrays
355
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
356
					if ( copyIsArray ) {
357
						copyIsArray = false;
358
						clone = src && jQuery.isArray(src) ? src : [];
359
360
					} else {
361
						clone = src && jQuery.isPlainObject(src) ? src : {};
362
					}
363
364
					// Never move original objects, clone them
365
					target[ name ] = jQuery.extend( deep, clone, copy );
366
367
				// Don't bring in undefined values
368
				} else if ( copy !== undefined ) {
369
					target[ name ] = copy;
370
				}
371
			}
372
		}
373
	}
374
375
	// Return the modified object
376
	return target;
377
};
378
379
jQuery.extend({
380
	noConflict: function( deep ) {
381
		window.$ = _$;
382
383
		if ( deep ) {
384
			window.jQuery = _jQuery;
385
		}
386
387
		return jQuery;
388
	},
389
390
	// Is the DOM ready to be used? Set to true once it occurs.
391
	isReady: false,
392
393
	// A counter to track how many items to wait for before
394
	// the ready event fires. See #6781
395
	readyWait: 1,
396
397
	// Handle when the DOM is ready
398
	ready: function( wait ) {
399
		// A third-party is pushing the ready event forwards
400
		if ( wait === true ) {
401
			jQuery.readyWait--;
402
		}
403
404
		// Make sure that the DOM is not already loaded
405
		if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
406
			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
407
			if ( !document.body ) {
408
				return setTimeout( jQuery.ready, 1 );
409
			}
410
411
			// Remember that the DOM is ready
412
			jQuery.isReady = true;
413
414
			// If a normal DOM Ready event fired, decrement, and wait if need be
415
			if ( wait !== true && --jQuery.readyWait > 0 ) {
416
				return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
417
			}
418
419
			// If there are functions bound, to execute
420
			readyList.resolveWith( document, [ jQuery ] );
421
422
			// Trigger any bound ready events
423
			if ( jQuery.fn.trigger ) {
424
				jQuery( document ).trigger( "ready" ).unbind( "ready" );
425
			}
426
		}
427
	},
428
429 View Code Duplication
	bindReady: function() {
430
		if ( readyBound ) {
431
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
432
		}
433
434
		readyBound = true;
435
436
		// Catch cases where $(document).ready() is called after the
437
		// browser event has already occurred.
438
		if ( document.readyState === "complete" ) {
439
			// Handle it asynchronously to allow scripts the opportunity to delay ready
440
			return setTimeout( jQuery.ready, 1 );
441
		}
442
443
		// Mozilla, Opera and webkit nightlies currently support this event
444
		if ( document.addEventListener ) {
445
			// Use the handy event callback
446
			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
447
448
			// A fallback to window.onload, that will always work
449
			window.addEventListener( "load", jQuery.ready, false );
450
451
		// If IE event model is used
452
		} else if ( document.attachEvent ) {
453
			// ensure firing before onload,
454
			// maybe late but safe also for iframes
455
			document.attachEvent("onreadystatechange", DOMContentLoaded);
456
457
			// A fallback to window.onload, that will always work
458
			window.attachEvent( "onload", jQuery.ready );
459
460
			// If IE and not a frame
461
			// continually check to see if the document is ready
462
			var toplevel = false;
463
464
			try {
465
				toplevel = window.frameElement == null;
466
			} 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...
467
468
			if ( document.documentElement.doScroll && toplevel ) {
469
				doScrollCheck();
470
			}
471
		}
472
	},
473
474
	// See test/unit/core.js for details concerning isFunction.
475
	// Since version 1.3, DOM methods and functions like alert
476
	// aren't supported. They return false on IE (#2968).
477
	isFunction: function( obj ) {
478
		return jQuery.type(obj) === "function";
479
	},
480
481
	isArray: Array.isArray || function( obj ) {
482
		return jQuery.type(obj) === "array";
483
	},
484
485
	// A crude way of determining if an object is a window
486
	isWindow: function( obj ) {
487
		return obj && typeof obj === "object" && "setInterval" in obj;
488
	},
489
490
	isNaN: function( obj ) {
491
		return obj == null || !rdigit.test( obj ) || isNaN( obj );
492
	},
493
494
	type: function( obj ) {
495
		return obj == null ?
496
			String( obj ) :
497
			class2type[ toString.call(obj) ] || "object";
498
	},
499
500 View Code Duplication
	isPlainObject: function( obj ) {
501
		// Must be an Object.
502
		// Because of IE, we also have to check the presence of the constructor property.
503
		// Make sure that DOM nodes and window objects don't pass through, as well
504
		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
505
			return false;
506
		}
507
508
		// Not own constructor property must be Object
509
		if ( obj.constructor &&
510
			!hasOwn.call(obj, "constructor") &&
511
			!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
512
			return false;
513
		}
514
515
		// Own properties are enumerated firstly, so to speed up,
516
		// if last one is own, then all properties are own.
517
518
		var key;
519
		for ( key in obj ) {}
0 ignored issues
show
Comprehensibility Documentation Best Practice introduced by
This code block is empty. Consider removing it or adding a comment to explain.
Loading history...
520
521
		return key === undefined || hasOwn.call( obj, key );
522
	},
523
524
	isEmptyObject: function( obj ) {
525
		for ( var name in obj ) {
526
			return false;
527
		}
528
		return true;
529
	},
530
531
	error: function( msg ) {
532
		throw msg;
533
	},
534
535
	parseJSON: function( data ) {
536
		if ( typeof data !== "string" || !data ) {
537
			return null;
538
		}
539
540
		// Make sure leading/trailing whitespace is removed (IE can't handle it)
541
		data = jQuery.trim( data );
542
543
		// Make sure the incoming data is actual JSON
544
		// Logic borrowed from http://json.org/json2.js
545
		if ( rvalidchars.test(data.replace(rvalidescape, "@")
546
			.replace(rvalidtokens, "]")
547
			.replace(rvalidbraces, "")) ) {
548
549
			// Try to use the native JSON parser first
550
			return window.JSON && window.JSON.parse ?
551
				window.JSON.parse( data ) :
552
				(new Function("return " + data))();
0 ignored issues
show
Performance Best Practice introduced by
Using new Function() to create a function is slow and difficult to debug. Such functions do not create a closure. Consider using another way to define your function.
Loading history...
553
554
		} 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...
555
			jQuery.error( "Invalid JSON: " + data );
556
		}
557
	},
558
559
	// Cross-browser xml parsing
560
	// (xml & tmp used internally)
561
	parseXML: function( data , xml , tmp ) {
562
563
		if ( window.DOMParser ) { // Standard
564
			tmp = new DOMParser();
565
			xml = tmp.parseFromString( data , "text/xml" );
566
		} else { // IE
567
			xml = new ActiveXObject( "Microsoft.XMLDOM" );
568
			xml.async = "false";
569
			xml.loadXML( data );
570
		}
571
572
		tmp = xml.documentElement;
573
574
		if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
575
			jQuery.error( "Invalid XML: " + data );
576
		}
577
578
		return xml;
579
	},
580
581
	noop: function() {},
582
583
	// Evalulates a script in a global context
584
	globalEval: function( data ) {
585
		if ( data && rnotwhite.test(data) ) {
586
			// Inspired by code by Andrea Giammarchi
587
			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
588
			var head = document.getElementsByTagName("head")[0] || document.documentElement,
589
				script = document.createElement("script");
590
591
			script.type = "text/javascript";
592
593
			if ( jQuery.support.scriptEval() ) {
594
				script.appendChild( document.createTextNode( data ) );
595
			} else {
596
				script.text = data;
597
			}
598
599
			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
600
			// This arises when a base node is used (#2709).
601
			head.insertBefore( script, head.firstChild );
602
			head.removeChild( script );
603
		}
604
	},
605
606
	nodeName: function( elem, name ) {
607
		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
608
	},
609
610
	// args is for internal usage only
611
	each: function( object, callback, args ) {
612
		var name, i = 0,
613
			length = object.length,
614
			isObj = length === undefined || jQuery.isFunction(object);
615
616
		if ( args ) {
617
			if ( isObj ) {
618
				for ( name in object ) {
619
					if ( callback.apply( object[ name ], args ) === false ) {
620
						break;
621
					}
622
				}
623
			} else {
624
				for ( ; i < length; ) {
625
					if ( callback.apply( object[ i++ ], args ) === false ) {
626
						break;
627
					}
628
				}
629
			}
630
631
		// A special, fast, case for the most common use of each
632
		} else {
633
			if ( isObj ) {
634
				for ( name in object ) {
635
					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
636
						break;
637
					}
638
				}
639
			} else {
640
				for ( var value = object[0];
641
					i < length && callback.call( value, i, value ) !== false; value = object[++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...
642
			}
643
		}
644
645
		return object;
646
	},
647
648
	// Use native String.trim function wherever possible
649
	trim: trim ?
650
		function( text ) {
651
			return text == null ?
652
				"" :
653
				trim.call( text );
654
		} :
655
656
		// Otherwise use our own trimming functionality
657
		function( text ) {
658
			return text == null ?
659
				"" :
660
				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
661
		},
662
663
	// results is for internal usage only
664 View Code Duplication
	makeArray: function( array, results ) {
665
		var ret = results || [];
666
667
		if ( array != null ) {
668
			// The window, strings (and functions) also have 'length'
669
			// The extra typeof function check is to prevent crashes
670
			// in Safari 2 (See: #3039)
671
			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
672
			var type = jQuery.type(array);
673
674
			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
675
				push.call( ret, array );
676
			} else {
677
				jQuery.merge( ret, array );
678
			}
679
		}
680
681
		return ret;
682
	},
683
684
	inArray: function( elem, array ) {
685
		if ( array.indexOf ) {
686
			return array.indexOf( elem );
687
		}
688
689
		for ( var i = 0, length = array.length; i < length; i++ ) {
690
			if ( array[ i ] === elem ) {
691
				return i;
692
			}
693
		}
694
695
		return -1;
696
	},
697
698 View Code Duplication
	merge: function( first, second ) {
699
		var i = first.length,
700
			j = 0;
701
702
		if ( typeof second.length === "number" ) {
703
			for ( var l = second.length; j < l; j++ ) {
704
				first[ i++ ] = second[ j ];
705
			}
706
707
		} else {
708
			while ( second[j] !== undefined ) {
709
				first[ i++ ] = second[ j++ ];
710
			}
711
		}
712
713
		first.length = i;
714
715
		return first;
716
	},
717
718 View Code Duplication
	grep: function( elems, callback, inv ) {
719
		var ret = [], retVal;
720
		inv = !!inv;
721
722
		// Go through the array, only saving the items
723
		// that pass the validator function
724
		for ( var i = 0, length = elems.length; i < length; i++ ) {
725
			retVal = !!callback( elems[ i ], i );
726
			if ( inv !== retVal ) {
727
				ret.push( elems[ i ] );
728
			}
729
		}
730
731
		return ret;
732
	},
733
734
	// arg is for internal usage only
735
	map: function( elems, callback, arg ) {
736
		var ret = [], value;
737
738
		// Go through the array, translating each of the items to their
739
		// new value (or values).
740
		for ( var i = 0, length = elems.length; i < length; i++ ) {
741
			value = callback( elems[ i ], i, arg );
742
743
			if ( value != null ) {
744
				ret[ ret.length ] = value;
745
			}
746
		}
747
748
		// Flatten any nested arrays
749
		return ret.concat.apply( [], ret );
750
	},
751
752
	// A global GUID counter for objects
753
	guid: 1,
754
755
	proxy: function( fn, proxy, thisObject ) {
756
		if ( arguments.length === 2 ) {
757
			if ( typeof proxy === "string" ) {
758
				thisObject = fn;
759
				fn = thisObject[ proxy ];
760
				proxy = undefined;
761
762
			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
763
				thisObject = proxy;
764
				proxy = undefined;
765
			}
766
		}
767
768
		if ( !proxy && fn ) {
769
			proxy = function() {
770
				return fn.apply( thisObject || this, arguments );
771
			};
772
		}
773
774
		// Set the guid of unique handler to the same of original handler, so it can be removed
775
		if ( fn ) {
776
			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
777
		}
778
779
		// So proxy can be declared as an argument
780
		return proxy;
781
	},
782
783
	// Mutifunctional method to get and set values to a collection
784
	// The value/s can be optionally by executed if its a function
785 View Code Duplication
	access: function( elems, key, value, exec, fn, pass ) {
786
		var length = elems.length;
787
788
		// Setting many attributes
789
		if ( typeof key === "object" ) {
790
			for ( var k in key ) {
791
				jQuery.access( elems, k, key[k], exec, fn, value );
792
			}
793
			return elems;
794
		}
795
796
		// Setting one attribute
797
		if ( value !== undefined ) {
798
			// Optionally, function values get executed if exec is true
799
			exec = !pass && exec && jQuery.isFunction(value);
800
801
			for ( var i = 0; i < length; i++ ) {
802
				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
803
			}
804
805
			return elems;
806
		}
807
808
		// Getting an attribute
809
		return length ? fn( elems[0], key ) : undefined;
810
	},
811
812
	now: function() {
813
		return (new Date()).getTime();
814
	},
815
816
	// Create a simple deferred (one callbacks list)
817
	_Deferred: function() {
818
		var // callbacks list
819
			callbacks = [],
820
			// stored [ context , args ]
821
			fired,
822
			// to avoid firing when already doing so
823
			firing,
824
			// flag to know if the deferred has been cancelled
825
			cancelled,
826
			// the deferred itself
827
			deferred  = {
828
829
				// done( f1, f2, ...)
830
				done: function() {
831
					if ( !cancelled ) {
832
						var args = arguments,
833
							i,
834
							length,
835
							elem,
836
							type,
837
							_fired;
838
						if ( fired ) {
839
							_fired = fired;
840
							fired = 0;
841
						}
842
						for ( i = 0, length = args.length; i < length; i++ ) {
843
							elem = args[ i ];
844
							type = jQuery.type( elem );
845
							if ( type === "array" ) {
846
								deferred.done.apply( deferred, elem );
847
							} else if ( type === "function" ) {
848
								callbacks.push( elem );
849
							}
850
						}
851
						if ( _fired ) {
852
							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
853
						}
854
					}
855
					return this;
856
				},
857
858
				// resolve with given context and args
859
				resolveWith: function( context, args ) {
860
					if ( !cancelled && !fired && !firing ) {
861
						firing = 1;
862
						try {
863
							while( callbacks[ 0 ] ) {
864
								callbacks.shift().apply( context, args );
865
							}
866
						}
867
						finally {
868
							fired = [ context, args ];
869
							firing = 0;
870
						}
871
					}
872
					return this;
873
				},
874
875
				// resolve with this as context and given arguments
876
				resolve: function() {
877
					deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments );
878
					return this;
879
				},
880
881
				// Has this deferred been resolved?
882
				isResolved: function() {
883
					return !!( firing || fired );
884
				},
885
886
				// Cancel
887
				cancel: function() {
888
					cancelled = 1;
889
					callbacks = [];
890
					return this;
891
				}
892
			};
893
894
		return deferred;
895
	},
896
897
	// Full fledged deferred (two callbacks list)
898
	Deferred: function( func ) {
899
		var deferred = jQuery._Deferred(),
900
			failDeferred = jQuery._Deferred(),
901
			promise;
902
		// Add errorDeferred methods, then and promise
903
		jQuery.extend( deferred, {
904
			then: function( doneCallbacks, failCallbacks ) {
905
				deferred.done( doneCallbacks ).fail( failCallbacks );
906
				return this;
907
			},
908
			fail: failDeferred.done,
909
			rejectWith: failDeferred.resolveWith,
910
			reject: failDeferred.resolve,
911
			isRejected: failDeferred.isResolved,
912
			// Get a promise for this deferred
913
			// If obj is provided, the promise aspect is added to the object
914
			promise: function( obj , i /* internal */ ) {
915
				if ( obj == null ) {
916
					if ( promise ) {
917
						return promise;
918
					}
919
					promise = obj = {};
920
				}
921
				i = promiseMethods.length;
922
				while( i-- ) {
923
					obj[ promiseMethods[ i ] ] = deferred[ promiseMethods[ i ] ];
924
				}
925
				return obj;
926
			}
927
		} );
928
		// Make sure only one callback list will be used
929
		deferred.then( failDeferred.cancel, deferred.cancel );
930
		// Unexpose cancel
931
		delete deferred.cancel;
932
		// Call given func if any
933
		if ( func ) {
934
			func.call( deferred, deferred );
935
		}
936
		return deferred;
937
	},
938
939
	// Deferred helper
940
	when: function( object ) {
941
		var args = arguments,
942
			length = args.length,
943
			deferred = length <= 1 && object && jQuery.isFunction( object.promise ) ?
944
				object :
945
				jQuery.Deferred(),
946
			promise = deferred.promise(),
947
			resolveArray;
948
949
		if ( length > 1 ) {
950
			resolveArray = new Array( length );
951
			jQuery.each( args, function( index, element ) {
952
				jQuery.when( element ).then( function( value ) {
953
					resolveArray[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
954
					if( ! --length ) {
955
						deferred.resolveWith( promise, resolveArray );
956
					}
957
				}, deferred.reject );
958
			} );
959
		} else if ( deferred !== object ) {
960
			deferred.resolve( object );
961
		}
962
		return promise;
963
	},
964
965
	// Use of jQuery.browser is frowned upon.
966
	// More details: http://docs.jquery.com/Utilities/jQuery.browser
967
	uaMatch: function( ua ) {
968
		ua = ua.toLowerCase();
969
970
		var match = rwebkit.exec( ua ) ||
971
			ropera.exec( ua ) ||
972
			rmsie.exec( ua ) ||
973
			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
974
			[];
975
976
		return { browser: match[1] || "", version: match[2] || "0" };
977
	},
978
979
	sub: function() {
980
		function jQuerySubclass( selector, context ) {
981
			return new jQuerySubclass.fn.init( selector, context );
982
		}
983
		jQuery.extend( true, jQuerySubclass, this );
984
		jQuerySubclass.superclass = this;
985
		jQuerySubclass.fn = jQuerySubclass.prototype = this();
986
		jQuerySubclass.fn.constructor = jQuerySubclass;
987
		jQuerySubclass.subclass = this.subclass;
988
		jQuerySubclass.fn.init = function init( selector, context ) {
989
			if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
990
				context = jQuerySubclass(context);
991
			}
992
993
			return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
994
		};
995
		jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
996
		var rootjQuerySubclass = jQuerySubclass(document);
997
		return jQuerySubclass;
998
	},
999
1000
	browser: {}
1001
});
1002
1003
// Create readyList deferred
1004
readyList = jQuery._Deferred();
1005
1006
// Populate the class2type map
1007
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
1008
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
1009
});
1010
1011
browserMatch = jQuery.uaMatch( userAgent );
1012
if ( browserMatch.browser ) {
1013
	jQuery.browser[ browserMatch.browser ] = true;
1014
	jQuery.browser.version = browserMatch.version;
1015
}
1016
1017
// Deprecated, use jQuery.browser.webkit instead
1018
if ( jQuery.browser.webkit ) {
1019
	jQuery.browser.safari = true;
1020
}
1021
1022
if ( indexOf ) {
1023
	jQuery.inArray = function( elem, array ) {
1024
		return indexOf.call( array, elem );
1025
	};
1026
}
1027
1028
// IE doesn't match non-breaking spaces with \s
1029
if ( rnotwhite.test( "\xA0" ) ) {
1030
	trimLeft = /^[\s\xA0]+/;
1031
	trimRight = /[\s\xA0]+$/;
1032
}
1033
1034
// All jQuery objects should point back to these
1035
rootjQuery = jQuery(document);
1036
1037
// Cleanup functions for the document ready method
1038
if ( document.addEventListener ) {
1039
	DOMContentLoaded = function() {
1040
		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
1041
		jQuery.ready();
1042
	};
1043
1044
} else if ( document.attachEvent ) {
1045
	DOMContentLoaded = function() {
1046
		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
1047
		if ( document.readyState === "complete" ) {
1048
			document.detachEvent( "onreadystatechange", DOMContentLoaded );
1049
			jQuery.ready();
1050
		}
1051
	};
1052
}
1053
1054
// The DOM ready check for Internet Explorer
1055
function doScrollCheck() {
1056
	if ( jQuery.isReady ) {
1057
		return;
1058
	}
1059
1060
	try {
1061
		// If IE is used, use the trick by Diego Perini
1062
		// http://javascript.nwbox.com/IEContentLoaded/
1063
		document.documentElement.doScroll("left");
1064
	} catch(e) {
1065
		setTimeout( doScrollCheck, 1 );
1066
		return;
1067
	}
1068
1069
	// and execute any waiting functions
1070
	jQuery.ready();
1071
}
1072
1073
// Expose jQuery to the global object
1074
return (window.jQuery = window.jQuery = jQuery);
1075
1076
})();
1077
1078
1079
(function() {
1080
1081
	jQuery.support = {};
1082
1083
	var div = document.createElement("div");
1084
1085
	div.style.display = "none";
1086
	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1087
1088
	var all = div.getElementsByTagName("*"),
1089
		a = div.getElementsByTagName("a")[0],
1090
		select = document.createElement("select"),
1091
		opt = select.appendChild( document.createElement("option") );
1092
1093
	// Can't get basic test support
1094
	if ( !all || !all.length || !a ) {
1095
		return;
1096
	}
1097
1098
	jQuery.support = {
1099
		// IE strips leading whitespace when .innerHTML is used
1100
		leadingWhitespace: div.firstChild.nodeType === 3,
1101
1102
		// Make sure that tbody elements aren't automatically inserted
1103
		// IE will insert them into empty tables
1104
		tbody: !div.getElementsByTagName("tbody").length,
1105
1106
		// Make sure that link elements get serialized correctly by innerHTML
1107
		// This requires a wrapper element in IE
1108
		htmlSerialize: !!div.getElementsByTagName("link").length,
1109
1110
		// Get the style information from getAttribute
1111
		// (IE uses .cssText insted)
1112
		style: /red/.test( a.getAttribute("style") ),
1113
1114
		// Make sure that URLs aren't manipulated
1115
		// (IE normalizes it by default)
1116
		hrefNormalized: a.getAttribute("href") === "/a",
1117
1118
		// Make sure that element opacity exists
1119
		// (IE uses filter instead)
1120
		// Use a regex to work around a WebKit issue. See #5145
1121
		opacity: /^0.55$/.test( a.style.opacity ),
1122
1123
		// Verify style float existence
1124
		// (IE uses styleFloat instead of cssFloat)
1125
		cssFloat: !!a.style.cssFloat,
1126
1127
		// Make sure that if no value is specified for a checkbox
1128
		// that it defaults to "on".
1129
		// (WebKit defaults to "" instead)
1130
		checkOn: div.getElementsByTagName("input")[0].value === "on",
1131
1132
		// Make sure that a selected-by-default option has a working selected property.
1133
		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1134
		optSelected: opt.selected,
1135
1136
		// Will be defined later
1137
		deleteExpando: true,
1138
		optDisabled: false,
1139
		checkClone: false,
1140
		_scriptEval: null,
1141
		noCloneEvent: true,
1142
		boxModel: null,
1143
		inlineBlockNeedsLayout: false,
1144
		shrinkWrapBlocks: false,
1145
		reliableHiddenOffsets: true
1146
	};
1147
1148
	// Make sure that the options inside disabled selects aren't marked as disabled
1149
	// (WebKit marks them as diabled)
1150
	select.disabled = true;
1151
	jQuery.support.optDisabled = !opt.disabled;
1152
1153
	jQuery.support.scriptEval = function() {
1154
		if ( jQuery.support._scriptEval === null ) {
1155
			var root = document.documentElement,
1156
				script = document.createElement("script"),
1157
				id = "script" + jQuery.now();
1158
1159
			script.type = "text/javascript";
1160
			try {
1161
				script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
1162
			} 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...
1163
1164
			root.insertBefore( script, root.firstChild );
1165
1166
			// Make sure that the execution of code works by injecting a script
1167
			// tag with appendChild/createTextNode
1168
			// (IE doesn't support this, fails, and uses .text instead)
1169
			if ( window[ id ] ) {
1170
				jQuery.support._scriptEval = true;
1171
				delete window[ id ];
1172
			} else {
1173
				jQuery.support._scriptEval = false;
1174
			}
1175
1176
			root.removeChild( script );
1177
			// release memory in IE
1178
			root = script = id  = null;
1179
		}
1180
1181
		return jQuery.support._scriptEval;
1182
	};
1183
1184
	// Test to see if it's possible to delete an expando from an element
1185
	// Fails in Internet Explorer
1186
	try {
1187
		delete div.test;
1188
1189
	} catch(e) {
1190
		jQuery.support.deleteExpando = false;
1191
	}
1192
1193
	if ( div.attachEvent && div.fireEvent ) {
1194
		div.attachEvent("onclick", function click() {
1195
			// Cloning a node shouldn't copy over any
1196
			// bound event handlers (IE does this)
1197
			jQuery.support.noCloneEvent = false;
1198
			div.detachEvent("onclick", click);
1199
		});
1200
		div.cloneNode(true).fireEvent("onclick");
1201
	}
1202
1203
	div = document.createElement("div");
1204
	div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
1205
1206
	var fragment = document.createDocumentFragment();
1207
	fragment.appendChild( div.firstChild );
1208
1209
	// WebKit doesn't clone checked state correctly in fragments
1210
	jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
1211
1212
	// Figure out if the W3C box model works as expected
1213
	// document.body must exist before we can do this
1214
	jQuery(function() {
1215
		var div = document.createElement("div"),
1216
			body = document.getElementsByTagName("body")[0];
1217
1218
		// Frameset documents with no body should not run this code
1219
		if ( !body ) {
1220
			return;
1221
		}
1222
1223
		div.style.width = div.style.paddingLeft = "1px";
1224
		body.appendChild( div );
1225
		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
1226
1227
		if ( "zoom" in div.style ) {
1228
			// Check if natively block-level elements act like inline-block
1229
			// elements when setting their display to 'inline' and giving
1230
			// them layout
1231
			// (IE < 8 does this)
1232
			div.style.display = "inline";
1233
			div.style.zoom = 1;
1234
			jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2;
1235
1236
			// Check if elements with layout shrink-wrap their children
1237
			// (IE 6 does this)
1238
			div.style.display = "";
1239
			div.innerHTML = "<div style='width:4px;'></div>";
1240
			jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2;
1241
		}
1242
1243
		div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1244
		var tds = div.getElementsByTagName("td");
1245
1246
		// Check if table cells still have offsetWidth/Height when they are set
1247
		// to display:none and there are still other visible table cells in a
1248
		// table row; if so, offsetWidth/Height are not reliable for use when
1249
		// determining if an element has been hidden directly using
1250
		// display:none (it is still safe to use offsets if a parent element is
1251
		// hidden; don safety goggles and see bug #4512 for more information).
1252
		// (only IE 8 fails this test)
1253
		jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0;
1254
1255
		tds[0].style.display = "";
1256
		tds[1].style.display = "none";
1257
1258
		// Check if empty table cells still have offsetWidth/Height
1259
		// (IE < 8 fail this test)
1260
		jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
1261
		div.innerHTML = "";
1262
1263
		body.removeChild( div ).style.display = "none";
1264
		div = tds = null;
1265
	});
1266
1267
	// Technique from Juriy Zaytsev
1268
	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
1269
	var eventSupported = function( eventName ) {
1270
		var el = document.createElement("div");
1271
		eventName = "on" + eventName;
1272
1273
		// We only care about the case where non-standard event systems
1274
		// are used, namely in IE. Short-circuiting here helps us to
1275
		// avoid an eval call (in setAttribute) which can cause CSP
1276
		// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1277
		if ( !el.attachEvent ) {
1278
			return true;
1279
		}
1280
1281
		var isSupported = (eventName in el);
1282
		if ( !isSupported ) {
1283
			el.setAttribute(eventName, "return;");
1284
			isSupported = typeof el[eventName] === "function";
1285
		}
1286
		el = null;
1287
1288
		return isSupported;
1289
	};
1290
1291
	jQuery.support.submitBubbles = eventSupported("submit");
1292
	jQuery.support.changeBubbles = eventSupported("change");
1293
1294
	// release memory in IE
1295
	div = all = a = null;
1296
})();
1297
1298
1299
1300
var rbrace = /^(?:\{.*\}|\[.*\])$/;
1301
1302
jQuery.extend({
1303
	cache: {},
1304
1305
	// Please use with caution
1306
	uuid: 0,
1307
1308
	// Unique for each copy of jQuery on the page
1309
	// Non-digits removed to match rinlinejQuery
1310
	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1311
1312
	// The following elements throw uncatchable exceptions if you
1313
	// attempt to add expando properties to them.
1314
	noData: {
1315
		"embed": true,
1316
		// Ban all objects except for Flash (which handle expandos)
1317
		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1318
		"applet": true
1319
	},
1320
1321
	hasData: function( elem ) {
1322
		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1323
1324
		return !!elem && !jQuery.isEmptyObject(elem);
1325
	},
1326
1327
	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1328
		if ( !jQuery.acceptData( elem ) ) {
1329
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1330
		}
1331
1332
		var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
1333
1334
			// We have to handle DOM nodes and JS objects differently because IE6-7
1335
			// can't GC object references properly across the DOM-JS boundary
1336
			isNode = elem.nodeType,
1337
1338
			// Only DOM nodes need the global jQuery cache; JS object data is
1339
			// attached directly to the object so GC can occur automatically
1340
			cache = isNode ? jQuery.cache : elem,
1341
1342
			// Only defining an ID for JS objects if its cache already exists allows
1343
			// the code to shortcut on the same path as a DOM node with no cache
1344
			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
1345
1346
		// Avoid doing any more work than we need to when trying to get data on an
1347
		// object that has no data at all
1348
		if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
1349
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1350
		}
1351
1352
		if ( !id ) {
1353
			// Only DOM nodes need a new unique ID for each element since their data
1354
			// ends up in the global cache
1355
			if ( isNode ) {
1356
				elem[ jQuery.expando ] = id = ++jQuery.uuid;
1357
			} else {
1358
				id = jQuery.expando;
1359
			}
1360
		}
1361
1362
		if ( !cache[ id ] ) {
1363
			cache[ id ] = {};
1364
		}
1365
1366
		// An object can be passed to jQuery.data instead of a key/value pair; this gets
1367
		// shallow copied over onto the existing cache
1368
		if ( typeof name === "object" ) {
1369
			if ( pvt ) {
1370
				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
1371
			} else {
1372
				cache[ id ] = jQuery.extend(cache[ id ], name);
1373
			}
1374
		}
1375
1376
		thisCache = cache[ id ];
1377
1378
		// Internal jQuery data is stored in a separate object inside the object's data
1379
		// cache in order to avoid key collisions between internal data and user-defined
1380
		// data
1381
		if ( pvt ) {
1382
			if ( !thisCache[ internalKey ] ) {
1383
				thisCache[ internalKey ] = {};
1384
			}
1385
1386
			thisCache = thisCache[ internalKey ];
1387
		}
1388
1389
		if ( data !== undefined ) {
1390
			thisCache[ name ] = data;
1391
		}
1392
1393
		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
1394
		// not attempt to inspect the internal events object using jQuery.data, as this
1395
		// internal data object is undocumented and subject to change.
1396
		if ( name === "events" && !thisCache[name] ) {
1397
			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
1398
		}
1399
1400
		return getByName ? thisCache[ name ] : thisCache;
1401
	},
1402
1403
	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1404
		if ( !jQuery.acceptData( elem ) ) {
1405
			return;
1406
		}
1407
1408
		var internalKey = jQuery.expando, isNode = elem.nodeType,
1409
1410
			// See jQuery.data for more information
1411
			cache = isNode ? jQuery.cache : elem,
1412
1413
			// See jQuery.data for more information
1414
			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1415
1416
		// If there is already no cache entry for this object, there is no
1417
		// purpose in continuing
1418
		if ( !cache[ id ] ) {
1419
			return;
1420
		}
1421
1422
		if ( name ) {
1423
			var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
1424
1425
			if ( thisCache ) {
1426
				delete thisCache[ name ];
1427
1428
				// If there is no data left in the cache, we want to continue
1429
				// and let the cache object itself get destroyed
1430
				if ( !jQuery.isEmptyObject(thisCache) ) {
1431
					return;
1432
				}
1433
			}
1434
		}
1435
1436
		// See jQuery.data for more information
1437
		if ( pvt ) {
1438
			delete cache[ id ][ internalKey ];
1439
1440
			// Don't destroy the parent cache unless the internal data object
1441
			// had been the only thing left in it
1442
			if ( !jQuery.isEmptyObject(cache[ id ]) ) {
1443
				return;
1444
			}
1445
		}
1446
1447
		var internalCache = cache[ id ][ internalKey ];
1448
1449
		// Browsers that fail expando deletion also refuse to delete expandos on
1450
		// the window, but it will allow it on all other JS objects; other browsers
1451
		// don't care
1452
		if ( jQuery.support.deleteExpando || cache != window ) {
1453
			delete cache[ id ];
1454
		} else {
1455
			cache[ id ] = null;
1456
		}
1457
1458
		// We destroyed the entire user cache at once because it's faster than
1459
		// iterating through each key, but we need to continue to persist internal
1460
		// data if it existed
1461
		if ( internalCache ) {
1462
			cache[ id ] = {};
1463
			cache[ id ][ internalKey ] = internalCache;
1464
1465
		// Otherwise, we need to eliminate the expando on the node to avoid
1466
		// false lookups in the cache for entries that no longer exist
1467
		} else if ( isNode ) {
1468
			// IE does not allow us to delete expando properties from nodes,
1469
			// nor does it have a removeAttribute function on Document nodes;
1470
			// we must handle all of these cases
1471
			if ( jQuery.support.deleteExpando ) {
1472
				delete elem[ jQuery.expando ];
1473
			} else if ( elem.removeAttribute ) {
1474
				elem.removeAttribute( jQuery.expando );
1475
			} else {
1476
				elem[ jQuery.expando ] = null;
1477
			}
1478
		}
1479
	},
1480
1481
	// For internal use only.
1482
	_data: function( elem, name, data ) {
1483
		return jQuery.data( elem, name, data, true );
1484
	},
1485
1486
	// A method for determining if a DOM node can handle the data expando
1487
	acceptData: function( elem ) {
1488
		if ( elem.nodeName ) {
1489
			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1490
1491
			if ( match ) {
1492
				return !(match === true || elem.getAttribute("classid") !== match);
1493
			}
1494
		}
1495
1496
		return true;
1497
	}
1498
});
1499
1500
jQuery.fn.extend({
1501
	data: function( key, value ) {
1502
		var data = null;
1503
1504
		if ( typeof key === "undefined" ) {
1505
			if ( this.length ) {
1506
				data = jQuery.data( this[0] );
1507
1508
				if ( this[0].nodeType === 1 ) {
1509
					var attr = this[0].attributes, name;
1510
					for ( var i = 0, l = attr.length; i < l; i++ ) {
1511
						name = attr[i].name;
1512
1513
						if ( name.indexOf( "data-" ) === 0 ) {
1514
							name = name.substr( 5 );
1515
							dataAttr( this[0], name, data[ name ] );
1516
						}
1517
					}
1518
				}
1519
			}
1520
1521
			return data;
1522
1523
		} else if ( typeof key === "object" ) {
1524
			return this.each(function() {
1525
				jQuery.data( this, key );
1526
			});
1527
		}
1528
1529
		var parts = key.split(".");
1530
		parts[1] = parts[1] ? "." + parts[1] : "";
1531
1532
		if ( value === undefined ) {
1533
			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1534
1535
			// Try to fetch any internally stored data first
1536
			if ( data === undefined && this.length ) {
1537
				data = jQuery.data( this[0], key );
1538
				data = dataAttr( this[0], key, data );
1539
			}
1540
1541
			return data === undefined && parts[1] ?
1542
				this.data( parts[0] ) :
1543
				data;
1544
1545
		} 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...
1546
			return this.each(function() {
1547
				var $this = jQuery( this ),
1548
					args = [ parts[0], value ];
1549
1550
				$this.triggerHandler( "setData" + parts[1] + "!", args );
1551
				jQuery.data( this, key, value );
1552
				$this.triggerHandler( "changeData" + parts[1] + "!", args );
1553
			});
1554
		}
1555
	},
1556
1557
	removeData: function( key ) {
1558
		return this.each(function() {
1559
			jQuery.removeData( this, key );
1560
		});
1561
	}
1562
});
1563
1564
function dataAttr( elem, key, data ) {
1565
	// If nothing was found internally, try to fetch any
1566
	// data from the HTML5 data-* attribute
1567
	if ( data === undefined && elem.nodeType === 1 ) {
1568
		data = elem.getAttribute( "data-" + key );
1569
1570
		if ( typeof data === "string" ) {
1571
			try {
1572
				data = data === "true" ? true :
1573
				data === "false" ? false :
1574
				data === "null" ? null :
1575
				!jQuery.isNaN( data ) ? parseFloat( data ) :
1576
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
1577
					data;
1578
			} 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...
1579
1580
			// Make sure we set the data so it isn't changed later
1581
			jQuery.data( elem, key, data );
1582
1583
		} else {
1584
			data = undefined;
1585
		}
1586
	}
1587
1588
	return data;
1589
}
1590
1591
1592
1593
1594
jQuery.extend({
1595
	queue: function( elem, type, data ) {
1596
		if ( !elem ) {
1597
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1598
		}
1599
1600
		type = (type || "fx") + "queue";
1601
		var q = jQuery._data( elem, type );
1602
1603
		// Speed up dequeue by getting out quickly if this is just a lookup
1604
		if ( !data ) {
1605
			return q || [];
1606
		}
1607
1608
		if ( !q || jQuery.isArray(data) ) {
1609
			q = jQuery._data( elem, type, jQuery.makeArray(data) );
1610
1611
		} else {
1612
			q.push( data );
1613
		}
1614
1615
		return q;
1616
	},
1617
1618
	dequeue: function( elem, type ) {
1619
		type = type || "fx";
1620
1621
		var queue = jQuery.queue( elem, type ),
1622
			fn = queue.shift();
1623
1624
		// If the fx queue is dequeued, always remove the progress sentinel
1625
		if ( fn === "inprogress" ) {
1626
			fn = queue.shift();
1627
		}
1628
1629
		if ( fn ) {
1630
			// Add a progress sentinel to prevent the fx queue from being
1631
			// automatically dequeued
1632
			if ( type === "fx" ) {
1633
				queue.unshift("inprogress");
1634
			}
1635
1636
			fn.call(elem, function() {
1637
				jQuery.dequeue(elem, type);
1638
			});
1639
		}
1640
1641
		if ( !queue.length ) {
1642
			jQuery.removeData( elem, type + "queue", true );
1643
		}
1644
	}
1645
});
1646
1647
jQuery.fn.extend({
1648 View Code Duplication
	queue: function( type, data ) {
1649
		if ( typeof type !== "string" ) {
1650
			data = type;
1651
			type = "fx";
1652
		}
1653
1654
		if ( data === undefined ) {
1655
			return jQuery.queue( this[0], type );
1656
		}
1657
		return this.each(function( i ) {
1658
			var queue = jQuery.queue( this, type, data );
1659
1660
			if ( type === "fx" && queue[0] !== "inprogress" ) {
1661
				jQuery.dequeue( this, type );
1662
			}
1663
		});
1664
	},
1665
	dequeue: function( type ) {
1666
		return this.each(function() {
1667
			jQuery.dequeue( this, type );
1668
		});
1669
	},
1670
1671
	// Based off of the plugin by Clint Helfers, with permission.
1672
	// http://blindsignals.com/index.php/2009/07/jquery-delay/
1673
	delay: function( time, type ) {
1674
		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1675
		type = type || "fx";
1676
1677
		return this.queue( type, function() {
1678
			var elem = this;
1679
			setTimeout(function() {
1680
				jQuery.dequeue( elem, type );
1681
			}, time );
1682
		});
1683
	},
1684
1685
	clearQueue: function( type ) {
1686
		return this.queue( type || "fx", [] );
1687
	}
1688
});
1689
1690
1691
1692
1693
var rclass = /[\n\t\r]/g,
1694
	rspaces = /\s+/,
1695
	rreturn = /\r/g,
1696
	rspecialurl = /^(?:href|src|style)$/,
1697
	rtype = /^(?:button|input)$/i,
1698
	rfocusable = /^(?:button|input|object|select|textarea)$/i,
1699
	rclickable = /^a(?:rea)?$/i,
1700
	rradiocheck = /^(?:radio|checkbox)$/i;
1701
1702
jQuery.props = {
1703
	"for": "htmlFor",
1704
	"class": "className",
1705
	readonly: "readOnly",
1706
	maxlength: "maxLength",
1707
	cellspacing: "cellSpacing",
1708
	rowspan: "rowSpan",
1709
	colspan: "colSpan",
1710
	tabindex: "tabIndex",
1711
	usemap: "useMap",
1712
	frameborder: "frameBorder"
1713
};
1714
1715
jQuery.fn.extend({
1716
	attr: function( name, value ) {
1717
		return jQuery.access( this, name, value, true, jQuery.attr );
1718
	},
1719
1720
	removeAttr: function( name, fn ) {
1721
		return this.each(function(){
1722
			jQuery.attr( this, name, "" );
1723
			if ( this.nodeType === 1 ) {
1724
				this.removeAttribute( name );
1725
			}
1726
		});
1727
	},
1728
1729 View Code Duplication
	addClass: function( value ) {
1730
		if ( jQuery.isFunction(value) ) {
1731
			return this.each(function(i) {
1732
				var self = jQuery(this);
1733
				self.addClass( value.call(this, i, self.attr("class")) );
1734
			});
1735
		}
1736
1737
		if ( value && typeof value === "string" ) {
1738
			var classNames = (value || "").split( rspaces );
1739
1740
			for ( var i = 0, l = this.length; i < l; i++ ) {
1741
				var elem = this[i];
1742
1743
				if ( elem.nodeType === 1 ) {
1744
					if ( !elem.className ) {
1745
						elem.className = value;
1746
1747
					} else {
1748
						var className = " " + elem.className + " ",
1749
							setClass = elem.className;
1750
1751
						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1752
							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1753
								setClass += " " + classNames[c];
1754
							}
1755
						}
1756
						elem.className = jQuery.trim( setClass );
1757
					}
1758
				}
1759
			}
1760
		}
1761
1762
		return this;
1763
	},
1764
1765 View Code Duplication
	removeClass: function( value ) {
1766
		if ( jQuery.isFunction(value) ) {
1767
			return this.each(function(i) {
1768
				var self = jQuery(this);
1769
				self.removeClass( value.call(this, i, self.attr("class")) );
1770
			});
1771
		}
1772
1773
		if ( (value && typeof value === "string") || value === undefined ) {
1774
			var classNames = (value || "").split( rspaces );
1775
1776
			for ( var i = 0, l = this.length; i < l; i++ ) {
1777
				var elem = this[i];
1778
1779
				if ( elem.nodeType === 1 && elem.className ) {
1780
					if ( value ) {
1781
						var className = (" " + elem.className + " ").replace(rclass, " ");
1782
						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1783
							className = className.replace(" " + classNames[c] + " ", " ");
1784
						}
1785
						elem.className = jQuery.trim( className );
1786
1787
					} else {
1788
						elem.className = "";
1789
					}
1790
				}
1791
			}
1792
		}
1793
1794
		return this;
1795
	},
1796
1797 View Code Duplication
	toggleClass: function( value, stateVal ) {
1798
		var type = typeof value,
1799
			isBool = typeof stateVal === "boolean";
1800
1801
		if ( jQuery.isFunction( value ) ) {
1802
			return this.each(function(i) {
1803
				var self = jQuery(this);
1804
				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1805
			});
1806
		}
1807
1808
		return this.each(function() {
1809
			if ( type === "string" ) {
1810
				// toggle individual class names
1811
				var className,
1812
					i = 0,
1813
					self = jQuery( this ),
1814
					state = stateVal,
1815
					classNames = value.split( rspaces );
1816
1817
				while ( (className = classNames[ i++ ]) ) {
1818
					// check each className given, space seperated list
1819
					state = isBool ? state : !self.hasClass( className );
1820
					self[ state ? "addClass" : "removeClass" ]( className );
1821
				}
1822
1823
			} else if ( type === "undefined" || type === "boolean" ) {
1824
				if ( this.className ) {
1825
					// store className if set
1826
					jQuery._data( this, "__className__", this.className );
1827
				}
1828
1829
				// toggle whole className
1830
				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
1831
			}
1832
		});
1833
	},
1834
1835
	hasClass: function( selector ) {
1836
		var className = " " + selector + " ";
1837
		for ( var i = 0, l = this.length; i < l; i++ ) {
1838
			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1839
				return true;
1840
			}
1841
		}
1842
1843
		return false;
1844
	},
1845
1846
	val: function( value ) {
1847
		if ( !arguments.length ) {
1848
			var elem = this[0];
1849
1850
			if ( elem ) {
1851
				if ( jQuery.nodeName( elem, "option" ) ) {
1852
					// attributes.value is undefined in Blackberry 4.7 but
1853
					// uses .value. See #6932
1854
					var val = elem.attributes.value;
1855
					return !val || val.specified ? elem.value : elem.text;
1856
				}
1857
1858
				// We need to handle select boxes special
1859
				if ( jQuery.nodeName( elem, "select" ) ) {
1860
					var index = elem.selectedIndex,
1861
						values = [],
1862
						options = elem.options,
1863
						one = elem.type === "select-one";
1864
1865
					// Nothing was selected
1866
					if ( index < 0 ) {
1867
						return null;
1868
					}
1869
1870
					// Loop through all the selected options
1871 View Code Duplication
					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1872
						var option = options[ i ];
1873
1874
						// Don't return options that are disabled or in a disabled optgroup
1875
						if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
1876
								(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
1877
1878
							// Get the specific value for the option
1879
							value = jQuery(option).val();
1880
1881
							// We don't need an array for one selects
1882
							if ( one ) {
1883
								return value;
1884
							}
1885
1886
							// Multi-Selects return an array
1887
							values.push( value );
1888
						}
1889
					}
1890
1891
					return values;
1892
				}
1893
1894
				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1895
				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1896
					return elem.getAttribute("value") === null ? "on" : elem.value;
1897
				}
1898
1899
				// Everything else, we just grab the value
1900
				return (elem.value || "").replace(rreturn, "");
1901
1902
			}
1903
1904
			return undefined;
1905
		}
1906
1907
		var isFunction = jQuery.isFunction(value);
1908
1909
		return this.each(function(i) {
1910
			var self = jQuery(this), val = value;
1911
1912
			if ( this.nodeType !== 1 ) {
1913
				return;
1914
			}
1915
1916
			if ( isFunction ) {
1917
				val = value.call(this, i, self.val());
1918
			}
1919
1920
			// Treat null/undefined as ""; convert numbers to string
1921
			if ( val == null ) {
1922
				val = "";
1923
			} else if ( typeof val === "number" ) {
1924
				val += "";
1925
			} else if ( jQuery.isArray(val) ) {
1926
				val = jQuery.map(val, function (value) {
1927
					return value == null ? "" : value + "";
1928
				});
1929
			}
1930
1931
			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1932
				this.checked = jQuery.inArray( self.val(), val ) >= 0;
1933
1934
			} else if ( jQuery.nodeName( this, "select" ) ) {
1935
				var values = jQuery.makeArray(val);
1936
1937
				jQuery( "option", this ).each(function() {
1938
					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1939
				});
1940
1941
				if ( !values.length ) {
1942
					this.selectedIndex = -1;
1943
				}
1944
1945
			} else {
1946
				this.value = val;
1947
			}
1948
		});
1949
	}
1950
});
1951
1952
jQuery.extend({
1953
	attrFn: {
1954
		val: true,
1955
		css: true,
1956
		html: true,
1957
		text: true,
1958
		data: true,
1959
		width: true,
1960
		height: true,
1961
		offset: true
1962
	},
1963
1964
	attr: function( elem, name, value, pass ) {
1965
		// don't get/set attributes on text, comment and attribute nodes
1966
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) {
1967
			return undefined;
1968
		}
1969
1970
		if ( pass && name in jQuery.attrFn ) {
1971
			return jQuery(elem)[name](value);
1972
		}
1973
1974
		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
1975
			// Whether we are setting (or getting)
1976
			set = value !== undefined;
1977
1978
		// Try to normalize/fix the name
1979
		name = notxml && jQuery.props[ name ] || name;
1980
1981
		// Only do all the following if this is a node (faster for style)
1982
		if ( elem.nodeType === 1 ) {
1983
			// These attributes require special treatment
1984
			var special = rspecialurl.test( name );
1985
1986
			// Safari mis-reports the default selected property of an option
1987
			// Accessing the parent's selectedIndex property fixes it
1988
			if ( name === "selected" && !jQuery.support.optSelected ) {
1989
				var parent = elem.parentNode;
1990
				if ( parent ) {
1991
					parent.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.selectedIndex is not used.
Loading history...
1992
1993
					// Make sure that it also works with optgroups, see #5701
1994
					if ( parent.parentNode ) {
1995
						parent.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to parent.parentNode.selectedIndex is not used.
Loading history...
1996
					}
1997
				}
1998
			}
1999
2000
			// If applicable, access the attribute via the DOM 0 way
2001
			// 'in' checks fail in Blackberry 4.7 #6931
2002
			if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
2003
				if ( set ) {
2004
					// We can't allow the type property to be changed (since it causes problems in IE)
2005
					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
2006
						jQuery.error( "type property can't be changed" );
2007
					}
2008
2009
					if ( value === null ) {
2010
						if ( elem.nodeType === 1 ) {
2011
							elem.removeAttribute( name );
2012
						}
2013
2014
					} else {
2015
						elem[ name ] = value;
2016
					}
2017
				}
2018
2019
				// browsers index elements by id/name on forms, give priority to attributes.
2020
				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
2021
					return elem.getAttributeNode( name ).nodeValue;
2022
				}
2023
2024
				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2025
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2026
				if ( name === "tabIndex" ) {
2027
					var attributeNode = elem.getAttributeNode( "tabIndex" );
2028
2029
					return attributeNode && attributeNode.specified ?
2030
						attributeNode.value :
2031
						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2032
							0 :
2033
							undefined;
2034
				}
2035
2036
				return elem[ name ];
2037
			}
2038
2039
			if ( !jQuery.support.style && notxml && name === "style" ) {
2040
				if ( set ) {
2041
					elem.style.cssText = "" + value;
2042
				}
2043
2044
				return elem.style.cssText;
2045
			}
2046
2047
			if ( set ) {
2048
				// convert the value to a string (all browsers do this but IE) see #1070
2049
				elem.setAttribute( name, "" + value );
2050
			}
2051
2052
			// Ensure that missing attributes return undefined
2053
			// Blackberry 4.7 returns "" from getAttribute #6938
2054
			if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
2055
				return undefined;
2056
			}
2057
2058
			var attr = !jQuery.support.hrefNormalized && notxml && special ?
2059
					// Some attributes require a special call on IE
2060
					elem.getAttribute( name, 2 ) :
2061
					elem.getAttribute( name );
2062
2063
			// Non-existent attributes return null, we normalize to undefined
2064
			return attr === null ? undefined : attr;
2065
		}
2066
		// Handle everything which isn't a DOM element node
2067
		if ( set ) {
2068
			elem[ name ] = value;
2069
		}
2070
		return elem[ name ];
2071
	}
2072
});
2073
2074
2075
2076
2077
var rnamespaces = /\.(.*)$/,
2078
	rformElems = /^(?:textarea|input|select)$/i,
2079
	rperiod = /\./g,
2080
	rspace = / /g,
2081
	rescape = /[^\w\s.|`]/g,
2082
	fcleanup = function( nm ) {
2083
		return nm.replace(rescape, "\\$&");
2084
	},
2085
	eventKey = "events";
2086
2087
/*
2088
 * A number of helper functions used for managing events.
2089
 * Many of the ideas behind this code originated from
2090
 * Dean Edwards' addEvent library.
2091
 */
2092
jQuery.event = {
2093
2094
	// Bind an event to an element
2095
	// Original by Dean Edwards
2096
	add: function( elem, types, handler, data ) {
2097
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2098
			return;
2099
		}
2100
2101
		// For whatever reason, IE has trouble passing the window object
2102
		// around, causing it to be cloned in the process
2103
		if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) {
2104
			elem = window;
2105
		}
2106
2107
		if ( handler === false ) {
2108
			handler = returnFalse;
2109
		} else if ( !handler ) {
2110
			// Fixes bug #7229. Fix recommended by jdalton
2111
		  return;
2112
		}
2113
2114
		var handleObjIn, handleObj;
2115
2116
		if ( handler.handler ) {
2117
			handleObjIn = handler;
2118
			handler = handleObjIn.handler;
2119
		}
2120
2121
		// Make sure that the function being executed has a unique ID
2122
		if ( !handler.guid ) {
2123
			handler.guid = jQuery.guid++;
2124
		}
2125
2126
		// Init the element's event structure
2127
		var elemData = jQuery._data( elem );
2128
2129
		// If no elemData is found then we must be trying to bind to one of the
2130
		// banned noData elements
2131
		if ( !elemData ) {
2132
			return;
2133
		}
2134
2135
		var events = elemData[ eventKey ],
2136
			eventHandle = elemData.handle;
2137
2138
		if ( typeof events === "function" ) {
2139
			// On plain objects events is a fn that holds the the data
2140
			// which prevents this data from being JSON serialized
2141
			// the function does not need to be called, it just contains the data
2142
			eventHandle = events.handle;
2143
			events = events.events;
2144
2145
		} else if ( !events ) {
2146
			if ( !elem.nodeType ) {
2147
				// On plain objects, create a fn that acts as the holder
2148
				// of the values to avoid JSON serialization of event data
2149
				elemData[ eventKey ] = elemData = function(){};
2150
			}
2151
2152
			elemData.events = events = {};
2153
		}
2154
2155
		if ( !eventHandle ) {
2156
			elemData.handle = eventHandle = function() {
2157
				// Handle the second event of a trigger and when
2158
				// an event is called after a page has unloaded
2159
				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
2160
					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
2161
					undefined;
2162
			};
2163
		}
2164
2165
		// Add elem as a property of the handle function
2166
		// This is to prevent a memory leak with non-native events in IE.
2167
		eventHandle.elem = elem;
2168
2169
		// Handle multiple events separated by a space
2170
		// jQuery(...).bind("mouseover mouseout", fn);
2171
		types = types.split(" ");
2172
2173
		var type, i = 0, namespaces;
2174
2175
		while ( (type = types[ i++ ]) ) {
2176
			handleObj = handleObjIn ?
2177
				jQuery.extend({}, handleObjIn) :
2178
				{ handler: handler, data: data };
2179
2180
			// Namespaced event handlers
2181
			if ( type.indexOf(".") > -1 ) {
2182
				namespaces = type.split(".");
2183
				type = namespaces.shift();
2184
				handleObj.namespace = namespaces.slice(0).sort().join(".");
2185
2186
			} else {
2187
				namespaces = [];
2188
				handleObj.namespace = "";
2189
			}
2190
2191
			handleObj.type = type;
2192
			if ( !handleObj.guid ) {
2193
				handleObj.guid = handler.guid;
2194
			}
2195
2196
			// Get the current list of functions bound to this event
2197
			var handlers = events[ type ],
2198
				special = jQuery.event.special[ type ] || {};
2199
2200
			// Init the event handler queue
2201
			if ( !handlers ) {
2202
				handlers = events[ type ] = [];
2203
2204
				// Check for a special event handler
2205
				// Only use addEventListener/attachEvent if the special
2206
				// events handler returns false
2207
				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2208
					// Bind the global event handler to the element
2209
					if ( elem.addEventListener ) {
2210
						elem.addEventListener( type, eventHandle, false );
2211
2212
					} else if ( elem.attachEvent ) {
2213
						elem.attachEvent( "on" + type, eventHandle );
2214
					}
2215
				}
2216
			}
2217
2218
			if ( special.add ) {
2219
				special.add.call( elem, handleObj );
2220
2221
				if ( !handleObj.handler.guid ) {
2222
					handleObj.handler.guid = handler.guid;
2223
				}
2224
			}
2225
2226
			// Add the function to the element's handler list
2227
			handlers.push( handleObj );
2228
2229
			// Keep track of which events have been used, for global triggering
2230
			jQuery.event.global[ type ] = true;
2231
		}
2232
2233
		// Nullify elem to prevent memory leaks in IE
2234
		elem = null;
2235
	},
2236
2237
	global: {},
2238
2239
	// Detach an event or set of events from an element
2240
	remove: function( elem, types, handler, pos ) {
2241
		// don't do events on text and comment nodes
2242
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2243
			return;
2244
		}
2245
2246
		if ( handler === false ) {
2247
			handler = returnFalse;
2248
		}
2249
2250
		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
2251
			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2252
			events = elemData && elemData[ eventKey ];
2253
2254
		if ( !elemData || !events ) {
2255
			return;
2256
		}
2257
2258
		if ( typeof events === "function" ) {
2259
			elemData = events;
2260
			events = events.events;
2261
		}
2262
2263
		// types is actually an event object here
2264
		if ( types && types.type ) {
2265
			handler = types.handler;
2266
			types = types.type;
2267
		}
2268
2269
		// Unbind all events for the element
2270
		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
2271
			types = types || "";
2272
2273
			for ( type in events ) {
2274
				jQuery.event.remove( elem, type + types );
2275
			}
2276
2277
			return;
2278
		}
2279
2280
		// Handle multiple events separated by a space
2281
		// jQuery(...).unbind("mouseover mouseout", fn);
2282
		types = types.split(" ");
2283
2284
		while ( (type = types[ i++ ]) ) {
2285
			origType = type;
2286
			handleObj = null;
2287
			all = type.indexOf(".") < 0;
2288
			namespaces = [];
2289
2290
			if ( !all ) {
2291
				// Namespaced event handlers
2292
				namespaces = type.split(".");
2293
				type = namespaces.shift();
2294
2295
				namespace = new RegExp("(^|\\.)" +
2296
					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
2297
			}
2298
2299
			eventType = events[ type ];
2300
2301
			if ( !eventType ) {
2302
				continue;
2303
			}
2304
2305
			if ( !handler ) {
2306
				for ( j = 0; j < eventType.length; j++ ) {
2307
					handleObj = eventType[ j ];
2308
2309
					if ( all || namespace.test( handleObj.namespace ) ) {
2310
						jQuery.event.remove( elem, origType, handleObj.handler, j );
2311
						eventType.splice( j--, 1 );
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable j here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
2312
					}
2313
				}
2314
2315
				continue;
2316
			}
2317
2318
			special = jQuery.event.special[ type ] || {};
2319
2320
			for ( j = pos || 0; j < eventType.length; j++ ) {
2321
				handleObj = eventType[ j ];
2322
2323
				if ( handler.guid === handleObj.guid ) {
2324
					// remove the given handler for the given type
2325
					if ( all || namespace.test( handleObj.namespace ) ) {
2326
						if ( pos == null ) {
2327
							eventType.splice( j--, 1 );
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable j here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
2328
						}
2329
2330
						if ( special.remove ) {
2331
							special.remove.call( elem, handleObj );
2332
						}
2333
					}
2334
2335
					if ( pos != null ) {
2336
						break;
2337
					}
2338
				}
2339
			}
2340
2341
			// remove generic event handler if no more handlers exist
2342
			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
2343
				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
2344
					jQuery.removeEvent( elem, type, elemData.handle );
2345
				}
2346
2347
				ret = null;
2348
				delete events[ type ];
2349
			}
2350
		}
2351
2352
		// Remove the expando if it's no longer used
2353
		if ( jQuery.isEmptyObject( events ) ) {
2354
			var handle = elemData.handle;
2355
			if ( handle ) {
2356
				handle.elem = null;
2357
			}
2358
2359
			delete elemData.events;
2360
			delete elemData.handle;
2361
2362
			if ( typeof elemData === "function" ) {
2363
				jQuery.removeData( elem, eventKey, true );
2364
2365
			} else if ( jQuery.isEmptyObject( elemData ) ) {
2366
				jQuery.removeData( elem, undefined, true );
2367
			}
2368
		}
2369
	},
2370
2371
	// bubbling is internal
2372
	trigger: function( event, data, elem /*, bubbling */ ) {
2373
		// Event object or event type
2374
		var type = event.type || event,
2375
			bubbling = arguments[3];
2376
2377
		if ( !bubbling ) {
2378
			event = typeof event === "object" ?
2379
				// jQuery.Event object
2380
				event[ jQuery.expando ] ? event :
2381
				// Object literal
2382
				jQuery.extend( jQuery.Event(type), event ) :
2383
				// Just the event type (string)
2384
				jQuery.Event(type);
2385
2386
			if ( type.indexOf("!") >= 0 ) {
2387
				event.type = type = type.slice(0, -1);
2388
				event.exclusive = true;
2389
			}
2390
2391
			// Handle a global trigger
2392
			if ( !elem ) {
2393
				// Don't bubble custom events when global (to avoid too much overhead)
2394
				event.stopPropagation();
2395
2396
				// Only trigger if we've ever bound an event for it
2397
				if ( jQuery.event.global[ type ] ) {
2398
					// XXX This code smells terrible. event.js should not be directly
2399
					// inspecting the data cache
2400
					jQuery.each( jQuery.cache, function() {
2401
						// internalKey variable is just used to make it easier to find
2402
						// and potentially change this stuff later; currently it just
2403
						// points to jQuery.expando
2404
						var internalKey = jQuery.expando,
2405
							internalCache = this[ internalKey ];
2406
						if ( internalCache && internalCache.events && internalCache.events[type] ) {
2407
							jQuery.event.trigger( event, data, internalCache.handle.elem );
2408
						}
2409
					});
2410
				}
2411
			}
2412
2413
			// Handle triggering a single element
2414
2415
			// don't do events on text and comment nodes
2416
			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
2417
				return undefined;
2418
			}
2419
2420
			// Clean up in case it is reused
2421
			event.result = undefined;
2422
			event.target = elem;
2423
2424
			// Clone the incoming data, if any
2425
			data = jQuery.makeArray( data );
2426
			data.unshift( event );
2427
		}
2428
2429
		event.currentTarget = elem;
2430
2431
		// Trigger the event, it is assumed that "handle" is a function
2432
		var handle = elem.nodeType ?
2433
			jQuery._data( elem, "handle" ) :
2434
			(jQuery._data( elem, eventKey ) || {}).handle;
2435
2436
		if ( handle ) {
2437
			handle.apply( elem, data );
2438
		}
2439
2440
		var parent = elem.parentNode || elem.ownerDocument;
2441
2442
		// Trigger an inline bound script
2443
		try {
2444
			if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
2445
				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
2446
					event.result = false;
2447
					event.preventDefault();
2448
				}
2449
			}
2450
2451
		// prevent IE from throwing an error for some elements with some event types, see #3533
2452
		} catch (inlineError) {}
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...
2453
2454
		if ( !event.isPropagationStopped() && parent ) {
2455
			jQuery.event.trigger( event, data, parent, true );
2456
2457
		} else if ( !event.isDefaultPrevented() ) {
2458
			var old,
2459
				target = event.target,
2460
				targetType = type.replace( rnamespaces, "" ),
2461
				isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
2462
				special = jQuery.event.special[ targetType ] || {};
2463
2464
			if ( (!special._default || special._default.call( elem, event ) === false) &&
2465
				!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
2466
2467
				try {
2468
					if ( target[ targetType ] ) {
2469
						// Make sure that we don't accidentally re-trigger the onFOO events
2470
						old = target[ "on" + targetType ];
2471
2472
						if ( old ) {
2473
							target[ "on" + targetType ] = null;
2474
						}
2475
2476
						jQuery.event.triggered = true;
2477
						target[ targetType ]();
2478
					}
2479
2480
				// prevent IE from throwing an error for some elements with some event types, see #3533
2481
				} catch (triggerError) {}
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...
2482
2483
				if ( old ) {
2484
					target[ "on" + targetType ] = old;
2485
				}
2486
2487
				jQuery.event.triggered = false;
2488
			}
2489
		}
2490
	},
2491
2492
	handle: function( event ) {
2493
		var all, handlers, namespaces, namespace_re, events,
2494
			namespace_sort = [],
2495
			args = jQuery.makeArray( arguments );
2496
2497
		event = args[0] = jQuery.event.fix( event || window.event );
2498
		event.currentTarget = this;
2499
2500
		// Namespaced event handlers
2501
		all = event.type.indexOf(".") < 0 && !event.exclusive;
2502
2503
		if ( !all ) {
2504
			namespaces = event.type.split(".");
2505
			event.type = namespaces.shift();
2506
			namespace_sort = namespaces.slice(0).sort();
2507
			namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)");
2508
		}
2509
2510
		event.namespace = event.namespace || namespace_sort.join(".");
2511
2512
		events = jQuery._data(this, eventKey);
2513
2514
		if ( typeof events === "function" ) {
2515
			events = events.events;
2516
		}
2517
2518
		handlers = (events || {})[ event.type ];
2519
2520
		if ( events && handlers ) {
2521
			// Clone the handlers to prevent manipulation
2522
			handlers = handlers.slice(0);
2523
2524
			for ( var j = 0, l = handlers.length; j < l; j++ ) {
2525
				var handleObj = handlers[ j ];
2526
2527
				// Filter the functions by class
2528
				if ( all || namespace_re.test( handleObj.namespace ) ) {
0 ignored issues
show
Bug introduced by
The variable namespace_re does not seem to be initialized in case !all on line 2503 is false. Are you sure this can never be the case?
Loading history...
2529
					// Pass in a reference to the handler function itself
2530
					// So that we can later remove it
2531
					event.handler = handleObj.handler;
2532
					event.data = handleObj.data;
2533
					event.handleObj = handleObj;
2534
2535
					var ret = handleObj.handler.apply( this, args );
2536
2537
					if ( ret !== undefined ) {
2538
						event.result = ret;
2539
						if ( ret === false ) {
2540
							event.preventDefault();
2541
							event.stopPropagation();
2542
						}
2543
					}
2544
2545
					if ( event.isImmediatePropagationStopped() ) {
2546
						break;
2547
					}
2548
				}
2549
			}
2550
		}
2551
2552
		return event.result;
2553
	},
2554
2555
	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
2556
2557
	fix: function( event ) {
2558
		if ( event[ jQuery.expando ] ) {
2559
			return event;
2560
		}
2561
2562
		// store a copy of the original event object
2563
		// and "clone" to set read-only properties
2564
		var originalEvent = event;
2565
		event = jQuery.Event( originalEvent );
2566
2567
		for ( var i = this.props.length, prop; i; ) {
2568
			prop = this.props[ --i ];
2569
			event[ prop ] = originalEvent[ prop ];
2570
		}
2571
2572
		// Fix target property, if necessary
2573
		if ( !event.target ) {
2574
			// Fixes #1925 where srcElement might not be defined either
2575
			event.target = event.srcElement || document;
2576
		}
2577
2578
		// check if target is a textnode (safari)
2579
		if ( event.target.nodeType === 3 ) {
2580
			event.target = event.target.parentNode;
2581
		}
2582
2583
		// Add relatedTarget, if necessary
2584
		if ( !event.relatedTarget && event.fromElement ) {
2585
			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
2586
		}
2587
2588
		// Calculate pageX/Y if missing and clientX/Y available
2589
		if ( event.pageX == null && event.clientX != null ) {
2590
			var doc = document.documentElement,
2591
				body = document.body;
2592
2593
			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
2594
			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
2595
		}
2596
2597
		// Add which for key events
2598
		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
2599
			event.which = event.charCode != null ? event.charCode : event.keyCode;
2600
		}
2601
2602
		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2603
		if ( !event.metaKey && event.ctrlKey ) {
2604
			event.metaKey = event.ctrlKey;
2605
		}
2606
2607
		// Add which for click: 1 === left; 2 === middle; 3 === right
2608
		// Note: button is not normalized, so don't use it
2609
		if ( !event.which && event.button !== undefined ) {
2610
			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.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...
2611
		}
2612
2613
		return event;
2614
	},
2615
2616
	// Deprecated, use jQuery.guid instead
2617
	guid: 1E8,
2618
2619
	// Deprecated, use jQuery.proxy instead
2620
	proxy: jQuery.proxy,
2621
2622
	special: {
2623
		ready: {
2624
			// Make sure the ready event is setup
2625
			setup: jQuery.bindReady,
2626
			teardown: jQuery.noop
2627
		},
2628
2629
		live: {
2630
			add: function( handleObj ) {
2631
				jQuery.event.add( this,
2632
					liveConvert( handleObj.origType, handleObj.selector ),
2633
					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
2634
			},
2635
2636
			remove: function( handleObj ) {
2637
				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
2638
			}
2639
		},
2640
2641
		beforeunload: {
2642
			setup: function( data, namespaces, eventHandle ) {
2643
				// We only want to do this special case on windows
2644
				if ( jQuery.isWindow( this ) ) {
2645
					this.onbeforeunload = eventHandle;
2646
				}
2647
			},
2648
2649
			teardown: function( namespaces, eventHandle ) {
2650
				if ( this.onbeforeunload === eventHandle ) {
2651
					this.onbeforeunload = null;
2652
				}
2653
			}
2654
		}
2655
	}
2656
};
2657
2658
jQuery.removeEvent = document.removeEventListener ?
2659
	function( elem, type, handle ) {
2660
		if ( elem.removeEventListener ) {
2661
			elem.removeEventListener( type, handle, false );
2662
		}
2663
	} :
2664
	function( elem, type, handle ) {
2665
		if ( elem.detachEvent ) {
2666
			elem.detachEvent( "on" + type, handle );
2667
		}
2668
	};
2669
2670
jQuery.Event = function( src ) {
2671
	// Allow instantiation without the 'new' keyword
2672
	if ( !this.preventDefault ) {
2673
		return new jQuery.Event( src );
2674
	}
2675
2676
	// Event object
2677
	if ( src && src.type ) {
2678
		this.originalEvent = src;
2679
		this.type = src.type;
2680
2681
		// Events bubbling up the document may have been marked as prevented
2682
		// by a handler lower down the tree; reflect the correct value.
2683
		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || 
2684
			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
2685
2686
	// Event type
2687
	} else {
2688
		this.type = src;
2689
	}
2690
2691
	// timeStamp is buggy for some events on Firefox(#3843)
2692
	// So we won't rely on the native value
2693
	this.timeStamp = jQuery.now();
2694
2695
	// Mark it as fixed
2696
	this[ jQuery.expando ] = true;
2697
};
2698
2699
function returnFalse() {
2700
	return false;
2701
}
2702
function returnTrue() {
2703
	return true;
2704
}
2705
2706
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2707
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2708
jQuery.Event.prototype = {
2709
	preventDefault: function() {
2710
		this.isDefaultPrevented = returnTrue;
2711
2712
		var e = this.originalEvent;
2713
		if ( !e ) {
2714
			return;
2715
		}
2716
2717
		// if preventDefault exists run it on the original event
2718
		if ( e.preventDefault ) {
2719
			e.preventDefault();
2720
2721
		// otherwise set the returnValue property of the original event to false (IE)
2722
		} else {
2723
			e.returnValue = false;
2724
		}
2725
	},
2726
	stopPropagation: function() {
2727
		this.isPropagationStopped = returnTrue;
2728
2729
		var e = this.originalEvent;
2730
		if ( !e ) {
2731
			return;
2732
		}
2733
		// if stopPropagation exists run it on the original event
2734
		if ( e.stopPropagation ) {
2735
			e.stopPropagation();
2736
		}
2737
		// otherwise set the cancelBubble property of the original event to true (IE)
2738
		e.cancelBubble = true;
2739
	},
2740
	stopImmediatePropagation: function() {
2741
		this.isImmediatePropagationStopped = returnTrue;
2742
		this.stopPropagation();
2743
	},
2744
	isDefaultPrevented: returnFalse,
2745
	isPropagationStopped: returnFalse,
2746
	isImmediatePropagationStopped: returnFalse
2747
};
2748
2749
// Checks if an event happened on an element within another element
2750
// Used in jQuery.event.special.mouseenter and mouseleave handlers
2751
var withinElement = function( event ) {
2752
	// Check if mouse(over|out) are still within the same parent element
2753
	var parent = event.relatedTarget;
2754
2755
	// Firefox sometimes assigns relatedTarget a XUL element
2756
	// which we cannot access the parentNode property of
2757
	try {
2758
		// Traverse up the tree
2759
		while ( parent && parent !== this ) {
2760
			parent = parent.parentNode;
2761
		}
2762
2763
		if ( parent !== this ) {
2764
			// set the correct event type
2765
			event.type = event.data;
2766
2767
			// handle event if we actually just moused on to a non sub-element
2768
			jQuery.event.handle.apply( this, arguments );
2769
		}
2770
2771
	// assuming we've left the element since we most likely mousedover a xul element
2772
	} 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...
2773
},
2774
2775
// In case of event delegation, we only need to rename the event.type,
2776
// liveHandler will take care of the rest.
2777
delegate = function( event ) {
2778
	event.type = event.data;
2779
	jQuery.event.handle.apply( this, arguments );
2780
};
2781
2782
// Create mouseenter and mouseleave events
2783
jQuery.each({
2784
	mouseenter: "mouseover",
2785
	mouseleave: "mouseout"
2786
}, function( orig, fix ) {
2787
	jQuery.event.special[ orig ] = {
2788
		setup: function( data ) {
2789
			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2790
		},
2791
		teardown: function( data ) {
2792
			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2793
		}
2794
	};
2795
});
2796
2797
// submit delegation
2798
if ( !jQuery.support.submitBubbles ) {
2799
2800
	jQuery.event.special.submit = {
2801
		setup: function( data, namespaces ) {
2802
			if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) {
2803
				jQuery.event.add(this, "click.specialSubmit", function( e ) {
2804
					var elem = e.target,
2805
						type = elem.type;
2806
2807
					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2808
						e.liveFired = undefined;
2809
						return trigger( "submit", this, arguments );
2810
					}
2811
				});
2812
2813
				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
2814
					var elem = e.target,
2815
						type = elem.type;
2816
2817
					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2818
						e.liveFired = undefined;
2819
						return trigger( "submit", this, arguments );
2820
					}
2821
				});
2822
2823
			} else {
2824
				return false;
2825
			}
2826
		},
2827
2828
		teardown: function( namespaces ) {
2829
			jQuery.event.remove( this, ".specialSubmit" );
2830
		}
2831
	};
2832
2833
}
2834
2835
// change delegation, happens here so we have bind.
2836
if ( !jQuery.support.changeBubbles ) {
2837
2838
	var changeFilters,
2839
2840
	getVal = function( elem ) {
2841
		var type = elem.type, val = elem.value;
2842
2843
		if ( type === "radio" || type === "checkbox" ) {
2844
			val = elem.checked;
2845
2846
		} else if ( type === "select-multiple" ) {
2847
			val = elem.selectedIndex > -1 ?
2848
				jQuery.map( elem.options, function( elem ) {
2849
					return elem.selected;
2850
				}).join("-") :
2851
				"";
2852
2853
		} else if ( elem.nodeName.toLowerCase() === "select" ) {
2854
			val = elem.selectedIndex;
2855
		}
2856
2857
		return val;
2858
	},
2859
2860
	testChange = function testChange( e ) {
2861
		var elem = e.target, data, val;
2862
2863
		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
2864
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2865
		}
2866
2867
		data = jQuery._data( elem, "_change_data" );
2868
		val = getVal(elem);
2869
2870
		// the current data will be also retrieved by beforeactivate
2871
		if ( e.type !== "focusout" || elem.type !== "radio" ) {
2872
			jQuery._data( elem, "_change_data", val );
2873
		}
2874
2875
		if ( data === undefined || val === data ) {
2876
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2877
		}
2878
2879
		if ( data != null || val ) {
2880
			e.type = "change";
2881
			e.liveFired = undefined;
2882
			return jQuery.event.trigger( e, arguments[1], elem );
2883
		}
2884
	};
2885
2886
	jQuery.event.special.change = {
2887
		filters: {
2888
			focusout: testChange,
2889
2890
			beforedeactivate: testChange,
2891
2892
			click: function( e ) {
2893
				var elem = e.target, type = elem.type;
2894
2895
				if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2896
					return testChange.call( this, e );
2897
				}
2898
			},
2899
2900
			// Change has to be called before submit
2901
			// Keydown will be called before keypress, which is used in submit-event delegation
2902
			keydown: function( e ) {
2903
				var elem = e.target, type = elem.type;
2904
2905
				if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2906
					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2907
					type === "select-multiple" ) {
2908
					return testChange.call( this, e );
2909
				}
2910
			},
2911
2912
			// Beforeactivate happens also before the previous element is blurred
2913
			// with this event you can't trigger a change event, but you can store
2914
			// information
2915
			beforeactivate: function( e ) {
2916
				var elem = e.target;
2917
				jQuery._data( elem, "_change_data", getVal(elem) );
2918
			}
2919
		},
2920
2921
		setup: function( data, namespaces ) {
2922
			if ( this.type === "file" ) {
2923
				return false;
2924
			}
2925
2926
			for ( var type in changeFilters ) {
2927
				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
2928
			}
2929
2930
			return rformElems.test( this.nodeName );
2931
		},
2932
2933
		teardown: function( namespaces ) {
2934
			jQuery.event.remove( this, ".specialChange" );
2935
2936
			return rformElems.test( this.nodeName );
2937
		}
2938
	};
2939
2940
	changeFilters = jQuery.event.special.change.filters;
2941
2942
	// Handle when the input is .focus()'d
2943
	changeFilters.focus = changeFilters.beforeactivate;
2944
}
2945
2946
function trigger( type, elem, args ) {
2947
	args[0].type = type;
2948
	return jQuery.event.handle.apply( elem, args );
2949
}
2950
2951
// Create "bubbling" focus and blur events
2952
if ( document.addEventListener ) {
2953
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2954
		jQuery.event.special[ fix ] = {
2955
			setup: function() {
2956
				this.addEventListener( orig, handler, true );
2957
			}, 
2958
			teardown: function() { 
2959
				this.removeEventListener( orig, handler, true );
2960
			}
2961
		};
2962
2963
		function handler( e ) {
2964
			e = jQuery.event.fix( e );
2965
			e.type = fix;
2966
			return jQuery.event.handle.call( this, e );
2967
		}
2968
	});
2969
}
2970
2971
jQuery.each(["bind", "one"], function( i, name ) {
2972
	jQuery.fn[ name ] = function( type, data, fn ) {
2973
		// Handle object literals
2974
		if ( typeof type === "object" ) {
2975
			for ( var key in type ) {
2976
				this[ name ](key, data, type[key], fn);
2977
			}
2978
			return this;
2979
		}
2980
2981
		if ( jQuery.isFunction( data ) || data === false ) {
2982
			fn = data;
2983
			data = undefined;
2984
		}
2985
2986
		var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
2987
			jQuery( this ).unbind( event, handler );
2988
			return fn.apply( this, arguments );
2989
		}) : fn;
2990
2991
		if ( type === "unload" && name !== "one" ) {
2992
			this.one( type, data, fn );
2993
2994
		} else {
2995
			for ( var i = 0, l = this.length; i < l; i++ ) {
2996
				jQuery.event.add( this[i], type, handler, data );
2997
			}
2998
		}
2999
3000
		return this;
3001
	};
3002
});
3003
3004
jQuery.fn.extend({
3005
	unbind: function( type, fn ) {
3006
		// Handle object literals
3007
		if ( typeof type === "object" && !type.preventDefault ) {
3008
			for ( var key in type ) {
3009
				this.unbind(key, type[key]);
3010
			}
3011
3012
		} else {
3013
			for ( var i = 0, l = this.length; i < l; i++ ) {
3014
				jQuery.event.remove( this[i], type, fn );
3015
			}
3016
		}
3017
3018
		return this;
3019
	},
3020
3021
	delegate: function( selector, types, data, fn ) {
3022
		return this.live( types, data, fn, selector );
3023
	},
3024
3025
	undelegate: function( selector, types, fn ) {
3026
		if ( arguments.length === 0 ) {
3027
				return this.unbind( "live" );
3028
3029
		} 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...
3030
			return this.die( types, null, fn, selector );
3031
		}
3032
	},
3033
3034
	trigger: function( type, data ) {
3035
		return this.each(function() {
3036
			jQuery.event.trigger( type, data, this );
3037
		});
3038
	},
3039
3040
	triggerHandler: function( type, data ) {
3041
		if ( this[0] ) {
3042
			var event = jQuery.Event( type );
3043
			event.preventDefault();
3044
			event.stopPropagation();
3045
			jQuery.event.trigger( event, data, this[0] );
3046
			return event.result;
3047
		}
3048
	},
3049
3050
	toggle: function( fn ) {
3051
		// Save reference to arguments for access in closure
3052
		var args = arguments,
3053
			i = 1;
3054
3055
		// link all the functions, so any of them can unbind this click handler
3056
		while ( i < args.length ) {
3057
			jQuery.proxy( fn, args[ i++ ] );
3058
		}
3059
3060
		return this.click( jQuery.proxy( fn, function( event ) {
3061
			// Figure out which function to execute
3062
			var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3063
			jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3064
3065
			// Make sure that clicks stop
3066
			event.preventDefault();
3067
3068
			// and execute the function
3069
			return args[ lastToggle ].apply( this, arguments ) || false;
3070
		}));
3071
	},
3072
3073
	hover: function( fnOver, fnOut ) {
3074
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3075
	}
3076
});
3077
3078
var liveMap = {
3079
	focus: "focusin",
3080
	blur: "focusout",
3081
	mouseenter: "mouseover",
3082
	mouseleave: "mouseout"
3083
};
3084
3085
jQuery.each(["live", "die"], function( i, name ) {
3086
	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
3087
		var type, i = 0, match, namespaces, preType,
3088
			selector = origSelector || this.selector,
3089
			context = origSelector ? this : jQuery( this.context );
3090
3091
		if ( typeof types === "object" && !types.preventDefault ) {
3092
			for ( var key in types ) {
3093
				context[ name ]( key, data, types[key], selector );
3094
			}
3095
3096
			return this;
3097
		}
3098
3099
		if ( jQuery.isFunction( data ) ) {
3100
			fn = data;
3101
			data = undefined;
3102
		}
3103
3104
		types = (types || "").split(" ");
3105
3106
		while ( (type = types[ i++ ]) != null ) {
3107
			match = rnamespaces.exec( type );
3108
			namespaces = "";
3109
3110
			if ( match )  {
3111
				namespaces = match[0];
3112
				type = type.replace( rnamespaces, "" );
3113
			}
3114
3115
			if ( type === "hover" ) {
3116
				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
3117
				continue;
3118
			}
3119
3120
			preType = type;
3121
3122
			if ( type === "focus" || type === "blur" ) {
3123
				types.push( liveMap[ type ] + namespaces );
3124
				type = type + namespaces;
3125
3126
			} else {
3127
				type = (liveMap[ type ] || type) + namespaces;
3128
			}
3129
3130
			if ( name === "live" ) {
3131
				// bind live handler
3132
				for ( var j = 0, l = context.length; j < l; j++ ) {
3133
					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
3134
						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
3135
				}
3136
3137
			} else {
3138
				// unbind live handler
3139
				context.unbind( "live." + liveConvert( type, selector ), fn );
3140
			}
3141
		}
3142
3143
		return this;
3144
	};
3145
});
3146
3147
function liveHandler( event ) {
3148
	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
3149
		elems = [],
3150
		selectors = [],
3151
		events = jQuery._data( this, eventKey );
3152
3153
	if ( typeof events === "function" ) {
3154
		events = events.events;
3155
	}
3156
3157
	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
3158
	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
3159
		return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
3160
	}
3161
3162
	if ( event.namespace ) {
3163
		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
3164
	}
3165
3166
	event.liveFired = this;
3167
3168
	var live = events.live.slice(0);
3169
3170
	for ( j = 0; j < live.length; j++ ) {
3171
		handleObj = live[j];
3172
3173
		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
3174
			selectors.push( handleObj.selector );
3175
3176
		} else {
3177
			live.splice( j--, 1 );
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable j here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
3178
		}
3179
	}
3180
3181
	match = jQuery( event.target ).closest( selectors, event.currentTarget );
3182
3183
	for ( i = 0, l = match.length; i < l; i++ ) {
3184
		close = match[i];
3185
3186
		for ( j = 0; j < live.length; j++ ) {
3187
			handleObj = live[j];
3188
3189
			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) ) {
3190
				elem = close.elem;
3191
				related = null;
3192
3193
				// Those two events require additional checking
3194
				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
3195
					event.type = handleObj.preType;
3196
					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
3197
				}
3198
3199
				if ( !related || related !== elem ) {
3200
					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
3201
				}
3202
			}
3203
		}
3204
	}
3205
3206
	for ( i = 0, l = elems.length; i < l; i++ ) {
3207
		match = elems[i];
3208
3209
		if ( maxLevel && match.level > maxLevel ) {
3210
			break;
3211
		}
3212
3213
		event.currentTarget = match.elem;
3214
		event.data = match.handleObj.data;
3215
		event.handleObj = match.handleObj;
3216
3217
		ret = match.handleObj.origHandler.apply( match.elem, arguments );
3218
3219
		if ( ret === false || event.isPropagationStopped() ) {
3220
			maxLevel = match.level;
3221
3222
			if ( ret === false ) {
3223
				stop = false;
3224
			}
3225
			if ( event.isImmediatePropagationStopped() ) {
3226
				break;
3227
			}
3228
		}
3229
	}
3230
3231
	return stop;
3232
}
3233
3234
function liveConvert( type, selector ) {
3235
	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&");
3236
}
3237
3238
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3239
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3240
	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
3241
3242
	// Handle event binding
3243
	jQuery.fn[ name ] = function( data, fn ) {
3244
		if ( fn == null ) {
3245
			fn = data;
3246
			data = null;
3247
		}
3248
3249
		return arguments.length > 0 ?
3250
			this.bind( name, data, fn ) :
3251
			this.trigger( name );
3252
	};
3253
3254
	if ( jQuery.attrFn ) {
3255
		jQuery.attrFn[ name ] = true;
3256
	}
3257
});
3258
3259
3260
/*!
3261
 * Sizzle CSS Selector Engine
3262
 *  Copyright 2011, The Dojo Foundation
3263
 *  Released under the MIT, BSD, and GPL Licenses.
3264
 *  More information: http://sizzlejs.com/
3265
 */
3266
(function(){
3267
3268
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3269
	done = 0,
3270
	toString = Object.prototype.toString,
3271
	hasDuplicate = false,
3272
	baseHasDuplicate = true;
3273
3274
// Here we check if the JavaScript engine is using some sort of
3275
// optimization where it does not always call our comparision
3276
// function. If that is the case, discard the hasDuplicate value.
3277
//   Thus far that includes Google Chrome.
3278
[0, 0].sort(function() {
3279
	baseHasDuplicate = false;
3280
	return 0;
3281
});
3282
3283 View Code Duplication
var Sizzle = function( selector, context, results, seed ) {
3284
	results = results || [];
3285
	context = context || document;
3286
3287
	var origContext = context;
3288
3289
	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3290
		return [];
3291
	}
3292
	
3293
	if ( !selector || typeof selector !== "string" ) {
3294
		return results;
3295
	}
3296
3297
	var m, set, checkSet, extra, ret, cur, pop, i,
3298
		prune = true,
3299
		contextXML = Sizzle.isXML( context ),
3300
		parts = [],
3301
		soFar = selector;
3302
	
3303
	// Reset the position of the chunker regexp (start from head)
3304
	do {
3305
		chunker.exec( "" );
3306
		m = chunker.exec( soFar );
3307
3308
		if ( m ) {
3309
			soFar = m[3];
3310
		
3311
			parts.push( m[1] );
3312
		
3313
			if ( m[2] ) {
3314
				extra = m[3];
3315
				break;
3316
			}
3317
		}
3318
	} while ( m );
3319
3320
	if ( parts.length > 1 && origPOS.exec( selector ) ) {
3321
3322
		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3323
			set = posProcess( parts[0] + parts[1], context );
3324
3325
		} else {
3326
			set = Expr.relative[ parts[0] ] ?
3327
				[ context ] :
3328
				Sizzle( parts.shift(), context );
3329
3330
			while ( parts.length ) {
3331
				selector = parts.shift();
3332
3333
				if ( Expr.relative[ selector ] ) {
3334
					selector += parts.shift();
3335
				}
3336
				
3337
				set = posProcess( selector, set );
3338
			}
3339
		}
3340
3341
	} else {
3342
		// Take a shortcut and set the context if the root selector is an ID
3343
		// (but not if it'll be faster if the inner selector is an ID)
3344
		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3345
				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3346
3347
			ret = Sizzle.find( parts.shift(), context, contextXML );
3348
			context = ret.expr ?
3349
				Sizzle.filter( ret.expr, ret.set )[0] :
3350
				ret.set[0];
3351
		}
3352
3353
		if ( context ) {
3354
			ret = seed ?
3355
				{ expr: parts.pop(), set: makeArray(seed) } :
3356
				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3357
3358
			set = ret.expr ?
3359
				Sizzle.filter( ret.expr, ret.set ) :
3360
				ret.set;
3361
3362
			if ( parts.length > 0 ) {
3363
				checkSet = makeArray( set );
3364
3365
			} else {
3366
				prune = false;
3367
			}
3368
3369
			while ( parts.length ) {
3370
				cur = parts.pop();
3371
				pop = cur;
3372
3373
				if ( !Expr.relative[ cur ] ) {
3374
					cur = "";
3375
				} else {
3376
					pop = parts.pop();
3377
				}
3378
3379
				if ( pop == null ) {
3380
					pop = context;
3381
				}
3382
3383
				Expr.relative[ cur ]( checkSet, pop, contextXML );
0 ignored issues
show
Bug introduced by
The variable checkSet seems to not be initialized for all possible execution paths. Are you sure cur handles undefined variables?
Loading history...
3384
			}
3385
3386
		} else {
3387
			checkSet = parts = [];
3388
		}
3389
	}
3390
3391
	if ( !checkSet ) {
3392
		checkSet = set;
3393
	}
3394
3395
	if ( !checkSet ) {
3396
		Sizzle.error( cur || selector );
3397
	}
3398
3399
	if ( toString.call(checkSet) === "[object Array]" ) {
3400
		if ( !prune ) {
3401
			results.push.apply( results, checkSet );
3402
3403
		} else if ( context && context.nodeType === 1 ) {
3404
			for ( i = 0; checkSet[i] != null; i++ ) {
3405
				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
3406
					results.push( set[i] );
3407
				}
3408
			}
3409
3410
		} else {
3411
			for ( i = 0; checkSet[i] != null; i++ ) {
3412
				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
3413
					results.push( set[i] );
3414
				}
3415
			}
3416
		}
3417
3418
	} else {
3419
		makeArray( checkSet, results );
3420
	}
3421
3422
	if ( extra ) {
3423
		Sizzle( extra, origContext, results, seed );
3424
		Sizzle.uniqueSort( results );
3425
	}
3426
3427
	return results;
3428
};
3429
3430
Sizzle.uniqueSort = function( results ) {
3431
	if ( sortOrder ) {
3432
		hasDuplicate = baseHasDuplicate;
3433
		results.sort( sortOrder );
3434
3435
		if ( hasDuplicate ) {
3436
			for ( var i = 1; i < results.length; i++ ) {
3437
				if ( results[i] === results[ i - 1 ] ) {
3438
					results.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...
3439
				}
3440
			}
3441
		}
3442
	}
3443
3444
	return results;
3445
};
3446
3447
Sizzle.matches = function( expr, set ) {
3448
	return Sizzle( expr, null, null, set );
3449
};
3450
3451
Sizzle.matchesSelector = function( node, expr ) {
3452
	return Sizzle( expr, null, null, [node] ).length > 0;
3453
};
3454
3455 View Code Duplication
Sizzle.find = function( expr, context, isXML ) {
3456
	var set;
3457
3458
	if ( !expr ) {
3459
		return [];
3460
	}
3461
3462
	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
3463
		var match,
3464
			type = Expr.order[i];
3465
		
3466
		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
3467
			var left = match[1];
3468
			match.splice( 1, 1 );
3469
3470
			if ( left.substr( left.length - 1 ) !== "\\" ) {
3471
				match[1] = (match[1] || "").replace(/\\/g, "");
3472
				set = Expr.find[ type ]( match, context, isXML );
3473
3474
				if ( set != null ) {
3475
					expr = expr.replace( Expr.match[ type ], "" );
3476
					break;
3477
				}
3478
			}
3479
		}
3480
	}
3481
3482
	if ( !set ) {
3483
		set = typeof context.getElementsByTagName !== "undefined" ?
3484
			context.getElementsByTagName( "*" ) :
3485
			[];
3486
	}
3487
3488
	return { set: set, expr: expr };
3489
};
3490
3491 View Code Duplication
Sizzle.filter = function( expr, set, inplace, not ) {
3492
	var match, anyFound,
3493
		old = expr,
3494
		result = [],
3495
		curLoop = set,
3496
		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
3497
3498
	while ( expr && set.length ) {
3499
		for ( var type in Expr.filter ) {
3500
			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
3501
				var found, item,
3502
					filter = Expr.filter[ type ],
3503
					left = match[1];
3504
3505
				anyFound = false;
3506
3507
				match.splice(1,1);
3508
3509
				if ( left.substr( left.length - 1 ) === "\\" ) {
3510
					continue;
3511
				}
3512
3513
				if ( curLoop === result ) {
3514
					result = [];
3515
				}
3516
3517
				if ( Expr.preFilter[ type ] ) {
3518
					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
3519
3520
					if ( !match ) {
3521
						anyFound = found = true;
3522
3523
					} else if ( match === true ) {
3524
						continue;
3525
					}
3526
				}
3527
3528
				if ( match ) {
3529
					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
3530
						if ( item ) {
3531
							found = filter( item, match, i, curLoop );
3532
							var pass = not ^ !!found;
3533
3534
							if ( inplace && found != null ) {
3535
								if ( pass ) {
3536
									anyFound = true;
3537
3538
								} else {
3539
									curLoop[i] = false;
3540
								}
3541
3542
							} else if ( pass ) {
3543
								result.push( item );
3544
								anyFound = true;
3545
							}
3546
						}
3547
					}
3548
				}
3549
3550
				if ( found !== undefined ) {
3551
					if ( !inplace ) {
3552
						curLoop = result;
3553
					}
3554
3555
					expr = expr.replace( Expr.match[ type ], "" );
3556
3557
					if ( !anyFound ) {
3558
						return [];
3559
					}
3560
3561
					break;
3562
				}
3563
			}
3564
		}
3565
3566
		// Improper expression
3567
		if ( expr === old ) {
3568
			if ( anyFound == null ) {
3569
				Sizzle.error( expr );
3570
3571
			} else {
3572
				break;
3573
			}
3574
		}
3575
3576
		old = expr;
3577
	}
3578
3579
	return curLoop;
3580
};
3581
3582
Sizzle.error = function( msg ) {
3583
	throw "Syntax error, unrecognized expression: " + msg;
3584
};
3585
3586
var Expr = Sizzle.selectors = {
3587
	order: [ "ID", "NAME", "TAG" ],
3588
3589
	match: {
3590
		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
3591
		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
3592
		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
3593
		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
3594
		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
3595
		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
3596
		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
3597
		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
3598
	},
3599
3600
	leftMatch: {},
3601
3602
	attrMap: {
3603
		"class": "className",
3604
		"for": "htmlFor"
3605
	},
3606
3607
	attrHandle: {
3608
		href: function( elem ) {
3609
			return elem.getAttribute( "href" );
3610
		}
3611
	},
3612
3613
	relative: {
3614
		"+": function(checkSet, part){
3615
			var isPartStr = typeof part === "string",
3616
				isTag = isPartStr && !/\W/.test( part ),
3617
				isPartStrNotTag = isPartStr && !isTag;
3618
3619
			if ( isTag ) {
3620
				part = part.toLowerCase();
3621
			}
3622
3623 View Code Duplication
			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
3624
				if ( (elem = checkSet[i]) ) {
3625
					while ( (elem = elem.previousSibling) && elem.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...
3626
3627
					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
3628
						elem || false :
3629
						elem === part;
3630
				}
3631
			}
3632
3633
			if ( isPartStrNotTag ) {
3634
				Sizzle.filter( part, checkSet, true );
3635
			}
3636
		},
3637
3638
		">": function( checkSet, part ) {
3639
			var elem,
3640
				isPartStr = typeof part === "string",
3641
				i = 0,
3642
				l = checkSet.length;
3643
3644
			if ( isPartStr && !/\W/.test( part ) ) {
3645
				part = part.toLowerCase();
3646
3647
				for ( ; i < l; i++ ) {
3648
					elem = checkSet[i];
3649
3650
					if ( elem ) {
3651
						var parent = elem.parentNode;
3652
						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
3653
					}
3654
				}
3655
3656
			} else {
3657
				for ( ; i < l; i++ ) {
3658
					elem = checkSet[i];
3659
3660
					if ( elem ) {
3661
						checkSet[i] = isPartStr ?
3662
							elem.parentNode :
3663
							elem.parentNode === part;
3664
					}
3665
				}
3666
3667
				if ( isPartStr ) {
3668
					Sizzle.filter( part, checkSet, true );
3669
				}
3670
			}
3671
		},
3672
3673
		"": function(checkSet, part, isXML){
3674
			var nodeCheck,
3675
				doneName = done++,
3676
				checkFn = dirCheck;
3677
3678
			if ( typeof part === "string" && !/\W/.test(part) ) {
3679
				part = part.toLowerCase();
3680
				nodeCheck = part;
3681
				checkFn = dirNodeCheck;
3682
			}
3683
3684
			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
0 ignored issues
show
Bug introduced by
The variable nodeCheck does not seem to be initialized in case typeof part === "string" && !\W.test(part) on line 3678 is false. Are you sure the function checkFn handles undefined variables?
Loading history...
3685
		},
3686
3687
		"~": function( checkSet, part, isXML ) {
3688
			var nodeCheck,
3689
				doneName = done++,
3690
				checkFn = dirCheck;
3691
3692
			if ( typeof part === "string" && !/\W/.test( part ) ) {
3693
				part = part.toLowerCase();
3694
				nodeCheck = part;
3695
				checkFn = dirNodeCheck;
3696
			}
3697
3698
			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
0 ignored issues
show
Bug introduced by
The variable nodeCheck does not seem to be initialized in case typeof part === "string" && !\W.test(part) on line 3692 is false. Are you sure the function checkFn handles undefined variables?
Loading history...
3699
		}
3700
	},
3701
3702
	find: {
3703
		ID: function( match, context, isXML ) {
3704
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
3705
				var m = context.getElementById(match[1]);
3706
				// Check parentNode to catch when Blackberry 4.6 returns
3707
				// nodes that are no longer in the document #6963
3708
				return m && m.parentNode ? [m] : [];
3709
			}
3710
		},
3711
3712
		NAME: function( match, context ) {
3713
			if ( typeof context.getElementsByName !== "undefined" ) {
3714
				var ret = [],
3715
					results = context.getElementsByName( match[1] );
3716
3717
				for ( var i = 0, l = results.length; i < l; i++ ) {
3718
					if ( results[i].getAttribute("name") === match[1] ) {
3719
						ret.push( results[i] );
3720
					}
3721
				}
3722
3723
				return ret.length === 0 ? null : ret;
3724
			}
3725
		},
3726
3727
		TAG: function( match, context ) {
3728
			if ( typeof context.getElementsByTagName !== "undefined" ) {
3729
				return context.getElementsByTagName( match[1] );
3730
			}
3731
		}
3732
	},
3733
	preFilter: {
3734
		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
3735
			match = " " + match[1].replace(/\\/g, "") + " ";
3736
3737
			if ( isXML ) {
3738
				return match;
3739
			}
3740
3741 View Code Duplication
			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
3742
				if ( elem ) {
3743
					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
3744
						if ( !inplace ) {
3745
							result.push( elem );
3746
						}
3747
3748
					} else if ( inplace ) {
3749
						curLoop[i] = false;
3750
					}
3751
				}
3752
			}
3753
3754
			return false;
3755
		},
3756
3757
		ID: function( match ) {
3758
			return match[1].replace(/\\/g, "");
3759
		},
3760
3761
		TAG: function( match, curLoop ) {
3762
			return match[1].toLowerCase();
3763
		},
3764
3765 View Code Duplication
		CHILD: function( match ) {
3766
			if ( match[1] === "nth" ) {
3767
				if ( !match[2] ) {
3768
					Sizzle.error( match[0] );
3769
				}
3770
3771
				match[2] = match[2].replace(/^\+|\s*/g, '');
3772
3773
				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
3774
				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
3775
					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
3776
					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
3777
3778
				// calculate the numbers (first)n+(last) including if they are negative
3779
				match[2] = (test[1] + (test[2] || 1)) - 0;
3780
				match[3] = test[3] - 0;
3781
			}
3782
			else if ( match[2] ) {
3783
				Sizzle.error( match[0] );
3784
			}
3785
3786
			// TODO: Move to normal caching system
3787
			match[0] = done++;
3788
3789
			return match;
3790
		},
3791
3792
		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
3793
			var name = match[1] = match[1].replace(/\\/g, "");
3794
			
3795
			if ( !isXML && Expr.attrMap[name] ) {
3796
				match[1] = Expr.attrMap[name];
3797
			}
3798
3799
			// Handle if an un-quoted value was used
3800
			match[4] = ( match[4] || match[5] || "" ).replace(/\\/g, "");
3801
3802
			if ( match[2] === "~=" ) {
3803
				match[4] = " " + match[4] + " ";
3804
			}
3805
3806
			return match;
3807
		},
3808
3809 View Code Duplication
		PSEUDO: function( match, curLoop, inplace, result, not ) {
3810
			if ( match[1] === "not" ) {
3811
				// If we're dealing with a complex expression, or a simple one
3812
				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
3813
					match[3] = Sizzle(match[3], null, null, curLoop);
3814
3815
				} else {
3816
					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
3817
3818
					if ( !inplace ) {
3819
						result.push.apply( result, ret );
3820
					}
3821
3822
					return false;
3823
				}
3824
3825
			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
3826
				return true;
3827
			}
3828
			
3829
			return match;
3830
		},
3831
3832
		POS: function( match ) {
3833
			match.unshift( true );
3834
3835
			return match;
3836
		}
3837
	},
3838
	
3839
	filters: {
3840
		enabled: function( elem ) {
3841
			return elem.disabled === false && elem.type !== "hidden";
3842
		},
3843
3844
		disabled: function( elem ) {
3845
			return elem.disabled === true;
3846
		},
3847
3848
		checked: function( elem ) {
3849
			return elem.checked === true;
3850
		},
3851
		
3852
		selected: function( elem ) {
3853
			// Accessing this property makes selected-by-default
3854
			// options in Safari work properly
3855
			elem.parentNode.selectedIndex;
0 ignored issues
show
introduced by
The result of the property access to elem.parentNode.selectedIndex is not used.
Loading history...
3856
			
3857
			return elem.selected === true;
3858
		},
3859
3860
		parent: function( elem ) {
3861
			return !!elem.firstChild;
3862
		},
3863
3864
		empty: function( elem ) {
3865
			return !elem.firstChild;
3866
		},
3867
3868
		has: function( elem, i, match ) {
3869
			return !!Sizzle( match[3], elem ).length;
3870
		},
3871
3872
		header: function( elem ) {
3873
			return (/h\d/i).test( elem.nodeName );
3874
		},
3875
3876
		text: function( elem ) {
3877
			return "text" === elem.type;
3878
		},
3879
		radio: function( elem ) {
3880
			return "radio" === elem.type;
3881
		},
3882
3883
		checkbox: function( elem ) {
3884
			return "checkbox" === elem.type;
3885
		},
3886
3887
		file: function( elem ) {
3888
			return "file" === elem.type;
3889
		},
3890
		password: function( elem ) {
3891
			return "password" === elem.type;
3892
		},
3893
3894
		submit: function( elem ) {
3895
			return "submit" === elem.type;
3896
		},
3897
3898
		image: function( elem ) {
3899
			return "image" === elem.type;
3900
		},
3901
3902
		reset: function( elem ) {
3903
			return "reset" === elem.type;
3904
		},
3905
3906
		button: function( elem ) {
3907
			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3908
		},
3909
3910
		input: function( elem ) {
3911
			return (/input|select|textarea|button/i).test( elem.nodeName );
3912
		}
3913
	},
3914
	setFilters: {
3915
		first: function( elem, i ) {
3916
			return i === 0;
3917
		},
3918
3919
		last: function( elem, i, match, array ) {
3920
			return i === array.length - 1;
3921
		},
3922
3923
		even: function( elem, i ) {
3924
			return i % 2 === 0;
3925
		},
3926
3927
		odd: function( elem, i ) {
3928
			return i % 2 === 1;
3929
		},
3930
3931
		lt: function( elem, i, match ) {
3932
			return i < match[3] - 0;
3933
		},
3934
3935
		gt: function( elem, i, match ) {
3936
			return i > match[3] - 0;
3937
		},
3938
3939
		nth: function( elem, i, match ) {
3940
			return match[3] - 0 === i;
3941
		},
3942
3943
		eq: function( elem, i, match ) {
3944
			return match[3] - 0 === i;
3945
		}
3946
	},
3947
	filter: {
3948 View Code Duplication
		PSEUDO: function( elem, match, i, array ) {
3949
			var name = match[1],
3950
				filter = Expr.filters[ name ];
3951
3952
			if ( filter ) {
3953
				return filter( elem, i, match, array );
3954
3955
			} else if ( name === "contains" ) {
3956
				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
3957
3958
			} else if ( name === "not" ) {
3959
				var not = match[3];
3960
3961
				for ( var j = 0, l = not.length; j < l; j++ ) {
3962
					if ( not[j] === elem ) {
3963
						return false;
3964
					}
3965
				}
3966
3967
				return true;
3968
3969
			} else {
3970
				Sizzle.error( name );
3971
			}
3972
		},
3973
3974
		CHILD: function( elem, match ) {
3975
			var type = match[1],
3976
				node = elem;
3977
3978
			switch ( type ) {
3979
				case "only":
3980
				case "first":
3981
					while ( (node = node.previousSibling) )	 {
3982
						if ( node.nodeType === 1 ) { 
3983
							return false; 
3984
						}
0 ignored issues
show
introduced by
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
3985
					}
3986
3987
					if ( type === "first" ) { 
3988
						return true; 
3989
					}
3990
3991
					node = elem;
0 ignored issues
show
introduced by
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
3992
3993
				case "last":
3994
					while ( (node = node.nextSibling) )	 {
3995
						if ( node.nodeType === 1 ) { 
3996
							return false; 
3997
						}
0 ignored issues
show
introduced by
This node falls through to the next case due to this statement. Please add a comment either directly below this line or between the cases to explain.
Loading history...
3998
					}
3999
4000
					return true;
4001
4002
				case "nth":
4003
					var first = match[2],
4004
						last = match[3];
4005
4006
					if ( first === 1 && last === 0 ) {
4007
						return true;
4008
					}
4009
					
4010
					var doneName = match[0],
4011
						parent = elem.parentNode;
4012
	
4013
					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
4014
						var count = 0;
4015
						
4016
						for ( node = parent.firstChild; node; node = node.nextSibling ) {
4017
							if ( node.nodeType === 1 ) {
4018
								node.nodeIndex = ++count;
4019
							}
4020
						} 
4021
4022
						parent.sizcache = doneName;
4023
					}
4024
					
4025
					var diff = elem.nodeIndex - last;
4026
4027
					if ( first === 0 ) {
4028
						return diff === 0;
4029
4030
					} 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...
4031
						return ( diff % first === 0 && diff / first >= 0 );
4032
					}
4033
			}
0 ignored issues
show
Comprehensibility introduced by
There is no default case in this switch, so nothing gets returned when all cases fail. You might want to consider adding a default or return undefined explicitly.
Loading history...
4034
		},
4035
4036
		ID: function( elem, match ) {
4037
			return elem.nodeType === 1 && elem.getAttribute("id") === match;
4038
		},
4039
4040
		TAG: function( elem, match ) {
4041
			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
4042
		},
4043
		
4044
		CLASS: function( elem, match ) {
4045
			return (" " + (elem.className || elem.getAttribute("class")) + " ")
4046
				.indexOf( match ) > -1;
4047
		},
4048
4049
		ATTR: function( elem, match ) {
4050
			var name = match[1],
4051
				result = Expr.attrHandle[ name ] ?
4052
					Expr.attrHandle[ name ]( elem ) :
4053
					elem[ name ] != null ?
4054
						elem[ name ] :
4055
						elem.getAttribute( name ),
4056
				value = result + "",
4057
				type = match[2],
4058
				check = match[4];
4059
4060 View Code Duplication
			return result == null ?
4061
				type === "!=" :
4062
				type === "=" ?
4063
				value === check :
4064
				type === "*=" ?
4065
				value.indexOf(check) >= 0 :
4066
				type === "~=" ?
4067
				(" " + value + " ").indexOf(check) >= 0 :
4068
				!check ?
4069
				value && result !== false :
4070
				type === "!=" ?
4071
				value !== check :
4072
				type === "^=" ?
4073
				value.indexOf(check) === 0 :
4074
				type === "$=" ?
4075
				value.substr(value.length - check.length) === check :
4076
				type === "|=" ?
4077
				value === check || value.substr(0, check.length + 1) === check + "-" :
4078
				false;
4079
		},
4080
4081
		POS: function( elem, match, i, array ) {
4082
			var name = match[2],
4083
				filter = Expr.setFilters[ name ];
4084
4085
			if ( filter ) {
4086
				return filter( elem, i, match, array );
4087
			}
4088
		}
4089
	}
4090
};
4091
4092
var origPOS = Expr.match.POS,
4093
	fescape = function(all, num){
4094
		return "\\" + (num - 0 + 1);
4095
	};
4096
4097
for ( var type in Expr.match ) {
4098
	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4099
	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4100
}
4101
4102
var makeArray = function( array, results ) {
4103
	array = Array.prototype.slice.call( array, 0 );
4104
4105
	if ( results ) {
4106
		results.push.apply( results, array );
4107
		return results;
4108
	}
4109
	
4110
	return array;
4111
};
4112
4113
// Perform a simple check to determine if the browser is capable of
4114
// converting a NodeList to an array using builtin methods.
4115
// Also verifies that the returned array holds DOM nodes
4116
// (which is not the case in the Blackberry browser)
4117
try {
4118
	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
0 ignored issues
show
introduced by
The result of the property access to Array.prototype.slice.ca...ildNodes, 0).0.nodeType is not used.
Loading history...
4119
4120
// Provide a fallback method if it does not work
4121
} catch( e ) {
4122 View Code Duplication
	makeArray = function( array, results ) {
4123
		var i = 0,
4124
			ret = results || [];
4125
4126
		if ( toString.call(array) === "[object Array]" ) {
4127
			Array.prototype.push.apply( ret, array );
4128
4129
		} else {
4130
			if ( typeof array.length === "number" ) {
4131
				for ( var l = array.length; i < l; i++ ) {
4132
					ret.push( array[i] );
4133
				}
4134
4135
			} else {
4136
				for ( ; array[i]; i++ ) {
4137
					ret.push( array[i] );
4138
				}
4139
			}
4140
		}
4141
4142
		return ret;
4143
	};
4144
}
4145
4146
var sortOrder, siblingCheck;
4147
4148 View Code Duplication
if ( document.documentElement.compareDocumentPosition ) {
4149
	sortOrder = function( a, b ) {
4150
		if ( a === b ) {
4151
			hasDuplicate = true;
4152
			return 0;
4153
		}
4154
4155
		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4156
			return a.compareDocumentPosition ? -1 : 1;
4157
		}
4158
4159
		return a.compareDocumentPosition(b) & 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...
4160
	};
4161
4162
} else {
4163
	sortOrder = function( a, b ) {
4164
		var al, bl,
4165
			ap = [],
4166
			bp = [],
4167
			aup = a.parentNode,
4168
			bup = b.parentNode,
4169
			cur = aup;
4170
4171
		// The nodes are identical, we can exit early
4172
		if ( a === b ) {
4173
			hasDuplicate = true;
4174
			return 0;
4175
4176
		// If the nodes are siblings (or identical) we can do a quick check
4177
		} else if ( aup === bup ) {
4178
			return siblingCheck( a, b );
4179
4180
		// If no parents were found then the nodes are disconnected
4181
		} else if ( !aup ) {
4182
			return -1;
4183
4184
		} else if ( !bup ) {
4185
			return 1;
4186
		}
4187
4188
		// Otherwise they're somewhere else in the tree so we need
4189
		// to build up a full list of the parentNodes for comparison
4190
		while ( cur ) {
4191
			ap.unshift( cur );
4192
			cur = cur.parentNode;
4193
		}
4194
4195
		cur = bup;
4196
4197
		while ( cur ) {
4198
			bp.unshift( cur );
4199
			cur = cur.parentNode;
4200
		}
4201
4202
		al = ap.length;
4203
		bl = bp.length;
4204
4205
		// Start walking down the tree looking for a discrepancy
4206
		for ( var i = 0; i < al && i < bl; i++ ) {
4207
			if ( ap[i] !== bp[i] ) {
4208
				return siblingCheck( ap[i], bp[i] );
4209
			}
4210
		}
4211
4212
		// We ended someplace up the tree so do a sibling check
4213
		return i === al ?
4214
			siblingCheck( a, bp[i], -1 ) :
4215
			siblingCheck( ap[i], b, 1 );
4216
	};
4217
4218
	siblingCheck = function( a, b, ret ) {
4219
		if ( a === b ) {
4220
			return ret;
4221
		}
4222
4223
		var cur = a.nextSibling;
4224
4225
		while ( cur ) {
4226
			if ( cur === b ) {
4227
				return -1;
4228
			}
4229
4230
			cur = cur.nextSibling;
4231
		}
4232
4233
		return 1;
4234
	};
4235
}
4236
4237
// Utility function for retreiving the text value of an array of DOM nodes
4238
Sizzle.getText = function( elems ) {
4239
	var ret = "", elem;
4240
4241
	for ( var i = 0; elems[i]; i++ ) {
4242
		elem = elems[i];
4243
4244
		// Get the text from text nodes and CDATA nodes
4245
		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
4246
			ret += elem.nodeValue;
4247
4248
		// Traverse everything else, except comment nodes
4249
		} else if ( elem.nodeType !== 8 ) {
4250
			ret += Sizzle.getText( elem.childNodes );
4251
		}
4252
	}
4253
4254
	return ret;
4255
};
4256
4257
// Check to see if the browser returns elements by name when
4258
// querying by getElementById (and provide a workaround)
4259 View Code Duplication
(function(){
4260
	// We're going to inject a fake input element with a specified name
4261
	var form = document.createElement("div"),
4262
		id = "script" + (new Date()).getTime(),
4263
		root = document.documentElement;
4264
4265
	form.innerHTML = "<a name='" + id + "'/>";
4266
4267
	// Inject it into the root element, check its status, and remove it quickly
4268
	root.insertBefore( form, root.firstChild );
4269
4270
	// The workaround has to do additional checks after a getElementById
4271
	// Which slows things down for other browsers (hence the branching)
4272
	if ( document.getElementById( id ) ) {
4273
		Expr.find.ID = function( match, context, isXML ) {
4274
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
4275
				var m = context.getElementById(match[1]);
4276
4277
				return m ?
4278
					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4279
						[m] :
4280
						undefined :
4281
					[];
4282
			}
4283
		};
4284
4285
		Expr.filter.ID = function( elem, match ) {
4286
			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4287
4288
			return elem.nodeType === 1 && node && node.nodeValue === match;
4289
		};
4290
	}
4291
4292
	root.removeChild( form );
4293
4294
	// release memory in IE
4295
	root = form = null;
4296
})();
4297
4298 View Code Duplication
(function(){
4299
	// Check to see if the browser returns only elements
4300
	// when doing getElementsByTagName("*")
4301
4302
	// Create a fake element
4303
	var div = document.createElement("div");
4304
	div.appendChild( document.createComment("") );
4305
4306
	// Make sure no comments are found
4307
	if ( div.getElementsByTagName("*").length > 0 ) {
4308
		Expr.find.TAG = function( match, context ) {
4309
			var results = context.getElementsByTagName( match[1] );
4310
4311
			// Filter out possible comments
4312
			if ( match[1] === "*" ) {
4313
				var tmp = [];
4314
4315
				for ( var i = 0; results[i]; i++ ) {
4316
					if ( results[i].nodeType === 1 ) {
4317
						tmp.push( results[i] );
4318
					}
4319
				}
4320
4321
				results = tmp;
4322
			}
4323
4324
			return results;
4325
		};
4326
	}
4327
4328
	// Check to see if an attribute returns normalized href attributes
4329
	div.innerHTML = "<a href='#'></a>";
4330
4331
	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4332
			div.firstChild.getAttribute("href") !== "#" ) {
4333
4334
		Expr.attrHandle.href = function( elem ) {
4335
			return elem.getAttribute( "href", 2 );
4336
		};
4337
	}
4338
4339
	// release memory in IE
4340
	div = null;
4341
})();
4342
4343 View Code Duplication
if ( document.querySelectorAll ) {
4344
	(function(){
4345
		var oldSizzle = Sizzle,
4346
			div = document.createElement("div"),
4347
			id = "__sizzle__";
4348
4349
		div.innerHTML = "<p class='TEST'></p>";
4350
4351
		// Safari can't handle uppercase or unicode characters when
4352
		// in quirks mode.
4353
		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4354
			return;
4355
		}
4356
	
4357
		Sizzle = function( query, context, extra, seed ) {
4358
			context = context || document;
4359
4360
			// Only use querySelectorAll on non-XML documents
4361
			// (ID selectors don't work in non-HTML documents)
4362
			if ( !seed && !Sizzle.isXML(context) ) {
4363
				// See if we find a selector to speed up
4364
				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
4365
				
4366
				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
4367
					// Speed-up: Sizzle("TAG")
4368
					if ( match[1] ) {
4369
						return makeArray( context.getElementsByTagName( query ), extra );
4370
					
4371
					// Speed-up: Sizzle(".CLASS")
4372
					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
4373
						return makeArray( context.getElementsByClassName( match[2] ), extra );
4374
					}
4375
				}
4376
				
4377
				if ( context.nodeType === 9 ) {
4378
					// Speed-up: Sizzle("body")
4379
					// The body element only exists once, optimize finding it
4380
					if ( query === "body" && context.body ) {
4381
						return makeArray( [ context.body ], extra );
4382
						
4383
					// Speed-up: Sizzle("#ID")
4384
					} else if ( match && match[3] ) {
4385
						var elem = context.getElementById( match[3] );
4386
4387
						// Check parentNode to catch when Blackberry 4.6 returns
4388
						// nodes that are no longer in the document #6963
4389
						if ( elem && elem.parentNode ) {
4390
							// Handle the case where IE and Opera return items
4391
							// by name instead of ID
4392
							if ( elem.id === match[3] ) {
4393
								return makeArray( [ elem ], extra );
4394
							}
4395
							
4396
						} else {
4397
							return makeArray( [], extra );
4398
						}
4399
					}
4400
					
4401
					try {
4402
						return makeArray( context.querySelectorAll(query), extra );
4403
					} 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...
4404
4405
				// qSA works strangely on Element-rooted queries
4406
				// We can work around this by specifying an extra ID on the root
4407
				// and working up from there (Thanks to Andrew Dupont for the technique)
4408
				// IE 8 doesn't work on object elements
4409
				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
4410
					var old = context.getAttribute( "id" ),
4411
						nid = old || id,
4412
						hasParent = context.parentNode,
4413
						relativeHierarchySelector = /^\s*[+~]/.test( query );
4414
4415
					if ( !old ) {
4416
						context.setAttribute( "id", nid );
4417
					} else {
4418
						nid = nid.replace( /'/g, "\\$&" );
4419
					}
4420
					if ( relativeHierarchySelector && hasParent ) {
4421
						context = context.parentNode;
4422
					}
4423
4424
					try {
4425
						if ( !relativeHierarchySelector || hasParent ) {
4426
							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
4427
						}
4428
4429
					} catch(pseudoError) {
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...
4430
					} finally {
4431
						if ( !old ) {
4432
							context.removeAttribute( "id" );
4433
						}
4434
					}
4435
				}
4436
			}
4437
		
4438
			return oldSizzle(query, context, extra, seed);
4439
		};
4440
4441
		for ( var prop in oldSizzle ) {
4442
			Sizzle[ prop ] = oldSizzle[ prop ];
4443
		}
4444
4445
		// release memory in IE
4446
		div = null;
4447
	})();
4448
}
4449
4450
(function(){
4451
	var html = document.documentElement,
4452
		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
4453
		pseudoWorks = false;
4454
4455
	try {
4456
		// This should fail with an exception
4457
		// Gecko does not error, returns false instead
4458
		matches.call( document.documentElement, "[test!='']:sizzle" );
4459
	
4460
	} catch( pseudoError ) {
4461
		pseudoWorks = true;
4462
	}
4463
4464
	if ( matches ) {
4465
		Sizzle.matchesSelector = function( node, expr ) {
4466
			// Make sure that attribute selectors are quoted
4467
			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
4468
4469
			if ( !Sizzle.isXML( node ) ) {
4470
				try { 
4471
					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
4472
						return matches.call( node, expr );
4473
					}
4474
				} 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...
4475
			}
4476
4477
			return Sizzle(expr, null, null, [node]).length > 0;
4478
		};
4479
	}
4480
})();
4481
4482 View Code Duplication
(function(){
4483
	var div = document.createElement("div");
4484
4485
	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
4486
4487
	// Opera can't find a second classname (in 9.6)
4488
	// Also, make sure that getElementsByClassName actually exists
4489
	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
4490
		return;
4491
	}
4492
4493
	// Safari caches class attributes, doesn't catch changes (in 3.2)
4494
	div.lastChild.className = "e";
4495
4496
	if ( div.getElementsByClassName("e").length === 1 ) {
4497
		return;
4498
	}
4499
	
4500
	Expr.order.splice(1, 0, "CLASS");
4501
	Expr.find.CLASS = function( match, context, isXML ) {
4502
		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
4503
			return context.getElementsByClassName(match[1]);
4504
		}
4505
	};
4506
4507
	// release memory in IE
4508
	div = null;
4509
})();
4510
4511
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4512
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4513
		var elem = checkSet[i];
4514
4515
		if ( elem ) {
4516
			var match = false;
4517
4518
			elem = elem[dir];
4519
4520
			while ( elem ) {
4521
				if ( elem.sizcache === doneName ) {
4522
					match = checkSet[elem.sizset];
4523
					break;
4524
				}
4525
4526
				if ( elem.nodeType === 1 && !isXML ){
4527
					elem.sizcache = doneName;
4528
					elem.sizset = i;
4529
				}
4530
4531
				if ( elem.nodeName.toLowerCase() === cur ) {
4532
					match = elem;
4533
					break;
4534
				}
4535
4536
				elem = elem[dir];
4537
			}
4538
4539
			checkSet[i] = match;
4540
		}
4541
	}
4542
}
4543
4544
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
4545
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
4546
		var elem = checkSet[i];
4547
4548
		if ( elem ) {
4549
			var match = false;
4550
			
4551
			elem = elem[dir];
4552
4553
			while ( elem ) {
4554
				if ( elem.sizcache === doneName ) {
4555
					match = checkSet[elem.sizset];
4556
					break;
4557
				}
4558
4559
				if ( elem.nodeType === 1 ) {
4560
					if ( !isXML ) {
4561
						elem.sizcache = doneName;
4562
						elem.sizset = i;
4563
					}
4564
4565
					if ( typeof cur !== "string" ) {
4566
						if ( elem === cur ) {
4567
							match = true;
4568
							break;
4569
						}
4570
4571
					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
4572
						match = elem;
4573
						break;
4574
					}
4575
				}
4576
4577
				elem = elem[dir];
4578
			}
4579
4580
			checkSet[i] = match;
4581
		}
4582
	}
4583
}
4584
4585 View Code Duplication
if ( document.documentElement.contains ) {
4586
	Sizzle.contains = function( a, b ) {
4587
		return a !== b && (a.contains ? a.contains(b) : true);
4588
	};
4589
4590
} else if ( document.documentElement.compareDocumentPosition ) {
4591
	Sizzle.contains = function( a, b ) {
4592
		return !!(a.compareDocumentPosition(b) & 16);
4593
	};
4594
4595
} else {
4596
	Sizzle.contains = function() {
4597
		return false;
4598
	};
4599
}
4600
4601
Sizzle.isXML = function( elem ) {
4602
	// documentElement is verified for cases where it doesn't yet exist
4603
	// (such as loading iframes in IE - #4833) 
4604
	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
4605
4606
	return documentElement ? documentElement.nodeName !== "HTML" : false;
4607
};
4608
4609 View Code Duplication
var posProcess = function( selector, context ) {
4610
	var match,
4611
		tmpSet = [],
4612
		later = "",
4613
		root = context.nodeType ? [context] : context;
4614
4615
	// Position selectors must be done after the filter
4616
	// And so must :not(positional) so we move all PSEUDOs to the end
4617
	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
4618
		later += match[0];
4619
		selector = selector.replace( Expr.match.PSEUDO, "" );
4620
	}
4621
4622
	selector = Expr.relative[selector] ? selector + "*" : selector;
4623
4624
	for ( var i = 0, l = root.length; i < l; i++ ) {
4625
		Sizzle( selector, root[i], tmpSet );
4626
	}
4627
4628
	return Sizzle.filter( later, tmpSet );
4629
};
4630
4631
// EXPOSE
4632
jQuery.find = Sizzle;
4633
jQuery.expr = Sizzle.selectors;
4634
jQuery.expr[":"] = jQuery.expr.filters;
4635
jQuery.unique = Sizzle.uniqueSort;
4636
jQuery.text = Sizzle.getText;
4637
jQuery.isXMLDoc = Sizzle.isXML;
4638
jQuery.contains = Sizzle.contains;
4639
4640
4641
})();
4642
4643
4644
var runtil = /Until$/,
4645
	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
4646
	// Note: This RegExp should be improved, or likely pulled from Sizzle
4647
	rmultiselector = /,/,
4648
	isSimple = /^.[^:#\[\.,]*$/,
4649
	slice = Array.prototype.slice,
4650
	POS = jQuery.expr.match.POS,
4651
	// methods guaranteed to produce a unique set when starting from a unique set
4652
	guaranteedUnique = {
4653
		children: true,
4654
		contents: true,
4655
		next: true,
4656
		prev: true
4657
	};
4658
4659
jQuery.fn.extend({
4660
	find: function( selector ) {
4661
		var ret = this.pushStack( "", "find", selector ),
4662
			length = 0;
4663
4664 View Code Duplication
		for ( var i = 0, l = this.length; i < l; i++ ) {
4665
			length = ret.length;
4666
			jQuery.find( selector, this[i], ret );
4667
4668
			if ( i > 0 ) {
4669
				// Make sure that the results are unique
4670
				for ( var n = length; n < ret.length; n++ ) {
4671
					for ( var r = 0; r < length; r++ ) {
4672
						if ( ret[r] === ret[n] ) {
4673
							ret.splice(n--, 1);
0 ignored issues
show
Complexity Coding Style introduced by
You seem to be assigning a new value to the loop variable n here. Please check if this was indeed your intention. Even if it was, consider using another kind of loop instead.
Loading history...
4674
							break;
4675
						}
4676
					}
4677
				}
4678
			}
4679
		}
4680
4681
		return ret;
4682
	},
4683
4684
	has: function( target ) {
4685
		var targets = jQuery( target );
4686
		return this.filter(function() {
4687
			for ( var i = 0, l = targets.length; i < l; i++ ) {
4688
				if ( jQuery.contains( this, targets[i] ) ) {
4689
					return true;
4690
				}
4691
			}
4692
		});
4693
	},
4694
4695
	not: function( selector ) {
4696
		return this.pushStack( winnow(this, selector, false), "not", selector);
4697
	},
4698
4699
	filter: function( selector ) {
4700
		return this.pushStack( winnow(this, selector, true), "filter", selector );
4701
	},
4702
4703
	is: function( selector ) {
4704
		return !!selector && jQuery.filter( selector, this ).length > 0;
4705
	},
4706
4707
	closest: function( selectors, context ) {
4708
		var ret = [], i, l, cur = this[0];
4709
4710
		if ( jQuery.isArray( selectors ) ) {
4711
			var match, selector,
4712
				matches = {},
4713
				level = 1;
4714
4715
			if ( cur && selectors.length ) {
4716
				for ( i = 0, l = selectors.length; i < l; i++ ) {
4717
					selector = selectors[i];
4718
4719
					if ( !matches[selector] ) {
4720
						matches[selector] = jQuery.expr.match.POS.test( selector ) ?
4721
							jQuery( selector, context || this.context ) :
4722
							selector;
4723
					}
4724
				}
4725
4726
				while ( cur && cur.ownerDocument && cur !== context ) {
4727
					for ( selector in matches ) {
4728
						match = matches[selector];
4729
4730
						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
4731
							ret.push({ selector: selector, elem: cur, level: level });
4732
						}
4733
					}
4734
4735
					cur = cur.parentNode;
4736
					level++;
4737
				}
4738
			}
4739
4740
			return ret;
4741
		}
4742
4743
		var pos = POS.test( selectors ) ?
4744
			jQuery( selectors, context || this.context ) : null;
4745
4746
		for ( i = 0, l = this.length; i < l; i++ ) {
4747
			cur = this[i];
4748
4749
			while ( cur ) {
4750
				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
4751
					ret.push( cur );
4752
					break;
4753
4754
				} 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...
4755
					cur = cur.parentNode;
4756
					if ( !cur || !cur.ownerDocument || cur === context ) {
4757
						break;
4758
					}
4759
				}
4760
			}
4761
		}
4762
4763
		ret = ret.length > 1 ? jQuery.unique(ret) : ret;
4764
4765
		return this.pushStack( ret, "closest", selectors );
4766
	},
4767
4768
	// Determine the position of an element within
4769
	// the matched set of elements
4770
	index: function( elem ) {
4771
		if ( !elem || typeof elem === "string" ) {
4772
			return jQuery.inArray( this[0],
4773
				// If it receives a string, the selector is used
4774
				// If it receives nothing, the siblings are used
4775
				elem ? jQuery( elem ) : this.parent().children() );
4776
		}
4777
		// Locate the position of the desired element
4778
		return jQuery.inArray(
4779
			// If it receives a jQuery object, the first element is used
4780
			elem.jquery ? elem[0] : elem, this );
4781
	},
4782
4783
	add: function( selector, context ) {
4784
		var set = typeof selector === "string" ?
4785
				jQuery( selector, context ) :
4786
				jQuery.makeArray( selector ),
4787
			all = jQuery.merge( this.get(), set );
4788
4789
		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
4790
			all :
4791
			jQuery.unique( all ) );
4792
	},
4793
4794
	andSelf: function() {
4795
		return this.add( this.prevObject );
4796
	}
4797
});
4798
4799
// A painfully simple check to see if an element is disconnected
4800
// from a document (should be improved, where feasible).
4801
function isDisconnected( node ) {
4802
	return !node || !node.parentNode || node.parentNode.nodeType === 11;
4803
}
4804
4805
jQuery.each({
4806
	parent: function( elem ) {
4807
		var parent = elem.parentNode;
4808
		return parent && parent.nodeType !== 11 ? parent : null;
4809
	},
4810
	parents: function( elem ) {
4811
		return jQuery.dir( elem, "parentNode" );
4812
	},
4813
	parentsUntil: function( elem, i, until ) {
4814
		return jQuery.dir( elem, "parentNode", until );
4815
	},
4816
	next: function( elem ) {
4817
		return jQuery.nth( elem, 2, "nextSibling" );
4818
	},
4819
	prev: function( elem ) {
4820
		return jQuery.nth( elem, 2, "previousSibling" );
4821
	},
4822
	nextAll: function( elem ) {
4823
		return jQuery.dir( elem, "nextSibling" );
4824
	},
4825
	prevAll: function( elem ) {
4826
		return jQuery.dir( elem, "previousSibling" );
4827
	},
4828
	nextUntil: function( elem, i, until ) {
4829
		return jQuery.dir( elem, "nextSibling", until );
4830
	},
4831
	prevUntil: function( elem, i, until ) {
4832
		return jQuery.dir( elem, "previousSibling", until );
4833
	},
4834
	siblings: function( elem ) {
4835
		return jQuery.sibling( elem.parentNode.firstChild, elem );
4836
	},
4837
	children: function( elem ) {
4838
		return jQuery.sibling( elem.firstChild );
4839
	},
4840
	contents: function( elem ) {
4841
		return jQuery.nodeName( elem, "iframe" ) ?
4842
			elem.contentDocument || elem.contentWindow.document :
4843
			jQuery.makeArray( elem.childNodes );
4844
	}
4845 View Code Duplication
}, function( name, fn ) {
4846
	jQuery.fn[ name ] = function( until, selector ) {
4847
		var ret = jQuery.map( this, fn, until ),
4848
                // The variable 'args' was introduced in
4849
                // https://github.com/jquery/jquery/commit/52a0238
4850
                // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
4851
                // http://code.google.com/p/v8/issues/detail?id=1050
4852
                    args = slice.call(arguments);
4853
4854
		if ( !runtil.test( name ) ) {
4855
			selector = until;
4856
		}
4857
4858
		if ( selector && typeof selector === "string" ) {
4859
			ret = jQuery.filter( selector, ret );
4860
		}
4861
4862
		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
4863
4864
		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
4865
			ret = ret.reverse();
4866
		}
4867
4868
		return this.pushStack( ret, name, args.join(",") );
4869
	};
4870
});
4871
4872
jQuery.extend({
4873
	filter: function( expr, elems, not ) {
4874
		if ( not ) {
4875
			expr = ":not(" + expr + ")";
4876
		}
4877
4878
		return elems.length === 1 ?
4879
			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
4880
			jQuery.find.matches(expr, elems);
4881
	},
4882
4883 View Code Duplication
	dir: function( elem, dir, until ) {
4884
		var matched = [],
4885
			cur = elem[ dir ];
4886
4887
		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
4888
			if ( cur.nodeType === 1 ) {
4889
				matched.push( cur );
4890
			}
4891
			cur = cur[dir];
4892
		}
4893
		return matched;
4894
	},
4895
4896
	nth: function( cur, result, dir, elem ) {
4897
		result = result || 1;
4898
		var num = 0;
4899
4900
		for ( ; cur; cur = cur[dir] ) {
4901
			if ( cur.nodeType === 1 && ++num === result ) {
4902
				break;
4903
			}
4904
		}
4905
4906
		return cur;
4907
	},
4908
4909
	sibling: function( n, elem ) {
4910
		var r = [];
4911
4912
		for ( ; n; n = n.nextSibling ) {
4913
			if ( n.nodeType === 1 && n !== elem ) {
4914
				r.push( n );
4915
			}
4916
		}
4917
4918
		return r;
4919
	}
4920
});
4921
4922
// Implement the identical functionality for filter and not
4923 View Code Duplication
function winnow( elements, qualifier, keep ) {
4924
	if ( jQuery.isFunction( qualifier ) ) {
4925
		return jQuery.grep(elements, function( elem, i ) {
4926
			var retVal = !!qualifier.call( elem, i, elem );
4927
			return retVal === keep;
4928
		});
4929
4930
	} else if ( qualifier.nodeType ) {
4931
		return jQuery.grep(elements, function( elem, i ) {
4932
			return (elem === qualifier) === keep;
4933
		});
4934
4935
	} else if ( typeof qualifier === "string" ) {
4936
		var filtered = jQuery.grep(elements, function( elem ) {
4937
			return elem.nodeType === 1;
4938
		});
4939
4940
		if ( isSimple.test( qualifier ) ) {
4941
			return jQuery.filter(qualifier, filtered, !keep);
4942
		} 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...
4943
			qualifier = jQuery.filter( qualifier, filtered );
4944
		}
4945
	}
4946
4947
	return jQuery.grep(elements, function( elem, i ) {
4948
		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
4949
	});
4950
}
4951
4952
4953
4954
4955
var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
4956
	rleadingWhitespace = /^\s+/,
4957
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
4958
	rtagName = /<([\w:]+)/,
4959
	rtbody = /<tbody/i,
4960
	rhtml = /<|&#?\w+;/,
4961
	rnocache = /<(?:script|object|embed|option|style)/i,
4962
	// checked="checked" or checked (html5)
4963
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
4964
	wrapMap = {
4965
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
4966
		legend: [ 1, "<fieldset>", "</fieldset>" ],
4967
		thead: [ 1, "<table>", "</table>" ],
4968
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
4969
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
4970
		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
4971
		area: [ 1, "<map>", "</map>" ],
4972
		_default: [ 0, "", "" ]
4973
	};
4974
4975
wrapMap.optgroup = wrapMap.option;
4976
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
4977
wrapMap.th = wrapMap.td;
4978
4979
// IE can't serialize <link> and <script> tags normally
4980
if ( !jQuery.support.htmlSerialize ) {
4981
	wrapMap._default = [ 1, "div<div>", "</div>" ];
4982
}
4983
4984
jQuery.fn.extend({
4985
	text: function( text ) {
4986
		if ( jQuery.isFunction(text) ) {
4987
			return this.each(function(i) {
4988
				var self = jQuery( this );
4989
4990
				self.text( text.call(this, i, self.text()) );
4991
			});
4992
		}
4993
4994
		if ( typeof text !== "object" && text !== undefined ) {
4995
			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
4996
		}
4997
4998
		return jQuery.text( this );
4999
	},
5000
5001
	wrapAll: function( html ) {
5002
		if ( jQuery.isFunction( html ) ) {
5003
			return this.each(function(i) {
5004
				jQuery(this).wrapAll( html.call(this, i) );
5005
			});
5006
		}
5007
5008
		if ( this[0] ) {
5009
			// The elements to wrap the target around
5010
			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5011
5012
			if ( this[0].parentNode ) {
5013
				wrap.insertBefore( this[0] );
5014
			}
5015
5016
			wrap.map(function() {
5017
				var elem = this;
5018
5019
				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5020
					elem = elem.firstChild;
5021
				}
5022
5023
				return elem;
5024
			}).append(this);
5025
		}
5026
5027
		return this;
5028
	},
5029
5030
	wrapInner: function( html ) {
5031
		if ( jQuery.isFunction( html ) ) {
5032
			return this.each(function(i) {
5033
				jQuery(this).wrapInner( html.call(this, i) );
5034
			});
5035
		}
5036
5037
		return this.each(function() {
5038
			var self = jQuery( this ),
5039
				contents = self.contents();
5040
5041
			if ( contents.length ) {
5042
				contents.wrapAll( html );
5043
5044
			} else {
5045
				self.append( html );
5046
			}
5047
		});
5048
	},
5049
5050
	wrap: function( html ) {
5051
		return this.each(function() {
5052
			jQuery( this ).wrapAll( html );
5053
		});
5054
	},
5055
5056
	unwrap: function() {
5057
		return this.parent().each(function() {
5058
			if ( !jQuery.nodeName( this, "body" ) ) {
5059
				jQuery( this ).replaceWith( this.childNodes );
5060
			}
5061
		}).end();
5062
	},
5063
5064
	append: function() {
5065
		return this.domManip(arguments, true, function( elem ) {
5066
			if ( this.nodeType === 1 ) {
5067
				this.appendChild( elem );
5068
			}
5069
		});
5070
	},
5071
5072
	prepend: function() {
5073
		return this.domManip(arguments, true, function( elem ) {
5074
			if ( this.nodeType === 1 ) {
5075
				this.insertBefore( elem, this.firstChild );
5076
			}
5077
		});
5078
	},
5079
5080
	before: function() {
5081
		if ( this[0] && this[0].parentNode ) {
5082
			return this.domManip(arguments, false, function( elem ) {
5083
				this.parentNode.insertBefore( elem, this );
5084
			});
5085
		} else if ( arguments.length ) {
5086
			var set = jQuery(arguments[0]);
5087
			set.push.apply( set, this.toArray() );
5088
			return this.pushStack( set, "before", arguments );
5089
		}
5090
	},
5091
5092
	after: function() {
5093
		if ( this[0] && this[0].parentNode ) {
5094
			return this.domManip(arguments, false, function( elem ) {
5095
				this.parentNode.insertBefore( elem, this.nextSibling );
5096
			});
5097
		} else if ( arguments.length ) {
5098
			var set = this.pushStack( this, "after", arguments );
5099
			set.push.apply( set, jQuery(arguments[0]).toArray() );
5100
			return set;
5101
		}
5102
	},
5103
5104
	// keepData is for internal use only--do not document
5105 View Code Duplication
	remove: function( selector, keepData ) {
5106
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5107
			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5108
				if ( !keepData && elem.nodeType === 1 ) {
5109
					jQuery.cleanData( elem.getElementsByTagName("*") );
5110
					jQuery.cleanData( [ elem ] );
5111
				}
5112
5113
				if ( elem.parentNode ) {
5114
					 elem.parentNode.removeChild( elem );
5115
				}
5116
			}
5117
		}
5118
5119
		return this;
5120
	},
5121
5122
	empty: function() {
5123
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5124
			// Remove element nodes and prevent memory leaks
5125
			if ( elem.nodeType === 1 ) {
5126
				jQuery.cleanData( elem.getElementsByTagName("*") );
5127
			}
5128
5129
			// Remove any remaining nodes
5130
			while ( elem.firstChild ) {
5131
				elem.removeChild( elem.firstChild );
5132
			}
5133
		}
5134
5135
		return this;
5136
	},
5137
5138
	clone: function( dataAndEvents, deepDataAndEvents ) {
5139
		dataAndEvents = dataAndEvents == null ? true : dataAndEvents;
5140
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5141
5142
		return this.map( function () {
5143
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5144
		});
5145
	},
5146
5147
	html: function( value ) {
5148
		if ( value === undefined ) {
5149
			return this[0] && this[0].nodeType === 1 ?
5150
				this[0].innerHTML.replace(rinlinejQuery, "") :
5151
				null;
5152
5153
		// See if we can take a shortcut and just use innerHTML
5154
		} else if ( typeof value === "string" && !rnocache.test( value ) &&
5155
			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
5156
			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
5157
5158
			value = value.replace(rxhtmlTag, "<$1></$2>");
5159
5160
			try {
5161
				for ( var i = 0, l = this.length; i < l; i++ ) {
5162
					// Remove element nodes and prevent memory leaks
5163
					if ( this[i].nodeType === 1 ) {
5164
						jQuery.cleanData( this[i].getElementsByTagName("*") );
5165
						this[i].innerHTML = value;
5166
					}
5167
				}
5168
5169
			// If using innerHTML throws an exception, use the fallback method
5170
			} catch(e) {
5171
				this.empty().append( value );
5172
			}
5173
5174
		} else if ( jQuery.isFunction( value ) ) {
5175
			this.each(function(i){
5176
				var self = jQuery( this );
5177
5178
				self.html( value.call(this, i, self.html()) );
5179
			});
5180
5181
		} else {
5182
			this.empty().append( value );
5183
		}
5184
5185
		return this;
5186
	},
5187
5188 View Code Duplication
	replaceWith: function( value ) {
5189
		if ( this[0] && this[0].parentNode ) {
5190
			// Make sure that the elements are removed from the DOM before they are inserted
5191
			// this can help fix replacing a parent with child elements
5192
			if ( jQuery.isFunction( value ) ) {
5193
				return this.each(function(i) {
5194
					var self = jQuery(this), old = self.html();
5195
					self.replaceWith( value.call( this, i, old ) );
5196
				});
5197
			}
5198
5199
			if ( typeof value !== "string" ) {
5200
				value = jQuery( value ).detach();
5201
			}
5202
5203
			return this.each(function() {
5204
				var next = this.nextSibling,
5205
					parent = this.parentNode;
5206
5207
				jQuery( this ).remove();
5208
5209
				if ( next ) {
5210
					jQuery(next).before( value );
5211
				} else {
5212
					jQuery(parent).append( value );
5213
				}
5214
			});
5215
		} 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...
5216
			return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
5217
		}
5218
	},
5219
5220
	detach: function( selector ) {
5221
		return this.remove( selector, true );
5222
	},
5223
5224 View Code Duplication
	domManip: function( args, table, callback ) {
5225
		var results, first, fragment, parent,
5226
			value = args[0],
5227
			scripts = [];
5228
5229
		// We can't cloneNode fragments that contain checked, in WebKit
5230
		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
5231
			return this.each(function() {
5232
				jQuery(this).domManip( args, table, callback, true );
5233
			});
5234
		}
5235
5236
		if ( jQuery.isFunction(value) ) {
5237
			return this.each(function(i) {
5238
				var self = jQuery(this);
5239
				args[0] = value.call(this, i, table ? self.html() : undefined);
5240
				self.domManip( args, table, callback );
5241
			});
5242
		}
5243
5244
		if ( this[0] ) {
5245
			parent = value && value.parentNode;
5246
5247
			// If we're in a fragment, just use that instead of building a new one
5248
			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
5249
				results = { fragment: parent };
5250
5251
			} else {
5252
				results = jQuery.buildFragment( args, this, scripts );
5253
			}
5254
5255
			fragment = results.fragment;
5256
5257
			if ( fragment.childNodes.length === 1 ) {
5258
				first = fragment = fragment.firstChild;
5259
			} else {
5260
				first = fragment.firstChild;
5261
			}
5262
5263
			if ( first ) {
5264
				table = table && jQuery.nodeName( first, "tr" );
5265
5266
				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
5267
					callback.call(
5268
						table ?
5269
							root(this[i], first) :
5270
							this[i],
5271
						// Make sure that we do not leak memory by inadvertently discarding
5272
						// the original fragment (which might have attached data) instead of
5273
						// using it; in addition, use the original fragment object for the last
5274
						// item instead of first because it can end up being emptied incorrectly
5275
						// in certain situations (Bug #8070).
5276
						// Fragments from the fragment cache must always be cloned and never used
5277
						// in place.
5278
						results.cacheable || (l > 1 && i < lastIndex) ?
5279
							jQuery.clone( fragment, true, true ) :
5280
							fragment
5281
					);
5282
				}
5283
			}
5284
5285
			if ( scripts.length ) {
5286
				jQuery.each( scripts, evalScript );
5287
			}
5288
		}
5289
5290
		return this;
5291
	}
5292
});
5293
5294
function root( elem, cur ) {
5295
	return jQuery.nodeName(elem, "table") ?
5296
		(elem.getElementsByTagName("tbody")[0] ||
5297
		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
5298
		elem;
5299
}
5300
5301
function cloneCopyEvent( src, dest ) {
5302
5303
	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5304
		return;
5305
	}
5306
5307
	var internalKey = jQuery.expando,
5308
			oldData = jQuery.data( src ),
5309
			curData = jQuery.data( dest, oldData );
5310
5311
	// Switch to use the internal data object, if it exists, for the next
5312
	// stage of data copying
5313
	if ( (oldData = oldData[ internalKey ]) ) {
5314
		var events = oldData.events;
5315
				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
5316
5317
		if ( events ) {
5318
			delete curData.handle;
5319
			curData.events = {};
5320
5321
			for ( var type in events ) {
5322
				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
5323
					jQuery.event.add( dest, type, events[ type ][ i ], events[ type ][ i ].data );
5324
				}
5325
			}
5326
		}
5327
	}
5328
}
5329
5330 View Code Duplication
function cloneFixAttributes(src, dest) {
5331
	// We do not need to do anything for non-Elements
5332
	if ( dest.nodeType !== 1 ) {
5333
		return;
5334
	}
5335
5336
	var nodeName = dest.nodeName.toLowerCase();
5337
5338
	// clearAttributes removes the attributes, which we don't want,
5339
	// but also removes the attachEvent events, which we *do* want
5340
	dest.clearAttributes();
5341
5342
	// mergeAttributes, in contrast, only merges back on the
5343
	// original attributes, not the events
5344
	dest.mergeAttributes(src);
5345
5346
	// IE6-8 fail to clone children inside object elements that use
5347
	// the proprietary classid attribute value (rather than the type
5348
	// attribute) to identify the type of content to display
5349
	if ( nodeName === "object" ) {
5350
		dest.outerHTML = src.outerHTML;
5351
5352
	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
5353
		// IE6-8 fails to persist the checked state of a cloned checkbox
5354
		// or radio button. Worse, IE6-7 fail to give the cloned element
5355
		// a checked appearance if the defaultChecked value isn't also set
5356
		if ( src.checked ) {
5357
			dest.defaultChecked = dest.checked = src.checked;
5358
		}
5359
5360
		// IE6-7 get confused and end up setting the value of a cloned
5361
		// checkbox/radio button to an empty string instead of "on"
5362
		if ( dest.value !== src.value ) {
5363
			dest.value = src.value;
5364
		}
5365
5366
	// IE6-8 fails to return the selected option to the default selected
5367
	// state when cloning options
5368
	} else if ( nodeName === "option" ) {
5369
		dest.selected = src.defaultSelected;
5370
5371
	// IE6-8 fails to set the defaultValue to the correct value when
5372
	// cloning other types of input fields
5373
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5374
		dest.defaultValue = src.defaultValue;
5375
	}
5376
5377
	// Event data gets referenced instead of copied if the expando
5378
	// gets copied too
5379
	dest.removeAttribute( jQuery.expando );
5380
}
5381
5382
jQuery.buildFragment = function( args, nodes, scripts ) {
5383
	var fragment, cacheable, cacheresults,
5384
		doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
5385
5386
	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
5387
	// Cloning options loses the selected state, so don't cache them
5388
	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
5389
	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
5390
	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
5391
		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
5392
5393
		cacheable = true;
5394
		cacheresults = jQuery.fragments[ args[0] ];
5395
		if ( cacheresults ) {
5396
			if ( cacheresults !== 1 ) {
5397
				fragment = cacheresults;
5398
			}
5399
		}
5400
	}
5401
5402
	if ( !fragment ) {
5403
		fragment = doc.createDocumentFragment();
5404
		jQuery.clean( args, doc, fragment, scripts );
5405
	}
5406
5407
	if ( cacheable ) {
5408
		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
5409
	}
5410
5411
	return { fragment: fragment, cacheable: cacheable };
0 ignored issues
show
Bug introduced by
The variable cacheable does not seem to be initialized in case args.length === 1 && typ... !rchecked.test(args.0) on line 5390 is false. Are you sure this can never be the case?
Loading history...
5412
};
5413
5414
jQuery.fragments = {};
5415
5416
jQuery.each({
5417
	appendTo: "append",
5418
	prependTo: "prepend",
5419
	insertBefore: "before",
5420
	insertAfter: "after",
5421
	replaceAll: "replaceWith"
5422 View Code Duplication
}, function( name, original ) {
5423
	jQuery.fn[ name ] = function( selector ) {
5424
		var ret = [],
5425
			insert = jQuery( selector ),
5426
			parent = this.length === 1 && this[0].parentNode;
5427
5428
		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
5429
			insert[ original ]( this[0] );
5430
			return this;
5431
5432
		} 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...
5433
			for ( var i = 0, l = insert.length; i < l; i++ ) {
5434
				var elems = (i > 0 ? this.clone(true) : this).get();
5435
				jQuery( insert[i] )[ original ]( elems );
5436
				ret = ret.concat( elems );
5437
			}
5438
5439
			return this.pushStack( ret, name, insert.selector );
5440
		}
5441
	};
5442
});
5443
5444
jQuery.extend({
5445
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
5446
		var clone = elem.cloneNode(true),
5447
				srcElements,
5448
				destElements,
5449
				i;
5450
5451
		if ( !jQuery.support.noCloneEvent && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
5452
			// IE copies events bound via attachEvent when using cloneNode.
5453
			// Calling detachEvent on the clone will also remove the events
5454
			// from the original. In order to get around this, we use some
5455
			// proprietary methods to clear the events. Thanks to MooTools
5456
			// guys for this hotness.
5457
5458
			// Using Sizzle here is crazy slow, so we use getElementsByTagName
5459
			// instead
5460
			srcElements = elem.getElementsByTagName("*");
5461
			destElements = clone.getElementsByTagName("*");
5462
5463
			// Weird iteration because IE will replace the length property
5464
			// with an element if you are cloning the body and one of the
5465
			// elements on the page has a name or id of "length"
5466
			for ( i = 0; srcElements[i]; ++i ) {
5467
				cloneFixAttributes( srcElements[i], destElements[i] );
5468
			}
5469
5470
			cloneFixAttributes( elem, clone );
5471
		}
5472
5473
		// Copy the events from the original to the clone
5474
		if ( dataAndEvents ) {
5475
5476
			cloneCopyEvent( elem, clone );
5477
5478
			if ( deepDataAndEvents && "getElementsByTagName" in elem ) {
5479
5480
				srcElements = elem.getElementsByTagName("*");
5481
				destElements = clone.getElementsByTagName("*");
5482
5483
				if ( srcElements.length ) {
5484
					for ( i = 0; srcElements[i]; ++i ) {
5485
						cloneCopyEvent( srcElements[i], destElements[i] );
5486
					}
5487
				}
5488
			}
5489
		}
5490
		// Return the cloned set
5491
		return clone;
5492
  },
5493 View Code Duplication
	clean: function( elems, context, fragment, scripts ) {
5494
		context = context || document;
5495
5496
		// !context.createElement fails in IE with an error but returns typeof 'object'
5497
		if ( typeof context.createElement === "undefined" ) {
5498
			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
5499
		}
5500
5501
		var ret = [];
5502
5503
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
5504
			if ( typeof elem === "number" ) {
5505
				elem += "";
5506
			}
5507
5508
			if ( !elem ) {
5509
				continue;
5510
			}
5511
5512
			// Convert html string into DOM nodes
5513
			if ( typeof elem === "string" && !rhtml.test( elem ) ) {
5514
				elem = context.createTextNode( elem );
5515
5516
			} else if ( typeof elem === "string" ) {
5517
				// Fix "XHTML"-style tags in all browsers
5518
				elem = elem.replace(rxhtmlTag, "<$1></$2>");
5519
5520
				// Trim whitespace, otherwise indexOf won't work as expected
5521
				var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
5522
					wrap = wrapMap[ tag ] || wrapMap._default,
5523
					depth = wrap[0],
5524
					div = context.createElement("div");
5525
5526
				// Go to html and back, then peel off extra wrappers
5527
				div.innerHTML = wrap[1] + elem + wrap[2];
5528
5529
				// Move to the right depth
5530
				while ( depth-- ) {
5531
					div = div.lastChild;
5532
				}
5533
5534
				// Remove IE's autoinserted <tbody> from table fragments
5535
				if ( !jQuery.support.tbody ) {
5536
5537
					// String was a <table>, *may* have spurious <tbody>
5538
					var hasBody = rtbody.test(elem),
5539
						tbody = tag === "table" && !hasBody ?
5540
							div.firstChild && div.firstChild.childNodes :
5541
5542
							// String was a bare <thead> or <tfoot>
5543
							wrap[1] === "<table>" && !hasBody ?
5544
								div.childNodes :
5545
								[];
5546
5547
					for ( var j = tbody.length - 1; j >= 0 ; --j ) {
5548
						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
5549
							tbody[ j ].parentNode.removeChild( tbody[ j ] );
5550
						}
5551
					}
5552
5553
				}
5554
5555
				// IE completely kills leading whitespace when innerHTML is used
5556
				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
5557
					div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
5558
				}
5559
5560
				elem = div.childNodes;
5561
			}
5562
5563
			if ( elem.nodeType ) {
5564
				ret.push( elem );
5565
			} else {
5566
				ret = jQuery.merge( ret, elem );
5567
			}
5568
		}
5569
5570
		if ( fragment ) {
5571
			for ( i = 0; ret[i]; i++ ) {
5572
				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
5573
					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
5574
5575
				} else {
5576
					if ( ret[i].nodeType === 1 ) {
5577
						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
5578
					}
5579
					fragment.appendChild( ret[i] );
5580
				}
5581
			}
5582
		}
5583
5584
		return ret;
5585
	},
5586
5587 View Code Duplication
	cleanData: function( elems ) {
5588
		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
5589
			deleteExpando = jQuery.support.deleteExpando;
5590
5591
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
5592
			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
5593
				continue;
5594
			}
5595
5596
			id = elem[ jQuery.expando ];
5597
5598
			if ( id ) {
5599
				data = cache[ id ] && cache[ id ][ internalKey ];
5600
5601
				if ( data && data.events ) {
5602
					for ( var type in data.events ) {
5603
						if ( special[ type ] ) {
5604
							jQuery.event.remove( elem, type );
5605
5606
						// This is a shortcut to avoid jQuery.event.remove's overhead
5607
						} else {
5608
							jQuery.removeEvent( elem, type, data.handle );
5609
						}
5610
					}
5611
5612
					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
5613
					if ( data.handle ) {
5614
						data.handle.elem = null;
5615
					}
5616
				}
5617
5618
				if ( deleteExpando ) {
5619
					delete elem[ jQuery.expando ];
5620
5621
				} else if ( elem.removeAttribute ) {
5622
					elem.removeAttribute( jQuery.expando );
5623
				}
5624
5625
				delete cache[ id ];
5626
			}
5627
		}
5628
	}
5629
});
5630
5631
function evalScript( i, elem ) {
5632
	if ( elem.src ) {
5633
		jQuery.ajax({
5634
			url: elem.src,
5635
			async: false,
5636
			dataType: "script"
5637
		});
5638
	} else {
5639
		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
5640
	}
5641
5642
	if ( elem.parentNode ) {
5643
		elem.parentNode.removeChild( elem );
5644
	}
5645
}
5646
5647
5648
5649
5650
var ralpha = /alpha\([^)]*\)/i,
5651
	ropacity = /opacity=([^)]*)/,
5652
	rdashAlpha = /-([a-z])/ig,
5653
	rupper = /([A-Z])/g,
5654
	rnumpx = /^-?\d+(?:px)?$/i,
5655
	rnum = /^-?\d/,
5656
5657
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
5658
	cssWidth = [ "Left", "Right" ],
5659
	cssHeight = [ "Top", "Bottom" ],
5660
	curCSS,
5661
5662
	getComputedStyle,
5663
	currentStyle,
5664
5665
	fcamelCase = function( all, letter ) {
5666
		return letter.toUpperCase();
5667
	};
5668
5669
jQuery.fn.css = function( name, value ) {
5670
	// Setting 'undefined' is a no-op
5671
	if ( arguments.length === 2 && value === undefined ) {
5672
		return this;
5673
	}
5674
5675
	return jQuery.access( this, name, value, true, function( elem, name, value ) {
5676
		return value !== undefined ?
5677
			jQuery.style( elem, name, value ) :
5678
			jQuery.css( elem, name );
5679
	});
5680
};
5681
5682
jQuery.extend({
5683
	// Add in style property hooks for overriding the default
5684
	// behavior of getting and setting a style property
5685
	cssHooks: {
5686
		opacity: {
5687
			get: function( elem, computed ) {
5688
				if ( computed ) {
5689
					// We should always get a number back from opacity
5690
					var ret = curCSS( elem, "opacity", "opacity" );
5691
					return ret === "" ? "1" : ret;
5692
5693
				} 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...
5694
					return elem.style.opacity;
5695
				}
5696
			}
5697
		}
5698
	},
5699
5700
	// Exclude the following css properties to add px
5701
	cssNumber: {
5702
		"zIndex": true,
5703
		"fontWeight": true,
5704
		"opacity": true,
5705
		"zoom": true,
5706
		"lineHeight": true
5707
	},
5708
5709
	// Add in properties whose names you wish to fix before
5710
	// setting or getting the value
5711
	cssProps: {
5712
		// normalize float css property
5713
		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
5714
	},
5715
5716
	// Get and set the style property on a DOM Node
5717
	style: function( elem, name, value, extra ) {
5718
		// Don't set styles on text and comment nodes
5719
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
5720
			return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
5721
		}
5722
5723
		// Make sure that we're working with the right name
5724
		var ret, origName = jQuery.camelCase( name ),
5725
			style = elem.style, hooks = jQuery.cssHooks[ origName ];
5726
5727
		name = jQuery.cssProps[ origName ] || origName;
5728
5729
		// Check if we're setting a value
5730
		if ( value !== undefined ) {
5731
			// Make sure that NaN and null values aren't set. See: #7116
5732
			if ( typeof value === "number" && isNaN( value ) || value == null ) {
5733
				return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
5734
			}
5735
5736
			// If a number was passed in, add 'px' to the (except for certain CSS properties)
5737
			if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
5738
				value += "px";
5739
			}
5740
5741
			// If a hook was provided, use that value, otherwise just set the specified value
5742
			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
5743
				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
5744
				// Fixes bug #5509
5745
				try {
5746
					style[ name ] = value;
5747
				} 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...
5748
			}
5749
5750
		} else {
5751
			// If a hook was provided get the non-computed value from there
5752
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
5753
				return ret;
5754
			}
5755
5756
			// Otherwise just get the value from the style object
5757
			return style[ name ];
5758
		}
5759
	},
5760
5761
	css: function( elem, name, extra ) {
5762
		// Make sure that we're working with the right name
5763
		var ret, origName = jQuery.camelCase( name ),
5764
			hooks = jQuery.cssHooks[ origName ];
5765
5766
		name = jQuery.cssProps[ origName ] || origName;
5767
5768
		// If a hook was provided get the computed value from there
5769
		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
5770
			return ret;
5771
5772
		// Otherwise, if a way to get the computed value exists, use that
5773
		} else if ( curCSS ) {
5774
			return curCSS( elem, name, origName );
5775
		}
5776
	},
5777
5778
	// A method for quickly swapping in/out CSS properties to get correct calculations
5779
	swap: function( elem, options, callback ) {
5780
		var old = {};
5781
5782
		// Remember the old values, and insert the new ones
5783
		for ( var name in options ) {
5784
			old[ name ] = elem.style[ name ];
5785
			elem.style[ name ] = options[ name ];
5786
		}
5787
5788
		callback.call( elem );
5789
5790
		// Revert the old values
5791
		for ( name in options ) {
5792
			elem.style[ name ] = old[ name ];
5793
		}
5794
	},
5795
5796
	camelCase: function( string ) {
5797
		return string.replace( rdashAlpha, fcamelCase );
5798
	}
5799
});
5800
5801
// DEPRECATED, Use jQuery.css() instead
5802
jQuery.curCSS = jQuery.css;
5803
5804
jQuery.each(["height", "width"], function( i, name ) {
5805
	jQuery.cssHooks[ name ] = {
5806
		get: function( elem, computed, extra ) {
5807
			var val;
5808
5809
			if ( computed ) {
5810
				if ( elem.offsetWidth !== 0 ) {
5811
					val = getWH( elem, name, extra );
5812
5813
				} else {
5814
					jQuery.swap( elem, cssShow, function() {
5815
						val = getWH( elem, name, extra );
5816
					});
5817
				}
5818
5819
				if ( val <= 0 ) {
5820
					val = curCSS( elem, name, name );
5821
5822
					if ( val === "0px" && currentStyle ) {
5823
						val = currentStyle( elem, name, name );
5824
					}
5825
5826
					if ( val != null ) {
5827
						// Should return "auto" instead of 0, use 0 for
5828
						// temporary backwards-compat
5829
						return val === "" || val === "auto" ? "0px" : val;
5830
					}
5831
				}
5832
5833
				if ( val < 0 || val == null ) {
5834
					val = elem.style[ name ];
5835
5836
					// Should return "auto" instead of 0, use 0 for
5837
					// temporary backwards-compat
5838
					return val === "" || val === "auto" ? "0px" : val;
5839
				}
5840
5841
				return typeof val === "string" ? val : val + "px";
5842
			}
5843
		},
5844
5845
		set: function( elem, value ) {
5846
			if ( rnumpx.test( value ) ) {
5847
				// ignore negative width and height values #1599
5848
				value = parseFloat(value);
5849
5850
				if ( value >= 0 ) {
5851
					return value + "px";
5852
				}
5853
5854
			} else {
5855
				return value;
5856
			}
5857
		}
5858
	};
5859
});
5860
5861
if ( !jQuery.support.opacity ) {
5862
	jQuery.cssHooks.opacity = {
5863
		get: function( elem, computed ) {
5864
			// IE uses filters for opacity
5865
			return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
5866
				(parseFloat(RegExp.$1) / 100) + "" :
5867
				computed ? "1" : "";
5868
		},
5869
5870
		set: function( elem, value ) {
5871
			var style = elem.style;
5872
5873
			// IE has trouble with opacity if it does not have layout
5874
			// Force it by setting the zoom level
5875
			style.zoom = 1;
5876
5877
			// Set the alpha filter to set the opacity
5878
			var opacity = jQuery.isNaN(value) ?
5879
				"" :
5880
				"alpha(opacity=" + value * 100 + ")",
5881
				filter = style.filter || "";
5882
5883
			style.filter = ralpha.test(filter) ?
5884
				filter.replace(ralpha, opacity) :
5885
				style.filter + ' ' + opacity;
5886
		}
5887
	};
5888
}
5889
5890 View Code Duplication
if ( document.defaultView && document.defaultView.getComputedStyle ) {
5891
	getComputedStyle = function( elem, newName, name ) {
5892
		var ret, defaultView, computedStyle;
5893
5894
		name = name.replace( rupper, "-$1" ).toLowerCase();
5895
5896
		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
5897
			return undefined;
5898
		}
5899
5900
		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
5901
			ret = computedStyle.getPropertyValue( name );
5902
			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
5903
				ret = jQuery.style( elem, name );
5904
			}
5905
		}
5906
5907
		return ret;
0 ignored issues
show
Bug introduced by
The variable ret does not seem to be initialized in case computedStyle = defaultV...mputedStyle(elem, null) on line 5900 is false. Are you sure this can never be the case?
Loading history...
5908
	};
5909
}
5910
5911 View Code Duplication
if ( document.documentElement.currentStyle ) {
5912
	currentStyle = function( elem, name ) {
5913
		var left, 
5914
			ret = elem.currentStyle && elem.currentStyle[ name ],
5915
			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
5916
			style = elem.style;
5917
5918
		// From the awesome hack by Dean Edwards
5919
		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
5920
5921
		// If we're not dealing with a regular pixel number
5922
		// but a number that has a weird ending, we need to convert it to pixels
5923
		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
5924
			// Remember the original values
5925
			left = style.left;
5926
5927
			// Put in the new values to get a computed value out
5928
			if ( rsLeft ) {
5929
				elem.runtimeStyle.left = elem.currentStyle.left;
5930
			}
5931
			style.left = name === "fontSize" ? "1em" : (ret || 0);
5932
			ret = style.pixelLeft + "px";
5933
5934
			// Revert the changed values
5935
			style.left = left;
5936
			if ( rsLeft ) {
5937
				elem.runtimeStyle.left = rsLeft;
5938
			}
5939
		}
5940
5941
		return ret === "" ? "auto" : ret;
5942
	};
5943
}
5944
5945
curCSS = getComputedStyle || currentStyle;
5946
5947
function getWH( elem, name, extra ) {
5948
	var which = name === "width" ? cssWidth : cssHeight,
5949
		val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
5950
5951
	if ( extra === "border" ) {
5952
		return val;
5953
	}
5954
5955
	jQuery.each( which, function() {
5956
		if ( !extra ) {
5957
			val -= parseFloat(jQuery.css( elem, "padding" + this )) || 0;
5958
		}
5959
5960
		if ( extra === "margin" ) {
5961
			val += parseFloat(jQuery.css( elem, "margin" + this )) || 0;
5962
5963
		} else {
5964
			val -= parseFloat(jQuery.css( elem, "border" + this + "Width" )) || 0;
5965
		}
5966
	});
5967
5968
	return val;
5969
}
5970
5971 View Code Duplication
if ( jQuery.expr && jQuery.expr.filters ) {
5972
	jQuery.expr.filters.hidden = function( elem ) {
5973
		var width = elem.offsetWidth,
5974
			height = elem.offsetHeight;
5975
5976
		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
5977
	};
5978
5979
	jQuery.expr.filters.visible = function( elem ) {
5980
		return !jQuery.expr.filters.hidden( elem );
5981
	};
5982
}
5983
5984
5985
5986
5987
var r20 = /%20/g,
5988
	rbracket = /\[\]$/,
5989
	rCRLF = /\r?\n/g,
5990
	rhash = /#.*$/,
5991
	rheaders = /^(.*?):\s*(.*?)\r?$/mg, // IE leaves an \r character at EOL
5992
	rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
5993
	rnoContent = /^(?:GET|HEAD)$/,
5994
	rprotocol = /^\/\//,
5995
	rquery = /\?/,
5996
	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
5997
	rselectTextarea = /^(?:select|textarea)/i,
5998
	rspacesAjax = /\s+/,
5999
	rts = /([?&])_=[^&]*/,
6000
	rurl = /^(\w+:)\/\/([^\/?#:]+)(?::(\d+))?/,
6001
6002
	// Keep a copy of the old load method
6003
	_load = jQuery.fn.load,
6004
6005
	/* Prefilters
6006
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6007
	 * 2) These are called:
6008
	 *    - BEFORE asking for a transport
6009
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
6010
	 * 3) key is the dataType
6011
	 * 4) the catchall symbol "*" can be used
6012
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6013
	 */
6014
	prefilters = {},
6015
6016
	/* Transports bindings
6017
	 * 1) key is the dataType
6018
	 * 2) the catchall symbol "*" can be used
6019
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
6020
	 */
6021
	transports = {};
6022
6023
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
6024 View Code Duplication
function addToPrefiltersOrTransports( structure ) {
6025
6026
	// dataTypeExpression is optional and defaults to "*"
6027
	return function( dataTypeExpression, func ) {
6028
6029
		if ( typeof dataTypeExpression !== "string" ) {
6030
			func = dataTypeExpression;
6031
			dataTypeExpression = "*";
6032
		}
6033
6034
		if ( jQuery.isFunction( func ) ) {
6035
			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
6036
				i = 0,
6037
				length = dataTypes.length,
6038
				dataType,
6039
				list,
6040
				placeBefore;
6041
6042
			// For each dataType in the dataTypeExpression
6043
			for(; i < length; i++ ) {
6044
				dataType = dataTypes[ i ];
6045
				// We control if we're asked to add before
6046
				// any existing element
6047
				placeBefore = /^\+/.test( dataType );
6048
				if ( placeBefore ) {
6049
					dataType = dataType.substr( 1 ) || "*";
6050
				}
6051
				list = structure[ dataType ] = structure[ dataType ] || [];
6052
				// then we add to the structure accordingly
6053
				list[ placeBefore ? "unshift" : "push" ]( func );
6054
			}
6055
		}
6056
	};
6057
}
6058
6059
//Base inspection function for prefilters and transports
6060 View Code Duplication
function inspectPrefiltersOrTransports( structure, options, originalOptions, jXHR,
6061
		dataType /* internal */, inspected /* internal */ ) {
6062
6063
	dataType = dataType || options.dataTypes[ 0 ];
6064
	inspected = inspected || {};
6065
6066
	inspected[ dataType ] = true;
6067
6068
	var list = structure[ dataType ],
6069
		i = 0,
6070
		length = list ? list.length : 0,
6071
		executeOnly = ( structure === prefilters ),
6072
		selection;
6073
6074
	for(; i < length && ( executeOnly || !selection ); i++ ) {
6075
		selection = list[ i ]( options, originalOptions, jXHR );
6076
		// If we got redirected to another dataType
6077
		// we try there if not done already
6078
		if ( typeof selection === "string" ) {
6079
			if ( inspected[ selection ] ) {
6080
				selection = undefined;
6081
			} else {
6082
				options.dataTypes.unshift( selection );
6083
				selection = inspectPrefiltersOrTransports(
6084
						structure, options, originalOptions, jXHR, selection, inspected );
6085
			}
6086
		}
6087
	}
6088
	// If we're only executing or nothing was selected
6089
	// we try the catchall dataType if not done already
6090
	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
6091
		selection = inspectPrefiltersOrTransports(
6092
				structure, options, originalOptions, jXHR, "*", inspected );
6093
	}
6094
	// unnecessary when only executing (prefilters)
6095
	// but it'll be ignored by the caller in that case
6096
	return selection;
6097
}
6098
6099
jQuery.fn.extend({
6100 View Code Duplication
	load: function( url, params, callback ) {
6101
		if ( typeof url !== "string" && _load ) {
6102
			return _load.apply( this, arguments );
6103
6104
		// Don't do a request if no elements are being requested
6105
		} else if ( !this.length ) {
6106
			return this;
6107
		}
6108
6109
		var off = url.indexOf( " " );
6110
		if ( off >= 0 ) {
6111
			var selector = url.slice( off, url.length );
6112
			url = url.slice( 0, off );
6113
		}
6114
6115
		// Default to a GET request
6116
		var type = "GET";
6117
6118
		// If the second parameter was provided
6119
		if ( params ) {
6120
			// If it's a function
6121
			if ( jQuery.isFunction( params ) ) {
6122
				// We assume that it's the callback
6123
				callback = params;
6124
				params = null;
6125
6126
			// Otherwise, build a param string
6127
			} else if ( typeof params === "object" ) {
6128
				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
6129
				type = "POST";
6130
			}
6131
		}
6132
6133
		var self = this;
6134
6135
		// Request the remote document
6136
		jQuery.ajax({
6137
			url: url,
6138
			type: type,
6139
			dataType: "html",
6140
			data: params,
6141
			// Complete callback (responseText is used internally)
6142
			complete: function( jXHR, status, responseText ) {
6143
				// Store the response as specified by the jXHR object
6144
				responseText = jXHR.responseText;
6145
				// If successful, inject the HTML into all the matched elements
6146
				if ( jXHR.isResolved() ) {
6147
					// #4825: Get the actual response in case
6148
					// a dataFilter is present in ajaxSettings
6149
					jXHR.done(function( r ) {
6150
						responseText = r;
6151
					});
6152
					// See if a selector was specified
6153
					self.html( selector ?
6154
						// Create a dummy div to hold the results
6155
						jQuery("<div>")
6156
							// inject the contents of the document in, removing the scripts
6157
							// to avoid any 'Permission Denied' errors in IE
6158
							.append(responseText.replace(rscript, ""))
6159
6160
							// Locate the specified elements
6161
							.find(selector) :
6162
6163
						// If not, just inject the full result
6164
						responseText );
6165
				}
6166
6167
				if ( callback ) {
6168
					self.each( callback, [ responseText, status, jXHR ] );
6169
				}
6170
			}
6171
		});
6172
6173
		return this;
6174
	},
6175
6176
	serialize: function() {
6177
		return jQuery.param( this.serializeArray() );
6178
	},
6179
6180 View Code Duplication
	serializeArray: function() {
6181
		return this.map(function(){
6182
			return this.elements ? jQuery.makeArray( this.elements ) : this;
6183
		})
6184
		.filter(function(){
6185
			return this.name && !this.disabled &&
6186
				( this.checked || rselectTextarea.test( this.nodeName ) ||
6187
					rinput.test( this.type ) );
6188
		})
6189
		.map(function( i, elem ){
6190
			var val = jQuery( this ).val();
6191
6192
			return val == null ?
6193
				null :
6194
				jQuery.isArray( val ) ?
6195
					jQuery.map( val, function( val, i ){
6196
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6197
					}) :
6198
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6199
		}).get();
6200
	}
6201
});
6202
6203
// Attach a bunch of functions for handling common AJAX events
6204
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
6205
	jQuery.fn[ o ] = function( f ){
6206
		return this.bind( o, f );
6207
	};
6208
} );
6209
6210
jQuery.each( [ "get", "post" ], function( i, method ) {
6211
	jQuery[ method ] = function( url, data, callback, type ) {
6212
		// shift arguments if data argument was omitted
6213
		if ( jQuery.isFunction( data ) ) {
6214
			type = type || callback;
6215
			callback = data;
6216
			data = null;
6217
		}
6218
6219
		return jQuery.ajax({
6220
			type: method,
6221
			url: url,
6222
			data: data,
6223
			success: callback,
6224
			dataType: type
6225
		});
6226
	};
6227
} );
6228
6229
jQuery.extend({
6230
6231
	getScript: function( url, callback ) {
6232
		return jQuery.get( url, null, callback, "script" );
6233
	},
6234
6235
	getJSON: function( url, data, callback ) {
6236
		return jQuery.get( url, data, callback, "json" );
6237
	},
6238
6239
	ajaxSetup: function( settings ) {
6240
		jQuery.extend( true, jQuery.ajaxSettings, settings );
6241
		if ( settings.context ) {
6242
			jQuery.ajaxSettings.context = settings.context;
6243
		}
6244
	},
6245
6246
	ajaxSettings: {
6247
		url: location.href,
6248
		global: true,
6249
		type: "GET",
6250
		contentType: "application/x-www-form-urlencoded",
6251
		processData: true,
6252
		async: true,
6253
		/*
6254
		timeout: 0,
6255
		data: null,
6256
		dataType: null,
6257
		username: null,
6258
		password: null,
6259
		cache: null,
6260
		traditional: false,
6261
		headers: {},
6262
		crossDomain: null,
6263
		*/
6264
6265
		accepts: {
6266
			xml: "application/xml, text/xml",
6267
			html: "text/html",
6268
			text: "text/plain",
6269
			json: "application/json, text/javascript",
6270
			"*": "*/*"
6271
		},
6272
6273
		contents: {
6274
			xml: /xml/,
6275
			html: /html/,
6276
			json: /json/
6277
		},
6278
6279
		responseFields: {
6280
			xml: "responseXML",
6281
			text: "responseText"
6282
		},
6283
6284
		// List of data converters
6285
		// 1) key format is "source_type destination_type" (a single space in-between)
6286
		// 2) the catchall symbol "*" can be used for source_type
6287
		converters: {
6288
6289
			// Convert anything to text
6290
			"* text": window.String,
6291
6292
			// Text to html (true = no transformation)
6293
			"text html": true,
6294
6295
			// Evaluate text as a json expression
6296
			"text json": jQuery.parseJSON,
6297
6298
			// Parse text as xml
6299
			"text xml": jQuery.parseXML
6300
		}
6301
	},
6302
6303
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
6304
	ajaxTransport: addToPrefiltersOrTransports( transports ),
6305
6306
	// Main method
6307 View Code Duplication
	ajax: function( url, options ) {
6308
6309
		// If options is not an object,
6310
		// we simulate pre-1.5 signature
6311
		if ( typeof options !== "object" ) {
6312
			options = url;
6313
			url = undefined;
6314
		}
6315
6316
		// Force options to be an object
6317
		options = options || {};
6318
6319
		var // Create the final options object
6320
			s = jQuery.extend( true, {}, jQuery.ajaxSettings, options ),
6321
			// Callbacks contexts
6322
			// We force the original context if it exists
6323
			// or take it from jQuery.ajaxSettings otherwise
6324
			// (plain objects used as context get extended)
6325
			callbackContext =
6326
				( s.context = ( "context" in options ? options : jQuery.ajaxSettings ).context ) || s,
6327
			globalEventContext = callbackContext === s ? jQuery.event : jQuery( callbackContext ),
6328
			// Deferreds
6329
			deferred = jQuery.Deferred(),
6330
			completeDeferred = jQuery._Deferred(),
6331
			// Status-dependent callbacks
6332
			statusCode = s.statusCode || {},
6333
			// Headers (they are sent all at once)
6334
			requestHeaders = {},
6335
			// Response headers
6336
			responseHeadersString,
6337
			responseHeaders,
6338
			// transport
6339
			transport,
6340
			// timeout handle
6341
			timeoutTimer,
6342
			// Cross-domain detection vars
6343
			loc = document.location,
6344
			protocol = loc.protocol || "http:",
6345
			parts,
6346
			// The jXHR state
6347
			state = 0,
6348
			// Loop variable
6349
			i,
6350
			// Fake xhr
6351
			jXHR = {
6352
6353
				readyState: 0,
6354
6355
				// Caches the header
6356
				setRequestHeader: function( name, value ) {
6357
					if ( state === 0 ) {
6358
						requestHeaders[ name.toLowerCase() ] = value;
6359
					}
6360
					return this;
6361
				},
6362
6363
				// Raw string
6364
				getAllResponseHeaders: function() {
6365
					return state === 2 ? responseHeadersString : null;
6366
				},
6367
6368
				// Builds headers hashtable if needed
6369
				getResponseHeader: function( key ) {
6370
					var match;
6371
					if ( state === 2 ) {
6372
						if ( !responseHeaders ) {
6373
							responseHeaders = {};
6374
							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
6375
								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
6376
							}
6377
						}
6378
						match = responseHeaders[ key.toLowerCase() ];
6379
					}
6380
					return match || null;
6381
				},
6382
6383
				// Cancel the request
6384
				abort: function( statusText ) {
6385
					statusText = statusText || "abort";
6386
					if ( transport ) {
6387
						transport.abort( statusText );
6388
					}
6389
					done( 0, statusText );
6390
					return this;
6391
				}
6392
			};
6393
6394
		// Callback for when everything is done
6395
		// It is defined here because jslint complains if it is declared
6396
		// at the end of the function (which would be more logical and readable)
6397
		function done( status, statusText, responses, headers) {
6398
6399
			// Called once
6400
			if ( state === 2 ) {
6401
				return;
6402
			}
6403
6404
			// State is "done" now
6405
			state = 2;
6406
6407
			// Clear timeout if it exists
6408
			if ( timeoutTimer ) {
6409
				clearTimeout( timeoutTimer );
6410
			}
6411
6412
			// Dereference transport for early garbage collection
6413
			// (no matter how long the jXHR object will be used)
6414
			transport = undefined;
6415
6416
			// Cache response headers
6417
			responseHeadersString = headers || "";
6418
6419
			// Set readyState
6420
			jXHR.readyState = status ? 4 : 0;
6421
6422
			var isSuccess,
6423
				success,
6424
				error,
6425
				response = responses ? ajaxHandleResponses( s, jXHR, responses ) : undefined,
6426
				lastModified,
6427
				etag;
6428
6429
			// If successful, handle type chaining
6430
			if ( status >= 200 && status < 300 || status === 304 ) {
6431
6432
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
6433
				if ( s.ifModified ) {
6434
6435
					if ( ( lastModified = jXHR.getResponseHeader( "Last-Modified" ) ) ) {
6436
						jQuery.lastModified[ s.url ] = lastModified;
6437
					}
6438
					if ( ( etag = jXHR.getResponseHeader( "Etag" ) ) ) {
6439
						jQuery.etag[ s.url ] = etag;
6440
					}
6441
				}
6442
6443
				// If not modified
6444
				if ( status === 304 ) {
6445
6446
					statusText = "notmodified";
6447
					isSuccess = true;
6448
6449
				// If we have data
6450
				} else {
6451
6452
					try {
6453
						success = ajaxConvert( s, response );
6454
						statusText = "success";
6455
						isSuccess = true;
6456
					} catch(e) {
6457
						// We have a parsererror
6458
						statusText = "parsererror";
6459
						error = e;
6460
					}
6461
				}
6462
			} else {
6463
				// We extract error from statusText
6464
				// then normalize statusText and status for non-aborts
6465
				error = statusText;
6466
				if( status ) {
6467
					statusText = "error";
6468
					if ( status < 0 ) {
6469
						status = 0;
6470
					}
6471
				}
6472
			}
6473
6474
			// Set data for the fake xhr object
6475
			jXHR.status = status;
6476
			jXHR.statusText = statusText;
6477
6478
			// Success/Error
6479
			if ( isSuccess ) {
6480
				deferred.resolveWith( callbackContext, [ success, statusText, jXHR ] );
6481
			} else {
6482
				deferred.rejectWith( callbackContext, [ jXHR, statusText, error ] );
6483
			}
6484
6485
			// Status-dependent callbacks
6486
			jXHR.statusCode( statusCode );
6487
			statusCode = undefined;
6488
6489
			if ( s.global ) {
6490
				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
6491
						[ jXHR, s, isSuccess ? success : error ] );
6492
			}
6493
6494
			// Complete
6495
			completeDeferred.resolveWith( callbackContext, [ jXHR, statusText ] );
6496
6497
			if ( s.global ) {
6498
				globalEventContext.trigger( "ajaxComplete", [ jXHR, s] );
6499
				// Handle the global AJAX counter
6500
				if ( !( --jQuery.active ) ) {
6501
					jQuery.event.trigger( "ajaxStop" );
6502
				}
6503
			}
6504
		}
6505
6506
		// Attach deferreds
6507
		deferred.promise( jXHR );
6508
		jXHR.success = jXHR.done;
6509
		jXHR.error = jXHR.fail;
6510
		jXHR.complete = completeDeferred.done;
6511
6512
		// Status-dependent callbacks
6513
		jXHR.statusCode = function( map ) {
6514
			if ( map ) {
6515
				var tmp;
6516
				if ( state < 2 ) {
6517
					for( tmp in map ) {
6518
						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
6519
					}
6520
				} else {
6521
					tmp = map[ jXHR.status ];
6522
					jXHR.then( tmp, tmp );
6523
				}
6524
			}
6525
			return this;
6526
		};
6527
6528
		// Remove hash character (#7531: and string promotion)
6529
		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
6530
		// We also use the url parameter if available
6531
		s.url = ( "" + ( url || s.url ) ).replace( rhash, "" ).replace( rprotocol, protocol + "//" );
6532
6533
		// Extract dataTypes list
6534
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
6535
6536
		// Determine if a cross-domain request is in order
6537
		if ( !s.crossDomain ) {
6538
			parts = rurl.exec( s.url.toLowerCase() );
6539
			s.crossDomain = !!( parts &&
6540
				( parts[ 1 ] != protocol || parts[ 2 ] != loc.hostname ||
6541
					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
6542
						( loc.port || ( protocol === "http:" ? 80 : 443 ) ) )
6543
			);
6544
		}
6545
6546
		// Convert data if not already a string
6547
		if ( s.data && s.processData && typeof s.data !== "string" ) {
6548
			s.data = jQuery.param( s.data, s.traditional );
6549
		}
6550
6551
		// Apply prefilters
6552
		inspectPrefiltersOrTransports( prefilters, s, options, jXHR );
6553
6554
		// Uppercase the type
6555
		s.type = s.type.toUpperCase();
6556
6557
		// Determine if request has content
6558
		s.hasContent = !rnoContent.test( s.type );
6559
6560
		// Watch for a new set of requests
6561
		if ( s.global && jQuery.active++ === 0 ) {
6562
			jQuery.event.trigger( "ajaxStart" );
6563
		}
6564
6565
		// More options handling for requests with no content
6566
		if ( !s.hasContent ) {
6567
6568
			// If data is available, append data to url
6569
			if ( s.data ) {
6570
				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
6571
			}
6572
6573
			// Add anti-cache in url if needed
6574
			if ( s.cache === false ) {
6575
6576
				var ts = jQuery.now(),
6577
					// try replacing _= if it is there
6578
					ret = s.url.replace( rts, "$1_=" + ts );
6579
6580
				// if nothing was replaced, add timestamp to the end
6581
				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
6582
			}
6583
		}
6584
6585
		// Set the correct header, if data is being sent
6586
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
6587
			requestHeaders[ "content-type" ] = s.contentType;
6588
		}
6589
6590
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
6591
		if ( s.ifModified ) {
6592
			if ( jQuery.lastModified[ s.url ] ) {
6593
				requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ s.url ];
6594
			}
6595
			if ( jQuery.etag[ s.url ] ) {
6596
				requestHeaders[ "if-none-match" ] = jQuery.etag[ s.url ];
6597
			}
6598
		}
6599
6600
		// Set the Accepts header for the server, depending on the dataType
6601
		requestHeaders.accept = s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
6602
			s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
6603
			s.accepts[ "*" ];
6604
6605
		// Check for headers option
6606
		for ( i in s.headers ) {
6607
			requestHeaders[ i.toLowerCase() ] = s.headers[ i ];
6608
		}
6609
6610
		// Allow custom headers/mimetypes and early abort
6611
		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jXHR, s ) === false || state === 2 ) ) {
6612
				// Abort if not done already
6613
				done( 0, "abort" );
6614
				// Return false
6615
				jXHR = false;
6616
6617
		} else {
6618
6619
			// Install callbacks on deferreds
6620
			for ( i in { success: 1, error: 1, complete: 1 } ) {
6621
				jXHR[ i ]( s[ i ] );
6622
			}
6623
6624
			// Get transport
6625
			transport = inspectPrefiltersOrTransports( transports, s, options, jXHR );
6626
6627
			// If no transport, we auto-abort
6628
			if ( !transport ) {
6629
				done( -1, "No Transport" );
6630
			} else {
6631
				// Set state as sending
6632
				state = jXHR.readyState = 1;
6633
				// Send global event
6634
				if ( s.global ) {
6635
					globalEventContext.trigger( "ajaxSend", [ jXHR, s ] );
6636
				}
6637
				// Timeout
6638
				if ( s.async && s.timeout > 0 ) {
6639
					timeoutTimer = setTimeout( function(){
6640
						jXHR.abort( "timeout" );
6641
					}, s.timeout );
6642
				}
6643
6644
				try {
6645
					transport.send( requestHeaders, done );
6646
				} catch (e) {
6647
					// Propagate exception as error if not done
6648
					if ( status < 2 ) {
6649
						done( -1, e );
6650
					// Simply rethrow otherwise
6651
					} else {
6652
						jQuery.error( e );
6653
					}
6654
				}
6655
			}
6656
		}
6657
		return jXHR;
6658
	},
6659
6660
	// Serialize an array of form elements or a set of
6661
	// key/values into a query string
6662 View Code Duplication
	param: function( a, traditional ) {
6663
		var s = [],
6664
			add = function( key, value ) {
6665
				// If value is a function, invoke it and return its value
6666
				value = jQuery.isFunction( value ) ? value() : value;
6667
				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
6668
			};
6669
6670
		// Set traditional to true for jQuery <= 1.3.2 behavior.
6671
		if ( traditional === undefined ) {
6672
			traditional = jQuery.ajaxSettings.traditional;
6673
		}
6674
6675
		// If an array was passed in, assume that it is an array of form elements.
6676
		if ( jQuery.isArray( a ) || a.jquery ) {
6677
			// Serialize the form elements
6678
			jQuery.each( a, function() {
6679
				add( this.name, this.value );
6680
			} );
6681
6682
		} else {
6683
			// If traditional, encode the "old" way (the way 1.3.2 or older
6684
			// did it), otherwise encode params recursively.
6685
			for ( var prefix in a ) {
6686
				buildParams( prefix, a[ prefix ], traditional, add );
6687
			}
6688
		}
6689
6690
		// Return the resulting serialization
6691
		return s.join( "&" ).replace( r20, "+" );
6692
	}
6693
});
6694
6695
function buildParams( prefix, obj, traditional, add ) {
6696
	if ( jQuery.isArray( obj ) && obj.length ) {
6697
		// Serialize array item.
6698
		jQuery.each( obj, function( i, v ) {
6699
			if ( traditional || rbracket.test( prefix ) ) {
6700
				// Treat each array item as a scalar.
6701
				add( prefix, v );
6702
6703
			} else {
6704
				// If array item is non-scalar (array or object), encode its
6705
				// numeric index to resolve deserialization ambiguity issues.
6706
				// Note that rack (as of 1.0.0) can't currently deserialize
6707
				// nested arrays properly, and attempting to do so may cause
6708
				// a server error. Possible fixes are to modify rack's
6709
				// deserialization algorithm or to provide an option or flag
6710
				// to force array serialization to be shallow.
6711
				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
6712
			}
6713
		});
6714
6715
	} else if ( !traditional && obj != null && typeof obj === "object" ) {
6716
		// If we see an array here, it is empty and should be treated as an empty
6717
		// object
6718
		if ( jQuery.isArray( obj ) || jQuery.isEmptyObject( obj ) ) {
6719
			add( prefix, "" );
6720
6721
		// Serialize object item.
6722
		} else {
6723
			jQuery.each( obj, function( k, v ) {
6724
				buildParams( prefix + "[" + k + "]", v, traditional, add );
6725
			});
6726
		}
6727
6728
	} else {
6729
		// Serialize scalar item.
6730
		add( prefix, obj );
6731
	}
6732
}
6733
6734
// This is still on the jQuery object... for now
6735
// Want to move this to jQuery.ajax some day
6736
jQuery.extend({
6737
6738
	// Counter for holding the number of active queries
6739
	active: 0,
6740
6741
	// Last-Modified header cache for next request
6742
	lastModified: {},
6743
	etag: {}
6744
6745
});
6746
6747
/* Handles responses to an ajax request:
6748
 * - sets all responseXXX fields accordingly
6749
 * - finds the right dataType (mediates between content-type and expected dataType)
6750
 * - returns the corresponding response
6751
 */
6752
function ajaxHandleResponses( s, jXHR, responses ) {
6753
6754
	var contents = s.contents,
6755
		dataTypes = s.dataTypes,
6756
		responseFields = s.responseFields,
6757
		ct,
6758
		type,
6759
		finalDataType,
6760
		firstDataType;
6761
6762
	// Fill responseXXX fields
6763
	for( type in responseFields ) {
6764
		if ( type in responses ) {
6765
			jXHR[ responseFields[type] ] = responses[ type ];
6766
		}
6767
	}
6768
6769
	// Remove auto dataType and get content-type in the process
6770
	while( dataTypes[ 0 ] === "*" ) {
6771
		dataTypes.shift();
6772
		if ( ct === undefined ) {
6773
			ct = jXHR.getResponseHeader( "content-type" );
6774
		}
6775
	}
6776
6777
	// Check if we're dealing with a known content-type
6778
	if ( ct ) {
6779
		for ( type in contents ) {
6780
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
6781
				dataTypes.unshift( type );
6782
				break;
6783
			}
6784
		}
6785
	}
6786
6787
	// Check to see if we have a response for the expected dataType
6788 View Code Duplication
	if ( dataTypes[ 0 ] in responses ) {
6789
		finalDataType = dataTypes[ 0 ];
6790
	} else {
6791
		// Try convertible dataTypes
6792
		for ( type in responses ) {
6793
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
6794
				finalDataType = type;
6795
				break;
6796
			}
6797
			if ( !firstDataType ) {
6798
				firstDataType = type;
6799
			}
6800
		}
6801
		// Or just use first one
6802
		finalDataType = finalDataType || firstDataType;
6803
	}
6804
6805
	// If we found a dataType
6806
	// We add the dataType to the list if needed
6807
	// and return the corresponding response
6808
	if ( finalDataType ) {
6809
		if ( finalDataType !== dataTypes[ 0 ] ) {
6810
			dataTypes.unshift( finalDataType );
6811
		}
6812
		return responses[ finalDataType ];
6813
	}
6814
}
6815
6816
// Chain conversions given the request and the original response
6817 View Code Duplication
function ajaxConvert( s, response ) {
6818
6819
	// Apply the dataFilter if provided
6820
	if ( s.dataFilter ) {
6821
		response = s.dataFilter( response, s.dataType );
6822
	}
6823
6824
	var dataTypes = s.dataTypes,
6825
		converters = s.converters,
6826
		i,
6827
		length = dataTypes.length,
6828
		tmp,
6829
		// Current and previous dataTypes
6830
		current = dataTypes[ 0 ],
6831
		prev,
6832
		// Conversion expression
6833
		conversion,
6834
		// Conversion function
6835
		conv,
6836
		// Conversion functions (transitive conversion)
6837
		conv1,
6838
		conv2;
6839
6840
	// For each dataType in the chain
6841
	for( i = 1; i < length; i++ ) {
6842
6843
		// Get the dataTypes
6844
		prev = current;
6845
		current = dataTypes[ i ];
6846
6847
		// If current is auto dataType, update it to prev
6848
		if( current === "*" ) {
6849
			current = prev;
6850
		// If no auto and dataTypes are actually different
6851
		} else if ( prev !== "*" && prev !== current ) {
6852
6853
			// Get the converter
6854
			conversion = prev + " " + current;
6855
			conv = converters[ conversion ] || converters[ "* " + current ];
6856
6857
			// If there is no direct converter, search transitively
6858
			if ( !conv ) {
6859
				conv2 = undefined;
6860
				for( conv1 in converters ) {
6861
					tmp = conv1.split( " " );
6862
					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
6863
						conv2 = converters[ tmp[1] + " " + current ];
6864
						if ( conv2 ) {
6865
							conv1 = converters[ conv1 ];
6866
							if ( conv1 === true ) {
6867
								conv = conv2;
6868
							} else if ( conv2 === true ) {
6869
								conv = conv1;
6870
							}
6871
							break;
6872
						}
6873
					}
6874
				}
6875
			}
6876
			// If we found no converter, dispatch an error
6877
			if ( !( conv || conv2 ) ) {
6878
				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
6879
			}
6880
			// If found converter is not an equivalence
6881
			if ( conv !== true ) {
6882
				// Convert with 1 or 2 converters accordingly
6883
				response = conv ? conv( response ) : conv2( conv1(response) );
6884
			}
6885
		}
6886
	}
6887
	return response;
6888
}
6889
6890
6891
6892
6893
var jsc = jQuery.now(),
6894
	jsre = /(\=)\?(&|$)|()\?\?()/i;
6895
6896
// Default jsonp settings
6897
jQuery.ajaxSetup({
6898
	jsonp: "callback",
6899
	jsonpCallback: function() {
6900
		return jQuery.expando + "_" + ( jsc++ );
6901
	}
6902
});
6903
6904
// Detect, normalize options and install callbacks for jsonp requests
6905
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, dataIsString /* internal */ ) {
6906
6907
	dataIsString = ( typeof s.data === "string" );
6908
6909
	if ( s.dataTypes[ 0 ] === "jsonp" ||
6910
		originalSettings.jsonpCallback ||
6911
		originalSettings.jsonp != null ||
6912
		s.jsonp !== false && ( jsre.test( s.url ) ||
6913
				dataIsString && jsre.test( s.data ) ) ) {
6914
6915
		var responseContainer,
6916
			jsonpCallback = s.jsonpCallback =
6917
				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
6918
			previous = window[ jsonpCallback ],
6919
			url = s.url,
6920
			data = s.data,
6921
			replace = "$1" + jsonpCallback + "$2";
6922
6923
		if ( s.jsonp !== false ) {
6924
			url = url.replace( jsre, replace );
6925
			if ( s.url === url ) {
6926
				if ( dataIsString ) {
6927
					data = data.replace( jsre, replace );
6928
				}
6929
				if ( s.data === data ) {
6930
					// Add callback manually
6931
					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
6932
				}
6933
			}
6934
		}
6935
6936
		s.url = url;
6937
		s.data = data;
6938
6939
		window[ jsonpCallback ] = function( response ) {
6940
			responseContainer = [ response ];
6941
		};
6942
6943
		s.complete = [ function() {
6944
6945
			// Set callback back to previous value
6946
			window[ jsonpCallback ] = previous;
6947
6948
			// Call if it was a function and we have a response
6949
			if ( previous) {
6950
				if ( responseContainer && jQuery.isFunction( previous ) ) {
6951
					window[ jsonpCallback ] ( responseContainer[ 0 ] );
6952
				}
6953
			} else {
6954
				// else, more memory leak avoidance
6955
				try{
6956
					delete window[ jsonpCallback ];
6957
				} 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...
6958
			}
6959
6960
		}, s.complete ];
6961
6962
		// Use data converter to retrieve json after script execution
6963
		s.converters["script json"] = function() {
6964
			if ( ! responseContainer ) {
6965
				jQuery.error( jsonpCallback + " was not called" );
6966
			}
6967
			return responseContainer[ 0 ];
6968
		};
6969
6970
		// force json dataType
6971
		s.dataTypes[ 0 ] = "json";
6972
6973
		// Delegate to script
6974
		return "script";
6975
	}
6976
} );
6977
6978
6979
6980
6981
// Install script dataType
6982
jQuery.ajaxSetup({
6983
	accepts: {
6984
		script: "text/javascript, application/javascript"
6985
	},
6986
	contents: {
6987
		script: /javascript/
6988
	},
6989
	converters: {
6990
		"text script": function( text ) {
6991
			jQuery.globalEval( text );
6992
			return text;
6993
		}
6994
	}
6995
});
6996
6997
// Handle cache's special case and global
6998
jQuery.ajaxPrefilter( "script", function( s ) {
6999
	if ( s.cache === undefined ) {
7000
		s.cache = false;
7001
	}
7002
	if ( s.crossDomain ) {
7003
		s.type = "GET";
7004
		s.global = false;
7005
	}
7006
} );
7007
7008
// Bind script tag hack transport
7009 View Code Duplication
jQuery.ajaxTransport( "script", function(s) {
7010
7011
	// This transport only deals with cross domain requests
7012
	if ( s.crossDomain ) {
7013
7014
		var script,
7015
			head = document.getElementsByTagName( "head" )[ 0 ] || document.documentElement;
7016
7017
		return {
7018
7019
			send: function( _, callback ) {
7020
7021
				script = document.createElement( "script" );
7022
7023
				script.async = "async";
7024
7025
				if ( s.scriptCharset ) {
7026
					script.charset = s.scriptCharset;
7027
				}
7028
7029
				script.src = s.url;
7030
7031
				// Attach handlers for all browsers
7032
				script.onload = script.onreadystatechange = function( _, isAbort ) {
7033
7034
					if ( !script.readyState || /loaded|complete/.test( script.readyState ) ) {
7035
7036
						// Handle memory leak in IE
7037
						script.onload = script.onreadystatechange = null;
7038
7039
						// Remove the script
7040
						if ( head && script.parentNode ) {
7041
							head.removeChild( script );
7042
						}
7043
7044
						// Dereference the script
7045
						script = undefined;
7046
7047
						// Callback if not abort
7048
						if ( !isAbort ) {
7049
							callback( 200, "success" );
7050
						}
7051
					}
7052
				};
7053
				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
7054
				// This arises when a base node is used (#2709 and #4378).
7055
				head.insertBefore( script, head.firstChild );
7056
			},
7057
7058
			abort: function() {
7059
				if ( script ) {
7060
					script.onload( 0, 1 );
7061
				}
7062
			}
7063
		};
7064
	}
7065
} );
7066
7067
7068
7069
7070
var // Next active xhr id
7071
	xhrId = jQuery.now(),
7072
7073
	// active xhrs
7074
	xhrs = {},
7075
7076
	// #5280: see below
7077
	xhrUnloadAbortInstalled,
7078
7079
	// XHR used to determine supports properties
7080
	testXHR;
7081
7082
// Create the request object
7083
// (This is still attached to ajaxSettings for backward compatibility)
7084
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
7085
	/* Microsoft failed to properly
7086
	 * implement the XMLHttpRequest in IE7 (can't request local files),
7087
	 * so we use the ActiveXObject when it is available
7088
	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
7089
	 * we need a fallback.
7090
	 */
7091
	function() {
7092
		if ( window.location.protocol !== "file:" ) {
7093
			try {
7094
				return new window.XMLHttpRequest();
7095
			} catch( xhrError ) {}
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...
7096
		}
7097
7098
		try {
7099
			return new window.ActiveXObject("Microsoft.XMLHTTP");
7100
		} catch( activeError ) {}
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...
7101
	} :
7102
	// For all other browsers, use the standard XMLHttpRequest object
7103
	function() {
7104
		return new window.XMLHttpRequest();
7105
	};
7106
7107
// Test if we can create an xhr object
7108
try {
7109
	testXHR = jQuery.ajaxSettings.xhr();
7110
} catch( xhrCreationException ) {}
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...
7111
7112
//Does this browser support XHR requests?
7113
jQuery.support.ajax = !!testXHR;
7114
7115
// Does this browser support crossDomain XHR requests
7116
jQuery.support.cors = testXHR && ( "withCredentials" in testXHR );
7117
7118
// No need for the temporary xhr anymore
7119
testXHR = undefined;
7120
7121
// Create transport if the browser can provide an xhr
7122
if ( jQuery.support.ajax ) {
7123
7124
	jQuery.ajaxTransport(function( s ) {
7125
		// Cross domain only allowed if supported through XMLHttpRequest
7126
		if ( !s.crossDomain || jQuery.support.cors ) {
7127
7128
			var callback;
7129
7130
			return {
7131
				send: function( headers, complete ) {
7132
7133
					// #5280: we need to abort on unload or IE will keep connections alive
7134
					if ( !xhrUnloadAbortInstalled ) {
7135
7136
						xhrUnloadAbortInstalled = 1;
7137
7138
						jQuery(window).bind( "unload", function() {
7139
7140
							// Abort all pending requests
7141
							jQuery.each( xhrs, function( _, xhr ) {
7142
								if ( xhr.onreadystatechange ) {
7143
									xhr.onreadystatechange( 1 );
7144
								}
7145
							} );
7146
7147
						} );
7148
					}
7149
7150
					// Get a new xhr
7151
					var xhr = s.xhr(),
7152
						handle;
7153
7154
					// Open the socket
7155
					// Passing null username, generates a login popup on Opera (#2865)
7156
					if ( s.username ) {
7157
						xhr.open( s.type, s.url, s.async, s.username, s.password );
7158
					} else {
7159
						xhr.open( s.type, s.url, s.async );
7160
					}
7161
7162
					// Requested-With header
7163
					// Not set for crossDomain requests with no content
7164
					// (see why at http://trac.dojotoolkit.org/ticket/9486)
7165
					// Won't change header if already provided
7166
					if ( !( s.crossDomain && !s.hasContent ) && !headers["x-requested-with"] ) {
7167
						headers[ "x-requested-with" ] = "XMLHttpRequest";
7168
					}
7169
7170
					// Need an extra try/catch for cross domain requests in Firefox 3
7171
					try {
7172
						jQuery.each( headers, function( key, value ) {
7173
							xhr.setRequestHeader( key, value );
7174
						} );
7175
					} catch( _ ) {}
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...
7176
7177
					// Do send the request
7178
					// This may raise an exception which is actually
7179
					// handled in jQuery.ajax (so no try/catch here)
7180
					xhr.send( ( s.hasContent && s.data ) || null );
7181
7182
					// Listener
7183
					callback = function( _, isAbort ) {
7184
7185
						// Was never called and is aborted or complete
7186
						if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
7187
7188
							// Only called once
7189
							callback = 0;
7190
7191
							// Do not keep as active anymore
7192
							if ( handle ) {
7193
								xhr.onreadystatechange = jQuery.noop;
7194
								delete xhrs[ handle ];
7195
							}
7196
7197
							// If it's an abort
7198
							if ( isAbort ) {
7199
								// Abort it manually if needed
7200
								if ( xhr.readyState !== 4 ) {
7201
									xhr.abort();
7202
								}
7203
							} else {
7204
								// Get info
7205
								var status = xhr.status,
7206
									statusText,
7207
									responseHeaders = xhr.getAllResponseHeaders(),
7208
									responses = {},
7209
									xml = xhr.responseXML;
7210
7211
								// Construct response list
7212
								if ( xml && xml.documentElement /* #4958 */ ) {
7213
									responses.xml = xml;
7214
								}
7215
								responses.text = xhr.responseText;
7216
7217
								// Firefox throws an exception when accessing
7218
								// statusText for faulty cross-domain requests
7219
								try {
7220
									statusText = xhr.statusText;
7221
								} catch( e ) {
7222
									// We normalize with Webkit giving an empty statusText
7223
									statusText = "";
7224
								}
7225
7226
								// Filter status for non standard behaviours
7227
								status =
7228
									// Opera returns 0 when it should be 304
7229
									// Webkit returns 0 for failing cross-domain no matter the real status
7230
									status === 0 ?
7231
										(
7232
											// Webkit, Firefox: filter out faulty cross-domain requests
7233
											!s.crossDomain || statusText ?
7234
											(
7235
												// Opera: filter out real aborts #6060
7236
												responseHeaders ?
7237
												304 :
7238
												0
7239
											) :
7240
											// We assume 302 but could be anything cross-domain related
7241
											302
7242
										) :
7243
										(
7244
											// IE sometimes returns 1223 when it should be 204 (see #1450)
7245
											status == 1223 ?
7246
												204 :
7247
												status
7248
										);
7249
7250
								// Call complete
7251
								complete( status, statusText, responses, responseHeaders );
7252
							}
7253
						}
7254
					};
7255
7256
					// if we're in sync mode or it's in cache
7257
					// and has been retrieved directly (IE6 & IE7)
7258
					// we need to manually fire the callback
7259
					if ( !s.async || xhr.readyState === 4 ) {
7260
						callback();
7261
					} else {
7262
						// Add to list of active xhrs
7263
						handle = xhrId++;
7264
						xhrs[ handle ] = xhr;
7265
						xhr.onreadystatechange = callback;
7266
					}
7267
				},
7268
7269
				abort: function() {
7270
					if ( callback ) {
7271
						callback(0,1);
7272
					}
7273
				}
7274
			};
7275
		}
7276
	});
7277
}
7278
7279
7280
7281
7282
var elemdisplay = {},
7283
	rfxtypes = /^(?:toggle|show|hide)$/,
7284
	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
7285
	timerId,
7286
	fxAttrs = [
7287
		// height animations
7288
		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
7289
		// width animations
7290
		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
7291
		// opacity animations
7292
		[ "opacity" ]
7293
	];
7294
7295
jQuery.fn.extend({
7296 View Code Duplication
	show: function( speed, easing, callback ) {
7297
		var elem, display;
7298
7299
		if ( speed || speed === 0 ) {
7300
			return this.animate( genFx("show", 3), speed, easing, callback);
7301
7302
		} 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...
7303
			for ( var i = 0, j = this.length; i < j; i++ ) {
7304
				elem = this[i];
7305
				display = elem.style.display;
7306
7307
				// Reset the inline display of this element to learn if it is
7308
				// being hidden by cascaded rules or not
7309
				if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
7310
					display = elem.style.display = "";
7311
				}
7312
7313
				// Set elements which have been overridden with display: none
7314
				// in a stylesheet to whatever the default browser style is
7315
				// for such an element
7316
				if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
7317
					jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
7318
				}
7319
			}
7320
7321
			// Set the display of most of the elements in a second loop
7322
			// to avoid the constant reflow
7323
			for ( i = 0; i < j; i++ ) {
7324
				elem = this[i];
7325
				display = elem.style.display;
7326
7327
				if ( display === "" || display === "none" ) {
7328
					elem.style.display = jQuery._data(elem, "olddisplay") || "";
7329
				}
7330
			}
7331
7332
			return this;
7333
		}
7334
	},
7335
7336 View Code Duplication
	hide: function( speed, easing, callback ) {
7337
		if ( speed || speed === 0 ) {
7338
			return this.animate( genFx("hide", 3), speed, easing, callback);
7339
7340
		} 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...
7341
			for ( var i = 0, j = this.length; i < j; i++ ) {
7342
				var display = jQuery.css( this[i], "display" );
7343
7344
				if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
7345
					jQuery._data( this[i], "olddisplay", display );
7346
				}
7347
			}
7348
7349
			// Set the display of the elements in a second loop
7350
			// to avoid the constant reflow
7351
			for ( i = 0; i < j; i++ ) {
7352
				this[i].style.display = "none";
7353
			}
7354
7355
			return this;
7356
		}
7357
	},
7358
7359
	// Save the old toggle function
7360
	_toggle: jQuery.fn.toggle,
7361
7362
	toggle: function( fn, fn2, callback ) {
7363
		var bool = typeof fn === "boolean";
7364
7365
		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
7366
			this._toggle.apply( this, arguments );
7367
7368
		} else if ( fn == null || bool ) {
7369
			this.each(function() {
7370
				var state = bool ? fn : jQuery(this).is(":hidden");
7371
				jQuery(this)[ state ? "show" : "hide" ]();
7372
			});
7373
7374
		} else {
7375
			this.animate(genFx("toggle", 3), fn, fn2, callback);
7376
		}
7377
7378
		return this;
7379
	},
7380
7381
	fadeTo: function( speed, to, easing, callback ) {
7382
		return this.filter(":hidden").css("opacity", 0).show().end()
7383
					.animate({opacity: to}, speed, easing, callback);
7384
	},
7385
7386
	animate: function( prop, speed, easing, callback ) {
7387
		var optall = jQuery.speed(speed, easing, callback);
7388
7389
		if ( jQuery.isEmptyObject( prop ) ) {
7390
			return this.each( optall.complete );
7391
		}
7392
7393
		return this[ optall.queue === false ? "each" : "queue" ](function() {
7394
			// XXX 'this' does not always have a nodeName when running the
7395
			// test suite
7396
7397
			var opt = jQuery.extend({}, optall), p,
7398
				isElement = this.nodeType === 1,
7399
				hidden = isElement && jQuery(this).is(":hidden"),
7400
				self = this;
7401
7402
			for ( p in prop ) {
7403
				var name = jQuery.camelCase( p );
7404
7405
				if ( p !== name ) {
7406
					prop[ name ] = prop[ p ];
7407
					delete prop[ p ];
7408
					p = name;
7409
				}
7410
7411
				if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
7412
					return opt.complete.call(this);
7413
				}
7414
7415 View Code Duplication
				if ( isElement && ( p === "height" || p === "width" ) ) {
7416
					// Make sure that nothing sneaks out
7417
					// Record all 3 overflow attributes because IE does not
7418
					// change the overflow attribute when overflowX and
7419
					// overflowY are set to the same value
7420
					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
7421
7422
					// Set display property to inline-block for height/width
7423
					// animations on inline elements that are having width/height
7424
					// animated
7425
					if ( jQuery.css( this, "display" ) === "inline" &&
7426
							jQuery.css( this, "float" ) === "none" ) {
7427
						if ( !jQuery.support.inlineBlockNeedsLayout ) {
7428
							this.style.display = "inline-block";
7429
7430
						} else {
7431
							var display = defaultDisplay(this.nodeName);
7432
7433
							// inline-level elements accept inline-block;
7434
							// block-level elements need to be inline with layout
7435
							if ( display === "inline" ) {
7436
								this.style.display = "inline-block";
7437
7438
							} else {
7439
								this.style.display = "inline";
7440
								this.style.zoom = 1;
7441
							}
7442
						}
7443
					}
7444
				}
7445
7446
				if ( jQuery.isArray( prop[p] ) ) {
7447
					// Create (if needed) and add to specialEasing
7448
					(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
7449
					prop[p] = prop[p][0];
7450
				}
7451
			}
7452
7453
			if ( opt.overflow != null ) {
7454
				this.style.overflow = "hidden";
7455
			}
7456
7457
			opt.curAnim = jQuery.extend({}, prop);
7458
7459
			jQuery.each( prop, function( name, val ) {
7460
				var e = new jQuery.fx( self, opt, name );
7461
7462
				if ( rfxtypes.test(val) ) {
7463
					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
7464
7465
				} else {
7466
					var parts = rfxnum.exec(val),
7467
						start = e.cur() || 0;
7468
7469
					if ( parts ) {
7470
						var end = parseFloat( parts[2] ),
7471
							unit = parts[3] || "px";
7472
7473
						// We need to compute starting value
7474
						if ( unit !== "px" ) {
7475
							jQuery.style( self, name, (end || 1) + unit);
7476
							start = ((end || 1) / e.cur()) * start;
7477
							jQuery.style( self, name, start + unit);
7478
						}
7479
7480
						// If a +=/-= token was provided, we're doing a relative animation
7481
						if ( parts[1] ) {
7482
							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
7483
						}
7484
7485
						e.custom( start, end, unit );
7486
7487
					} else {
7488
						e.custom( start, val, "" );
7489
					}
7490
				}
7491
			});
7492
7493
			// For JS strict compliance
7494
			return true;
7495
		});
7496
	},
7497
7498
	stop: function( clearQueue, gotoEnd ) {
7499
		var timers = jQuery.timers;
7500
7501
		if ( clearQueue ) {
7502
			this.queue([]);
7503
		}
7504
7505
		this.each(function() {
7506
			// go in reverse order so anything added to the queue during the loop is ignored
7507
			for ( var i = timers.length - 1; i >= 0; i-- ) {
7508
				if ( timers[i].elem === this ) {
7509
					if (gotoEnd) {
7510
						// force the next step to be the last
7511
						timers[i](true);
7512
					}
7513
7514
					timers.splice(i, 1);
7515
				}
7516
			}
7517
		});
7518
7519
		// start the next in the queue if the last step wasn't forced
7520
		if ( !gotoEnd ) {
7521
			this.dequeue();
7522
		}
7523
7524
		return this;
7525
	}
7526
7527
});
7528
7529
function genFx( type, num ) {
7530
	var obj = {};
7531
7532
	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
7533
		obj[ this ] = type;
7534
	});
7535
7536
	return obj;
7537
}
7538
7539
// Generate shortcuts for custom animations
7540
jQuery.each({
7541
	slideDown: genFx("show", 1),
7542
	slideUp: genFx("hide", 1),
7543
	slideToggle: genFx("toggle", 1),
7544
	fadeIn: { opacity: "show" },
7545
	fadeOut: { opacity: "hide" },
7546
	fadeToggle: { opacity: "toggle" }
7547
}, function( name, props ) {
7548
	jQuery.fn[ name ] = function( speed, easing, callback ) {
7549
		return this.animate( props, speed, easing, callback );
7550
	};
7551
});
7552
7553
jQuery.extend({
7554 View Code Duplication
	speed: function( speed, easing, fn ) {
7555
		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
7556
			complete: fn || !fn && easing ||
7557
				jQuery.isFunction( speed ) && speed,
7558
			duration: speed,
7559
			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
7560
		};
7561
7562
		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
7563
			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
7564
7565
		// Queueing
7566
		opt.old = opt.complete;
7567
		opt.complete = function() {
7568
			if ( opt.queue !== false ) {
7569
				jQuery(this).dequeue();
7570
			}
7571
			if ( jQuery.isFunction( opt.old ) ) {
7572
				opt.old.call( this );
7573
			}
7574
		};
7575
7576
		return opt;
7577
	},
7578
7579
	easing: {
7580
		linear: function( p, n, firstNum, diff ) {
7581
			return firstNum + diff * p;
7582
		},
7583
		swing: function( p, n, firstNum, diff ) {
7584
			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
7585
		}
7586
	},
7587
7588
	timers: [],
7589
7590
	fx: function( elem, options, prop ) {
7591
		this.options = options;
7592
		this.elem = elem;
7593
		this.prop = prop;
7594
7595
		if ( !options.orig ) {
7596
			options.orig = {};
7597
		}
7598
	}
7599
7600
});
7601
7602
jQuery.fx.prototype = {
7603
	// Simple function for setting a style value
7604
	update: function() {
7605
		if ( this.options.step ) {
7606
			this.options.step.call( this.elem, this.now, this );
7607
		}
7608
7609
		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
7610
	},
7611
7612
	// Get the current size
7613
	cur: function() {
7614
		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
7615
			return this.elem[ this.prop ];
7616
		}
7617
7618
		var r = parseFloat( jQuery.css( this.elem, this.prop ) );
7619
		return r || 0;
7620
	},
7621
7622
	// Start an animation from one number to another
7623
	custom: function( from, to, unit ) {
7624
		var self = this,
7625
			fx = jQuery.fx;
7626
7627
		this.startTime = jQuery.now();
7628
		this.start = from;
7629
		this.end = to;
7630
		this.unit = unit || this.unit || "px";
7631
		this.now = this.start;
7632
		this.pos = this.state = 0;
7633
7634
		function t( gotoEnd ) {
7635
			return self.step(gotoEnd);
7636
		}
7637
7638
		t.elem = this.elem;
7639
7640
		if ( t() && jQuery.timers.push(t) && !timerId ) {
7641
			timerId = setInterval(fx.tick, fx.interval);
7642
		}
7643
	},
7644
7645
	// Simple 'show' function
7646
	show: function() {
7647
		// Remember where we started, so that we can go back to it later
7648
		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
7649
		this.options.show = true;
7650
7651
		// Begin the animation
7652
		// Make sure that we start at a small width/height to avoid any
7653
		// flash of content
7654
		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
7655
7656
		// Start by showing the element
7657
		jQuery( this.elem ).show();
7658
	},
7659
7660
	// Simple 'hide' function
7661
	hide: function() {
7662
		// Remember where we started, so that we can go back to it later
7663
		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
7664
		this.options.hide = true;
7665
7666
		// Begin the animation
7667
		this.custom(this.cur(), 0);
7668
	},
7669
7670
	// Each step of an animation
7671
	step: function( gotoEnd ) {
7672
		var t = jQuery.now(), done = true;
7673
7674
		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
7675
			this.now = this.end;
7676
			this.pos = this.state = 1;
7677
			this.update();
7678
7679
			this.options.curAnim[ this.prop ] = true;
7680
7681
			for ( var i in this.options.curAnim ) {
7682
				if ( this.options.curAnim[i] !== true ) {
7683
					done = false;
7684
				}
7685
			}
7686
7687
			if ( done ) {
7688
				// Reset the overflow
7689
				if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
7690
					var elem = this.elem,
7691
						options = this.options;
7692
7693
					jQuery.each( [ "", "X", "Y" ], function (index, value) {
7694
						elem.style[ "overflow" + value ] = options.overflow[index];
7695
					} );
7696
				}
7697
7698
				// Hide the element if the "hide" operation was done
7699
				if ( this.options.hide ) {
7700
					jQuery(this.elem).hide();
7701
				}
7702
7703
				// Reset the properties, if the item has been hidden or shown
7704
				if ( this.options.hide || this.options.show ) {
7705
					for ( var p in this.options.curAnim ) {
7706
						jQuery.style( this.elem, p, this.options.orig[p] );
7707
					}
7708
				}
7709
7710
				// Execute the complete function
7711
				this.options.complete.call( this.elem );
7712
			}
7713
7714
			return false;
7715
7716
		} 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...
7717
			var n = t - this.startTime;
7718
			this.state = n / this.options.duration;
7719
7720
			// Perform the easing function, defaults to swing
7721
			var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
7722
			var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
7723
			this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
7724
			this.now = this.start + ((this.end - this.start) * this.pos);
7725
7726
			// Perform the next step of the animation
7727
			this.update();
7728
		}
7729
7730
		return true;
7731
	}
7732
};
7733
7734
jQuery.extend( jQuery.fx, {
7735
	tick: function() {
7736
		var timers = jQuery.timers;
7737
7738
		for ( var i = 0; i < timers.length; i++ ) {
7739
			if ( !timers[i]() ) {
7740
				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...
7741
			}
7742
		}
7743
7744
		if ( !timers.length ) {
7745
			jQuery.fx.stop();
7746
		}
7747
	},
7748
7749
	interval: 13,
7750
7751
	stop: function() {
7752
		clearInterval( timerId );
7753
		timerId = null;
7754
	},
7755
7756
	speeds: {
7757
		slow: 600,
7758
		fast: 200,
7759
		// Default speed
7760
		_default: 400
7761
	},
7762
7763
	step: {
7764
		opacity: function( fx ) {
7765
			jQuery.style( fx.elem, "opacity", fx.now );
7766
		},
7767
7768
		_default: function( fx ) {
7769
			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
7770
				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
7771
			} else {
7772
				fx.elem[ fx.prop ] = fx.now;
7773
			}
7774
		}
7775
	}
7776
});
7777
7778
if ( jQuery.expr && jQuery.expr.filters ) {
7779
	jQuery.expr.filters.animated = function( elem ) {
7780
		return jQuery.grep(jQuery.timers, function( fn ) {
7781
			return elem === fn.elem;
7782
		}).length;
7783
	};
7784
}
7785
7786
function defaultDisplay( nodeName ) {
7787
	if ( !elemdisplay[ nodeName ] ) {
7788
		var elem = jQuery("<" + nodeName + ">").appendTo("body"),
7789
			display = elem.css("display");
7790
7791
		elem.remove();
7792
7793
		if ( display === "none" || display === "" ) {
7794
			display = "block";
7795
		}
7796
7797
		elemdisplay[ nodeName ] = display;
7798
	}
7799
7800
	return elemdisplay[ nodeName ];
7801
}
7802
7803
7804
7805
7806
var rtable = /^t(?:able|d|h)$/i,
7807
	rroot = /^(?:body|html)$/i;
7808
7809 View Code Duplication
if ( "getBoundingClientRect" in document.documentElement ) {
7810
	jQuery.fn.offset = function( options ) {
7811
		var elem = this[0], box;
7812
7813
		if ( options ) {
7814
			return this.each(function( i ) {
7815
				jQuery.offset.setOffset( this, options, i );
7816
			});
7817
		}
7818
7819
		if ( !elem || !elem.ownerDocument ) {
7820
			return null;
7821
		}
7822
7823
		if ( elem === elem.ownerDocument.body ) {
7824
			return jQuery.offset.bodyOffset( elem );
7825
		}
7826
7827
		try {
7828
			box = elem.getBoundingClientRect();
7829
		} 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...
7830
7831
		var doc = elem.ownerDocument,
7832
			docElem = doc.documentElement;
7833
7834
		// Make sure we're not dealing with a disconnected DOM node
7835
		if ( !box || !jQuery.contains( docElem, elem ) ) {
7836
			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
7837
		}
7838
7839
		var body = doc.body,
7840
			win = getWindow(doc),
7841
			clientTop  = docElem.clientTop  || body.clientTop  || 0,
7842
			clientLeft = docElem.clientLeft || body.clientLeft || 0,
7843
			scrollTop  = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ),
7844
			scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
7845
			top  = box.top  + scrollTop  - clientTop,
7846
			left = box.left + scrollLeft - clientLeft;
7847
7848
		return { top: top, left: left };
7849
	};
7850
7851
} else {
7852
	jQuery.fn.offset = function( options ) {
7853
		var elem = this[0];
7854
7855
		if ( options ) {
7856
			return this.each(function( i ) {
7857
				jQuery.offset.setOffset( this, options, i );
7858
			});
7859
		}
7860
7861
		if ( !elem || !elem.ownerDocument ) {
7862
			return null;
7863
		}
7864
7865
		if ( elem === elem.ownerDocument.body ) {
7866
			return jQuery.offset.bodyOffset( elem );
7867
		}
7868
7869
		jQuery.offset.initialize();
7870
7871
		var computedStyle,
7872
			offsetParent = elem.offsetParent,
7873
			prevOffsetParent = elem,
7874
			doc = elem.ownerDocument,
7875
			docElem = doc.documentElement,
7876
			body = doc.body,
7877
			defaultView = doc.defaultView,
7878
			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
7879
			top = elem.offsetTop,
7880
			left = elem.offsetLeft;
7881
7882
		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
7883
			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
7884
				break;
7885
			}
7886
7887
			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
7888
			top  -= elem.scrollTop;
7889
			left -= elem.scrollLeft;
7890
7891
			if ( elem === offsetParent ) {
7892
				top  += elem.offsetTop;
7893
				left += elem.offsetLeft;
7894
7895
				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
7896
					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
7897
					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
7898
				}
7899
7900
				prevOffsetParent = offsetParent;
7901
				offsetParent = elem.offsetParent;
7902
			}
7903
7904
			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
7905
				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
7906
				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
7907
			}
7908
7909
			prevComputedStyle = computedStyle;
7910
		}
7911
7912
		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
7913
			top  += body.offsetTop;
7914
			left += body.offsetLeft;
7915
		}
7916
7917
		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
7918
			top  += Math.max( docElem.scrollTop, body.scrollTop );
7919
			left += Math.max( docElem.scrollLeft, body.scrollLeft );
7920
		}
7921
7922
		return { top: top, left: left };
7923
	};
7924
}
7925
7926
jQuery.offset = {
7927
	initialize: function() {
7928
		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
7929
			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
7930
7931
		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
7932
7933
		container.innerHTML = html;
7934
		body.insertBefore( container, body.firstChild );
7935
		innerDiv = container.firstChild;
7936
		checkDiv = innerDiv.firstChild;
7937
		td = innerDiv.nextSibling.firstChild.firstChild;
7938
7939
		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
7940
		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
7941
7942
		checkDiv.style.position = "fixed";
7943
		checkDiv.style.top = "20px";
7944
7945
		// safari subtracts parent border width here which is 5px
7946
		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
7947
		checkDiv.style.position = checkDiv.style.top = "";
7948
7949
		innerDiv.style.overflow = "hidden";
7950
		innerDiv.style.position = "relative";
7951
7952
		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
7953
7954
		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
7955
7956
		body.removeChild( container );
7957
		body = container = innerDiv = checkDiv = table = td = null;
7958
		jQuery.offset.initialize = jQuery.noop;
7959
	},
7960
7961
	bodyOffset: function( body ) {
7962
		var top = body.offsetTop,
7963
			left = body.offsetLeft;
7964
7965
		jQuery.offset.initialize();
7966
7967
		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
7968
			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
7969
			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
7970
		}
7971
7972
		return { top: top, left: left };
7973
	},
7974
7975
	setOffset: function( elem, options, i ) {
7976
		var position = jQuery.css( elem, "position" );
7977
7978
		// set position first, in-case top/left are set even on static elem
7979
		if ( position === "static" ) {
7980
			elem.style.position = "relative";
7981
		}
7982
7983
		var curElem = jQuery( elem ),
7984
			curOffset = curElem.offset(),
7985
			curCSSTop = jQuery.css( elem, "top" ),
7986
			curCSSLeft = jQuery.css( elem, "left" ),
7987
			calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
7988
			props = {}, curPosition = {}, curTop, curLeft;
7989
7990
		// need to be able to calculate position if either top or left is auto and position is absolute
7991
		if ( calculatePosition ) {
7992
			curPosition = curElem.position();
7993
		}
7994
7995
		curTop  = calculatePosition ? curPosition.top  : parseInt( curCSSTop,  10 ) || 0;
7996
		curLeft = calculatePosition ? curPosition.left : parseInt( curCSSLeft, 10 ) || 0;
7997
7998
		if ( jQuery.isFunction( options ) ) {
7999
			options = options.call( elem, i, curOffset );
8000
		}
8001
8002
		if (options.top != null) {
8003
			props.top = (options.top - curOffset.top) + curTop;
8004
		}
8005
		if (options.left != null) {
8006
			props.left = (options.left - curOffset.left) + curLeft;
8007
		}
8008
8009
		if ( "using" in options ) {
8010
			options.using.call( elem, props );
8011
		} else {
8012
			curElem.css( props );
8013
		}
8014
	}
8015
};
8016
8017
8018
jQuery.fn.extend({
8019 View Code Duplication
	position: function() {
8020
		if ( !this[0] ) {
8021
			return null;
8022
		}
8023
8024
		var elem = this[0],
8025
8026
		// Get *real* offsetParent
8027
		offsetParent = this.offsetParent(),
8028
8029
		// Get correct offsets
8030
		offset       = this.offset(),
8031
		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
8032
8033
		// Subtract element margins
8034
		// note: when an element has margin: auto the offsetLeft and marginLeft
8035
		// are the same in Safari causing offset.left to incorrectly be 0
8036
		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
8037
		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
8038
8039
		// Add offsetParent borders
8040
		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
8041
		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
8042
8043
		// Subtract the two offsets
8044
		return {
8045
			top:  offset.top  - parentOffset.top,
8046
			left: offset.left - parentOffset.left
8047
		};
8048
	},
8049
8050
	offsetParent: function() {
8051
		return this.map(function() {
8052
			var offsetParent = this.offsetParent || document.body;
8053
			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
8054
				offsetParent = offsetParent.offsetParent;
8055
			}
8056
			return offsetParent;
8057
		});
8058
	}
8059
});
8060
8061
8062
// Create scrollLeft and scrollTop methods
8063 View Code Duplication
jQuery.each( ["Left", "Top"], function( i, name ) {
8064
	var method = "scroll" + name;
8065
8066
	jQuery.fn[ method ] = function(val) {
8067
		var elem = this[0], win;
8068
8069
		if ( !elem ) {
8070
			return null;
8071
		}
8072
8073
		if ( val !== undefined ) {
8074
			// Set the scroll offset
8075
			return this.each(function() {
8076
				win = getWindow( this );
8077
8078
				if ( win ) {
8079
					win.scrollTo(
8080
						!i ? val : jQuery(win).scrollLeft(),
8081
						 i ? val : jQuery(win).scrollTop()
8082
					);
8083
8084
				} else {
8085
					this[ method ] = val;
8086
				}
8087
			});
8088
		} 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...
8089
			win = getWindow( elem );
8090
8091
			// Return the scroll offset
8092
			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
8093
				jQuery.support.boxModel && win.document.documentElement[ method ] ||
8094
					win.document.body[ method ] :
8095
				elem[ method ];
8096
		}
8097
	};
8098
});
8099
8100
function getWindow( elem ) {
8101
	return jQuery.isWindow( elem ) ?
8102
		elem :
8103
		elem.nodeType === 9 ?
8104
			elem.defaultView || elem.parentWindow :
8105
			false;
8106
}
8107
8108
8109
8110
8111
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
8112
jQuery.each([ "Height", "Width" ], function( i, name ) {
8113
8114
	var type = name.toLowerCase();
8115
8116
	// innerHeight and innerWidth
8117
	jQuery.fn["inner" + name] = function() {
8118
		return this[0] ?
8119
			parseFloat( jQuery.css( this[0], type, "padding" ) ) :
8120
			null;
8121
	};
8122
8123
	// outerHeight and outerWidth
8124
	jQuery.fn["outer" + name] = function( margin ) {
8125
		return this[0] ?
8126
			parseFloat( jQuery.css( this[0], type, margin ? "margin" : "border" ) ) :
8127
			null;
8128
	};
8129
8130
	jQuery.fn[ type ] = function( size ) {
8131
		// Get window width or height
8132
		var elem = this[0];
8133
		if ( !elem ) {
8134
			return size == null ? null : this;
8135
		}
8136
8137
		if ( jQuery.isFunction( size ) ) {
8138
			return this.each(function( i ) {
8139
				var self = jQuery( this );
8140
				self[ type ]( size.call( this, i, self[ type ]() ) );
8141
			});
8142
		}
8143
8144
		if ( jQuery.isWindow( elem ) ) {
8145
			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
8146
			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
8147
			var docElemProp = elem.document.documentElement[ "client" + name ];
8148
			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
8149
				elem.document.body[ "client" + name ] || docElemProp;
8150
8151
		// Get document width or height
8152
		} else if ( elem.nodeType === 9 ) {
8153
			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
8154
			return Math.max(
8155
				elem.documentElement["client" + name],
8156
				elem.body["scroll" + name], elem.documentElement["scroll" + name],
8157
				elem.body["offset" + name], elem.documentElement["offset" + name]
8158
			);
8159
8160
		// Get or set width or height on the element
8161
		} else if ( size === undefined ) {
8162
			var orig = jQuery.css( elem, type ),
8163
				ret = parseFloat( orig );
8164
8165
			return jQuery.isNaN( ret ) ? orig : ret;
8166
8167
		// Set the width or height on the element (default to pixels if value is unitless)
8168
		} else {
8169
			return this.css( type, typeof size === "string" ? size : size + "px" );
8170
		}
8171
	};
8172
8173
});
8174
8175
8176
})(window);
8177