Projet

Général

Profil

Télécharger (231 ko) Statistiques
| Branche: | Tag: | Révision:

univnautes / usr / local / www / javascript / jquery.js @ 3b0bc8c3

1
/*!
2
 * jQuery JavaScript Library v1.6.2
3
 * http://jquery.com/
4
 *
5
 * Copyright 2011, John Resig
6
 * Dual licensed under the MIT or GPL Version 2 licenses.
7
 * http://jquery.org/license
8
 *
9
 * Includes Sizzle.js
10
 * http://sizzlejs.com/
11
 * Copyright 2011, The Dojo Foundation
12
 * Released under the MIT, BSD, and GPL Licenses.
13
 *
14
 * Date: Thu Jun 30 14:16:56 2011 -0400
15
 */
16
(function( window, undefined ) {
17

    
18
// Use the correct document accordingly with window argument (sandbox)
19
var document = window.document,
20
	navigator = window.navigator,
21
	location = window.location;
22
var jQuery = (function() {
23

    
24
// Define a local copy of jQuery
25
var jQuery = function( selector, context ) {
26
		// The jQuery object is actually just the init constructor 'enhanced'
27
		return new jQuery.fn.init( selector, context, rootjQuery );
28
	},
29

    
30
	// Map over jQuery in case of overwrite
31
	_jQuery = window.jQuery,
32

    
33
	// Map over the $ in case of overwrite
34
	_$ = window.$,
35

    
36
	// A central reference to the root jQuery(document)
37
	rootjQuery,
38

    
39
	// A simple way to check for HTML strings or ID strings
40
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
41
	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
42

    
43
	// Check if a string has a non-whitespace character in it
44
	rnotwhite = /\S/,
45

    
46
	// Used for trimming whitespace
47
	trimLeft = /^\s+/,
48
	trimRight = /\s+$/,
49

    
50
	// Check for digits
51
	rdigit = /\d/,
52

    
53
	// Match a standalone tag
54
	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
55

    
56
	// JSON RegExp
57
	rvalidchars = /^[\],:{}\s]*$/,
58
	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
59
	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
60
	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
61

    
62
	// Useragent RegExp
63
	rwebkit = /(webkit)[ \/]([\w.]+)/,
64
	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
65
	rmsie = /(msie) ([\w.]+)/,
66
	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
67

    
68
	// Matches dashed string for camelizing
69
	rdashAlpha = /-([a-z])/ig,
70

    
71
	// Used by jQuery.camelCase as callback to replace()
72
	fcamelCase = function( all, letter ) {
73
		return letter.toUpperCase();
74
	},
75

    
76
	// Keep a UserAgent string for use with jQuery.browser
77
	userAgent = navigator.userAgent,
78

    
79
	// For matching the engine and version of the browser
80
	browserMatch,
81

    
82
	// The deferred used on DOM ready
83
	readyList,
84

    
85
	// The ready event handler
86
	DOMContentLoaded,
87

    
88
	// Save a reference to some core methods
89
	toString = Object.prototype.toString,
90
	hasOwn = Object.prototype.hasOwnProperty,
91
	push = Array.prototype.push,
92
	slice = Array.prototype.slice,
93
	trim = String.prototype.trim,
94
	indexOf = Array.prototype.indexOf,
95

    
96
	// [[Class]] -> type pairs
97
	class2type = {};
98

    
99
jQuery.fn = jQuery.prototype = {
100
	constructor: jQuery,
101
	init: function( selector, context, rootjQuery ) {
102
		var match, elem, ret, doc;
103

    
104
		// Handle $(""), $(null), or $(undefined)
105
		if ( !selector ) {
106
			return this;
107
		}
108

    
109
		// Handle $(DOMElement)
110
		if ( selector.nodeType ) {
111
			this.context = this[0] = selector;
112
			this.length = 1;
113
			return this;
114
		}
115

    
116
		// The body element only exists once, optimize finding it
117
		if ( selector === "body" && !context && document.body ) {
118
			this.context = document;
119
			this[0] = document.body;
120
			this.selector = selector;
121
			this.length = 1;
122
			return this;
123
		}
124

    
125
		// Handle HTML strings
126
		if ( typeof selector === "string" ) {
127
			// Are we dealing with HTML string or an ID?
128
			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
129
				// Assume that strings that start and end with <> are HTML and skip the regex check
130
				match = [ null, selector, null ];
131

    
132
			} else {
133
				match = quickExpr.exec( selector );
134
			}
135

    
136
			// Verify a match, and that no context was specified for #id
137
			if ( match && (match[1] || !context) ) {
138

    
139
				// HANDLE: $(html) -> $(array)
140
				if ( match[1] ) {
141
					context = context instanceof jQuery ? context[0] : context;
142
					doc = (context ? context.ownerDocument || context : document);
143

    
144
					// If a single string is passed in and it's a single tag
145
					// just do a createElement and skip the rest
146
					ret = rsingleTag.exec( selector );
147

    
148
					if ( ret ) {
149
						if ( jQuery.isPlainObject( context ) ) {
150
							selector = [ document.createElement( ret[1] ) ];
151
							jQuery.fn.attr.call( selector, context, true );
152

    
153
						} else {
154
							selector = [ doc.createElement( ret[1] ) ];
155
						}
156

    
157
					} else {
158
						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
159
						selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes;
160
					}
161

    
162
					return jQuery.merge( this, selector );
163

    
164
				// HANDLE: $("#id")
165
				} else {
166
					elem = document.getElementById( match[2] );
167

    
168
					// Check parentNode to catch when Blackberry 4.6 returns
169
					// nodes that are no longer in the document #6963
170
					if ( elem && elem.parentNode ) {
171
						// Handle the case where IE and Opera return items
172
						// by name instead of ID
173
						if ( elem.id !== match[2] ) {
174
							return rootjQuery.find( selector );
175
						}
176

    
177
						// Otherwise, we inject the element directly into the jQuery object
178
						this.length = 1;
179
						this[0] = elem;
180
					}
181

    
182
					this.context = document;
183
					this.selector = selector;
184
					return this;
185
				}
186

    
187
			// HANDLE: $(expr, $(...))
188
			} else if ( !context || context.jquery ) {
189
				return (context || rootjQuery).find( selector );
190

    
191
			// HANDLE: $(expr, context)
192
			// (which is just equivalent to: $(context).find(expr)
193
			} else {
194
				return this.constructor( context ).find( selector );
195
			}
196

    
197
		// HANDLE: $(function)
198
		// Shortcut for document ready
199
		} else if ( jQuery.isFunction( selector ) ) {
200
			return rootjQuery.ready( selector );
201
		}
202

    
203
		if (selector.selector !== undefined) {
204
			this.selector = selector.selector;
205
			this.context = selector.context;
206
		}
207

    
208
		return jQuery.makeArray( selector, this );
209
	},
210

    
211
	// Start with an empty selector
212
	selector: "",
213

    
214
	// The current version of jQuery being used
215
	jquery: "1.6.2",
216

    
217
	// The default length of a jQuery object is 0
218
	length: 0,
219

    
220
	// The number of elements contained in the matched element set
221
	size: function() {
222
		return this.length;
223
	},
224

    
225
	toArray: function() {
226
		return slice.call( this, 0 );
227
	},
228

    
229
	// Get the Nth element in the matched element set OR
230
	// Get the whole matched element set as a clean array
231
	get: function( num ) {
232
		return num == null ?
233

    
234
			// Return a 'clean' array
235
			this.toArray() :
236

    
237
			// Return just the object
238
			( num < 0 ? this[ this.length + num ] : this[ num ] );
239
	},
240

    
241
	// Take an array of elements and push it onto the stack
242
	// (returning the new matched element set)
243
	pushStack: function( elems, name, selector ) {
244
		// Build a new jQuery matched element set
245
		var ret = this.constructor();
246

    
247
		if ( jQuery.isArray( elems ) ) {
248
			push.apply( ret, elems );
249

    
250
		} else {
251
			jQuery.merge( ret, elems );
252
		}
253

    
254
		// Add the old object onto the stack (as a reference)
255
		ret.prevObject = this;
256

    
257
		ret.context = this.context;
258

    
259
		if ( name === "find" ) {
260
			ret.selector = this.selector + (this.selector ? " " : "") + selector;
261
		} else if ( name ) {
262
			ret.selector = this.selector + "." + name + "(" + selector + ")";
263
		}
264

    
265
		// Return the newly-formed element set
266
		return ret;
267
	},
268

    
269
	// Execute a callback for every element in the matched set.
270
	// (You can seed the arguments with an array of args, but this is
271
	// only used internally.)
272
	each: function( callback, args ) {
273
		return jQuery.each( this, callback, args );
274
	},
275

    
276
	ready: function( fn ) {
277
		// Attach the listeners
278
		jQuery.bindReady();
279

    
280
		// Add the callback
281
		readyList.done( fn );
282

    
283
		return this;
284
	},
285

    
286
	eq: function( i ) {
287
		return i === -1 ?
288
			this.slice( i ) :
289
			this.slice( i, +i + 1 );
290
	},
291

    
292
	first: function() {
293
		return this.eq( 0 );
294
	},
295

    
296
	last: function() {
297
		return this.eq( -1 );
298
	},
299

    
300
	slice: function() {
301
		return this.pushStack( slice.apply( this, arguments ),
302
			"slice", slice.call(arguments).join(",") );
303
	},
304

    
305
	map: function( callback ) {
306
		return this.pushStack( jQuery.map(this, function( elem, i ) {
307
			return callback.call( elem, i, elem );
308
		}));
309
	},
310

    
311
	end: function() {
312
		return this.prevObject || this.constructor(null);
313
	},
314

    
315
	// For internal use only.
316
	// Behaves like an Array's method, not like a jQuery method.
317
	push: push,
318
	sort: [].sort,
319
	splice: [].splice
320
};
321

    
322
// Give the init function the jQuery prototype for later instantiation
323
jQuery.fn.init.prototype = jQuery.fn;
324

    
325
jQuery.extend = jQuery.fn.extend = function() {
326
	var options, name, src, copy, copyIsArray, clone,
327
		target = arguments[0] || {},
328
		i = 1,
329
		length = arguments.length,
330
		deep = false;
331

    
332
	// Handle a deep copy situation
333
	if ( typeof target === "boolean" ) {
334
		deep = target;
335
		target = arguments[1] || {};
336
		// skip the boolean and the target
337
		i = 2;
338
	}
339

    
340
	// Handle case when target is a string or something (possible in deep copy)
341
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
342
		target = {};
343
	}
344

    
345
	// extend jQuery itself if only one argument is passed
346
	if ( length === i ) {
347
		target = this;
348
		--i;
349
	}
350

    
351
	for ( ; i < length; i++ ) {
352
		// Only deal with non-null/undefined values
353
		if ( (options = arguments[ i ]) != null ) {
354
			// Extend the base object
355
			for ( name in options ) {
356
				src = target[ name ];
357
				copy = options[ name ];
358

    
359
				// Prevent never-ending loop
360
				if ( target === copy ) {
361
					continue;
362
				}
363

    
364
				// Recurse if we're merging plain objects or arrays
365
				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
366
					if ( copyIsArray ) {
367
						copyIsArray = false;
368
						clone = src && jQuery.isArray(src) ? src : [];
369

    
370
					} else {
371
						clone = src && jQuery.isPlainObject(src) ? src : {};
372
					}
373

    
374
					// Never move original objects, clone them
375
					target[ name ] = jQuery.extend( deep, clone, copy );
376

    
377
				// Don't bring in undefined values
378
				} else if ( copy !== undefined ) {
379
					target[ name ] = copy;
380
				}
381
			}
382
		}
383
	}
384

    
385
	// Return the modified object
386
	return target;
387
};
388

    
389
jQuery.extend({
390
	noConflict: function( deep ) {
391
		if ( window.$ === jQuery ) {
392
			window.$ = _$;
393
		}
394

    
395
		if ( deep && window.jQuery === jQuery ) {
396
			window.jQuery = _jQuery;
397
		}
398

    
399
		return jQuery;
400
	},
401

    
402
	// Is the DOM ready to be used? Set to true once it occurs.
403
	isReady: false,
404

    
405
	// A counter to track how many items to wait for before
406
	// the ready event fires. See #6781
407
	readyWait: 1,
408

    
409
	// Hold (or release) the ready event
410
	holdReady: function( hold ) {
411
		if ( hold ) {
412
			jQuery.readyWait++;
413
		} else {
414
			jQuery.ready( true );
415
		}
416
	},
417

    
418
	// Handle when the DOM is ready
419
	ready: function( wait ) {
420
		// Either a released hold or an DOMready/load event and not yet ready
421
		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
422
			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
423
			if ( !document.body ) {
424
				return setTimeout( jQuery.ready, 1 );
425
			}
426

    
427
			// Remember that the DOM is ready
428
			jQuery.isReady = true;
429

    
430
			// If a normal DOM Ready event fired, decrement, and wait if need be
431
			if ( wait !== true && --jQuery.readyWait > 0 ) {
432
				return;
433
			}
434

    
435
			// If there are functions bound, to execute
436
			readyList.resolveWith( document, [ jQuery ] );
437

    
438
			// Trigger any bound ready events
439
			if ( jQuery.fn.trigger ) {
440
				jQuery( document ).trigger( "ready" ).unbind( "ready" );
441
			}
442
		}
443
	},
444

    
445
	bindReady: function() {
446
		if ( readyList ) {
447
			return;
448
		}
449

    
450
		readyList = jQuery._Deferred();
451

    
452
		// Catch cases where $(document).ready() is called after the
453
		// browser event has already occurred.
454
		if ( document.readyState === "complete" ) {
455
			// Handle it asynchronously to allow scripts the opportunity to delay ready
456
			return setTimeout( jQuery.ready, 1 );
457
		}
458

    
459
		// Mozilla, Opera and webkit nightlies currently support this event
460
		if ( document.addEventListener ) {
461
			// Use the handy event callback
462
			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
463

    
464
			// A fallback to window.onload, that will always work
465
			window.addEventListener( "load", jQuery.ready, false );
466

    
467
		// If IE event model is used
468
		} else if ( document.attachEvent ) {
469
			// ensure firing before onload,
470
			// maybe late but safe also for iframes
471
			document.attachEvent( "onreadystatechange", DOMContentLoaded );
472

    
473
			// A fallback to window.onload, that will always work
474
			window.attachEvent( "onload", jQuery.ready );
475

    
476
			// If IE and not a frame
477
			// continually check to see if the document is ready
478
			var toplevel = false;
479

    
480
			try {
481
				toplevel = window.frameElement == null;
482
			} catch(e) {}
483

    
484
			if ( document.documentElement.doScroll && toplevel ) {
485
				doScrollCheck();
486
			}
487
		}
488
	},
489

    
490
	// See test/unit/core.js for details concerning isFunction.
491
	// Since version 1.3, DOM methods and functions like alert
492
	// aren't supported. They return false on IE (#2968).
493
	isFunction: function( obj ) {
494
		return jQuery.type(obj) === "function";
495
	},
496

    
497
	isArray: Array.isArray || function( obj ) {
498
		return jQuery.type(obj) === "array";
499
	},
500

    
501
	// A crude way of determining if an object is a window
502
	isWindow: function( obj ) {
503
		return obj && typeof obj === "object" && "setInterval" in obj;
504
	},
505

    
506
	isNaN: function( obj ) {
507
		return obj == null || !rdigit.test( obj ) || isNaN( obj );
508
	},
509

    
510
	type: function( obj ) {
511
		return obj == null ?
512
			String( obj ) :
513
			class2type[ toString.call(obj) ] || "object";
514
	},
515

    
516
	isPlainObject: function( obj ) {
517
		// Must be an Object.
518
		// Because of IE, we also have to check the presence of the constructor property.
519
		// Make sure that DOM nodes and window objects don't pass through, as well
520
		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
521
			return false;
522
		}
523

    
524
		// Not own constructor property must be Object
525
		if ( obj.constructor &&
526
			!hasOwn.call(obj, "constructor") &&
527
			!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
528
			return false;
529
		}
530

    
531
		// Own properties are enumerated firstly, so to speed up,
532
		// if last one is own, then all properties are own.
533

    
534
		var key;
535
		for ( key in obj ) {}
536

    
537
		return key === undefined || hasOwn.call( obj, key );
538
	},
539

    
540
	isEmptyObject: function( obj ) {
541
		for ( var name in obj ) {
542
			return false;
543
		}
544
		return true;
545
	},
546

    
547
	error: function( msg ) {
548
		throw msg;
549
	},
550

    
551
	parseJSON: function( data ) {
552
		if ( typeof data !== "string" || !data ) {
553
			return null;
554
		}
555

    
556
		// Make sure leading/trailing whitespace is removed (IE can't handle it)
557
		data = jQuery.trim( data );
558

    
559
		// Attempt to parse using the native JSON parser first
560
		if ( window.JSON && window.JSON.parse ) {
561
			return window.JSON.parse( data );
562
		}
563

    
564
		// Make sure the incoming data is actual JSON
565
		// Logic borrowed from http://json.org/json2.js
566
		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
567
			.replace( rvalidtokens, "]" )
568
			.replace( rvalidbraces, "")) ) {
569

    
570
			return (new Function( "return " + data ))();
571

    
572
		}
573
		jQuery.error( "Invalid JSON: " + data );
574
	},
575

    
576
	// Cross-browser xml parsing
577
	// (xml & tmp used internally)
578
	parseXML: function( data , xml , tmp ) {
579

    
580
		if ( window.DOMParser ) { // Standard
581
			tmp = new DOMParser();
582
			xml = tmp.parseFromString( data , "text/xml" );
583
		} else { // IE
584
			xml = new ActiveXObject( "Microsoft.XMLDOM" );
585
			xml.async = "false";
586
			xml.loadXML( data );
587
		}
588

    
589
		tmp = xml.documentElement;
590

    
591
		if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) {
592
			jQuery.error( "Invalid XML: " + data );
593
		}
594

    
595
		return xml;
596
	},
597

    
598
	noop: function() {},
599

    
600
	// Evaluates a script in a global context
601
	// Workarounds based on findings by Jim Driscoll
602
	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
603
	globalEval: function( data ) {
604
		if ( data && rnotwhite.test( data ) ) {
605
			// We use execScript on Internet Explorer
606
			// We use an anonymous function so that context is window
607
			// rather than jQuery in Firefox
608
			( window.execScript || function( data ) {
609
				window[ "eval" ].call( window, data );
610
			} )( data );
611
		}
612
	},
613

    
614
	// Converts a dashed string to camelCased string;
615
	// Used by both the css and data modules
616
	camelCase: function( string ) {
617
		return string.replace( rdashAlpha, fcamelCase );
618
	},
619

    
620
	nodeName: function( elem, name ) {
621
		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
622
	},
623

    
624
	// args is for internal usage only
625
	each: function( object, callback, args ) {
626
		var name, i = 0,
627
			length = object.length,
628
			isObj = length === undefined || jQuery.isFunction( object );
629

    
630
		if ( args ) {
631
			if ( isObj ) {
632
				for ( name in object ) {
633
					if ( callback.apply( object[ name ], args ) === false ) {
634
						break;
635
					}
636
				}
637
			} else {
638
				for ( ; i < length; ) {
639
					if ( callback.apply( object[ i++ ], args ) === false ) {
640
						break;
641
					}
642
				}
643
			}
644

    
645
		// A special, fast, case for the most common use of each
646
		} else {
647
			if ( isObj ) {
648
				for ( name in object ) {
649
					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
650
						break;
651
					}
652
				}
653
			} else {
654
				for ( ; i < length; ) {
655
					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
656
						break;
657
					}
658
				}
659
			}
660
		}
661

    
662
		return object;
663
	},
664

    
665
	// Use native String.trim function wherever possible
666
	trim: trim ?
667
		function( text ) {
668
			return text == null ?
669
				"" :
670
				trim.call( text );
671
		} :
672

    
673
		// Otherwise use our own trimming functionality
674
		function( text ) {
675
			return text == null ?
676
				"" :
677
				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
678
		},
679

    
680
	// results is for internal usage only
681
	makeArray: function( array, results ) {
682
		var ret = results || [];
683

    
684
		if ( array != null ) {
685
			// The window, strings (and functions) also have 'length'
686
			// The extra typeof function check is to prevent crashes
687
			// in Safari 2 (See: #3039)
688
			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
689
			var type = jQuery.type( array );
690

    
691
			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
692
				push.call( ret, array );
693
			} else {
694
				jQuery.merge( ret, array );
695
			}
696
		}
697

    
698
		return ret;
699
	},
700

    
701
	inArray: function( elem, array ) {
702

    
703
		if ( indexOf ) {
704
			return indexOf.call( array, elem );
705
		}
706

    
707
		for ( var i = 0, length = array.length; i < length; i++ ) {
708
			if ( array[ i ] === elem ) {
709
				return i;
710
			}
711
		}
712

    
713
		return -1;
714
	},
715

    
716
	merge: function( first, second ) {
717
		var i = first.length,
718
			j = 0;
719

    
720
		if ( typeof second.length === "number" ) {
721
			for ( var l = second.length; j < l; j++ ) {
722
				first[ i++ ] = second[ j ];
723
			}
724

    
725
		} else {
726
			while ( second[j] !== undefined ) {
727
				first[ i++ ] = second[ j++ ];
728
			}
729
		}
730

    
731
		first.length = i;
732

    
733
		return first;
734
	},
735

    
736
	grep: function( elems, callback, inv ) {
737
		var ret = [], retVal;
738
		inv = !!inv;
739

    
740
		// Go through the array, only saving the items
741
		// that pass the validator function
742
		for ( var i = 0, length = elems.length; i < length; i++ ) {
743
			retVal = !!callback( elems[ i ], i );
744
			if ( inv !== retVal ) {
745
				ret.push( elems[ i ] );
746
			}
747
		}
748

    
749
		return ret;
750
	},
751

    
752
	// arg is for internal usage only
753
	map: function( elems, callback, arg ) {
754
		var value, key, ret = [],
755
			i = 0,
756
			length = elems.length,
757
			// jquery objects are treated as arrays
758
			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
759

    
760
		// Go through the array, translating each of the items to their
761
		if ( isArray ) {
762
			for ( ; i < length; i++ ) {
763
				value = callback( elems[ i ], i, arg );
764

    
765
				if ( value != null ) {
766
					ret[ ret.length ] = value;
767
				}
768
			}
769

    
770
		// Go through every key on the object,
771
		} else {
772
			for ( key in elems ) {
773
				value = callback( elems[ key ], key, arg );
774

    
775
				if ( value != null ) {
776
					ret[ ret.length ] = value;
777
				}
778
			}
779
		}
780

    
781
		// Flatten any nested arrays
782
		return ret.concat.apply( [], ret );
783
	},
784

    
785
	// A global GUID counter for objects
786
	guid: 1,
787

    
788
	// Bind a function to a context, optionally partially applying any
789
	// arguments.
790
	proxy: function( fn, context ) {
791
		if ( typeof context === "string" ) {
792
			var tmp = fn[ context ];
793
			context = fn;
794
			fn = tmp;
795
		}
796

    
797
		// Quick check to determine if target is callable, in the spec
798
		// this throws a TypeError, but we will just return undefined.
799
		if ( !jQuery.isFunction( fn ) ) {
800
			return undefined;
801
		}
802

    
803
		// Simulated bind
804
		var args = slice.call( arguments, 2 ),
805
			proxy = function() {
806
				return fn.apply( context, args.concat( slice.call( arguments ) ) );
807
			};
808

    
809
		// Set the guid of unique handler to the same of original handler, so it can be removed
810
		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
811

    
812
		return proxy;
813
	},
814

    
815
	// Mutifunctional method to get and set values to a collection
816
	// The value/s can optionally be executed if it's a function
817
	access: function( elems, key, value, exec, fn, pass ) {
818
		var length = elems.length;
819

    
820
		// Setting many attributes
821
		if ( typeof key === "object" ) {
822
			for ( var k in key ) {
823
				jQuery.access( elems, k, key[k], exec, fn, value );
824
			}
825
			return elems;
826
		}
827

    
828
		// Setting one attribute
829
		if ( value !== undefined ) {
830
			// Optionally, function values get executed if exec is true
831
			exec = !pass && exec && jQuery.isFunction(value);
832

    
833
			for ( var i = 0; i < length; i++ ) {
834
				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
835
			}
836

    
837
			return elems;
838
		}
839

    
840
		// Getting an attribute
841
		return length ? fn( elems[0], key ) : undefined;
842
	},
843

    
844
	now: function() {
845
		return (new Date()).getTime();
846
	},
847

    
848
	// Use of jQuery.browser is frowned upon.
849
	// More details: http://docs.jquery.com/Utilities/jQuery.browser
850
	uaMatch: function( ua ) {
851
		ua = ua.toLowerCase();
852

    
853
		var match = rwebkit.exec( ua ) ||
854
			ropera.exec( ua ) ||
855
			rmsie.exec( ua ) ||
856
			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
857
			[];
858

    
859
		return { browser: match[1] || "", version: match[2] || "0" };
860
	},
861

    
862
	sub: function() {
863
		function jQuerySub( selector, context ) {
864
			return new jQuerySub.fn.init( selector, context );
865
		}
866
		jQuery.extend( true, jQuerySub, this );
867
		jQuerySub.superclass = this;
868
		jQuerySub.fn = jQuerySub.prototype = this();
869
		jQuerySub.fn.constructor = jQuerySub;
870
		jQuerySub.sub = this.sub;
871
		jQuerySub.fn.init = function init( selector, context ) {
872
			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
873
				context = jQuerySub( context );
874
			}
875

    
876
			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
877
		};
878
		jQuerySub.fn.init.prototype = jQuerySub.fn;
879
		var rootjQuerySub = jQuerySub(document);
880
		return jQuerySub;
881
	},
882

    
883
	browser: {}
884
});
885

    
886
// Populate the class2type map
887
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
888
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
889
});
890

    
891
browserMatch = jQuery.uaMatch( userAgent );
892
if ( browserMatch.browser ) {
893
	jQuery.browser[ browserMatch.browser ] = true;
894
	jQuery.browser.version = browserMatch.version;
895
}
896

    
897
// Deprecated, use jQuery.browser.webkit instead
898
if ( jQuery.browser.webkit ) {
899
	jQuery.browser.safari = true;
900
}
901

    
902
// IE doesn't match non-breaking spaces with \s
903
if ( rnotwhite.test( "\xA0" ) ) {
904
	trimLeft = /^[\s\xA0]+/;
905
	trimRight = /[\s\xA0]+$/;
906
}
907

    
908
// All jQuery objects should point back to these
909
rootjQuery = jQuery(document);
910

    
911
// Cleanup functions for the document ready method
912
if ( document.addEventListener ) {
913
	DOMContentLoaded = function() {
914
		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
915
		jQuery.ready();
916
	};
917

    
918
} else if ( document.attachEvent ) {
919
	DOMContentLoaded = function() {
920
		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
921
		if ( document.readyState === "complete" ) {
922
			document.detachEvent( "onreadystatechange", DOMContentLoaded );
923
			jQuery.ready();
924
		}
925
	};
926
}
927

    
928
// The DOM ready check for Internet Explorer
929
function doScrollCheck() {
930
	if ( jQuery.isReady ) {
931
		return;
932
	}
933

    
934
	try {
935
		// If IE is used, use the trick by Diego Perini
936
		// http://javascript.nwbox.com/IEContentLoaded/
937
		document.documentElement.doScroll("left");
938
	} catch(e) {
939
		setTimeout( doScrollCheck, 1 );
940
		return;
941
	}
942

    
943
	// and execute any waiting functions
944
	jQuery.ready();
945
}
946

    
947
return jQuery;
948

    
949
})();
950

    
951

    
952
var // Promise methods
953
	promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ),
954
	// Static reference to slice
955
	sliceDeferred = [].slice;
956

    
957
jQuery.extend({
958
	// Create a simple deferred (one callbacks list)
959
	_Deferred: function() {
960
		var // callbacks list
961
			callbacks = [],
962
			// stored [ context , args ]
963
			fired,
964
			// to avoid firing when already doing so
965
			firing,
966
			// flag to know if the deferred has been cancelled
967
			cancelled,
968
			// the deferred itself
969
			deferred  = {
970

    
971
				// done( f1, f2, ...)
972
				done: function() {
973
					if ( !cancelled ) {
974
						var args = arguments,
975
							i,
976
							length,
977
							elem,
978
							type,
979
							_fired;
980
						if ( fired ) {
981
							_fired = fired;
982
							fired = 0;
983
						}
984
						for ( i = 0, length = args.length; i < length; i++ ) {
985
							elem = args[ i ];
986
							type = jQuery.type( elem );
987
							if ( type === "array" ) {
988
								deferred.done.apply( deferred, elem );
989
							} else if ( type === "function" ) {
990
								callbacks.push( elem );
991
							}
992
						}
993
						if ( _fired ) {
994
							deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] );
995
						}
996
					}
997
					return this;
998
				},
999

    
1000
				// resolve with given context and args
1001
				resolveWith: function( context, args ) {
1002
					if ( !cancelled && !fired && !firing ) {
1003
						// make sure args are available (#8421)
1004
						args = args || [];
1005
						firing = 1;
1006
						try {
1007
							while( callbacks[ 0 ] ) {
1008
								callbacks.shift().apply( context, args );
1009
							}
1010
						}
1011
						finally {
1012
							fired = [ context, args ];
1013
							firing = 0;
1014
						}
1015
					}
1016
					return this;
1017
				},
1018

    
1019
				// resolve with this as context and given arguments
1020
				resolve: function() {
1021
					deferred.resolveWith( this, arguments );
1022
					return this;
1023
				},
1024

    
1025
				// Has this deferred been resolved?
1026
				isResolved: function() {
1027
					return !!( firing || fired );
1028
				},
1029

    
1030
				// Cancel
1031
				cancel: function() {
1032
					cancelled = 1;
1033
					callbacks = [];
1034
					return this;
1035
				}
1036
			};
1037

    
1038
		return deferred;
1039
	},
1040

    
1041
	// Full fledged deferred (two callbacks list)
1042
	Deferred: function( func ) {
1043
		var deferred = jQuery._Deferred(),
1044
			failDeferred = jQuery._Deferred(),
1045
			promise;
1046
		// Add errorDeferred methods, then and promise
1047
		jQuery.extend( deferred, {
1048
			then: function( doneCallbacks, failCallbacks ) {
1049
				deferred.done( doneCallbacks ).fail( failCallbacks );
1050
				return this;
1051
			},
1052
			always: function() {
1053
				return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments );
1054
			},
1055
			fail: failDeferred.done,
1056
			rejectWith: failDeferred.resolveWith,
1057
			reject: failDeferred.resolve,
1058
			isRejected: failDeferred.isResolved,
1059
			pipe: function( fnDone, fnFail ) {
1060
				return jQuery.Deferred(function( newDefer ) {
1061
					jQuery.each( {
1062
						done: [ fnDone, "resolve" ],
1063
						fail: [ fnFail, "reject" ]
1064
					}, function( handler, data ) {
1065
						var fn = data[ 0 ],
1066
							action = data[ 1 ],
1067
							returned;
1068
						if ( jQuery.isFunction( fn ) ) {
1069
							deferred[ handler ](function() {
1070
								returned = fn.apply( this, arguments );
1071
								if ( returned && jQuery.isFunction( returned.promise ) ) {
1072
									returned.promise().then( newDefer.resolve, newDefer.reject );
1073
								} else {
1074
									newDefer[ action ]( returned );
1075
								}
1076
							});
1077
						} else {
1078
							deferred[ handler ]( newDefer[ action ] );
1079
						}
1080
					});
1081
				}).promise();
1082
			},
1083
			// Get a promise for this deferred
1084
			// If obj is provided, the promise aspect is added to the object
1085
			promise: function( obj ) {
1086
				if ( obj == null ) {
1087
					if ( promise ) {
1088
						return promise;
1089
					}
1090
					promise = obj = {};
1091
				}
1092
				var i = promiseMethods.length;
1093
				while( i-- ) {
1094
					obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ];
1095
				}
1096
				return obj;
1097
			}
1098
		});
1099
		// Make sure only one callback list will be used
1100
		deferred.done( failDeferred.cancel ).fail( deferred.cancel );
1101
		// Unexpose cancel
1102
		delete deferred.cancel;
1103
		// Call given func if any
1104
		if ( func ) {
1105
			func.call( deferred, deferred );
1106
		}
1107
		return deferred;
1108
	},
1109

    
1110
	// Deferred helper
1111
	when: function( firstParam ) {
1112
		var args = arguments,
1113
			i = 0,
1114
			length = args.length,
1115
			count = length,
1116
			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
1117
				firstParam :
1118
				jQuery.Deferred();
1119
		function resolveFunc( i ) {
1120
			return function( value ) {
1121
				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
1122
				if ( !( --count ) ) {
1123
					// Strange bug in FF4:
1124
					// Values changed onto the arguments object sometimes end up as undefined values
1125
					// outside the $.when method. Cloning the object into a fresh array solves the issue
1126
					deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
1127
				}
1128
			};
1129
		}
1130
		if ( length > 1 ) {
1131
			for( ; i < length; i++ ) {
1132
				if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
1133
					args[ i ].promise().then( resolveFunc(i), deferred.reject );
1134
				} else {
1135
					--count;
1136
				}
1137
			}
1138
			if ( !count ) {
1139
				deferred.resolveWith( deferred, args );
1140
			}
1141
		} else if ( deferred !== firstParam ) {
1142
			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
1143
		}
1144
		return deferred.promise();
1145
	}
