PageSourceSearch

https://brestskayakrepostfilm.ru/js/lib/jquery/jquery-1.4.1.js

js brestskayakrepostfilm.ru collected 2026-10-09 05:10:37 UTC 160,712 bytes, 6,078 lines download raw bytes

vendor: 38,120 bytes, lines 1-1486
1/*!
2 * jQuery JavaScript Library v1.4.1
3 * http://jquery.com/
4 *
5 * Copyright 2010, 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 2010, The Dojo Foundation
12 * Released under the MIT, BSD, and GPL Licenses.
13 *
14 * Date: Mon Jan 25 19:43:33 2010 -0500
15 */
16(function( window, undefined ) {
17
18// Define a local copy of jQuery
19var jQuery = function( selector, context ) {
20		// The jQuery object is actually just the init constructor 'enhanced'
21		return new jQuery.fn.init( selector, context );
22	},
23
24	// Map over jQuery in case of overwrite
25	_jQuery = window.jQuery,
26
27	// Map over the $ in case of overwrite
28	_$ = window.$,
29
30	// Use the correct document accordingly with window argument (sandbox)
31	document = window.document,
32
33	// A central reference to the root jQuery(document)
34	rootjQuery,
35
36	// A simple way to check for HTML strings or ID strings
37	// (both of which we optimize for)
38	quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
39
40	// Is it a simple selector
41	isSimple = /^.[^:#\[\.,]*$/,
42
43	// Check if a string has a non-whitespace character in it
44	rnotwhite = /\S/,
45
46	// Used for trimming whitespace
47	rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
48
49	// Match a standalone tag
50	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
51
52	// Keep a UserAgent string for use with jQuery.browser
53	userAgent = navigator.userAgent,
54
55	// For matching the engine and version of the browser
56	browserMatch,
57	
58	// Has the ready events already been bound?
59	readyBound = false,
60	
61	// The functions to execute on DOM ready
62	readyList = [],
63
64	// The ready event handler
65	DOMContentLoaded,
66
67	// Save a reference to some core methods
68	toString = Object.prototype.toString,
69	hasOwnProperty = Object.prototype.hasOwnProperty,
70	push = Array.prototype.push,
71	slice = Array.prototype.slice,
72	indexOf = Array.prototype.indexOf;
73
74jQuery.fn = jQuery.prototype = {
75	init: function( selector, context ) {
76		var match, elem, ret, doc;
77
78		// Handle $(""), $(null), or $(undefined)
79		if ( !selector ) {
80			return this;
81		}
82
83		// Handle $(DOMElement)
84		if ( selector.nodeType ) {
85			this.context = this[0] = selector;
86			this.length = 1;
87			return this;
88		}
89
90		// Handle HTML strings
91		if ( typeof selector === "string" ) {
92			// Are we dealing with HTML string or an ID?
93			match = quickExpr.exec( selector );
94
95			// Verify a match, and that no context was specified for #id
96			if ( match && (match[1] || !context) ) {
97
98				// HANDLE: $(html) -> $(array)
99				if ( match[1] ) {
100					doc = (context ? context.ownerDocument || context : document);
101
102					// If a single string is passed in and it's a single tag
103					// just do a createElement and skip the rest
104					ret = rsingleTag.exec( selector );
105
106					if ( ret ) {
107						if ( jQuery.isPlainObject( context ) ) {
108							selector = [ document.createElement( ret[1] ) ];
109							jQuery.fn.attr.call( selector, context, true );
110
111						} else {
112							selector = [ doc.createElement( ret[1] ) ];
113						}
114
115					} else {
116						ret = buildFragment( [ match[1] ], [ doc ] );
117						selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
118					}
119
120				// HANDLE: $("#id")
121				} else {
122					elem = document.getElementById( match[2] );
123
124					if ( elem ) {
125						// Handle the case where IE and Opera return items
126						// by name instead of ID
127						if ( elem.id !== match[2] ) {
128							return rootjQuery.find( selector );
129						}
130
131						// Otherwise, we inject the element directly into the jQuery object
132						this.length = 1;
133						this[0] = elem;
134					}
135
136					this.context = document;
137					this.selector = selector;
138					return this;
139				}
140
141			// HANDLE: $("TAG")
142			} else if ( !context && /^\w+$/.test( selector ) ) {
143				this.selector = selector;
144				this.context = document;
145				selector = document.getElementsByTagName( selector );
146
147			// HANDLE: $(expr, $(...))
148			} else if ( !context || context.jquery ) {
149				return (context || rootjQuery).find( selector );
150
151			// HANDLE: $(expr, context)
152			// (which is just equivalent to: $(context).find(expr)
153			} else {
154				return jQuery( context ).find( selector );
155			}
156
157		// HANDLE: $(function)
158		// Shortcut for document ready
159		} else if ( jQuery.isFunction( selector ) ) {
160			return rootjQuery.ready( selector );
161		}
162
163		if (selector.selector !== undefined) {
164			this.selector = selector.selector;
165			this.context = selector.context;
166		}
167
168		return jQuery.isArray( selector ) ?
169			this.setArray( selector ) :
170			jQuery.makeArray( selector, this );
171	},
172
173	// Start with an empty selector
174	selector: "",
175
176	// The current version of jQuery being used
177	jquery: "1.4.1",
178
179	// The default length of a jQuery object is 0
180	length: 0,
181
182	// The number of elements contained in the matched element set
183	size: function() {
184		return this.length;
185	},
186
187	toArray: function() {
188		return slice.call( this, 0 );
189	},
190
191	// Get the Nth element in the matched element set OR
192	// Get the whole matched element set as a clean array
193	get: function( num ) {
194		return num == null ?
195
196			// Return a 'clean' array
197			this.toArray() :
198
199			// Return just the object
200			( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
201	},
202
203	// Take an array of elements and push it onto the stack
204	// (returning the new matched element set)
205	pushStack: function( elems, name, selector ) {
206		// Build a new jQuery matched element set
207		var ret = jQuery( elems || null );
208
209		// Add the old object onto the stack (as a reference)
210		ret.prevObject = this;
211
212		ret.context = this.context;
213
214		if ( name === "find" ) {
215			ret.selector = this.selector + (this.selector ? " " : "") + selector;
216		} else if ( name ) {
217			ret.selector = this.selector + "." + name + "(" + selector + ")";
218		}
219
220		// Return the newly-formed element set
221		return ret;
222	},
223
224	// Force the current matched set of elements to become
225	// the specified array of elements (destroying the stack in the process)
226	// You should use pushStack() in order to do this, but maintain the stack
227	setArray: function( elems ) {
228		// Resetting the length to 0, then using the native Array push
229		// is a super-fast way to populate an object with array-like properties
230		this.length = 0;
231		push.apply( this, elems );
232
233		return this;
234	},
235
236	// Execute a callback for every element in the matched set.
237	// (You can seed the arguments with an array of args, but this is
238	// only used internally.)
239	each: function( callback, args ) {
240		return jQuery.each( this, callback, args );
241	},
242	
243	ready: function( fn ) {
244		// Attach the listeners
245		jQuery.bindReady();
246
247		// If the DOM is already ready
248		if ( jQuery.isReady ) {
249			// Execute the function immediately
250			fn.call( document, jQuery );
251
252		// Otherwise, remember the function for later
253		} else if ( readyList ) {
254			// Add the function to the wait list
255			readyList.push( fn );
256		}
257
258		return this;
259	},
260	
261	eq: function( i ) {
262		return i === -1 ?
263			this.slice( i ) :
264			this.slice( i, +i + 1 );
265	},
266
267	first: function() {
268		return this.eq( 0 );
269	},
270
271	last: function() {
272		return this.eq( -1 );
273	},
274
275	slice: function() {
276		return this.pushStack( slice.apply( this, arguments ),
277			"slice", slice.call(arguments).join(",") );
278	},
279
280	map: function( callback ) {
281		return this.pushStack( jQuery.map(this, function( elem, i ) {
282			return callback.call( elem, i, elem );
283		}));
284	},
285	
286	end: function() {
287		return this.prevObject || jQuery(null);
288	},
289
290	// For internal use only.
291	// Behaves like an Array's method, not like a jQuery method.
292	push: push,
293	sort: [].sort,
294	splice: [].splice
295};
296
297// Give the init function the jQuery prototype for later instantiation
298jQuery.fn.init.prototype = jQuery.fn;
299
300jQuery.extend = jQuery.fn.extend = function() {
301	// copy reference to target object
302	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
303
304	// Handle a deep copy situation
305	if ( typeof target === "boolean" ) {
306		deep = target;
307		target = arguments[1] || {};
308		// skip the boolean and the target
309		i = 2;
310	}
311
312	// Handle case when target is a string or something (possible in deep copy)
313	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
314		target = {};
315	}
316
317	// extend jQuery itself if only one argument is passed
318	if ( length === i ) {
319		target = this;
320		--i;
321	}
322
323	for ( ; i < length; i++ ) {
324		// Only deal with non-null/undefined values
325		if ( (options = arguments[ i ]) != null ) {
326			// Extend the base object
327			for ( name in options ) {
328				src = target[ name ];
329				copy = options[ name ];
330
331				// Prevent never-ending loop
332				if ( target === copy ) {
333					continue;
334				}
335
336				// Recurse if we're merging object literal values or arrays
337				if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
338					var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
339						: jQuery.isArray(copy) ? [] : {};
340
341					// Never move original objects, clone them
342					target[ name ] = jQuery.extend( deep, clone, copy );
343
344				// Don't bring in undefined values
345				} else if ( copy !== undefined ) {
346					target[ name ] = copy;
347				}
348			}
349		}
350	}
351
352	// Return the modified object
353	return target;
354};
355
356jQuery.extend({
357	noConflict: function( deep ) {
358		window.$ = _$;
359
360		if ( deep ) {
361			window.jQuery = _jQuery;
362		}
363
364		return jQuery;
365	},
366	
367	// Is the DOM ready to be used? Set to true once it occurs.
368	isReady: false,
369	
370	// Handle when the DOM is ready
371	ready: function() {
372		// Make sure that the DOM is not already loaded
373		if ( !jQuery.isReady ) {
374			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
375			if ( !document.body ) {
376				return setTimeout( jQuery.ready, 13 );
377			}
378
379			// Remember that the DOM is ready
380			jQuery.isReady = true;
381
382			// If there are functions bound, to execute
383			if ( readyList ) {
384				// Execute all of them
385				var fn, i = 0;
386				while ( (fn = readyList[ i++ ]) ) {
387					fn.call( document, jQuery );
388				}
389
390				// Reset the list of functions
391				readyList = null;
392			}
393
394			// Trigger any bound ready events
395			if ( jQuery.fn.triggerHandler ) {
396				jQuery( document ).triggerHandler( "ready" );
397			}
398		}
399	},
400	
401	bindReady: function() {
402		if ( readyBound ) {
403			return;
404		}
405
406		readyBound = true;
407
408		// Catch cases where $(document).ready() is called after the
409		// browser event has already occurred.
410		if ( document.readyState === "complete" ) {
411			return jQuery.ready();
412		}
413
414		// Mozilla, Opera and webkit nightlies currently support this event
415		if ( document.addEventListener ) {
416			// Use the handy event callback
417			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
418			
419			// A fallback to window.onload, that will always work
420			window.addEventListener( "load", jQuery.ready, false );
421
422		// If IE event model is used
423		} else if ( document.attachEvent ) {
424			// ensure firing before onload,
425			// maybe late but safe also for iframes
426			document.attachEvent("onreadystatechange", DOMContentLoaded);
427			
428			// A fallback to window.onload, that will always work
429			window.attachEvent( "onload", jQuery.ready );
430
431			// If IE and not a frame
432			// continually check to see if the document is ready
433			var toplevel = false;
434
435			try {
436				toplevel = window.frameElement == null;
437			} catch(e) {}
438
439			if ( document.documentElement.doScroll && toplevel ) {
440				doScrollCheck();
441			}
442		}
443	},
444
445	// See test/unit/core.js for details concerning isFunction.
446	// Since version 1.3, DOM methods and functions like alert
447	// aren't supported. They return false on IE (#2968).
448	isFunction: function( obj ) {
449		return toString.call(obj) === "[object Function]";
450	},
451
452	isArray: function( obj ) {
453		return toString.call(obj) === "[object Array]";
454	},
455
456	isPlainObject: function( obj ) {
457		// Must be an Object.
458		// Because of IE, we also have to check the presence of the constructor property.
459		// Make sure that DOM nodes and window objects don't pass through, as well
460		if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
461			return false;
462		}
463		
464		// Not own constructor property must be Object
465		if ( obj.constructor
466			&& !hasOwnProperty.call(obj, "constructor")
467			&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
468			return false;
469		}
470		
471		// Own properties are enumerated firstly, so to speed up,
472		// if last one is own, then all properties are own.
473	
474		var key;
475		for ( key in obj ) {}
476		
477		return key === undefined || hasOwnProperty.call( obj, key );
478	},
479
480	isEmptyObject: function( obj ) {
481		for ( var name in obj ) {
482			return false;
483		}
484		return true;
485	},
486	
487	error: function( msg ) {
488		throw msg;
489	},
490	
491	parseJSON: function( data ) {
492		if ( typeof data !== "string" || !data ) {
493			return null;
494		}
495		
496		// Make sure the incoming data is actual JSON
497		// Logic borrowed from http://json.org/json2.js
498		if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
499			.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
500			.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
501
502			// Try to use the native JSON parser first
503			return window.JSON && window.JSON.parse ?
504				window.JSON.parse( data ) :
505				(new Function("return " + data))();
506
507		} else {
508			jQuery.error( "Invalid JSON: " + data );
509		}
510	},
511
512	noop: function() {},
513
514	// Evalulates a script in a global context
515	globalEval: function( data ) {
516		if ( data && rnotwhite.test(data) ) {
517			// Inspired by code by Andrea Giammarchi
518			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
519			var head = document.getElementsByTagName("head")[0] || document.documentElement,
520				script = document.createElement("script");
521
522			script.type = "text/javascript";
523
524			if ( jQuery.support.scriptEval ) {
525				script.appendChild( document.createTextNode( data ) );
526			} else {
527				script.text = data;
528			}
529
530			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
531			// This arises when a base node is used (#2709).
532			head.insertBefore( script, head.firstChild );
533			head.removeChild( script );
534		}
535	},
536
537	nodeName: function( elem, name ) {
538		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
539	},
540
541	// args is for internal usage only
542	each: function( object, callback, args ) {
543		var name, i = 0,
544			length = object.length,
545			isObj = length === undefined || jQuery.isFunction(object);
546
547		if ( args ) {
548			if ( isObj ) {
549				for ( name in object ) {
550					if ( callback.apply( object[ name ], args ) === false ) {
551						break;
552					}
553				}
554			} else {
555				for ( ; i < length; ) {
556					if ( callback.apply( object[ i++ ], args ) === false ) {
557						break;
558					}
559				}
560			}
561
562		// A special, fast, case for the most common use of each
563		} else {
564			if ( isObj ) {
565				for ( name in object ) {
566					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
567						break;
568					}
569				}
570			} else {
571				for ( var value = object[0];
572					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
573			}
574		}
575
576		return object;
577	},
578
579	trim: function( text ) {
580		return (text || "").replace( rtrim, "" );
581	},
582
583	// results is for internal usage only
584	makeArray: function( array, results ) {
585		var ret = results || [];
586
587		if ( array != null ) {
588			// The window, strings (and functions) also have 'length'
589			// The extra typeof function check is to prevent crashes
590			// in Safari 2 (See: #3039)
591			if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
592				push.call( ret, array );
593			} else {
594				jQuery.merge( ret, array );
595			}
596		}
597
598		return ret;
599	},
600
601	inArray: function( elem, array ) {
602		if ( array.indexOf ) {
603			return array.indexOf( elem );
604		}
605
606		for ( var i = 0, length = array.length; i < length; i++ ) {
607			if ( array[ i ] === elem ) {
608				return i;
609			}
610		}
611
612		return -1;
613	},
614
615	merge: function( first, second ) {
616		var i = first.length, j = 0;
617
618		if ( typeof second.length === "number" ) {
619			for ( var l = second.length; j < l; j++ ) {
620				first[ i++ ] = second[ j ];
621			}
622		} else {
623			while ( second[j] !== undefined ) {
624				first[ i++ ] = second[ j++ ];
625			}
626		}
627
628		first.length = i;
629
630		return first;
631	},
632
633	grep: function( elems, callback, inv ) {
634		var ret = [];
635
636		// Go through the array, only saving the items
637		// that pass the validator function
638		for ( var i = 0, length = elems.length; i < length; i++ ) {
639			if ( !inv !== !callback( elems[ i ], i ) ) {
640				ret.push( elems[ i ] );
641			}
642		}
643
644		return ret;
645	},
646
647	// arg is for internal usage only
648	map: function( elems, callback, arg ) {
649		var ret = [], value;
650
651		// Go through the array, translating each of the items to their
652		// new value (or values).
653		for ( var i = 0, length = elems.length; i < length; i++ ) {
654			value = callback( elems[ i ], i, arg );
655
656			if ( value != null ) {
657				ret[ ret.length ] = value;
658			}
659		}
660
661		return ret.concat.apply( [], ret );
662	},
663
664	// A global GUID counter for objects
665	guid: 1,
666
667	proxy: function( fn, proxy, thisObject ) {
668		if ( arguments.length === 2 ) {
669			if ( typeof proxy === "string" ) {
670				thisObject = fn;
671				fn = thisObject[ proxy ];
672				proxy = undefined;
673
674			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
675				thisObject = proxy;
676				proxy = undefined;
677			}
678		}
679
680		if ( !proxy && fn ) {
681			proxy = function() {
682				return fn.apply( thisObject || this, arguments );
683			};
684		}
685
686		// Set the guid of unique handler to the same of original handler, so it can be removed
687		if ( fn ) {
688			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
689		}
690
691		// So proxy can be declared as an argument
692		return proxy;
693	},
694
695	// Use of jQuery.browser is frowned upon.
696	// More details: http://docs.jquery.com/Utilities/jQuery.browser
697	uaMatch: function( ua ) {
698		ua = ua.toLowerCase();
699
700		var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
701			/(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
702			/(msie) ([\w.]+)/.exec( ua ) ||
703			!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
704		  	[];
705
706		return { browser: match[1] || "", version: match[2] || "0" };
707	},
708
709	browser: {}
710});
711
712browserMatch = jQuery.uaMatch( userAgent );
713if ( browserMatch.browser ) {
714	jQuery.browser[ browserMatch.browser ] = true;
715	jQuery.browser.version = browserMatch.version;
716}
717
718// Deprecated, use jQuery.browser.webkit instead
719if ( jQuery.browser.webkit ) {
720	jQuery.browser.safari = true;
721}
722
723if ( indexOf ) {
724	jQuery.inArray = function( elem, array ) {
725		return indexOf.call( array, elem );
726	};
727}
728
729// All jQuery objects should point back to these
730rootjQuery = jQuery(document);
731
732// Cleanup functions for the document ready method
733if ( document.addEventListener ) {
734	DOMContentLoaded = function() {
735		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
736		jQuery.ready();
737	};
738
739} else if ( document.attachEvent ) {
740	DOMContentLoaded = function() {
741		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
742		if ( document.readyState === "complete" ) {
743			document.detachEvent( "onreadystatechange", DOMContentLoaded );
744			jQuery.ready();
745		}
746	};
747}
748
749// The DOM ready check for Internet Explorer
750function doScrollCheck() {
751	if ( jQuery.isReady ) {
752		return;
753	}
754
755	try {
756		// If IE is used, use the trick by Diego Perini
757		// http://javascript.nwbox.com/IEContentLoaded/
758		document.documentElement.doScroll("left");
759	} catch( error ) {
760		setTimeout( doScrollCheck, 1 );
761		return;
762	}
763
764	// and execute any waiting functions
765	jQuery.ready();
766}
767
768function evalScript( i, elem ) {
769	if ( elem.src ) {
770		jQuery.ajax({
771			url: elem.src,
772			async: false,
773			dataType: "script"
774		});
775	} else {
776		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
777	}
778
779	if ( elem.parentNode ) {
780		elem.parentNode.removeChild( elem );
781	}
782}
783
784// Mutifunctional method to get and set values to a collection
785// The value/s can be optionally by executed if its a function
786function access( elems, key, value, exec, fn, pass ) {
787	var length = elems.length;
788	
789	// Setting many attributes
790	if ( typeof key === "object" ) {
791		for ( var k in key ) {
792			access( elems, k, key[k], exec, fn, value );
793		}
794		return elems;
795	}
796	
797	// Setting one attribute
798	if ( value !== undefined ) {
799		// Optionally, function values get executed if exec is true
800		exec = !pass && exec && jQuery.isFunction(value);
801		
802		for ( var i = 0; i < length; i++ ) {
803			fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
804		}
805		
806		return elems;
807	}
808	
809	// Getting an attribute
810	return length ? fn( elems[0], key ) : null;
811}
812
813function now() {
814	return (new Date).getTime();
815}
816(function() {
817
818	jQuery.support = {};
819
820	var root = document.documentElement,
821		script = document.createElement("script"),
822		div = document.createElement("div"),
823		id = "script" + now();
824
825	div.style.display = "none";
826	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
827
828	var all = div.getElementsByTagName("*"),
829		a = div.getElementsByTagName("a")[0];
830
831	// Can't get basic test support
832	if ( !all || !all.length || !a ) {
833		return;
834	}
835
836	jQuery.support = {
837		// IE strips leading whitespace when .innerHTML is used
838		leadingWhitespace: div.firstChild.nodeType === 3,
839
840		// Make sure that tbody elements aren't automatically inserted
841		// IE will insert them into empty tables
842		tbody: !div.getElementsByTagName("tbody").length,
843
844		// Make sure that link elements get serialized correctly by innerHTML
845		// This requires a wrapper element in IE
846		htmlSerialize: !!div.getElementsByTagName("link").length,
847
848		// Get the style information from getAttribute
849		// (IE uses .cssText insted)
850		style: /red/.test( a.getAttribute("style") ),
851
852		// Make sure that URLs aren't manipulated
853		// (IE normalizes it by default)
854		hrefNormalized: a.getAttribute("href") === "/a",
855
856		// Make sure that element opacity exists
857		// (IE uses filter instead)
858		// Use a regex to work around a WebKit issue. See #5145
859		opacity: /^0.55$/.test( a.style.opacity ),
860
861		// Verify style float existence
862		// (IE uses styleFloat instead of cssFloat)
863		cssFloat: !!a.style.cssFloat,
864
865		// Make sure that if no value is specified for a checkbox
866		// that it defaults to "on".
867		// (WebKit defaults to "" instead)
868		checkOn: div.getElementsByTagName("input")[0].value === "on",
869
870		// Make sure that a selected-by-default option has a working selected property.
871		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
872		optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
873
874		// Will be defined later
875		checkClone: false,
876		scriptEval: false,
877		noCloneEvent: true,
878		boxModel: null
879	};
880
881	script.type = "text/javascript";
882	try {
883		script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
884	} catch(e) {}
885
886	root.insertBefore( script, root.firstChild );
887
888	// Make sure that the execution of code works by injecting a script
889	// tag with appendChild/createTextNode
890	// (IE doesn't support this, fails, and uses .text instead)
891	if ( window[ id ] ) {
892		jQuery.support.scriptEval = true;
893		delete window[ id ];
894	}
895
896	root.removeChild( script );
897
898	if ( div.attachEvent && div.fireEvent ) {
899		div.attachEvent("onclick", function click() {
900			// Cloning a node shouldn't copy over any
901			// bound event handlers (IE does this)
902			jQuery.support.noCloneEvent = false;
903			div.detachEvent("onclick", click);
904		});
905		div.cloneNode(true).fireEvent("onclick");
906	}
907
908	div = document.createElement("div");
909	div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
910
911	var fragment = document.createDocumentFragment();
912	fragment.appendChild( div.firstChild );
913
914	// WebKit doesn't clone checked state correctly in fragments
915	jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
916
917	// Figure out if the W3C box model works as expected
918	// document.body must exist before we can do this
919	jQuery(function() {
920		var div = document.createElement("div");
921		div.style.width = div.style.paddingLeft = "1px";
922
923		document.body.appendChild( div );
924		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
925		document.body.removeChild( div ).style.display = 'none';
926		div = null;
927	});
928
929	// Technique from Juriy Zaytsev
930	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
931	var eventSupported = function( eventName ) { 
932		var el = document.createElement("div"); 
933		eventName = "on" + eventName; 
934
935		var isSupported = (eventName in el); 
936		if ( !isSupported ) { 
937			el.setAttribute(eventName, "return;"); 
938			isSupported = typeof el[eventName] === "function"; 
939		} 
940		el = null; 
941
942		return isSupported; 
943	};
944	
945	jQuery.support.submitBubbles = eventSupported("submit");
946	jQuery.support.changeBubbles = eventSupported("change");
947
948	// release memory in IE
949	root = script = div = all = a = null;
950})();
951
952jQuery.props = {
953	"for": "htmlFor",
954	"class": "className",
955	readonly: "readOnly",
956	maxlength: "maxLength",
957	cellspacing: "cellSpacing",
958	rowspan: "rowSpan",
959	colspan: "colSpan",
960	tabindex: "tabIndex",
961	usemap: "useMap",
962	frameborder: "frameBorder"
963};
964var expando = "jQuery" + now(), uuid = 0, windowData = {};
965var emptyObject = {};
966
967jQuery.extend({
968	cache: {},
969	
970	expando:expando,
971
972	// The following elements throw uncatchable exceptions if you
973	// attempt to add expando properties to them.
974	noData: {
975		"embed": true,
976		"object": true,
977		"applet": true
978	},
979
980	data: function( elem, name, data ) {
981		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
982			return;
983		}
984
985		elem = elem == window ?
986			windowData :
987			elem;
988
989		var id = elem[ expando ], cache = jQuery.cache, thisCache;
990
991		// Handle the case where there's no name immediately
992		if ( !name && !id ) {
993			return null;
994		}
995
996		// Compute a unique ID for the element
997		if ( !id ) { 
998			id = ++uuid;
999		}
1000
1001		// Avoid generating a new cache unless none exists and we
1002		// want to manipulate it.
1003		if ( typeof name === "object" ) {
1004			elem[ expando ] = id;
1005			thisCache = cache[ id ] = jQuery.extend(true, {}, name);
1006		} else if ( cache[ id ] ) {
1007			thisCache = cache[ id ];
1008		} else if ( typeof data === "undefined" ) {
1009			thisCache = emptyObject;
1010		} else {
1011			thisCache = cache[ id ] = {};
1012		}
1013
1014		// Prevent overriding the named cache with undefined values
1015		if ( data !== undefined ) {
1016			elem[ expando ] = id;
1017			thisCache[ name ] = data;
1018		}
1019
1020		return typeof name === "string" ? thisCache[ name ] : thisCache;
1021	},
1022
1023	removeData: function( elem, name ) {
1024		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
1025			return;
1026		}
1027
1028		elem = elem == window ?
1029			windowData :
1030			elem;
1031
1032		var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
1033
1034		// If we want to remove a specific section of the element's data
1035		if ( name ) {
1036			if ( thisCache ) {
1037				// Remove the section of cache data
1038				delete thisCache[ name ];
1039
1040				// If we've removed all the data, remove the element's cache
1041				if ( jQuery.isEmptyObject(thisCache) ) {
1042					jQuery.removeData( elem );
1043				}
1044			}
1045
1046		// Otherwise, we want to remove all of the element's data
1047		} else {
1048			// Clean up the element expando
1049			try {
1050				delete elem[ expando ];
1051			} catch( e ) {
1052				// IE has trouble directly removing the expando
1053				// but it's ok with using removeAttribute
1054				if ( elem.removeAttribute ) {
1055					elem.removeAttribute( expando );
1056				}
1057			}
1058
1059			// Completely remove the data cache
1060			delete cache[ id ];
1061		}
1062	}
1063});
1064
1065jQuery.fn.extend({
1066	data: function( key, value ) {
1067		if ( typeof key === "undefined" && this.length ) {
1068			return jQuery.data( this[0] );
1069
1070		} else if ( typeof key === "object" ) {
1071			return this.each(function() {
1072				jQuery.data( this, key );
1073			});
1074		}
1075
1076		var parts = key.split(".");
1077		parts[1] = parts[1] ? "." + parts[1] : "";
1078
1079		if ( value === undefined ) {
1080			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
1081
1082			if ( data === undefined && this.length ) {
1083				data = jQuery.data( this[0], key );
1084			}
1085			return data === undefined && parts[1] ?
1086				this.data( parts[0] ) :
1087				data;
1088		} else {
1089			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
1090				jQuery.data( this, key, value );
1091			});
1092		}
1093	},
1094
1095	removeData: function( key ) {
1096		return this.each(function() {
1097			jQuery.removeData( this, key );
1098		});
1099	}
1100});
1101jQuery.extend({
1102	queue: function( elem, type, data ) {
1103		if ( !elem ) {
1104			return;
1105		}
1106
1107		type = (type || "fx") + "queue";
1108		var q = jQuery.data( elem, type );
1109
1110		// Speed up dequeue by getting out quickly if this is just a lookup
1111		if ( !data ) {
1112			return q || [];
1113		}
1114
1115		if ( !q || jQuery.isArray(data) ) {
1116			q = jQuery.data( elem, type, jQuery.makeArray(data) );
1117
1118		} else {
1119			q.push( data );
1120		}
1121
1122		return q;
1123	},
1124
1125	dequeue: function( elem, type ) {
1126		type = type || "fx";
1127
1128		var queue = jQuery.queue( elem, type ), fn = queue.shift();
1129
1130		// If the fx queue is dequeued, always remove the progress sentinel
1131		if ( fn === "inprogress" ) {
1132			fn = queue.shift();
1133		}
1134
1135		if ( fn ) {
1136			// Add a progress sentinel to prevent the fx queue from being
1137			// automatically dequeued
1138			if ( type === "fx" ) {
1139				queue.unshift("inprogress");
1140			}
1141
1142			fn.call(elem, function() {
1143				jQuery.dequeue(elem, type);
1144			});
1145		}
1146	}
1147});
1148
1149jQuery.fn.extend({
1150	queue: function( type, data ) {
1151		if ( typeof type !== "string" ) {
1152			data = type;
1153			type = "fx";
1154		}
1155
1156		if ( data === undefined ) {
1157			return jQuery.queue( this[0], type );
1158		}
1159		return this.each(function( i, elem ) {
1160			var queue = jQuery.queue( this, type, data );
1161
1162			if ( type === "fx" && queue[0] !== "inprogress" ) {
1163				jQuery.dequeue( this, type );
1164			}
1165		});
1166	},
1167	dequeue: function( type ) {
1168		return this.each(function() {
1169			jQuery.dequeue( this, type );
1170		});
1171	},
1172
1173	// Based off of the plugin by Clint Helfers, with permission.
1174	// http://blindsignals.com/index.php/2009/07/jquery-delay/
1175	delay: function( time, type ) {
1176		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
1177		type = type || "fx";
1178
1179		return this.queue( type, function() {
1180			var elem = this;
1181			setTimeout(function() {
1182				jQuery.dequeue( elem, type );
1183			}, time );
1184		});
1185	},
1186
1187	clearQueue: function( type ) {
1188		return this.queue( type || "fx", [] );
1189	}
1190});
1191var rclass = /[\n\t]/g,
1192	rspace = /\s+/,
1193	rreturn = /\r/g,
1194	rspecialurl = /href|src|style/,
1195	rtype = /(button|input)/i,
1196	rfocusable = /(button|input|object|select|textarea)/i,
1197	rclickable = /^(a|area)$/i,
1198	rradiocheck = /radio|checkbox/;
1199
1200jQuery.fn.extend({
1201	attr: function( name, value ) {
1202		return access( this, name, value, true, jQuery.attr );
1203	},
1204
1205	removeAttr: function( name, fn ) {
1206		return this.each(function(){
1207			jQuery.attr( this, name, "" );
1208			if ( this.nodeType === 1 ) {
1209				this.removeAttribute( name );
1210			}
1211		});
1212	},
1213
1214	addClass: function( value ) {
1215		if ( jQuery.isFunction(value) ) {
1216			return this.each(function(i) {
1217				var self = jQuery(this);
1218				self.addClass( value.call(this, i, self.attr("class")) );
1219			});
1220		}
1221
1222		if ( value && typeof value === "string" ) {
1223			var classNames = (value || "").split( rspace );
1224
1225			for ( var i = 0, l = this.length; i < l; i++ ) {
1226				var elem = this[i];
1227
1228				if ( elem.nodeType === 1 ) {
1229					if ( !elem.className ) {
1230						elem.className = value;
1231
1232					} else {
1233						var className = " " + elem.className + " ";
1234						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1235							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
1236								elem.className += " " + classNames[c];
1237							}
1238						}
1239					}
1240				}
1241			}
1242		}
1243
1244		return this;
1245	},
1246
1247	removeClass: function( value ) {
1248		if ( jQuery.isFunction(value) ) {
1249			return this.each(function(i) {
1250				var self = jQuery(this);
1251				self.removeClass( value.call(this, i, self.attr("class")) );
1252			});
1253		}
1254
1255		if ( (value && typeof value === "string") || value === undefined ) {
1256			var classNames = (value || "").split(rspace);
1257
1258			for ( var i = 0, l = this.length; i < l; i++ ) {
1259				var elem = this[i];
1260
1261				if ( elem.nodeType === 1 && elem.className ) {
1262					if ( value ) {
1263						var className = (" " + elem.className + " ").replace(rclass, " ");
1264						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
1265							className = className.replace(" " + classNames[c] + " ", " ");
1266						}
1267						elem.className = className.substring(1, className.length - 1);
1268
1269					} else {
1270						elem.className = "";
1271					}
1272				}
1273			}
1274		}
1275
1276		return this;
1277	},
1278
1279	toggleClass: function( value, stateVal ) {
1280		var type = typeof value, isBool = typeof stateVal === "boolean";
1281
1282		if ( jQuery.isFunction( value ) ) {
1283			return this.each(function(i) {
1284				var self = jQuery(this);
1285				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
1286			});
1287		}
1288
1289		return this.each(function() {
1290			if ( type === "string" ) {
1291				// toggle individual class names
1292				var className, i = 0, self = jQuery(this),
1293					state = stateVal,
1294					classNames = value.split( rspace );
1295
1296				while ( (className = classNames[ i++ ]) ) {
1297					// check each className given, space seperated list
1298					state = isBool ? state : !self.hasClass( className );
1299					self[ state ? "addClass" : "removeClass" ]( className );
1300				}
1301
1302			} else if ( type === "undefined" || type === "boolean" ) {
1303				if ( this.className ) {
1304					// store className if set
1305					jQuery.data( this, "__className__", this.className );
1306				}
1307
1308				// toggle whole className
1309				this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
1310			}
1311		});
1312	},
1313
1314	hasClass: function( selector ) {
1315		var className = " " + selector + " ";
1316		for ( var i = 0, l = this.length; i < l; i++ ) {
1317			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
1318				return true;
1319			}
1320		}
1321
1322		return false;
1323	},
1324
1325	val: function( value ) {
1326		if ( value === undefined ) {
1327			var elem = this[0];
1328
1329			if ( elem ) {
1330				if ( jQuery.nodeName( elem, "option" ) ) {
1331					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
1332				}
1333
1334				// We need to handle select boxes special
1335				if ( jQuery.nodeName( elem, "select" ) ) {
1336					var index = elem.selectedIndex,
1337						values = [],
1338						options = elem.options,
1339						one = elem.type === "select-one";
1340
1341					// Nothing was selected
1342					if ( index < 0 ) {
1343						return null;
1344					}
1345
1346					// Loop through all the selected options
1347					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
1348						var option = options[ i ];
1349
1350						if ( option.selected ) {
1351							// Get the specifc value for the option
1352							value = jQuery(option).val();
1353
1354							// We don't need an array for one selects
1355							if ( one ) {
1356								return value;
1357							}
1358
1359							// Multi-Selects return an array
1360							values.push( value );
1361						}
1362					}
1363
1364					return values;
1365				}
1366
1367				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
1368				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
1369					return elem.getAttribute("value") === null ? "on" : elem.value;
1370				}
1371				
1372
1373				// Everything else, we just grab the value
1374				return (elem.value || "").replace(rreturn, "");
1375
1376			}
1377
1378			return undefined;
1379		}
1380
1381		var isFunction = jQuery.isFunction(value);
1382
1383		return this.each(function(i) {
1384			var self = jQuery(this), val = value;
1385
1386			if ( this.nodeType !== 1 ) {
1387				return;
1388			}
1389
1390			if ( isFunction ) {
1391				val = value.call(this, i, self.val());
1392			}
1393
1394			// Typecast each time if the value is a Function and the appended
1395			// value is therefore different each time.
1396			if ( typeof val === "number" ) {
1397				val += "";
1398			}
1399
1400			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
1401				this.checked = jQuery.inArray( self.val(), val ) >= 0;
1402
1403			} else if ( jQuery.nodeName( this, "select" ) ) {
1404				var values = jQuery.makeArray(val);
1405
1406				jQuery( "option", this ).each(function() {
1407					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
1408				});
1409
1410				if ( !values.length ) {
1411					this.selectedIndex = -1;
1412				}
1413
1414			} else {
1415				this.value = val;
1416			}
1417		});
1418	}
1419});
1420
1421jQuery.extend({
1422	attrFn: {
1423		val: true,
1424		css: true,
1425		html: true,
1426		text: true,
1427		data: true,
1428		width: true,
1429		height: true,
1430		offset: true
1431	},
1432		
1433	attr: function( elem, name, value, pass ) {
1434		// don't set attributes on text and comment nodes
1435		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1436			return undefined;
1437		}
1438
1439		if ( pass && name in jQuery.attrFn ) {
1440			return jQuery(elem)[name](value);
1441		}
1442
1443		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
1444			// Whether we are setting (or getting)
1445			set = value !== undefined;
1446
1447		// Try to normalize/fix the name
1448		name = notxml && jQuery.props[ name ] || name;
1449
1450		// Only do all the following if this is a node (faster for style)
1451		if ( elem.nodeType === 1 ) {
1452			// These attributes require special treatment
1453			var special = rspecialurl.test( name );
1454
1455			// Safari mis-reports the default selected property of an option
1456			// Accessing the parent's selectedIndex property fixes it
1457			if ( name === "selected" && !jQuery.support.optSelected ) {
1458				var parent = elem.parentNode;
1459				if ( parent ) {
1460					parent.selectedIndex;
1461	
1462					// Make sure that it also works with optgroups, see #5701
1463					if ( parent.parentNode ) {
1464						parent.parentNode.selectedIndex;
1465					}
1466				}
1467			}
1468
1469			// If applicable, access the attribute via the DOM 0 way
1470			if ( name in elem && notxml && !special ) {
1471				if ( set ) {
1472					// We can't allow the type property to be changed (since it causes problems in IE)
1473					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
1474						jQuery.error( "type property can't be changed" );
1475					}
1476
1477					elem[ name ] = value;
1478				}
1479
1480				// browsers index elements by id/name on forms, give priority to attributes.
1481				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
1482					return elem.getAttributeNode( name ).nodeValue;
1483				}
1484
1485				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
1486				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
1487				if ( name === "tabIndex" ) {
1488					var attributeNode = elem.getAttributeNode( "tabIndex" );
1489
1490					return attributeNode && attributeNode.specified ?
1491						attributeNode.value :
1492						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
1493							0 :
1494							undefined;
1495				}
1496
1497				return elem[ name ];
1498			}
1499
1500			if ( !jQuery.support.style && notxml && name === "style" ) {
1501				if ( set ) {
1502					elem.style.cssText = "" + value;
1503				}
1504
1505				return elem.style.cssText;
1506			}
1507
1508			if ( set ) {
1509				// convert the value to a string (all browsers do this but IE) see #1070
1510				elem.setAttribute( name, "" + value );
1511			}
1512
1513			var attr = !jQuery.support.hrefNormalized && notxml && special ?
1514					// Some attributes require a special call on IE
1515					elem.getAttribute( name, 2 ) :
1516					elem.getAttribute( name );
1517
1518			// Non-existent attributes return null, we normalize to undefined
1519			return attr === null ? undefined : attr;
1520		}
1521
1522		// elem is actually elem.style ... set the style
1523		// Using attr for specific style information is now deprecated. Use style insead.
1524		return jQuery.style( elem, name, value );
1525	}
1526});
1527var fcleanup = function( nm ) {
1528	return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
1529		return "\\" + ch;
1530	});
1531};
1532
1533/*
1534 * A number of helper functions used for managing events.
1535 * Many of the ideas behind this code originated from
1536 * Dean Edwards' addEvent library.
1537 */
1538jQuery.event = {
1539
1540	// Bind an event to an element
1541	// Original by Dean Edwards
1542	add: function( elem, types, handler, data ) {
1543		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1544			return;
1545		}
1546
1547		// For whatever reason, IE has trouble passing the window object
1548		// around, causing it to be cloned in the process
1549		if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
1550			elem = window;
1551		}
1552
1553		// Make sure that the function being executed has a unique ID
1554		if ( !handler.guid ) {
1555			handler.guid = jQuery.guid++;
1556		}
1557
1558		// if data is passed, bind to handler
1559		if ( data !== undefined ) {
1560			// Create temporary function pointer to original handler
1561			var fn = handler;
1562
1563			// Create unique handler function, wrapped around original handler
1564			handler = jQuery.proxy( fn );
1565
1566			// Store data in unique handler
1567			handler.data = data;
1568		}
1569
1570		// Init the element's event structure
1571		var events = jQuery.data( elem, "events" ) || jQuery.data( elem, "events", {} ),
1572			handle = jQuery.data( elem, "handle" ), eventHandle;
1573
1574		if ( !handle ) {
1575			eventHandle = function() {
1576				// Handle the second event of a trigger and when
1577				// an event is called after a page has unloaded
1578				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
1579					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
1580					undefined;
1581			};
1582
1583			handle = jQuery.data( elem, "handle", eventHandle );
1584		}
1585
1586		// If no handle is found then we must be trying to bind to one of the
1587		// banned noData elements
1588		if ( !handle ) {
1589			return;
1590		}
1591
1592		// Add elem as a property of the handle function
1593		// This is to prevent a memory leak with non-native
1594		// event in IE.
1595		handle.elem = elem;
1596
1597		// Handle multiple events separated by a space
1598		// jQuery(...).bind("mouseover mouseout", fn);
1599		types = types.split( /\s+/ );
1600
1601		var type, i = 0;
1602
1603		while ( (type = types[ i++ ]) ) {
1604			// Namespaced event handlers
1605			var namespaces = type.split(".");
1606			type = namespaces.shift();
1607
1608			if ( i > 1 ) {
1609				handler = jQuery.proxy( handler );
1610
1611				if ( data !== undefined ) {
1612					handler.data = data;
1613				}
1614			}
1615
1616			handler.type = namespaces.slice(0).sort().join(".");
1617
1618			// Get the current list of functions bound to this event
1619			var handlers = events[ type ],
1620				special = this.special[ type ] || {};
1621
1622			// Init the event handler queue
1623			if ( !handlers ) {
1624				handlers = events[ type ] = {};
1625
1626				// Check for a special event handler
1627				// Only use addEventListener/attachEvent if the special
1628				// events handler returns false
1629				if ( !special.setup || special.setup.call( elem, data, namespaces, handler) === false ) {
1630					// Bind the global event handler to the element
1631					if ( elem.addEventListener ) {
1632						elem.addEventListener( type, handle, false );
1633					} else if ( elem.attachEvent ) {
1634						elem.attachEvent( "on" + type, handle );
1635					}
1636				}
1637			}
1638			
1639			if ( special.add ) { 
1640				var modifiedHandler = special.add.call( elem, handler, data, namespaces, handlers ); 
1641				if ( modifiedHandler && jQuery.isFunction( modifiedHandler ) ) { 
1642					modifiedHandler.guid = modifiedHandler.guid || handler.guid; 
1643					modifiedHandler.data = modifiedHandler.data || handler.data; 
1644					modifiedHandler.type = modifiedHandler.type || handler.type; 
1645					handler = modifiedHandler; 
1646				} 
1647			} 
1648			
1649			// Add the function to the element's handler list
1650			handlers[ handler.guid ] = handler;
1651
1652			// Keep track of which events have been used, for global triggering
1653			this.global[ type ] = true;
1654		}
1655
1656		// Nullify elem to prevent memory leaks in IE
1657		elem = null;
1658	},
1659
1660	global: {},
1661
1662	// Detach an event or set of events from an element
1663	remove: function( elem, types, handler ) {
1664		// don't do events on text and comment nodes
1665		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
1666			return;
1667		}
1668
1669		var events = jQuery.data( elem, "events" ), ret, type, fn;
1670
1671		if ( events ) {
1672			// Unbind all events for the element
1673			if ( types === undefined || (typeof types === "string" && types.charAt(0) === ".") ) {
1674				for ( type in events ) {
1675					this.remove( elem, type + (types || "") );
1676				}
1677			} else {
1678				// types is actually an event object here
1679				if ( types.type ) {
1680					handler = types.handler;
1681					types = types.type;
1682				}
1683
1684				// Handle multiple events separated by a space
1685				// jQuery(...).unbind("mouseover mouseout", fn);
1686				types = types.split(/\s+/);
1687				var i = 0;
1688				while ( (type = types[ i++ ]) ) {
1689					// Namespaced event handlers
1690					var namespaces = type.split(".");
1691					type = namespaces.shift();
1692					var all = !namespaces.length,
1693						cleaned = jQuery.map( namespaces.slice(0).sort(), fcleanup ),
1694						namespace = new RegExp("(^|\\.)" + cleaned.join("\\.(?:.*\\.)?") + "(\\.|$)"),
1695						special = this.special[ type ] || {};
1696
1697					if ( events[ type ] ) {
1698						// remove the given handler for the given type
1699						if ( handler ) {
1700							fn = events[ type ][ handler.guid ];
1701							delete events[ type ][ handler.guid ];
1702
1703						// remove all handlers for the given type
1704						} else {
1705							for ( var handle in events[ type ] ) {
1706								// Handle the removal of namespaced events
1707								if ( all || namespace.test( events[ type ][ handle ].type ) ) {
1708									delete events[ type ][ handle ];
1709								}
1710							}
1711						}
1712
1713						if ( special.remove ) {
1714							special.remove.call( elem, namespaces, fn);
1715						}
1716
1717						// remove generic event handler if no more handlers exist
1718						for ( ret in events[ type ] ) {
1719							break;
1720						}
1721						if ( !ret ) {
1722							if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
1723								if ( elem.removeEventListener ) {
1724									elem.removeEventListener( type, jQuery.data( elem, "handle" ), false );
1725								} else if ( elem.detachEvent ) {
1726									elem.detachEvent( "on" + type, jQuery.data( elem, "handle" ) );
1727								}
1728							}
1729							ret = null;
1730							delete events[ type ];
1731						}
1732					}
1733				}
1734			}
1735
1736			// Remove the expando if it's no longer used
1737			for ( ret in events ) {
1738				break;
1739			}
1740			if ( !ret ) {
1741				var handle = jQuery.data( elem, "handle" );
1742				if ( handle ) {
1743					handle.elem = null;
1744				}
1745				jQuery.removeData( elem, "events" );
1746				jQuery.removeData( elem, "handle" );
1747			}
1748		}
1749	},
1750
1751	// bubbling is internal
1752	trigger: function( event, data, elem /*, bubbling */ ) {
1753		// Event object or event type
1754		var type = event.type || event,
1755			bubbling = arguments[3];
1756
1757		if ( !bubbling ) {
1758			event = typeof event === "object" ?
1759				// jQuery.Event object
1760				event[expando] ? event :
1761				// Object literal
1762				jQuery.extend( jQuery.Event(type), event ) :
1763				// Just the event type (string)
1764				jQuery.Event(type);
1765
1766			if ( type.indexOf("!") >= 0 ) {
1767				event.type = type = type.slice(0, -1);
1768				event.exclusive = true;
1769			}
1770
1771			// Handle a global trigger
1772			if ( !elem ) {
1773				// Don't bubble custom events when global (to avoid too much overhead)
1774				event.stopPropagation();
1775
1776				// Only trigger if we've ever bound an event for it
1777				if ( this.global[ type ] ) {
1778					jQuery.each( jQuery.cache, function() {
1779						if ( this.events && this.events[type] ) {
1780							jQuery.event.trigger( event, data, this.handle.elem );
1781						}
1782					});
1783				}
1784			}
1785
1786			// Handle triggering a single element
1787
1788			// don't do events on text and comment nodes
1789			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
1790				return undefined;
1791			}
1792
1793			// Clean up in case it is reused
1794			event.result = undefined;
1795			event.target = elem;
1796
1797			// Clone the incoming data, if any
1798			data = jQuery.makeArray( data );
1799			data.unshift( event );
1800		}
1801
1802		event.currentTarget = elem;
1803
1804		// Trigger the event, it is assumed that "handle" is a function
1805		var handle = jQuery.data( elem, "handle" );
1806		if ( handle ) {
1807			handle.apply( elem, data );
1808		}
1809
1810		var parent = elem.parentNode || elem.ownerDocument;
1811
1812		// Trigger an inline bound script
1813		try {
1814			if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
1815				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
1816					event.result = false;
vendor: 5,012 bytes, lines 1817-1986
1817				}
1818			}
1819
1820		// prevent IE from throwing an error for some elements with some event types, see #3533
1821		} catch (e) {}
1822
1823		if ( !event.isPropagationStopped() && parent ) {
1824			jQuery.event.trigger( event, data, parent, true );
1825
1826		} else if ( !event.isDefaultPrevented() ) {
1827			var target = event.target, old,
1828				isClick = jQuery.nodeName(target, "a") && type === "click";
1829
1830			if ( !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
1831				try {
1832					if ( target[ type ] ) {
1833						// Make sure that we don't accidentally re-trigger the onFOO events
1834						old = target[ "on" + type ];
1835
1836						if ( old ) {
1837							target[ "on" + type ] = null;
1838						}
1839
1840						this.triggered = true;
1841						target[ type ]();
1842					}
1843
1844				// prevent IE from throwing an error for some elements with some event types, see #3533
1845				} catch (e) {}
1846
1847				if ( old ) {
1848					target[ "on" + type ] = old;
1849				}
1850
1851				this.triggered = false;
1852			}
1853		}
1854	},
1855
1856	handle: function( event ) {
1857		// returned undefined or false
1858		var all, handlers;
1859
1860		event = arguments[0] = jQuery.event.fix( event || window.event );
1861		event.currentTarget = this;
1862
1863		// Namespaced event handlers
1864		var namespaces = event.type.split(".");
1865		event.type = namespaces.shift();
1866
1867		// Cache this now, all = true means, any handler
1868		all = !namespaces.length && !event.exclusive;
1869
1870		var namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
1871
1872		handlers = ( jQuery.data(this, "events") || {} )[ event.type ];
1873
1874		for ( var j in handlers ) {
1875			var handler = handlers[ j ];
1876
1877			// Filter the functions by class
1878			if ( all || namespace.test(handler.type) ) {
1879				// Pass in a reference to the handler function itself
1880				// So that we can later remove it
1881				event.handler = handler;
1882				event.data = handler.data;
1883
1884				var ret = handler.apply( this, arguments );
1885
1886				if ( ret !== undefined ) {
1887					event.result = ret;
1888					if ( ret === false ) {
1889						event.preventDefault();
1890						event.stopPropagation();
1891					}
1892				}
1893
1894				if ( event.isImmediatePropagationStopped() ) {
1895					break;
1896				}
1897
1898			}
1899		}
1900
1901		return event.result;
1902	},
1903
1904	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
1905
1906	fix: function( event ) {
1907		if ( event[ expando ] ) {
1908			return event;
1909		}
1910
1911		// store a copy of the original event object
1912		// and "clone" to set read-only properties
1913		var originalEvent = event;
1914		event = jQuery.Event( originalEvent );
1915
1916		for ( var i = this.props.length, prop; i; ) {
1917			prop = this.props[ --i ];
1918			event[ prop ] = originalEvent[ prop ];
1919		}
1920
1921		// Fix target property, if necessary
1922		if ( !event.target ) {
1923			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
1924		}
1925
1926		// check if target is a textnode (safari)
1927		if ( event.target.nodeType === 3 ) {
1928			event.target = event.target.parentNode;
1929		}
1930
1931		// Add relatedTarget, if necessary
1932		if ( !event.relatedTarget && event.fromElement ) {
1933			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
1934		}
1935
1936		// Calculate pageX/Y if missing and clientX/Y available
1937		if ( event.pageX == null && event.clientX != null ) {
1938			var doc = document.documentElement, body = document.body;
1939			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
1940			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
1941		}
1942
1943		// Add which for key events
1944		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
1945			event.which = event.charCode || event.keyCode;
1946		}
1947
1948		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
1949		if ( !event.metaKey && event.ctrlKey ) {
1950			event.metaKey = event.ctrlKey;
1951		}
1952
1953		// Add which for click: 1 === left; 2 === middle; 3 === right
1954		// Note: button is not normalized, so don't use it
1955		if ( !event.which && event.button !== undefined ) {
1956			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
1957		}
1958
1959		return event;
1960	},
1961
1962	// Deprecated, use jQuery.guid instead
1963	guid: 1E8,
1964
1965	// Deprecated, use jQuery.proxy instead
1966	proxy: jQuery.proxy,
1967
1968	special: {
1969		ready: {
1970			// Make sure the ready event is setup
1971			setup: jQuery.bindReady,
1972			teardown: jQuery.noop
1973		},
1974
1975		live: {
1976			add: function( proxy, data, namespaces, live ) {
1977				jQuery.extend( proxy, data || {} );
1978
1979				proxy.guid += data.selector + data.live; 
1980				data.liveProxy = proxy;
1981
1982				jQuery.event.add( this, data.live, liveHandler, data ); 
1983				
1984			},
1985
1986			remove: function( namespaces ) {
1987				if ( namespaces.length ) {
1988					var remove = 0, name = new RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
1989
1990					jQuery.each( (jQuery.data(this, "events").live || {}), function() {
1991						if ( name.test(this.type) ) {
1992							remove++;
1993						}
1994					});
1995
1996					if ( remove < 1 ) {
1997						jQuery.event.remove( this, namespaces[0], liveHandler );
1998					}
1999				}
2000			},
2001			special: {}
2002		},
2003		beforeunload: {
2004			setup: function( data, namespaces, fn ) {
2005				// We only want to do this special case on windows
2006				if ( this.setInterval ) {
2007					this.onbeforeunload = fn;
2008				}
2009
2010				return false;
2011			},
2012			teardown: function( namespaces, fn ) {
2013				if ( this.onbeforeunload === fn ) {
2014					this.onbeforeunload = null;
2015				}
2016			}
2017		}
2018	}
2019};
2020
2021jQuery.Event = function( src ) {
2022	// Allow instantiation without the 'new' keyword
2023	if ( !this.preventDefault ) {
2024		return new jQuery.Event( src );
2025	}
2026
2027	// Event object
2028	if ( src && src.type ) {
2029		this.originalEvent = src;
2030		this.type = src.type;
2031	// Event type
2032	} else {
2033		this.type = src;
2034	}
2035
2036	// timeStamp is buggy for some events on Firefox(#3843)
2037	// So we won't rely on the native value
2038	this.timeStamp = now();
2039
2040	// Mark it as fixed
2041	this[ expando ] = true;
2042};
2043
2044function returnFalse() {
2045	return false;
2046}
2047function returnTrue() {
2048	return true;
2049}
2050
2051// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
2052// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
2053jQuery.Event.prototype = {
2054	preventDefault: function() {
2055		this.isDefaultPrevented = returnTrue;
2056
2057		var e = this.originalEvent;
2058		if ( !e ) {
2059			return;
2060		}
2061		
2062		// if preventDefault exists run it on the original event
2063		if ( e.preventDefault ) {
2064			e.preventDefault();
2065		}
2066		// otherwise set the returnValue property of the original event to false (IE)
2067		e.returnValue = false;
2068	},
2069	stopPropagation: function() {
2070		this.isPropagationStopped = returnTrue;
2071
2072		var e = this.originalEvent;
2073		if ( !e ) {
2074			return;
2075		}
2076		// if stopPropagation exists run it on the original event
2077		if ( e.stopPropagation ) {
2078			e.stopPropagation();
2079		}
2080		// otherwise set the cancelBubble property of the original event to true (IE)
2081		e.cancelBubble = true;
2082	},
2083	stopImmediatePropagation: function() {
2084		this.isImmediatePropagationStopped = returnTrue;
2085		this.stopPropagation();
2086	},
2087	isDefaultPrevented: returnFalse,
2088	isPropagationStopped: returnFalse,
2089	isImmediatePropagationStopped: returnFalse
2090};
2091
2092// Checks if an event happened on an element within another element
2093// Used in jQuery.event.special.mouseenter and mouseleave handlers
2094var withinElement = function( event ) {
2095	// Check if mouse(over|out) are still within the same parent element
2096	var parent = event.relatedTarget;
2097
2098	// Traverse up the tree
2099	while ( parent && parent !== this ) {
2100		// Firefox sometimes assigns relatedTarget a XUL element
2101		// which we cannot access the parentNode property of
2102		try {
2103			parent = parent.parentNode;
2104
2105		// assuming we've left the element since we most likely mousedover a xul element
2106		} catch(e) {
2107			break;
2108		}
2109	}
2110
2111	if ( parent !== this ) {
2112		// set the correct event type
2113		event.type = event.data;
2114
2115		// handle event if we actually just moused on to a non sub-element
2116		jQuery.event.handle.apply( this, arguments );
2117	}
2118
2119},
2120
2121// In case of event delegation, we only need to rename the event.type,
2122// liveHandler will take care of the rest.
2123delegate = function( event ) {
2124	event.type = event.data;
2125	jQuery.event.handle.apply( this, arguments );
2126};
2127
2128// Create mouseenter and mouseleave events
2129jQuery.each({
2130	mouseenter: "mouseover",
2131	mouseleave: "mouseout"
2132}, function( orig, fix ) {
2133	jQuery.event.special[ orig ] = {
2134		setup: function( data ) {
2135			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
2136		},
2137		teardown: function( data ) {
2138			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
2139		}
2140	};
2141});
2142
2143// submit delegation
2144if ( !jQuery.support.submitBubbles ) {
2145
2146jQuery.event.special.submit = {
2147	setup: function( data, namespaces, fn ) {
2148		if ( this.nodeName.toLowerCase() !== "form" ) {
2149			jQuery.event.add(this, "click.specialSubmit." + fn.guid, function( e ) {
2150				var elem = e.target, type = elem.type;
2151
2152				if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
2153					return trigger( "submit", this, arguments );
2154				}
2155			});
2156	 
2157			jQuery.event.add(this, "keypress.specialSubmit." + fn.guid, function( e ) {
2158				var elem = e.target, type = elem.type;
2159
2160				if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
2161					return trigger( "submit", this, arguments );
2162				}
2163			});
2164
2165		} else {
2166			return false;
vendor: 103,418 bytes, lines 2167-6078
2167		}
2168	},
2169
2170	remove: function( namespaces, fn ) {
2171		jQuery.event.remove( this, "click.specialSubmit" + (fn ? "."+fn.guid : "") );
2172		jQuery.event.remove( this, "keypress.specialSubmit" + (fn ? "."+fn.guid : "") );
2173	}
2174};
2175
2176}
2177
2178// change delegation, happens here so we have bind.
2179if ( !jQuery.support.changeBubbles ) {
2180
2181var formElems = /textarea|input|select/i;
2182
2183function getVal( elem ) {
2184	var type = elem.type, val = elem.value;
2185
2186	if ( type === "radio" || type === "checkbox" ) {
2187		val = elem.checked;
2188
2189	} else if ( type === "select-multiple" ) {
2190		val = elem.selectedIndex > -1 ?
2191			jQuery.map( elem.options, function( elem ) {
2192				return elem.selected;
2193			}).join("-") :
2194			"";
2195
2196	} else if ( elem.nodeName.toLowerCase() === "select" ) {
2197		val = elem.selectedIndex;
2198	}
2199
2200	return val;
2201}
2202
2203function testChange( e ) {
2204		var elem = e.target, data, val;
2205
2206		if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
2207			return;
2208		}
2209
2210		data = jQuery.data( elem, "_change_data" );
2211		val = getVal(elem);
2212
2213		// the current data will be also retrieved by beforeactivate
2214		if ( e.type !== "focusout" || elem.type !== "radio" ) {
2215			jQuery.data( elem, "_change_data", val );
2216		}
2217		
2218		if ( data === undefined || val === data ) {
2219			return;
2220		}
2221
2222		if ( data != null || val ) {
2223			e.type = "change";
2224			return jQuery.event.trigger( e, arguments[1], elem );
2225		}
2226}
2227
2228jQuery.event.special.change = {
2229	filters: {
2230		focusout: testChange, 
2231
2232		click: function( e ) {
2233			var elem = e.target, type = elem.type;
2234
2235			if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
2236				return testChange.call( this, e );
2237			}
2238		},
2239
2240		// Change has to be called before submit
2241		// Keydown will be called before keypress, which is used in submit-event delegation
2242		keydown: function( e ) {
2243			var elem = e.target, type = elem.type;
2244
2245			if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
2246				(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
2247				type === "select-multiple" ) {
2248				return testChange.call( this, e );
2249			}
2250		},
2251
2252		// Beforeactivate happens also before the previous element is blurred
2253		// with this event you can't trigger a change event, but you can store
2254		// information/focus[in] is not needed anymore
2255		beforeactivate: function( e ) {
2256			var elem = e.target;
2257
2258			if ( elem.nodeName.toLowerCase() === "input" && elem.type === "radio" ) {
2259				jQuery.data( elem, "_change_data", getVal(elem) );
2260			}
2261		}
2262	},
2263	setup: function( data, namespaces, fn ) {
2264		for ( var type in changeFilters ) {
2265			jQuery.event.add( this, type + ".specialChange." + fn.guid, changeFilters[type] );
2266		}
2267
2268		return formElems.test( this.nodeName );
2269	},
2270	remove: function( namespaces, fn ) {
2271		for ( var type in changeFilters ) {
2272			jQuery.event.remove( this, type + ".specialChange" + (fn ? "."+fn.guid : ""), changeFilters[type] );
2273		}
2274
2275		return formElems.test( this.nodeName );
2276	}
2277};
2278
2279var changeFilters = jQuery.event.special.change.filters;
2280
2281}
2282
2283function trigger( type, elem, args ) {
2284	args[0].type = type;
2285	return jQuery.event.handle.apply( elem, args );
2286}
2287
2288// Create "bubbling" focus and blur events
2289if ( document.addEventListener ) {
2290	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
2291		jQuery.event.special[ fix ] = {
2292			setup: function() {
2293				this.addEventListener( orig, handler, true );
2294			}, 
2295			teardown: function() { 
2296				this.removeEventListener( orig, handler, true );
2297			}
2298		};
2299
2300		function handler( e ) { 
2301			e = jQuery.event.fix( e );
2302			e.type = fix;
2303			return jQuery.event.handle.call( this, e );
2304		}
2305	});
2306}
2307
2308jQuery.each(["bind", "one"], function( i, name ) {
2309	jQuery.fn[ name ] = function( type, data, fn ) {
2310		// Handle object literals
2311		if ( typeof type === "object" ) {
2312			for ( var key in type ) {
2313				this[ name ](key, data, type[key], fn);
2314			}
2315			return this;
2316		}
2317		
2318		if ( jQuery.isFunction( data ) ) {
2319			fn = data;
2320			data = undefined;
2321		}
2322
2323		var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
2324			jQuery( this ).unbind( event, handler );
2325			return fn.apply( this, arguments );
2326		}) : fn;
2327
2328		return type === "unload" && name !== "one" ?
2329			this.one( type, data, fn ) :
2330			this.each(function() {
2331				jQuery.event.add( this, type, handler, data );
2332			});
2333	};
2334});
2335
2336jQuery.fn.extend({
2337	unbind: function( type, fn ) {
2338		// Handle object literals
2339		if ( typeof type === "object" && !type.preventDefault ) {
2340			for ( var key in type ) {
2341				this.unbind(key, type[key]);
2342			}
2343			return this;
2344		}
2345
2346		return this.each(function() {
2347			jQuery.event.remove( this, type, fn );
2348		});
2349	},
2350	trigger: function( type, data ) {
2351		return this.each(function() {
2352			jQuery.event.trigger( type, data, this );
2353		});
2354	},
2355
2356	triggerHandler: function( type, data ) {
2357		if ( this[0] ) {
2358			var event = jQuery.Event( type );
2359			event.preventDefault();
2360			event.stopPropagation();
2361			jQuery.event.trigger( event, data, this[0] );
2362			return event.result;
2363		}
2364	},
2365
2366	toggle: function( fn ) {
2367		// Save reference to arguments for access in closure
2368		var args = arguments, i = 1;
2369
2370		// link all the functions, so any of them can unbind this click handler
2371		while ( i < args.length ) {
2372			jQuery.proxy( fn, args[ i++ ] );
2373		}
2374
2375		return this.click( jQuery.proxy( fn, function( event ) {
2376			// Figure out which function to execute
2377			var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
2378			jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
2379
2380			// Make sure that clicks stop
2381			event.preventDefault();
2382
2383			// and execute the function
2384			return args[ lastToggle ].apply( this, arguments ) || false;
2385		}));
2386	},
2387
2388	hover: function( fnOver, fnOut ) {
2389		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
2390	}
2391});
2392
2393jQuery.each(["live", "die"], function( i, name ) {
2394	jQuery.fn[ name ] = function( types, data, fn ) {
2395		var type, i = 0;
2396
2397		if ( jQuery.isFunction( data ) ) {
2398			fn = data;
2399			data = undefined;
2400		}
2401
2402		types = (types || "").split( /\s+/ );
2403
2404		while ( (type = types[ i++ ]) != null ) {
2405			type = type === "focus" ? "focusin" : // focus --> focusin
2406					type === "blur" ? "focusout" : // blur --> focusout
2407					type === "hover" ? types.push("mouseleave") && "mouseenter" : // hover support
2408					type;
2409			
2410			if ( name === "live" ) {
2411				// bind live handler
2412				jQuery( this.context ).bind( liveConvert( type, this.selector ), {
2413					data: data, selector: this.selector, live: type
2414				}, fn );
2415
2416			} else {
2417				// unbind live handler
2418				jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null );
2419			}
2420		}
2421		
2422		return this;
2423	}
2424});
2425
2426function liveHandler( event ) {
2427	var stop, elems = [], selectors = [], args = arguments,
2428		related, match, fn, elem, j, i, l, data,
2429		live = jQuery.extend({}, jQuery.data( this, "events" ).live);
2430
2431	// Make sure we avoid non-left-click bubbling in Firefox (#3861)
2432	if ( event.button && event.type === "click" ) {
2433		return;
2434	}
2435
2436	for ( j in live ) {
2437		fn = live[j];
2438		if ( fn.live === event.type ||
2439				fn.altLive && jQuery.inArray(event.type, fn.altLive) > -1 ) {
2440
2441			data = fn.data;
2442			if ( !(data.beforeFilter && data.beforeFilter[event.type] && 
2443					!data.beforeFilter[event.type](event)) ) {
2444				selectors.push( fn.selector );
2445			}
2446		} else {
2447			delete live[j];
2448		}
2449	}
2450
2451	match = jQuery( event.target ).closest( selectors, event.currentTarget );
2452
2453	for ( i = 0, l = match.length; i < l; i++ ) {
2454		for ( j in live ) {
2455			fn = live[j];
2456			elem = match[i].elem;
2457			related = null;
2458
2459			if ( match[i].selector === fn.selector ) {
2460				// Those two events require additional checking
2461				if ( fn.live === "mouseenter" || fn.live === "mouseleave" ) {
2462					related = jQuery( event.relatedTarget ).closest( fn.selector )[0];
2463				}
2464
2465				if ( !related || related !== elem ) {
2466					elems.push({ elem: elem, fn: fn });
2467				}
2468			}
2469		}
2470	}
2471
2472	for ( i = 0, l = elems.length; i < l; i++ ) {
2473		match = elems[i];
2474		event.currentTarget = match.elem;
2475		event.data = match.fn.data;
2476		if ( match.fn.apply( match.elem, args ) === false ) {
2477			stop = false;
2478			break;
2479		}
2480	}
2481
2482	return stop;
2483}
2484
2485function liveConvert( type, selector ) {
2486	return "live." + (type ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
2487}
2488
2489jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
2490	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
2491	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
2492
2493	// Handle event binding
2494	jQuery.fn[ name ] = function( fn ) {
2495		return fn ? this.bind( name, fn ) : this.trigger( name );
2496	};
2497
2498	if ( jQuery.attrFn ) {
2499		jQuery.attrFn[ name ] = true;
2500	}
2501});
2502
2503// Prevent memory leaks in IE
2504// Window isn't included so as not to unbind existing unload events
2505// More info:
2506//  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
2507if ( window.attachEvent && !window.addEventListener ) {
2508	window.attachEvent("onunload", function() {
2509		for ( var id in jQuery.cache ) {
2510			if ( jQuery.cache[ id ].handle ) {
2511				// Try/Catch is to handle iframes being unloaded, see #4280
2512				try {
2513					jQuery.event.remove( jQuery.cache[ id ].handle.elem );
2514				} catch(e) {}
2515			}
2516		}
2517	});
2518}
2519/*!
2520 * Sizzle CSS Selector Engine - v1.0
2521 *  Copyright 2009, The Dojo Foundation
2522 *  Released under the MIT, BSD, and GPL Licenses.
2523 *  More information: http://sizzlejs.com/
2524 */
2525(function(){
2526
2527var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
2528	done = 0,
2529	toString = Object.prototype.toString,
2530	hasDuplicate = false,
2531	baseHasDuplicate = true;
2532
2533// Here we check if the JavaScript engine is using some sort of
2534// optimization where it does not always call our comparision
2535// function. If that is the case, discard the hasDuplicate value.
2536//   Thus far that includes Google Chrome.
2537[0, 0].sort(function(){
2538	baseHasDuplicate = false;
2539	return 0;
2540});
2541
2542var Sizzle = function(selector, context, results, seed) {
2543	results = results || [];
2544	var origContext = context = context || document;
2545
2546	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
2547		return [];
2548	}
2549	
2550	if ( !selector || typeof selector !== "string" ) {
2551		return results;
2552	}
2553
2554	var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
2555		soFar = selector;
2556	
2557	// Reset the position of the chunker regexp (start from head)
2558	while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
2559		soFar = m[3];
2560		
2561		parts.push( m[1] );
2562		
2563		if ( m[2] ) {
2564			extra = m[3];
2565			break;
2566		}
2567	}
2568
2569	if ( parts.length > 1 && origPOS.exec( selector ) ) {
2570		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
2571			set = posProcess( parts[0] + parts[1], context );
2572		} else {
2573			set = Expr.relative[ parts[0] ] ?
2574				[ context ] :
2575				Sizzle( parts.shift(), context );
2576
2577			while ( parts.length ) {
2578				selector = parts.shift();
2579
2580				if ( Expr.relative[ selector ] ) {
2581					selector += parts.shift();
2582				}
2583				
2584				set = posProcess( selector, set );
2585			}
2586		}
2587	} else {
2588		// Take a shortcut and set the context if the root selector is an ID
2589		// (but not if it'll be faster if the inner selector is an ID)
2590		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
2591				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
2592			var ret = Sizzle.find( parts.shift(), context, contextXML );
2593			context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
2594		}
2595
2596		if ( context ) {
2597			var ret = seed ?
2598				{ expr: parts.pop(), set: makeArray(seed) } :
2599				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
2600			set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
2601
2602			if ( parts.length > 0 ) {
2603				checkSet = makeArray(set);
2604			} else {
2605				prune = false;
2606			}
2607
2608			while ( parts.length ) {
2609				var cur = parts.pop(), pop = cur;
2610
2611				if ( !Expr.relative[ cur ] ) {
2612					cur = "";
2613				} else {
2614					pop = parts.pop();
2615				}
2616
2617				if ( pop == null ) {
2618					pop = context;
2619				}
2620
2621				Expr.relative[ cur ]( checkSet, pop, contextXML );
2622			}
2623		} else {
2624			checkSet = parts = [];
2625		}
2626	}
2627
2628	if ( !checkSet ) {
2629		checkSet = set;
2630	}
2631
2632	if ( !checkSet ) {
2633		Sizzle.error( cur || selector );
2634	}
2635
2636	if ( toString.call(checkSet) === "[object Array]" ) {
2637		if ( !prune ) {
2638			results.push.apply( results, checkSet );
2639		} else if ( context && context.nodeType === 1 ) {
2640			for ( var i = 0; checkSet[i] != null; i++ ) {
2641				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
2642					results.push( set[i] );
2643				}
2644			}
2645		} else {
2646			for ( var i = 0; checkSet[i] != null; i++ ) {
2647				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
2648					results.push( set[i] );
2649				}
2650			}
2651		}
2652	} else {
2653		makeArray( checkSet, results );
2654	}
2655
2656	if ( extra ) {
2657		Sizzle( extra, origContext, results, seed );
2658		Sizzle.uniqueSort( results );
2659	}
2660
2661	return results;
2662};
2663
2664Sizzle.uniqueSort = function(results){
2665	if ( sortOrder ) {
2666		hasDuplicate = baseHasDuplicate;
2667		results.sort(sortOrder);
2668
2669		if ( hasDuplicate ) {
2670			for ( var i = 1; i < results.length; i++ ) {
2671				if ( results[i] === results[i-1] ) {
2672					results.splice(i--, 1);
2673				}
2674			}
2675		}
2676	}
2677
2678	return results;
2679};
2680
2681Sizzle.matches = function(expr, set){
2682	return Sizzle(expr, null, null, set);
2683};
2684
2685Sizzle.find = function(expr, context, isXML){
2686	var set, match;
2687
2688	if ( !expr ) {
2689		return [];
2690	}
2691
2692	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
2693		var type = Expr.order[i], match;
2694		
2695		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
2696			var left = match[1];
2697			match.splice(1,1);
2698
2699			if ( left.substr( left.length - 1 ) !== "\\" ) {
2700				match[1] = (match[1] || "").replace(/\\/g, "");
2701				set = Expr.find[ type ]( match, context, isXML );
2702				if ( set != null ) {
2703					expr = expr.replace( Expr.match[ type ], "" );
2704					break;
2705				}
2706			}
2707		}
2708	}
2709
2710	if ( !set ) {
2711		set = context.getElementsByTagName("*");
2712	}
2713
2714	return {set: set, expr: expr};
2715};
2716
2717Sizzle.filter = function(expr, set, inplace, not){
2718	var old = expr, result = [], curLoop = set, match, anyFound,
2719		isXMLFilter = set && set[0] && isXML(set[0]);
2720
2721	while ( expr && set.length ) {
2722		for ( var type in Expr.filter ) {
2723			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
2724				var filter = Expr.filter[ type ], found, item, left = match[1];
2725				anyFound = false;
2726
2727				match.splice(1,1);
2728
2729				if ( left.substr( left.length - 1 ) === "\\" ) {
2730					continue;
2731				}
2732
2733				if ( curLoop === result ) {
2734					result = [];
2735				}
2736
2737				if ( Expr.preFilter[ type ] ) {
2738					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
2739
2740					if ( !match ) {
2741						anyFound = found = true;
2742					} else if ( match === true ) {
2743						continue;
2744					}
2745				}
2746
2747				if ( match ) {
2748					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
2749						if ( item ) {
2750							found = filter( item, match, i, curLoop );
2751							var pass = not ^ !!found;
2752
2753							if ( inplace && found != null ) {
2754								if ( pass ) {
2755									anyFound = true;
2756								} else {
2757									curLoop[i] = false;
2758								}
2759							} else if ( pass ) {
2760								result.push( item );
2761								anyFound = true;
2762							}
2763						}
2764					}
2765				}
2766
2767				if ( found !== undefined ) {
2768					if ( !inplace ) {
2769						curLoop = result;
2770					}
2771
2772					expr = expr.replace( Expr.match[ type ], "" );
2773
2774					if ( !anyFound ) {
2775						return [];
2776					}
2777
2778					break;
2779				}
2780			}
2781		}
2782
2783		// Improper expression
2784		if ( expr === old ) {
2785			if ( anyFound == null ) {
2786				Sizzle.error( expr );
2787			} else {
2788				break;
2789			}
2790		}
2791
2792		old = expr;
2793	}
2794
2795	return curLoop;
2796};
2797
2798Sizzle.error = function( msg ) {
2799	throw "Syntax error, unrecognized expression: " + msg;
2800};
2801
2802var Expr = Sizzle.selectors = {
2803	order: [ "ID", "NAME", "TAG" ],
2804	match: {
2805		ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2806		CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
2807		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
2808		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
2809		TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
2810		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
2811		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
2812		PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
2813	},
2814	leftMatch: {},
2815	attrMap: {
2816		"class": "className",
2817		"for": "htmlFor"
2818	},
2819	attrHandle: {
2820		href: function(elem){
2821			return elem.getAttribute("href");
2822		}
2823	},
2824	relative: {
2825		"+": function(checkSet, part){
2826			var isPartStr = typeof part === "string",
2827				isTag = isPartStr && !/\W/.test(part),
2828				isPartStrNotTag = isPartStr && !isTag;
2829
2830			if ( isTag ) {
2831				part = part.toLowerCase();
2832			}
2833
2834			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
2835				if ( (elem = checkSet[i]) ) {
2836					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
2837
2838					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
2839						elem || false :
2840						elem === part;
2841				}
2842			}
2843
2844			if ( isPartStrNotTag ) {
2845				Sizzle.filter( part, checkSet, true );
2846			}
2847		},
2848		">": function(checkSet, part){
2849			var isPartStr = typeof part === "string";
2850
2851			if ( isPartStr && !/\W/.test(part) ) {
2852				part = part.toLowerCase();
2853
2854				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2855					var elem = checkSet[i];
2856					if ( elem ) {
2857						var parent = elem.parentNode;
2858						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
2859					}
2860				}
2861			} else {
2862				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
2863					var elem = checkSet[i];
2864					if ( elem ) {
2865						checkSet[i] = isPartStr ?
2866							elem.parentNode :
2867							elem.parentNode === part;
2868					}
2869				}
2870
2871				if ( isPartStr ) {
2872					Sizzle.filter( part, checkSet, true );
2873				}
2874			}
2875		},
2876		"": function(checkSet, part, isXML){
2877			var doneName = done++, checkFn = dirCheck;
2878
2879			if ( typeof part === "string" && !/\W/.test(part) ) {
2880				var nodeCheck = part = part.toLowerCase();
2881				checkFn = dirNodeCheck;
2882			}
2883
2884			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
2885		},
2886		"~": function(checkSet, part, isXML){
2887			var doneName = done++, checkFn = dirCheck;
2888
2889			if ( typeof part === "string" && !/\W/.test(part) ) {
2890				var nodeCheck = part = part.toLowerCase();
2891				checkFn = dirNodeCheck;
2892			}
2893
2894			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
2895		}
2896	},
2897	find: {
2898		ID: function(match, context, isXML){
2899			if ( typeof context.getElementById !== "undefined" && !isXML ) {
2900				var m = context.getElementById(match[1]);
2901				return m ? [m] : [];
2902			}
2903		},
2904		NAME: function(match, context){
2905			if ( typeof context.getElementsByName !== "undefined" ) {
2906				var ret = [], results = context.getElementsByName(match[1]);
2907
2908				for ( var i = 0, l = results.length; i < l; i++ ) {
2909					if ( results[i].getAttribute("name") === match[1] ) {
2910						ret.push( results[i] );
2911					}
2912				}
2913
2914				return ret.length === 0 ? null : ret;
2915			}
2916		},
2917		TAG: function(match, context){
2918			return context.getElementsByTagName(match[1]);
2919		}
2920	},
2921	preFilter: {
2922		CLASS: function(match, curLoop, inplace, result, not, isXML){
2923			match = " " + match[1].replace(/\\/g, "") + " ";
2924
2925			if ( isXML ) {
2926				return match;
2927			}
2928
2929			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
2930				if ( elem ) {
2931					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
2932						if ( !inplace ) {
2933							result.push( elem );
2934						}
2935					} else if ( inplace ) {
2936						curLoop[i] = false;
2937					}
2938				}
2939			}
2940
2941			return false;
2942		},
2943		ID: function(match){
2944			return match[1].replace(/\\/g, "");
2945		},
2946		TAG: function(match, curLoop){
2947			return match[1].toLowerCase();
2948		},
2949		CHILD: function(match){
2950			if ( match[1] === "nth" ) {
2951				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
2952				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
2953					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
2954					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
2955
2956				// calculate the numbers (first)n+(last) including if they are negative
2957				match[2] = (test[1] + (test[2] || 1)) - 0;
2958				match[3] = test[3] - 0;
2959			}
2960
2961			// TODO: Move to normal caching system
2962			match[0] = done++;
2963
2964			return match;
2965		},
2966		ATTR: function(match, curLoop, inplace, result, not, isXML){
2967			var name = match[1].replace(/\\/g, "");
2968			
2969			if ( !isXML && Expr.attrMap[name] ) {
2970				match[1] = Expr.attrMap[name];
2971			}
2972
2973			if ( match[2] === "~=" ) {
2974				match[4] = " " + match[4] + " ";
2975			}
2976
2977			return match;
2978		},
2979		PSEUDO: function(match, curLoop, inplace, result, not){
2980			if ( match[1] === "not" ) {
2981				// If we're dealing with a complex expression, or a simple one
2982				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
2983					match[3] = Sizzle(match[3], null, null, curLoop);
2984				} else {
2985					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
2986					if ( !inplace ) {
2987						result.push.apply( result, ret );
2988					}
2989					return false;
2990				}
2991			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
2992				return true;
2993			}
2994			
2995			return match;
2996		},
2997		POS: function(match){
2998			match.unshift( true );
2999			return match;
3000		}
3001	},
3002	filters: {
3003		enabled: function(elem){
3004			return elem.disabled === false && elem.type !== "hidden";
3005		},
3006		disabled: function(elem){
3007			return elem.disabled === true;
3008		},
3009		checked: function(elem){
3010			return elem.checked === true;
3011		},
3012		selected: function(elem){
3013			// Accessing this property makes selected-by-default
3014			// options in Safari work properly
3015			elem.parentNode.selectedIndex;
3016			return elem.selected === true;
3017		},
3018		parent: function(elem){
3019			return !!elem.firstChild;
3020		},
3021		empty: function(elem){
3022			return !elem.firstChild;
3023		},
3024		has: function(elem, i, match){
3025			return !!Sizzle( match[3], elem ).length;
3026		},
3027		header: function(elem){
3028			return /h\d/i.test( elem.nodeName );
3029		},
3030		text: function(elem){
3031			return "text" === elem.type;
3032		},
3033		radio: function(elem){
3034			return "radio" === elem.type;
3035		},
3036		checkbox: function(elem){
3037			return "checkbox" === elem.type;
3038		},
3039		file: function(elem){
3040			return "file" === elem.type;
3041		},
3042		password: function(elem){
3043			return "password" === elem.type;
3044		},
3045		submit: function(elem){
3046			return "submit" === elem.type;
3047		},
3048		image: function(elem){
3049			return "image" === elem.type;
3050		},
3051		reset: function(elem){
3052			return "reset" === elem.type;
3053		},
3054		button: function(elem){
3055			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
3056		},
3057		input: function(elem){
3058			return /input|select|textarea|button/i.test(elem.nodeName);
3059		}
3060	},
3061	setFilters: {
3062		first: function(elem, i){
3063			return i === 0;
3064		},
3065		last: function(elem, i, match, array){
3066			return i === array.length - 1;
3067		},
3068		even: function(elem, i){
3069			return i % 2 === 0;
3070		},
3071		odd: function(elem, i){
3072			return i % 2 === 1;
3073		},
3074		lt: function(elem, i, match){
3075			return i < match[3] - 0;
3076		},
3077		gt: function(elem, i, match){
3078			return i > match[3] - 0;
3079		},
3080		nth: function(elem, i, match){
3081			return match[3] - 0 === i;
3082		},
3083		eq: function(elem, i, match){
3084			return match[3] - 0 === i;
3085		}
3086	},
3087	filter: {
3088		PSEUDO: function(elem, match, i, array){
3089			var name = match[1], filter = Expr.filters[ name ];
3090
3091			if ( filter ) {
3092				return filter( elem, i, match, array );
3093			} else if ( name === "contains" ) {
3094				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
3095			} else if ( name === "not" ) {
3096				var not = match[3];
3097
3098				for ( var i = 0, l = not.length; i < l; i++ ) {
3099					if ( not[i] === elem ) {
3100						return false;
3101					}
3102				}
3103
3104				return true;
3105			} else {
3106				Sizzle.error( "Syntax error, unrecognized expression: " + name );
3107			}
3108		},
3109		CHILD: function(elem, match){
3110			var type = match[1], node = elem;
3111			switch (type) {
3112				case 'only':
3113				case 'first':
3114					while ( (node = node.previousSibling) )	 {
3115						if ( node.nodeType === 1 ) { 
3116							return false; 
3117						}
3118					}
3119					if ( type === "first" ) { 
3120						return true; 
3121					}
3122					node = elem;
3123				case 'last':
3124					while ( (node = node.nextSibling) )	 {
3125						if ( node.nodeType === 1 ) { 
3126							return false; 
3127						}
3128					}
3129					return true;
3130				case 'nth':
3131					var first = match[2], last = match[3];
3132
3133					if ( first === 1 && last === 0 ) {
3134						return true;
3135					}
3136					
3137					var doneName = match[0],
3138						parent = elem.parentNode;
3139	
3140					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
3141						var count = 0;
3142						for ( node = parent.firstChild; node; node = node.nextSibling ) {
3143							if ( node.nodeType === 1 ) {
3144								node.nodeIndex = ++count;
3145							}
3146						} 
3147						parent.sizcache = doneName;
3148					}
3149					
3150					var diff = elem.nodeIndex - last;
3151					if ( first === 0 ) {
3152						return diff === 0;
3153					} else {
3154						return ( diff % first === 0 && diff / first >= 0 );
3155					}
3156			}
3157		},
3158		ID: function(elem, match){
3159			return elem.nodeType === 1 && elem.getAttribute("id") === match;
3160		},
3161		TAG: function(elem, match){
3162			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
3163		},
3164		CLASS: function(elem, match){
3165			return (" " + (elem.className || elem.getAttribute("class")) + " ")
3166				.indexOf( match ) > -1;
3167		},
3168		ATTR: function(elem, match){
3169			var name = match[1],
3170				result = Expr.attrHandle[ name ] ?
3171					Expr.attrHandle[ name ]( elem ) :
3172					elem[ name ] != null ?
3173						elem[ name ] :
3174						elem.getAttribute( name ),
3175				value = result + "",
3176				type = match[2],
3177				check = match[4];
3178
3179			return result == null ?
3180				type === "!=" :
3181				type === "=" ?
3182				value === check :
3183				type === "*=" ?
3184				value.indexOf(check) >= 0 :
3185				type === "~=" ?
3186				(" " + value + " ").indexOf(check) >= 0 :
3187				!check ?
3188				value && result !== false :
3189				type === "!=" ?
3190				value !== check :
3191				type === "^=" ?
3192				value.indexOf(check) === 0 :
3193				type === "$=" ?
3194				value.substr(value.length - check.length) === check :
3195				type === "|=" ?
3196				value === check || value.substr(0, check.length + 1) === check + "-" :
3197				false;
3198		},
3199		POS: function(elem, match, i, array){
3200			var name = match[2], filter = Expr.setFilters[ name ];
3201
3202			if ( filter ) {
3203				return filter( elem, i, match, array );
3204			}
3205		}
3206	}
3207};
3208
3209var origPOS = Expr.match.POS;
3210
3211for ( var type in Expr.match ) {
3212	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
3213	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
3214		return "\\" + (num - 0 + 1);
3215	}));
3216}
3217
3218var makeArray = function(array, results) {
3219	array = Array.prototype.slice.call( array, 0 );
3220
3221	if ( results ) {
3222		results.push.apply( results, array );
3223		return results;
3224	}
3225	
3226	return array;
3227};
3228
3229// Perform a simple check to determine if the browser is capable of
3230// converting a NodeList to an array using builtin methods.
3231try {
3232	Array.prototype.slice.call( document.documentElement.childNodes, 0 );
3233
3234// Provide a fallback method if it does not work
3235} catch(e){
3236	makeArray = function(array, results) {
3237		var ret = results || [];
3238
3239		if ( toString.call(array) === "[object Array]" ) {
3240			Array.prototype.push.apply( ret, array );
3241		} else {
3242			if ( typeof array.length === "number" ) {
3243				for ( var i = 0, l = array.length; i < l; i++ ) {
3244					ret.push( array[i] );
3245				}
3246			} else {
3247				for ( var i = 0; array[i]; i++ ) {
3248					ret.push( array[i] );
3249				}
3250			}
3251		}
3252
3253		return ret;
3254	};
3255}
3256
3257var sortOrder;
3258
3259if ( document.documentElement.compareDocumentPosition ) {
3260	sortOrder = function( a, b ) {
3261		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
3262			if ( a == b ) {
3263				hasDuplicate = true;
3264			}
3265			return a.compareDocumentPosition ? -1 : 1;
3266		}
3267
3268		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
3269		if ( ret === 0 ) {
3270			hasDuplicate = true;
3271		}
3272		return ret;
3273	};
3274} else if ( "sourceIndex" in document.documentElement ) {
3275	sortOrder = function( a, b ) {
3276		if ( !a.sourceIndex || !b.sourceIndex ) {
3277			if ( a == b ) {
3278				hasDuplicate = true;
3279			}
3280			return a.sourceIndex ? -1 : 1;
3281		}
3282
3283		var ret = a.sourceIndex - b.sourceIndex;
3284		if ( ret === 0 ) {
3285			hasDuplicate = true;
3286		}
3287		return ret;
3288	};
3289} else if ( document.createRange ) {
3290	sortOrder = function( a, b ) {
3291		if ( !a.ownerDocument || !b.ownerDocument ) {
3292			if ( a == b ) {
3293				hasDuplicate = true;
3294			}
3295			return a.ownerDocument ? -1 : 1;
3296		}
3297
3298		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
3299		aRange.setStart(a, 0);
3300		aRange.setEnd(a, 0);
3301		bRange.setStart(b, 0);
3302		bRange.setEnd(b, 0);
3303		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
3304		if ( ret === 0 ) {
3305			hasDuplicate = true;
3306		}
3307		return ret;
3308	};
3309}
3310
3311// Utility function for retreiving the text value of an array of DOM nodes
3312function getText( elems ) {
3313	var ret = "", elem;
3314
3315	for ( var i = 0; elems[i]; i++ ) {
3316		elem = elems[i];
3317
3318		// Get the text from text nodes and CDATA nodes
3319		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
3320			ret += elem.nodeValue;
3321
3322		// Traverse everything else, except comment nodes
3323		} else if ( elem.nodeType !== 8 ) {
3324			ret += getText( elem.childNodes );
3325		}
3326	}
3327
3328	return ret;
3329}
3330
3331// Check to see if the browser returns elements by name when
3332// querying by getElementById (and provide a workaround)
3333(function(){
3334	// We're going to inject a fake input element with a specified name
3335	var form = document.createElement("div"),
3336		id = "script" + (new Date).getTime();
3337	form.innerHTML = "<a name='" + id + "'/>";
3338
3339	// Inject it into the root element, check its status, and remove it quickly
3340	var root = document.documentElement;
3341	root.insertBefore( form, root.firstChild );
3342
3343	// The workaround has to do additional checks after a getElementById
3344	// Which slows things down for other browsers (hence the branching)
3345	if ( document.getElementById( id ) ) {
3346		Expr.find.ID = function(match, context, isXML){
3347			if ( typeof context.getElementById !== "undefined" && !isXML ) {
3348				var m = context.getElementById(match[1]);
3349				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
3350			}
3351		};
3352
3353		Expr.filter.ID = function(elem, match){
3354			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
3355			return elem.nodeType === 1 && node && node.nodeValue === match;
3356		};
3357	}
3358
3359	root.removeChild( form );
3360	root = form = null; // release memory in IE
3361})();
3362
3363(function(){
3364	// Check to see if the browser returns only elements
3365	// when doing getElementsByTagName("*")
3366
3367	// Create a fake element
3368	var div = document.createElement("div");
3369	div.appendChild( document.createComment("") );
3370
3371	// Make sure no comments are found
3372	if ( div.getElementsByTagName("*").length > 0 ) {
3373		Expr.find.TAG = function(match, context){
3374			var results = context.getElementsByTagName(match[1]);
3375
3376			// Filter out possible comments
3377			if ( match[1] === "*" ) {
3378				var tmp = [];
3379
3380				for ( var i = 0; results[i]; i++ ) {
3381					if ( results[i].nodeType === 1 ) {
3382						tmp.push( results[i] );
3383					}
3384				}
3385
3386				results = tmp;
3387			}
3388
3389			return results;
3390		};
3391	}
3392
3393	// Check to see if an attribute returns normalized href attributes
3394	div.innerHTML = "<a href='#'></a>";
3395	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
3396			div.firstChild.getAttribute("href") !== "#" ) {
3397		Expr.attrHandle.href = function(elem){
3398			return elem.getAttribute("href", 2);
3399		};
3400	}
3401
3402	div = null; // release memory in IE
3403})();
3404
3405if ( document.querySelectorAll ) {
3406	(function(){
3407		var oldSizzle = Sizzle, div = document.createElement("div");
3408		div.innerHTML = "<p class='TEST'></p>";
3409
3410		// Safari can't handle uppercase or unicode characters when
3411		// in quirks mode.
3412		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
3413			return;
3414		}
3415	
3416		Sizzle = function(query, context, extra, seed){
3417			context = context || document;
3418
3419			// Only use querySelectorAll on non-XML documents
3420			// (ID selectors don't work in non-HTML documents)
3421			if ( !seed && context.nodeType === 9 && !isXML(context) ) {
3422				try {
3423					return makeArray( context.querySelectorAll(query), extra );
3424				} catch(e){}
3425			}
3426		
3427			return oldSizzle(query, context, extra, seed);
3428		};
3429
3430		for ( var prop in oldSizzle ) {
3431			Sizzle[ prop ] = oldSizzle[ prop ];
3432		}
3433
3434		div = null; // release memory in IE
3435	})();
3436}
3437
3438(function(){
3439	var div = document.createElement("div");
3440
3441	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
3442
3443	// Opera can't find a second classname (in 9.6)
3444	// Also, make sure that getElementsByClassName actually exists
3445	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
3446		return;
3447	}
3448
3449	// Safari caches class attributes, doesn't catch changes (in 3.2)
3450	div.lastChild.className = "e";
3451
3452	if ( div.getElementsByClassName("e").length === 1 ) {
3453		return;
3454	}
3455	
3456	Expr.order.splice(1, 0, "CLASS");
3457	Expr.find.CLASS = function(match, context, isXML) {
3458		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
3459			return context.getElementsByClassName(match[1]);
3460		}
3461	};
3462
3463	div = null; // release memory in IE
3464})();
3465
3466function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3467	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3468		var elem = checkSet[i];
3469		if ( elem ) {
3470			elem = elem[dir];
3471			var match = false;
3472
3473			while ( elem ) {
3474				if ( elem.sizcache === doneName ) {
3475					match = checkSet[elem.sizset];
3476					break;
3477				}
3478
3479				if ( elem.nodeType === 1 && !isXML ){
3480					elem.sizcache = doneName;
3481					elem.sizset = i;
3482				}
3483
3484				if ( elem.nodeName.toLowerCase() === cur ) {
3485					match = elem;
3486					break;
3487				}
3488
3489				elem = elem[dir];
3490			}
3491
3492			checkSet[i] = match;
3493		}
3494	}
3495}
3496
3497function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
3498	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
3499		var elem = checkSet[i];
3500		if ( elem ) {
3501			elem = elem[dir];
3502			var match = false;
3503
3504			while ( elem ) {
3505				if ( elem.sizcache === doneName ) {
3506					match = checkSet[elem.sizset];
3507					break;
3508				}
3509
3510				if ( elem.nodeType === 1 ) {
3511					if ( !isXML ) {
3512						elem.sizcache = doneName;
3513						elem.sizset = i;
3514					}
3515					if ( typeof cur !== "string" ) {
3516						if ( elem === cur ) {
3517							match = true;
3518							break;
3519						}
3520
3521					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
3522						match = elem;
3523						break;
3524					}
3525				}
3526
3527				elem = elem[dir];
3528			}
3529
3530			checkSet[i] = match;
3531		}
3532	}
3533}
3534
3535var contains = document.compareDocumentPosition ? function(a, b){
3536	return a.compareDocumentPosition(b) & 16;
3537} : function(a, b){
3538	return a !== b && (a.contains ? a.contains(b) : true);
3539};
3540
3541var isXML = function(elem){
3542	// documentElement is verified for cases where it doesn't yet exist
3543	// (such as loading iframes in IE - #4833) 
3544	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
3545	return documentElement ? documentElement.nodeName !== "HTML" : false;
3546};
3547
3548var posProcess = function(selector, context){
3549	var tmpSet = [], later = "", match,
3550		root = context.nodeType ? [context] : context;
3551
3552	// Position selectors must be done after the filter
3553	// And so must :not(positional) so we move all PSEUDOs to the end
3554	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
3555		later += match[0];
3556		selector = selector.replace( Expr.match.PSEUDO, "" );
3557	}
3558
3559	selector = Expr.relative[selector] ? selector + "*" : selector;
3560
3561	for ( var i = 0, l = root.length; i < l; i++ ) {
3562		Sizzle( selector, root[i], tmpSet );
3563	}
3564
3565	return Sizzle.filter( later, tmpSet );
3566};
3567
3568// EXPOSE
3569jQuery.find = Sizzle;
3570jQuery.expr = Sizzle.selectors;
3571jQuery.expr[":"] = jQuery.expr.filters;
3572jQuery.unique = Sizzle.uniqueSort;
3573jQuery.getText = getText;
3574jQuery.isXMLDoc = isXML;
3575jQuery.contains = contains;
3576
3577return;
3578
3579window.Sizzle = Sizzle;
3580
3581})();
3582var runtil = /Until$/,
3583	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
3584	// Note: This RegExp should be improved, or likely pulled from Sizzle
3585	rmultiselector = /,/,
3586	slice = Array.prototype.slice;
3587
3588// Implement the identical functionality for filter and not
3589var winnow = function( elements, qualifier, keep ) {
3590	if ( jQuery.isFunction( qualifier ) ) {
3591		return jQuery.grep(elements, function( elem, i ) {
3592			return !!qualifier.call( elem, i, elem ) === keep;
3593		});
3594
3595	} else if ( qualifier.nodeType ) {
3596		return jQuery.grep(elements, function( elem, i ) {
3597			return (elem === qualifier) === keep;
3598		});
3599
3600	} else if ( typeof qualifier === "string" ) {
3601		var filtered = jQuery.grep(elements, function( elem ) {
3602			return elem.nodeType === 1;
3603		});
3604
3605		if ( isSimple.test( qualifier ) ) {
3606			return jQuery.filter(qualifier, filtered, !keep);
3607		} else {
3608			qualifier = jQuery.filter( qualifier, filtered );
3609		}
3610	}
3611
3612	return jQuery.grep(elements, function( elem, i ) {
3613		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
3614	});
3615};
3616
3617jQuery.fn.extend({
3618	find: function( selector ) {
3619		var ret = this.pushStack( "", "find", selector ), length = 0;
3620
3621		for ( var i = 0, l = this.length; i < l; i++ ) {
3622			length = ret.length;
3623			jQuery.find( selector, this[i], ret );
3624
3625			if ( i > 0 ) {
3626				// Make sure that the results are unique
3627				for ( var n = length; n < ret.length; n++ ) {
3628					for ( var r = 0; r < length; r++ ) {
3629						if ( ret[r] === ret[n] ) {
3630							ret.splice(n--, 1);
3631							break;
3632						}
3633					}
3634				}
3635			}
3636		}
3637
3638		return ret;
3639	},
3640
3641	has: function( target ) {
3642		var targets = jQuery( target );
3643		return this.filter(function() {
3644			for ( var i = 0, l = targets.length; i < l; i++ ) {
3645				if ( jQuery.contains( this, targets[i] ) ) {
3646					return true;
3647				}
3648			}
3649		});
3650	},
3651
3652	not: function( selector ) {
3653		return this.pushStack( winnow(this, selector, false), "not", selector);
3654	},
3655
3656	filter: function( selector ) {
3657		return this.pushStack( winnow(this, selector, true), "filter", selector );
3658	},
3659	
3660	is: function( selector ) {
3661		return !!selector && jQuery.filter( selector, this ).length > 0;
3662	},
3663
3664	closest: function( selectors, context ) {
3665		if ( jQuery.isArray( selectors ) ) {
3666			var ret = [], cur = this[0], match, matches = {}, selector;
3667
3668			if ( cur && selectors.length ) {
3669				for ( var i = 0, l = selectors.length; i < l; i++ ) {
3670					selector = selectors[i];
3671
3672					if ( !matches[selector] ) {
3673						matches[selector] = jQuery.expr.match.POS.test( selector ) ? 
3674							jQuery( selector, context || this.context ) :
3675							selector;
3676					}
3677				}
3678
3679				while ( cur && cur.ownerDocument && cur !== context ) {
3680					for ( selector in matches ) {
3681						match = matches[selector];
3682
3683						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
3684							ret.push({ selector: selector, elem: cur });
3685							delete matches[selector];
3686						}
3687					}
3688					cur = cur.parentNode;
3689				}
3690			}
3691
3692			return ret;
3693		}
3694
3695		var pos = jQuery.expr.match.POS.test( selectors ) ? 
3696			jQuery( selectors, context || this.context ) : null;
3697
3698		return this.map(function( i, cur ) {
3699			while ( cur && cur.ownerDocument && cur !== context ) {
3700				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
3701					return cur;
3702				}
3703				cur = cur.parentNode;
3704			}
3705			return null;
3706		});
3707	},
3708	
3709	// Determine the position of an element within
3710	// the matched set of elements
3711	index: function( elem ) {
3712		if ( !elem || typeof elem === "string" ) {
3713			return jQuery.inArray( this[0],
3714				// If it receives a string, the selector is used
3715				// If it receives nothing, the siblings are used
3716				elem ? jQuery( elem ) : this.parent().children() );
3717		}
3718		// Locate the position of the desired element
3719		return jQuery.inArray(
3720			// If it receives a jQuery object, the first element is used
3721			elem.jquery ? elem[0] : elem, this );
3722	},
3723
3724	add: function( selector, context ) {
3725		var set = typeof selector === "string" ?
3726				jQuery( selector, context || this.context ) :
3727				jQuery.makeArray( selector ),
3728			all = jQuery.merge( this.get(), set );
3729
3730		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
3731			all :
3732			jQuery.unique( all ) );
3733	},
3734
3735	andSelf: function() {
3736		return this.add( this.prevObject );
3737	}
3738});
3739
3740// A painfully simple check to see if an element is disconnected
3741// from a document (should be improved, where feasible).
3742function isDisconnected( node ) {
3743	return !node || !node.parentNode || node.parentNode.nodeType === 11;
3744}
3745
3746jQuery.each({
3747	parent: function( elem ) {
3748		var parent = elem.parentNode;
3749		return parent && parent.nodeType !== 11 ? parent : null;
3750	},
3751	parents: function( elem ) {
3752		return jQuery.dir( elem, "parentNode" );
3753	},
3754	parentsUntil: function( elem, i, until ) {
3755		return jQuery.dir( elem, "parentNode", until );
3756	},
3757	next: function( elem ) {
3758		return jQuery.nth( elem, 2, "nextSibling" );
3759	},
3760	prev: function( elem ) {
3761		return jQuery.nth( elem, 2, "previousSibling" );
3762	},
3763	nextAll: function( elem ) {
3764		return jQuery.dir( elem, "nextSibling" );
3765	},
3766	prevAll: function( elem ) {
3767		return jQuery.dir( elem, "previousSibling" );
3768	},
3769	nextUntil: function( elem, i, until ) {
3770		return jQuery.dir( elem, "nextSibling", until );
3771	},
3772	prevUntil: function( elem, i, until ) {
3773		return jQuery.dir( elem, "previousSibling", until );
3774	},
3775	siblings: function( elem ) {
3776		return jQuery.sibling( elem.parentNode.firstChild, elem );
3777	},
3778	children: function( elem ) {
3779		return jQuery.sibling( elem.firstChild );
3780	},
3781	contents: function( elem ) {
3782		return jQuery.nodeName( elem, "iframe" ) ?
3783			elem.contentDocument || elem.contentWindow.document :
3784			jQuery.makeArray( elem.childNodes );
3785	}
3786}, function( name, fn ) {
3787	jQuery.fn[ name ] = function( until, selector ) {
3788		var ret = jQuery.map( this, fn, until );
3789		
3790		if ( !runtil.test( name ) ) {
3791			selector = until;
3792		}
3793
3794		if ( selector && typeof selector === "string" ) {
3795			ret = jQuery.filter( selector, ret );
3796		}
3797
3798		ret = this.length > 1 ? jQuery.unique( ret ) : ret;
3799
3800		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
3801			ret = ret.reverse();
3802		}
3803
3804		return this.pushStack( ret, name, slice.call(arguments).join(",") );
3805	};
3806});
3807
3808jQuery.extend({
3809	filter: function( expr, elems, not ) {
3810		if ( not ) {
3811			expr = ":not(" + expr + ")";
3812		}
3813
3814		return jQuery.find.matches(expr, elems);
3815	},
3816	
3817	dir: function( elem, dir, until ) {
3818		var matched = [], cur = elem[dir];
3819		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
3820			if ( cur.nodeType === 1 ) {
3821				matched.push( cur );
3822			}
3823			cur = cur[dir];
3824		}
3825		return matched;
3826	},
3827
3828	nth: function( cur, result, dir, elem ) {
3829		result = result || 1;
3830		var num = 0;
3831
3832		for ( ; cur; cur = cur[dir] ) {
3833			if ( cur.nodeType === 1 && ++num === result ) {
3834				break;
3835			}
3836		}
3837
3838		return cur;
3839	},
3840
3841	sibling: function( n, elem ) {
3842		var r = [];
3843
3844		for ( ; n; n = n.nextSibling ) {
3845			if ( n.nodeType === 1 && n !== elem ) {
3846				r.push( n );
3847			}
3848		}
3849
3850		return r;
3851	}
3852});
3853var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
3854	rleadingWhitespace = /^\s+/,
3855	rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
3856	rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
3857	rtagName = /<([\w:]+)/,
3858	rtbody = /<tbody/i,
3859	rhtml = /<|&\w+;/,
3860	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
3861	fcloseTag = function( all, front, tag ) {
3862		return rselfClosing.test( tag ) ?
3863			all :
3864			front + "></" + tag + ">";
3865	},
3866	wrapMap = {
3867		option: [ 1, "<select multiple='multiple'>", "</select>" ],
3868		legend: [ 1, "<fieldset>", "</fieldset>" ],
3869		thead: [ 1, "<table>", "</table>" ],
3870		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
3871		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
3872		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
3873		area: [ 1, "<map>", "</map>" ],
3874		_default: [ 0, "", "" ]
3875	};
3876
3877wrapMap.optgroup = wrapMap.option;
3878wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
3879wrapMap.th = wrapMap.td;
3880
3881// IE can't serialize <link> and <script> tags normally
3882if ( !jQuery.support.htmlSerialize ) {
3883	wrapMap._default = [ 1, "div<div>", "</div>" ];
3884}
3885
3886jQuery.fn.extend({
3887	text: function( text ) {
3888		if ( jQuery.isFunction(text) ) {
3889			return this.each(function(i) {
3890				var self = jQuery(this);
3891				self.text( text.call(this, i, self.text()) );
3892			});
3893		}
3894
3895		if ( typeof text !== "object" && text !== undefined ) {
3896			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
3897		}
3898
3899		return jQuery.getText( this );
3900	},
3901
3902	wrapAll: function( html ) {
3903		if ( jQuery.isFunction( html ) ) {
3904			return this.each(function(i) {
3905				jQuery(this).wrapAll( html.call(this, i) );
3906			});
3907		}
3908
3909		if ( this[0] ) {
3910			// The elements to wrap the target around
3911			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
3912
3913			if ( this[0].parentNode ) {
3914				wrap.insertBefore( this[0] );
3915			}
3916
3917			wrap.map(function() {
3918				var elem = this;
3919
3920				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
3921					elem = elem.firstChild;
3922				}
3923
3924				return elem;
3925			}).append(this);
3926		}
3927
3928		return this;
3929	},
3930
3931	wrapInner: function( html ) {
3932		if ( jQuery.isFunction( html ) ) {
3933			return this.each(function(i) {
3934				jQuery(this).wrapInner( html.call(this, i) );
3935			});
3936		}
3937
3938		return this.each(function() {
3939			var self = jQuery( this ), contents = self.contents();
3940
3941			if ( contents.length ) {
3942				contents.wrapAll( html );
3943
3944			} else {
3945				self.append( html );
3946			}
3947		});
3948	},
3949
3950	wrap: function( html ) {
3951		return this.each(function() {
3952			jQuery( this ).wrapAll( html );
3953		});
3954	},
3955
3956	unwrap: function() {
3957		return this.parent().each(function() {
3958			if ( !jQuery.nodeName( this, "body" ) ) {
3959				jQuery( this ).replaceWith( this.childNodes );
3960			}
3961		}).end();
3962	},
3963
3964	append: function() {
3965		return this.domManip(arguments, true, function( elem ) {
3966			if ( this.nodeType === 1 ) {
3967				this.appendChild( elem );
3968			}
3969		});
3970	},
3971
3972	prepend: function() {
3973		return this.domManip(arguments, true, function( elem ) {
3974			if ( this.nodeType === 1 ) {
3975				this.insertBefore( elem, this.firstChild );
3976			}
3977		});
3978	},
3979
3980	before: function() {
3981		if ( this[0] && this[0].parentNode ) {
3982			return this.domManip(arguments, false, function( elem ) {
3983				this.parentNode.insertBefore( elem, this );
3984			});
3985		} else if ( arguments.length ) {
3986			var set = jQuery(arguments[0]);
3987			set.push.apply( set, this.toArray() );
3988			return this.pushStack( set, "before", arguments );
3989		}
3990	},
3991
3992	after: function() {
3993		if ( this[0] && this[0].parentNode ) {
3994			return this.domManip(arguments, false, function( elem ) {
3995				this.parentNode.insertBefore( elem, this.nextSibling );
3996			});
3997		} else if ( arguments.length ) {
3998			var set = this.pushStack( this, "after", arguments );
3999			set.push.apply( set, jQuery(arguments[0]).toArray() );
4000			return set;
4001		}
4002	},
4003
4004	clone: function( events ) {
4005		// Do the clone
4006		var ret = this.map(function() {
4007			if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
4008				// IE copies events bound via attachEvent when
4009				// using cloneNode. Calling detachEvent on the
4010				// clone will also remove the events from the orignal
4011				// In order to get around this, we use innerHTML.
4012				// Unfortunately, this means some modifications to
4013				// attributes in IE that are actually only stored
4014				// as properties will not be copied (such as the
4015				// the name attribute on an input).
4016				var html = this.outerHTML, ownerDocument = this.ownerDocument;
4017				if ( !html ) {
4018					var div = ownerDocument.createElement("div");
4019					div.appendChild( this.cloneNode(true) );
4020					html = div.innerHTML;
4021				}
4022
4023				return jQuery.clean([html.replace(rinlinejQuery, "")
4024					.replace(rleadingWhitespace, "")], ownerDocument)[0];
4025			} else {
4026				return this.cloneNode(true);
4027			}
4028		});
4029
4030		// Copy the events from the original to the clone
4031		if ( events === true ) {
4032			cloneCopyEvent( this, ret );
4033			cloneCopyEvent( this.find("*"), ret.find("*") );
4034		}
4035
4036		// Return the cloned set
4037		return ret;
4038	},
4039
4040	html: function( value ) {
4041		if ( value === undefined ) {
4042			return this[0] && this[0].nodeType === 1 ?
4043				this[0].innerHTML.replace(rinlinejQuery, "") :
4044				null;
4045
4046		// See if we can take a shortcut and just use innerHTML
4047		} else if ( typeof value === "string" && !/<script/i.test( value ) &&
4048			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
4049			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
4050
4051			value = value.replace(rxhtmlTag, fcloseTag);
4052
4053			try {
4054				for ( var i = 0, l = this.length; i < l; i++ ) {
4055					// Remove element nodes and prevent memory leaks
4056					if ( this[i].nodeType === 1 ) {
4057						jQuery.cleanData( this[i].getElementsByTagName("*") );
4058						this[i].innerHTML = value;
4059					}
4060				}
4061
4062			// If using innerHTML throws an exception, use the fallback method
4063			} catch(e) {
4064				this.empty().append( value );
4065			}
4066
4067		} else if ( jQuery.isFunction( value ) ) {
4068			this.each(function(i){
4069				var self = jQuery(this), old = self.html();
4070				self.empty().append(function(){
4071					return value.call( this, i, old );
4072				});
4073			});
4074
4075		} else {
4076			this.empty().append( value );
4077		}
4078
4079		return this;
4080	},
4081
4082	replaceWith: function( value ) {
4083		if ( this[0] && this[0].parentNode ) {
4084			// Make sure that the elements are removed from the DOM before they are inserted
4085			// this can help fix replacing a parent with child elements
4086			if ( !jQuery.isFunction( value ) ) {
4087				value = jQuery( value ).detach();
4088
4089			} else {
4090				return this.each(function(i) {
4091					var self = jQuery(this), old = self.html();
4092					self.replaceWith( value.call( this, i, old ) );
4093				});
4094			}
4095
4096			return this.each(function() {
4097				var next = this.nextSibling, parent = this.parentNode;
4098
4099				jQuery(this).remove();
4100
4101				if ( next ) {
4102					jQuery(next).before( value );
4103				} else {
4104					jQuery(parent).append( value );
4105				}
4106			});
4107		} else {
4108			return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
4109		}
4110	},
4111
4112	detach: function( selector ) {
4113		return this.remove( selector, true );
4114	},
4115
4116	domManip: function( args, table, callback ) {
4117		var results, first, value = args[0], scripts = [];
4118
4119		// We can't cloneNode fragments that contain checked, in WebKit
4120		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
4121			return this.each(function() {
4122				jQuery(this).domManip( args, table, callback, true );
4123			});
4124		}
4125
4126		if ( jQuery.isFunction(value) ) {
4127			return this.each(function(i) {
4128				var self = jQuery(this);
4129				args[0] = value.call(this, i, table ? self.html() : undefined);
4130				self.domManip( args, table, callback );
4131			});
4132		}
4133
4134		if ( this[0] ) {
4135			// If we're in a fragment, just use that instead of building a new one
4136			if ( args[0] && args[0].parentNode && args[0].parentNode.nodeType === 11 ) {
4137				results = { fragment: args[0].parentNode };
4138			} else {
4139				results = buildFragment( args, this, scripts );
4140			}
4141
4142			first = results.fragment.firstChild;
4143
4144			if ( first ) {
4145				table = table && jQuery.nodeName( first, "tr" );
4146
4147				for ( var i = 0, l = this.length; i < l; i++ ) {
4148					callback.call(
4149						table ?
4150							root(this[i], first) :
4151							this[i],
4152						results.cacheable || this.length > 1 || i > 0 ?
4153							results.fragment.cloneNode(true) :
4154							results.fragment
4155					);
4156				}
4157			}
4158
4159			if ( scripts ) {
4160				jQuery.each( scripts, evalScript );
4161			}
4162		}
4163
4164		return this;
4165
4166		function root( elem, cur ) {
4167			return jQuery.nodeName(elem, "table") ?
4168				(elem.getElementsByTagName("tbody")[0] ||
4169				elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
4170				elem;
4171		}
4172	}
4173});
4174
4175function cloneCopyEvent(orig, ret) {
4176	var i = 0;
4177
4178	ret.each(function() {
4179		if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
4180			return;
4181		}
4182
4183		var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
4184
4185		if ( events ) {
4186			delete curData.handle;
4187			curData.events = {};
4188
4189			for ( var type in events ) {
4190				for ( var handler in events[ type ] ) {
4191					jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
4192				}
4193			}
4194		}
4195	});
4196}
4197
4198function buildFragment( args, nodes, scripts ) {
4199	var fragment, cacheable, cacheresults, doc;
4200
4201	// webkit does not clone 'checked' attribute of radio inputs on cloneNode, so don't cache if string has a checked
4202	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && args[0].indexOf("<option") < 0 && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
4203		cacheable = true;
4204		cacheresults = jQuery.fragments[ args[0] ];
4205		if ( cacheresults ) {
4206			if ( cacheresults !== 1 ) {
4207				fragment = cacheresults;
4208			}
4209		}
4210	}
4211
4212	if ( !fragment ) {
4213		doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
4214		fragment = doc.createDocumentFragment();
4215		jQuery.clean( args, doc, fragment, scripts );
4216	}
4217
4218	if ( cacheable ) {
4219		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
4220	}
4221
4222	return { fragment: fragment, cacheable: cacheable };
4223}
4224
4225jQuery.fragments = {};
4226
4227jQuery.each({
4228	appendTo: "append",
4229	prependTo: "prepend",
4230	insertBefore: "before",
4231	insertAfter: "after",
4232	replaceAll: "replaceWith"
4233}, function( name, original ) {
4234	jQuery.fn[ name ] = function( selector ) {
4235		var ret = [], insert = jQuery( selector );
4236
4237		for ( var i = 0, l = insert.length; i < l; i++ ) {
4238			var elems = (i > 0 ? this.clone(true) : this).get();
4239			jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
4240			ret = ret.concat( elems );
4241		}
4242		return this.pushStack( ret, name, insert.selector );
4243	};
4244});
4245
4246jQuery.each({
4247	// keepData is for internal use only--do not document
4248	remove: function( selector, keepData ) {
4249		if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
4250			if ( !keepData && this.nodeType === 1 ) {
4251				jQuery.cleanData( this.getElementsByTagName("*") );
4252				jQuery.cleanData( [ this ] );
4253			}
4254
4255			if ( this.parentNode ) {
4256				 this.parentNode.removeChild( this );
4257			}
4258		}
4259	},
4260
4261	empty: function() {
4262		// Remove element nodes and prevent memory leaks
4263		if ( this.nodeType === 1 ) {
4264			jQuery.cleanData( this.getElementsByTagName("*") );
4265		}
4266
4267		// Remove any remaining nodes
4268		while ( this.firstChild ) {
4269			this.removeChild( this.firstChild );
4270		}
4271	}
4272}, function( name, fn ) {
4273	jQuery.fn[ name ] = function() {
4274		return this.each( fn, arguments );
4275	};
4276});
4277
4278jQuery.extend({
4279	clean: function( elems, context, fragment, scripts ) {
4280		context = context || document;
4281
4282		// !context.createElement fails in IE with an error but returns typeof 'object'
4283		if ( typeof context.createElement === "undefined" ) {
4284			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
4285		}
4286
4287		var ret = [];
4288
4289		jQuery.each(elems, function( i, elem ) {
4290			if ( typeof elem === "number" ) {
4291				elem += "";
4292			}
4293
4294			if ( !elem ) {
4295				return;
4296			}
4297
4298			// Convert html string into DOM nodes
4299			if ( typeof elem === "string" && !rhtml.test( elem ) ) {
4300				elem = context.createTextNode( elem );
4301
4302			} else if ( typeof elem === "string" ) {
4303				// Fix "XHTML"-style tags in all browsers
4304				elem = elem.replace(rxhtmlTag, fcloseTag);
4305
4306				// Trim whitespace, otherwise indexOf won't work as expected
4307				var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
4308					wrap = wrapMap[ tag ] || wrapMap._default,
4309					depth = wrap[0],
4310					div = context.createElement("div");
4311
4312				// Go to html and back, then peel off extra wrappers
4313				div.innerHTML = wrap[1] + elem + wrap[2];
4314
4315				// Move to the right depth
4316				while ( depth-- ) {
4317					div = div.lastChild;
4318				}
4319
4320				// Remove IE's autoinserted <tbody> from table fragments
4321				if ( !jQuery.support.tbody ) {
4322
4323					// String was a <table>, *may* have spurious <tbody>
4324					var hasBody = rtbody.test(elem),
4325						tbody = tag === "table" && !hasBody ?
4326							div.firstChild && div.firstChild.childNodes :
4327
4328							// String was a bare <thead> or <tfoot>
4329							wrap[1] === "<table>" && !hasBody ?
4330								div.childNodes :
4331								[];
4332
4333					for ( var j = tbody.length - 1; j >= 0 ; --j ) {
4334						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
4335							tbody[ j ].parentNode.removeChild( tbody[ j ] );
4336						}
4337					}
4338
4339				}
4340
4341				// IE completely kills leading whitespace when innerHTML is used
4342				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
4343					div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
4344				}
4345
4346				elem = jQuery.makeArray( div.childNodes );
4347			}
4348
4349			if ( elem.nodeType ) {
4350				ret.push( elem );
4351			} else {
4352				ret = jQuery.merge( ret, elem );
4353			}
4354
4355		});
4356
4357		if ( fragment ) {
4358			for ( var i = 0; ret[i]; i++ ) {
4359				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
4360					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
4361				} else {
4362					if ( ret[i].nodeType === 1 ) {
4363						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
4364					}
4365					fragment.appendChild( ret[i] );
4366				}
4367			}
4368		}
4369
4370		return ret;
4371	},
4372	
4373	cleanData: function( elems ) {
4374		for ( var i = 0, elem, id; (elem = elems[i]) != null; i++ ) {
4375			jQuery.event.remove( elem );
4376			jQuery.removeData( elem );
4377		}
4378	}
4379});
4380// exclude the following css properties to add px
4381var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
4382	ralpha = /alpha\([^)]*\)/,
4383	ropacity = /opacity=([^)]*)/,
4384	rfloat = /float/i,
4385	rdashAlpha = /-([a-z])/ig,
4386	rupper = /([A-Z])/g,
4387	rnumpx = /^-?\d+(?:px)?$/i,
4388	rnum = /^-?\d/,
4389
4390	cssShow = { position: "absolute", visibility: "hidden", display:"block" },
4391	cssWidth = [ "Left", "Right" ],
4392	cssHeight = [ "Top", "Bottom" ],
4393
4394	// cache check for defaultView.getComputedStyle
4395	getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
4396	// normalize float css property
4397	styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
4398	fcamelCase = function( all, letter ) {
4399		return letter.toUpperCase();
4400	};
4401
4402jQuery.fn.css = function( name, value ) {
4403	return access( this, name, value, true, function( elem, name, value ) {
4404		if ( value === undefined ) {
4405			return jQuery.curCSS( elem, name );
4406		}
4407		
4408		if ( typeof value === "number" && !rexclude.test(name) ) {
4409			value += "px";
4410		}
4411
4412		jQuery.style( elem, name, value );
4413	});
4414};
4415
4416jQuery.extend({
4417	style: function( elem, name, value ) {
4418		// don't set styles on text and comment nodes
4419		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
4420			return undefined;
4421		}
4422
4423		// ignore negative width and height values #1599
4424		if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
4425			value = undefined;
4426		}
4427
4428		var style = elem.style || elem, set = value !== undefined;
4429
4430		// IE uses filters for opacity
4431		if ( !jQuery.support.opacity && name === "opacity" ) {
4432			if ( set ) {
4433				// IE has trouble with opacity if it does not have layout
4434				// Force it by setting the zoom level
4435				style.zoom = 1;
4436
4437				// Set the alpha filter to set the opacity
4438				var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
4439				var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
4440				style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
4441			}
4442
4443			return style.filter && style.filter.indexOf("opacity=") >= 0 ?
4444				(parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
4445				"";
4446		}
4447
4448		// Make sure we're using the right name for getting the float value
4449		if ( rfloat.test( name ) ) {
4450			name = styleFloat;
4451		}
4452
4453		name = name.replace(rdashAlpha, fcamelCase);
4454
4455		if ( set ) {
4456			style[ name ] = value;
4457		}
4458
4459		return style[ name ];
4460	},
4461
4462	css: function( elem, name, force, extra ) {
4463		if ( name === "width" || name === "height" ) {
4464			var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
4465
4466			function getWH() {
4467				val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
4468
4469				if ( extra === "border" ) {
4470					return;
4471				}
4472
4473				jQuery.each( which, function() {
4474					if ( !extra ) {
4475						val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
4476					}
4477
4478					if ( extra === "margin" ) {
4479						val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
4480					} else {
4481						val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
4482					}
4483				});
4484			}
4485
4486			if ( elem.offsetWidth !== 0 ) {
4487				getWH();
4488			} else {
4489				jQuery.swap( elem, props, getWH );
4490			}
4491
4492			return Math.max(0, Math.round(val));
4493		}
4494
4495		return jQuery.curCSS( elem, name, force );
4496	},
4497
4498	curCSS: function( elem, name, force ) {
4499		var ret, style = elem.style, filter;
4500
4501		// IE uses filters for opacity
4502		if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
4503			ret = ropacity.test(elem.currentStyle.filter || "") ?
4504				(parseFloat(RegExp.$1) / 100) + "" :
4505				"";
4506
4507			return ret === "" ?
4508				"1" :
4509				ret;
4510		}
4511
4512		// Make sure we're using the right name for getting the float value
4513		if ( rfloat.test( name ) ) {
4514			name = styleFloat;
4515		}
4516
4517		if ( !force && style && style[ name ] ) {
4518			ret = style[ name ];
4519
4520		} else if ( getComputedStyle ) {
4521
4522			// Only "float" is needed here
4523			if ( rfloat.test( name ) ) {
4524				name = "float";
4525			}
4526
4527			name = name.replace( rupper, "-$1" ).toLowerCase();
4528
4529			var defaultView = elem.ownerDocument.defaultView;
4530
4531			if ( !defaultView ) {
4532				return null;
4533			}
4534
4535			var computedStyle = defaultView.getComputedStyle( elem, null );
4536
4537			if ( computedStyle ) {
4538				ret = computedStyle.getPropertyValue( name );
4539			}
4540
4541			// We should always get a number back from opacity
4542			if ( name === "opacity" && ret === "" ) {
4543				ret = "1";
4544			}
4545
4546		} else if ( elem.currentStyle ) {
4547			var camelCase = name.replace(rdashAlpha, fcamelCase);
4548
4549			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
4550
4551			// From the awesome hack by Dean Edwards
4552			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
4553
4554			// If we're not dealing with a regular pixel number
4555			// but a number that has a weird ending, we need to convert it to pixels
4556			if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
4557				// Remember the original values
4558				var left = style.left, rsLeft = elem.runtimeStyle.left;
4559
4560				// Put in the new values to get a computed value out
4561				elem.runtimeStyle.left = elem.currentStyle.left;
4562				style.left = camelCase === "fontSize" ? "1em" : (ret || 0);
4563				ret = style.pixelLeft + "px";
4564
4565				// Revert the changed values
4566				style.left = left;
4567				elem.runtimeStyle.left = rsLeft;
4568			}
4569		}
4570
4571		return ret;
4572	},
4573
4574	// A method for quickly swapping in/out CSS properties to get correct calculations
4575	swap: function( elem, options, callback ) {
4576		var old = {};
4577
4578		// Remember the old values, and insert the new ones
4579		for ( var name in options ) {
4580			old[ name ] = elem.style[ name ];
4581			elem.style[ name ] = options[ name ];
4582		}
4583
4584		callback.call( elem );
4585
4586		// Revert the old values
4587		for ( var name in options ) {
4588			elem.style[ name ] = old[ name ];
4589		}
4590	}
4591});
4592
4593if ( jQuery.expr && jQuery.expr.filters ) {
4594	jQuery.expr.filters.hidden = function( elem ) {
4595		var width = elem.offsetWidth, height = elem.offsetHeight,
4596			skip = elem.nodeName.toLowerCase() === "tr";
4597
4598		return width === 0 && height === 0 && !skip ?
4599			true :
4600			width > 0 && height > 0 && !skip ?
4601				false :
4602				jQuery.curCSS(elem, "display") === "none";
4603	};
4604
4605	jQuery.expr.filters.visible = function( elem ) {
4606		return !jQuery.expr.filters.hidden( elem );
4607	};
4608}
4609var jsc = now(),
4610	rscript = /<script(.|\s)*?\/script>/gi,
4611	rselectTextarea = /select|textarea/i,
4612	rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
4613	jsre = /=\?(&|$)/,
4614	rquery = /\?/,
4615	rts = /(\?|&)_=.*?(&|$)/,
4616	rurl = /^(\w+:)?\/\/([^\/?#]+)/,
4617	r20 = /%20/g;
4618
4619jQuery.fn.extend({
4620	// Keep a copy of the old load
4621	_load: jQuery.fn.load,
4622
4623	load: function( url, params, callback ) {
4624		if ( typeof url !== "string" ) {
4625			return this._load( url );
4626
4627		// Don't do a request if no elements are being requested
4628		} else if ( !this.length ) {
4629			return this;
4630		}
4631
4632		var off = url.indexOf(" ");
4633		if ( off >= 0 ) {
4634			var selector = url.slice(off, url.length);
4635			url = url.slice(0, off);
4636		}
4637
4638		// Default to a GET request
4639		var type = "GET";
4640
4641		// If the second parameter was provided
4642		if ( params ) {
4643			// If it's a function
4644			if ( jQuery.isFunction( params ) ) {
4645				// We assume that it's the callback
4646				callback = params;
4647				params = null;
4648
4649			// Otherwise, build a param string
4650			} else if ( typeof params === "object" ) {
4651				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
4652				type = "POST";
4653			}
4654		}
4655
4656		var self = this;
4657
4658		// Request the remote document
4659		jQuery.ajax({
4660			url: url,
4661			type: type,
4662			dataType: "html",
4663			data: params,
4664			complete: function( res, status ) {
4665				// If successful, inject the HTML into all the matched elements
4666				if ( status === "success" || status === "notmodified" ) {
4667					// See if a selector was specified
4668					self.html( selector ?
4669						// Create a dummy div to hold the results
4670						jQuery("<div />")
4671							// inject the contents of the document in, removing the scripts
4672							// to avoid any 'Permission Denied' errors in IE
4673							.append(res.responseText.replace(rscript, ""))
4674
4675							// Locate the specified elements
4676							.find(selector) :
4677
4678						// If not, just inject the full result
4679						res.responseText );
4680				}
4681
4682				if ( callback ) {
4683					self.each( callback, [res.responseText, status, res] );
4684				}
4685			}
4686		});
4687
4688		return this;
4689	},
4690
4691	serialize: function() {
4692		return jQuery.param(this.serializeArray());
4693	},
4694	serializeArray: function() {
4695		return this.map(function() {
4696			return this.elements ? jQuery.makeArray(this.elements) : this;
4697		})
4698		.filter(function() {
4699			return this.name && !this.disabled &&
4700				(this.checked || rselectTextarea.test(this.nodeName) ||
4701					rinput.test(this.type));
4702		})
4703		.map(function( i, elem ) {
4704			var val = jQuery(this).val();
4705
4706			return val == null ?
4707				null :
4708				jQuery.isArray(val) ?
4709					jQuery.map( val, function( val, i ) {
4710						return { name: elem.name, value: val };
4711					}) :
4712					{ name: elem.name, value: val };
4713		}).get();
4714	}
4715});
4716
4717// Attach a bunch of functions for handling common AJAX events
4718jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
4719	jQuery.fn[o] = function( f ) {
4720		return this.bind(o, f);
4721	};
4722});
4723
4724jQuery.extend({
4725
4726	get: function( url, data, callback, type ) {
4727		// shift arguments if data argument was omited
4728		if ( jQuery.isFunction( data ) ) {
4729			type = type || callback;
4730			callback = data;
4731			data = null;
4732		}
4733
4734		return jQuery.ajax({
4735			type: "GET",
4736			url: url,
4737			data: data,
4738			success: callback,
4739			dataType: type
4740		});
4741	},
4742
4743	getScript: function( url, callback ) {
4744		return jQuery.get(url, null, callback, "script");
4745	},
4746
4747	getJSON: function( url, data, callback ) {
4748		return jQuery.get(url, data, callback, "json");
4749	},
4750
4751	post: function( url, data, callback, type ) {
4752		// shift arguments if data argument was omited
4753		if ( jQuery.isFunction( data ) ) {
4754			type = type || callback;
4755			callback = data;
4756			data = {};
4757		}
4758
4759		return jQuery.ajax({
4760			type: "POST",
4761			url: url,
4762			data: data,
4763			success: callback,
4764			dataType: type
4765		});
4766	},
4767
4768	ajaxSetup: function( settings ) {
4769		jQuery.extend( jQuery.ajaxSettings, settings );
4770	},
4771
4772	ajaxSettings: {
4773		url: location.href,
4774		global: true,
4775		type: "GET",
4776		contentType: "application/x-www-form-urlencoded",
4777		processData: true,
4778		async: true,
4779		/*
4780		timeout: 0,
4781		data: null,
4782		username: null,
4783		password: null,
4784		traditional: false,
4785		*/
4786		// Create the request object; Microsoft failed to properly
4787		// implement the XMLHttpRequest in IE7 (can't request local files),
4788		// so we use the ActiveXObject when it is available
4789		// This function can be overriden by calling jQuery.ajaxSetup
4790		xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
4791			function() {
4792				return new window.XMLHttpRequest();
4793			} :
4794			function() {
4795				try {
4796					return new window.ActiveXObject("Microsoft.XMLHTTP");
4797				} catch(e) {}
4798			},
4799		accepts: {
4800			xml: "application/xml, text/xml",
4801			html: "text/html",
4802			script: "text/javascript, application/javascript",
4803			json: "application/json, text/javascript",
4804			text: "text/plain",
4805			_default: "*/*"
4806		}
4807	},
4808
4809	// Last-Modified header cache for next request
4810	lastModified: {},
4811	etag: {},
4812
4813	ajax: function( origSettings ) {
4814		var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
4815		
4816		var jsonp, status, data,
4817			callbackContext = origSettings && origSettings.context || s,
4818			type = s.type.toUpperCase();
4819
4820		// convert data if not already a string
4821		if ( s.data && s.processData && typeof s.data !== "string" ) {
4822			s.data = jQuery.param( s.data, s.traditional );
4823		}
4824
4825		// Handle JSONP Parameter Callbacks
4826		if ( s.dataType === "jsonp" ) {
4827			if ( type === "GET" ) {
4828				if ( !jsre.test( s.url ) ) {
4829					s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
4830				}
4831			} else if ( !s.data || !jsre.test(s.data) ) {
4832				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
4833			}
4834			s.dataType = "json";
4835		}
4836
4837		// Build temporary JSONP function
4838		if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
4839			jsonp = s.jsonpCallback || ("jsonp" + jsc++);
4840
4841			// Replace the =? sequence both in the query string and the data
4842			if ( s.data ) {
4843				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
4844			}
4845
4846			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
4847
4848			// We need to make sure
4849			// that a JSONP style response is executed properly
4850			s.dataType = "script";
4851
4852			// Handle JSONP-style loading
4853			window[ jsonp ] = window[ jsonp ] || function( tmp ) {
4854				data = tmp;
4855				success();
4856				complete();
4857				// Garbage collect
4858				window[ jsonp ] = undefined;
4859
4860				try {
4861					delete window[ jsonp ];
4862				} catch(e) {}
4863
4864				if ( head ) {
4865					head.removeChild( script );
4866				}
4867			};
4868		}
4869
4870		if ( s.dataType === "script" && s.cache === null ) {
4871			s.cache = false;
4872		}
4873
4874		if ( s.cache === false && type === "GET" ) {
4875			var ts = now();
4876
4877			// try replacing _= if it is there
4878			var ret = s.url.replace(rts, "$1_=" + ts + "$2");
4879
4880			// if nothing was replaced, add timestamp to the end
4881			s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
4882		}
4883
4884		// If data is available, append data to url for get requests
4885		if ( s.data && type === "GET" ) {
4886			s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
4887		}
4888
4889		// Watch for a new set of requests
4890		if ( s.global && ! jQuery.active++ ) {
4891			jQuery.event.trigger( "ajaxStart" );
4892		}
4893
4894		// Matches an absolute URL, and saves the domain
4895		var parts = rurl.exec( s.url ),
4896			remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
4897
4898		// If we're requesting a remote document
4899		// and trying to load JSON or Script with a GET
4900		if ( s.dataType === "script" && type === "GET" && remote ) {
4901			var head = document.getElementsByTagName("head")[0] || document.documentElement;
4902			var script = document.createElement("script");
4903			script.src = s.url;
4904			if ( s.scriptCharset ) {
4905				script.charset = s.scriptCharset;
4906			}
4907
4908			// Handle Script loading
4909			if ( !jsonp ) {
4910				var done = false;
4911
4912				// Attach handlers for all browsers
4913				script.onload = script.onreadystatechange = function() {
4914					if ( !done && (!this.readyState ||
4915							this.readyState === "loaded" || this.readyState === "complete") ) {
4916						done = true;
4917						success();
4918						complete();
4919
4920						// Handle memory leak in IE
4921						script.onload = script.onreadystatechange = null;
4922						if ( head && script.parentNode ) {
4923							head.removeChild( script );
4924						}
4925					}
4926				};
4927			}
4928
4929			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
4930			// This arises when a base node is used (#2709 and #4378).
4931			head.insertBefore( script, head.firstChild );
4932
4933			// We handle everything using the script element injection
4934			return undefined;
4935		}
4936
4937		var requestDone = false;
4938
4939		// Create the request object
4940		var xhr = s.xhr();
4941
4942		if ( !xhr ) {
4943			return;
4944		}
4945
4946		// Open the socket
4947		// Passing null username, generates a login popup on Opera (#2865)
4948		if ( s.username ) {
4949			xhr.open(type, s.url, s.async, s.username, s.password);
4950		} else {
4951			xhr.open(type, s.url, s.async);
4952		}
4953
4954		// Need an extra try/catch for cross domain requests in Firefox 3
4955		try {
4956			// Set the correct header, if data is being sent
4957			if ( s.data || origSettings && origSettings.contentType ) {
4958				xhr.setRequestHeader("Content-Type", s.contentType);
4959			}
4960
4961			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
4962			if ( s.ifModified ) {
4963				if ( jQuery.lastModified[s.url] ) {
4964					xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
4965				}
4966
4967				if ( jQuery.etag[s.url] ) {
4968					xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
4969				}
4970			}
4971
4972			// Set header so the called script knows that it's an XMLHttpRequest
4973			// Only send the header if it's not a remote XHR
4974			if ( !remote ) {
4975				xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
4976			}
4977
4978			// Set the Accepts header for the server, depending on the dataType
4979			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
4980				s.accepts[ s.dataType ] + ", */*" :
4981				s.accepts._default );
4982		} catch(e) {}
4983
4984		// Allow custom headers/mimetypes and early abort
4985		if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
4986			// Handle the global AJAX counter
4987			if ( s.global && ! --jQuery.active ) {
4988				jQuery.event.trigger( "ajaxStop" );
4989			}
4990
4991			// close opended socket
4992			xhr.abort();
4993			return false;
4994		}
4995
4996		if ( s.global ) {
4997			trigger("ajaxSend", [xhr, s]);
4998		}
4999
5000		// Wait for a response to come back
5001		var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
5002			// The request was aborted
5003			if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
5004				// Opera doesn't call onreadystatechange before this point
5005				// so we simulate the call
5006				if ( !requestDone ) {
5007					complete();
5008				}
5009
5010				requestDone = true;
5011				if ( xhr ) {
5012					xhr.onreadystatechange = jQuery.noop;
5013				}
5014
5015			// The transfer is complete and the data is available, or the request timed out
5016			} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
5017				requestDone = true;
5018				xhr.onreadystatechange = jQuery.noop;
5019
5020				status = isTimeout === "timeout" ?
5021					"timeout" :
5022					!jQuery.httpSuccess( xhr ) ?
5023						"error" :
5024						s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
5025							"notmodified" :
5026							"success";
5027
5028				var errMsg;
5029
5030				if ( status === "success" ) {
5031					// Watch for, and catch, XML document parse errors
5032					try {
5033						// process the data (runs the xml through httpData regardless of callback)
5034						data = jQuery.httpData( xhr, s.dataType, s );
5035					} catch(err) {
5036						status = "parsererror";
5037						errMsg = err;
5038					}
5039				}
5040
5041				// Make sure that the request was successful or notmodified
5042				if ( status === "success" || status === "notmodified" ) {
5043					// JSONP handles its own success callback
5044					if ( !jsonp ) {
5045						success();
5046					}
5047				} else {
5048					jQuery.handleError(s, xhr, status, errMsg);
5049				}
5050
5051				// Fire the complete handlers
5052				complete();
5053
5054				if ( isTimeout === "timeout" ) {
5055					xhr.abort();
5056				}
5057
5058				// Stop memory leaks
5059				if ( s.async ) {
5060					xhr = null;
5061				}
5062			}
5063		};
5064
5065		// Override the abort handler, if we can (IE doesn't allow it, but that's OK)
5066		// Opera doesn't fire onreadystatechange at all on abort
5067		try {
5068			var oldAbort = xhr.abort;
5069			xhr.abort = function() {
5070				if ( xhr ) {
5071					oldAbort.call( xhr );
5072				}
5073
5074				onreadystatechange( "abort" );
5075			};
5076		} catch(e) { }
5077
5078		// Timeout checker
5079		if ( s.async && s.timeout > 0 ) {
5080			setTimeout(function() {
5081				// Check to see if the request is still happening
5082				if ( xhr && !requestDone ) {
5083					onreadystatechange( "timeout" );
5084				}
5085			}, s.timeout);
5086		}
5087
5088		// Send the data
5089		try {
5090			xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
5091		} catch(e) {
5092			jQuery.handleError(s, xhr, null, e);
5093			// Fire the complete handlers
5094			complete();
5095		}
5096
5097		// firefox 1.5 doesn't fire statechange for sync requests
5098		if ( !s.async ) {
5099			onreadystatechange();
5100		}
5101
5102		function success() {
5103			// If a local callback was specified, fire it and pass it the data
5104			if ( s.success ) {
5105				s.success.call( callbackContext, data, status, xhr );
5106			}
5107
5108			// Fire the global callback
5109			if ( s.global ) {
5110				trigger( "ajaxSuccess", [xhr, s] );
5111			}
5112		}
5113
5114		function complete() {
5115			// Process result
5116			if ( s.complete ) {
5117				s.complete.call( callbackContext, xhr, status);
5118			}
5119
5120			// The request was completed
5121			if ( s.global ) {
5122				trigger( "ajaxComplete", [xhr, s] );
5123			}
5124
5125			// Handle the global AJAX counter
5126			if ( s.global && ! --jQuery.active ) {
5127				jQuery.event.trigger( "ajaxStop" );
5128			}
5129		}
5130		
5131		function trigger(type, args) {
5132			(s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
5133		}
5134
5135		// return XMLHttpRequest to allow aborting the request etc.
5136		return xhr;
5137	},
5138
5139	handleError: function( s, xhr, status, e ) {
5140		// If a local callback was specified, fire it
5141		if ( s.error ) {
5142			s.error.call( s.context || s, xhr, status, e );
5143		}
5144
5145		// Fire the global callback
5146		if ( s.global ) {
5147			(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
5148		}
5149	},
5150
5151	// Counter for holding the number of active queries
5152	active: 0,
5153
5154	// Determines if an XMLHttpRequest was successful or not
5155	httpSuccess: function( xhr ) {
5156		try {
5157			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
5158			return !xhr.status && location.protocol === "file:" ||
5159				// Opera returns 0 when status is 304
5160				( xhr.status >= 200 && xhr.status < 300 ) ||
5161				xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
5162		} catch(e) {}
5163
5164		return false;
5165	},
5166
5167	// Determines if an XMLHttpRequest returns NotModified
5168	httpNotModified: function( xhr, url ) {
5169		var lastModified = xhr.getResponseHeader("Last-Modified"),
5170			etag = xhr.getResponseHeader("Etag");
5171
5172		if ( lastModified ) {
5173			jQuery.lastModified[url] = lastModified;
5174		}
5175
5176		if ( etag ) {
5177			jQuery.etag[url] = etag;
5178		}
5179
5180		// Opera returns 0 when status is 304
5181		return xhr.status === 304 || xhr.status === 0;
5182	},
5183
5184	httpData: function( xhr, type, s ) {
5185		var ct = xhr.getResponseHeader("content-type") || "",
5186			xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
5187			data = xml ? xhr.responseXML : xhr.responseText;
5188
5189		if ( xml && data.documentElement.nodeName === "parsererror" ) {
5190			jQuery.error( "parsererror" );
5191		}
5192
5193		// Allow a pre-filtering function to sanitize the response
5194		// s is checked to keep backwards compatibility
5195		if ( s && s.dataFilter ) {
5196			data = s.dataFilter( data, type );
5197		}
5198
5199		// The filter can actually parse the response
5200		if ( typeof data === "string" ) {
5201			// Get the JavaScript object, if JSON is used.
5202			if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
5203				data = jQuery.parseJSON( data );
5204
5205			// If the type is "script", eval it in global context
5206			} else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
5207				jQuery.globalEval( data );
5208			}
5209		}
5210
5211		return data;
5212	},
5213
5214	// Serialize an array of form elements or a set of
5215	// key/values into a query string
5216	param: function( a, traditional ) {
5217		var s = [];
5218		
5219		// Set traditional to true for jQuery <= 1.3.2 behavior.
5220		if ( traditional === undefined ) {
5221			traditional = jQuery.ajaxSettings.traditional;
5222		}
5223		
5224		// If an array was passed in, assume that it is an array of form elements.
5225		if ( jQuery.isArray(a) || a.jquery ) {
5226			// Serialize the form elements
5227			jQuery.each( a, function() {
5228				add( this.name, this.value );
5229			});
5230			
5231		} else {
5232			// If traditional, encode the "old" way (the way 1.3.2 or older
5233			// did it), otherwise encode params recursively.
5234			for ( var prefix in a ) {
5235				buildParams( prefix, a[prefix] );
5236			}
5237		}
5238
5239		// Return the resulting serialization
5240		return s.join("&").replace(r20, "+");
5241
5242		function buildParams( prefix, obj ) {
5243			if ( jQuery.isArray(obj) ) {
5244				// Serialize array item.
5245				jQuery.each( obj, function( i, v ) {
5246					if ( traditional ) {
5247						// Treat each array item as a scalar.
5248						add( prefix, v );
5249					} else {
5250						// If array item is non-scalar (array or object), encode its
5251						// numeric index to resolve deserialization ambiguity issues.
5252						// Note that rack (as of 1.0.0) can't currently deserialize
5253						// nested arrays properly, and attempting to do so may cause
5254						// a server error. Possible fixes are to modify rack's
5255						// deserialization algorithm or to provide an option or flag
5256						// to force array serialization to be shallow.
5257						buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
5258					}
5259				});
5260					
5261			} else if ( !traditional && obj != null && typeof obj === "object" ) {
5262				// Serialize object item.
5263				jQuery.each( obj, function( k, v ) {
5264					buildParams( prefix + "[" + k + "]", v );
5265				});
5266					
5267			} else {
5268				// Serialize scalar item.
5269				add( prefix, obj );
5270			}
5271		}
5272
5273		function add( key, value ) {
5274			// If value is a function, invoke it and return its value
5275			value = jQuery.isFunction(value) ? value() : value;
5276			s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
5277		}
5278	}
5279});
5280var elemdisplay = {},
5281	rfxtypes = /toggle|show|hide/,
5282	rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
5283	timerId,
5284	fxAttrs = [
5285		// height animations
5286		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
5287		// width animations
5288		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
5289		// opacity animations
5290		[ "opacity" ]
5291	];
5292
5293jQuery.fn.extend({
5294	show: function( speed, callback ) {
5295		if ( speed || speed === 0) {
5296			return this.animate( genFx("show", 3), speed, callback);
5297
5298		} else {
5299			for ( var i = 0, l = this.length; i < l; i++ ) {
5300				var old = jQuery.data(this[i], "olddisplay");
5301
5302				this[i].style.display = old || "";
5303
5304				if ( jQuery.css(this[i], "display") === "none" ) {
5305					var nodeName = this[i].nodeName, display;
5306
5307					if ( elemdisplay[ nodeName ] ) {
5308						display = elemdisplay[ nodeName ];
5309
5310					} else {
5311						var elem = jQuery("<" + nodeName + " />").appendTo("body");
5312
5313						display = elem.css("display");
5314
5315						if ( display === "none" ) {
5316							display = "block";
5317						}
5318
5319						elem.remove();
5320
5321						elemdisplay[ nodeName ] = display;
5322					}
5323
5324					jQuery.data(this[i], "olddisplay", display);
5325				}
5326			}
5327
5328			// Set the display of the elements in a second loop
5329			// to avoid the constant reflow
5330			for ( var j = 0, k = this.length; j < k; j++ ) {
5331				this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
5332			}
5333
5334			return this;
5335		}
5336	},
5337
5338	hide: function( speed, callback ) {
5339		if ( speed || speed === 0 ) {
5340			return this.animate( genFx("hide", 3), speed, callback);
5341
5342		} else {
5343			for ( var i = 0, l = this.length; i < l; i++ ) {
5344				var old = jQuery.data(this[i], "olddisplay");
5345				if ( !old && old !== "none" ) {
5346					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
5347				}
5348			}
5349
5350			// Set the display of the elements in a second loop
5351			// to avoid the constant reflow
5352			for ( var j = 0, k = this.length; j < k; j++ ) {
5353				this[j].style.display = "none";
5354			}
5355
5356			return this;
5357		}
5358	},
5359
5360	// Save the old toggle function
5361	_toggle: jQuery.fn.toggle,
5362
5363	toggle: function( fn, fn2 ) {
5364		var bool = typeof fn === "boolean";
5365
5366		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
5367			this._toggle.apply( this, arguments );
5368
5369		} else if ( fn == null || bool ) {
5370			this.each(function() {
5371				var state = bool ? fn : jQuery(this).is(":hidden");
5372				jQuery(this)[ state ? "show" : "hide" ]();
5373			});
5374
5375		} else {
5376			this.animate(genFx("toggle", 3), fn, fn2);
5377		}
5378
5379		return this;
5380	},
5381
5382	fadeTo: function( speed, to, callback ) {
5383		return this.filter(":hidden").css("opacity", 0).show().end()
5384					.animate({opacity: to}, speed, callback);
5385	},
5386
5387	animate: function( prop, speed, easing, callback ) {
5388		var optall = jQuery.speed(speed, easing, callback);
5389
5390		if ( jQuery.isEmptyObject( prop ) ) {
5391			return this.each( optall.complete );
5392		}
5393
5394		return this[ optall.queue === false ? "each" : "queue" ](function() {
5395			var opt = jQuery.extend({}, optall), p,
5396				hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
5397				self = this;
5398
5399			for ( p in prop ) {
5400				var name = p.replace(rdashAlpha, fcamelCase);
5401
5402				if ( p !== name ) {
5403					prop[ name ] = prop[ p ];
5404					delete prop[ p ];
5405					p = name;
5406				}
5407
5408				if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
5409					return opt.complete.call(this);
5410				}
5411
5412				if ( ( p === "height" || p === "width" ) && this.style ) {
5413					// Store display property
5414					opt.display = jQuery.css(this, "display");
5415
5416					// Make sure that nothing sneaks out
5417					opt.overflow = this.style.overflow;
5418				}
5419
5420				if ( jQuery.isArray( prop[p] ) ) {
5421					// Create (if needed) and add to specialEasing
5422					(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
5423					prop[p] = prop[p][0];
5424				}
5425			}
5426
5427			if ( opt.overflow != null ) {
5428				this.style.overflow = "hidden";
5429			}
5430
5431			opt.curAnim = jQuery.extend({}, prop);
5432
5433			jQuery.each( prop, function( name, val ) {
5434				var e = new jQuery.fx( self, opt, name );
5435
5436				if ( rfxtypes.test(val) ) {
5437					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
5438
5439				} else {
5440					var parts = rfxnum.exec(val),
5441						start = e.cur(true) || 0;
5442
5443					if ( parts ) {
5444						var end = parseFloat( parts[2] ),
5445							unit = parts[3] || "px";
5446
5447						// We need to compute starting value
5448						if ( unit !== "px" ) {
5449							self.style[ name ] = (end || 1) + unit;
5450							start = ((end || 1) / e.cur(true)) * start;
5451							self.style[ name ] = start + unit;
5452						}
5453
5454						// If a +=/-= token was provided, we're doing a relative animation
5455						if ( parts[1] ) {
5456							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
5457						}
5458
5459						e.custom( start, end, unit );
5460
5461					} else {
5462						e.custom( start, val, "" );
5463					}
5464				}
5465			});
5466
5467			// For JS strict compliance
5468			return true;
5469		});
5470	},
5471
5472	stop: function( clearQueue, gotoEnd ) {
5473		var timers = jQuery.timers;
5474
5475		if ( clearQueue ) {
5476			this.queue([]);
5477		}
5478
5479		this.each(function() {
5480			// go in reverse order so anything added to the queue during the loop is ignored
5481			for ( var i = timers.length - 1; i >= 0; i-- ) {
5482				if ( timers[i].elem === this ) {
5483					if (gotoEnd) {
5484						// force the next step to be the last
5485						timers[i](true);
5486					}
5487
5488					timers.splice(i, 1);
5489				}
5490			}
5491		});
5492
5493		// start the next in the queue if the last step wasn't forced
5494		if ( !gotoEnd ) {
5495			this.dequeue();
5496		}
5497
5498		return this;
5499	}
5500
5501});
5502
5503// Generate shortcuts for custom animations
5504jQuery.each({
5505	slideDown: genFx("show", 1),
5506	slideUp: genFx("hide", 1),
5507	slideToggle: genFx("toggle", 1),
5508	fadeIn: { opacity: "show" },
5509	fadeOut: { opacity: "hide" }
5510}, function( name, props ) {
5511	jQuery.fn[ name ] = function( speed, callback ) {
5512		return this.animate( props, speed, callback );
5513	};
5514});
5515
5516jQuery.extend({
5517	speed: function( speed, easing, fn ) {
5518		var opt = speed && typeof speed === "object" ? speed : {
5519			complete: fn || !fn && easing ||
5520				jQuery.isFunction( speed ) && speed,
5521			duration: speed,
5522			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
5523		};
5524
5525		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
5526			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
5527
5528		// Queueing
5529		opt.old = opt.complete;
5530		opt.complete = function() {
5531			if ( opt.queue !== false ) {
5532				jQuery(this).dequeue();
5533			}
5534			if ( jQuery.isFunction( opt.old ) ) {
5535				opt.old.call( this );
5536			}
5537		};
5538
5539		return opt;
5540	},
5541
5542	easing: {
5543		linear: function( p, n, firstNum, diff ) {
5544			return firstNum + diff * p;
5545		},
5546		swing: function( p, n, firstNum, diff ) {
5547			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
5548		}
5549	},
5550
5551	timers: [],
5552
5553	fx: function( elem, options, prop ) {
5554		this.options = options;
5555		this.elem = elem;
5556		this.prop = prop;
5557
5558		if ( !options.orig ) {
5559			options.orig = {};
5560		}
5561	}
5562
5563});
5564
5565jQuery.fx.prototype = {
5566	// Simple function for setting a style value
5567	update: function() {
5568		if ( this.options.step ) {
5569			this.options.step.call( this.elem, this.now, this );
5570		}
5571
5572		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
5573
5574		// Set display property to block for height/width animations
5575		if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
5576			this.elem.style.display = "block";
5577		}
5578	},
5579
5580	// Get the current size
5581	cur: function( force ) {
5582		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
5583			return this.elem[ this.prop ];
5584		}
5585
5586		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
5587		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
5588	},
5589
5590	// Start an animation from one number to another
5591	custom: function( from, to, unit ) {
5592		this.startTime = now();
5593		this.start = from;
5594		this.end = to;
5595		this.unit = unit || this.unit || "px";
5596		this.now = this.start;
5597		this.pos = this.state = 0;
5598
5599		var self = this;
5600		function t( gotoEnd ) {
5601			return self.step(gotoEnd);
5602		}
5603
5604		t.elem = this.elem;
5605
5606		if ( t() && jQuery.timers.push(t) && !timerId ) {
5607			timerId = setInterval(jQuery.fx.tick, 13);
5608		}
5609	},
5610
5611	// Simple 'show' function
5612	show: function() {
5613		// Remember where we started, so that we can go back to it later
5614		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5615		this.options.show = true;
5616
5617		// Begin the animation
5618		// Make sure that we start at a small width/height to avoid any
5619		// flash of content
5620		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
5621
5622		// Start by showing the element
5623		jQuery( this.elem ).show();
5624	},
5625
5626	// Simple 'hide' function
5627	hide: function() {
5628		// Remember where we started, so that we can go back to it later
5629		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
5630		this.options.hide = true;
5631
5632		// Begin the animation
5633		this.custom(this.cur(), 0);
5634	},
5635
5636	// Each step of an animation
5637	step: function( gotoEnd ) {
5638		var t = now(), done = true;
5639
5640		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
5641			this.now = this.end;
5642			this.pos = this.state = 1;
5643			this.update();
5644
5645			this.options.curAnim[ this.prop ] = true;
5646
5647			for ( var i in this.options.curAnim ) {
5648				if ( this.options.curAnim[i] !== true ) {
5649					done = false;
5650				}
5651			}
5652
5653			if ( done ) {
5654				if ( this.options.display != null ) {
5655					// Reset the overflow
5656					this.elem.style.overflow = this.options.overflow;
5657
5658					// Reset the display
5659					var old = jQuery.data(this.elem, "olddisplay");
5660					this.elem.style.display = old ? old : this.options.display;
5661
5662					if ( jQuery.css(this.elem, "display") === "none" ) {
5663						this.elem.style.display = "block";
5664					}
5665				}
5666
5667				// Hide the element if the "hide" operation was done
5668				if ( this.options.hide ) {
5669					jQuery(this.elem).hide();
5670				}
5671
5672				// Reset the properties, if the item has been hidden or shown
5673				if ( this.options.hide || this.options.show ) {
5674					for ( var p in this.options.curAnim ) {
5675						jQuery.style(this.elem, p, this.options.orig[p]);
5676					}
5677				}
5678
5679				// Execute the complete function
5680				this.options.complete.call( this.elem );
5681			}
5682
5683			return false;
5684
5685		} else {
5686			var n = t - this.startTime;
5687			this.state = n / this.options.duration;
5688
5689			// Perform the easing function, defaults to swing
5690			var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
5691			var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
5692			this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
5693			this.now = this.start + ((this.end - this.start) * this.pos);
5694
5695			// Perform the next step of the animation
5696			this.update();
5697		}
5698
5699		return true;
5700	}
5701};
5702
5703jQuery.extend( jQuery.fx, {
5704	tick: function() {
5705		var timers = jQuery.timers;
5706
5707		for ( var i = 0; i < timers.length; i++ ) {
5708			if ( !timers[i]() ) {
5709				timers.splice(i--, 1);
5710			}
5711		}
5712
5713		if ( !timers.length ) {
5714			jQuery.fx.stop();
5715		}
5716	},
5717		
5718	stop: function() {
5719		clearInterval( timerId );
5720		timerId = null;
5721	},
5722	
5723	speeds: {
5724		slow: 600,
5725 		fast: 200,
5726 		// Default speed
5727 		_default: 400
5728	},
5729
5730	step: {
5731		opacity: function( fx ) {
5732			jQuery.style(fx.elem, "opacity", fx.now);
5733		},
5734
5735		_default: function( fx ) {
5736			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
5737				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
5738			} else {
5739				fx.elem[ fx.prop ] = fx.now;
5740			}
5741		}
5742	}
5743});
5744
5745if ( jQuery.expr && jQuery.expr.filters ) {
5746	jQuery.expr.filters.animated = function( elem ) {
5747		return jQuery.grep(jQuery.timers, function( fn ) {
5748			return elem === fn.elem;
5749		}).length;
5750	};
5751}
5752
5753function genFx( type, num ) {
5754	var obj = {};
5755
5756	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
5757		obj[ this ] = type;
5758	});
5759
5760	return obj;
5761}
5762if ( "getBoundingClientRect" in document.documentElement ) {
5763	jQuery.fn.offset = function( options ) {
5764		var elem = this[0];
5765
5766		if ( options ) { 
5767			return this.each(function( i ) {
5768				jQuery.offset.setOffset( this, options, i );
5769			});
5770		}
5771
5772		if ( !elem || !elem.ownerDocument ) {
5773			return null;
5774		}
5775
5776		if ( elem === elem.ownerDocument.body ) {
5777			return jQuery.offset.bodyOffset( elem );
5778		}
5779
5780		var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
5781			clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
5782			top  = box.top  + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
5783			left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
5784
5785		return { top: top, left: left };
5786	};
5787
5788} else {
5789	jQuery.fn.offset = function( options ) {
5790		var elem = this[0];
5791
5792		if ( options ) { 
5793			return this.each(function( i ) {
5794				jQuery.offset.setOffset( this, options, i );
5795			});
5796		}
5797
5798		if ( !elem || !elem.ownerDocument ) {
5799			return null;
5800		}
5801
5802		if ( elem === elem.ownerDocument.body ) {
5803			return jQuery.offset.bodyOffset( elem );
5804		}
5805
5806		jQuery.offset.initialize();
5807
5808		var offsetParent = elem.offsetParent, prevOffsetParent = elem,
5809			doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
5810			body = doc.body, defaultView = doc.defaultView,
5811			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
5812			top = elem.offsetTop, left = elem.offsetLeft;
5813
5814		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
5815			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
5816				break;
5817			}
5818
5819			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
5820			top  -= elem.scrollTop;
5821			left -= elem.scrollLeft;
5822
5823			if ( elem === offsetParent ) {
5824				top  += elem.offsetTop;
5825				left += elem.offsetLeft;
5826
5827				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
5828					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
5829					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
5830				}
5831
5832				prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
5833			}
5834
5835			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
5836				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
5837				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
5838			}
5839
5840			prevComputedStyle = computedStyle;
5841		}
5842
5843		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
5844			top  += body.offsetTop;
5845			left += body.offsetLeft;
5846		}
5847
5848		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
5849			top  += Math.max( docElem.scrollTop, body.scrollTop );
5850			left += Math.max( docElem.scrollLeft, body.scrollLeft );
5851		}
5852
5853		return { top: top, left: left };
5854	};
5855}
5856
5857jQuery.offset = {
5858	initialize: function() {
5859		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
5860			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>";
5861
5862		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
5863
5864		container.innerHTML = html;
5865		body.insertBefore( container, body.firstChild );
5866		innerDiv = container.firstChild;
5867		checkDiv = innerDiv.firstChild;
5868		td = innerDiv.nextSibling.firstChild.firstChild;
5869
5870		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
5871		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
5872
5873		checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
5874		// safari subtracts parent border width here which is 5px
5875		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
5876		checkDiv.style.position = checkDiv.style.top = "";
5877
5878		innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
5879		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
5880
5881		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
5882
5883		body.removeChild( container );
5884		body = container = innerDiv = checkDiv = table = td = null;
5885		jQuery.offset.initialize = jQuery.noop;
5886	},
5887
5888	bodyOffset: function( body ) {
5889		var top = body.offsetTop, left = body.offsetLeft;
5890
5891		jQuery.offset.initialize();
5892
5893		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
5894			top  += parseFloat( jQuery.curCSS(body, "marginTop",  true) ) || 0;
5895			left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
5896		}
5897
5898		return { top: top, left: left };
5899	},
5900	
5901	setOffset: function( elem, options, i ) {
5902		// set position first, in-case top/left are set even on static elem
5903		if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
5904			elem.style.position = "relative";
5905		}
5906		var curElem   = jQuery( elem ),
5907			curOffset = curElem.offset(),
5908			curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
5909			curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
5910
5911		if ( jQuery.isFunction( options ) ) {
5912			options = options.call( elem, i, curOffset );
5913		}
5914
5915		var props = {
5916			top:  (options.top  - curOffset.top)  + curTop,
5917			left: (options.left - curOffset.left) + curLeft
5918		};
5919		
5920		if ( "using" in options ) {
5921			options.using.call( elem, props );
5922		} else {
5923			curElem.css( props );
5924		}
5925	}
5926};
5927
5928
5929jQuery.fn.extend({
5930	position: function() {
5931		if ( !this[0] ) {
5932			return null;
5933		}
5934
5935		var elem = this[0],
5936
5937		// Get *real* offsetParent
5938		offsetParent = this.offsetParent(),
5939
5940		// Get correct offsets
5941		offset       = this.offset(),
5942		parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
5943
5944		// Subtract element margins
5945		// note: when an element has margin: auto the offsetLeft and marginLeft
5946		// are the same in Safari causing offset.left to incorrectly be 0
5947		offset.top  -= parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) || 0;
5948		offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
5949
5950		// Add offsetParent borders
5951		parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
5952		parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
5953
5954		// Subtract the two offsets
5955		return {
5956			top:  offset.top  - parentOffset.top,
5957			left: offset.left - parentOffset.left
5958		};
5959	},
5960
5961	offsetParent: function() {
5962		return this.map(function() {
5963			var offsetParent = this.offsetParent || document.body;
5964			while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
5965				offsetParent = offsetParent.offsetParent;
5966			}
5967			return offsetParent;
5968		});
5969	}
5970});
5971
5972
5973// Create scrollLeft and scrollTop methods
5974jQuery.each( ["Left", "Top"], function( i, name ) {
5975	var method = "scroll" + name;
5976
5977	jQuery.fn[ method ] = function(val) {
5978		var elem = this[0], win;
5979		
5980		if ( !elem ) {
5981			return null;
5982		}
5983
5984		if ( val !== undefined ) {
5985			// Set the scroll offset
5986			return this.each(function() {
5987				win = getWindow( this );
5988
5989				if ( win ) {
5990					win.scrollTo(
5991						!i ? val : jQuery(win).scrollLeft(),
5992						 i ? val : jQuery(win).scrollTop()
5993					);
5994
5995				} else {
5996					this[ method ] = val;
5997				}
5998			});
5999		} else {
6000			win = getWindow( elem );
6001
6002			// Return the scroll offset
6003			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
6004				jQuery.support.boxModel && win.document.documentElement[ method ] ||
6005					win.document.body[ method ] :
6006				elem[ method ];
6007		}
6008	};
6009});
6010
6011function getWindow( elem ) {
6012	return ("scrollTo" in elem && elem.document) ?
6013		elem :
6014		elem.nodeType === 9 ?
6015			elem.defaultView || elem.parentWindow :
6016			false;
6017}
6018// Create innerHeight, innerWidth, outerHeight and outerWidth methods
6019jQuery.each([ "Height", "Width" ], function( i, name ) {
6020
6021	var type = name.toLowerCase();
6022
6023	// innerHeight and innerWidth
6024	jQuery.fn["inner" + name] = function() {
6025		return this[0] ?
6026			jQuery.css( this[0], type, false, "padding" ) :
6027			null;
6028	};
6029
6030	// outerHeight and outerWidth
6031	jQuery.fn["outer" + name] = function( margin ) {
6032		return this[0] ?
6033			jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
6034			null;
6035	};
6036
6037	jQuery.fn[ type ] = function( size ) {
6038		// Get window width or height
6039		var elem = this[0];
6040		if ( !elem ) {
6041			return size == null ? null : this;
6042		}
6043		
6044		if ( jQuery.isFunction( size ) ) {
6045			return this.each(function( i ) {
6046				var self = jQuery( this );
6047				self[ type ]( size.call( this, i, self[ type ]() ) );
6048			});
6049		}
6050
6051		return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
6052			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
6053			elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
6054			elem.document.body[ "client" + name ] :
6055
6056			// Get document width or height
6057			(elem.nodeType === 9) ? // is it a document
6058				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
6059				Math.max(
6060					elem.documentElement["client" + name],
6061					elem.body["scroll" + name], elem.documentElement["scroll" + name],
6062					elem.body["offset" + name], elem.documentElement["offset" + name]
6063				) :
6064
6065				// Get or set width or height on the element
6066				size === undefined ?
6067					// Get width or height on the element
6068					jQuery.css( elem, type ) :
6069
6070					// Set the width or height on the element (default to pixels if value is unitless)
6071					this.css( type, typeof size === "string" ? size : size + "px" );
6072	};
6073
6074});
6075// Expose jQuery to the global object
6076window.jQuery = window.$ = jQuery;
6077
6078})(window);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.