Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

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