Subversion Repositories eFlore/Applications.eflore-consultation

Rev

Details | Last modification | View Log | RSS feed

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