Subversion-Projekte lars-tiefland.zeldi.de_alt

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

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