1146
});
1147

    
1148

    
1149

    
1150
jQuery.support = (function() {
1151

    
1152
	var div = document.createElement( "div" ),
1153
		documentElement = document.documentElement,
1154
		all,
1155
		a,
1156
		select,
1157
		opt,
1158
		input,
1159
		marginDiv,
1160
		support,
1161
		fragment,
1162
		body,
1163
		testElementParent,
1164
		testElement,
1165
		testElementStyle,
1166
		tds,
1167
		events,
1168
		eventName,
1169
		i,
1170
		isSupported;
1171

    
1172
	// Preliminary tests
1173
	div.setAttribute("className", "t");
1174
	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
1175

    
1176
	all = div.getElementsByTagName( "*" );
1177
	a = div.getElementsByTagName( "a" )[ 0 ];
1178

    
1179
	// Can't get basic test support
1180
	if ( !all || !all.length || !a ) {
1181
		return {};
1182
	}
1183

    
1184
	// First batch of supports tests
1185
	select = document.createElement( "select" );
1186
	opt = select.appendChild( document.createElement("option") );
1187
	input = div.getElementsByTagName( "input" )[ 0 ];
1188

    
1189
	support = {
1190
		// IE strips leading whitespace when .innerHTML is used
1191
		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
1192

    
1193
		// Make sure that tbody elements aren't automatically inserted
1194
		// IE will insert them into empty tables
1195
		tbody: !div.getElementsByTagName( "tbody" ).length,
1196

    
1197
		// Make sure that link elements get serialized correctly by innerHTML
1198
		// This requires a wrapper element in IE
1199
		htmlSerialize: !!div.getElementsByTagName( "link" ).length,
1200

    
1201
		// Get the style information from getAttribute
1202
		// (IE uses .cssText instead)
1203
		style: /top/.test( a.getAttribute("style") ),
1204

    
1205
		// Make sure that URLs aren't manipulated
1206
		// (IE normalizes it by default)
1207
		hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
1208

    
1209
		// Make sure that element opacity exists
1210
		// (IE uses filter instead)
1211
		// Use a regex to work around a WebKit issue. See #5145
1212
		opacity: /^0.55$/.test( a.style.opacity ),
1213

    
1214
		// Verify style float existence
1215
		// (IE uses styleFloat instead of cssFloat)
1216
		cssFloat: !!a.style.cssFloat,
1217

    
1218
		// Make sure that if no value is specified for a checkbox
1219
		// that it defaults to "on".
1220
		// (WebKit defaults to "" instead)
1221
		checkOn: ( input.value === "on" ),
1222

    
1223
		// Make sure that a selected-by-default option has a working selected property.
1224
		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
1225
		optSelected: opt.selected,
1226

    
1227
		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
1228
		getSetAttribute: div.className !== "t",
1229

    
1230
		// Will be defined later
1231
		submitBubbles: true,
1232
		changeBubbles: true,
1233
		focusinBubbles: false,
1234
		deleteExpando: true,
1235
		noCloneEvent: true,
1236
		inlineBlockNeedsLayout: false,
1237
		shrinkWrapBlocks: false,
1238
		reliableMarginRight: true
1239
	};
1240

    
1241
	// Make sure checked status is properly cloned
1242
	input.checked = true;
1243
	support.noCloneChecked = input.cloneNode( true ).checked;
1244

    
1245
	// Make sure that the options inside disabled selects aren't marked as disabled
1246
	// (WebKit marks them as disabled)
1247
	select.disabled = true;
1248
	support.optDisabled = !opt.disabled;
1249

    
1250
	// Test to see if it's possible to delete an expando from an element
1251
	// Fails in Internet Explorer
1252
	try {
1253
		delete div.test;
1254
	} catch( e ) {
1255
		support.deleteExpando = false;
1256
	}
1257

    
1258
	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
1259
		div.attachEvent( "onclick", function() {
1260
			// Cloning a node shouldn't copy over any
1261
			// bound event handlers (IE does this)
1262
			support.noCloneEvent = false;
1263
		});
1264
		div.cloneNode( true ).fireEvent( "onclick" );
1265
	}
1266

    
1267
	// Check if a radio maintains it's value
1268
	// after being appended to the DOM
1269
	input = document.createElement("input");
1270
	input.value = "t";
1271
	input.setAttribute("type", "radio");
1272
	support.radioValue = input.value === "t";
1273

    
1274
	input.setAttribute("checked", "checked");
1275
	div.appendChild( input );
1276
	fragment = document.createDocumentFragment();
1277
	fragment.appendChild( div.firstChild );
1278

    
1279
	// WebKit doesn't clone checked state correctly in fragments
1280
	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
1281

    
1282
	div.innerHTML = "";
1283

    
1284
	// Figure out if the W3C box model works as expected
1285
	div.style.width = div.style.paddingLeft = "1px";
1286

    
1287
	body = document.getElementsByTagName( "body" )[ 0 ];
1288
	// We use our own, invisible, body unless the body is already present
1289
	// in which case we use a div (#9239)
1290
	testElement = document.createElement( body ? "div" : "body" );
1291
	testElementStyle = {
1292
		visibility: "hidden",
1293
		width: 0,
1294
		height: 0,
1295
		border: 0,
1296
		margin: 0
1297
	};
1298
	if ( body ) {
1299
		jQuery.extend( testElementStyle, {
1300
			position: "absolute",
1301
			left: -1000,
1302
			top: -1000
1303
		});
1304
	}
1305
	for ( i in testElementStyle ) {
1306
		testElement.style[ i ] = testElementStyle[ i ];
1307
	}
1308
	testElement.appendChild( div );
1309
	testElementParent = body || documentElement;
1310
	testElementParent.insertBefore( testElement, testElementParent.firstChild );
1311

    
1312
	// Check if a disconnected checkbox will retain its checked
1313
	// value of true after appended to the DOM (IE6/7)
1314
	support.appendChecked = input.checked;
1315

    
1316
	support.boxModel = div.offsetWidth === 2;
1317

    
1318
	if ( "zoom" in div.style ) {
1319
		// Check if natively block-level elements act like inline-block
1320
		// elements when setting their display to 'inline' and giving
1321
		// them layout
1322
		// (IE < 8 does this)
1323
		div.style.display = "inline";
1324
		div.style.zoom = 1;
1325
		support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
1326

    
1327
		// Check if elements with layout shrink-wrap their children
1328
		// (IE 6 does this)
1329
		div.style.display = "";
1330
		div.innerHTML = "<div style='width:4px;'></div>";
1331
		support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
1332
	}
1333

    
1334
	div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
1335
	tds = div.getElementsByTagName( "td" );
1336

    
1337
	// Check if table cells still have offsetWidth/Height when they are set
1338
	// to display:none and there are still other visible table cells in a
1339
	// table row; if so, offsetWidth/Height are not reliable for use when
1340
	// determining if an element has been hidden directly using
1341
	// display:none (it is still safe to use offsets if a parent element is
1342
	// hidden; don safety goggles and see bug #4512 for more information).
1343
	// (only IE 8 fails this test)
1344
	isSupported = ( tds[ 0 ].offsetHeight === 0 );
1345

    
1346
	tds[ 0 ].style.display = "";
1347
	tds[ 1 ].style.display = "none";
1348

    
1349
	// Check if empty table cells still have offsetWidth/Height
1350
	// (IE < 8 fail this test)
1351
	support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
1352
	div.innerHTML = "";
1353

    
1354
	// Check if div with explicit width and no margin-right incorrectly
1355
	// gets computed margin-right based on width of container. For more
1356
	// info see bug #3333
1357
	// Fails in WebKit before Feb 2011 nightlies
1358
	// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
1359
	if ( document.defaultView && document.defaultView.getComputedStyle ) {
1360
		marginDiv = document.createElement( "div" );
1361
		marginDiv.style.width = "0";
1362
		marginDiv.style.marginRight = "0";
1363
		div.appendChild( marginDiv );
1364
		support.reliableMarginRight =
1365
			( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
1366
	}
1367

    
1368
	// Remove the body element we added
1369
	testElement.innerHTML = "";
1370
	testElementParent.removeChild( testElement );
1371

    
1372
	// Technique from Juriy Zaytsev
1373
	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
1374
	// We only care about the case where non-standard event systems
1375
	// are used, namely in IE. Short-circuiting here helps us to
1376
	// avoid an eval call (in setAttribute) which can cause CSP
1377
	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
1378
	if ( div.attachEvent ) {
1379
		for( i in {
1380
			submit: 1,
1381
			change: 1,
1382
			focusin: 1
1383
		} ) {
1384
			eventName = "on" + i;
1385
			isSupported = ( eventName in div );
1386
			if ( !isSupported ) {
1387
				div.setAttribute( eventName, "return;" );
1388
				isSupported = ( typeof div[ eventName ] === "function" );
1389
			}
1390
			support[ i + "Bubbles" ] = isSupported;
1391
		}
1392
	}
1393

    
1394
	// Null connected elements to avoid leaks in IE
1395
	testElement = fragment = select = opt = body = marginDiv = div = input = null;
1396

    
1397
	return support;
1398
})();
1399

    
1400
// Keep track of boxModel
1401
jQuery.boxModel = jQuery.support.boxModel;
1402

    
1403

    
1404

    
1405

    
1406
var rbrace = /^(?:\{.*\}|\[.*\])$/,
1407
	rmultiDash = /([a-z])([A-Z])/g;
1408

    
1409
jQuery.extend({
1410
	cache: {},
1411

    
1412
	// Please use with caution
1413
	uuid: 0,
1414

    
1415
	// Unique for each copy of jQuery on the page
1416
	// Non-digits removed to match rinlinejQuery
1417
	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
1418

    
1419
	// The following elements throw uncatchable exceptions if you
1420
	// attempt to add expando properties to them.
1421
	noData: {
1422
		"embed": true,
1423
		// Ban all objects except for Flash (which handle expandos)
1424
		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
1425
		"applet": true
1426
	},
1427

    
1428
	hasData: function( elem ) {
1429
		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
1430

    
1431
		return !!elem && !isEmptyDataObject( elem );
1432
	},
1433

    
1434
	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
1435
		if ( !jQuery.acceptData( elem ) ) {
1436
			return;
1437
		}
1438

    
1439
		var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache,
1440

    
1441
			// We have to handle DOM nodes and JS objects differently because IE6-7
1442
			// can't GC object references properly across the DOM-JS boundary
1443
			isNode = elem.nodeType,
1444

    
1445
			// Only DOM nodes need the global jQuery cache; JS object data is
1446
			// attached directly to the object so GC can occur automatically
1447
			cache = isNode ? jQuery.cache : elem,
1448

    
1449
			// Only defining an ID for JS objects if its cache already exists allows
1450
			// the code to shortcut on the same path as a DOM node with no cache
1451
			id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando;
1452

    
1453
		// Avoid doing any more work than we need to when trying to get data on an
1454
		// object that has no data at all
1455
		if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) {
1456
			return;
1457
		}
1458

    
1459
		if ( !id ) {
1460
			// Only DOM nodes need a new unique ID for each element since their data
1461
			// ends up in the global cache
1462
			if ( isNode ) {
1463
				elem[ jQuery.expando ] = id = ++jQuery.uuid;
1464
			} else {
1465
				id = jQuery.expando;
1466
			}
1467
		}
1468

    
1469
		if ( !cache[ id ] ) {
1470
			cache[ id ] = {};
1471

    
1472
			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
1473
			// metadata on plain JS objects when the object is serialized using
1474
			// JSON.stringify
1475
			if ( !isNode ) {
1476
				cache[ id ].toJSON = jQuery.noop;
1477
			}
1478
		}
1479

    
1480
		// An object can be passed to jQuery.data instead of a key/value pair; this gets
1481
		// shallow copied over onto the existing cache
1482
		if ( typeof name === "object" || typeof name === "function" ) {
1483
			if ( pvt ) {
1484
				cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name);
1485
			} else {
1486
				cache[ id ] = jQuery.extend(cache[ id ], name);
1487
			}
1488
		}
1489

    
1490
		thisCache = cache[ id ];
1491

    
1492
		// Internal jQuery data is stored in a separate object inside the object's data
1493
		// cache in order to avoid key collisions between internal data and user-defined
1494
		// data
1495
		if ( pvt ) {
1496
			if ( !thisCache[ internalKey ] ) {
1497
				thisCache[ internalKey ] = {};
1498
			}
1499

    
1500
			thisCache = thisCache[ internalKey ];
1501
		}
1502

    
1503
		if ( data !== undefined ) {
1504
			thisCache[ jQuery.camelCase( name ) ] = data;
1505
		}
1506

    
1507
		// TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should
1508
		// not attempt to inspect the internal events object using jQuery.data, as this
1509
		// internal data object is undocumented and subject to change.
1510
		if ( name === "events" && !thisCache[name] ) {
1511
			return thisCache[ internalKey ] && thisCache[ internalKey ].events;
1512
		}
1513

    
1514
		return getByName ? 
1515
			// Check for both converted-to-camel and non-converted data property names
1516
			thisCache[ jQuery.camelCase( name ) ] || thisCache[ name ] :
1517
			thisCache;
1518
	},
1519

    
1520
	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
1521
		if ( !jQuery.acceptData( elem ) ) {
1522
			return;
1523
		}
1524

    
1525
		var internalKey = jQuery.expando, isNode = elem.nodeType,
1526

    
1527
			// See jQuery.data for more information
1528
			cache = isNode ? jQuery.cache : elem,
1529

    
1530
			// See jQuery.data for more information
1531
			id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
1532

    
1533
		// If there is already no cache entry for this object, there is no
1534
		// purpose in continuing
1535
		if ( !cache[ id ] ) {
1536
			return;
1537
		}
1538

    
1539
		if ( name ) {
1540
			var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ];
1541

    
1542
			if ( thisCache ) {
1543
				delete thisCache[ name ];
1544

    
1545
				// If there is no data left in the cache, we want to continue
1546
				// and let the cache object itself get destroyed
1547
				if ( !isEmptyDataObject(thisCache) ) {
1548
					return;
1549
				}
1550
			}
1551
		}
1552

    
1553
		// See jQuery.data for more information
1554
		if ( pvt ) {
1555
			delete cache[ id ][ internalKey ];
1556

    
1557
			// Don't destroy the parent cache unless the internal data object
1558
			// had been the only thing left in it
1559
			if ( !isEmptyDataObject(cache[ id ]) ) {
1560
				return;
1561
			}
1562
		}
1563

    
1564
		var internalCache = cache[ id ][ internalKey ];
1565

    
1566
		// Browsers that fail expando deletion also refuse to delete expandos on
1567
		// the window, but it will allow it on all other JS objects; other browsers
1568
		// don't care
1569
		if ( jQuery.support.deleteExpando || cache != window ) {
1570
			delete cache[ id ];
1571
		} else {
1572
			cache[ id ] = null;
1573
		}
1574

    
1575
		// We destroyed the entire user cache at once because it's faster than
1576
		// iterating through each key, but we need to continue to persist internal
1577
		// data if it existed
1578
		if ( internalCache ) {
1579
			cache[ id ] = {};
1580
			// TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery
1581
			// metadata on plain JS objects when the object is serialized using
1582
			// JSON.stringify
1583
			if ( !isNode ) {
1584
				cache[ id ].toJSON = jQuery.noop;
1585
			}
1586

    
1587
			cache[ id ][ internalKey ] = internalCache;
1588

    
1589
		// Otherwise, we need to eliminate the expando on the node to avoid
1590
		// false lookups in the cache for entries that no longer exist
1591
		} else if ( isNode ) {
1592
			// IE does not allow us to delete expando properties from nodes,
1593
			// nor does it have a removeAttribute function on Document nodes;
1594
			// we must handle all of these cases
1595
			if ( jQuery.support.deleteExpando ) {
1596
				delete elem[ jQuery.expando ];
1597
			} else if ( elem.removeAttribute ) {
1598
				elem.removeAttribute( jQuery.expando );
1599
			} else {
1600
				elem[ jQuery.expando ] = null;
1601
			}
1602
		}
1603
	},
1604

    
1605
	// For internal use only.
1606
	_data: function( elem, name, data ) {
1607
		return jQuery.data( elem, name, data, true );
1608
	},
1609

    
1610
	// A method for determining if a DOM node can handle the data expando
1611
	acceptData: function( elem ) {
1612
		if ( elem.nodeName ) {
1613
			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
1614

    
1615
			if ( match ) {
1616
				return !(match === true || elem.getAttribute("classid") !== match);
1617
			}
1618
		}
1619

    
1620
		return true;
1621
	}
1622
});
1623

    
1624
jQuery.fn.extend({
1625
	data: function( key, value ) {
1626
		var data = null;
1627

    
1628
		if ( typeof key === "undefined" ) {
1629
			if ( this.length ) {
1630
				data = jQuery.data( this[0] );
1631

    
1632
				if ( this[0].nodeType === 1 ) {
1633
			    var attr = this[0].attributes, name;
1634
					for ( var i = 0, l = attr.length; i < l; i++ ) {
1635
						name = attr[i].name;
1636

    
1637
						if ( name.indexOf( "data-" ) === 0 ) {
1638
							name = jQuery.camelCase( name.substring(5) );
1639

    
1640
							dataAttr( this[0], name, data[ name ] );
1641
						}
1642
					}
1643
				}
1644
			}
1645

    
1646
			return data;
1647

    
1648
		} else if ( typeof key === "object" ) {
1649
			return this.each(function() {
1650
				jQuery.data( this, key );
1651
			});
1652
		}
1653

    
1654
		var parts = key.split(".");
1655
		parts[1] = parts[1] ? "." + parts[1] : "";
1656

    
1657
		if ( value === undefined ) {
1658
			data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1659

    
1660
			// Try to fetch any internally stored data first
1661
			if ( data === undefined && this.length ) {
1662
				data = jQuery.data( this[0], key );
1663
				data = dataAttr( this[0], key, data );
1664
			}
1665

    
1666
			return data === undefined && parts[1] ?
1667
				this.data( parts[0] ) :
1668
				data;
1669

    
1670
		} else {
1671
			return this.each(function() {
1672
				var $this = jQuery( this ),
1673
					args = [ parts[0], value ];
1674

    
1675
				$this.triggerHandler( "setData" + parts[1] + "!", args );
1676
				jQuery.data( this, key, value );
1677
				$this.triggerHandler( "changeData" + parts[1] + "!", args );
1678
			});
1679
		}
1680
	},
1681

    
1682
	removeData: function( key ) {
1683
		return this.each(function() {
1684
			jQuery.removeData( this, key );
1685
		});
1686
	}
1687
});
1688

    
1689
function dataAttr( elem, key, data ) {
1690
	// If nothing was found internally, try to fetch any
1691
	// data from the HTML5 data-* attribute
1692
	if ( data === undefined && elem.nodeType === 1 ) {
1693
		var name = "data-" + key.replace( rmultiDash, "$1-$2" ).toLowerCase();
1694

    
1695
		data = elem.getAttribute( name );
1696

    
1697
		if ( typeof data === "string" ) {
1698
			try {
1699
				data = data === "true" ? true :
1700
				data === "false" ? false :
1701
				data === "null" ? null :
1702
				!jQuery.isNaN( data ) ? parseFloat( data ) :
1703
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
1704
					data;
1705
			} catch( e ) {}
1706

    
1707
			// Make sure we set the data so it isn't changed later
1708
			jQuery.data( elem, key, data );
1709

    
1710
		} else {
1711
			data = undefined;
1712
		}
1713
	}
1714

    
1715
	return data;
1716
}
1717

    
1718
// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON
1719
// property to be considered empty objects; this property always exists in
1720
// order to make sure JSON.stringify does not expose internal metadata
1721
function isEmptyDataObject( obj ) {
1722
	for ( var name in obj ) {
1723
		if ( name !== "toJSON" ) {
1724
			return false;
1725
		}
1726
	}
1727

    
1728
	return true;
1729
}
1730

    
1731

    
1732

    
1733

    
1734
function handleQueueMarkDefer( elem, type, src ) {
1735
	var deferDataKey = type + "defer",
1736
		queueDataKey = type + "queue",
1737
		markDataKey = type + "mark",
1738
		defer = jQuery.data( elem, deferDataKey, undefined, true );
1739
	if ( defer &&
1740
		( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) &&
1741
		( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) {
1742
		// Give room for hard-coded callbacks to fire first
1743
		// and eventually mark/queue something else on the element
1744
		setTimeout( function() {
1745
			if ( !jQuery.data( elem, queueDataKey, undefined, true ) &&
1746
				!jQuery.data( elem, markDataKey, undefined, true ) ) {
1747
				jQuery.removeData( elem, deferDataKey, true );
1748
				defer.resolve();
1749
			}
1750
		}, 0 );
1751
	}
1752
}
1753

    
1754
jQuery.extend({
1755

    
1756
	_mark: function( elem, type ) {
1757
		if ( elem ) {
1758
			type = (type || "fx") + "mark";
1759
			jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true );
1760
		}
1761
	},
1762

    
1763
	_unmark: function( force, elem, type ) {
1764
		if ( force !== true ) {
1765
			type = elem;
1766
			elem = force;
1767
			force = false;
1768
		}
1769
		if ( elem ) {
1770
			type = type || "fx";
1771
			var key = type + "mark",
1772
				count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 );
1773
			if ( count ) {
1774
				jQuery.data( elem, key, count, true );
1775
			} else {
1776
				jQuery.removeData( elem, key, true );
1777
				handleQueueMarkDefer( elem, type, "mark" );
1778
			}
1779
		}
1780
	},
1781

    
1782
	queue: function( elem, type, data ) {
1783
		if ( elem ) {
1784
			type = (type || "fx") + "queue";
1785
			var q = jQuery.data( elem, type, undefined, true );
1786
			// Speed up dequeue by getting out quickly if this is just a lookup
1787
			if ( data ) {
1788
				if ( !q || jQuery.isArray(data) ) {
1789
					q = jQuery.data( elem, type, jQuery.makeArray(data), true );
1790
				} else {
1791
					q.push( data );
1792
				}
1793
			}
1794
			return q || [];
1795
		}
1796
	},
1797

    
1798
	dequeue: function( elem, type ) {
1799
		type = type || "fx";
1800

    
1801
		var queue = jQuery.queue( elem, type ),
1802
			fn = queue.shift(),
1803
			defer;
1804

    
1805
		// If the fx queue is dequeued, always remove the progress sentinel
1806
		if ( fn === "inprogress" ) {
1807
			fn = queue.shift();
1808
		}
1809

    
1810
		if ( fn ) {
1811
			// Add a progress sentinel to prevent the fx queue from being
1812
			// automatically dequeued
1813
			if ( type === "fx" ) {
1814
				queue.unshift("inprogress");
1815
			}
1816

    
1817
			fn.call(elem, function() {
1818
				jQuery.dequeue(elem, type);
1819
			});
1820
		}
1821

    
1822
		if ( !queue.length ) {
1823
			jQuery.removeData( elem, type + "queue", true );
1824
			handleQueueMarkDefer( elem, type, "queue" );
1825
		}
1826
	}
1827
});
1828

    
1829
jQuery.fn.extend({
1830
	queue: function( type, data ) {
1831
		if ( typeof type !== "string" ) {
1832
			data = type;
1833
			type = "fx";
1834
		}
1835

    
1836
		if ( data === undefined ) {
1837
			return jQuery.queue( this[0], type );
1838
		}
1839
		return this.each(function() {
1840
			var queue = jQuery.queue( this, type, data );
1841

    
1842
			if ( type === "fx" && queue[0] !== "inprogress" ) {
1843
				jQuery.dequeue( this, type );
1844
			}
1845
		});
1846
	},
1847
	dequeue: function( type ) {
1848
		return this.each(function() {
1849
			jQuery.dequeue( this, type );
1850
		});
1851
	},
1852
	// Based off of the plugin by Clint Helfers, with permission.
1853
	// http://blindsignals.com/index.php/2009/07/jquery-delay/
1854
	delay: function( time, type ) {
1855
		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1856
		type = type || "fx";
1857

    
1858
		return this.queue( type, function() {
1859
			var elem = this;
1860
			setTimeout(function() {
1861
				jQuery.dequeue( elem, type );
1862
			}, time );
1863
		});
1864
	},
1865
	clearQueue: function( type ) {
1866
		return this.queue( type || "fx", [] );
1867
	},
1868
	// Get a promise resolved when queues of a certain type
1869
	// are emptied (fx is the type by default)
1870
	promise: function( type, object ) {
1871
		if ( typeof type !== "string" ) {
1872
			object = type;
1873
			type = undefined;
1874
		}
1875
		type = type || "fx";
1876
		var defer = jQuery.Deferred(),
1877
			elements = this,
1878
			i = elements.length,
1879
			count = 1,
1880
			deferDataKey = type + "defer",
1881
			queueDataKey = type + "queue",
1882
			markDataKey = type + "mark",
1883
			tmp;
1884
		function resolve() {
1885
			if ( !( --count ) ) {
1886
				defer.resolveWith( elements, [ elements ] );
1887
			}
1888
		}
1889
		while( i-- ) {
1890
			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
1891
					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
1892
						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
1893
					jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) {
1894
				count++;
1895
				tmp.done( resolve );
1896
			}
1897
		}
1898
		resolve();
1899
		return defer.promise();
1900
	}
1901
});
1902

    
1903

    
1904

    
1905

    
1906
var rclass = /[\n\t\r]/g,
1907
	rspace = /\s+/,
1908
	rreturn = /\r/g,
1909
	rtype = /^(?:button|input)$/i,
1910
	rfocusable = /^(?:button|input|object|select|textarea)$/i,
1911
	rclickable = /^a(?:rea)?$/i,
1912
	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
1913
	rinvalidChar = /\:|^on/,
1914
	formHook, boolHook;
1915

    
1916
jQuery.fn.extend({
1917
	attr: function( name, value ) {
1918
		return jQuery.access( this, name, value, true, jQuery.attr );
1919
	},
1920

    
1921
	removeAttr: function( name ) {
1922
		return this.each(function() {
1923
			jQuery.removeAttr( this, name );
1924
		});
1925
	},
1926
	
1927
	prop: function( name, value ) {
1928
		return jQuery.access( this, name, value, true, jQuery.prop );
1929
	},
1930
	
1931
	removeProp: function( name ) {
1932
		name = jQuery.propFix[ name ] || name;
1933
		return this.each(function() {
1934
			// try/catch handles cases where IE balks (such as removing a property on window)
1935
			try {
1936
				this[ name ] = undefined;
1937
				delete this[ name ];
1938
			} catch( e ) {}
1939
		});
1940
	},
1941

    
1942
	addClass: function( value ) {
1943
		var classNames, i, l, elem,
1944
			setClass, c, cl;
1945

    
1946
		if ( jQuery.isFunction( value ) ) {
1947
			return this.each(function( j ) {
1948
				jQuery( this ).addClass( value.call(this, j, this.className) );
1949
			});
1950
		}
1951

    
1952
		if ( value && typeof value === "string" ) {
1953
			classNames = value.split( rspace );
1954

    
1955
			for ( i = 0, l = this.length; i < l; i++ ) {
1956
				elem = this[ i ];
1957

    
1958
				if ( elem.nodeType === 1 ) {
1959
					if ( !elem.className && classNames.length === 1 ) {
1960
						elem.className = value;
1961

    
1962
					} else {
1963
						setClass = " " + elem.className + " ";
1964

    
1965
						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
1966
							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
1967
								setClass += classNames[ c ] + " ";
1968
							}
1969
						}
1970
						elem.className = jQuery.trim( setClass );
1971
					}
1972
				}
1973
			}
1974
		}
1975

    
1976
		return this;
1977
	},
1978

    
1979
	removeClass: function( value ) {
1980
		var classNames, i, l, elem, className, c, cl;
1981

    
1982
		if ( jQuery.isFunction( value ) ) {
1983
			return this.each(function( j ) {
1984
				jQuery( this ).removeClass( value.call(this, j, this.className) );
1985
			});
1986
		}
1987

    
1988
		if ( (value && typeof value === "string") || value === undefined ) {
1989
			classNames = (value || "").split( rspace );
1990

    
1991
			for ( i = 0, l = this.length; i < l; i++ ) {
1992
				elem = this[ i ];
1993

    
1994
				if ( elem.nodeType === 1 && elem.className ) {
1995
					if ( value ) {
1996
						className = (" " + elem.className + " ").replace( rclass, " " );
1997
						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
1998
							className = className.replace(" " + classNames[ c ] + " ", " ");
1999
						}
2000
						elem.className = jQuery.trim( className );
2001

    
2002
					} else {
2003
						elem.className = "";
2004
					}
2005
				}
2006
			}
2007
		}
2008

    
2009
		return this;
2010
	},
2011

    
2012
	toggleClass: function( value, stateVal ) {
2013
		var type = typeof value,
2014
			isBool = typeof stateVal === "boolean";
2015

    
2016
		if ( jQuery.isFunction( value ) ) {
2017
			return this.each(function( i ) {
2018
				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
2019
			});
2020
		}
2021

    
2022
		return this.each(function() {
2023
			if ( type === "string" ) {
2024
				// toggle individual class names
2025
				var className,
2026
					i = 0,
2027
					self = jQuery( this ),
2028
					state = stateVal,
2029
					classNames = value.split( rspace );
2030

    
2031
				while ( (className = classNames[ i++ ]) ) {
2032
					// check each className given, space separated list
2033
					state = isBool ? state : !self.hasClass( className );
2034
					self[ state ? "addClass" : "removeClass" ]( className );
2035
				}
2036

    
2037
			} else if ( type === "undefined" || type === "boolean" ) {
2038
				if ( this.className ) {
2039
					// store className if set
2040
					jQuery._data( this, "__className__", this.className );
2041
				}
2042

    
2043
				// toggle whole className
2044
				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
2045
			}
2046
		});
2047
	},
2048

    
2049
	hasClass: function( selector ) {
2050
		var className = " " + selector + " ";
2051
		for ( var i = 0, l = this.length; i < l; i++ ) {
2052
			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
2053
				return true;
2054
			}
2055
		}
2056

    
2057
		return false;
2058
	},
2059

    
2060
	val: function( value ) {
2061
		var hooks, ret,
2062
			elem = this[0];
2063
		
2064
		if ( !arguments.length ) {
2065
			if ( elem ) {
2066
				hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
2067

    
2068
				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
2069
					return ret;
2070
				}
2071

    
2072
				ret = elem.value;
2073

    
2074
				return typeof ret === "string" ? 
2075
					// handle most common string cases
2076
					ret.replace(rreturn, "") : 
2077
					// handle cases where value is null/undef or number
2078
					ret == null ? "" : ret;
2079
			}
2080

    
2081
			return undefined;
2082
		}
2083

    
2084
		var isFunction = jQuery.isFunction( value );
2085

    
2086
		return this.each(function( i ) {
2087
			var self = jQuery(this), val;
2088

    
2089
			if ( this.nodeType !== 1 ) {
2090
				return;
2091
			}
2092

    
2093
			if ( isFunction ) {
2094
				val = value.call( this, i, self.val() );
2095
			} else {
2096
				val = value;
2097
			}
2098

    
2099
			// Treat null/undefined as ""; convert numbers to string
2100
			if ( val == null ) {
2101
				val = "";
2102
			} else if ( typeof val === "number" ) {
2103
				val += "";
2104
			} else if ( jQuery.isArray( val ) ) {
2105
				val = jQuery.map(val, function ( value ) {
2106
					return value == null ? "" : value + "";
2107
				});
2108
			}
2109

    
2110
			hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
2111

    
2112
			// If set returns undefined, fall back to normal setting
2113
			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
2114
				this.value = val;
2115
			}
2116
		});
2117
	}
2118
});
2119

    
2120
jQuery.extend({
2121
	valHooks: {
2122
		option: {
2123
			get: function( elem ) {
2124
				// attributes.value is undefined in Blackberry 4.7 but
2125
				// uses .value. See #6932
2126
				var val = elem.attributes.value;
2127
				return !val || val.specified ? elem.value : elem.text;
2128
			}
2129
		},
2130
		select: {
2131
			get: function( elem ) {
2132
				var value,
2133
					index = elem.selectedIndex,
2134
					values = [],
2135
					options = elem.options,
2136
					one = elem.type === "select-one";
2137

    
2138
				// Nothing was selected
2139
				if ( index < 0 ) {
2140
					return null;
2141
				}
2142

    
2143
				// Loop through all the selected options
2144
				for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
2145
					var option = options[ i ];
2146

    
2147
					// Don't return options that are disabled or in a disabled optgroup
2148
					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
2149
							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
2150

    
2151
						// Get the specific value for the option
2152
						value = jQuery( option ).val();
2153

    
2154
						// We don't need an array for one selects
2155
						if ( one ) {
2156
							return value;
2157
						}
2158

    
2159
						// Multi-Selects return an array
2160
						values.push( value );
2161
					}
2162
				}
2163

    
2164
				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
2165
				if ( one && !values.length && options.length ) {
2166
					return jQuery( options[ index ] ).val();
2167
				}
2168

    
2169
				return values;
2170
			},
2171

    
2172
			set: function( elem, value ) {
2173
				var values = jQuery.makeArray( value );
2174

    
2175
				jQuery(elem).find("option").each(function() {
2176
					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
2177
				});
2178

    
2179
				if ( !values.length ) {
2180
					elem.selectedIndex = -1;
2181
				}
2182
				return values;
2183
			}
2184
		}
2185
	},
2186

    
2187
	attrFn: {
2188
		val: true,
2189
		css: true,
2190
		html: true,
2191
		text: true,
2192
		data: true,
2193
		width: true,
2194
		height: true,
2195
		offset: true
2196
	},
2197
	
2198
	attrFix: {
2199
		// Always normalize to ensure hook usage
2200
		tabindex: "tabIndex"
2201
	},
2202
	
2203
	attr: function( elem, name, value, pass ) {
2204
		var nType = elem.nodeType;
2205
		
2206
		// don't get/set attributes on text, comment and attribute nodes
2207
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2208
			return undefined;
2209
		}
2210

    
2211
		if ( pass && name in jQuery.attrFn ) {
2212
			return jQuery( elem )[ name ]( value );
2213
		}
2214

    
2215
		// Fallback to prop when attributes are not supported
2216
		if ( !("getAttribute" in elem) ) {
2217
			return jQuery.prop( elem, name, value );
2218
		}
2219

    
2220
		var ret, hooks,
2221
			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2222

    
2223
		// Normalize the name if needed
2224
		if ( notxml ) {
2225
			name = jQuery.attrFix[ name ] || name;
2226

    
2227
			hooks = jQuery.attrHooks[ name ];
2228

    
2229
			if ( !hooks ) {
2230
				// Use boolHook for boolean attributes
2231
				if ( rboolean.test( name ) ) {
2232

    
2233
					hooks = boolHook;
2234

    
2235
				// Use formHook for forms and if the name contains certain characters
2236
				} else if ( formHook && name !== "className" &&
2237
					(jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
2238

    
2239
					hooks = formHook;
2240
				}
2241
			}
2242
		}
2243

    
2244
		if ( value !== undefined ) {
2245

    
2246
			if ( value === null ) {
2247
				jQuery.removeAttr( elem, name );
2248
				return undefined;
2249

    
2250
			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
2251
				return ret;
2252

    
2253
			} else {
2254
				elem.setAttribute( name, "" + value );
2255
				return value;
2256
			}
2257

    
2258
		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
2259
			return ret;
2260

    
2261
		} else {
2262

    
2263
			ret = elem.getAttribute( name );
2264

    
2265
			// Non-existent attributes return null, we normalize to undefined
2266
			return ret === null ?
2267
				undefined :
2268
				ret;
2269
		}
2270
	},
2271

    
2272
	removeAttr: function( elem, name ) {
2273
		var propName;
2274
		if ( elem.nodeType === 1 ) {
2275
			name = jQuery.attrFix[ name ] || name;
2276
		
2277
			if ( jQuery.support.getSetAttribute ) {
2278
				// Use removeAttribute in browsers that support it
2279
				elem.removeAttribute( name );
2280
			} else {
2281
				jQuery.attr( elem, name, "" );
2282
				elem.removeAttributeNode( elem.getAttributeNode( name ) );
2283
			}
2284

    
2285
			// Set corresponding property to false for boolean attributes
2286
			if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) {
2287
				elem[ propName ] = false;
2288
			}
2289
		}
2290
	},
2291

    
2292
	attrHooks: {
2293
		type: {
2294
			set: function( elem, value ) {
2295
				// We can't allow the type property to be changed (since it causes problems in IE)
2296
				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
2297
					jQuery.error( "type property can't be changed" );
2298
				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
2299
					// Setting the type on a radio button after the value resets the value in IE6-9
2300
					// Reset value to it's default in case type is set after value
2301
					// This is for element creation
2302
					var val = elem.value;
2303
					elem.setAttribute( "type", value );
2304
					if ( val ) {
2305
						elem.value = val;
2306
					}
2307
					return value;
2308
				}
2309
			}
2310
		},
2311
		tabIndex: {
2312
			get: function( elem ) {
2313
				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
2314
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
2315
				var attributeNode = elem.getAttributeNode("tabIndex");
2316

    
2317
				return attributeNode && attributeNode.specified ?
2318
					parseInt( attributeNode.value, 10 ) :
2319
					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
2320
						0 :
2321
						undefined;
2322
			}
2323
		},
2324
		// Use the value property for back compat
2325
		// Use the formHook for button elements in IE6/7 (#1954)
2326
		value: {
2327
			get: function( elem, name ) {
2328
				if ( formHook && jQuery.nodeName( elem, "button" ) ) {
2329
					return formHook.get( elem, name );
2330
				}
2331
				return name in elem ?
2332
					elem.value :
2333
					null;
2334
			},
2335
			set: function( elem, value, name ) {
2336
				if ( formHook && jQuery.nodeName( elem, "button" ) ) {
2337
					return formHook.set( elem, value, name );
2338
				}
2339
				// Does not return so that setAttribute is also used
2340
				elem.value = value;
2341
			}
2342
		}
2343
	},
2344

    
2345
	propFix: {
2346
		tabindex: "tabIndex",
2347
		readonly: "readOnly",
2348
		"for": "htmlFor",
2349
		"class": "className",
2350
		maxlength: "maxLength",
2351
		cellspacing: "cellSpacing",
2352
		cellpadding: "cellPadding",
2353
		rowspan: "rowSpan",
2354
		colspan: "colSpan",
2355
		usemap: "useMap",
2356
		frameborder: "frameBorder",
2357
		contenteditable: "contentEditable"
2358
	},
2359
	
2360
	prop: function( elem, name, value ) {
2361
		var nType = elem.nodeType;
2362

    
2363
		// don't get/set properties on text, comment and attribute nodes
2364
		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
2365
			return undefined;
2366
		}
2367

    
2368
		var ret, hooks,
2369
			notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
2370

    
2371
		if ( notxml ) {
2372
			// Fix name and attach hooks
2373
			name = jQuery.propFix[ name ] || name;
2374
			hooks = jQuery.propHooks[ name ];
2375
		}
2376

    
2377
		if ( value !== undefined ) {
2378
			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
2379
				return ret;
2380

    
2381
			} else {
2382
				return (elem[ name ] = value);
2383
			}
2384

    
2385
		} else {
2386
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== undefined ) {
2387
				return ret;
2388

    
2389
			} else {
2390
				return elem[ name ];
2391
			}
2392
		}
2393
	},
2394
	
2395
	propHooks: {}
2396
});
2397

    
2398
// Hook for boolean attributes
2399
boolHook = {
2400
	get: function( elem, name ) {
2401
		// Align boolean attributes with corresponding properties
2402
		return jQuery.prop( elem, name ) ?
2403
			name.toLowerCase() :
2404
			undefined;
2405
	},
2406
	set: function( elem, value, name ) {
2407
		var propName;
2408
		if ( value === false ) {
2409
			// Remove boolean attributes when set to false
2410
			jQuery.removeAttr( elem, name );
2411
		} else {
2412
			// value is true since we know at this point it's type boolean and not false
2413
			// Set boolean attributes to the same name and set the DOM property
2414
			propName = jQuery.propFix[ name ] || name;
2415
			if ( propName in elem ) {
2416
				// Only set the IDL specifically if it already exists on the element
2417
				elem[ propName ] = true;
2418
			}
2419

    
2420
			elem.setAttribute( name, name.toLowerCase() );
2421
		}
2422
		return name;
2423
	}
2424
};
2425

    
2426
// IE6/7 do not support getting/setting some attributes with get/setAttribute
2427
if ( !jQuery.support.getSetAttribute ) {
2428

    
2429
	// propFix is more comprehensive and contains all fixes
2430
	jQuery.attrFix = jQuery.propFix;
2431
	
2432
	// Use this for any attribute on a form in IE6/7
2433
	formHook = jQuery.attrHooks.name = jQuery.attrHooks.title = jQuery.valHooks.button = {
2434
		get: function( elem, name ) {
2435
			var ret;
2436
			ret = elem.getAttributeNode( name );
2437
			// Return undefined if nodeValue is empty string
2438
			return ret && ret.nodeValue !== "" ?
2439
				ret.nodeValue :
2440
				undefined;
2441
		},
2442
		set: function( elem, value, name ) {
2443
			// Check form objects in IE (multiple bugs related)
2444
			// Only use nodeValue if the attribute node exists on the form
2445
			var ret = elem.getAttributeNode( name );
2446
			if ( ret ) {
2447
				ret.nodeValue = value;
2448
				return value;
2449
			}
2450
		}
2451
	};
2452

    
2453
	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
2454
	// This is for removals
2455
	jQuery.each([ "width", "height" ], function( i, name ) {
2456
		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2457
			set: function( elem, value ) {
2458
				if ( value === "" ) {
2459
					elem.setAttribute( name, "auto" );
2460
					return value;
2461
				}
2462
			}
2463
		});
2464
	});
2465
}
2466

    
2467

    
2468
// Some attributes require a special call on IE
2469
if ( !jQuery.support.hrefNormalized ) {
2470
	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
2471
		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
2472
			get: function( elem ) {
2473
				var ret = elem.getAttribute( name, 2 );
2474
				return ret === null ? undefined : ret;
2475
			}
2476
		});
2477
	});
2478
}
2479

    
2480
if ( !jQuery.support.style ) {
2481
	jQuery.attrHooks.style = {
2482
		get: function( elem ) {
2483
			// Return undefined in the case of empty string
2484
			// Normalize to lowercase since IE uppercases css property names
2485
			return elem.style.cssText.toLowerCase() || undefined;
2486
		},
2487
		set: function( elem, value ) {
2488
			return (elem.style.cssText = "" + value);
2489
		}
2490
	};
2491
}
2492

    
2493
// Safari mis-reports the default selected property of an option
2494
// Accessing the parent's selectedIndex property fixes it
2495
if ( !jQuery.support.optSelected ) {
2496
	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
2497
		get: function( elem ) {
2498
			var parent = elem.parentNode;
2499

    
2500
			if ( parent ) {
2501
				parent.selectedIndex;
2502

    
2503
				// Make sure that it also works with optgroups, see #5701
2504
				if ( parent.parentNode ) {
2505
					parent.parentNode.selectedIndex;
2506
				}
2507
			}
2508
		}
2509
	});
2510
}
2511

    
2512
// Radios and checkboxes getter/setter
2513
if ( !jQuery.support.checkOn ) {
2514
	jQuery.each([ "radio", "checkbox" ], function() {
2515
		jQuery.valHooks[ this ] = {
2516
			get: function( elem ) {
2517
				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
2518
				return elem.getAttribute("value") === null ? "on" : elem.value;
2519
			}
2520
		};
2521
	});
2522
}
2523
jQuery.each([ "radio", "checkbox" ], function() {
2524
	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
2525
		set: function( elem, value ) {
2526
			if ( jQuery.isArray( value ) ) {
2527
				return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0);
2528
			}
2529
		}
2530
	});
2531
});
2532

    
2533

    
2534

    
2535

    
2536
var rnamespaces = /\.(.*)$/,
2537
	rformElems = /^(?:textarea|input|select)$/i,
2538
	rperiod = /\./g,
2539
	rspaces = / /g,
2540
	rescape = /[^\w\s.|`]/g,
2541
	fcleanup = function( nm ) {
2542
		return nm.replace(rescape, "\\$&");
2543
	};
2544

    
2545
/*
2546
 * A number of helper functions used for managing events.
2547
 * Many of the ideas behind this code originated from
2548
 * Dean Edwards' addEvent library.
2549
 */
2550
jQuery.event = {
2551

    
2552
	// Bind an event to an element
2553
	// Original by Dean Edwards
2554
	add: function( elem, types, handler, data ) {
2555
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2556
			return;
2557
		}
2558

    
2559
		if ( handler === false ) {
2560
			handler = returnFalse;
2561
		} else if ( !handler ) {
2562
			// Fixes bug #7229. Fix recommended by jdalton
2563
			return;
2564
		}
2565

    
2566
		var handleObjIn, handleObj;
2567

    
2568
		if ( handler.handler ) {
2569
			handleObjIn = handler;
2570
			handler = handleObjIn.handler;
2571
		}
2572

    
2573
		// Make sure that the function being executed has a unique ID
2574
		if ( !handler.guid ) {
2575
			handler.guid = jQuery.guid++;
2576
		}
2577

    
2578
		// Init the element's event structure
2579
		var elemData = jQuery._data( elem );
2580

    
2581
		// If no elemData is found then we must be trying to bind to one of the
2582
		// banned noData elements
2583
		if ( !elemData ) {
2584
			return;
2585
		}
2586

    
2587
		var events = elemData.events,
2588
			eventHandle = elemData.handle;
2589

    
2590
		if ( !events ) {
2591
			elemData.events = events = {};
2592
		}
2593

    
2594
		if ( !eventHandle ) {
2595
			elemData.handle = eventHandle = function( e ) {
2596
				// Discard the second event of a jQuery.event.trigger() and
2597
				// when an event is called after a page has unloaded
2598
				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
2599
					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
2600
					undefined;
2601
			};
2602
		}
2603

    
2604
		// Add elem as a property of the handle function
2605
		// This is to prevent a memory leak with non-native events in IE.
2606
		eventHandle.elem = elem;
2607

    
2608
		// Handle multiple events separated by a space
2609
		// jQuery(...).bind("mouseover mouseout", fn);
2610
		types = types.split(" ");
2611

    
2612
		var type, i = 0, namespaces;
2613

    
2614
		while ( (type = types[ i++ ]) ) {
2615
			handleObj = handleObjIn ?
2616
				jQuery.extend({}, handleObjIn) :
2617
				{ handler: handler, data: data };
2618

    
2619
			// Namespaced event handlers
2620
			if ( type.indexOf(".") > -1 ) {
2621
				namespaces = type.split(".");
2622
				type = namespaces.shift();
2623
				handleObj.namespace = namespaces.slice(0).sort().join(".");
2624

    
2625
			} else {
2626
				namespaces = [];
2627
				handleObj.namespace = "";
2628
			}
2629

    
2630
			handleObj.type = type;
2631
			if ( !handleObj.guid ) {
2632
				handleObj.guid = handler.guid;
2633
			}
2634

    
2635
			// Get the current list of functions bound to this event
2636
			var handlers = events[ type ],
2637
				special = jQuery.event.special[ type ] || {};
2638

    
2639
			// Init the event handler queue
2640
			if ( !handlers ) {
2641
				handlers = events[ type ] = [];
2642

    
2643
				// Check for a special event handler
2644
				// Only use addEventListener/attachEvent if the special
2645
				// events handler returns false
2646
				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
2647
					// Bind the global event handler to the element
2648
					if ( elem.addEventListener ) {
2649
						elem.addEventListener( type, eventHandle, false );
2650

    
2651
					} else if ( elem.attachEvent ) {
2652
						elem.attachEvent( "on" + type, eventHandle );
2653
					}
2654
				}
2655
			}
2656

    
2657
			if ( special.add ) {
2658
				special.add.call( elem, handleObj );
2659

    
2660
				if ( !handleObj.handler.guid ) {
2661
					handleObj.handler.guid = handler.guid;
2662
				}
2663
			}
2664

    
2665
			// Add the function to the element's handler list
2666
			handlers.push( handleObj );
2667

    
2668
			// Keep track of which events have been used, for event optimization
2669
			jQuery.event.global[ type ] = true;
2670
		}
2671

    
2672
		// Nullify elem to prevent memory leaks in IE
2673
		elem = null;
2674
	},
2675

    
2676
	global: {},
2677

    
2678
	// Detach an event or set of events from an element
2679
	remove: function( elem, types, handler, pos ) {
2680
		// don't do events on text and comment nodes
2681
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2682
			return;
2683
		}
2684

    
2685
		if ( handler === false ) {
2686
			handler = returnFalse;
2687
		}
2688

    
2689
		var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
2690
			elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
2691
			events = elemData && elemData.events;
2692

    
2693
		if ( !elemData || !events ) {
2694
			return;
2695
		}
2696

    
2697
		// types is actually an event object here
2698
		if ( types && types.type ) {
2699
			handler = types.handler;
2700
			types = types.type;
2701
		}
2702

    
2703
		// Unbind all events for the element
2704
		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
2705
			types = types || "";
2706

    
2707
			for ( type in events ) {
2708
				jQuery.event.remove( elem, type + types );
2709
			}
2710

    
2711
			return;
2712
		}
2713

    
2714
		// Handle multiple events separated by a space
2715
		// jQuery(...).unbind("mouseover mouseout", fn);
2716
		types = types.split(" ");
2717

    
2718
		while ( (type = types[ i++ ]) ) {
2719
			origType = type;
2720
			handleObj = null;
2721
			all = type.indexOf(".") < 0;
2722
			namespaces = [];
2723

    
2724
			if ( !all ) {
2725
				// Namespaced event handlers
2726
				namespaces = type.split(".");
2727
				type = namespaces.shift();
2728

    
2729
				namespace = new RegExp("(^|\\.)" +
2730
					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)");
2731
			}
2732

    
2733
			eventType = events[ type ];
2734

    
2735
			if ( !eventType ) {
2736
				continue;
2737
			}
2738

    
2739
			if ( !handler ) {
2740
				for ( j = 0; j < eventType.length; j++ ) {
2741
					handleObj = eventType[ j ];
2742

    
2743
					if ( all || namespace.test( handleObj.namespace ) ) {
2744
						jQuery.event.remove( elem, origType, handleObj.handler, j );
2745
						eventType.splice( j--, 1 );
2746
					}
2747
				}
2748

    
2749
				continue;
2750
			}
2751

    
2752
			special = jQuery.event.special[ type ] || {};
2753

    
2754
			for ( j = pos || 0; j < eventType.length; j++ ) {
2755
				handleObj = eventType[ j ];
2756

    
2757
				if ( handler.guid === handleObj.guid ) {
2758
					// remove the given handler for the given type
2759
					if ( all || namespace.test( handleObj.namespace ) ) {
2760
						if ( pos == null ) {
2761
							eventType.splice( j--, 1 );
2762
						}
2763

    
2764
						if ( special.remove ) {
2765
							special.remove.call( elem, handleObj );
2766
						}
2767
					}
2768

    
2769
					if ( pos != null ) {
2770
						break;
2771
					}
2772
				}
2773
			}
2774

    
2775
			// remove generic event handler if no more handlers exist
2776
			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
2777
				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
2778
					jQuery.removeEvent( elem, type, elemData.handle );
2779
				}
2780

    
2781
				ret = null;
2782
				delete events[ type ];
2783
			}
2784
		}
2785

    
2786
		// Remove the expando if it's no longer used
2787
		if ( jQuery.isEmptyObject( events ) ) {
2788
			var handle = elemData.handle;
2789
			if ( handle ) {
2790
				handle.elem = null;
2791
			}
2792

    
2793
			delete elemData.events;
2794
			delete elemData.handle;
2795

    
2796
			if ( jQuery.isEmptyObject( elemData ) ) {
2797
				jQuery.removeData( elem, undefined, true );
2798
			}
2799
		}
2800
	},
2801
	
2802
	// Events that are safe to short-circuit if no handlers are attached.
2803
	// Native DOM events should not be added, they may have inline handlers.
2804
	customEvent: {
2805
		"getData": true,
2806
		"setData": true,
2807
		"changeData": true
2808
	},
2809

    
2810
	trigger: function( event, data, elem, onlyHandlers ) {
2811
		// Event object or event type
2812
		var type = event.type || event,
2813
			namespaces = [],
2814
			exclusive;
2815

    
2816
		if ( type.indexOf("!") >= 0 ) {
2817
			// Exclusive events trigger only for the exact event (no namespaces)
2818
			type = type.slice(0, -1);
2819
			exclusive = true;
2820
		}
2821

    
2822
		if ( type.indexOf(".") >= 0 ) {
2823
			// Namespaced trigger; create a regexp to match event type in handle()
2824
			namespaces = type.split(".");
2825
			type = namespaces.shift();
2826
			namespaces.sort();
2827
		}
2828

    
2829
		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
2830
			// No jQuery handlers for this event type, and it can't have inline handlers
2831
			return;
2832
		}
2833

    
2834
		// Caller can pass in an Event, Object, or just an event type string
2835
		event = typeof event === "object" ?
2836
			// jQuery.Event object
2837
			event[ jQuery.expando ] ? event :
2838
			// Object literal
2839
			new jQuery.Event( type, event ) :
2840
			// Just the event type (string)
2841
			new jQuery.Event( type );
2842

    
2843
		event.type = type;
2844
		event.exclusive = exclusive;
2845
		event.namespace = namespaces.join(".");
2846
		event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)");
2847
		
2848
		// triggerHandler() and global events don't bubble or run the default action
2849
		if ( onlyHandlers || !elem ) {
2850
			event.preventDefault();
2851
			event.stopPropagation();
2852
		}
2853

    
2854
		// Handle a global trigger
2855
		if ( !elem ) {
2856
			// TODO: Stop taunting the data cache; remove global events and always attach to document
2857
			jQuery.each( jQuery.cache, function() {
2858
				// internalKey variable is just used to make it easier to find
2859
				// and potentially change this stuff later; currently it just
2860
				// points to jQuery.expando
2861
				var internalKey = jQuery.expando,
2862
					internalCache = this[ internalKey ];
2863
				if ( internalCache && internalCache.events && internalCache.events[ type ] ) {
2864
					jQuery.event.trigger( event, data, internalCache.handle.elem );
2865
				}
2866
			});
2867
			return;
2868
		}
2869

    
2870
		// Don't do events on text and comment nodes
2871
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
2872
			return;
2873
		}
2874

    
2875
		// Clean up the event in case it is being reused
2876
		event.result = undefined;
2877
		event.target = elem;
2878

    
2879
		// Clone any incoming data and prepend the event, creating the handler arg list
2880
		data = data != null ? jQuery.makeArray( data ) : [];
2881
		data.unshift( event );
2882

    
2883
		var cur = elem,
2884
			// IE doesn't like method names with a colon (#3533, #8272)
2885
			ontype = type.indexOf(":") < 0 ? "on" + type : "";
2886

    
2887
		// Fire event on the current element, then bubble up the DOM tree
2888
		do {
2889
			var handle = jQuery._data( cur, "handle" );
2890

    
2891
			event.currentTarget = cur;
2892
			if ( handle ) {
2893
				handle.apply( cur, data );
2894
			}
2895

    
2896
			// Trigger an inline bound script
2897
			if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) {
2898
				event.result = false;
2899
				event.preventDefault();
2900
			}
2901

    
2902
			// Bubble up to document, then to window
2903
			cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window;
2904
		} while ( cur && !event.isPropagationStopped() );
2905

    
2906
		// If nobody prevented the default action, do it now
2907
		if ( !event.isDefaultPrevented() ) {
2908
			var old,
2909
				special = jQuery.event.special[ type ] || {};
2910

    
2911
			if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) &&
2912
				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
2913

    
2914
				// Call a native DOM method on the target with the same name name as the event.
2915
				// Can't use an .isFunction)() check here because IE6/7 fails that test.
2916
				// IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch.
2917
				try {
2918
					if ( ontype && elem[ type ] ) {
2919
						// Don't re-trigger an onFOO event when we call its FOO() method
2920
						old = elem[ ontype ];
2921

    
2922
						if ( old ) {
2923
							elem[ ontype ] = null;
2924
						}
2925

    
2926
						jQuery.event.triggered = type;
2927
						elem[ type ]();
2928
					}
2929
				} catch ( ieError ) {}
2930

    
2931
				if ( old ) {
2932
					elem[ ontype ] = old;
2933
				}
2934

    
2935
				jQuery.event.triggered = undefined;
2936
			}
2937
		}
2938
		
2939
		return event.result;
2940
	},
2941

    
2942
	handle: function( event ) {
2943
		event = jQuery.event.fix( event || window.event );
2944
		// Snapshot the handlers list since a called handler may add/remove events.
2945
		var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0),
2946
			run_all = !event.exclusive && !event.namespace,
2947
			args = Array.prototype.slice.call( arguments, 0 );
2948

    
2949
		// Use the fix-ed Event rather than the (read-only) native event
2950
		args[0] = event;
2951
		event.currentTarget = this;
2952

    
2953
		for ( var j = 0, l = handlers.length; j < l; j++ ) {
2954
			var handleObj = handlers[ j ];
2955

    
2956
			// Triggered event must 1) be non-exclusive and have no namespace, or
2957
			// 2) have namespace(s) a subset or equal to those in the bound event.
2958
			if ( run_all || event.namespace_re.test( handleObj.namespace ) ) {
2959
				// Pass in a reference to the handler function itself
2960
				// So that we can later remove it
2961
				event.handler = handleObj.handler;
2962
				event.data = handleObj.data;
2963
				event.handleObj = handleObj;
2964

    
2965
				var ret = handleObj.handler.apply( this, args );
2966

    
2967
				if ( ret !== undefined ) {
2968
					event.result = ret;
2969
					if ( ret === false ) {
2970
						event.preventDefault();
2971
						event.stopPropagation();
2972
					}
2973
				}
2974

    
2975
				if ( event.isImmediatePropagationStopped() ) {
2976
					break;
2977
				}
2978
			}
2979
		}
2980
		return event.result;
2981
	},
2982

    
2983
	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(" "),
2984

    
2985
	fix: function( event ) {
2986
		if ( event[ jQuery.expando ] ) {
2987
			return event;
2988
		}
2989

    
2990
		// store a copy of the original event object
2991
		// and "clone" to set read-only properties
2992
		var originalEvent = event;
2993
		event = jQuery.Event( originalEvent );
2994

    
2995
		for ( var i = this.props.length, prop; i; ) {
2996
			prop = this.props[ --i ];
2997
			event[ prop ] = originalEvent[ prop ];
2998
		}
2999

    
3000
		// Fix target property, if necessary
3001
		if ( !event.target ) {
3002
			// Fixes #1925 where srcElement might not be defined either
3003
			event.target = event.srcElement || document;
3004
		}
3005

    
3006
		// check if target is a textnode (safari)
3007
		if ( event.target.nodeType === 3 ) {
3008
			event.target = event.target.parentNode;
3009
		}
3010

    
3011
		// Add relatedTarget, if necessary
3012
		if ( !event.relatedTarget && event.fromElement ) {
3013
			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
3014
		}
3015

    
3016
		// Calculate pageX/Y if missing and clientX/Y available
3017
		if ( event.pageX == null && event.clientX != null ) {
3018
			var eventDocument = event.target.ownerDocument || document,
3019
				doc = eventDocument.documentElement,
3020
				body = eventDocument.body;
3021

    
3022
			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
3023
			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
3024
		}
3025

    
3026
		// Add which for key events
3027
		if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
3028
			event.which = event.charCode != null ? event.charCode : event.keyCode;
3029
		}
3030

    
3031
		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
3032
		if ( !event.metaKey && event.ctrlKey ) {
3033
			event.metaKey = event.ctrlKey;
3034
		}
3035

    
3036
		// Add which for click: 1 === left; 2 === middle; 3 === right
3037
		// Note: button is not normalized, so don't use it
3038
		if ( !event.which && event.button !== undefined ) {
3039
			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
3040
		}
3041

    
3042
		return event;
3043
	},
3044

    
3045
	// Deprecated, use jQuery.guid instead
3046
	guid: 1E8,
3047

    
3048
	// Deprecated, use jQuery.proxy instead
3049
	proxy: jQuery.proxy,
3050

    
3051
	special: {
3052
		ready: {
3053
			// Make sure the ready event is setup
3054
			setup: jQuery.bindReady,
3055
			teardown: jQuery.noop
3056
		},
3057

    
3058
		live: {
3059
			add: function( handleObj ) {
3060
				jQuery.event.add( this,
3061
					liveConvert( handleObj.origType, handleObj.selector ),
3062
					jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) );
3063
			},
3064

    
3065
			remove: function( handleObj ) {
3066
				jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj );
3067
			}
3068
		},
3069

    
3070
		beforeunload: {
3071
			setup: function( data, namespaces, eventHandle ) {
3072
				// We only want to do this special case on windows
3073
				if ( jQuery.isWindow( this ) ) {
3074
					this.onbeforeunload = eventHandle;
3075
				}
3076
			},
3077

    
3078
			teardown: function( namespaces, eventHandle ) {
3079
				if ( this.onbeforeunload === eventHandle ) {
3080
					this.onbeforeunload = null;
3081
				}
3082
			}
3083
		}
3084
	}
3085
};
3086

    
3087
jQuery.removeEvent = document.removeEventListener ?
3088
	function( elem, type, handle ) {
3089
		if ( elem.removeEventListener ) {
3090
			elem.removeEventListener( type, handle, false );
3091
		}
3092
	} :
3093
	function( elem, type, handle ) {
3094
		if ( elem.detachEvent ) {
3095
			elem.detachEvent( "on" + type, handle );
3096
		}
3097
	};
3098

    
3099
jQuery.Event = function( src, props ) {
3100
	// Allow instantiation without the 'new' keyword
3101
	if ( !this.preventDefault ) {
3102
		return new jQuery.Event( src, props );
3103
	}
3104

    
3105
	// Event object
3106
	if ( src && src.type ) {
3107
		this.originalEvent = src;
3108
		this.type = src.type;
3109

    
3110
		// Events bubbling up the document may have been marked as prevented
3111
		// by a handler lower down the tree; reflect the correct value.
3112
		this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
3113
			src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
3114

    
3115
	// Event type
3116
	} else {
3117
		this.type = src;
3118
	}
3119

    
3120
	// Put explicitly provided properties onto the event object
3121
	if ( props ) {
3122
		jQuery.extend( this, props );
3123
	}
3124

    
3125
	// timeStamp is buggy for some events on Firefox(#3843)
3126
	// So we won't rely on the native value
3127
	this.timeStamp = jQuery.now();
3128

    
3129
	// Mark it as fixed
3130
	this[ jQuery.expando ] = true;
3131
};
3132

    
3133
function returnFalse() {
3134
	return false;
3135
}
3136
function returnTrue() {
3137
	return true;
3138
}
3139

    
3140
// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
3141
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
3142
jQuery.Event.prototype = {
3143
	preventDefault: function() {
3144
		this.isDefaultPrevented = returnTrue;
3145

    
3146
		var e = this.originalEvent;
3147
		if ( !e ) {
3148
			return;
3149
		}
3150

    
3151
		// if preventDefault exists run it on the original event
3152
		if ( e.preventDefault ) {
3153
			e.preventDefault();
3154

    
3155
		// otherwise set the returnValue property of the original event to false (IE)
3156
		} else {
3157
			e.returnValue = false;
3158
		}
3159
	},
3160
	stopPropagation: function() {
3161
		this.isPropagationStopped = returnTrue;
3162

    
3163
		var e = this.originalEvent;
3164
		if ( !e ) {
3165
			return;
3166
		}
3167
		// if stopPropagation exists run it on the original event
3168
		if ( e.stopPropagation ) {
3169
			e.stopPropagation();
3170
		}
3171
		// otherwise set the cancelBubble property of the original event to true (IE)
3172
		e.cancelBubble = true;
3173
	},
3174
	stopImmediatePropagation: function() {
3175
		this.isImmediatePropagationStopped = returnTrue;
3176
		this.stopPropagation();
3177
	},
3178
	isDefaultPrevented: returnFalse,
3179
	isPropagationStopped: returnFalse,
3180
	isImmediatePropagationStopped: returnFalse
3181
};
3182

    
3183
// Checks if an event happened on an element within another element
3184
// Used in jQuery.event.special.mouseenter and mouseleave handlers
3185
var withinElement = function( event ) {
3186

    
3187
	// Check if mouse(over|out) are still within the same parent element
3188
	var related = event.relatedTarget,
3189
		inside = false,
3190
		eventType = event.type;
3191

    
3192
	event.type = event.data;
3193

    
3194
	if ( related !== this ) {
3195

    
3196
		if ( related ) {
3197
			inside = jQuery.contains( this, related );
3198
		}
3199

    
3200
		if ( !inside ) {
3201

    
3202
			jQuery.event.handle.apply( this, arguments );
3203

    
3204
			event.type = eventType;
3205
		}
3206
	}
3207
},
3208

    
3209
// In case of event delegation, we only need to rename the event.type,
3210
// liveHandler will take care of the rest.
3211
delegate = function( event ) {
3212
	event.type = event.data;
3213
	jQuery.event.handle.apply( this, arguments );
3214
};
3215

    
3216
// Create mouseenter and mouseleave events
3217
jQuery.each({
3218
	mouseenter: "mouseover",
3219
	mouseleave: "mouseout"
3220
}, function( orig, fix ) {
3221
	jQuery.event.special[ orig ] = {
3222
		setup: function( data ) {
3223
			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
3224
		},
3225
		teardown: function( data ) {
3226
			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
3227
		}
3228
	};
3229
});
3230

    
3231
// submit delegation
3232
if ( !jQuery.support.submitBubbles ) {
3233

    
3234
	jQuery.event.special.submit = {
3235
		setup: function( data, namespaces ) {
3236
			if ( !jQuery.nodeName( this, "form" ) ) {
3237
				jQuery.event.add(this, "click.specialSubmit", function( e ) {
3238
					var elem = e.target,
3239
						type = elem.type;
3240

    
3241
					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
3242
						trigger( "submit", this, arguments );
3243
					}
3244
				});
3245

    
3246
				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
3247
					var elem = e.target,
3248
						type = elem.type;
3249

    
3250
					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
3251
						trigger( "submit", this, arguments );
3252
					}
3253
				});
3254

    
3255
			} else {
3256
				return false;
3257
			}
3258
		},
3259

    
3260
		teardown: function( namespaces ) {
3261
			jQuery.event.remove( this, ".specialSubmit" );
3262
		}
3263
	};
3264

    
3265
}
3266

    
3267
// change delegation, happens here so we have bind.
3268
if ( !jQuery.support.changeBubbles ) {
3269

    
3270
	var changeFilters,
3271

    
3272
	getVal = function( elem ) {
3273
		var type = elem.type, val = elem.value;
3274

    
3275
		if ( type === "radio" || type === "checkbox" ) {
3276
			val = elem.checked;
3277

    
3278
		} else if ( type === "select-multiple" ) {
3279
			val = elem.selectedIndex > -1 ?
3280
				jQuery.map( elem.options, function( elem ) {
3281
					return elem.selected;
3282
				}).join("-") :
3283
				"";
3284

    
3285
		} else if ( jQuery.nodeName( elem, "select" ) ) {
3286
			val = elem.selectedIndex;
3287
		}
3288

    
3289
		return val;
3290
	},
3291

    
3292
	testChange = function testChange( e ) {
3293
		var elem = e.target, data, val;
3294

    
3295
		if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) {
3296
			return;
3297
		}
3298

    
3299
		data = jQuery._data( elem, "_change_data" );
3300
		val = getVal(elem);
3301

    
3302
		// the current data will be also retrieved by beforeactivate
3303
		if ( e.type !== "focusout" || elem.type !== "radio" ) {
3304
			jQuery._data( elem, "_change_data", val );
3305
		}
3306

    
3307
		if ( data === undefined || val === data ) {
3308
			return;
3309
		}
3310

    
3311
		if ( data != null || val ) {
3312
			e.type = "change";
3313
			e.liveFired = undefined;
3314
			jQuery.event.trigger( e, arguments[1], elem );
3315
		}
3316
	};
3317

    
3318
	jQuery.event.special.change = {
3319
		filters: {
3320
			focusout: testChange,
3321

    
3322
			beforedeactivate: testChange,
3323

    
3324
			click: function( e ) {
3325
				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
3326

    
3327
				if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) {
3328
					testChange.call( this, e );
3329
				}
3330
			},
3331

    
3332
			// Change has to be called before submit
3333
			// Keydown will be called before keypress, which is used in submit-event delegation
3334
			keydown: function( e ) {
3335
				var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : "";
3336

    
3337
				if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) ||
3338
					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
3339
					type === "select-multiple" ) {
3340
					testChange.call( this, e );
3341
				}
3342
			},
3343

    
3344
			// Beforeactivate happens also before the previous element is blurred
3345
			// with this event you can't trigger a change event, but you can store
3346
			// information
3347
			beforeactivate: function( e ) {
3348
				var elem = e.target;
3349
				jQuery._data( elem, "_change_data", getVal(elem) );
3350
			}
3351
		},
3352

    
3353
		setup: function( data, namespaces ) {
3354
			if ( this.type === "file" ) {
3355
				return false;
3356
			}
3357

    
3358
			for ( var type in changeFilters ) {
3359
				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
3360
			}
3361

    
3362
			return rformElems.test( this.nodeName );
3363
		},
3364

    
3365
		teardown: function( namespaces ) {
3366
			jQuery.event.remove( this, ".specialChange" );
3367

    
3368
			return rformElems.test( this.nodeName );
3369
		}
3370
	};
3371

    
3372
	changeFilters = jQuery.event.special.change.filters;
3373

    
3374
	// Handle when the input is .focus()'d
3375
	changeFilters.focus = changeFilters.beforeactivate;
3376
}
3377

    
3378
function trigger( type, elem, args ) {
3379
	// Piggyback on a donor event to simulate a different one.
3380
	// Fake originalEvent to avoid donor's stopPropagation, but if the
3381
	// simulated event prevents default then we do the same on the donor.
3382
	// Don't pass args or remember liveFired; they apply to the donor event.
3383
	var event = jQuery.extend( {}, args[ 0 ] );
3384
	event.type = type;
3385
	event.originalEvent = {};
3386
	event.liveFired = undefined;
3387
	jQuery.event.handle.call( elem, event );
3388
	if ( event.isDefaultPrevented() ) {
3389
		args[ 0 ].preventDefault();
3390
	}
3391
}
3392

    
3393
// Create "bubbling" focus and blur events
3394
if ( !jQuery.support.focusinBubbles ) {
3395
	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
3396

    
3397
		// Attach a single capturing handler while someone wants focusin/focusout
3398
		var attaches = 0;
3399

    
3400
		jQuery.event.special[ fix ] = {
3401
			setup: function() {
3402
				if ( attaches++ === 0 ) {
3403
					document.addEventListener( orig, handler, true );
3404
				}
3405
			},
3406
			teardown: function() {
3407
				if ( --attaches === 0 ) {
3408
					document.removeEventListener( orig, handler, true );
3409
				}
3410
			}
3411
		};
3412

    
3413
		function handler( donor ) {
3414
			// Donor event is always a native one; fix it and switch its type.
3415
			// Let focusin/out handler cancel the donor focus/blur event.
3416
			var e = jQuery.event.fix( donor );
3417
			e.type = fix;
3418
			e.originalEvent = {};
3419
			jQuery.event.trigger( e, null, e.target );
3420
			if ( e.isDefaultPrevented() ) {
3421
				donor.preventDefault();
3422
			}
3423
		}
3424
	});
3425
}
3426

    
3427
jQuery.each(["bind", "one"], function( i, name ) {
3428
	jQuery.fn[ name ] = function( type, data, fn ) {
3429
		var handler;
3430

    
3431
		// Handle object literals
3432
		if ( typeof type === "object" ) {
3433
			for ( var key in type ) {
3434
				this[ name ](key, data, type[key], fn);
3435
			}
3436
			return this;
3437
		}
3438

    
3439
		if ( arguments.length === 2 || data === false ) {
3440
			fn = data;
3441
			data = undefined;
3442
		}
3443

    
3444
		if ( name === "one" ) {
3445
			handler = function( event ) {
3446
				jQuery( this ).unbind( event, handler );
3447
				return fn.apply( this, arguments );
3448
			};
3449
			handler.guid = fn.guid || jQuery.guid++;
3450
		} else {
3451
			handler = fn;
3452
		}
3453

    
3454
		if ( type === "unload" && name !== "one" ) {
3455
			this.one( type, data, fn );
3456

    
3457
		} else {
3458
			for ( var i = 0, l = this.length; i < l; i++ ) {
3459
				jQuery.event.add( this[i], type, handler, data );
3460
			}
3461
		}
3462

    
3463
		return this;
3464
	};
3465
});
3466

    
3467
jQuery.fn.extend({
3468
	unbind: function( type, fn ) {
3469
		// Handle object literals
3470
		if ( typeof type === "object" && !type.preventDefault ) {
3471
			for ( var key in type ) {
3472
				this.unbind(key, type[key]);
3473
			}
3474

    
3475
		} else {
3476
			for ( var i = 0, l = this.length; i < l; i++ ) {
3477
				jQuery.event.remove( this[i], type, fn );
3478
			}
3479
		}
3480

    
3481
		return this;
3482
	},
3483

    
3484
	delegate: function( selector, types, data, fn ) {
3485
		return this.live( types, data, fn, selector );
3486
	},
3487

    
3488
	undelegate: function( selector, types, fn ) {
3489
		if ( arguments.length === 0 ) {
3490
			return this.unbind( "live" );
3491

    
3492
		} else {
3493
			return this.die( types, null, fn, selector );
3494
		}
3495
	},
3496

    
3497
	trigger: function( type, data ) {
3498
		return this.each(function() {
3499
			jQuery.event.trigger( type, data, this );
3500
		});
3501
	},
3502

    
3503
	triggerHandler: function( type, data ) {
3504
		if ( this[0] ) {
3505
			return jQuery.event.trigger( type, data, this[0], true );
3506
		}
3507
	},
3508

    
3509
	toggle: function( fn ) {
3510
		// Save reference to arguments for access in closure
3511
		var args = arguments,
3512
			guid = fn.guid || jQuery.guid++,
3513
			i = 0,
3514
			toggler = function( event ) {
3515
				// Figure out which function to execute
3516
				var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
3517
				jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
3518

    
3519
				// Make sure that clicks stop
3520
				event.preventDefault();
3521

    
3522
				// and execute the function
3523
				return args[ lastToggle ].apply( this, arguments ) || false;
3524
			};
3525

    
3526
		// link all the functions, so any of them can unbind this click handler
3527
		toggler.guid = guid;
3528
		while ( i < args.length ) {
3529
			args[ i++ ].guid = guid;
3530
		}
3531

    
3532
		return this.click( toggler );
3533
	},
3534

    
3535
	hover: function( fnOver, fnOut ) {
3536
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
3537
	}
3538
});
3539

    
3540
var liveMap = {
3541
	focus: "focusin",
3542
	blur: "focusout",
3543
	mouseenter: "mouseover",
3544
	mouseleave: "mouseout"
3545
};
3546

    
3547
jQuery.each(["live", "die"], function( i, name ) {
3548
	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
3549
		var type, i = 0, match, namespaces, preType,
3550
			selector = origSelector || this.selector,
3551
			context = origSelector ? this : jQuery( this.context );
3552

    
3553
		if ( typeof types === "object" && !types.preventDefault ) {
3554
			for ( var key in types ) {
3555
				context[ name ]( key, data, types[key], selector );
3556
			}
3557

    
3558
			return this;
3559
		}
3560

    
3561
		if ( name === "die" && !types &&
3562
					origSelector && origSelector.charAt(0) === "." ) {
3563

    
3564
			context.unbind( origSelector );
3565

    
3566
			return this;
3567
		}
3568

    
3569
		if ( data === false || jQuery.isFunction( data ) ) {
3570
			fn = data || returnFalse;
3571
			data = undefined;
3572
		}
3573

    
3574
		types = (types || "").split(" ");
3575

    
3576
		while ( (type = types[ i++ ]) != null ) {
3577
			match = rnamespaces.exec( type );
3578
			namespaces = "";
3579

    
3580
			if ( match )  {
3581
				namespaces = match[0];
3582
				type = type.replace( rnamespaces, "" );
3583
			}
3584

    
3585
			if ( type === "hover" ) {
3586
				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
3587
				continue;
3588
			}
3589

    
3590
			preType = type;
3591

    
3592
			if ( liveMap[ type ] ) {
3593
				types.push( liveMap[ type ] + namespaces );
3594
				type = type + namespaces;
3595

    
3596
			} else {
3597
				type = (liveMap[ type ] || type) + namespaces;
3598
			}
3599

    
3600
			if ( name === "live" ) {
3601
				// bind live handler
3602
				for ( var j = 0, l = context.length; j < l; j++ ) {
3603
					jQuery.event.add( context[j], "live." + liveConvert( type, selector ),
3604
						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
3605
				}
3606

    
3607
			} else {
3608
				// unbind live handler
3609
				context.unbind( "live." + liveConvert( type, selector ), fn );
3610
			}
3611
		}
3612

    
3613
		return this;
3614
	};
3615
});
3616

    
3617
function liveHandler( event ) {
3618
	var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
3619
		elems = [],
3620
		selectors = [],
3621
		events = jQuery._data( this, "events" );
3622

    
3623
	// Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911)
3624
	if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) {
3625
		return;
3626
	}
3627

    
3628
	if ( event.namespace ) {
3629
		namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
3630
	}
3631

    
3632
	event.liveFired = this;
3633

    
3634
	var live = events.live.slice(0);
3635

    
3636
	for ( j = 0; j < live.length; j++ ) {
3637
		handleObj = live[j];
3638

    
3639
		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
3640
			selectors.push( handleObj.selector );
3641

    
3642
		} else {
3643
			live.splice( j--, 1 );
3644
		}
3645
	}
3646

    
3647
	match = jQuery( event.target ).closest( selectors, event.currentTarget );
3648

    
3649
	for ( i = 0, l = match.length; i < l; i++ ) {
3650
		close = match[i];
3651

    
3652
		for ( j = 0; j < live.length; j++ ) {
3653
			handleObj = live[j];
3654

    
3655
			if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) {
3656
				elem = close.elem;
3657
				related = null;
3658

    
3659
				// Those two events require additional checking
3660
				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
3661
					event.type = handleObj.preType;
3662
					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
3663

    
3664
					// Make sure not to accidentally match a child element with the same selector
3665
					if ( related && jQuery.contains( elem, related ) ) {
3666
						related = elem;
3667
					}
3668
				}
3669

    
3670
				if ( !related || related !== elem ) {
3671
					elems.push({ elem: elem, handleObj: handleObj, level: close.level });
3672
				}
3673
			}
3674
		}
3675
	}
3676

    
3677
	for ( i = 0, l = elems.length; i < l; i++ ) {
3678
		match = elems[i];
3679

    
3680
		if ( maxLevel && match.level > maxLevel ) {
3681
			break;
3682
		}
3683

    
3684
		event.currentTarget = match.elem;
3685
		event.data = match.handleObj.data;
3686
		event.handleObj = match.handleObj;
3687

    
3688
		ret = match.handleObj.origHandler.apply( match.elem, arguments );
3689

    
3690
		if ( ret === false || event.isPropagationStopped() ) {
3691
			maxLevel = match.level;
3692

    
3693
			if ( ret === false ) {
3694
				stop = false;
3695
			}
3696
			if ( event.isImmediatePropagationStopped() ) {
3697
				break;
3698
			}
3699
		}
3700
	}
3701

    
3702
	return stop;
3703
}
3704

    
3705
function liveConvert( type, selector ) {
3706
	return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&");
3707
}
3708

    
3709
jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
3710
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
3711
	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
3712

    
3713
	// Handle event binding
3714
	jQuery.fn[ name ] = function( data, fn ) {
3715
		if ( fn == null ) {
3716
			fn = data;
3717
			data = null;
3718
		}
3719

    
3720
		return arguments.length > 0 ?
3721
			this.bind( name, data, fn ) :
3722
			this.trigger( name );
3723
	};
3724

    
3725
	if ( jQuery.attrFn ) {
3726
		jQuery.attrFn[ name ] = true;
3727
	}
3728
});
3729

    
3730

    
3731

    
3732
/*!
3733
 * Sizzle CSS Selector Engine
3734
 *  Copyright 2011, The Dojo Foundation
3735
 *  Released under the MIT, BSD, and GPL Licenses.
3736
 *  More information: http://sizzlejs.com/
3737
 */
3738
(function(){
3739

    
3740
var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
3741
	done = 0,
3742
	toString = Object.prototype.toString,
3743
	hasDuplicate = false,
3744
	baseHasDuplicate = true,
3745
	rBackslash = /\\/g,
3746
	rNonWord = /\W/;
3747

    
3748
// Here we check if the JavaScript engine is using some sort of
3749
// optimization where it does not always call our comparision
3750
// function. If that is the case, discard the hasDuplicate value.
3751
//   Thus far that includes Google Chrome.
3752
[0, 0].sort(function() {
3753
	baseHasDuplicate = false;
3754
	return 0;
3755
});
3756

    
3757
var Sizzle = function( selector, context, results, seed ) {
3758
	results = results || [];
3759
	context = context || document;
3760

    
3761
	var origContext = context;
3762

    
3763
	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
3764
		return [];
3765
	}
3766
	
3767
	if ( !selector || typeof selector !== "string" ) {
3768
		return results;
3769
	}
3770

    
3771
	var m, set, checkSet, extra, ret, cur, pop, i,
3772
		prune = true,
3773
		contextXML = Sizzle.isXML( context ),
3774
		parts = [],
3775
		soFar = selector;
3776
	
3777
	// Reset the position of the chunker regexp (start from head)
3778
	do {
3779
		chunker.exec( "" );
3780
		m = chunker.exec( soFar );
3781

    
3782
		if ( m ) {
3783
			soFar = m[3];
3784
		
3785
			parts.push( m[1] );
3786
		
3787
			if ( m[2] ) {
3788
				extra = m[3];
3789
				break;
3790
			}
3791
		}
3792
	} while ( m );
3793

    
3794
	if ( parts.length > 1 && origPOS.exec( selector ) ) {
3795

    
3796
		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
3797
			set = posProcess( parts[0] + parts[1], context );
3798

    
3799
		} else {
3800
			set = Expr.relative[ parts[0] ] ?
3801
				[ context ] :
3802
				Sizzle( parts.shift(), context );
3803

    
3804
			while ( parts.length ) {
3805
				selector = parts.shift();
3806

    
3807
				if ( Expr.relative[ selector ] ) {
3808
					selector += parts.shift();
3809
				}
3810
				
3811
				set = posProcess( selector, set );
3812
			}
3813
		}
3814

    
3815
	} else {
3816
		// Take a shortcut and set the context if the root selector is an ID
3817
		// (but not if it'll be faster if the inner selector is an ID)
3818
		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
3819
				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
3820

    
3821
			ret = Sizzle.find( parts.shift(), context, contextXML );
3822
			context = ret.expr ?
3823
				Sizzle.filter( ret.expr, ret.set )[0] :
3824
				ret.set[0];
3825
		}
3826

    
3827
		if ( context ) {
3828
			ret = seed ?
3829
				{ expr: parts.pop(), set: makeArray(seed) } :
3830
				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
3831

    
3832
			set = ret.expr ?
3833
				Sizzle.filter( ret.expr, ret.set ) :
3834
				ret.set;
3835

    
3836
			if ( parts.length > 0 ) {
3837
				checkSet = makeArray( set );
3838

    
3839
			} else {
3840
				prune = false;
3841
			}
3842

    
3843
			while ( parts.length ) {
3844
				cur = parts.pop();
3845
				pop = cur;
3846

    
3847
				if ( !Expr.relative[ cur ] ) {
3848
					cur = "";
3849
				} else {
3850
					pop = parts.pop();
3851
				}
3852

    
3853
				if ( pop == null ) {
3854
					pop = context;
3855
				}
3856

    
3857
				Expr.relative[ cur ]( checkSet, pop, contextXML );
3858
			}
3859

    
3860
		} else {
3861
			checkSet = parts = [];
3862
		}
3863
	}
3864

    
3865
	if ( !checkSet ) {
3866
		checkSet = set;
3867
	}
3868

    
3869
	if ( !checkSet ) {
3870
		Sizzle.error( cur || selector );
3871
	}
3872

    
3873
	if ( toString.call(checkSet) === "[object Array]" ) {
3874
		if ( !prune ) {
3875
			results.push.apply( results, checkSet );
3876

    
3877
		} else if ( context && context.nodeType === 1 ) {
3878
			for ( i = 0; checkSet[i] != null; i++ ) {
3879
				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
3880
					results.push( set[i] );
3881
				}
3882
			}
3883

    
3884
		} else {
3885
			for ( i = 0; checkSet[i] != null; i++ ) {
3886
				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
3887
					results.push( set[i] );
3888
				}
3889
			}
3890
		}
3891

    
3892
	} else {
3893
		makeArray( checkSet, results );
3894
	}
3895

    
3896
	if ( extra ) {
3897
		Sizzle( extra, origContext, results, seed );
3898
		Sizzle.uniqueSort( results );
3899
	}
3900

    
3901
	return results;
3902
};
3903

    
3904
Sizzle.uniqueSort = function( results ) {
3905
	if ( sortOrder ) {
3906
		hasDuplicate = baseHasDuplicate;
3907
		results.sort( sortOrder );
3908

    
3909
		if ( hasDuplicate ) {
3910
			for ( var i = 1; i < results.length; i++ ) {
3911
				if ( results[i] === results[ i - 1 ] ) {
3912
					results.splice( i--, 1 );
3913
				}
3914
			}
3915
		}
3916
	}
3917

    
3918
	return results;
3919
};
3920

    
3921
Sizzle.matches = function( expr, set ) {
3922
	return Sizzle( expr, null, null, set );
3923
};
3924

    
3925
Sizzle.matchesSelector = function( node, expr ) {
3926
	return Sizzle( expr, null, null, [node] ).length > 0;
3927
};
3928

    
3929
Sizzle.find = function( expr, context, isXML ) {
3930
	var set;
3931

    
3932
	if ( !expr ) {
3933
		return [];
3934
	}
3935

    
3936
	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
3937
		var match,
3938
			type = Expr.order[i];
3939
		
3940
		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
3941
			var left = match[1];
3942
			match.splice( 1, 1 );
3943

    
3944
			if ( left.substr( left.length - 1 ) !== "\\" ) {
3945
				match[1] = (match[1] || "").replace( rBackslash, "" );
3946
				set = Expr.find[ type ]( match, context, isXML );
3947

    
3948
				if ( set != null ) {
3949
					expr = expr.replace( Expr.match[ type ], "" );
3950
					break;
3951
				}
3952
			}
3953
		}
3954
	}
3955

    
3956
	if ( !set ) {
3957
		set = typeof context.getElementsByTagName !== "undefined" ?
3958
			context.getElementsByTagName( "*" ) :
3959
			[];
3960
	}
3961

    
3962
	return { set: set, expr: expr };
3963
};
3964

    
3965
Sizzle.filter = function( expr, set, inplace, not ) {
3966
	var match, anyFound,
3967
		old = expr,
3968
		result = [],
3969
		curLoop = set,
3970
		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
3971

    
3972
	while ( expr && set.length ) {
3973
		for ( var type in Expr.filter ) {
3974
			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
3975
				var found, item,
3976
					filter = Expr.filter[ type ],
3977
					left = match[1];
3978

    
3979
				anyFound = false;
3980

    
3981
				match.splice(1,1);
3982

    
3983
				if ( left.substr( left.length - 1 ) === "\\" ) {
3984
					continue;
3985
				}
3986

    
3987
				if ( curLoop === result ) {
3988
					result = [];
3989
				}
3990

    
3991
				if ( Expr.preFilter[ type ] ) {
3992
					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
3993

    
3994
					if ( !match ) {
3995
						anyFound = found = true;
3996

    
3997
					} else if ( match === true ) {
3998
						continue;
3999
					}
4000
				}
4001

    
4002
				if ( match ) {
4003
					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
4004
						if ( item ) {
4005
							found = filter( item, match, i, curLoop );
4006
							var pass = not ^ !!found;
4007

    
4008
							if ( inplace && found != null ) {
4009
								if ( pass ) {
4010
									anyFound = true;
4011

    
4012
								} else {
4013
									curLoop[i] = false;
4014
								}
4015

    
4016
							} else if ( pass ) {
4017
								result.push( item );
4018
								anyFound = true;
4019
							}
4020
						}
4021
					}
4022
				}
4023

    
4024
				if ( found !== undefined ) {
4025
					if ( !inplace ) {
4026
						curLoop = result;
4027
					}
4028

    
4029
					expr = expr.replace( Expr.match[ type ], "" );
4030

    
4031
					if ( !anyFound ) {
4032
						return [];
4033
					}
4034

    
4035
					break;
4036
				}
4037
			}
4038
		}
4039

    
4040
		// Improper expression
4041
		if ( expr === old ) {
4042
			if ( anyFound == null ) {
4043
				Sizzle.error( expr );
4044

    
4045
			} else {
4046
				break;
4047
			}
4048
		}
4049

    
4050
		old = expr;
4051
	}
4052

    
4053
	return curLoop;
4054
};
4055

    
4056
Sizzle.error = function( msg ) {
4057
	throw "Syntax error, unrecognized expression: " + msg;
4058
};
4059

    
4060
var Expr = Sizzle.selectors = {
4061
	order: [ "ID", "NAME", "TAG" ],
4062

    
4063
	match: {
4064
		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4065
		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
4066
		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
4067
		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
4068
		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
4069
		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
4070
		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
4071
		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
4072
	},
4073

    
4074
	leftMatch: {},
4075

    
4076
	attrMap: {
4077
		"class": "className",
4078
		"for": "htmlFor"
4079
	},
4080

    
4081
	attrHandle: {
4082
		href: function( elem ) {
4083
			return elem.getAttribute( "href" );
4084
		},
4085
		type: function( elem ) {
4086
			return elem.getAttribute( "type" );
4087
		}
4088
	},
4089

    
4090
	relative: {
4091
		"+": function(checkSet, part){
4092
			var isPartStr = typeof part === "string",
4093
				isTag = isPartStr && !rNonWord.test( part ),
4094
				isPartStrNotTag = isPartStr && !isTag;
4095

    
4096
			if ( isTag ) {
4097
				part = part.toLowerCase();
4098
			}
4099

    
4100
			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
4101
				if ( (elem = checkSet[i]) ) {
4102
					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
4103

    
4104
					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
4105
						elem || false :
4106
						elem === part;
4107
				}
4108
			}
4109

    
4110
			if ( isPartStrNotTag ) {
4111
				Sizzle.filter( part, checkSet, true );
4112
			}
4113
		},
4114

    
4115
		">": function( checkSet, part ) {
4116
			var elem,
4117
				isPartStr = typeof part === "string",
4118
				i = 0,
4119
				l = checkSet.length;
4120

    
4121
			if ( isPartStr && !rNonWord.test( part ) ) {
4122
				part = part.toLowerCase();
4123

    
4124
				for ( ; i < l; i++ ) {
4125
					elem = checkSet[i];
4126

    
4127
					if ( elem ) {
4128
						var parent = elem.parentNode;
4129
						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
4130
					}
4131
				}
4132

    
4133
			} else {
4134
				for ( ; i < l; i++ ) {
4135
					elem = checkSet[i];
4136

    
4137
					if ( elem ) {
4138
						checkSet[i] = isPartStr ?
4139
							elem.parentNode :
4140
							elem.parentNode === part;
4141
					}
4142
				}
4143

    
4144
				if ( isPartStr ) {
4145
					Sizzle.filter( part, checkSet, true );
4146
				}
4147
			}
4148
		},
4149

    
4150
		"": function(checkSet, part, isXML){
4151
			var nodeCheck,
4152
				doneName = done++,
4153
				checkFn = dirCheck;
4154

    
4155
			if ( typeof part === "string" && !rNonWord.test( part ) ) {
4156
				part = part.toLowerCase();
4157
				nodeCheck = part;
4158
				checkFn = dirNodeCheck;
4159
			}
4160

    
4161
			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
4162
		},
4163

    
4164
		"~": function( checkSet, part, isXML ) {
4165
			var nodeCheck,
4166
				doneName = done++,
4167
				checkFn = dirCheck;
4168

    
4169
			if ( typeof part === "string" && !rNonWord.test( part ) ) {
4170
				part = part.toLowerCase();
4171
				nodeCheck = part;
4172
				checkFn = dirNodeCheck;
4173
			}
4174

    
4175
			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
4176
		}
4177
	},
4178

    
4179
	find: {
4180
		ID: function( match, context, isXML ) {
4181
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
4182
				var m = context.getElementById(match[1]);
4183
				// Check parentNode to catch when Blackberry 4.6 returns
4184
				// nodes that are no longer in the document #6963
4185
				return m && m.parentNode ? [m] : [];
4186
			}
4187
		},
4188

    
4189
		NAME: function( match, context ) {
4190
			if ( typeof context.getElementsByName !== "undefined" ) {
4191
				var ret = [],
4192
					results = context.getElementsByName( match[1] );
4193

    
4194
				for ( var i = 0, l = results.length; i < l; i++ ) {
4195
					if ( results[i].getAttribute("name") === match[1] ) {
4196
						ret.push( results[i] );
4197
					}
4198
				}
4199

    
4200
				return ret.length === 0 ? null : ret;
4201
			}
4202
		},
4203

    
4204
		TAG: function( match, context ) {
4205
			if ( typeof context.getElementsByTagName !== "undefined" ) {
4206
				return context.getElementsByTagName( match[1] );
4207
			}
4208
		}
4209
	},
4210
	preFilter: {
4211
		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
4212
			match = " " + match[1].replace( rBackslash, "" ) + " ";
4213

    
4214
			if ( isXML ) {
4215
				return match;
4216
			}
4217

    
4218
			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
4219
				if ( elem ) {
4220
					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
4221
						if ( !inplace ) {
4222
							result.push( elem );
4223
						}
4224

    
4225
					} else if ( inplace ) {
4226
						curLoop[i] = false;
4227
					}
4228
				}
4229
			}
4230

    
4231
			return false;
4232
		},
4233

    
4234
		ID: function( match ) {
4235
			return match[1].replace( rBackslash, "" );
4236
		},
4237

    
4238
		TAG: function( match, curLoop ) {
4239
			return match[1].replace( rBackslash, "" ).toLowerCase();
4240
		},
4241

    
4242
		CHILD: function( match ) {
4243
			if ( match[1] === "nth" ) {
4244
				if ( !match[2] ) {
4245
					Sizzle.error( match[0] );
4246
				}
4247

    
4248
				match[2] = match[2].replace(/^\+|\s*/g, '');
4249

    
4250
				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
4251
				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
4252
					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
4253
					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
4254

    
4255
				// calculate the numbers (first)n+(last) including if they are negative
4256
				match[2] = (test[1] + (test[2] || 1)) - 0;
4257
				match[3] = test[3] - 0;
4258
			}
4259
			else if ( match[2] ) {
4260
				Sizzle.error( match[0] );
4261
			}
4262

    
4263
			// TODO: Move to normal caching system
4264
			match[0] = done++;
4265

    
4266
			return match;
4267
		},
4268

    
4269
		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
4270
			var name = match[1] = match[1].replace( rBackslash, "" );
4271
			
4272
			if ( !isXML && Expr.attrMap[name] ) {
4273
				match[1] = Expr.attrMap[name];
4274
			}
4275

    
4276
			// Handle if an un-quoted value was used
4277
			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
4278

    
4279
			if ( match[2] === "~=" ) {
4280
				match[4] = " " + match[4] + " ";
4281
			}
4282

    
4283
			return match;
4284
		},
4285

    
4286
		PSEUDO: function( match, curLoop, inplace, result, not ) {
4287
			if ( match[1] === "not" ) {
4288
				// If we're dealing with a complex expression, or a simple one
4289
				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
4290
					match[3] = Sizzle(match[3], null, null, curLoop);
4291

    
4292
				} else {
4293
					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
4294

    
4295
					if ( !inplace ) {
4296
						result.push.apply( result, ret );
4297
					}
4298

    
4299
					return false;
4300
				}
4301

    
4302
			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
4303
				return true;
4304
			}
4305
			
4306
			return match;
4307
		},
4308

    
4309
		POS: function( match ) {
4310
			match.unshift( true );
4311

    
4312
			return match;
4313
		}
4314
	},
4315
	
4316
	filters: {
4317
		enabled: function( elem ) {
4318
			return elem.disabled === false && elem.type !== "hidden";
4319
		},
4320

    
4321
		disabled: function( elem ) {
4322
			return elem.disabled === true;
4323
		},
4324

    
4325
		checked: function( elem ) {
4326
			return elem.checked === true;
4327
		},
4328
		
4329
		selected: function( elem ) {
4330
			// Accessing this property makes selected-by-default
4331
			// options in Safari work properly
4332
			if ( elem.parentNode ) {
4333
				elem.parentNode.selectedIndex;
4334
			}
4335
			
4336
			return elem.selected === true;
4337
		},
4338

    
4339
		parent: function( elem ) {
4340
			return !!elem.firstChild;
4341
		},
4342

    
4343
		empty: function( elem ) {
4344
			return !elem.firstChild;
4345
		},
4346

    
4347
		has: function( elem, i, match ) {
4348
			return !!Sizzle( match[3], elem ).length;
4349
		},
4350

    
4351
		header: function( elem ) {
4352
			return (/h\d/i).test( elem.nodeName );
4353
		},
4354

    
4355
		text: function( elem ) {
4356
			var attr = elem.getAttribute( "type" ), type = elem.type;
4357
			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
4358
			// use getAttribute instead to test this case
4359
			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
4360
		},
4361

    
4362
		radio: function( elem ) {
4363
			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
4364
		},
4365

    
4366
		checkbox: function( elem ) {
4367
			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
4368
		},
4369

    
4370
		file: function( elem ) {
4371
			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
4372
		},
4373

    
4374
		password: function( elem ) {
4375
			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
4376
		},
4377

    
4378
		submit: function( elem ) {
4379
			var name = elem.nodeName.toLowerCase();
4380
			return (name === "input" || name === "button") && "submit" === elem.type;
4381
		},
4382

    
4383
		image: function( elem ) {
4384
			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
4385
		},
4386

    
4387
		reset: function( elem ) {
4388
			var name = elem.nodeName.toLowerCase();
4389
			return (name === "input" || name === "button") && "reset" === elem.type;
4390
		},
4391

    
4392
		button: function( elem ) {
4393
			var name = elem.nodeName.toLowerCase();
4394
			return name === "input" && "button" === elem.type || name === "button";
4395
		},
4396

    
4397
		input: function( elem ) {
4398
			return (/input|select|textarea|button/i).test( elem.nodeName );
4399
		},
4400

    
4401
		focus: function( elem ) {
4402
			return elem === elem.ownerDocument.activeElement;
4403
		}
4404
	},
4405
	setFilters: {
4406
		first: function( elem, i ) {
4407
			return i === 0;
4408
		},
4409

    
4410
		last: function( elem, i, match, array ) {
4411
			return i === array.length - 1;
4412
		},
4413

    
4414
		even: function( elem, i ) {
4415
			return i % 2 === 0;
4416
		},
4417

    
4418
		odd: function( elem, i ) {
4419
			return i % 2 === 1;
4420
		},
4421

    
4422
		lt: function( elem, i, match ) {
4423
			return i < match[3] - 0;
4424
		},
4425

    
4426
		gt: function( elem, i, match ) {
4427
			return i > match[3] - 0;
4428
		},
4429

    
4430
		nth: function( elem, i, match ) {
4431
			return match[3] - 0 === i;
4432
		},
4433

    
4434
		eq: function( elem, i, match ) {
4435
			return match[3] - 0 === i;
4436
		}
4437
	},
4438
	filter: {
4439
		PSEUDO: function( elem, match, i, array ) {
4440
			var name = match[1],
4441
				filter = Expr.filters[ name ];
4442

    
4443
			if ( filter ) {
4444
				return filter( elem, i, match, array );
4445

    
4446
			} else if ( name === "contains" ) {
4447
				return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
4448

    
4449
			} else if ( name === "not" ) {
4450
				var not = match[3];
4451

    
4452
				for ( var j = 0, l = not.length; j < l; j++ ) {
4453
					if ( not[j] === elem ) {
4454
						return false;
4455
					}
4456
				}
4457

    
4458
				return true;
4459

    
4460
			} else {
4461
				Sizzle.error( name );
4462
			}
4463
		},
4464

    
4465
		CHILD: function( elem, match ) {
4466
			var type = match[1],
4467
				node = elem;
4468

    
4469
			switch ( type ) {
4470
				case "only":
4471
				case "first":
4472
					while ( (node = node.previousSibling) )	 {
4473
						if ( node.nodeType === 1 ) { 
4474
							return false; 
4475
						}
4476
					}
4477

    
4478
					if ( type === "first" ) { 
4479
						return true; 
4480
					}
4481

    
4482
					node = elem;
4483

    
4484
				case "last":
4485
					while ( (node = node.nextSibling) )	 {
4486
						if ( node.nodeType === 1 ) { 
4487
							return false; 
4488
						}
4489
					}
4490

    
4491
					return true;
4492

    
4493
				case "nth":
4494
					var first = match[2],
4495
						last = match[3];
4496

    
4497
					if ( first === 1 && last === 0 ) {
4498
						return true;
4499
					}
4500
					
4501
					var doneName = match[0],
4502
						parent = elem.parentNode;
4503
	
4504
					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
4505
						var count = 0;
4506
						
4507
						for ( node = parent.firstChild; node; node = node.nextSibling ) {
4508
							if ( node.nodeType === 1 ) {
4509
								node.nodeIndex = ++count;
4510
							}
4511
						} 
4512

    
4513
						parent.sizcache = doneName;
4514
					}
4515
					
4516
					var diff = elem.nodeIndex - last;
4517

    
4518
					if ( first === 0 ) {
4519
						return diff === 0;
4520

    
4521
					} else {
4522
						return ( diff % first === 0 && diff / first >= 0 );
4523
					}
4524
			}
4525
		},
4526

    
4527
		ID: function( elem, match ) {
4528
			return elem.nodeType === 1 && elem.getAttribute("id") === match;
4529
		},
4530

    
4531
		TAG: function( elem, match ) {
4532
			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
4533
		},
4534
		
4535
		CLASS: function( elem, match ) {
4536
			return (" " + (elem.className || elem.getAttribute("class")) + " ")
4537
				.indexOf( match ) > -1;
4538
		},
4539

    
4540
		ATTR: function( elem, match ) {
4541
			var name = match[1],
4542
				result = Expr.attrHandle[ name ] ?
4543
					Expr.attrHandle[ name ]( elem ) :
4544
					elem[ name ] != null ?
4545
						elem[ name ] :
4546
						elem.getAttribute( name ),
4547
				value = result + "",
4548
				type = match[2],
4549
				check = match[4];
4550

    
4551
			return result == null ?
4552
				type === "!=" :
4553
				type === "=" ?
4554
				value === check :
4555
				type === "*=" ?
4556
				value.indexOf(check) >= 0 :
4557
				type === "~=" ?
4558
				(" " + value + " ").indexOf(check) >= 0 :
4559
				!check ?
4560
				value && result !== false :
4561
				type === "!=" ?
4562
				value !== check :
4563
				type === "^=" ?
4564
				value.indexOf(check) === 0 :
4565
				type === "$=" ?
4566
				value.substr(value.length - check.length) === check :
4567
				type === "|=" ?
4568
				value === check || value.substr(0, check.length + 1) === check + "-" :
4569
				false;
4570
		},
4571

    
4572
		POS: function( elem, match, i, array ) {
4573
			var name = match[2],
4574
				filter = Expr.setFilters[ name ];
4575

    
4576
			if ( filter ) {
4577
				return filter( elem, i, match, array );
4578
			}
4579
		}
4580
	}
4581
};
4582

    
4583
var origPOS = Expr.match.POS,
4584
	fescape = function(all, num){
4585
		return "\\" + (num - 0 + 1);
4586
	};
4587

    
4588
for ( var type in Expr.match ) {
4589
	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
4590
	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
4591
}
4592

    
4593
var makeArray = function( array, results ) {
4594
	array = Array.prototype.slice.call( array, 0 );
4595

    
4596
	if ( results ) {
4597
		results.push.apply( results, array );
4598
		return results;
4599
	}
4600
	
4601
	return array;
4602
};
4603

    
4604
// Perform a simple check to determine if the browser is capable of
4605
// converting a NodeList to an array using builtin methods.
4606
// Also verifies that the returned array holds DOM nodes
4607
// (which is not the case in the Blackberry browser)
4608
try {
4609
	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
4610

    
4611
// Provide a fallback method if it does not work
4612
} catch( e ) {
4613
	makeArray = function( array, results ) {
4614
		var i = 0,
4615
			ret = results || [];
4616

    
4617
		if ( toString.call(array) === "[object Array]" ) {
4618
			Array.prototype.push.apply( ret, array );
4619

    
4620
		} else {
4621
			if ( typeof array.length === "number" ) {
4622
				for ( var l = array.length; i < l; i++ ) {
4623
					ret.push( array[i] );
4624
				}
4625

    
4626
			} else {
4627
				for ( ; array[i]; i++ ) {
4628
					ret.push( array[i] );
4629
				}
4630
			}
4631
		}
4632

    
4633
		return ret;
4634
	};
4635
}
4636

    
4637
var sortOrder, siblingCheck;
4638

    
4639
if ( document.documentElement.compareDocumentPosition ) {
4640
	sortOrder = function( a, b ) {
4641
		if ( a === b ) {
4642
			hasDuplicate = true;
4643
			return 0;
4644
		}
4645

    
4646
		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
4647
			return a.compareDocumentPosition ? -1 : 1;
4648
		}
4649

    
4650
		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
4651
	};
4652

    
4653
} else {
4654
	sortOrder = function( a, b ) {
4655
		// The nodes are identical, we can exit early
4656
		if ( a === b ) {
4657
			hasDuplicate = true;
4658
			return 0;
4659

    
4660
		// Fallback to using sourceIndex (in IE) if it's available on both nodes
4661
		} else if ( a.sourceIndex && b.sourceIndex ) {
4662
			return a.sourceIndex - b.sourceIndex;
4663
		}
4664

    
4665
		var al, bl,
4666
			ap = [],
4667
			bp = [],
4668
			aup = a.parentNode,
4669
			bup = b.parentNode,
4670
			cur = aup;
4671

    
4672
		// If the nodes are siblings (or identical) we can do a quick check
4673
		if ( aup === bup ) {
4674
			return siblingCheck( a, b );
4675

    
4676
		// If no parents were found then the nodes are disconnected
4677
		} else if ( !aup ) {
4678
			return -1;
4679

    
4680
		} else if ( !bup ) {
4681
			return 1;
4682
		}
4683

    
4684
		// Otherwise they're somewhere else in the tree so we need
4685
		// to build up a full list of the parentNodes for comparison
4686
		while ( cur ) {
4687
			ap.unshift( cur );
4688
			cur = cur.parentNode;
4689
		}
4690

    
4691
		cur = bup;
4692

    
4693
		while ( cur ) {
4694
			bp.unshift( cur );
4695
			cur = cur.parentNode;
4696
		}
4697

    
4698
		al = ap.length;
4699
		bl = bp.length;
4700

    
4701
		// Start walking down the tree looking for a discrepancy
4702
		for ( var i = 0; i < al && i < bl; i++ ) {
4703
			if ( ap[i] !== bp[i] ) {
4704
				return siblingCheck( ap[i], bp[i] );
4705
			}
4706
		}
4707

    
4708
		// We ended someplace up the tree so do a sibling check
4709
		return i === al ?
4710
			siblingCheck( a, bp[i], -1 ) :
4711
			siblingCheck( ap[i], b, 1 );
4712
	};
4713

    
4714
	siblingCheck = function( a, b, ret ) {
4715
		if ( a === b ) {
4716
			return ret;
4717
		}
4718

    
4719
		var cur = a.nextSibling;
4720

    
4721
		while ( cur ) {
4722
			if ( cur === b ) {
4723
				return -1;
4724
			}
4725

    
4726
			cur = cur.nextSibling;
4727
		}
4728

    
4729
		return 1;
4730
	};
4731
}
4732

    
4733
// Utility function for retreiving the text value of an array of DOM nodes
4734
Sizzle.getText = function( elems ) {
4735
	var ret = "", elem;
4736

    
4737
	for ( var i = 0; elems[i]; i++ ) {
4738
		elem = elems[i];
4739

    
4740
		// Get the text from text nodes and CDATA nodes
4741
		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
4742
			ret += elem.nodeValue;
4743

    
4744
		// Traverse everything else, except comment nodes
4745
		} else if ( elem.nodeType !== 8 ) {
4746
			ret += Sizzle.getText( elem.childNodes );
4747
		}
4748
	}
4749

    
4750
	return ret;
4751
};
4752

    
4753
// Check to see if the browser returns elements by name when
4754
// querying by getElementById (and provide a workaround)
4755
(function(){
4756
	// We're going to inject a fake input element with a specified name
4757
	var form = document.createElement("div"),
4758
		id = "script" + (new Date()).getTime(),
4759
		root = document.documentElement;
4760

    
4761
	form.innerHTML = "<a name='" + id + "'/>";
4762

    
4763
	// Inject it into the root element, check its status, and remove it quickly
4764
	root.insertBefore( form, root.firstChild );
4765

    
4766
	// The workaround has to do additional checks after a getElementById
4767
	// Which slows things down for other browsers (hence the branching)
4768
	if ( document.getElementById( id ) ) {
4769
		Expr.find.ID = function( match, context, isXML ) {
4770
			if ( typeof context.getElementById !== "undefined" && !isXML ) {
4771
				var m = context.getElementById(match[1]);
4772

    
4773
				return m ?
4774
					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
4775
						[m] :
4776
						undefined :
4777
					[];
4778
			}
4779
		};
4780

    
4781
		Expr.filter.ID = function( elem, match ) {
4782
			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
4783

    
4784
			return elem.nodeType === 1 && node && node.nodeValue === match;
4785
		};
4786
	}
4787

    
4788
	root.removeChild( form );
4789

    
4790
	// release memory in IE
4791
	root = form = null;
4792
})();
4793

    
4794
(function(){
4795
	// Check to see if the browser returns only elements
4796
	// when doing getElementsByTagName("*")
4797

    
4798
	// Create a fake element
4799
	var div = document.createElement("div");
4800
	div.appendChild( document.createComment("") );
4801

    
4802
	// Make sure no comments are found
4803
	if ( div.getElementsByTagName("*").length > 0 ) {
4804
		Expr.find.TAG = function( match, context ) {
4805
			var results = context.getElementsByTagName( match[1] );
4806

    
4807
			// Filter out possible comments
4808
			if ( match[1] === "*" ) {
4809
				var tmp = [];
4810

    
4811
				for ( var i = 0; results[i]; i++ ) {
4812
					if ( results[i].nodeType === 1 ) {
4813
						tmp.push( results[i] );
4814
					}
4815
				}
4816

    
4817
				results = tmp;
4818
			}
4819

    
4820
			return results;
4821
		};
4822
	}
4823

    
4824
	// Check to see if an attribute returns normalized href attributes
4825
	div.innerHTML = "<a href='#'></a>";
4826

    
4827
	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
4828
			div.firstChild.getAttribute("href") !== "#" ) {
4829

    
4830
		Expr.attrHandle.href = function( elem ) {
4831
			return elem.getAttribute( "href", 2 );
4832
		};
4833
	}
4834

    
4835
	// release memory in IE
4836
	div = null;
4837
})();
4838

    
4839
if ( document.querySelectorAll ) {
4840
	(function(){
4841
		var oldSizzle = Sizzle,
4842
			div = document.createElement("div"),
4843
			id = "__sizzle__";
4844

    
4845
		div.innerHTML = "<p class='TEST'></p>";
4846

    
4847
		// Safari can't handle uppercase or unicode characters when
4848
		// in quirks mode.
4849
		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
4850
			return;
4851
		}
4852
	
4853
		Sizzle = function( query, context, extra, seed ) {
4854
			context = context || document;
4855

    
4856
			// Only use querySelectorAll on non-XML documents
4857
			// (ID selectors don't work in non-HTML documents)
4858
			if ( !seed && !Sizzle.isXML(context) ) {
4859
				// See if we find a selector to speed up
4860
				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
4861
				
4862
				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
4863
					// Speed-up: Sizzle("TAG")
4864
					if ( match[1] ) {
4865
						return makeArray( context.getElementsByTagName( query ), extra );
4866
					
4867
					// Speed-up: Sizzle(".CLASS")
4868
					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
4869
						return makeArray( context.getElementsByClassName( match[2] ), extra );
4870
					}
4871
				}
4872
				
4873
				if ( context.nodeType === 9 ) {
4874
					// Speed-up: Sizzle("body")
4875
					// The body element only exists once, optimize finding it
4876
					if ( query === "body" && context.body ) {
4877
						return makeArray( [ context.body ], extra );
4878
						
4879
					// Speed-up: Sizzle("#ID")
4880
					} else if ( match && match[3] ) {
4881
						var elem = context.getElementById( match[3] );
4882

    
4883
						// Check parentNode to catch when Blackberry 4.6 returns
4884
						// nodes that are no longer in the document #6963
4885
						if ( elem && elem.parentNode ) {
4886
							// Handle the case where IE and Opera return items
4887
							// by name instead of ID
4888
							if ( elem.id === match[3] ) {
4889
								return makeArray( [ elem ], extra );
4890
							}
4891
							
4892
						} else {
4893
							return makeArray( [], extra );
4894
						}
4895
					}
4896
					
4897
					try {
4898
						return makeArray( context.querySelectorAll(query), extra );
4899
					} catch(qsaError) {}
4900

    
4901
				// qSA works strangely on Element-rooted queries
4902
				// We can work around this by specifying an extra ID on the root
4903
				// and working up from there (Thanks to Andrew Dupont for the technique)
4904
				// IE 8 doesn't work on object elements
4905
				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
4906
					var oldContext = context,
4907
						old = context.getAttribute( "id" ),
4908
						nid = old || id,
4909
						hasParent = context.parentNode,
4910
						relativeHierarchySelector = /^\s*[+~]/.test( query );
4911

    
4912
					if ( !old ) {
4913
						context.setAttribute( "id", nid );
4914
					} else {
4915
						nid = nid.replace( /'/g, "\\$&" );
4916
					}
4917
					if ( relativeHierarchySelector && hasParent ) {
4918
						context = context.parentNode;
4919
					}
4920

    
4921
					try {
4922
						if ( !relativeHierarchySelector || hasParent ) {
4923
							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
4924
						}
4925

    
4926
					} catch(pseudoError) {
4927
					} finally {
4928
						if ( !old ) {
4929
							oldContext.removeAttribute( "id" );
4930
						}
4931
					}
4932
				}
4933
			}
4934
		
4935
			return oldSizzle(query, context, extra, seed);
4936
		};
4937

    
4938
		for ( var prop in oldSizzle ) {
4939
			Sizzle[ prop ] = oldSizzle[ prop ];
4940
		}
4941

    
4942
		// release memory in IE
4943
		div = null;
4944
	})();
4945
}
4946

    
4947
(function(){
4948
	var html = document.documentElement,
4949
		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
4950

    
4951
	if ( matches ) {
4952
		// Check to see if it's possible to do matchesSelector
4953
		// on a disconnected node (IE 9 fails this)
4954
		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
4955
			pseudoWorks = false;
4956

    
4957
		try {
4958
			// This should fail with an exception
4959
			// Gecko does not error, returns false instead
4960
			matches.call( document.documentElement, "[test!='']:sizzle" );
4961
	
4962
		} catch( pseudoError ) {
4963
			pseudoWorks = true;
4964
		}
4965

    
4966
		Sizzle.matchesSelector = function( node, expr ) {
4967
			// Make sure that attribute selectors are quoted
4968
			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
4969

    
4970
			if ( !Sizzle.isXML( node ) ) {
4971
				try { 
4972
					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
4973
						var ret = matches.call( node, expr );
4974

    
4975
						// IE 9's matchesSelector returns false on disconnected nodes
4976
						if ( ret || !disconnectedMatch ||
4977
								// As well, disconnected nodes are said to be in a document
4978
								// fragment in IE 9, so check for that
4979
								node.document && node.document.nodeType !== 11 ) {
4980
							return ret;
4981
						}
4982
					}
4983
				} catch(e) {}
4984
			}
4985

    
4986
			return Sizzle(expr, null, null, [node]).length > 0;
4987
		};
4988
	}
4989
})();
4990

    
4991
(function(){
4992
	var div = document.createElement("div");
4993

    
4994
	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
4995

    
4996
	// Opera can't find a second classname (in 9.6)
4997
	// Also, make sure that getElementsByClassName actually exists
4998
	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
4999
		return;
5000
	}
5001

    
5002
	// Safari caches class attributes, doesn't catch changes (in 3.2)
5003
	div.lastChild.className = "e";
5004

    
5005
	if ( div.getElementsByClassName("e").length === 1 ) {
5006
		return;
5007
	}
5008
	
5009
	Expr.order.splice(1, 0, "CLASS");
5010
	Expr.find.CLASS = function( match, context, isXML ) {
5011
		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
5012
			return context.getElementsByClassName(match[1]);
5013
		}
5014
	};
5015

    
5016
	// release memory in IE
5017
	div = null;
5018
})();
5019

    
5020
function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5021
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5022
		var elem = checkSet[i];
5023

    
5024
		if ( elem ) {
5025
			var match = false;
5026

    
5027
			elem = elem[dir];
5028

    
5029
			while ( elem ) {
5030
				if ( elem.sizcache === doneName ) {
5031
					match = checkSet[elem.sizset];
5032
					break;
5033
				}
5034

    
5035
				if ( elem.nodeType === 1 && !isXML ){
5036
					elem.sizcache = doneName;
5037
					elem.sizset = i;
5038
				}
5039

    
5040
				if ( elem.nodeName.toLowerCase() === cur ) {
5041
					match = elem;
5042
					break;
5043
				}
5044

    
5045
				elem = elem[dir];
5046
			}
5047

    
5048
			checkSet[i] = match;
5049
		}
5050
	}
5051
}
5052

    
5053
function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
5054
	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
5055
		var elem = checkSet[i];
5056

    
5057
		if ( elem ) {
5058
			var match = false;
5059
			
5060
			elem = elem[dir];
5061

    
5062
			while ( elem ) {
5063
				if ( elem.sizcache === doneName ) {
5064
					match = checkSet[elem.sizset];
5065
					break;
5066
				}
5067

    
5068
				if ( elem.nodeType === 1 ) {
5069
					if ( !isXML ) {
5070
						elem.sizcache = doneName;
5071
						elem.sizset = i;
5072
					}
5073

    
5074
					if ( typeof cur !== "string" ) {
5075
						if ( elem === cur ) {
5076
							match = true;
5077
							break;
5078
						}
5079

    
5080
					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
5081
						match = elem;
5082
						break;
5083
					}
5084
				}
5085

    
5086
				elem = elem[dir];
5087
			}
5088

    
5089
			checkSet[i] = match;
5090
		}
5091
	}
5092
}
5093

    
5094
if ( document.documentElement.contains ) {
5095
	Sizzle.contains = function( a, b ) {
5096
		return a !== b && (a.contains ? a.contains(b) : true);
5097
	};
5098

    
5099
} else if ( document.documentElement.compareDocumentPosition ) {
5100
	Sizzle.contains = function( a, b ) {
5101
		return !!(a.compareDocumentPosition(b) & 16);
5102
	};
5103

    
5104
} else {
5105
	Sizzle.contains = function() {
5106
		return false;
5107
	};
5108
}
5109

    
5110
Sizzle.isXML = function( elem ) {
5111
	// documentElement is verified for cases where it doesn't yet exist
5112
	// (such as loading iframes in IE - #4833) 
5113
	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
5114

    
5115
	return documentElement ? documentElement.nodeName !== "HTML" : false;
5116
};
5117

    
5118
var posProcess = function( selector, context ) {
5119
	var match,
5120
		tmpSet = [],
5121
		later = "",
5122
		root = context.nodeType ? [context] : context;
5123

    
5124
	// Position selectors must be done after the filter
5125
	// And so must :not(positional) so we move all PSEUDOs to the end
5126
	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
5127
		later += match[0];
5128
		selector = selector.replace( Expr.match.PSEUDO, "" );
5129
	}
5130

    
5131
	selector = Expr.relative[selector] ? selector + "*" : selector;
5132

    
5133
	for ( var i = 0, l = root.length; i < l; i++ ) {
5134
		Sizzle( selector, root[i], tmpSet );
5135
	}
5136

    
5137
	return Sizzle.filter( later, tmpSet );
5138
};
5139

    
5140
// EXPOSE
5141
jQuery.find = Sizzle;
5142
jQuery.expr = Sizzle.selectors;
5143
jQuery.expr[":"] = jQuery.expr.filters;
5144
jQuery.unique = Sizzle.uniqueSort;
5145
jQuery.text = Sizzle.getText;
5146
jQuery.isXMLDoc = Sizzle.isXML;
5147
jQuery.contains = Sizzle.contains;
5148

    
5149

    
5150
})();
5151

    
5152

    
5153
var runtil = /Until$/,
5154
	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
5155
	// Note: This RegExp should be improved, or likely pulled from Sizzle
5156
	rmultiselector = /,/,
5157
	isSimple = /^.[^:#\[\.,]*$/,
5158
	slice = Array.prototype.slice,
5159
	POS = jQuery.expr.match.POS,
5160
	// methods guaranteed to produce a unique set when starting from a unique set
5161
	guaranteedUnique = {
5162
		children: true,
5163
		contents: true,
5164
		next: true,
5165
		prev: true
5166
	};
5167

    
5168
jQuery.fn.extend({
5169
	find: function( selector ) {
5170
		var self = this,
5171
			i, l;
5172

    
5173
		if ( typeof selector !== "string" ) {
5174
			return jQuery( selector ).filter(function() {
5175
				for ( i = 0, l = self.length; i < l; i++ ) {
5176
					if ( jQuery.contains( self[ i ], this ) ) {
5177
						return true;
5178
					}
5179
				}
5180
			});
5181
		}
5182

    
5183
		var ret = this.pushStack( "", "find", selector ),
5184
			length, n, r;
5185

    
5186
		for ( i = 0, l = this.length; i < l; i++ ) {
5187
			length = ret.length;
5188
			jQuery.find( selector, this[i], ret );
5189

    
5190
			if ( i > 0 ) {
5191
				// Make sure that the results are unique
5192
				for ( n = length; n < ret.length; n++ ) {
5193
					for ( r = 0; r < length; r++ ) {
5194
						if ( ret[r] === ret[n] ) {
5195
							ret.splice(n--, 1);
5196
							break;
5197
						}
5198
					}
5199
				}
5200
			}
5201
		}
5202

    
5203
		return ret;
5204
	},
5205

    
5206
	has: function( target ) {
5207
		var targets = jQuery( target );
5208
		return this.filter(function() {
5209
			for ( var i = 0, l = targets.length; i < l; i++ ) {
5210
				if ( jQuery.contains( this, targets[i] ) ) {
5211
					return true;
5212
				}
5213
			}
5214
		});
5215
	},
5216

    
5217
	not: function( selector ) {
5218
		return this.pushStack( winnow(this, selector, false), "not", selector);
5219
	},
5220

    
5221
	filter: function( selector ) {
5222
		return this.pushStack( winnow(this, selector, true), "filter", selector );
5223
	},
5224

    
5225
	is: function( selector ) {
5226
		return !!selector && ( typeof selector === "string" ?
5227
			jQuery.filter( selector, this ).length > 0 :
5228
			this.filter( selector ).length > 0 );
5229
	},
5230

    
5231
	closest: function( selectors, context ) {
5232
		var ret = [], i, l, cur = this[0];
5233
		
5234
		// Array
5235
		if ( jQuery.isArray( selectors ) ) {
5236
			var match, selector,
5237
				matches = {},
5238
				level = 1;
5239

    
5240
			if ( cur && selectors.length ) {
5241
				for ( i = 0, l = selectors.length; i < l; i++ ) {
5242
					selector = selectors[i];
5243

    
5244
					if ( !matches[ selector ] ) {
5245
						matches[ selector ] = POS.test( selector ) ?
5246
							jQuery( selector, context || this.context ) :
5247
							selector;
5248
					}
5249
				}
5250

    
5251
				while ( cur && cur.ownerDocument && cur !== context ) {
5252
					for ( selector in matches ) {
5253
						match = matches[ selector ];
5254

    
5255
						if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) {
5256
							ret.push({ selector: selector, elem: cur, level: level });
5257
						}
5258
					}
5259

    
5260
					cur = cur.parentNode;
5261
					level++;
5262
				}
5263
			}
5264

    
5265
			return ret;
5266
		}
5267

    
5268
		// String
5269
		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
5270
				jQuery( selectors, context || this.context ) :
5271
				0;
5272

    
5273
		for ( i = 0, l = this.length; i < l; i++ ) {
5274
			cur = this[i];
5275

    
5276
			while ( cur ) {
5277
				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
5278
					ret.push( cur );
5279
					break;
5280

    
5281
				} else {
5282
					cur = cur.parentNode;
5283
					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
5284
						break;
5285
					}
5286
				}
5287
			}
5288
		}
5289

    
5290
		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
5291

    
5292
		return this.pushStack( ret, "closest", selectors );
5293
	},
5294

    
5295
	// Determine the position of an element within
5296
	// the matched set of elements
5297
	index: function( elem ) {
5298
		if ( !elem || typeof elem === "string" ) {
5299
			return jQuery.inArray( this[0],
5300
				// If it receives a string, the selector is used
5301
				// If it receives nothing, the siblings are used
5302
				elem ? jQuery( elem ) : this.parent().children() );
5303
		}
5304
		// Locate the position of the desired element
5305
		return jQuery.inArray(
5306
			// If it receives a jQuery object, the first element is used
5307
			elem.jquery ? elem[0] : elem, this );
5308
	},
5309

    
5310
	add: function( selector, context ) {
5311
		var set = typeof selector === "string" ?
5312
				jQuery( selector, context ) :
5313
				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
5314
			all = jQuery.merge( this.get(), set );
5315

    
5316
		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
5317
			all :
5318
			jQuery.unique( all ) );
5319
	},
5320

    
5321
	andSelf: function() {
5322
		return this.add( this.prevObject );
5323
	}
5324
});
5325

    
5326
// A painfully simple check to see if an element is disconnected
5327
// from a document (should be improved, where feasible).
5328
function isDisconnected( node ) {
5329
	return !node || !node.parentNode || node.parentNode.nodeType === 11;
5330
}
5331

    
5332
jQuery.each({
5333
	parent: function( elem ) {
5334
		var parent = elem.parentNode;
5335
		return parent && parent.nodeType !== 11 ? parent : null;
5336
	},
5337
	parents: function( elem ) {
5338
		return jQuery.dir( elem, "parentNode" );
5339
	},
5340
	parentsUntil: function( elem, i, until ) {
5341
		return jQuery.dir( elem, "parentNode", until );
5342
	},
5343
	next: function( elem ) {
5344
		return jQuery.nth( elem, 2, "nextSibling" );
5345
	},
5346
	prev: function( elem ) {
5347
		return jQuery.nth( elem, 2, "previousSibling" );
5348
	},
5349
	nextAll: function( elem ) {
5350
		return jQuery.dir( elem, "nextSibling" );
5351
	},
5352
	prevAll: function( elem ) {
5353
		return jQuery.dir( elem, "previousSibling" );
5354
	},
5355
	nextUntil: function( elem, i, until ) {
5356
		return jQuery.dir( elem, "nextSibling", until );
5357
	},
5358
	prevUntil: function( elem, i, until ) {
5359
		return jQuery.dir( elem, "previousSibling", until );
5360
	},
5361
	siblings: function( elem ) {
5362
		return jQuery.sibling( elem.parentNode.firstChild, elem );
5363
	},
5364
	children: function( elem ) {
5365
		return jQuery.sibling( elem.firstChild );
5366
	},
5367
	contents: function( elem ) {
5368
		return jQuery.nodeName( elem, "iframe" ) ?
5369
			elem.contentDocument || elem.contentWindow.document :
5370
			jQuery.makeArray( elem.childNodes );
5371
	}
5372
}, function( name, fn ) {
5373
	jQuery.fn[ name ] = function( until, selector ) {
5374
		var ret = jQuery.map( this, fn, until ),
5375
			// The variable 'args' was introduced in
5376
			// https://github.com/jquery/jquery/commit/52a0238
5377
			// to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
5378
			// http://code.google.com/p/v8/issues/detail?id=1050
5379
			args = slice.call(arguments);
5380

    
5381
		if ( !runtil.test( name ) ) {
5382
			selector = until;
5383
		}
5384

    
5385
		if ( selector && typeof selector === "string" ) {
5386
			ret = jQuery.filter( selector, ret );
5387
		}
5388

    
5389
		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
5390

    
5391
		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
5392
			ret = ret.reverse();
5393
		}
5394

    
5395
		return this.pushStack( ret, name, args.join(",") );
5396
	};
5397
});
5398

    
5399
jQuery.extend({
5400
	filter: function( expr, elems, not ) {
5401
		if ( not ) {
5402
			expr = ":not(" + expr + ")";
5403
		}
5404

    
5405
		return elems.length === 1 ?
5406
			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
5407
			jQuery.find.matches(expr, elems);
5408
	},
5409

    
5410
	dir: function( elem, dir, until ) {
5411
		var matched = [],
5412
			cur = elem[ dir ];
5413

    
5414
		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
5415
			if ( cur.nodeType === 1 ) {
5416
				matched.push( cur );
5417
			}
5418
			cur = cur[dir];
5419
		}
5420
		return matched;
5421
	},
5422

    
5423
	nth: function( cur, result, dir, elem ) {
5424
		result = result || 1;
5425
		var num = 0;
5426

    
5427
		for ( ; cur; cur = cur[dir] ) {
5428
			if ( cur.nodeType === 1 && ++num === result ) {
5429
				break;
5430
			}
5431
		}
5432

    
5433
		return cur;
5434
	},
5435

    
5436
	sibling: function( n, elem ) {
5437
		var r = [];
5438

    
5439
		for ( ; n; n = n.nextSibling ) {
5440
			if ( n.nodeType === 1 && n !== elem ) {
5441
				r.push( n );
5442
			}
5443
		}
5444

    
5445
		return r;
5446
	}
5447
});
5448

    
5449
// Implement the identical functionality for filter and not
5450
function winnow( elements, qualifier, keep ) {
5451

    
5452
	// Can't pass null or undefined to indexOf in Firefox 4
5453
	// Set to 0 to skip string check
5454
	qualifier = qualifier || 0;
5455

    
5456
	if ( jQuery.isFunction( qualifier ) ) {
5457
		return jQuery.grep(elements, function( elem, i ) {
5458
			var retVal = !!qualifier.call( elem, i, elem );
5459
			return retVal === keep;
5460
		});
5461

    
5462
	} else if ( qualifier.nodeType ) {
5463
		return jQuery.grep(elements, function( elem, i ) {
5464
			return (elem === qualifier) === keep;
5465
		});
5466

    
5467
	} else if ( typeof qualifier === "string" ) {
5468
		var filtered = jQuery.grep(elements, function( elem ) {
5469
			return elem.nodeType === 1;
5470
		});
5471

    
5472
		if ( isSimple.test( qualifier ) ) {
5473
			return jQuery.filter(qualifier, filtered, !keep);
5474
		} else {
5475
			qualifier = jQuery.filter( qualifier, filtered );
5476
		}
5477
	}
5478

    
5479
	return jQuery.grep(elements, function( elem, i ) {
5480
		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
5481
	});
5482
}
5483

    
5484

    
5485

    
5486

    
5487
var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
5488
	rleadingWhitespace = /^\s+/,
5489
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
5490
	rtagName = /<([\w:]+)/,
5491
	rtbody = /<tbody/i,
5492
	rhtml = /<|&#?\w+;/,
5493
	rnocache = /<(?:script|object|embed|option|style)/i,
5494
	// checked="checked" or checked
5495
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
5496
	rscriptType = /\/(java|ecma)script/i,
5497
	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
5498
	wrapMap = {
5499
		option: [ 1, "<select multiple='multiple'>", "</select>" ],
5500
		legend: [ 1, "<fieldset>", "</fieldset>" ],
5501
		thead: [ 1, "<table>", "</table>" ],
5502
		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
5503
		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
5504
		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
5505
		area: [ 1, "<map>", "</map>" ],
5506
		_default: [ 0, "", "" ]
5507
	};
5508

    
5509
wrapMap.optgroup = wrapMap.option;
5510
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
5511
wrapMap.th = wrapMap.td;
5512

    
5513
// IE can't serialize <link> and <script> tags normally
5514
if ( !jQuery.support.htmlSerialize ) {
5515
	wrapMap._default = [ 1, "div<div>", "</div>" ];
5516
}
5517

    
5518
jQuery.fn.extend({
5519
	text: function( text ) {
5520
		if ( jQuery.isFunction(text) ) {
5521
			return this.each(function(i) {
5522
				var self = jQuery( this );
5523

    
5524
				self.text( text.call(this, i, self.text()) );
5525
			});
5526
		}
5527

    
5528
		if ( typeof text !== "object" && text !== undefined ) {
5529
			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
5530
		}
5531

    
5532
		return jQuery.text( this );
5533
	},
5534

    
5535
	wrapAll: function( html ) {
5536
		if ( jQuery.isFunction( html ) ) {
5537
			return this.each(function(i) {
5538
				jQuery(this).wrapAll( html.call(this, i) );
5539
			});
5540
		}
5541

    
5542
		if ( this[0] ) {
5543
			// The elements to wrap the target around
5544
			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
5545

    
5546
			if ( this[0].parentNode ) {
5547
				wrap.insertBefore( this[0] );
5548
			}
5549

    
5550
			wrap.map(function() {
5551
				var elem = this;
5552

    
5553
				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
5554
					elem = elem.firstChild;
5555
				}
5556

    
5557
				return elem;
5558
			}).append( this );
5559
		}
5560

    
5561
		return this;
5562
	},
5563

    
5564
	wrapInner: function( html ) {
5565
		if ( jQuery.isFunction( html ) ) {
5566
			return this.each(function(i) {
5567
				jQuery(this).wrapInner( html.call(this, i) );
5568
			});
5569
		}
5570

    
5571
		return this.each(function() {
5572
			var self = jQuery( this ),
5573
				contents = self.contents();
5574

    
5575
			if ( contents.length ) {
5576
				contents.wrapAll( html );
5577

    
5578
			} else {
5579
				self.append( html );
5580
			}
5581
		});
5582
	},
5583

    
5584
	wrap: function( html ) {
5585
		return this.each(function() {
5586
			jQuery( this ).wrapAll( html );
5587
		});
5588
	},
5589

    
5590
	unwrap: function() {
5591
		return this.parent().each(function() {
5592
			if ( !jQuery.nodeName( this, "body" ) ) {
5593
				jQuery( this ).replaceWith( this.childNodes );
5594
			}
5595
		}).end();
5596
	},
5597

    
5598
	append: function() {
5599
		return this.domManip(arguments, true, function( elem ) {
5600
			if ( this.nodeType === 1 ) {
5601
				this.appendChild( elem );
5602
			}
5603
		});
5604
	},
5605

    
5606
	prepend: function() {
5607
		return this.domManip(arguments, true, function( elem ) {
5608
			if ( this.nodeType === 1 ) {
5609
				this.insertBefore( elem, this.firstChild );
5610
			}
5611
		});
5612
	},
5613

    
5614
	before: function() {
5615
		if ( this[0] && this[0].parentNode ) {
5616
			return this.domManip(arguments, false, function( elem ) {
5617
				this.parentNode.insertBefore( elem, this );
5618
			});
5619
		} else if ( arguments.length ) {
5620
			var set = jQuery(arguments[0]);
5621
			set.push.apply( set, this.toArray() );
5622
			return this.pushStack( set, "before", arguments );
5623
		}
5624
	},
5625

    
5626
	after: function() {
5627
		if ( this[0] && this[0].parentNode ) {
5628
			return this.domManip(arguments, false, function( elem ) {
5629
				this.parentNode.insertBefore( elem, this.nextSibling );
5630
			});
5631
		} else if ( arguments.length ) {
5632
			var set = this.pushStack( this, "after", arguments );
5633
			set.push.apply( set, jQuery(arguments[0]).toArray() );
5634
			return set;
5635
		}
5636
	},
5637

    
5638
	// keepData is for internal use only--do not document
5639
	remove: function( selector, keepData ) {
5640
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5641
			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
5642
				if ( !keepData && elem.nodeType === 1 ) {
5643
					jQuery.cleanData( elem.getElementsByTagName("*") );
5644
					jQuery.cleanData( [ elem ] );
5645
				}
5646

    
5647
				if ( elem.parentNode ) {
5648
					elem.parentNode.removeChild( elem );
5649
				}
5650
			}
5651
		}
5652

    
5653
		return this;
5654
	},
5655

    
5656
	empty: function() {
5657
		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
5658
			// Remove element nodes and prevent memory leaks
5659
			if ( elem.nodeType === 1 ) {
5660
				jQuery.cleanData( elem.getElementsByTagName("*") );
5661
			}
5662

    
5663
			// Remove any remaining nodes
5664
			while ( elem.firstChild ) {
5665
				elem.removeChild( elem.firstChild );
5666
			}
5667
		}
5668

    
5669
		return this;
5670
	},
5671

    
5672
	clone: function( dataAndEvents, deepDataAndEvents ) {
5673
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
5674
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
5675

    
5676
		return this.map( function () {
5677
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
5678
		});
5679
	},
5680

    
5681
	html: function( value ) {
5682
		if ( value === undefined ) {
5683
			return this[0] && this[0].nodeType === 1 ?
5684
				this[0].innerHTML.replace(rinlinejQuery, "") :
5685
				null;
5686

    
5687
		// See if we can take a shortcut and just use innerHTML
5688
		} else if ( typeof value === "string" && !rnocache.test( value ) &&
5689
			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
5690
			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
5691

    
5692
			value = value.replace(rxhtmlTag, "<$1></$2>");
5693

    
5694
			try {
5695
				for ( var i = 0, l = this.length; i < l; i++ ) {
5696
					// Remove element nodes and prevent memory leaks
5697
					if ( this[i].nodeType === 1 ) {
5698
						jQuery.cleanData( this[i].getElementsByTagName("*") );
5699
						this[i].innerHTML = value;
5700
					}
5701
				}
5702

    
5703
			// If using innerHTML throws an exception, use the fallback method
5704
			} catch(e) {
5705
				this.empty().append( value );
5706
			}
5707

    
5708
		} else if ( jQuery.isFunction( value ) ) {
5709
			this.each(function(i){
5710
				var self = jQuery( this );
5711

    
5712
				self.html( value.call(this, i, self.html()) );
5713
			});
5714

    
5715
		} else {
5716
			this.empty().append( value );
5717
		}
5718

    
5719
		return this;
5720
	},
5721

    
5722
	replaceWith: function( value ) {
5723
		if ( this[0] && this[0].parentNode ) {
5724
			// Make sure that the elements are removed from the DOM before they are inserted
5725
			// this can help fix replacing a parent with child elements
5726
			if ( jQuery.isFunction( value ) ) {
5727
				return this.each(function(i) {
5728
					var self = jQuery(this), old = self.html();
5729
					self.replaceWith( value.call( this, i, old ) );
5730
				});
5731
			}
5732

    
5733
			if ( typeof value !== "string" ) {
5734
				value = jQuery( value ).detach();
5735
			}
5736

    
5737
			return this.each(function() {
5738
				var next = this.nextSibling,
5739
					parent = this.parentNode;
5740

    
5741
				jQuery( this ).remove();
5742

    
5743
				if ( next ) {
5744
					jQuery(next).before( value );
5745
				} else {
5746
					jQuery(parent).append( value );
5747
				}
5748
			});
5749
		} else {
5750
			return this.length ?
5751
				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
5752
				this;
5753
		}
5754
	},
5755

    
5756
	detach: function( selector ) {
5757
		return this.remove( selector, true );
5758
	},
5759

    
5760
	domManip: function( args, table, callback ) {
5761
		var results, first, fragment, parent,
5762
			value = args[0],
5763
			scripts = [];
5764

    
5765
		// We can't cloneNode fragments that contain checked, in WebKit
5766
		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
5767
			return this.each(function() {
5768
				jQuery(this).domManip( args, table, callback, true );
5769
			});
5770
		}
5771

    
5772
		if ( jQuery.isFunction(value) ) {
5773
			return this.each(function(i) {
5774
				var self = jQuery(this);
5775
				args[0] = value.call(this, i, table ? self.html() : undefined);
5776
				self.domManip( args, table, callback );
5777
			});
5778
		}
5779

    
5780
		if ( this[0] ) {
5781
			parent = value && value.parentNode;
5782

    
5783
			// If we're in a fragment, just use that instead of building a new one
5784
			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
5785
				results = { fragment: parent };
5786

    
5787
			} else {
5788
				results = jQuery.buildFragment( args, this, scripts );
5789
			}
5790

    
5791
			fragment = results.fragment;
5792

    
5793
			if ( fragment.childNodes.length === 1 ) {
5794
				first = fragment = fragment.firstChild;
5795
			} else {
5796
				first = fragment.firstChild;
5797
			}
5798

    
5799
			if ( first ) {
5800
				table = table && jQuery.nodeName( first, "tr" );
5801

    
5802
				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
5803
					callback.call(
5804
						table ?
5805
							root(this[i], first) :
5806
							this[i],
5807
						// Make sure that we do not leak memory by inadvertently discarding
5808
						// the original fragment (which might have attached data) instead of
5809
						// using it; in addition, use the original fragment object for the last
5810
						// item instead of first because it can end up being emptied incorrectly
5811
						// in certain situations (Bug #8070).
5812
						// Fragments from the fragment cache must always be cloned and never used
5813
						// in place.
5814
						results.cacheable || (l > 1 && i < lastIndex) ?
5815
							jQuery.clone( fragment, true, true ) :
5816
							fragment
5817
					);
5818
				}
5819
			}
5820

    
5821
			if ( scripts.length ) {
5822
				jQuery.each( scripts, evalScript );
5823
			}
5824
		}
5825

    
5826
		return this;
5827
	}
5828
});
5829

    
5830
function root( elem, cur ) {
5831
	return jQuery.nodeName(elem, "table") ?
5832
		(elem.getElementsByTagName("tbody")[0] ||
5833
		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
5834
		elem;
5835
}
5836

    
5837
function cloneCopyEvent( src, dest ) {
5838

    
5839
	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
5840
		return;
5841
	}
5842

    
5843
	var internalKey = jQuery.expando,
5844
		oldData = jQuery.data( src ),
5845
		curData = jQuery.data( dest, oldData );
5846

    
5847
	// Switch to use the internal data object, if it exists, for the next
5848
	// stage of data copying
5849
	if ( (oldData = oldData[ internalKey ]) ) {
5850
		var events = oldData.events;
5851
				curData = curData[ internalKey ] = jQuery.extend({}, oldData);
5852

    
5853
		if ( events ) {
5854
			delete curData.handle;
5855
			curData.events = {};
5856

    
5857
			for ( var type in events ) {
5858
				for ( var i = 0, l = events[ type ].length; i < l; i++ ) {
5859
					jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
5860
				}
5861
			}
5862
		}
5863
	}
5864
}
5865

    
5866
function cloneFixAttributes( src, dest ) {
5867
	var nodeName;
5868

    
5869
	// We do not need to do anything for non-Elements
5870
	if ( dest.nodeType !== 1 ) {
5871
		return;
5872
	}
5873

    
5874
	// clearAttributes removes the attributes, which we don't want,
5875
	// but also removes the attachEvent events, which we *do* want
5876
	if ( dest.clearAttributes ) {
5877
		dest.clearAttributes();
5878
	}
5879

    
5880
	// mergeAttributes, in contrast, only merges back on the
5881
	// original attributes, not the events
5882
	if ( dest.mergeAttributes ) {
5883
		dest.mergeAttributes( src );
5884
	}
5885

    
5886
	nodeName = dest.nodeName.toLowerCase();
5887

    
5888
	// IE6-8 fail to clone children inside object elements that use
5889
	// the proprietary classid attribute value (rather than the type
5890
	// attribute) to identify the type of content to display
5891
	if ( nodeName === "object" ) {
5892
		dest.outerHTML = src.outerHTML;
5893

    
5894
	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
5895
		// IE6-8 fails to persist the checked state of a cloned checkbox
5896
		// or radio button. Worse, IE6-7 fail to give the cloned element
5897
		// a checked appearance if the defaultChecked value isn't also set
5898
		if ( src.checked ) {
5899
			dest.defaultChecked = dest.checked = src.checked;
5900
		}
5901

    
5902
		// IE6-7 get confused and end up setting the value of a cloned
5903
		// checkbox/radio button to an empty string instead of "on"
5904
		if ( dest.value !== src.value ) {
5905
			dest.value = src.value;
5906
		}
5907

    
5908
	// IE6-8 fails to return the selected option to the default selected
5909
	// state when cloning options
5910
	} else if ( nodeName === "option" ) {
5911
		dest.selected = src.defaultSelected;
5912

    
5913
	// IE6-8 fails to set the defaultValue to the correct value when
5914
	// cloning other types of input fields
5915
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
5916
		dest.defaultValue = src.defaultValue;
5917
	}
5918

    
5919
	// Event data gets referenced instead of copied if the expando
5920
	// gets copied too
5921
	dest.removeAttribute( jQuery.expando );
5922
}
5923

    
5924
jQuery.buildFragment = function( args, nodes, scripts ) {
5925
	var fragment, cacheable, cacheresults, doc;
5926

    
5927
  // nodes may contain either an explicit document object,
5928
  // a jQuery collection or context object.
5929
  // If nodes[0] contains a valid object to assign to doc
5930
  if ( nodes && nodes[0] ) {
5931
    doc = nodes[0].ownerDocument || nodes[0];
5932
  }
5933

    
5934
  // Ensure that an attr object doesn't incorrectly stand in as a document object
5935
	// Chrome and Firefox seem to allow this to occur and will throw exception
5936
	// Fixes #8950
5937
	if ( !doc.createDocumentFragment ) {
5938
		doc = document;
5939
	}
5940

    
5941
	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
5942
	// Cloning options loses the selected state, so don't cache them
5943
	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
5944
	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
5945
	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
5946
		args[0].charAt(0) === "<" && !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
5947

    
5948
		cacheable = true;
5949

    
5950
		cacheresults = jQuery.fragments[ args[0] ];
5951
		if ( cacheresults && cacheresults !== 1 ) {
5952
			fragment = cacheresults;
5953
		}
5954
	}
5955

    
5956
	if ( !fragment ) {
5957
		fragment = doc.createDocumentFragment();
5958
		jQuery.clean( args, doc, fragment, scripts );
5959
	}
5960

    
5961
	if ( cacheable ) {
5962
		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
5963
	}
5964

    
5965
	return { fragment: fragment, cacheable: cacheable };
5966
};
5967

    
5968
jQuery.fragments = {};
5969

    
5970
jQuery.each({
5971
	appendTo: "append",
5972
	prependTo: "prepend",
5973
	insertBefore: "before",
5974
	insertAfter: "after",
5975
	replaceAll: "replaceWith"
5976
}, function( name, original ) {
5977
	jQuery.fn[ name ] = function( selector ) {
5978
		var ret = [],
5979
			insert = jQuery( selector ),
5980
			parent = this.length === 1 && this[0].parentNode;
5981

    
5982
		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
5983
			insert[ original ]( this[0] );
5984
			return this;
5985

    
5986
		} else {
5987
			for ( var i = 0, l = insert.length; i < l; i++ ) {
5988
				var elems = (i > 0 ? this.clone(true) : this).get();
5989
				jQuery( insert[i] )[ original ]( elems );
5990
				ret = ret.concat( elems );
5991
			}
5992

    
5993
			return this.pushStack( ret, name, insert.selector );
5994
		}
5995
	};
5996
});
5997

    
5998
function getAll( elem ) {
5999
	if ( "getElementsByTagName" in elem ) {
6000
		return elem.getElementsByTagName( "*" );
6001

    
6002
	} else if ( "querySelectorAll" in elem ) {
6003
		return elem.querySelectorAll( "*" );
6004

    
6005
	} else {
6006
		return [];
6007
	}
6008
}
6009

    
6010
// Used in clean, fixes the defaultChecked property
6011
function fixDefaultChecked( elem ) {
6012
	if ( elem.type === "checkbox" || elem.type === "radio" ) {
6013
		elem.defaultChecked = elem.checked;
6014
	}
6015
}
6016
// Finds all inputs and passes them to fixDefaultChecked
6017
function findInputs( elem ) {
6018
	if ( jQuery.nodeName( elem, "input" ) ) {
6019
		fixDefaultChecked( elem );
6020
	} else if ( "getElementsByTagName" in elem ) {
6021
		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
6022
	}
6023
}
6024

    
6025
jQuery.extend({
6026
	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
6027
		var clone = elem.cloneNode(true),
6028
				srcElements,
6029
				destElements,
6030
				i;
6031

    
6032
		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
6033
				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
6034
			// IE copies events bound via attachEvent when using cloneNode.
6035
			// Calling detachEvent on the clone will also remove the events
6036
			// from the original. In order to get around this, we use some
6037
			// proprietary methods to clear the events. Thanks to MooTools
6038
			// guys for this hotness.
6039

    
6040
			cloneFixAttributes( elem, clone );
6041

    
6042
			// Using Sizzle here is crazy slow, so we use getElementsByTagName
6043
			// instead
6044
			srcElements = getAll( elem );
6045
			destElements = getAll( clone );
6046

    
6047
			// Weird iteration because IE will replace the length property
6048
			// with an element if you are cloning the body and one of the
6049
			// elements on the page has a name or id of "length"
6050
			for ( i = 0; srcElements[i]; ++i ) {
6051
				cloneFixAttributes( srcElements[i], destElements[i] );
6052
			}
6053
		}
6054

    
6055
		// Copy the events from the original to the clone
6056
		if ( dataAndEvents ) {
6057
			cloneCopyEvent( elem, clone );
6058

    
6059
			if ( deepDataAndEvents ) {
6060
				srcElements = getAll( elem );
6061
				destElements = getAll( clone );
6062

    
6063
				for ( i = 0; srcElements[i]; ++i ) {
6064
					cloneCopyEvent( srcElements[i], destElements[i] );
6065
				}
6066
			}
6067
		}
6068

    
6069
		srcElements = destElements = null;
6070

    
6071
		// Return the cloned set
6072
		return clone;
6073
	},
6074

    
6075
	clean: function( elems, context, fragment, scripts ) {
6076
		var checkScriptType;
6077

    
6078
		context = context || document;
6079

    
6080
		// !context.createElement fails in IE with an error but returns typeof 'object'
6081
		if ( typeof context.createElement === "undefined" ) {
6082
			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
6083
		}
6084

    
6085
		var ret = [], j;
6086

    
6087
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6088
			if ( typeof elem === "number" ) {
6089
				elem += "";
6090
			}
6091

    
6092
			if ( !elem ) {
6093
				continue;
6094
			}
6095

    
6096
			// Convert html string into DOM nodes
6097
			if ( typeof elem === "string" ) {
6098
				if ( !rhtml.test( elem ) ) {
6099
					elem = context.createTextNode( elem );
6100
				} else {
6101
					// Fix "XHTML"-style tags in all browsers
6102
					elem = elem.replace(rxhtmlTag, "<$1></$2>");
6103

    
6104
					// Trim whitespace, otherwise indexOf won't work as expected
6105
					var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
6106
						wrap = wrapMap[ tag ] || wrapMap._default,
6107
						depth = wrap[0],
6108
						div = context.createElement("div");
6109

    
6110
					// Go to html and back, then peel off extra wrappers
6111
					div.innerHTML = wrap[1] + elem + wrap[2];
6112

    
6113
					// Move to the right depth
6114
					while ( depth-- ) {
6115
						div = div.lastChild;
6116
					}
6117

    
6118
					// Remove IE's autoinserted <tbody> from table fragments
6119
					if ( !jQuery.support.tbody ) {
6120

    
6121
						// String was a <table>, *may* have spurious <tbody>
6122
						var hasBody = rtbody.test(elem),
6123
							tbody = tag === "table" && !hasBody ?
6124
								div.firstChild && div.firstChild.childNodes :
6125

    
6126
								// String was a bare <thead> or <tfoot>
6127
								wrap[1] === "<table>" && !hasBody ?
6128
									div.childNodes :
6129
									[];
6130

    
6131
						for ( j = tbody.length - 1; j >= 0 ; --j ) {
6132
							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
6133
								tbody[ j ].parentNode.removeChild( tbody[ j ] );
6134
							}
6135
						}
6136
					}
6137

    
6138
					// IE completely kills leading whitespace when innerHTML is used
6139
					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
6140
						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
6141
					}
6142

    
6143
					elem = div.childNodes;
6144
				}
6145
			}
6146

    
6147
			// Resets defaultChecked for any radios and checkboxes
6148
			// about to be appended to the DOM in IE 6/7 (#8060)
6149
			var len;
6150
			if ( !jQuery.support.appendChecked ) {
6151
				if ( elem[0] && typeof (len = elem.length) === "number" ) {
6152
					for ( j = 0; j < len; j++ ) {
6153
						findInputs( elem[j] );
6154
					}
6155
				} else {
6156
					findInputs( elem );
6157
				}
6158
			}
6159

    
6160
			if ( elem.nodeType ) {
6161
				ret.push( elem );
6162
			} else {
6163
				ret = jQuery.merge( ret, elem );
6164
			}
6165
		}
6166

    
6167
		if ( fragment ) {
6168
			checkScriptType = function( elem ) {
6169
				return !elem.type || rscriptType.test( elem.type );
6170
			};
6171
			for ( i = 0; ret[i]; i++ ) {
6172
				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
6173
					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
6174

    
6175
				} else {
6176
					if ( ret[i].nodeType === 1 ) {
6177
						var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
6178

    
6179
						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
6180
					}
6181
					fragment.appendChild( ret[i] );
6182
				}
6183
			}
6184
		}
6185

    
6186
		return ret;
6187
	},
6188

    
6189
	cleanData: function( elems ) {
6190
		var data, id, cache = jQuery.cache, internalKey = jQuery.expando, special = jQuery.event.special,
6191
			deleteExpando = jQuery.support.deleteExpando;
6192

    
6193
		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
6194
			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
6195
				continue;
6196
			}
6197

    
6198
			id = elem[ jQuery.expando ];
6199

    
6200
			if ( id ) {
6201
				data = cache[ id ] && cache[ id ][ internalKey ];
6202

    
6203
				if ( data && data.events ) {
6204
					for ( var type in data.events ) {
6205
						if ( special[ type ] ) {
6206
							jQuery.event.remove( elem, type );
6207

    
6208
						// This is a shortcut to avoid jQuery.event.remove's overhead
6209
						} else {
6210
							jQuery.removeEvent( elem, type, data.handle );
6211
						}
6212
					}
6213

    
6214
					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
6215
					if ( data.handle ) {
6216
						data.handle.elem = null;
6217
					}
6218
				}
6219

    
6220
				if ( deleteExpando ) {
6221
					delete elem[ jQuery.expando ];
6222

    
6223
				} else if ( elem.removeAttribute ) {
6224
					elem.removeAttribute( jQuery.expando );
6225
				}
6226

    
6227
				delete cache[ id ];
6228
			}
6229
		}
6230
	}
6231
});
6232

    
6233
function evalScript( i, elem ) {
6234
	if ( elem.src ) {
6235
		jQuery.ajax({
6236
			url: elem.src,
6237
			async: false,
6238
			dataType: "script"
6239
		});
6240
	} else {
6241
		jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
6242
	}
6243

    
6244
	if ( elem.parentNode ) {
6245
		elem.parentNode.removeChild( elem );
6246
	}
6247
}
6248

    
6249

    
6250

    
6251
var ralpha = /alpha\([^)]*\)/i,
6252
	ropacity = /opacity=([^)]*)/,
6253
	// fixed for IE9, see #8346
6254
	rupper = /([A-Z]|^ms)/g,
6255
	rnumpx = /^-?\d+(?:px)?$/i,
6256
	rnum = /^-?\d/,
6257
	rrelNum = /^[+\-]=/,
6258
	rrelNumFilter = /[^+\-\.\de]+/g,
6259

    
6260
	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
6261
	cssWidth = [ "Left", "Right" ],
6262
	cssHeight = [ "Top", "Bottom" ],
6263
	curCSS,
6264

    
6265
	getComputedStyle,
6266
	currentStyle;
6267

    
6268
jQuery.fn.css = function( name, value ) {
6269
	// Setting 'undefined' is a no-op
6270
	if ( arguments.length === 2 && value === undefined ) {
6271
		return this;
6272
	}
6273

    
6274
	return jQuery.access( this, name, value, true, function( elem, name, value ) {
6275
		return value !== undefined ?
6276
			jQuery.style( elem, name, value ) :
6277
			jQuery.css( elem, name );
6278
	});
6279
};
6280

    
6281
jQuery.extend({
6282
	// Add in style property hooks for overriding the default
6283
	// behavior of getting and setting a style property
6284
	cssHooks: {
6285
		opacity: {
6286
			get: function( elem, computed ) {
6287
				if ( computed ) {
6288
					// We should always get a number back from opacity
6289
					var ret = curCSS( elem, "opacity", "opacity" );
6290
					return ret === "" ? "1" : ret;
6291

    
6292
				} else {
6293
					return elem.style.opacity;
6294
				}
6295
			}
6296
		}
6297
	},
6298

    
6299
	// Exclude the following css properties to add px
6300
	cssNumber: {
6301
		"fillOpacity": true,
6302
		"fontWeight": true,
6303
		"lineHeight": true,
6304
		"opacity": true,
6305
		"orphans": true,
6306
		"widows": true,
6307
		"zIndex": true,
6308
		"zoom": true
6309
	},
6310

    
6311
	// Add in properties whose names you wish to fix before
6312
	// setting or getting the value
6313
	cssProps: {
6314
		// normalize float css property
6315
		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
6316
	},
6317

    
6318
	// Get and set the style property on a DOM Node
6319
	style: function( elem, name, value, extra ) {
6320
		// Don't set styles on text and comment nodes
6321
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
6322
			return;
6323
		}
6324

    
6325
		// Make sure that we're working with the right name
6326
		var ret, type, origName = jQuery.camelCase( name ),
6327
			style = elem.style, hooks = jQuery.cssHooks[ origName ];
6328

    
6329
		name = jQuery.cssProps[ origName ] || origName;
6330

    
6331
		// Check if we're setting a value
6332
		if ( value !== undefined ) {
6333
			type = typeof value;
6334

    
6335
			// Make sure that NaN and null values aren't set. See: #7116
6336
			if ( type === "number" && isNaN( value ) || value == null ) {
6337
				return;
6338
			}
6339

    
6340
			// convert relative number strings (+= or -=) to relative numbers. #7345
6341
			if ( type === "string" && rrelNum.test( value ) ) {
6342
				value = +value.replace( rrelNumFilter, "" ) + parseFloat( jQuery.css( elem, name ) );
6343
				// Fixes bug #9237
6344
				type = "number";
6345
			}
6346

    
6347
			// If a number was passed in, add 'px' to the (except for certain CSS properties)
6348
			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
6349
				value += "px";
6350
			}
6351

    
6352
			// If a hook was provided, use that value, otherwise just set the specified value
6353
			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
6354
				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
6355
				// Fixes bug #5509
6356
				try {
6357
					style[ name ] = value;
6358
				} catch(e) {}
6359
			}
6360

    
6361
		} else {
6362
			// If a hook was provided get the non-computed value from there
6363
			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
6364
				return ret;
6365
			}
6366

    
6367
			// Otherwise just get the value from the style object
6368
			return style[ name ];
6369
		}
6370
	},
6371

    
6372
	css: function( elem, name, extra ) {
6373
		var ret, hooks;
6374

    
6375
		// Make sure that we're working with the right name
6376
		name = jQuery.camelCase( name );
6377
		hooks = jQuery.cssHooks[ name ];
6378
		name = jQuery.cssProps[ name ] || name;
6379

    
6380
		// cssFloat needs a special treatment
6381
		if ( name === "cssFloat" ) {
6382
			name = "float";
6383
		}
6384

    
6385
		// If a hook was provided get the computed value from there
6386
		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
6387
			return ret;
6388

    
6389
		// Otherwise, if a way to get the computed value exists, use that
6390
		} else if ( curCSS ) {
6391
			return curCSS( elem, name );
6392
		}
6393
	},
6394

    
6395
	// A method for quickly swapping in/out CSS properties to get correct calculations
6396
	swap: function( elem, options, callback ) {
6397
		var old = {};
6398

    
6399
		// Remember the old values, and insert the new ones
6400
		for ( var name in options ) {
6401
			old[ name ] = elem.style[ name ];
6402
			elem.style[ name ] = options[ name ];
6403
		}
6404

    
6405
		callback.call( elem );
6406

    
6407
		// Revert the old values
6408
		for ( name in options ) {
6409
			elem.style[ name ] = old[ name ];
6410
		}
6411
	}
6412
});
6413

    
6414
// DEPRECATED, Use jQuery.css() instead
6415
jQuery.curCSS = jQuery.css;
6416

    
6417
jQuery.each(["height", "width"], function( i, name ) {
6418
	jQuery.cssHooks[ name ] = {
6419
		get: function( elem, computed, extra ) {
6420
			var val;
6421

    
6422
			if ( computed ) {
6423
				if ( elem.offsetWidth !== 0 ) {
6424
					return getWH( elem, name, extra );
6425
				} else {
6426
					jQuery.swap( elem, cssShow, function() {
6427
						val = getWH( elem, name, extra );
6428
					});
6429
				}
6430

    
6431
				return val;
6432
			}
6433
		},
6434

    
6435
		set: function( elem, value ) {
6436
			if ( rnumpx.test( value ) ) {
6437
				// ignore negative width and height values #1599
6438
				value = parseFloat( value );
6439

    
6440
				if ( value >= 0 ) {
6441
					return value + "px";
6442
				}
6443

    
6444
			} else {
6445
				return value;
6446
			}
6447
		}
6448
	};
6449
});
6450

    
6451
if ( !jQuery.support.opacity ) {
6452
	jQuery.cssHooks.opacity = {
6453
		get: function( elem, computed ) {
6454
			// IE uses filters for opacity
6455
			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
6456
				( parseFloat( RegExp.$1 ) / 100 ) + "" :
6457
				computed ? "1" : "";
6458
		},
6459

    
6460
		set: function( elem, value ) {
6461
			var style = elem.style,
6462
				currentStyle = elem.currentStyle;
6463

    
6464
			// IE has trouble with opacity if it does not have layout
6465
			// Force it by setting the zoom level
6466
			style.zoom = 1;
6467

    
6468
			// Set the alpha filter to set the opacity
6469
			var opacity = jQuery.isNaN( value ) ?
6470
				"" :
6471
				"alpha(opacity=" + value * 100 + ")",
6472
				filter = currentStyle && currentStyle.filter || style.filter || "";
6473

    
6474
			style.filter = ralpha.test( filter ) ?
6475
				filter.replace( ralpha, opacity ) :
6476
				filter + " " + opacity;
6477
		}
6478
	};
6479
}
6480

    
6481
jQuery(function() {
6482
	// This hook cannot be added until DOM ready because the support test
6483
	// for it is not run until after DOM ready
6484
	if ( !jQuery.support.reliableMarginRight ) {
6485
		jQuery.cssHooks.marginRight = {
6486
			get: function( elem, computed ) {
6487
				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
6488
				// Work around by temporarily setting element display to inline-block
6489
				var ret;
6490
				jQuery.swap( elem, { "display": "inline-block" }, function() {
6491
					if ( computed ) {
6492
						ret = curCSS( elem, "margin-right", "marginRight" );
6493
					} else {
6494
						ret = elem.style.marginRight;
6495
					}
6496
				});
6497
				return ret;
6498
			}
6499
		};
6500
	}
6501
});
6502

    
6503
if ( document.defaultView && document.defaultView.getComputedStyle ) {
6504
	getComputedStyle = function( elem, name ) {
6505
		var ret, defaultView, computedStyle;
6506

    
6507
		name = name.replace( rupper, "-$1" ).toLowerCase();
6508

    
6509
		if ( !(defaultView = elem.ownerDocument.defaultView) ) {
6510
			return undefined;
6511
		}
6512

    
6513
		if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
6514
			ret = computedStyle.getPropertyValue( name );
6515
			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
6516
				ret = jQuery.style( elem, name );
6517
			}
6518
		}
6519

    
6520
		return ret;
6521
	};
6522
}
6523

    
6524
if ( document.documentElement.currentStyle ) {
6525
	currentStyle = function( elem, name ) {
6526
		var left,
6527
			ret = elem.currentStyle && elem.currentStyle[ name ],
6528
			rsLeft = elem.runtimeStyle && elem.runtimeStyle[ name ],
6529
			style = elem.style;
6530

    
6531
		// From the awesome hack by Dean Edwards
6532
		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
6533

    
6534
		// If we're not dealing with a regular pixel number
6535
		// but a number that has a weird ending, we need to convert it to pixels
6536
		if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
6537
			// Remember the original values
6538
			left = style.left;
6539

    
6540
			// Put in the new values to get a computed value out
6541
			if ( rsLeft ) {
6542
				elem.runtimeStyle.left = elem.currentStyle.left;
6543
			}
6544
			style.left = name === "fontSize" ? "1em" : (ret || 0);
6545
			ret = style.pixelLeft + "px";
6546

    
6547
			// Revert the changed values
6548
			style.left = left;
6549
			if ( rsLeft ) {
6550
				elem.runtimeStyle.left = rsLeft;
6551
			}
6552
		}
6553

    
6554
		return ret === "" ? "auto" : ret;
6555
	};
6556
}
6557

    
6558
curCSS = getComputedStyle || currentStyle;
6559

    
6560
function getWH( elem, name, extra ) {
6561

    
6562
	// Start with offset property
6563
	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
6564
		which = name === "width" ? cssWidth : cssHeight;
6565

    
6566
	if ( val > 0 ) {
6567
		if ( extra !== "border" ) {
6568
			jQuery.each( which, function() {
6569
				if ( !extra ) {
6570
					val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
6571
				}
6572
				if ( extra === "margin" ) {
6573
					val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
6574
				} else {
6575
					val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
6576
				}
6577
			});
6578
		}
6579

    
6580
		return val + "px";
6581
	}
6582

    
6583
	// Fall back to computed then uncomputed css if necessary
6584
	val = curCSS( elem, name, name );
6585
	if ( val < 0 || val == null ) {
6586
		val = elem.style[ name ] || 0;
6587
	}
6588
	// Normalize "", auto, and prepare for extra
6589
	val = parseFloat( val ) || 0;
6590

    
6591
	// Add padding, border, margin
6592
	if ( extra ) {
6593
		jQuery.each( which, function() {
6594
			val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
6595
			if ( extra !== "padding" ) {
6596
				val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
6597
			}
6598
			if ( extra === "margin" ) {
6599
				val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
6600
			}
6601
		});
6602
	}
6603

    
6604
	return val + "px";
6605
}
6606

    
6607
if ( jQuery.expr && jQuery.expr.filters ) {
6608
	jQuery.expr.filters.hidden = function( elem ) {
6609
		var width = elem.offsetWidth,
6610
			height = elem.offsetHeight;
6611

    
6612
		return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
6613
	};
6614

    
6615
	jQuery.expr.filters.visible = function( elem ) {
6616
		return !jQuery.expr.filters.hidden( elem );
6617
	};
6618
}
6619

    
6620

    
6621

    
6622

    
6623
var r20 = /%20/g,
6624
	rbracket = /\[\]$/,
6625
	rCRLF = /\r?\n/g,
6626
	rhash = /#.*$/,
6627
	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
6628
	rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
6629
	// #7653, #8125, #8152: local protocol detection
6630
	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
6631
	rnoContent = /^(?:GET|HEAD)$/,
6632
	rprotocol = /^\/\//,
6633
	rquery = /\?/,
6634
	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
6635
	rselectTextarea = /^(?:select|textarea)/i,
6636
	rspacesAjax = /\s+/,
6637
	rts = /([?&])_=[^&]*/,
6638
	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
6639

    
6640
	// Keep a copy of the old load method
6641
	_load = jQuery.fn.load,
6642

    
6643
	/* Prefilters
6644
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
6645
	 * 2) These are called:
6646
	 *    - BEFORE asking for a transport
6647
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
6648
	 * 3) key is the dataType
6649
	 * 4) the catchall symbol "*" can be used
6650
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
6651
	 */
6652
	prefilters = {},
6653

    
6654
	/* Transports bindings
6655
	 * 1) key is the dataType
6656
	 * 2) the catchall symbol "*" can be used
6657
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
6658
	 */
6659
	transports = {},
6660

    
6661
	// Document location
6662
	ajaxLocation,
6663

    
6664
	// Document location segments
6665
	ajaxLocParts;
6666

    
6667
// #8138, IE may throw an exception when accessing
6668
// a field from window.location if document.domain has been set
6669
try {
6670
	ajaxLocation = location.href;
6671
} catch( e ) {
6672
	// Use the href attribute of an A element
6673
	// since IE will modify it given document.location
6674
	ajaxLocation = document.createElement( "a" );
6675
	ajaxLocation.href = "";
6676
	ajaxLocation = ajaxLocation.href;
6677
}
6678

    
6679
// Segment location into parts
6680
ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
6681

    
6682
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
6683
function addToPrefiltersOrTransports( structure ) {
6684

    
6685
	// dataTypeExpression is optional and defaults to "*"
6686
	return function( dataTypeExpression, func ) {
6687

    
6688
		if ( typeof dataTypeExpression !== "string" ) {
6689
			func = dataTypeExpression;
6690
			dataTypeExpression = "*";
6691
		}
6692

    
6693
		if ( jQuery.isFunction( func ) ) {
6694
			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
6695
				i = 0,
6696
				length = dataTypes.length,
6697
				dataType,
6698
				list,
6699
				placeBefore;
6700

    
6701
			// For each dataType in the dataTypeExpression
6702
			for(; i < length; i++ ) {
6703
				dataType = dataTypes[ i ];
6704
				// We control if we're asked to add before
6705
				// any existing element
6706
				placeBefore = /^\+/.test( dataType );
6707
				if ( placeBefore ) {
6708
					dataType = dataType.substr( 1 ) || "*";
6709
				}
6710
				list = structure[ dataType ] = structure[ dataType ] || [];
6711
				// then we add to the structure accordingly
6712
				list[ placeBefore ? "unshift" : "push" ]( func );
6713
			}
6714
		}
6715
	};
6716
}
6717

    
6718
// Base inspection function for prefilters and transports
6719
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
6720
		dataType /* internal */, inspected /* internal */ ) {
6721

    
6722
	dataType = dataType || options.dataTypes[ 0 ];
6723
	inspected = inspected || {};
6724

    
6725
	inspected[ dataType ] = true;
6726

    
6727
	var list = structure[ dataType ],
6728
		i = 0,
6729
		length = list ? list.length : 0,
6730
		executeOnly = ( structure === prefilters ),
6731
		selection;
6732

    
6733
	for(; i < length && ( executeOnly || !selection ); i++ ) {
6734
		selection = list[ i ]( options, originalOptions, jqXHR );
6735
		// If we got redirected to another dataType
6736
		// we try there if executing only and not done already
6737
		if ( typeof selection === "string" ) {
6738
			if ( !executeOnly || inspected[ selection ] ) {
6739
				selection = undefined;
6740
			} else {
6741
				options.dataTypes.unshift( selection );
6742
				selection = inspectPrefiltersOrTransports(
6743
						structure, options, originalOptions, jqXHR, selection, inspected );
6744
			}
6745
		}
6746
	}
6747
	// If we're only executing or nothing was selected
6748
	// we try the catchall dataType if not done already
6749
	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
6750
		selection = inspectPrefiltersOrTransports(
6751
				structure, options, originalOptions, jqXHR, "*", inspected );
6752
	}
6753
	// unnecessary when only executing (prefilters)
6754
	// but it'll be ignored by the caller in that case
6755
	return selection;
6756
}
6757

    
6758
jQuery.fn.extend({
6759
	load: function( url, params, callback ) {
6760
		if ( typeof url !== "string" && _load ) {
6761
			return _load.apply( this, arguments );
6762

    
6763
		// Don't do a request if no elements are being requested
6764
		} else if ( !this.length ) {
6765
			return this;
6766
		}
6767

    
6768
		var off = url.indexOf( " " );
6769
		if ( off >= 0 ) {
6770
			var selector = url.slice( off, url.length );
6771
			url = url.slice( 0, off );
6772
		}
6773

    
6774
		// Default to a GET request
6775
		var type = "GET";
6776

    
6777
		// If the second parameter was provided
6778
		if ( params ) {
6779
			// If it's a function
6780
			if ( jQuery.isFunction( params ) ) {
6781
				// We assume that it's the callback
6782
				callback = params;
6783
				params = undefined;
6784

    
6785
			// Otherwise, build a param string
6786
			} else if ( typeof params === "object" ) {
6787
				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
6788
				type = "POST";
6789
			}
6790
		}
6791

    
6792
		var self = this;
6793

    
6794
		// Request the remote document
6795
		jQuery.ajax({
6796
			url: url,
6797
			type: type,
6798
			dataType: "html",
6799
			data: params,
6800
			// Complete callback (responseText is used internally)
6801
			complete: function( jqXHR, status, responseText ) {
6802
				// Store the response as specified by the jqXHR object
6803
				responseText = jqXHR.responseText;
6804
				// If successful, inject the HTML into all the matched elements
6805
				if ( jqXHR.isResolved() ) {
6806
					// #4825: Get the actual response in case
6807
					// a dataFilter is present in ajaxSettings
6808
					jqXHR.done(function( r ) {
6809
						responseText = r;
6810
					});
6811
					// See if a selector was specified
6812
					self.html( selector ?
6813
						// Create a dummy div to hold the results
6814
						jQuery("<div>")
6815
							// inject the contents of the document in, removing the scripts
6816
							// to avoid any 'Permission Denied' errors in IE
6817
							.append(responseText.replace(rscript, ""))
6818

    
6819
							// Locate the specified elements
6820
							.find(selector) :
6821

    
6822
						// If not, just inject the full result
6823
						responseText );
6824
				}
6825

    
6826
				if ( callback ) {
6827
					self.each( callback, [ responseText, status, jqXHR ] );
6828
				}
6829
			}
6830
		});
6831

    
6832
		return this;
6833
	},
6834

    
6835
	serialize: function() {
6836
		return jQuery.param( this.serializeArray() );
6837
	},
6838

    
6839
	serializeArray: function() {
6840
		return this.map(function(){
6841
			return this.elements ? jQuery.makeArray( this.elements ) : this;
6842
		})
6843
		.filter(function(){
6844
			return this.name && !this.disabled &&
6845
				( this.checked || rselectTextarea.test( this.nodeName ) ||
6846
					rinput.test( this.type ) );
6847
		})
6848
		.map(function( i, elem ){
6849
			var val = jQuery( this ).val();
6850

    
6851
			return val == null ?
6852
				null :
6853
				jQuery.isArray( val ) ?
6854
					jQuery.map( val, function( val, i ){
6855
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6856
					}) :
6857
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
6858
		}).get();
6859
	}
6860
});
6861

    
6862
// Attach a bunch of functions for handling common AJAX events
6863
jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
6864
	jQuery.fn[ o ] = function( f ){
6865
		return this.bind( o, f );
6866
	};
6867
});
6868

    
6869
jQuery.each( [ "get", "post" ], function( i, method ) {
6870
	jQuery[ method ] = function( url, data, callback, type ) {
6871
		// shift arguments if data argument was omitted
6872
		if ( jQuery.isFunction( data ) ) {
6873
			type = type || callback;
6874
			callback = data;
6875
			data = undefined;
6876
		}
6877

    
6878
		return jQuery.ajax({
6879
			type: method,
6880
			url: url,
6881
			data: data,
6882
			success: callback,
6883
			dataType: type
6884
		});
6885
	};
6886
});
6887

    
6888
jQuery.extend({
6889

    
6890
	getScript: function( url, callback ) {
6891
		return jQuery.get( url, undefined, callback, "script" );
6892
	},
6893

    
6894
	getJSON: function( url, data, callback ) {
6895
		return jQuery.get( url, data, callback, "json" );
6896
	},
6897

    
6898
	// Creates a full fledged settings object into target
6899
	// with both ajaxSettings and settings fields.
6900
	// If target is omitted, writes into ajaxSettings.
6901
	ajaxSetup: function ( target, settings ) {
6902
		if ( !settings ) {
6903
			// Only one parameter, we extend ajaxSettings
6904
			settings = target;
6905
			target = jQuery.extend( true, jQuery.ajaxSettings, settings );
6906
		} else {
6907
			// target was provided, we extend into it
6908
			jQuery.extend( true, target, jQuery.ajaxSettings, settings );
6909
		}
6910
		// Flatten fields we don't want deep extended
6911
		for( var field in { context: 1, url: 1 } ) {
6912
			if ( field in settings ) {
6913
				target[ field ] = settings[ field ];
6914
			} else if( field in jQuery.ajaxSettings ) {
6915
				target[ field ] = jQuery.ajaxSettings[ field ];
6916
			}
6917
		}
6918
		return target;
6919
	},
6920

    
6921
	ajaxSettings: {
6922
		url: ajaxLocation,
6923
		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
6924
		global: true,
6925
		type: "GET",
6926
		contentType: "application/x-www-form-urlencoded",
6927
		processData: true,
6928
		async: true,
6929
		/*
6930
		timeout: 0,
6931
		data: null,
6932
		dataType: null,
6933
		username: null,
6934
		password: null,
6935
		cache: null,
6936
		traditional: false,
6937
		headers: {},
6938
		*/
6939

    
6940
		accepts: {
6941
			xml: "application/xml, text/xml",
6942
			html: "text/html",
6943
			text: "text/plain",
6944
			json: "application/json, text/javascript",
6945
			"*": "*/*"
6946
		},
6947

    
6948
		contents: {
6949
			xml: /xml/,
6950
			html: /html/,
6951
			json: /json/
6952
		},
6953

    
6954
		responseFields: {
6955
			xml: "responseXML",
6956
			text: "responseText"
6957
		},
6958

    
6959
		// List of data converters
6960
		// 1) key format is "source_type destination_type" (a single space in-between)
6961
		// 2) the catchall symbol "*" can be used for source_type
6962
		converters: {
6963

    
6964
			// Convert anything to text
6965
			"* text": window.String,
6966

    
6967
			// Text to html (true = no transformation)
6968
			"text html": true,
6969

    
6970
			// Evaluate text as a json expression
6971
			"text json": jQuery.parseJSON,
6972

    
6973
			// Parse text as xml
6974
			"text xml": jQuery.parseXML
6975
		}
6976
	},
6977

    
6978
	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
6979
	ajaxTransport: addToPrefiltersOrTransports( transports ),
6980

    
6981
	// Main method
6982
	ajax: function( url, options ) {
6983

    
6984
		// If url is an object, simulate pre-1.5 signature
6985
		if ( typeof url === "object" ) {
6986
			options = url;
6987
			url = undefined;
6988
		}
6989

    
6990
		// Force options to be an object
6991
		options = options || {};
6992

    
6993
		var // Create the final options object
6994
			s = jQuery.ajaxSetup( {}, options ),
6995
			// Callbacks context
6996
			callbackContext = s.context || s,
6997
			// Context for global events
6998
			// It's the callbackContext if one was provided in the options
6999
			// and if it's a DOM node or a jQuery collection
7000
			globalEventContext = callbackContext !== s &&
7001
				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
7002
						jQuery( callbackContext ) : jQuery.event,
7003
			// Deferreds
7004
			deferred = jQuery.Deferred(),
7005
			completeDeferred = jQuery._Deferred(),
7006
			// Status-dependent callbacks
7007
			statusCode = s.statusCode || {},
7008
			// ifModified key
7009
			ifModifiedKey,
7010
			// Headers (they are sent all at once)
7011
			requestHeaders = {},
7012
			requestHeadersNames = {},
7013
			// Response headers
7014
			responseHeadersString,
7015
			responseHeaders,
7016
			// transport
7017
			transport,
7018
			// timeout handle
7019
			timeoutTimer,
7020
			// Cross-domain detection vars
7021
			parts,
7022
			// The jqXHR state
7023
			state = 0,
7024
			// To know if global events are to be dispatched
7025
			fireGlobals,
7026
			// Loop variable
7027
			i,
7028
			// Fake xhr
7029
			jqXHR = {
7030

    
7031
				readyState: 0,
7032

    
7033
				// Caches the header
7034
				setRequestHeader: function( name, value ) {
7035
					if ( !state ) {
7036
						var lname = name.toLowerCase();
7037
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
7038
						requestHeaders[ name ] = value;
7039
					}
7040
					return this;
7041
				},
7042

    
7043
				// Raw string
7044
				getAllResponseHeaders: function() {
7045
					return state === 2 ? responseHeadersString : null;
7046
				},
7047

    
7048
				// Builds headers hashtable if needed
7049
				getResponseHeader: function( key ) {
7050
					var match;
7051
					if ( state === 2 ) {
7052
						if ( !responseHeaders ) {
7053
							responseHeaders = {};
7054
							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
7055
								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
7056
							}
7057
						}
7058
						match = responseHeaders[ key.toLowerCase() ];
7059
					}
7060
					return match === undefined ? null : match;
7061
				},
7062

    
7063
				// Overrides response content-type header
7064
				overrideMimeType: function( type ) {
7065
					if ( !state ) {
7066
						s.mimeType = type;
7067
					}
7068
					return this;
7069
				},
7070

    
7071
				// Cancel the request
7072
				abort: function( statusText ) {
7073
					statusText = statusText || "abort";
7074
					if ( transport ) {
7075
						transport.abort( statusText );
7076
					}
7077
					done( 0, statusText );
7078
					return this;
7079
				}
7080
			};
7081

    
7082
		// Callback for when everything is done
7083
		// It is defined here because jslint complains if it is declared
7084
		// at the end of the function (which would be more logical and readable)
7085
		function done( status, statusText, responses, headers ) {
7086

    
7087
			// Called once
7088
			if ( state === 2 ) {
7089
				return;
7090
			}
7091

    
7092
			// State is "done" now
7093
			state = 2;
7094

    
7095
			// Clear timeout if it exists
7096
			if ( timeoutTimer ) {
7097
				clearTimeout( timeoutTimer );
7098
			}
7099

    
7100
			// Dereference transport for early garbage collection
7101
			// (no matter how long the jqXHR object will be used)
7102
			transport = undefined;
7103

    
7104
			// Cache response headers
7105
			responseHeadersString = headers || "";
7106

    
7107
			// Set readyState
7108
			jqXHR.readyState = status ? 4 : 0;
7109

    
7110
			var isSuccess,
7111
				success,
7112
				error,
7113
				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
7114
				lastModified,
7115
				etag;
7116

    
7117
			// If successful, handle type chaining
7118
			if ( status >= 200 && status < 300 || status === 304 ) {
7119

    
7120
				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7121
				if ( s.ifModified ) {
7122

    
7123
					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
7124
						jQuery.lastModified[ ifModifiedKey ] = lastModified;
7125
					}
7126
					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
7127
						jQuery.etag[ ifModifiedKey ] = etag;
7128
					}
7129
				}
7130

    
7131
				// If not modified
7132
				if ( status === 304 ) {
7133

    
7134
					statusText = "notmodified";
7135
					isSuccess = true;
7136

    
7137
				// If we have data
7138
				} else {
7139

    
7140
					try {
7141
						success = ajaxConvert( s, response );
7142
						statusText = "success";
7143
						isSuccess = true;
7144
					} catch(e) {
7145
						// We have a parsererror
7146
						statusText = "parsererror";
7147
						error = e;
7148
					}
7149
				}
7150
			} else {
7151
				// We extract error from statusText
7152
				// then normalize statusText and status for non-aborts
7153
				error = statusText;
7154
				if( !statusText || status ) {
7155
					statusText = "error";
7156
					if ( status < 0 ) {
7157
						status = 0;
7158
					}
7159
				}
7160
			}
7161

    
7162
			// Set data for the fake xhr object
7163
			jqXHR.status = status;
7164
			jqXHR.statusText = statusText;
7165

    
7166
			// Success/Error
7167
			if ( isSuccess ) {
7168
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
7169
			} else {
7170
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
7171
			}
7172

    
7173
			// Status-dependent callbacks
7174
			jqXHR.statusCode( statusCode );
7175
			statusCode = undefined;
7176

    
7177
			if ( fireGlobals ) {
7178
				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
7179
						[ jqXHR, s, isSuccess ? success : error ] );
7180
			}
7181

    
7182
			// Complete
7183
			completeDeferred.resolveWith( callbackContext, [ jqXHR, statusText ] );
7184

    
7185
			if ( fireGlobals ) {
7186
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s] );
7187
				// Handle the global AJAX counter
7188
				if ( !( --jQuery.active ) ) {
7189
					jQuery.event.trigger( "ajaxStop" );
7190
				}
7191
			}
7192
		}
7193

    
7194
		// Attach deferreds
7195
		deferred.promise( jqXHR );
7196
		jqXHR.success = jqXHR.done;
7197
		jqXHR.error = jqXHR.fail;
7198
		jqXHR.complete = completeDeferred.done;
7199

    
7200
		// Status-dependent callbacks
7201
		jqXHR.statusCode = function( map ) {
7202
			if ( map ) {
7203
				var tmp;
7204
				if ( state < 2 ) {
7205
					for( tmp in map ) {
7206
						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
7207
					}
7208
				} else {
7209
					tmp = map[ jqXHR.status ];
7210
					jqXHR.then( tmp, tmp );
7211
				}
7212
			}
7213
			return this;
7214
		};
7215

    
7216
		// Remove hash character (#7531: and string promotion)
7217
		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
7218
		// We also use the url parameter if available
7219
		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
7220

    
7221
		// Extract dataTypes list
7222
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
7223

    
7224
		// Determine if a cross-domain request is in order
7225
		if ( s.crossDomain == null ) {
7226
			parts = rurl.exec( s.url.toLowerCase() );
7227
			s.crossDomain = !!( parts &&
7228
				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
7229
					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
7230
						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
7231
			);
7232
		}
7233

    
7234
		// Convert data if not already a string
7235
		if ( s.data && s.processData && typeof s.data !== "string" ) {
7236
			s.data = jQuery.param( s.data, s.traditional );
7237
		}
7238

    
7239
		// Apply prefilters
7240
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
7241

    
7242
		// If request was aborted inside a prefiler, stop there
7243
		if ( state === 2 ) {
7244
			return false;
7245
		}
7246

    
7247
		// We can fire global events as of now if asked to
7248
		fireGlobals = s.global;
7249

    
7250
		// Uppercase the type
7251
		s.type = s.type.toUpperCase();
7252

    
7253
		// Determine if request has content
7254
		s.hasContent = !rnoContent.test( s.type );
7255

    
7256
		// Watch for a new set of requests
7257
		if ( fireGlobals && jQuery.active++ === 0 ) {
7258
			jQuery.event.trigger( "ajaxStart" );
7259
		}
7260

    
7261
		// More options handling for requests with no content
7262
		if ( !s.hasContent ) {
7263

    
7264
			// If data is available, append data to url
7265
			if ( s.data ) {
7266
				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
7267
			}
7268

    
7269
			// Get ifModifiedKey before adding the anti-cache parameter
7270
			ifModifiedKey = s.url;
7271

    
7272
			// Add anti-cache in url if needed
7273
			if ( s.cache === false ) {
7274

    
7275
				var ts = jQuery.now(),
7276
					// try replacing _= if it is there
7277
					ret = s.url.replace( rts, "$1_=" + ts );
7278

    
7279
				// if nothing was replaced, add timestamp to the end
7280
				s.url = ret + ( (ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
7281
			}
7282
		}
7283

    
7284
		// Set the correct header, if data is being sent
7285
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
7286
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
7287
		}
7288

    
7289
		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
7290
		if ( s.ifModified ) {
7291
			ifModifiedKey = ifModifiedKey || s.url;
7292
			if ( jQuery.lastModified[ ifModifiedKey ] ) {
7293
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
7294
			}
7295
			if ( jQuery.etag[ ifModifiedKey ] ) {
7296
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
7297
			}
7298
		}
7299

    
7300
		// Set the Accepts header for the server, depending on the dataType
7301
		jqXHR.setRequestHeader(
7302
			"Accept",
7303
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
7304
				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", */*; q=0.01" : "" ) :
7305
				s.accepts[ "*" ]
7306
		);
7307

    
7308
		// Check for headers option
7309
		for ( i in s.headers ) {
7310
			jqXHR.setRequestHeader( i, s.headers[ i ] );
7311
		}
7312

    
7313
		// Allow custom headers/mimetypes and early abort
7314
		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
7315
				// Abort if not done already
7316
				jqXHR.abort();
7317
				return false;
7318

    
7319
		}
7320

    
7321
		// Install callbacks on deferreds
7322
		for ( i in { success: 1, error: 1, complete: 1 } ) {
7323
			jqXHR[ i ]( s[ i ] );
7324
		}
7325

    
7326
		// Get transport
7327
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
7328

    
7329
		// If no transport, we auto-abort
7330
		if ( !transport ) {
7331
			done( -1, "No Transport" );
7332
		} else {
7333
			jqXHR.readyState = 1;
7334
			// Send global event
7335
			if ( fireGlobals ) {
7336
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
7337
			}
7338
			// Timeout
7339
			if ( s.async && s.timeout > 0 ) {
7340
				timeoutTimer = setTimeout( function(){
7341
					jqXHR.abort( "timeout" );
7342
				}, s.timeout );
7343
			}
7344

    
7345
			try {
7346
				state = 1;
7347
				transport.send( requestHeaders, done );
7348
			} catch (e) {
7349
				// Propagate exception as error if not done
7350
				if ( status < 2 ) {
7351
					done( -1, e );
7352
				// Simply rethrow otherwise
7353
				} else {
7354
					jQuery.error( e );
7355
				}
7356
			}
7357
		}
7358

    
7359
		return jqXHR;
7360
	},
7361

    
7362
	// Serialize an array of form elements or a set of
7363
	// key/values into a query string
7364
	param: function( a, traditional ) {
7365
		var s = [],
7366
			add = function( key, value ) {
7367
				// If value is a function, invoke it and return its value
7368
				value = jQuery.isFunction( value ) ? value() : value;
7369
				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
7370
			};
7371

    
7372
		// Set traditional to true for jQuery <= 1.3.2 behavior.
7373
		if ( traditional === undefined ) {
7374
			traditional = jQuery.ajaxSettings.traditional;
7375
		}
7376

    
7377
		// If an array was passed in, assume that it is an array of form elements.
7378
		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
7379
			// Serialize the form elements
7380
			jQuery.each( a, function() {
7381
				add( this.name, this.value );
7382
			});
7383

    
7384
		} else {
7385
			// If traditional, encode the "old" way (the way 1.3.2 or older
7386
			// did it), otherwise encode params recursively.
7387
			for ( var prefix in a ) {
7388
				buildParams( prefix, a[ prefix ], traditional, add );
7389
			}
7390
		}
7391

    
7392
		// Return the resulting serialization
7393
		return s.join( "&" ).replace( r20, "+" );
7394
	}
7395
});
7396

    
7397
function buildParams( prefix, obj, traditional, add ) {
7398
	if ( jQuery.isArray( obj ) ) {
7399
		// Serialize array item.
7400
		jQuery.each( obj, function( i, v ) {
7401
			if ( traditional || rbracket.test( prefix ) ) {
7402
				// Treat each array item as a scalar.
7403
				add( prefix, v );
7404

    
7405
			} else {
7406
				// If array item is non-scalar (array or object), encode its
7407
				// numeric index to resolve deserialization ambiguity issues.
7408
				// Note that rack (as of 1.0.0) can't currently deserialize
7409
				// nested arrays properly, and attempting to do so may cause
7410
				// a server error. Possible fixes are to modify rack's
7411
				// deserialization algorithm or to provide an option or flag
7412
				// to force array serialization to be shallow.
7413
				buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
7414
			}
7415
		});
7416

    
7417
	} else if ( !traditional && obj != null && typeof obj === "object" ) {
7418
		// Serialize object item.
7419
		for ( var name in obj ) {
7420
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
7421
		}
7422

    
7423
	} else {
7424
		// Serialize scalar item.
7425
		add( prefix, obj );
7426
	}
7427
}
7428

    
7429
// This is still on the jQuery object... for now
7430
// Want to move this to jQuery.ajax some day
7431
jQuery.extend({
7432

    
7433
	// Counter for holding the number of active queries
7434
	active: 0,
7435

    
7436
	// Last-Modified header cache for next request
7437
	lastModified: {},
7438
	etag: {}
7439

    
7440
});
7441

    
7442
/* Handles responses to an ajax request:
7443
 * - sets all responseXXX fields accordingly
7444
 * - finds the right dataType (mediates between content-type and expected dataType)
7445
 * - returns the corresponding response
7446
 */
7447
function ajaxHandleResponses( s, jqXHR, responses ) {
7448

    
7449
	var contents = s.contents,
7450
		dataTypes = s.dataTypes,
7451
		responseFields = s.responseFields,
7452
		ct,
7453
		type,
7454
		finalDataType,
7455
		firstDataType;
7456

    
7457
	// Fill responseXXX fields
7458
	for( type in responseFields ) {
7459
		if ( type in responses ) {
7460
			jqXHR[ responseFields[type] ] = responses[ type ];
7461
		}
7462
	}
7463

    
7464
	// Remove auto dataType and get content-type in the process
7465
	while( dataTypes[ 0 ] === "*" ) {
7466
		dataTypes.shift();
7467
		if ( ct === undefined ) {
7468
			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
7469
		}
7470
	}
7471

    
7472
	// Check if we're dealing with a known content-type
7473
	if ( ct ) {
7474
		for ( type in contents ) {
7475
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
7476
				dataTypes.unshift( type );
7477
				break;
7478
			}
7479
		}
7480
	}
7481

    
7482
	// Check to see if we have a response for the expected dataType
7483
	if ( dataTypes[ 0 ] in responses ) {
7484
		finalDataType = dataTypes[ 0 ];
7485
	} else {
7486
		// Try convertible dataTypes
7487
		for ( type in responses ) {
7488
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
7489
				finalDataType = type;
7490
				break;
7491
			}
7492
			if ( !firstDataType ) {
7493
				firstDataType = type;
7494
			}
7495
		}
7496
		// Or just use first one
7497
		finalDataType = finalDataType || firstDataType;
7498
	}
7499

    
7500
	// If we found a dataType
7501
	// We add the dataType to the list if needed
7502
	// and return the corresponding response
7503
	if ( finalDataType ) {
7504
		if ( finalDataType !== dataTypes[ 0 ] ) {
7505
			dataTypes.unshift( finalDataType );
7506
		}
7507
		return responses[ finalDataType ];
7508
	}
7509
}
7510

    
7511
// Chain conversions given the request and the original response
7512
function ajaxConvert( s, response ) {
7513

    
7514
	// Apply the dataFilter if provided
7515
	if ( s.dataFilter ) {
7516
		response = s.dataFilter( response, s.dataType );
7517
	}
7518

    
7519
	var dataTypes = s.dataTypes,
7520
		converters = {},
7521
		i,
7522
		key,
7523
		length = dataTypes.length,
7524
		tmp,
7525
		// Current and previous dataTypes
7526
		current = dataTypes[ 0 ],
7527
		prev,
7528
		// Conversion expression
7529
		conversion,
7530
		// Conversion function
7531
		conv,
7532
		// Conversion functions (transitive conversion)
7533
		conv1,
7534
		conv2;
7535

    
7536
	// For each dataType in the chain
7537
	for( i = 1; i < length; i++ ) {
7538

    
7539
		// Create converters map
7540
		// with lowercased keys
7541
		if ( i === 1 ) {
7542
			for( key in s.converters ) {
7543
				if( typeof key === "string" ) {
7544
					converters[ key.toLowerCase() ] = s.converters[ key ];
7545
				}
7546
			}
7547
		}
7548

    
7549
		// Get the dataTypes
7550
		prev = current;
7551
		current = dataTypes[ i ];
7552

    
7553
		// If current is auto dataType, update it to prev
7554
		if( current === "*" ) {
7555
			current = prev;
7556
		// If no auto and dataTypes are actually different
7557
		} else if ( prev !== "*" && prev !== current ) {
7558

    
7559
			// Get the converter
7560
			conversion = prev + " " + current;
7561
			conv = converters[ conversion ] || converters[ "* " + current ];
7562

    
7563
			// If there is no direct converter, search transitively
7564
			if ( !conv ) {
7565
				conv2 = undefined;
7566
				for( conv1 in converters ) {
7567
					tmp = conv1.split( " " );
7568
					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
7569
						conv2 = converters[ tmp[1] + " " + current ];
7570
						if ( conv2 ) {
7571
							conv1 = converters[ conv1 ];
7572
							if ( conv1 === true ) {
7573
								conv = conv2;
7574
							} else if ( conv2 === true ) {
7575
								conv = conv1;
7576
							}
7577
							break;
7578
						}
7579
					}
7580
				}
7581
			}
7582
			// If we found no converter, dispatch an error
7583
			if ( !( conv || conv2 ) ) {
7584
				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
7585
			}
7586
			// If found converter is not an equivalence
7587
			if ( conv !== true ) {
7588
				// Convert with 1 or 2 converters accordingly
7589
				response = conv ? conv( response ) : conv2( conv1(response) );
7590
			}
7591
		}
7592
	}
7593
	return response;
7594
}
7595

    
7596

    
7597

    
7598

    
7599
var jsc = jQuery.now(),
7600
	jsre = /(\=)\?(&|$)|\?\?/i;
7601

    
7602
// Default jsonp settings
7603
jQuery.ajaxSetup({
7604
	jsonp: "callback",
7605
	jsonpCallback: function() {
7606
		return jQuery.expando + "_" + ( jsc++ );
7607
	}
7608
});
7609

    
7610
// Detect, normalize options and install callbacks for jsonp requests
7611
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
7612

    
7613
	var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
7614
		( typeof s.data === "string" );
7615

    
7616
	if ( s.dataTypes[ 0 ] === "jsonp" ||
7617
		s.jsonp !== false && ( jsre.test( s.url ) ||
7618
				inspectData && jsre.test( s.data ) ) ) {
7619

    
7620
		var responseContainer,
7621
			jsonpCallback = s.jsonpCallback =
7622
				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
7623
			previous = window[ jsonpCallback ],
7624
			url = s.url,
7625
			data = s.data,
7626
			replace = "$1" + jsonpCallback + "$2";
7627

    
7628
		if ( s.jsonp !== false ) {
7629
			url = url.replace( jsre, replace );
7630
			if ( s.url === url ) {
7631
				if ( inspectData ) {
7632
					data = data.replace( jsre, replace );
7633
				}
7634
				if ( s.data === data ) {
7635
					// Add callback manually
7636
					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
7637
				}
7638
			}
7639
		}
7640

    
7641
		s.url = url;
7642
		s.data = data;
7643

    
7644
		// Install callback
7645
		window[ jsonpCallback ] = function( response ) {
7646
			responseContainer = [ response ];
7647
		};
7648

    
7649
		// Clean-up function
7650
		jqXHR.always(function() {
7651
			// Set callback back to previous value
7652
			window[ jsonpCallback ] = previous;
7653
			// Call if it was a function and we have a response
7654
			if ( responseContainer && jQuery.isFunction( previous ) ) {
7655
				window[ jsonpCallback ]( responseContainer[ 0 ] );
7656
			}
7657
		});
7658

    
7659
		// Use data converter to retrieve json after script execution
7660
		s.converters["script json"] = function() {
7661
			if ( !responseContainer ) {
7662
				jQuery.error( jsonpCallback + " was not called" );
7663
			}
7664
			return responseContainer[ 0 ];
7665
		};
7666

    
7667
		// force json dataType
7668
		s.dataTypes[ 0 ] = "json";
7669

    
7670
		// Delegate to script
7671
		return "script";
7672
	}
7673
});
7674

    
7675

    
7676

    
7677

    
7678
// Install script dataType
7679
jQuery.ajaxSetup({
7680
	accepts: {
7681
		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
7682
	},
7683
	contents: {
7684
		script: /javascript|ecmascript/
7685
	},
7686
	converters: {
7687
		"text script": function( text ) {
7688
			jQuery.globalEval( text );
7689
			return text;
7690
		}
7691
	}
7692
});
7693

    
7694
// Handle cache's special case and global
7695
jQuery.ajaxPrefilter( "script", function( s ) {
7696
	if ( s.cache === undefined ) {
7697
		s.cache = false;
7698
	}
7699
	if ( s.crossDomain ) {
7700
		s.type = "GET";
7701
		s.global = false;
7702
	}
7703
});
7704

    
7705
// Bind script tag hack transport
7706
jQuery.ajaxTransport( "script", function(s) {
7707

    
7708
	// This transport only deals with cross domain requests
7709
	if ( s.crossDomain ) {
7710

    
7711
		var script,
7712
			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
7713

    
7714
		return {
7715

    
7716
			send: function( _, callback ) {
7717

    
7718
				script = document.createElement( "script" );
7719

    
7720
				script.async = "async";
7721

    
7722
				if ( s.scriptCharset ) {
7723
					script.charset = s.scriptCharset;
7724
				}
7725

    
7726
				script.src = s.url;
7727

    
7728
				// Attach handlers for all browsers
7729
				script.onload = script.onreadystatechange = function( _, isAbort ) {
7730

    
7731
					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
7732

    
7733
						// Handle memory leak in IE
7734
						script.onload = script.onreadystatechange = null;
7735

    
7736
						// Remove the script
7737
						if ( head && script.parentNode ) {
7738
							head.removeChild( script );
7739
						}
7740

    
7741
						// Dereference the script
7742
						script = undefined;
7743

    
7744
						// Callback if not abort
7745
						if ( !isAbort ) {
7746
							callback( 200, "success" );
7747
						}
7748
					}
7749
				};
7750
				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
7751
				// This arises when a base node is used (#2709 and #4378).
7752
				head.insertBefore( script, head.firstChild );
7753
			},
7754

    
7755
			abort: function() {
7756
				if ( script ) {
7757
					script.onload( 0, 1 );
7758
				}
7759
			}
7760
		};
7761
	}
7762
});
7763

    
7764

    
7765

    
7766

    
7767
var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
7768
	xhrOnUnloadAbort = window.ActiveXObject ? function() {
7769
		// Abort all pending requests
7770
		for ( var key in xhrCallbacks ) {
7771
			xhrCallbacks[ key ]( 0, 1 );
7772
		}
7773
	} : false,
7774
	xhrId = 0,
7775
	xhrCallbacks;
7776

    
7777
// Functions to create xhrs
7778
function createStandardXHR() {
7779
	try {
7780
		return new window.XMLHttpRequest();
7781
	} catch( e ) {}
7782
}
7783

    
7784
function createActiveXHR() {
7785
	try {
7786
		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
7787
	} catch( e ) {}
7788
}
7789

    
7790
// Create the request object
7791
// (This is still attached to ajaxSettings for backward compatibility)
7792
jQuery.ajaxSettings.xhr = window.ActiveXObject ?
7793
	/* Microsoft failed to properly
7794
	 * implement the XMLHttpRequest in IE7 (can't request local files),
7795
	 * so we use the ActiveXObject when it is available
7796
	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
7797
	 * we need a fallback.
7798
	 */
7799
	function() {
7800
		return !this.isLocal && createStandardXHR() || createActiveXHR();
7801
	} :
7802
	// For all other browsers, use the standard XMLHttpRequest object
7803
	createStandardXHR;
7804

    
7805
// Determine support properties
7806
(function( xhr ) {
7807
	jQuery.extend( jQuery.support, {
7808
		ajax: !!xhr,
7809
		cors: !!xhr && ( "withCredentials" in xhr )
7810
	});
7811
})( jQuery.ajaxSettings.xhr() );
7812

    
7813
// Create transport if the browser can provide an xhr
7814
if ( jQuery.support.ajax ) {
7815

    
7816
	jQuery.ajaxTransport(function( s ) {
7817
		// Cross domain only allowed if supported through XMLHttpRequest
7818
		if ( !s.crossDomain || jQuery.support.cors ) {
7819

    
7820
			var callback;
7821

    
7822
			return {
7823
				send: function( headers, complete ) {
7824

    
7825
					// Get a new xhr
7826
					var xhr = s.xhr(),
7827
						handle,
7828
						i;
7829

    
7830
					// Open the socket
7831
					// Passing null username, generates a login popup on Opera (#2865)
7832
					if ( s.username ) {
7833
						xhr.open( s.type, s.url, s.async, s.username, s.password );
7834
					} else {
7835
						xhr.open( s.type, s.url, s.async );
7836
					}
7837

    
7838
					// Apply custom fields if provided
7839
					if ( s.xhrFields ) {
7840
						for ( i in s.xhrFields ) {
7841
							xhr[ i ] = s.xhrFields[ i ];
7842
						}
7843
					}
7844

    
7845
					// Override mime type if needed
7846
					if ( s.mimeType && xhr.overrideMimeType ) {
7847
						xhr.overrideMimeType( s.mimeType );
7848
					}
7849

    
7850
					// X-Requested-With header
7851
					// For cross-domain requests, seeing as conditions for a preflight are
7852
					// akin to a jigsaw puzzle, we simply never set it to be sure.
7853
					// (it can always be set on a per-request basis or even using ajaxSetup)
7854
					// For same-domain requests, won't change header if already provided.
7855
					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
7856
						headers[ "X-Requested-With" ] = "XMLHttpRequest";
7857
					}
7858

    
7859
					// Need an extra try/catch for cross domain requests in Firefox 3
7860
					try {
7861
						for ( i in headers ) {
7862
							xhr.setRequestHeader( i, headers[ i ] );
7863
						}
7864
					} catch( _ ) {}
7865

    
7866
					// Do send the request
7867
					// This may raise an exception which is actually
7868
					// handled in jQuery.ajax (so no try/catch here)
7869
					xhr.send( ( s.hasContent && s.data ) || null );
7870

    
7871
					// Listener
7872
					callback = function( _, isAbort ) {
7873

    
7874
						var status,
7875
							statusText,
7876
							responseHeaders,
7877
							responses,
7878
							xml;
7879

    
7880
						// Firefox throws exceptions when accessing properties
7881
						// of an xhr when a network error occurred
7882
						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
7883
						try {
7884

    
7885
							// Was never called and is aborted or complete
7886
							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
7887

    
7888
								// Only called once
7889
								callback = undefined;
7890

    
7891
								// Do not keep as active anymore
7892
								if ( handle ) {
7893
									xhr.onreadystatechange = jQuery.noop;
7894
									if ( xhrOnUnloadAbort ) {
7895
										delete xhrCallbacks[ handle ];
7896
									}
7897
								}
7898

    
7899
								// If it's an abort
7900
								if ( isAbort ) {
7901
									// Abort it manually if needed
7902
									if ( xhr.readyState !== 4 ) {
7903
										xhr.abort();
7904
									}
7905
								} else {
7906
									status = xhr.status;
7907
									responseHeaders = xhr.getAllResponseHeaders();
7908
									responses = {};
7909
									xml = xhr.responseXML;
7910

    
7911
									// Construct response list
7912
									if ( xml && xml.documentElement /* #4958 */ ) {
7913
										responses.xml = xml;
7914
									}
7915
									responses.text = xhr.responseText;
7916

    
7917
									// Firefox throws an exception when accessing
7918
									// statusText for faulty cross-domain requests
7919
									try {
7920
										statusText = xhr.statusText;
7921
									} catch( e ) {
7922
										// We normalize with Webkit giving an empty statusText
7923
										statusText = "";
7924
									}
7925

    
7926
									// Filter status for non standard behaviors
7927

    
7928
									// If the request is local and we have data: assume a success
7929
									// (success with no data won't get notified, that's the best we
7930
									// can do given current implementations)
7931
									if ( !status && s.isLocal && !s.crossDomain ) {
7932
										status = responses.text ? 200 : 404;
7933
									// IE - #1450: sometimes returns 1223 when it should be 204
7934
									} else if ( status === 1223 ) {
7935
										status = 204;
7936
									}
7937
								}
7938
							}
7939
						} catch( firefoxAccessException ) {
7940
							if ( !isAbort ) {
7941
								complete( -1, firefoxAccessException );
7942
							}
7943
						}
7944

    
7945
						// Call complete if needed
7946
						if ( responses ) {
7947
							complete( status, statusText, responses, responseHeaders );
7948
						}
7949
					};
7950

    
7951
					// if we're in sync mode or it's in cache
7952
					// and has been retrieved directly (IE6 & IE7)
7953
					// we need to manually fire the callback
7954
					if ( !s.async || xhr.readyState === 4 ) {
7955
						callback();
7956
					} else {
7957
						handle = ++xhrId;
7958
						if ( xhrOnUnloadAbort ) {
7959
							// Create the active xhrs callbacks list if needed
7960
							// and attach the unload handler
7961
							if ( !xhrCallbacks ) {
7962
								xhrCallbacks = {};
7963
								jQuery( window ).unload( xhrOnUnloadAbort );
7964
							}
7965
							// Add to list of active xhrs callbacks
7966
							xhrCallbacks[ handle ] = callback;
7967
						}
7968
						xhr.onreadystatechange = callback;
7969
					}
7970
				},
7971

    
7972
				abort: function() {
7973
					if ( callback ) {
7974
						callback(0,1);
7975
					}
7976
				}
7977
			};
7978
		}
7979
	});
7980
}
7981

    
7982

    
7983

    
7984

    
7985
var elemdisplay = {},
7986
	iframe, iframeDoc,
7987
	rfxtypes = /^(?:toggle|show|hide)$/,
7988
	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
7989
	timerId,
7990
	fxAttrs = [
7991
		// height animations
7992
		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
7993
		// width animations
7994
		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
7995
		// opacity animations
7996
		[ "opacity" ]
7997
	],
7998
	fxNow,
7999
	requestAnimationFrame = window.webkitRequestAnimationFrame ||
8000
		window.mozRequestAnimationFrame ||
8001
		window.oRequestAnimationFrame;
8002

    
8003
jQuery.fn.extend({
8004
	show: function( speed, easing, callback ) {
8005
		var elem, display;
8006

    
8007
		if ( speed || speed === 0 ) {
8008
			return this.animate( genFx("show", 3), speed, easing, callback);
8009

    
8010
		} else {
8011
			for ( var i = 0, j = this.length; i < j; i++ ) {
8012
				elem = this[i];
8013

    
8014
				if ( elem.style ) {
8015
					display = elem.style.display;
8016

    
8017
					// Reset the inline display of this element to learn if it is
8018
					// being hidden by cascaded rules or not
8019
					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
8020
						display = elem.style.display = "";
8021
					}
8022

    
8023
					// Set elements which have been overridden with display: none
8024
					// in a stylesheet to whatever the default browser style is
8025
					// for such an element
8026
					if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
8027
						jQuery._data(elem, "olddisplay", defaultDisplay(elem.nodeName));
8028
					}
8029
				}
8030
			}
8031

    
8032
			// Set the display of most of the elements in a second loop
8033
			// to avoid the constant reflow
8034
			for ( i = 0; i < j; i++ ) {
8035
				elem = this[i];
8036

    
8037
				if ( elem.style ) {
8038
					display = elem.style.display;
8039

    
8040
					if ( display === "" || display === "none" ) {
8041
						elem.style.display = jQuery._data(elem, "olddisplay") || "";
8042
					}
8043
				}
8044
			}
8045

    
8046
			return this;
8047
		}
8048
	},
8049

    
8050
	hide: function( speed, easing, callback ) {
8051
		if ( speed || speed === 0 ) {
8052
			return this.animate( genFx("hide", 3), speed, easing, callback);
8053

    
8054
		} else {
8055
			for ( var i = 0, j = this.length; i < j; i++ ) {
8056
				if ( this[i].style ) {
8057
					var display = jQuery.css( this[i], "display" );
8058

    
8059
					if ( display !== "none" && !jQuery._data( this[i], "olddisplay" ) ) {
8060
						jQuery._data( this[i], "olddisplay", display );
8061
					}
8062
				}
8063
			}
8064

    
8065
			// Set the display of the elements in a second loop
8066
			// to avoid the constant reflow
8067
			for ( i = 0; i < j; i++ ) {
8068
				if ( this[i].style ) {
8069
					this[i].style.display = "none";
8070
				}
8071
			}
8072

    
8073
			return this;
8074
		}
8075
	},
8076

    
8077
	// Save the old toggle function
8078
	_toggle: jQuery.fn.toggle,
8079

    
8080
	toggle: function( fn, fn2, callback ) {
8081
		var bool = typeof fn === "boolean";
8082

    
8083
		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
8084
			this._toggle.apply( this, arguments );
8085

    
8086
		} else if ( fn == null || bool ) {
8087
			this.each(function() {
8088
				var state = bool ? fn : jQuery(this).is(":hidden");
8089
				jQuery(this)[ state ? "show" : "hide" ]();
8090
			});
8091

    
8092
		} else {
8093
			this.animate(genFx("toggle", 3), fn, fn2, callback);
8094
		}
8095

    
8096
		return this;
8097
	},
8098

    
8099
	fadeTo: function( speed, to, easing, callback ) {
8100
		return this.filter(":hidden").css("opacity", 0).show().end()
8101
					.animate({opacity: to}, speed, easing, callback);
8102
	},
8103

    
8104
	animate: function( prop, speed, easing, callback ) {
8105
		var optall = jQuery.speed(speed, easing, callback);
8106

    
8107
		if ( jQuery.isEmptyObject( prop ) ) {
8108
			return this.each( optall.complete, [ false ] );
8109
		}
8110

    
8111
		// Do not change referenced properties as per-property easing will be lost
8112
		prop = jQuery.extend( {}, prop );
8113

    
8114
		return this[ optall.queue === false ? "each" : "queue" ](function() {
8115
			// XXX 'this' does not always have a nodeName when running the
8116
			// test suite
8117

    
8118
			if ( optall.queue === false ) {
8119
				jQuery._mark( this );
8120
			}
8121

    
8122
			var opt = jQuery.extend( {}, optall ),
8123
				isElement = this.nodeType === 1,
8124
				hidden = isElement && jQuery(this).is(":hidden"),
8125
				name, val, p,
8126
				display, e,
8127
				parts, start, end, unit;
8128

    
8129
			// will store per property easing and be used to determine when an animation is complete
8130
			opt.animatedProperties = {};
8131

    
8132
			for ( p in prop ) {
8133

    
8134
				// property name normalization
8135
				name = jQuery.camelCase( p );
8136
				if ( p !== name ) {
8137
					prop[ name ] = prop[ p ];
8138
					delete prop[ p ];
8139
				}
8140

    
8141
				val = prop[ name ];
8142

    
8143
				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
8144
				if ( jQuery.isArray( val ) ) {
8145
					opt.animatedProperties[ name ] = val[ 1 ];
8146
					val = prop[ name ] = val[ 0 ];
8147
				} else {
8148
					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
8149
				}
8150

    
8151
				if ( val === "hide" && hidden || val === "show" && !hidden ) {
8152
					return opt.complete.call( this );
8153
				}
8154

    
8155
				if ( isElement && ( name === "height" || name === "width" ) ) {
8156
					// Make sure that nothing sneaks out
8157
					// Record all 3 overflow attributes because IE does not
8158
					// change the overflow attribute when overflowX and
8159
					// overflowY are set to the same value
8160
					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
8161

    
8162
					// Set display property to inline-block for height/width
8163
					// animations on inline elements that are having width/height
8164
					// animated
8165
					if ( jQuery.css( this, "display" ) === "inline" &&
8166
							jQuery.css( this, "float" ) === "none" ) {
8167
						if ( !jQuery.support.inlineBlockNeedsLayout ) {
8168
							this.style.display = "inline-block";
8169

    
8170
						} else {
8171
							display = defaultDisplay( this.nodeName );
8172

    
8173
							// inline-level elements accept inline-block;
8174
							// block-level elements need to be inline with layout
8175
							if ( display === "inline" ) {
8176
								this.style.display = "inline-block";
8177

    
8178
							} else {
8179
								this.style.display = "inline";
8180
								this.style.zoom = 1;
8181
							}
8182
						}
8183
					}
8184
				}
8185
			}
8186

    
8187
			if ( opt.overflow != null ) {
8188
				this.style.overflow = "hidden";
8189
			}
8190

    
8191
			for ( p in prop ) {
8192
				e = new jQuery.fx( this, opt, p );
8193
				val = prop[ p ];
8194

    
8195
				if ( rfxtypes.test(val) ) {
8196
					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]();
8197

    
8198
				} else {
8199
					parts = rfxnum.exec( val );
8200
					start = e.cur();
8201

    
8202
					if ( parts ) {
8203
						end = parseFloat( parts[2] );
8204
						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
8205

    
8206
						// We need to compute starting value
8207
						if ( unit !== "px" ) {
8208
							jQuery.style( this, p, (end || 1) + unit);
8209
							start = ((end || 1) / e.cur()) * start;
8210
							jQuery.style( this, p, start + unit);
8211
						}
8212

    
8213
						// If a +=/-= token was provided, we're doing a relative animation
8214
						if ( parts[1] ) {
8215
							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
8216
						}
8217

    
8218
						e.custom( start, end, unit );
8219

    
8220
					} else {
8221
						e.custom( start, val, "" );
8222
					}
8223
				}
8224
			}
8225

    
8226
			// For JS strict compliance
8227
			return true;
8228
		});
8229
	},
8230

    
8231
	stop: function( clearQueue, gotoEnd ) {
8232
		if ( clearQueue ) {
8233
			this.queue([]);
8234
		}
8235

    
8236
		this.each(function() {
8237
			var timers = jQuery.timers,
8238
				i = timers.length;
8239
			// clear marker counters if we know they won't be
8240
			if ( !gotoEnd ) {
8241
				jQuery._unmark( true, this );
8242
			}
8243
			while ( i-- ) {
8244
				if ( timers[i].elem === this ) {
8245
					if (gotoEnd) {
8246
						// force the next step to be the last
8247
						timers[i](true);
8248
					}
8249

    
8250
					timers.splice(i, 1);
8251
				}
8252
			}
8253
		});
8254

    
8255
		// start the next in the queue if the last step wasn't forced
8256
		if ( !gotoEnd ) {
8257
			this.dequeue();
8258
		}
8259

    
8260
		return this;
8261
	}
8262

    
8263
});
8264

    
8265
// Animations created synchronously will run synchronously
8266
function createFxNow() {
8267
	setTimeout( clearFxNow, 0 );
8268
	return ( fxNow = jQuery.now() );
8269
}
8270

    
8271
function clearFxNow() {
8272
	fxNow = undefined;
8273
}
8274

    
8275
// Generate parameters to create a standard animation
8276
function genFx( type, num ) {
8277
	var obj = {};
8278

    
8279
	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
8280
		obj[ this ] = type;
8281
	});
8282

    
8283
	return obj;
8284
}
8285

    
8286
// Generate shortcuts for custom animations
8287
jQuery.each({
8288
	slideDown: genFx("show", 1),
8289
	slideUp: genFx("hide", 1),
8290
	slideToggle: genFx("toggle", 1),
8291
	fadeIn: { opacity: "show" },
8292
	fadeOut: { opacity: "hide" },
8293
	fadeToggle: { opacity: "toggle" }
8294
}, function( name, props ) {
8295
	jQuery.fn[ name ] = function( speed, easing, callback ) {
8296
		return this.animate( props, speed, easing, callback );
8297
	};
8298
});
8299

    
8300
jQuery.extend({
8301
	speed: function( speed, easing, fn ) {
8302
		var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
8303
			complete: fn || !fn && easing ||
8304
				jQuery.isFunction( speed ) && speed,
8305
			duration: speed,
8306
			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
8307
		};
8308

    
8309
		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
8310
			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[opt.duration] : jQuery.fx.speeds._default;
8311

    
8312
		// Queueing
8313
		opt.old = opt.complete;
8314
		opt.complete = function( noUnmark ) {
8315
			if ( jQuery.isFunction( opt.old ) ) {
8316
				opt.old.call( this );
8317
			}
8318

    
8319
			if ( opt.queue !== false ) {
8320
				jQuery.dequeue( this );
8321
			} else if ( noUnmark !== false ) {
8322
				jQuery._unmark( this );
8323
			}
8324
		};
8325

    
8326
		return opt;
8327
	},
8328

    
8329
	easing: {
8330
		linear: function( p, n, firstNum, diff ) {
8331
			return firstNum + diff * p;
8332
		},
8333
		swing: function( p, n, firstNum, diff ) {
8334
			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
8335
		}
8336
	},
8337

    
8338
	timers: [],
8339

    
8340
	fx: function( elem, options, prop ) {
8341
		this.options = options;
8342
		this.elem = elem;
8343
		this.prop = prop;
8344

    
8345
		options.orig = options.orig || {};
8346
	}
8347

    
8348
});
8349

    
8350
jQuery.fx.prototype = {
8351
	// Simple function for setting a style value
8352
	update: function() {
8353
		if ( this.options.step ) {
8354
			this.options.step.call( this.elem, this.now, this );
8355
		}
8356

    
8357
		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
8358
	},
8359

    
8360
	// Get the current size
8361
	cur: function() {
8362
		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
8363
			return this.elem[ this.prop ];
8364
		}
8365

    
8366
		var parsed,
8367
			r = jQuery.css( this.elem, this.prop );
8368
		// Empty strings, null, undefined and "auto" are converted to 0,
8369
		// complex values such as "rotate(1rad)" are returned as is,
8370
		// simple values such as "10px" are parsed to Float.
8371
		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
8372
	},
8373

    
8374
	// Start an animation from one number to another
8375
	custom: function( from, to, unit ) {
8376
		var self = this,
8377
			fx = jQuery.fx,
8378
			raf;
8379

    
8380
		this.startTime = fxNow || createFxNow();
8381
		this.start = from;
8382
		this.end = to;
8383
		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
8384
		this.now = this.start;
8385
		this.pos = this.state = 0;
8386

    
8387
		function t( gotoEnd ) {
8388
			return self.step(gotoEnd);
8389
		}
8390

    
8391
		t.elem = this.elem;
8392

    
8393
		if ( t() && jQuery.timers.push(t) && !timerId ) {
8394
			// Use requestAnimationFrame instead of setInterval if available
8395
			if ( requestAnimationFrame ) {
8396
				timerId = true;
8397
				raf = function() {
8398
					// When timerId gets set to null at any point, this stops
8399
					if ( timerId ) {
8400
						requestAnimationFrame( raf );
8401
						fx.tick();
8402
					}
8403
				};
8404
				requestAnimationFrame( raf );
8405
			} else {
8406
				timerId = setInterval( fx.tick, fx.interval );
8407
			}
8408
		}
8409
	},
8410

    
8411
	// Simple 'show' function
8412
	show: function() {
8413
		// Remember where we started, so that we can go back to it later
8414
		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
8415
		this.options.show = true;
8416

    
8417
		// Begin the animation
8418
		// Make sure that we start at a small width/height to avoid any
8419
		// flash of content
8420
		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
8421

    
8422
		// Start by showing the element
8423
		jQuery( this.elem ).show();
8424
	},
8425

    
8426
	// Simple 'hide' function
8427
	hide: function() {
8428
		// Remember where we started, so that we can go back to it later
8429
		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
8430
		this.options.hide = true;
8431

    
8432
		// Begin the animation
8433
		this.custom(this.cur(), 0);
8434
	},
8435

    
8436
	// Each step of an animation
8437
	step: function( gotoEnd ) {
8438
		var t = fxNow || createFxNow(),
8439
			done = true,
8440
			elem = this.elem,
8441
			options = this.options,
8442
			i, n;
8443

    
8444
		if ( gotoEnd || t >= options.duration + this.startTime ) {
8445
			this.now = this.end;
8446
			this.pos = this.state = 1;
8447
			this.update();
8448

    
8449
			options.animatedProperties[ this.prop ] = true;
8450

    
8451
			for ( i in options.animatedProperties ) {
8452
				if ( options.animatedProperties[i] !== true ) {
8453
					done = false;
8454
				}
8455
			}
8456

    
8457
			if ( done ) {
8458
				// Reset the overflow
8459
				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
8460

    
8461
					jQuery.each( [ "", "X", "Y" ], function (index, value) {
8462
						elem.style[ "overflow" + value ] = options.overflow[index];
8463
					});
8464
				}
8465

    
8466
				// Hide the element if the "hide" operation was done
8467
				if ( options.hide ) {
8468
					jQuery(elem).hide();
8469
				}
8470

    
8471
				// Reset the properties, if the item has been hidden or shown
8472
				if ( options.hide || options.show ) {
8473
					for ( var p in options.animatedProperties ) {
8474
						jQuery.style( elem, p, options.orig[p] );
8475
					}
8476
				}
8477

    
8478
				// Execute the complete function
8479
				options.complete.call( elem );
8480
			}
8481

    
8482
			return false;
8483

    
8484
		} else {
8485
			// classical easing cannot be used with an Infinity duration
8486
			if ( options.duration == Infinity ) {
8487
				this.now = t;
8488
			} else {
8489
				n = t - this.startTime;
8490
				this.state = n / options.duration;
8491

    
8492
				// Perform the easing function, defaults to swing
8493
				this.pos = jQuery.easing[ options.animatedProperties[ this.prop ] ]( this.state, n, 0, 1, options.duration );
8494
				this.now = this.start + ((this.end - this.start) * this.pos);
8495
			}
8496
			// Perform the next step of the animation
8497
			this.update();
8498
		}
8499

    
8500
		return true;
8501
	}
8502
};
8503

    
8504
jQuery.extend( jQuery.fx, {
8505
	tick: function() {
8506
		for ( var timers = jQuery.timers, i = 0 ; i < timers.length ; ++i ) {
8507
			if ( !timers[i]() ) {
8508
				timers.splice(i--, 1);
8509
			}
8510
		}
8511

    
8512
		if ( !timers.length ) {
8513
			jQuery.fx.stop();
8514
		}
8515
	},
8516

    
8517
	interval: 13,
8518

    
8519
	stop: function() {
8520
		clearInterval( timerId );
8521
		timerId = null;
8522
	},
8523

    
8524
	speeds: {
8525
		slow: 600,
8526
		fast: 200,
8527
		// Default speed
8528
		_default: 400
8529
	},
8530

    
8531
	step: {
8532
		opacity: function( fx ) {
8533
			jQuery.style( fx.elem, "opacity", fx.now );
8534
		},
8535

    
8536
		_default: function( fx ) {
8537
			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
8538
				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
8539
			} else {
8540
				fx.elem[ fx.prop ] = fx.now;
8541
			}
8542
		}
8543
	}
8544
});
8545

    
8546
if ( jQuery.expr && jQuery.expr.filters ) {
8547
	jQuery.expr.filters.animated = function( elem ) {
8548
		return jQuery.grep(jQuery.timers, function( fn ) {
8549
			return elem === fn.elem;
8550
		}).length;
8551
	};
8552
}
8553

    
8554
// Try to restore the default display value of an element
8555
function defaultDisplay( nodeName ) {
8556

    
8557
	if ( !elemdisplay[ nodeName ] ) {
8558

    
8559
		var body = document.body,
8560
			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
8561
			display = elem.css( "display" );
8562

    
8563
		elem.remove();
8564

    
8565
		// If the simple way fails,
8566
		// get element's real default display by attaching it to a temp iframe
8567
		if ( display === "none" || display === "" ) {
8568
			// No iframe to use yet, so create it
8569
			if ( !iframe ) {
8570
				iframe = document.createElement( "iframe" );
8571
				iframe.frameBorder = iframe.width = iframe.height = 0;
8572
			}
8573

    
8574
			body.appendChild( iframe );
8575

    
8576
			// Create a cacheable copy of the iframe document on first call.
8577
			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
8578
			// document to it; WebKit & Firefox won't allow reusing the iframe document.
8579
			if ( !iframeDoc || !iframe.createElement ) {
8580
				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
8581
				iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
8582
				iframeDoc.close();
8583
			}
8584

    
8585
			elem = iframeDoc.createElement( nodeName );
8586

    
8587
			iframeDoc.body.appendChild( elem );
8588

    
8589
			display = jQuery.css( elem, "display" );
8590

    
8591
			body.removeChild( iframe );
8592
		}
8593

    
8594
		// Store the correct default display
8595
		elemdisplay[ nodeName ] = display;
8596
	}
8597

    
8598
	return elemdisplay[ nodeName ];
8599
}
8600

    
8601

    
8602

    
8603

    
8604
var rtable = /^t(?:able|d|h)$/i,
8605
	rroot = /^(?:body|html)$/i;
8606

    
8607
if ( "getBoundingClientRect" in document.documentElement ) {
8608
	jQuery.fn.offset = function( options ) {
8609
		var elem = this[0], box;
8610

    
8611
		if ( options ) {
8612
			return this.each(function( i ) {
8613
				jQuery.offset.setOffset( this, options, i );
8614
			});
8615
		}
8616

    
8617
		if ( !elem || !elem.ownerDocument ) {
8618
			return null;
8619
		}
8620

    
8621
		if ( elem === elem.ownerDocument.body ) {
8622
			return jQuery.offset.bodyOffset( elem );
8623
		}
8624

    
8625
		try {
8626
			box = elem.getBoundingClientRect();
8627
		} catch(e) {}
8628

    
8629
		var doc = elem.ownerDocument,
8630
			docElem = doc.documentElement;
8631

    
8632
		// Make sure we're not dealing with a disconnected DOM node
8633
		if ( !box || !jQuery.contains( docElem, elem ) ) {
8634
			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
8635
		}
8636

    
8637
		var body = doc.body,
8638
			win = getWindow(doc),
8639
			clientTop  = docElem.clientTop  || body.clientTop  || 0,
8640
			clientLeft = docElem.clientLeft || body.clientLeft || 0,
8641
			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
8642
			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
8643
			top  = box.top  + scrollTop  - clientTop,
8644
			left = box.left + scrollLeft - clientLeft;
8645

    
8646
		return { top: top, left: left };
8647
	};
8648

    
8649
} else {
8650
	jQuery.fn.offset = function( options ) {
8651
		var elem = this[0];
8652

    
8653
		if ( options ) {
8654
			return this.each(function( i ) {
8655
				jQuery.offset.setOffset( this, options, i );
8656
			});
8657
		}
8658

    
8659
		if ( !elem || !elem.ownerDocument ) {
8660
			return null;
8661
		}
8662

    
8663
		if ( elem === elem.ownerDocument.body ) {
8664
			return jQuery.offset.bodyOffset( elem );
8665
		}
8666

    
8667
		jQuery.offset.initialize();
8668

    
8669
		var computedStyle,
8670
			offsetParent = elem.offsetParent,
8671
			prevOffsetParent = elem,
8672
			doc = elem.ownerDocument,
8673
			docElem = doc.documentElement,
8674
			body = doc.body,
8675
			defaultView = doc.defaultView,
8676
			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
8677
			top = elem.offsetTop,
8678
			left = elem.offsetLeft;
8679

    
8680
		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
8681
			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
8682
				break;
8683
			}
8684

    
8685
			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
8686
			top  -= elem.scrollTop;
8687
			left -= elem.scrollLeft;
8688

    
8689
			if ( elem === offsetParent ) {
8690
				top  += elem.offsetTop;
8691
				left += elem.offsetLeft;
8692

    
8693
				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
8694
					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8695
					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8696
				}
8697

    
8698
				prevOffsetParent = offsetParent;
8699
				offsetParent = elem.offsetParent;
8700
			}
8701

    
8702
			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
8703
				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
8704
				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
8705
			}
8706

    
8707
			prevComputedStyle = computedStyle;
8708
		}
8709

    
8710
		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
8711
			top  += body.offsetTop;
8712
			left += body.offsetLeft;
8713
		}
8714

    
8715
		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
8716
			top  += Math.max( docElem.scrollTop, body.scrollTop );
8717
			left += Math.max( docElem.scrollLeft, body.scrollLeft );
8718
		}
8719

    
8720
		return { top: top, left: left };
8721
	};
8722
}
8723

    
8724
jQuery.offset = {
8725
	initialize: function() {
8726
		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.css(body, "marginTop") ) || 0,
8727
			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>";
8728

    
8729
		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
8730

    
8731
		container.innerHTML = html;
8732
		body.insertBefore( container, body.firstChild );
8733
		innerDiv = container.firstChild;
8734
		checkDiv = innerDiv.firstChild;
8735
		td = innerDiv.nextSibling.firstChild.firstChild;
8736

    
8737
		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
8738
		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
8739

    
8740
		checkDiv.style.position = "fixed";
8741
		checkDiv.style.top = "20px";
8742

    
8743
		// safari subtracts parent border width here which is 5px
8744
		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
8745
		checkDiv.style.position = checkDiv.style.top = "";
8746

    
8747
		innerDiv.style.overflow = "hidden";
8748
		innerDiv.style.position = "relative";
8749

    
8750
		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
8751

    
8752
		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
8753

    
8754
		body.removeChild( container );
8755
		jQuery.offset.initialize = jQuery.noop;
8756
	},
8757

    
8758
	bodyOffset: function( body ) {
8759
		var top = body.offsetTop,
8760
			left = body.offsetLeft;
8761

    
8762
		jQuery.offset.initialize();
8763

    
8764
		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
8765
			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
8766
			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
8767
		}
8768

    
8769
		return { top: top, left: left };
8770
	},
8771

    
8772
	setOffset: function( elem, options, i ) {
8773
		var position = jQuery.css( elem, "position" );
8774

    
8775
		// set position first, in-case top/left are set even on static elem
8776
		if ( position === "static" ) {
8777
			elem.style.position = "relative";
8778
		}
8779

    
8780
		var curElem = jQuery( elem ),
8781
			curOffset = curElem.offset(),
8782
			curCSSTop = jQuery.css( elem, "top" ),
8783
			curCSSLeft = jQuery.css( elem, "left" ),
8784
			calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
8785
			props = {}, curPosition = {}, curTop, curLeft;
8786

    
8787
		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
8788
		if ( calculatePosition ) {
8789
			curPosition = curElem.position();
8790
			curTop = curPosition.top;
8791
			curLeft = curPosition.left;
8792
		} else {
8793
			curTop = parseFloat( curCSSTop ) || 0;
8794
			curLeft = parseFloat( curCSSLeft ) || 0;
8795
		}
8796

    
8797
		if ( jQuery.isFunction( options ) ) {
8798
			options = options.call( elem, i, curOffset );
8799
		}
8800

    
8801
		if (options.top != null) {
8802
			props.top = (options.top - curOffset.top) + curTop;
8803
		}
8804
		if (options.left != null) {
8805
			props.left = (options.left - curOffset.left) + curLeft;
8806
		}
8807

    
8808
		if ( "using" in options ) {
8809
			options.using.call( elem, props );
8810
		} else {
8811
			curElem.css( props );
8812
		}
8813
	}
8814
};
8815

    
8816

    
8817
jQuery.fn.extend({
8818
	position: function() {
8819
		if ( !this[0] ) {
8820
			return null;
8821
		}
8822

    
8823
		var elem = this[0],
8824

    
8825
		// Get *real* offsetParent
8826
		offsetParent = this.offsetParent(),
8827

    
8828
		// Get correct offsets
8829
		offset       = this.offset(),
8830
		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
8831

    
8832
		// Subtract element margins
8833
		// note: when an element has margin: auto the offsetLeft and marginLeft
8834
		// are the same in Safari causing offset.left to incorrectly be 0
8835
		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
8836
		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
8837

    
8838
		// Add offsetParent borders
8839
		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
8840
		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
8841

    
8842
		// Subtract the two offsets
8843
		return {
8844
			top:  offset.top  - parentOffset.top,
8845
			left: offset.left - parentOffset.left
8846
		};
8847
	},
8848

    
8849
	offsetParent: function() {
8850
		return this.map(function() {
8851
			var offsetParent = this.offsetParent || document.body;
8852
			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
8853
				offsetParent = offsetParent.offsetParent;
8854
			}
8855
			return offsetParent;
8856
		});
8857
	}
8858
});
8859

    
8860

    
8861
// Create scrollLeft and scrollTop methods
8862
jQuery.each( ["Left", "Top"], function( i, name ) {
8863
	var method = "scroll" + name;
8864

    
8865
	jQuery.fn[ method ] = function( val ) {
8866
		var elem, win;
8867

    
8868
		if ( val === undefined ) {
8869
			elem = this[ 0 ];
8870

    
8871
			if ( !elem ) {
8872
				return null;
8873
			}
8874

    
8875
			win = getWindow( elem );
8876

    
8877
			// Return the scroll offset
8878
			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
8879
				jQuery.support.boxModel && win.document.documentElement[ method ] ||
8880
					win.document.body[ method ] :
8881
				elem[ method ];
8882
		}
8883

    
8884
		// Set the scroll offset
8885
		return this.each(function() {
8886
			win = getWindow( this );
8887

    
8888
			if ( win ) {
8889
				win.scrollTo(
8890
					!i ? val : jQuery( win ).scrollLeft(),
8891
					 i ? val : jQuery( win ).scrollTop()
8892
				);
8893

    
8894
			} else {
8895
				this[ method ] = val;
8896
			}
8897
		});
8898
	};
8899
});
8900

    
8901
function getWindow( elem ) {
8902
	return jQuery.isWindow( elem ) ?
8903
		elem :
8904
		elem.nodeType === 9 ?
8905
			elem.defaultView || elem.parentWindow :
8906
			false;
8907
}
8908

    
8909

    
8910

    
8911

    
8912
// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
8913
jQuery.each([ "Height", "Width" ], function( i, name ) {
8914

    
8915
	var type = name.toLowerCase();
8916

    
8917
	// innerHeight and innerWidth
8918
	jQuery.fn[ "inner" + name ] = function() {
8919
		var elem = this[0];
8920
		return elem && elem.style ?
8921
			parseFloat( jQuery.css( elem, type, "padding" ) ) :
8922
			null;
8923
	};
8924

    
8925
	// outerHeight and outerWidth
8926
	jQuery.fn[ "outer" + name ] = function( margin ) {
8927
		var elem = this[0];
8928
		return elem && elem.style ?
8929
			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
8930
			null;
8931
	};
8932

    
8933
	jQuery.fn[ type ] = function( size ) {
8934
		// Get window width or height
8935
		var elem = this[0];
8936
		if ( !elem ) {
8937
			return size == null ? null : this;
8938
		}
8939

    
8940
		if ( jQuery.isFunction( size ) ) {
8941
			return this.each(function( i ) {
8942
				var self = jQuery( this );
8943
				self[ type ]( size.call( this, i, self[ type ]() ) );
8944
			});
8945
		}
8946

    
8947
		if ( jQuery.isWindow( elem ) ) {
8948
			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
8949
			// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
8950
			var docElemProp = elem.document.documentElement[ "client" + name ];
8951
			return elem.document.compatMode === "CSS1Compat" && docElemProp ||
8952
				elem.document.body[ "client" + name ] || docElemProp;
8953

    
8954
		// Get document width or height
8955
		} else if ( elem.nodeType === 9 ) {
8956
			// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
8957
			return Math.max(
8958
				elem.documentElement["client" + name],
8959
				elem.body["scroll" + name], elem.documentElement["scroll" + name],
8960
				elem.body["offset" + name], elem.documentElement["offset" + name]
8961
			);
8962

    
8963
		// Get or set width or height on the element
8964
		} else if ( size === undefined ) {
8965
			var orig = jQuery.css( elem, type ),
8966
				ret = parseFloat( orig );
8967

    
8968
			return jQuery.isNaN( ret ) ? orig : ret;
8969

    
8970
		// Set the width or height on the element (default to pixels if value is unitless)
8971
		} else {
8972
			return this.css( type, typeof size === "string" ? size : size + "px" );
8973
		}
8974
	};
8975

    
8976
});
8977

    
8978

    
8979
// Expose jQuery to the global object
8980
window.jQuery = window.$ = jQuery;
8981
})(window);
(8-8/16)