PageSourceSearch

https://financing.macjames.ca/js/jquery.js

js macjames.ca collected 2026-10-05 09:35:39 UTC 100,272 bytes, 3,558 lines download raw bytes

1(function(){
2/*
3 * jQuery 1.2.6 - New Wave Javascript
4 *
5 * Copyright (c) 2008 John Resig (jquery.com)
6 * Dual licensed under the MIT (MIT-LICENSE.txt)
7 * and GPL (GPL-LICENSE.txt) licenses.
8 *
9 * $Date: 2008-05-27 21:17:26 +0200 (Di, 27 Mai 2008) $
10 * $Rev: 5700 $
11 */
12
13// Map over jQuery in case of overwrite
14var _jQuery = window.jQuery,
15// Map over the $ in case of overwrite
16	_$ = window.$;
17
18var jQuery = window.jQuery = window.$ = function( selector, context ) {
19	// The jQuery object is actually just the init constructor 'enhanced'
20	return new jQuery.fn.init( selector, context );
21};
22
23// A simple way to check for HTML strings or ID strings
24// (both of which we optimize for)
25var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
26
27// Is it a simple selector
28	isSimple = /^.[^:#\[\.]*$/,
29
30// Will speed up references to undefined, and allows munging its name.
31	undefined;
32
33jQuery.fn = jQuery.prototype = {
34	init: function( selector, context ) {
35		// Make sure that a selection was provided
36		selector = selector || document;
37
38		// Handle $(DOMElement)
39		if ( selector.nodeType ) {
40			this[0] = selector;
41			this.length = 1;
42			return this;
43		}
44		// Handle HTML strings
45		if ( typeof selector == "string" ) {
46			// Are we dealing with HTML string or an ID?
47			var match = quickExpr.exec( selector );
48
49			// Verify a match, and that no context was specified for #id
50			if ( match && (match[1] || !context) ) {
51
52				// HANDLE: $(html) -> $(array)
53				if ( match[1] )
54					selector = jQuery.clean( [ match[1] ], context );
55
56				// HANDLE: $("#id")
57				else {
58					var elem = document.getElementById( match[3] );
59
60					// Make sure an element was located
61					if ( elem ){
62						// Handle the case where IE and Opera return items
63						// by name instead of ID
64						if ( elem.id != match[3] )
65							return jQuery().find( selector );
66
67						// Otherwise, we inject the element directly into the jQuery object
68						return jQuery( elem );
69					}
70					selector = [];
71				}
72
73			// HANDLE: $(expr, [context])
74			// (which is just equivalent to: $(content).find(expr)
75			} else
76				return jQuery( context ).find( selector );
77
78		// HANDLE: $(function)
79		// Shortcut for document ready
80		} else if ( jQuery.isFunction( selector ) )
81			return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
82
83		return this.setArray(jQuery.makeArray(selector));
84	},
85
86	// The current version of jQuery being used
87	jquery: "1.2.6",
88
89	// The number of elements contained in the matched element set
90	size: function() {
91		return this.length;
92	},
93
94	// The number of elements contained in the matched element set
95	length: 0,
96
97	// Get the Nth element in the matched element set OR
98	// Get the whole matched element set as a clean array
99	get: function( num ) {
100		return num == undefined ?
101
102			// Return a 'clean' array
103			jQuery.makeArray( this ) :
104
105			// Return just the object
106			this[ num ];
107	},
108
109	// Take an array of elements and push it onto the stack
110	// (returning the new matched element set)
111	pushStack: function( elems ) {
112		// Build a new jQuery matched element set
113		var ret = jQuery( elems );
114
115		// Add the old object onto the stack (as a reference)
116		ret.prevObject = this;
117
118		// Return the newly-formed element set
119		return ret;
120	},
121
122	// Force the current matched set of elements to become
123	// the specified array of elements (destroying the stack in the process)
124	// You should use pushStack() in order to do this, but maintain the stack
125	setArray: function( elems ) {
126		// Resetting the length to 0, then using the native Array push
127		// is a super-fast way to populate an object with array-like properties
128		this.length = 0;
129		Array.prototype.push.apply( this, elems );
130
131		return this;
132	},
133
134	// Execute a callback for every element in the matched set.
135	// (You can seed the arguments with an array of args, but this is
136	// only used internally.)
137	each: function( callback, args ) {
138		return jQuery.each( this, callback, args );
139	},
140
141	// Determine the position of an element within
142	// the matched set of elements
143	index: function( elem ) {
144		var ret = -1;
145
146		// Locate the position of the desired element
147		return jQuery.inArray(
148			// If it receives a jQuery object, the first element is used
149			elem && elem.jquery ? elem[0] : elem
150		, this );
151	},
152
153	attr: function( name, value, type ) {
154		var options = name;
155
156		// Look for the case where we're accessing a style value
157		if ( name.constructor == String )
158			if ( value === undefined )
159				return this[0] && jQuery[ type || "attr" ]( this[0], name );
160
161			else {
162				options = {};
163				options[ name ] = value;
164			}
165
166		// Check to see if we're setting style values
167		return this.each(function(i){
168			// Set all the styles
169			for ( name in options )
170				jQuery.attr(
171					type ?
172						this.style :
173						this,
174					name, jQuery.prop( this, options[ name ], type, i, name )
175				);
176		});
177	},
178
179	css: function( key, value ) {
180		// ignore negative width and height values
181		if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
182			value = undefined;
183		return this.attr( key, value, "curCSS" );
184	},
185
186	text: function( text ) {
187		if ( typeof text != "object" && text != null )
188			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
189
190		var ret = "";
191
192		jQuery.each( text || this, function(){
193			jQuery.each( this.childNodes, function(){
194				if ( this.nodeType != 8 )
195					ret += this.nodeType != 1 ?
196						this.nodeValue :
197						jQuery.fn.text( [ this ] );
198			});
199		});
200
201		return ret;
202	},
203
204	wrapAll: function( html ) {
205		if ( this[0] )
206			// The elements to wrap the target around
207			jQuery( html, this[0].ownerDocument )
208				.clone()
209				.insertBefore( this[0] )
210				.map(function(){
211					var elem = this;
212
213					while ( elem.firstChild )
214						elem = elem.firstChild;
215
216					return elem;
217				})
218				.append(this);
219
220		return this;
221	},
222
223	wrapInner: function( html ) {
224		return this.each(function(){
225			jQuery( this ).contents().wrapAll( html );
226		});
227	},
228
229	wrap: function( html ) {
230		return this.each(function(){
231			jQuery( this ).wrapAll( html );
232		});
233	},
234
235	append: function() {
236		return this.domManip(arguments, true, false, function(elem){
237			if (this.nodeType == 1)
238				this.appendChild( elem );
239		});
240	},
241
242	prepend: function() {
243		return this.domManip(arguments, true, true, function(elem){
244			if (this.nodeType == 1)
245				this.insertBefore( elem, this.firstChild );
246		});
247	},
248
249	before: function() {
250		return this.domManip(arguments, false, false, function(elem){
251			this.parentNode.insertBefore( elem, this );
252		});
253	},
254
255	after: function() {
256		return this.domManip(arguments, false, true, function(elem){
257			this.parentNode.insertBefore( elem, this.nextSibling );
258		});
259	},
260
261	end: function() {
262		return this.prevObject || jQuery( [] );
263	},
264
265	find: function( selector ) {
266		var elems = jQuery.map(this, function(elem){
267			return jQuery.find( selector, elem );
268		});
269
270		return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
271			jQuery.unique( elems ) :
272			elems );
273	},
274
275	clone: function( events ) {
276		// Do the clone
277		var ret = this.map(function(){
278			if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
279				// IE copies events bound via attachEvent when
280				// using cloneNode. Calling detachEvent on the
281				// clone will also remove the events from the orignal
282				// In order to get around this, we use innerHTML.
283				// Unfortunately, this means some modifications to
284				// attributes in IE that are actually only stored
285				// as properties will not be copied (such as the
286				// the name attribute on an input).
287				var clone = this.cloneNode(true),
288					container = document.createElement("div");
289				container.appendChild(clone);
290				return jQuery.clean([container.innerHTML])[0];
291			} else
292				return this.cloneNode(true);
293		});
294
295		// Need to set the expando to null on the cloned set if it exists
296		// removeData doesn't work here, IE removes it from the original as well
297		// this is primarily for IE but the data expando shouldn't be copied over in any browser
298		var clone = ret.find("*").andSelf().each(function(){
299			if ( this[ expando ] != undefined )
300				this[ expando ] = null;
301		});
302
303		// Copy the events from the original to the clone
304		if ( events === true )
305			this.find("*").andSelf().each(function(i){
306				if (this.nodeType == 3)
307					return;
308				var events = jQuery.data( this, "events" );
309
310				for ( var type in events )
311					for ( var handler in events[ type ] )
312						jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
313			});
314
315		// Return the cloned set
316		return ret;
317	},
318
319	filter: function( selector ) {
320		return this.pushStack(
321			jQuery.isFunction( selector ) &&
322			jQuery.grep(this, function(elem, i){
323				return selector.call( elem, i );
324			}) ||
325
326			jQuery.multiFilter( selector, this ) );
327	},
328
329	not: function( selector ) {
330		if ( selector.constructor == String )
331			// test special case where just one selector is passed in
332			if ( isSimple.test( selector ) )
333				return this.pushStack( jQuery.multiFilter( selector, this, true ) );
334			else
335				selector = jQuery.multiFilter( selector, this );
336
337		var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
338		return this.filter(function() {
339			return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
340		});
341	},
342
343	add: function( selector ) {
344		return this.pushStack( jQuery.unique( jQuery.merge(
345			this.get(),
346			typeof selector == 'string' ?
347				jQuery( selector ) :
348				jQuery.makeArray( selector )
349		)));
350	},
351
352	is: function( selector ) {
353		return !!selector && jQuery.multiFilter( selector, this ).length > 0;
354	},
355
356	hasClass: function( selector ) {
357		return this.is( "." + selector );
358	},
359
360	val: function( value ) {
361		if ( value == undefined ) {
362
363			if ( this.length ) {
364				var elem = this[0];
365
366				// We need to handle select boxes special
367				if ( jQuery.nodeName( elem, "select" ) ) {
368					var index = elem.selectedIndex,
369						values = [],
370						options = elem.options,
371						one = elem.type == "select-one";
372
373					// Nothing was selected
374					if ( index < 0 )
375						return null;
376
377					// Loop through all the selected options
378					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
379						var option = options[ i ];
380
381						if ( option.selected ) {
382							// Get the specifc value for the option
383							value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
384
385							// We don't need an array for one selects
386							if ( one )
387								return value;
388
389							// Multi-Selects return an array
390							values.push( value );
391						}
392					}
393
394					return values;
395
396				// Everything else, we just grab the value
397				} else
398					return (this[0].value || "").replace(/\r/g, "");
399
400			}
401
402			return undefined;
403		}
404
405		if( value.constructor == Number )
406			value += '';
407
408		return this.each(function(){
409			if ( this.nodeType != 1 )
410				return;
411
412			if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
413				this.checked = (jQuery.inArray(this.value, value) >= 0 ||
414					jQuery.inArray(this.name, value) >= 0);
415
416			else if ( jQuery.nodeName( this, "select" ) ) {
417				var values = jQuery.makeArray(value);
418
419				jQuery( "option", this ).each(function(){
420					this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
421						jQuery.inArray( this.text, values ) >= 0);
422				});
423
424				if ( !values.length )
425					this.selectedIndex = -1;
426
427			} else
428				this.value = value;
429		});
430	},
431
432	html: function( value ) {
433		return value == undefined ?
434			(this[0] ?
435				this[0].innerHTML :
436				null) :
437			this.empty().append( value );
438	},
439
440	replaceWith: function( value ) {
441		return this.after( value ).remove();
442	},
443
444	eq: function( i ) {
445		return this.slice( i, i + 1 );
446	},
447
448	slice: function() {
449		return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
450	},
451
452	map: function( callback ) {
453		return this.pushStack( jQuery.map(this, function(elem, i){
454			return callback.call( elem, i, elem );
455		}));
456	},
457
458	andSelf: function() {
459		return this.add( this.prevObject );
460	},
461
462	data: function( key, value ){
463		var parts = key.split(".");
464		parts[1] = parts[1] ? "." + parts[1] : "";
465
466		if ( value === undefined ) {
467			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
468
469			if ( data === undefined && this.length )
470				data = jQuery.data( this[0], key );
471
472			return data === undefined && parts[1] ?
473				this.data( parts[0] ) :
474				data;
475		} else
476			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
477				jQuery.data( this, key, value );
478			});
479	},
480
481	removeData: function( key ){
482		return this.each(function(){
483			jQuery.removeData( this, key );
484		});
485	},
486
487	domManip: function( args, table, reverse, callback ) {
488		var clone = this.length > 1, elems;
489
490		return this.each(function(){
491			if ( !elems ) {
492				elems = jQuery.clean( args, this.ownerDocument );
493
494				if ( reverse )
495					elems.reverse();
496			}
497
498			var obj = this;
499
500			if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
501				obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
502
503			var scripts = jQuery( [] );
504
505			jQuery.each(elems, function(){
506				var elem = clone ?
507					jQuery( this ).clone( true )[0] :
508					this;
509
510				// execute all scripts after the elements have been injected
511				if ( jQuery.nodeName( elem, "script" ) )
512					scripts = scripts.add( elem );
513				else {
514					// Remove any inner scripts for later evaluation
515					if ( elem.nodeType == 1 )
516						scripts = scripts.add( jQuery( "script", elem ).remove() );
517
518					// Inject the elements into the document
519					callback.call( obj, elem );
520				}
521			});
522
523			scripts.each( evalScript );
524		});
525	}
526};
527
528// Give the init function the jQuery prototype for later instantiation
529jQuery.fn.init.prototype = jQuery.fn;
530
531function evalScript( i, elem ) {
532	if ( elem.src )
533		jQuery.ajax({
534			url: elem.src,
535			async: false,
536			dataType: "script"
537		});
538
539	else
540		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
541
542	if ( elem.parentNode )
543		elem.parentNode.removeChild( elem );
544}
545
546function now(){
547	return +new Date;
548}
549
550jQuery.extend = jQuery.fn.extend = function() {
551	// copy reference to target object
552	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
553
554	// Handle a deep copy situation
555	if ( target.constructor == Boolean ) {
556		deep = target;
557		target = arguments[1] || {};
558		// skip the boolean and the target
559		i = 2;
560	}
561
562	// Handle case when target is a string or something (possible in deep copy)
563	if ( typeof target != "object" && typeof target != "function" )
564		target = {};
565
566	// extend jQuery itself if only one argument is passed
567	if ( length == i ) {
568		target = this;
569		--i;
570	}
571
572	for ( ; i < length; i++ )
573		// Only deal with non-null/undefined values
574		if ( (options = arguments[ i ]) != null )
575			// Extend the base object
576			for ( var name in options ) {
577				var src = target[ name ], copy = options[ name ];
578
579				// Prevent never-ending loop
580				if ( target === copy )
581					continue;
582
583				// Recurse if we're merging object values
584				if ( deep && copy && typeof copy == "object" && !copy.nodeType )
585					target[ name ] = jQuery.extend( deep, 
586						// Never move original objects, clone them
587						src || ( copy.length != null ? [ ] : { } )
588					, copy );
589
590				// Don't bring in undefined values
591				else if ( copy !== undefined )
592					target[ name ] = copy;
593
594			}
595
596	// Return the modified object
597	return target;
598};
599
600var expando = "jQuery" + now(), uuid = 0, windowData = {},
601	// exclude the following css properties to add px
602	exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
603	// cache defaultView
604	defaultView = document.defaultView || {};
605
606jQuery.extend({
607	noConflict: function( deep ) {
608		window.$ = _$;
609
610		if ( deep )
611			window.jQuery = _jQuery;
612
613		return jQuery;
614	},
615
616	// See test/unit/core.js for details concerning this function.
617	isFunction: function( fn ) {
618		return !!fn && typeof fn != "string" && !fn.nodeName &&
619			fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
620	},
621
622	// check if an element is in a (or is an) XML document
623	isXMLDoc: function( elem ) {
624		return elem.documentElement && !elem.body ||
625			elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
626	},
627
628	// Evalulates a script in a global context
629	globalEval: function( data ) {
630		data = jQuery.trim( data );
631
632		if ( data ) {
633			// Inspired by code by Andrea Giammarchi
634			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
635			var head = document.getElementsByTagName("head")[0] || document.documentElement,
636				script = document.createElement("script");
637
638			script.type = "text/javascript";
639			if ( jQuery.browser.msie )
640				script.text = data;
641			else
642				script.appendChild( document.createTextNode( data ) );
643
644			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
645			// This arises when a base node is used (#2709).
646			head.insertBefore( script, head.firstChild );
647			head.removeChild( script );
648		}
649	},
650
651	nodeName: function( elem, name ) {
652		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
653	},
654
655	cache: {},
656
657	data: function( elem, name, data ) {
658		elem = elem == window ?
659			windowData :
660			elem;
661
662		var id = elem[ expando ];
663
664		// Compute a unique ID for the element
665		if ( !id )
666			id = elem[ expando ] = ++uuid;
667
668		// Only generate the data cache if we're
669		// trying to access or manipulate it
670		if ( name && !jQuery.cache[ id ] )
671			jQuery.cache[ id ] = {};
672
673		// Prevent overriding the named cache with undefined values
674		if ( data !== undefined )
675			jQuery.cache[ id ][ name ] = data;
676
677		// Return the named cache data, or the ID for the element
678		return name ?
679			jQuery.cache[ id ][ name ] :
680			id;
681	},
682
683	removeData: function( elem, name ) {
684		elem = elem == window ?
685			windowData :
686			elem;
687
688		var id = elem[ expando ];
689
690		// If we want to remove a specific section of the element's data
691		if ( name ) {
692			if ( jQuery.cache[ id ] ) {
693				// Remove the section of cache data
694				delete jQuery.cache[ id ][ name ];
695
696				// If we've removed all the data, remove the element's cache
697				name = "";
698
699				for ( name in jQuery.cache[ id ] )
700					break;
701
702				if ( !name )
703					jQuery.removeData( elem );
704			}
705
706		// Otherwise, we want to remove all of the element's data
707		} else {
708			// Clean up the element expando
709			try {
710				delete elem[ expando ];
711			} catch(e){
712				// IE has trouble directly removing the expando
713				// but it's ok with using removeAttribute
714				if ( elem.removeAttribute )
715					elem.removeAttribute( expando );
716			}
717
718			// Completely remove the data cache
719			delete jQuery.cache[ id ];
720		}
721	},
722
723	// args is for internal usage only
724	each: function( object, callback, args ) {
725		var name, i = 0, length = object.length;
726
727		if ( args ) {
728			if ( length == undefined ) {
729				for ( name in object )
730					if ( callback.apply( object[ name ], args ) === false )
731						break;
732			} else
733				for ( ; i < length; )
734					if ( callback.apply( object[ i++ ], args ) === false )
735						break;
736
737		// A special, fast, case for the most common use of each
738		} else {
739			if ( length == undefined ) {
740				for ( name in object )
741					if ( callback.call( object[ name ], name, object[ name ] ) === false )
742						break;
743			} else
744				for ( var value = object[0];
745					i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
746		}
747
748		return object;
749	},
750
751	prop: function( elem, value, type, i, name ) {
752		// Handle executable functions
753		if ( jQuery.isFunction( value ) )
754			value = value.call( elem, i );
755
756		// Handle passing in a number to a CSS property
757		return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
758			value + "px" :
759			value;
760	},
761
762	className: {
763		// internal only, use addClass("class")
764		add: function( elem, classNames ) {
765			jQuery.each((classNames || "").split(/\s+/), function(i, className){
766				if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
767					elem.className += (elem.className ? " " : "") + className;
768			});
769		},
770
771		// internal only, use removeClass("class")
772		remove: function( elem, classNames ) {
773			if (elem.nodeType == 1)
774				elem.className = classNames != undefined ?
775					jQuery.grep(elem.className.split(/\s+/), function(className){
776						return !jQuery.className.has( classNames, className );
777					}).join(" ") :
778					"";
779		},
780
781		// internal only, use hasClass("class")
782		has: function( elem, className ) {
783			return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
784		}
785	},
786
787	// A method for quickly swapping in/out CSS properties to get correct calculations
788	swap: function( elem, options, callback ) {
789		var old = {};
790		// Remember the old values, and insert the new ones
791		for ( var name in options ) {
792			old[ name ] = elem.style[ name ];
793			elem.style[ name ] = options[ name ];
794		}
795
796		callback.call( elem );
797
798		// Revert the old values
799		for ( var name in options )
800			elem.style[ name ] = old[ name ];
801	},
802
803	css: function( elem, name, force ) {
804		if ( name == "width" || name == "height" ) {
805			var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
806
807			function getWH() {
808				val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
809				var padding = 0, border = 0;
810				jQuery.each( which, function() {
811					padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
812					border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
813				});
814				val -= Math.round(padding + border);
815			}
816
817			if ( jQuery(elem).is(":visible") )
818				getWH();
819			else
820				jQuery.swap( elem, props, getWH );
821
822			return Math.max(0, val);
823		}
824
825		return jQuery.curCSS( elem, name, force );
826	},
827
828	curCSS: function( elem, name, force ) {
829		var ret, style = elem.style;
830
831		// A helper method for determining if an element's values are broken
832		function color( elem ) {
833			if ( !jQuery.browser.safari )
834				return false;
835
836			// defaultView is cached
837			var ret = defaultView.getComputedStyle( elem, null );
838			return !ret || ret.getPropertyValue("color") == "";
839		}
840
841		// We need to handle opacity special in IE
842		if ( name == "opacity" && jQuery.browser.msie ) {
843			ret = jQuery.attr( style, "opacity" );
844
845			return ret == "" ?
846				"1" :
847				ret;
848		}
849		// Opera sometimes will give the wrong display answer, this fixes it, see #2037
850		if ( jQuery.browser.opera && name == "display" ) {
851			var save = style.outline;
852			style.outline = "0 solid black";
853			style.outline = save;
854		}
855
856		// Make sure we're using the right name for getting the float value
857		if ( name.match( /float/i ) )
858			name = styleFloat;
859
860		if ( !force && style && style[ name ] )
861			ret = style[ name ];
862
863		else if ( defaultView.getComputedStyle ) {
864
865			// Only "float" is needed here
866			if ( name.match( /float/i ) )
867				name = "float";
868
869			name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
870
871			var computedStyle = defaultView.getComputedStyle( elem, null );
872
873			if ( computedStyle && !color( elem ) )
874				ret = computedStyle.getPropertyValue( name );
875
876			// If the element isn't reporting its values properly in Safari
877			// then some display: none elements are involved
878			else {
879				var swap = [], stack = [], a = elem, i = 0;
880
881				// Locate all of the parent display: none elements
882				for ( ; a && color(a); a = a.parentNode )
883					stack.unshift(a);
884
885				// Go through and make them visible, but in reverse
886				// (It would be better if we knew the exact display type that they had)
887				for ( ; i < stack.length; i++ )
888					if ( color( stack[ i ] ) ) {
889						swap[ i ] = stack[ i ].style.display;
890						stack[ i ].style.display = "block";
891					}
892
893				// Since we flip the display style, we have to handle that
894				// one special, otherwise get the value
895				ret = name == "display" && swap[ stack.length - 1 ] != null ?
896					"none" :
897					( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
898
899				// Finally, revert the display styles back
900				for ( i = 0; i < swap.length; i++ )
901					if ( swap[ i ] != null )
902						stack[ i ].style.display = swap[ i ];
903			}
904
905			// We should always get a number back from opacity
906			if ( name == "opacity" && ret == "" )
907				ret = "1";
908
909		} else if ( elem.currentStyle ) {
910			var camelCase = name.replace(/\-(\w)/g, function(all, letter){
911				return letter.toUpperCase();
912			});
913
914			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
915
916			// From the awesome hack by Dean Edwards
917			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
918
919			// If we're not dealing with a regular pixel number
920			// but a number that has a weird ending, we need to convert it to pixels
921			if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
922				// Remember the original values
923				var left = style.left, rsLeft = elem.runtimeStyle.left;
924
925				// Put in the new values to get a computed value out
926				elem.runtimeStyle.left = elem.currentStyle.left;
927				style.left = ret || 0;
928				ret = style.pixelLeft + "px";
929
930				// Revert the changed values
931				style.left = left;
932				elem.runtimeStyle.left = rsLeft;
933			}
934		}
935
936		return ret;
937	},
938
939	clean: function( elems, context ) {
940		var ret = [];
941		context = context || document;
942		// !context.createElement fails in IE with an error but returns typeof 'object'
943		if (typeof context.createElement == 'undefined')
944			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
945
946		jQuery.each(elems, function(i, elem){
947			if ( !elem )
948				return;
949
950			if ( elem.constructor == Number )
951				elem += '';
952
953			// Convert html string into DOM nodes
954			if ( typeof elem == "string" ) {
955				// Fix "XHTML"-style tags in all browsers
956				elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
957					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
958						all :
959						front + "></" + tag + ">";
960				});
961
962				// Trim whitespace, otherwise indexOf won't work as expected
963				var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
964
965				var wrap =
966					// option or optgroup
967					!tags.indexOf("<opt") &&
968					[ 1, "<select multiple='multiple'>", "</select>" ] ||
969
970					!tags.indexOf("<leg") &&
971					[ 1, "<fieldset>", "</fieldset>" ] ||
972
973					tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
974					[ 1, "<table>", "</table>" ] ||
975
976					!tags.indexOf("<tr") &&
977					[ 2, "<table><tbody>", "</tbody></table>" ] ||
978
979				 	// <thead> matched above
980					(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
981					[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
982
983					!tags.indexOf("<col") &&
984					[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
985
986					// IE can't serialize <link> and <script> tags normally
987					jQuery.browser.msie &&
988					[ 1, "div<div>", "</div>" ] ||
989
990					[ 0, "", "" ];
991
992				// Go to html and back, then peel off extra wrappers
993				div.innerHTML = wrap[1] + elem + wrap[2];
994
995				// Move to the right depth
996				while ( wrap[0]-- )
997					div = div.lastChild;
998
999				// Remove IE's autoinserted <tbody> from table fragments
1000				if ( jQuery.browser.msie ) {
1001
1002					// String was a <table>, *may* have spurious <tbody>
1003					var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
1004						div.firstChild && div.firstChild.childNodes :
1005
1006						// String was a bare <thead> or <tfoot>
1007						wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
1008							div.childNodes :
1009							[];
1010
1011					for ( var j = tbody.length - 1; j >= 0 ; --j )
1012						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
1013							tbody[ j ].parentNode.removeChild( tbody[ j ] );
1014
1015					// IE completely kills leading whitespace when innerHTML is used
1016					if ( /^\s/.test( elem ) )
1017						div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
1018
1019				}
1020
1021				elem = jQuery.makeArray( div.childNodes );
1022			}
1023
1024			if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
1025				return;
1026
1027			if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
1028				ret.push( elem );
1029
1030			else
1031				ret = jQuery.merge( ret, elem );
1032
1033		});
1034
1035		return ret;
1036	},
1037
1038	attr: function( elem, name, value ) {
1039		// don't set attributes on text and comment nodes
1040		if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
1041			return undefined;
1042
1043		var notxml = !jQuery.isXMLDoc( elem ),
1044			// Whether we are setting (or getting)
1045			set = value !== undefined,
1046			msie = jQuery.browser.msie;
1047
1048		// Try to normalize/fix the name
1049		name = notxml && jQuery.props[ name ] || name;
1050
1051		// Only do all the following if this is a node (faster for style)
1052		// IE elem.getAttribute passes even for style
1053		if ( elem.tagName ) {
1054
1055			// These attributes require special treatment
1056			var special = /href|src|style/.test( name );
1057
1058			// Safari mis-reports the default selected property of a hidden option
1059			// Accessing the parent's selectedIndex property fixes it
1060			if ( name == "selected" && jQuery.browser.safari )
1061				elem.parentNode.selectedIndex;
1062
1063			// If applicable, access the attribute via the DOM 0 way
1064			if ( name in elem && notxml && !special ) {
1065				if ( set ){
1066					// We can't allow the type property to be changed (since it causes problems in IE)
1067					if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
1068						throw "type property can't be changed";
1069
1070					elem[ name ] = value;
1071				}
1072
1073				// browsers index elements by id/name on forms, give priority to attributes.
1074				if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
1075					return elem.getAttributeNode( name ).nodeValue;
1076
1077				return elem[ name ];
1078			}
1079
1080			if ( msie && notxml &&  name == "style" )
1081				return jQuery.attr( elem.style, "cssText", value );
1082
1083			if ( set )
1084				// convert the value to a string (all browsers do this but IE) see #1070
1085				elem.setAttribute( name, "" + value );
1086
1087			var attr = msie && notxml && special
1088					// Some attributes require a special call on IE
1089					? elem.getAttribute( name, 2 )
1090					: elem.getAttribute( name );
1091
1092			// Non-existent attributes return null, we normalize to undefined
1093			return attr === null ? undefined : attr;
1094		}
1095
1096		// elem is actually elem.style ... set the style
1097
1098		// IE uses filters for opacity
1099		if ( msie && name == "opacity" ) {
1100			if ( set ) {
1101				// IE has trouble with opacity if it does not have layout
1102				// Force it by setting the zoom level
1103				elem.zoom = 1;
1104
1105				// Set the alpha filter to set the opacity
1106				elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
1107					(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
1108			}
1109
1110			return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
1111				(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
1112				"";
1113		}
1114
1115		name = name.replace(/-([a-z])/ig, function(all, letter){
1116			return letter.toUpperCase();
1117		});
1118
1119		if ( set )
1120			elem[ name ] = value;
1121
1122		return elem[ name ];
1123	},
1124
1125	trim: function( text ) {
1126		return (text || "").replace( /^\s+|\s+$/g, "" );
1127	},
1128
1129	makeArray: function( array ) {
1130		var ret = [];
1131
1132		if( array != null ){
1133			var i = array.length;
1134			//the window, strings and functions also have 'length'
1135			if( i == null || array.split || array.setInterval || array.call )
1136				ret[0] = array;
1137			else
1138				while( i )
1139					ret[--i] = array[i];
1140		}
1141
1142		return ret;
1143	},
1144
1145	inArray: function( elem, array ) {
1146		for ( var i = 0, length = array.length; i < length; i++ )
1147		// Use === because on IE, window == document
1148			if ( array[ i ] === elem )
1149				return i;
1150
1151		return -1;
1152	},
1153
1154	merge: function( first, second ) {
1155		// We have to loop this way because IE & Opera overwrite the length
1156		// expando of getElementsByTagName
1157		var i = 0, elem, pos = first.length;
1158		// Also, we need to make sure that the correct elements are being returned
1159		// (IE returns comment nodes in a '*' query)
1160		if ( jQuery.browser.msie ) {
1161			while ( elem = second[ i++ ] )
1162				if ( elem.nodeType != 8 )
1163					first[ pos++ ] = elem;
1164
1165		} else
1166			while ( elem = second[ i++ ] )
1167				first[ pos++ ] = elem;
1168
1169		return first;
1170	},
1171
1172	unique: function( array ) {
1173		var ret = [], done = {};
1174
1175		try {
1176
1177			for ( var i = 0, length = array.length; i < length; i++ ) {
1178				var id = jQuery.data( array[ i ] );
1179
1180				if ( !done[ id ] ) {
1181					done[ id ] = true;
1182					ret.push( array[ i ] );
1183				}
1184			}
1185
1186		} catch( e ) {
1187			ret = array;
1188		}
1189
1190		return ret;
1191	},
1192
1193	grep: function( elems, callback, inv ) {
1194		var ret = [];
1195
1196		// Go through the array, only saving the items
1197		// that pass the validator function
1198		for ( var i = 0, length = elems.length; i < length; i++ )
1199			if ( !inv != !callback( elems[ i ], i ) )
1200				ret.push( elems[ i ] );
1201
1202		return ret;
1203	},
1204
1205	map: function( elems, callback ) {
1206		var ret = [];
1207
1208		// Go through the array, translating each of the items to their
1209		// new value (or values).
1210		for ( var i = 0, length = elems.length; i < length; i++ ) {
1211			var value = callback( elems[ i ], i );
1212
1213			if ( value != null )
1214				ret[ ret.length ] = value;
1215		}
1216
1217		return ret.concat.apply( [], ret );
1218	}
1219});
1220
1221var userAgent = navigator.userAgent.toLowerCase();
1222
1223// Figure out what browser is being used
1224jQuery.browser = {
1225	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
1226	safari: /webkit/.test( userAgent ),
1227	opera: /opera/.test( userAgent ),
1228	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
1229	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
1230};
1231
1232var styleFloat = jQuery.browser.msie ?
1233	"styleFloat" :
1234	"cssFloat";
1235
1236jQuery.extend({
1237	// Check to see if the W3C box model is being used
1238	boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
1239
1240	props: {
1241		"for": "htmlFor",
1242		"class": "className",
1243		"float": styleFloat,
1244		cssFloat: styleFloat,
1245		styleFloat: styleFloat,
1246		readonly: "readOnly",
1247		maxlength: "maxLength",
1248		cellspacing: "cellSpacing",
1249		rowspan: "rowSpan"
1250	}
1251});
1252
1253jQuery.each({
1254	parent: function(elem){return elem.parentNode;},
1255	parents: function(elem){return jQuery.dir(elem,"parentNode");},
1256	next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
1257	prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
1258	nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
1259	prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
1260	siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
1261	children: function(elem){return jQuery.sibling(elem.firstChild);},
1262	contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
1263}, function(name, fn){
1264	jQuery.fn[ name ] = function( selector ) {
1265		var ret = jQuery.map( this, fn );
1266
1267		if ( selector && typeof selector == "string" )
1268			ret = jQuery.multiFilter( selector, ret );
1269
1270		return this.pushStack( jQuery.unique( ret ) );
1271	};
1272});
1273
1274jQuery.each({
1275	appendTo: "append",
1276	prependTo: "prepend",
1277	insertBefore: "before",
1278	insertAfter: "after",
1279	replaceAll: "replaceWith"
1280}, function(name, original){
1281	jQuery.fn[ name ] = function() {
1282		var args = arguments;
1283
1284		return this.each(function(){
1285			for ( var i = 0, length = args.length; i < length; i++ )
1286				jQuery( args[ i ] )[ original ]( this );
1287		});
1288	};
1289});
1290
1291jQuery.each({
1292	removeAttr: function( name ) {
1293		jQuery.attr( this, name, "" );
1294		if (this.nodeType == 1)
1295			this.removeAttribute( name );
1296	},
1297
1298	addClass: function( classNames ) {
1299		jQuery.className.add( this, classNames );
1300	},
1301
1302	removeClass: function( classNames ) {
1303		jQuery.className.remove( this, classNames );
1304	},
1305
1306	toggleClass: function( classNames ) {
1307		jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );
1308	},
1309
1310	remove: function( selector ) {
1311		if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
1312			// Prevent memory leaks
1313			jQuery( "*", this ).add(this).each(function(){
1314				jQuery.event.remove(this);
1315				jQuery.removeData(this);
1316			});
1317			if (this.parentNode)
1318				this.parentNode.removeChild( this );
1319		}
1320	},
1321
1322	empty: function() {
1323		// Remove element nodes and prevent memory leaks
1324		jQuery( ">*", this ).remove();
1325
1326		// Remove any remaining nodes
1327		while ( this.firstChild )
1328			this.removeChild( this.firstChild );
1329	}
1330}, function(name, fn){
1331	jQuery.fn[ name ] = function(){
1332		return this.each( fn, arguments );
1333	};
1334});
1335
1336jQuery.each([ "Height", "Width" ], function(i, name){
1337	var type = name.toLowerCase();
1338
1339	jQuery.fn[ type ] = function( size ) {
1340		// Get window width or height
1341		return this[0] == window ?
1342			// Opera reports document.body.client[Width/Height] properly in both quirks and standards
1343			jQuery.browser.opera && document.body[ "client" + name ] ||
1344
1345			// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
1346			jQuery.browser.safari && window[ "inner" + name ] ||
1347
1348			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
1349			document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
1350
1351			// Get document width or height
1352			this[0] == document ?
1353				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
1354				Math.max(
1355					Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
1356					Math.max(document.body["offset" + name], document.documentElement["offset" + name])
1357				) :
1358
1359				// Get or set width or height on the element
1360				size == undefined ?
1361					// Get width or height on the element
1362					(this.length ? jQuery.css( this[0], type ) : null) :
1363
1364					// Set the width or height on the element (default to pixels if value is unitless)
1365					this.css( type, size.constructor == String ? size : size + "px" );
1366	};
1367});
1368
1369// Helper function used by the dimensions and offset modules
1370function num(elem, prop) {
1371	return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
1372}
1372var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
1373		"(?:[\\w*_-]|\\\\.)" :
1374		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
1375	quickChild = new RegExp("^>\\s*(" + chars + "+)"),
1376	quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
1377	quickClass = new RegExp("^([#.]?)(" + chars + "*)");
1378
1379jQuery.extend({
1380	expr: {
1381		"": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},
1382		"#": function(a,i,m){return a.getAttribute("id")==m[2];},
1383		":": {
1384			// Position Checks
1385			lt: function(a,i,m){return i<m[3]-0;},
1386			gt: function(a,i,m){return i>m[3]-0;},
1387			nth: function(a,i,m){return m[3]-0==i;},
1388			eq: function(a,i,m){return m[3]-0==i;},
1389			first: function(a,i){return i==0;},
1390			last: function(a,i,m,r){return i==r.length-1;},
1391			even: function(a,i){return i%2==0;},
1392			odd: function(a,i){return i%2;},
1393
1394			// Child Checks
1395			"first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},
1396			"last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},
1397			"only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},
1398
1399			// Parent Checks
1400			parent: function(a){return a.firstChild;},
1401			empty: function(a){return !a.firstChild;},
1402
1403			// Text Check
1404			contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},
1405
1406			// Visibility
1407			visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},
1408			hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},
1409
1410			// Form attributes
1411			enabled: function(a){return !a.disabled;},
1412			disabled: function(a){return a.disabled;},
1413			checked: function(a){return a.checked;},
1414			selected: function(a){return a.selected||jQuery.attr(a,"selected");},
1415
1416			// Form elements
1417			text: function(a){return "text"==a.type;},
1418			radio: function(a){return "radio"==a.type;},
1419			checkbox: function(a){return "checkbox"==a.type;},
1420			file: function(a){return "file"==a.type;},
1421			password: function(a){return "password"==a.type;},
1422			submit: function(a){return "submit"==a.type;},
1423			image: function(a){return "image"==a.type;},
1424			reset: function(a){return "reset"==a.type;},
1425			button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},
1426			input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},
1427
1428			// :has()
1429			has: function(a,i,m){return jQuery.find(m[3],a).length;},
1430
1431			// :header
1432			header: function(a){return /h\d/i.test(a.nodeName);},
1433
1434			// :animated
1435			animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}
1436		}
1437	},
1438
1439	// The regular expressions that power the parsing engine
1440	parse: [
1441		// Match: [@value='test'], [@foo]
1442		/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
1443
1444		// Match: :contains('foo')
1445		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
1446
1447		// Match: :even, :last-child, #id, .class
1448		new RegExp("^([:.#]*)(" + chars + "+)")
1449	],
1450
1451	multiFilter: function( expr, elems, not ) {
1452		var old, cur = [];
1453
1454		while ( expr && expr != old ) {
1455			old = expr;
1456			var f = jQuery.filter( expr, elems, not );
1457			expr = f.t.replace(/^\s*,\s*/, "" );
1458			cur = not ? elems = f.r : jQuery.merge( cur, f.r );
1459		}
1460
1461		return cur;
1462	},
1463
1464	find: function( t, context ) {
1465		// Quickly handle non-string expressions
1466		if ( typeof t != "string" )
1467			return [ t ];
1468
1469		// check to make sure context is a DOM element or a document
1470		if ( context && context.nodeType != 1 && context.nodeType != 9)
1471			return [ ];
1472
1473		// Set the correct context (if none is provided)
1474		context = context || document;
1475
1476		// Initialize the search
1477		var ret = [context], done = [], last, nodeName;
1478
1479		// Continue while a selector expression exists, and while
1480		// we're no longer looping upon ourselves
1481		while ( t && last != t ) {
1482			var r = [];
1483			last = t;
1484
1485			t = jQuery.trim(t);
1486
1487			var foundToken = false,
1488
1489			// An attempt at speeding up child selectors that
1490			// point to a specific element tag
1491				re = quickChild,
1492
1493				m = re.exec(t);
1494
1495			if ( m ) {
1496				nodeName = m[1].toUpperCase();
1497
1498				// Perform our own iteration and filter
1499				for ( var i = 0; ret[i]; i++ )
1500					for ( var c = ret[i].firstChild; c; c = c.nextSibling )
1501						if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
1502							r.push( c );
1503
1504				ret = r;
1505				t = t.replace( re, "" );
1506				if ( t.indexOf(" ") == 0 ) continue;
1507				foundToken = true;
1508			} else {
1509				re = /^([>+~])\s*(\w*)/i;
1510
1511				if ( (m = re.exec(t)) != null ) {
1512					r = [];
1513
1514					var merge = {};
1515					nodeName = m[2].toUpperCase();
1516					m = m[1];
1517
1518					for ( var j = 0, rl = ret.length; j < rl; j++ ) {
1519						var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
1520						for ( ; n; n = n.nextSibling )
1521							if ( n.nodeType == 1 ) {
1522								var id = jQuery.data(n);
1523
1524								if ( m == "~" && merge[id] ) break;
1525
1526								if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
1527									if ( m == "~" ) merge[id] = true;
1528									r.push( n );
1529								}
1530
1531								if ( m == "+" ) break;
1532							}
1533					}
1534
1535					ret = r;
1536
1537					// And remove the token
1538					t = jQuery.trim( t.replace( re, "" ) );
1539					foundToken = true;
1540				}
1541			}
1542
1543			// See if there's still an expression, and that we haven't already
1544			// matched a token
1545			if ( t && !foundToken ) {
1546				// Handle multiple expressions
1547				if ( !t.indexOf(",") ) {
1548					// Clean the result set
1549					if ( context == ret[0] ) ret.shift();
1550
1551					// Merge the result sets
1552					done = jQuery.merge( done, ret );
1553
1554					// Reset the context
1555					r = ret = [context];
1556
1557					// Touch up the selector string
1558					t = " " + t.substr(1,t.length);
1559
1560				} else {
1561					// Optimize for the case nodeName#idName
1562					var re2 = quickID;
1563					var m = re2.exec(t);
1564
1565					// Re-organize the results, so that they're consistent
1566					if ( m ) {
1567						m = [ 0, m[2], m[3], m[1] ];
1568
1569					} else {
1570						// Otherwise, do a traditional filter check for
1571						// ID, class, and element selectors
1572						re2 = quickClass;
1573						m = re2.exec(t);
1574					}
1575
1576					m[2] = m[2].replace(/\\/g, "");
1577
1578					var elem = ret[ret.length-1];
1579
1580					// Try to do a global search by ID, where we can
1581					if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
1582						// Optimization for HTML document case
1583						var oid = elem.getElementById(m[2]);
1584
1585						// Do a quick check for the existence of the actual ID attribute
1586						// to avoid selecting by the name attribute in IE
1587						// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
1588						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
1589							oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
1590
1591						// Do a quick check for node name (where applicable) so
1592						// that div#foo searches will be really fast
1593						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
1594					} else {
1595						// We need to find all descendant elements
1596						for ( var i = 0; ret[i]; i++ ) {
1597							// Grab the tag name being searched for
1598							var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
1599
1600							// Handle IE7 being really dumb about <object>s
1601							if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
1602								tag = "param";
1603
1604							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
1605						}
1606
1607						// It's faster to filter by class and be done with it
1608						if ( m[1] == "." )
1609							r = jQuery.classFilter( r, m[2] );
1610
1611						// Same with ID filtering
1612						if ( m[1] == "#" ) {
1613							var tmp = [];
1614
1615							// Try to find the element with the ID
1616							for ( var i = 0; r[i]; i++ )
1617								if ( r[i].getAttribute("id") == m[2] ) {
1618									tmp = [ r[i] ];
1619									break;
1620								}
1621
1622							r = tmp;
1623						}
1624
1625						ret = r;
1626					}
1627
1628					t = t.replace( re2, "" );
1629				}
1630
1631			}
1632
1633			// If a selector string still exists
1634			if ( t ) {
1635				// Attempt to filter it
1636				var val = jQuery.filter(t,r);
1637				ret = r = val.r;
1638				t = jQuery.trim(val.t);
1639			}
1640		}
1641
1642		// An error occurred with the selector;
1643		// just return an empty set instead
1644		if ( t )
1645			ret = [];
1646
1647		// Remove the root context
1648		if ( ret && context == ret[0] )
1649			ret.shift();
1650
1651		// And combine the results
1652		done = jQuery.merge( done, ret );
1653
1654		return done;
1655	},
1656
1657	classFilter: function(r,m,not){
1658		m = " " + m + " ";
1659		var tmp = [];
1660		for ( var i = 0; r[i]; i++ ) {
1661			var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
1662			if ( !not && pass || not && !pass )
1663				tmp.push( r[i] );
1664		}
1665		return tmp;
1666	},
1667
1668	filter: function(t,r,not) {
1669		var last;
1670
1671		// Look for common filter expressions
1672		while ( t && t != last ) {
1673			last = t;
1674
1675			var p = jQuery.parse, m;
1676
1677			for ( var i = 0; p[i]; i++ ) {
1678				m = p[i].exec( t );
1679
1680				if ( m ) {
1681					// Remove what we just matched
1682					t = t.substring( m[0].length );
1683
1684					m[2] = m[2].replace(/\\/g, "");
1685					break;
1686				}
1687			}
1688
1689			if ( !m )
1690				break;
1691
1692			// :not() is a special case that can be optimized by
1693			// keeping it out of the expression list
1694			if ( m[1] == ":" && m[2] == "not" )
1695				// optimize if only one selector found (most common case)
1696				r = isSimple.test( m[3] ) ?
1697					jQuery.filter(m[3], r, true).r :
1698					jQuery( r ).not( m[3] );
1699
1700			// We can get a big speed boost by filtering by class here
1701			else if ( m[1] == "." )
1702				r = jQuery.classFilter(r, m[2], not);
1703
1704			else if ( m[1] == "[" ) {
1705				var tmp = [], type = m[3];
1706
1707				for ( var i = 0, rl = r.length; i < rl; i++ ) {
1708					var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
1709
1710					if ( z == null || /href|src|selected/.test(m[2]) )
1711						z = jQuery.attr(a,m[2]) || '';
1712
1713					if ( (type == "" && !!z ||
1714						 type == "=" && z == m[5] ||
1715						 type == "!=" && z != m[5] ||
1716						 type == "^=" && z && !z.indexOf(m[5]) ||
1717						 type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
1718						 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
1719							tmp.push( a );
1720				}
1721
1722				r = tmp;
1723
1724			// We can get a speed boost by handling nth-child here
1725			} else if ( m[1] == ":" && m[2] == "nth-child" ) {
1726				var merge = {}, tmp = [],
1727					// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
1728					test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
1729						m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
1730						!/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
1731					// calculate the numbers (first)n+(last) including if they are negative
1732					first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
1733
1734				// loop through all the elements left in the jQuery object
1735				for ( var i = 0, rl = r.length; i < rl; i++ ) {
1736					var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
1737
1738					if ( !merge[id] ) {
1739						var c = 1;
1740
1741						for ( var n = parentNode.firstChild; n; n = n.nextSibling )
1742							if ( n.nodeType == 1 )
1743								n.nodeIndex = c++;
1744
1745						merge[id] = true;
1746					}
1747
1748					var add = false;
1749
1750					if ( first == 0 ) {
1751						if ( node.nodeIndex == last )
1752							add = true;
1753					} else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
1754						add = true;
1755
1756					if ( add ^ not )
1757						tmp.push( node );
1758				}
1759
1760				r = tmp;
1761
1762			// Otherwise, find the expression to execute
1763			} else {
1764				var fn = jQuery.expr[ m[1] ];
1765				if ( typeof fn == "object" )
1766					fn = fn[ m[2] ];
1767
1768				if ( typeof fn == "string" )
1769					fn = eval("false||function(a,i){return " + fn + ";}");
1770
1771				// Execute it against the current filter
1772				r = jQuery.grep( r, function(elem, i){
1773					return fn(elem, i, m, r);
1774				}, not );
1775			}
1776		}
1777
1778		// Return an array of filtered elements (r)
1779		// and the modified expression string (t)
1780		return { r: r, t: t };
1781	},
1782
1783	dir: function( elem, dir ){
1784		var matched = [],
1785			cur = elem[dir];
1786		while ( cur && cur != document ) {
1787			if ( cur.nodeType == 1 )
1788				matched.push( cur );
1789			cur = cur[dir];
1790		}
1791		return matched;
1792	},
1793
1794	nth: function(cur,result,dir,elem){
1795		result = result || 1;
1796		var num = 0;
1797
1798		for ( ; cur; cur = cur[dir] )
1799			if ( cur.nodeType == 1 && ++num == result )
1800				break;
1801
1802		return cur;
1803	},
1804
1805	sibling: function( n, elem ) {
1806		var r = [];
1807
1808		for ( ; n; n = n.nextSibling ) {
1809			if ( n.nodeType == 1 && n != elem )
1810				r.push( n );
1811		}
1812
1813		return r;
1814	}
1815});
1816/*
1817 * A number of helper functions used for managing events.
1818 * Many of the ideas behind this code orignated from
1819 * Dean Edwards' addEvent library.
1820 */
1821jQuery.event = {
1822
1823	// Bind an event to an element
1824	// Original by Dean Edwards
1825	add: function(elem, types, handler, data) {
1826		if ( elem.nodeType == 3 || elem.nodeType == 8 )
1827			return;
1828
1829		// For whatever reason, IE has trouble passing the window object
1830		// around, causing it to be cloned in the process
1831		if ( jQuery.browser.msie && elem.setInterval )
1832			elem = window;
1833
1834		// Make sure that the function being executed has a unique ID
1835		if ( !handler.guid )
1836			handler.guid = this.guid++;
1837
1838		// if data is passed, bind to handler
1839		if( data != undefined ) {
1840			// Create temporary function pointer to original handler
1841			var fn = handler;
1842
1843			// Create unique handler function, wrapped around original handler
1844			handler = this.proxy( fn, function() {
1845				// Pass arguments and context to original handler
1846				return fn.apply(this, arguments);
1847			});
1848
1849			// Store data in unique handler
1850			handler.data = data;
1851		}
1852
1853		// Init the element's event structure
1854		var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
1855			handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
1856				// Handle the second event of a trigger and when
1857				// an event is called after a page has unloaded
1858				if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
1859					return jQuery.event.handle.apply(arguments.callee.elem, arguments);
1860			});
1861		// Add elem as a property of the handle function
1862		// This is to prevent a memory leak with non-native
1863		// event in IE.
1864		handle.elem = elem;
1865
1866		// Handle multiple events separated by a space
1867		// jQuery(...).bind("mouseover mouseout", fn);
1868		jQuery.each(types.split(/\s+/), function(index, type) {
1869			// Namespaced event handlers
1870			var parts = type.split(".");
1871			type = parts[0];
1872			handler.type = parts[1];
1873
1874			// Get the current list of functions bound to this event
1875			var handlers = events[type];
1876
1877			// Init the event handler queue
1878			if (!handlers) {
1879				handlers = events[type] = {};
1880
1881				// Check for a special event handler
1882				// Only use addEventListener/attachEvent if the special
1883				// events handler returns false
1884				if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
1885					// Bind the global event handler to the element
1886					if (elem.addEventListener)
1887						elem.addEventListener(type, handle, false);
1888					else if (elem.attachEvent)
1889						elem.attachEvent("on" + type, handle);
1890				}
1891			}
1892
1893			// Add the function to the element's handler list
1894			handlers[handler.guid] = handler;
1895
1896			// Keep track of which events have been used, for global triggering
1897			jQuery.event.global[type] = true;
1898		});
1899
1900		// Nullify elem to prevent memory leaks in IE
1901		elem = null;
1902	},
1903
1904	guid: 1,
1905	global: {},
1906
1907	// Detach an event or set of events from an element
1908	remove: function(elem, types, handler) {
1909		// don't do events on text and comment nodes
1910		if ( elem.nodeType == 3 || elem.nodeType == 8 )
1911			return;
1912
1913		var events = jQuery.data(elem, "events"), ret, index;
1914
1915		if ( events ) {
1916			// Unbind all events for the element
1917			if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
1918				for ( var type in events )
1919					this.remove( elem, type + (types || "") );
1920			else {
1921				// types is actually an event object here
1922				if ( types.type ) {
1923					handler = types.handler;
1924					types = types.type;
1925				}
1926
1927				// Handle multiple events seperated by a space
1928				// jQuery(...).unbind("mouseover mouseout", fn);
1929				jQuery.each(types.split(/\s+/), function(index, type){
1930					// Namespaced event handlers
1931					var parts = type.split(".");
1932					type = parts[0];
1933
1934					if ( events[type] ) {
1935						// remove the given handler for the given type
1936						if ( handler )
1937							delete events[type][handler.guid];
1938
1939						// remove all handlers for the given type
1940						else
1941							for ( handler in events[type] )
1942								// Handle the removal of namespaced events
1943								if ( !parts[1] || events[type][handler].type == parts[1] )
1944									delete events[type][handler];
1945
1946						// remove generic event handler if no more handlers exist
1947						for ( ret in events[type] ) break;
1948						if ( !ret ) {
1949							if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
1950								if (elem.removeEventListener)
1951									elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
1952								else if (elem.detachEvent)
1953									elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
1954							}
1955							ret = null;
1956							delete events[type];
1957						}
1958					}
1959				});
1960			}
1961
1962			// Remove the expando if it's no longer used
1963			for ( ret in events ) break;
1964			if ( !ret ) {
1965				var handle = jQuery.data( elem, "handle" );
1966				if ( handle ) handle.elem = null;
1967				jQuery.removeData( elem, "events" );
1968				jQuery.removeData( elem, "handle" );
1969			}
1970		}
1971	},
1972
1973	trigger: function(type, data, elem, donative, extra) {
1974		// Clone the incoming data, if any
1975		data = jQuery.makeArray(data);
1976
1977		if ( type.indexOf("!") >= 0 ) {
1978			type = type.slice(0, -1);
1979			var exclusive = true;
1980		}
1981
1982		// Handle a global trigger
1983		if ( !elem ) {
1984			// Only trigger if we've ever bound an event for it
1985			if ( this.global[type] )
1986				jQuery("*").add([window, document]).trigger(type, data);
1987
1988		// Handle triggering a single element
1989		} else {
1990			// don't do events on text and comment nodes
1991			if ( elem.nodeType == 3 || elem.nodeType == 8 )
1992				return undefined;
1993
1994			var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
1995				// Check to see if we need to provide a fake event, or not
1996				event = !data[0] || !data[0].preventDefault;
1997
1998			// Pass along a fake event
1999			if ( event ) {
2000				data.unshift({
2001					type: type,
2002					target: elem,
2003					preventDefault: function(){},
2004					stopPropagation: function(){},
2005					timeStamp: now()
2006				});
2007				data[0][expando] = true; // no need to fix fake event
2008			}
2009
2010			// Enforce the right trigger type
2011			data[0].type = type;
2012			if ( exclusive )
2013				data[0].exclusive = true;
2014
2015			// Trigger the event, it is assumed that "handle" is a function
2016			var handle = jQuery.data(elem, "handle");
2017			if ( handle )
2018				val = handle.apply( elem, data );
2019
2020			// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
2021			if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
2022				val = false;
2023
2024			// Extra functions don't get the custom event object
2025			if ( event )
2026				data.shift();
2027
2028			// Handle triggering of extra function
2029			if ( extra && jQuery.isFunction( extra ) ) {
2030				// call the extra function and tack the current return value on the end for possible inspection
2031				ret = extra.apply( elem, val == null ? data : data.concat( val ) );
2032				// if anything is returned, give it precedence and have it overwrite the previous value
2033				if (ret !== undefined)
2034					val = ret;
2035			}
2036
2037			// Trigger the native events (except for clicks on links)
2038			if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
2039				this.triggered = true;
2040				try {
2041					elem[ type ]();
2042				// prevent IE from throwing an error for some hidden elements
2043				} catch (e) {}
2044			}
2045
2046			this.triggered = false;
2047		}
2048
2049		return val;
2050	},
2051
2052	handle: function(event) {
2053		// returned undefined or false
2054		var val, ret, namespace, all, handlers;
2055
2056		event = arguments[0] = jQuery.event.fix( event || window.event );
2057
2058		// Namespaced event handlers
2059		namespace = event.type.split(".");
2060		event.type = namespace[0];
2061		namespace = namespace[1];
2062		// Cache this now, all = true means, any handler
2063		all = !namespace && !event.exclusive;
2064
2065		handlers = ( jQuery.data(this, "events") || {} )[event.type];
2066
2067		for ( var j in handlers ) {
2068			var handler = handlers[j];
2069
2070			// Filter the functions by class
2071			if ( all || handler.type == namespace ) {
2072				// Pass in a reference to the handler function itself
2073				// So that we can later remove it
2074				event.handler = handler;
2075				event.data = handler.data;
2076
2077				ret = handler.apply( this, arguments );
2078
2079				if ( val !== false )
2080					val = ret;
2081
2082				if ( ret === false ) {
2083					event.preventDefault();
2084					event.stopPropagation();
2085				}
2086			}
2087		}
2088
2089		return val;
2090	},
2091
2092	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" "),
2093
2094	fix: function(event) {
2095		if ( event[expando] == true )
2096			return event;
2097
2098		// store a copy of the original event object
2099		// and "clone" to set read-only properties
2100		var originalEvent = event;
2101		event = { originalEvent: originalEvent };
2102
2103		for ( var i = this.props.length, prop; i; ){
2104			prop = this.props[ --i ];
2105			event[ prop ] = originalEvent[ prop ];
2106		}
2107
2108		// Mark it as fixed
2109		event[expando] = true;
2110
2111		// add preventDefault and stopPropagation since
2112		// they will not work on the clone
2113		event.preventDefault = function() {
2114			// if preventDefault exists run it on the original event
2115			if (originalEvent.preventDefault)
2116				originalEvent.preventDefault();
2117			// otherwise set the returnValue property of the original event to false (IE)
2118			originalEvent.returnValue = false;
2119		};
2120		event.stopPropagation = function() {
2121			// if stopPropagation exists run it on the original event
2122			if (originalEvent.stopPropagation)
2123				originalEvent.stopPropagation();
2124			// otherwise set the cancelBubble property of the original event to true (IE)
2125			originalEvent.cancelBubble = true;
2126		};
2127
2128		// Fix timeStamp
2129		event.timeStamp = event.timeStamp || now();
2130
2131		// Fix target property, if necessary
2132		if ( !event.target )
2133			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
2134
2135		// check if target is a textnode (safari)
2136		if ( event.target.nodeType == 3 )
2137			event.target = event.target.parentNode;
2138
2139		// Add relatedTarget, if necessary
2140		if ( !event.relatedTarget && event.fromElement )
2141			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
2142
2143		// Calculate pageX/Y if missing and clientX/Y available
2144		if ( event.pageX == null && event.clientX != null ) {
2145			var doc = document.documentElement, body = document.body;
2146			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
2147			event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
2148		}
2149
2150		// Add which for key events
2151		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
2152			event.which = event.charCode || event.keyCode;
2153
2154		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
2155		if ( !event.metaKey && event.ctrlKey )
2156			event.metaKey = event.ctrlKey;
2157
2158		// Add which for click: 1 == left; 2 == middle; 3 == right
2159		// Note: button is not normalized, so don't use it
2160		if ( !event.which && event.button )
2161			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
2162
2163		return event;
2164	},
2165
2166	proxy: function( fn, proxy ){
2167		// Set the guid of unique handler to the same of original handler, so it can be removed
2168		proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
2169		// So proxy can be declared as an argument
2170		return proxy;
2171	},
2172
2173	special: {
2174		ready: {
2175			setup: function() {
2176				// Make sure the ready event is setup
2177				bindReady();
2178				return;
2179			},
2180
2181			teardown: function() { return; }
2182		},
2183
2184		mouseenter: {
2185			setup: function() {
2186				if ( jQuery.browser.msie ) return false;
2187				jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
2188				return true;
2189			},
2190
2191			teardown: function() {
2192				if ( jQuery.browser.msie ) return false;
2193				jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
2194				return true;
2195			},
2196
2197			handler: function(event) {
2198				// If we actually just moused on to a sub-element, ignore it
2199				if ( withinElement(event, this) ) return true;
2200				// Execute the right handlers by setting the event type to mouseenter
2201				event.type = "mouseenter";
2202				return jQuery.event.handle.apply(this, arguments);
2203			}
2204		},
2205
2206		mouseleave: {
2207			setup: function() {
2208				if ( jQuery.browser.msie ) return false;
2209				jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
2210				return true;
2211			},
2212
2213			teardown: function() {
2214				if ( jQuery.browser.msie ) return false;
2215				jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
2216				return true;
2217			},
2218
2219			handler: function(event) {
2220				// If we actually just moused on to a sub-element, ignore it
2221				if ( withinElement(event, this) ) return true;
2222				// Execute the right handlers by setting the event type to mouseleave
2223				event.type = "mouseleave";
2224				return jQuery.event.handle.apply(this, arguments);
2225			}
2226		}
2227	}
2228};
2229
2230jQuery.fn.extend({
2231	bind: function( type, data, fn ) {
2232		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
2233			jQuery.event.add( this, type, fn || data, fn && data );
2234		});
2235	},
2236
2237	one: function( type, data, fn ) {
2238		var one = jQuery.event.proxy( fn || data, function(event) {
2239			jQuery(this).unbind(event, one);
2240			return (fn || data).apply( this, arguments );
2241		});
2242		return this.each(function(){
2243			jQuery.event.add( this, type, one, fn && data);
2244		});
2245	},
2246
2247	unbind: function( type, fn ) {
2248		return this.each(function(){
2249			jQuery.event.remove( this, type, fn );
2250		});
2251	},
2252
2253	trigger: function( type, data, fn ) {
2254		return this.each(function(){
2255			jQuery.event.trigger( type, data, this, true, fn );
2256		});
2257	},
2258
2259	triggerHandler: function( type, data, fn ) {
2260		return this[0] && jQuery.event.trigger( type, data, this[0], false, fn );
2261	},
2262
2263	toggle: function( fn ) {
2264		// Save reference to arguments for access in closure
2265		var args = arguments, i = 1;
2266
2267		// link all the functions, so any of them can unbind this click handler
2268		while( i < args.length )
2269			jQuery.event.proxy( fn, args[i++] );
2270
2271		return this.click( jQuery.event.proxy( fn, function(event) {
2272			// Figure out which function to execute
2273			this.lastToggle = ( this.lastToggle || 0 ) % i;
2274
2275			// Make sure that clicks stop
2276			event.preventDefault();
2277
2278			// and execute the function
2279			return args[ this.lastToggle++ ].apply( this, arguments ) || false;
2280		}));
2281	},
2282
2283	hover: function(fnOver, fnOut) {
2284		return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
2285	},
2286
2287	ready: function(fn) {
2288		// Attach the listeners
2289		bindReady();
2290
2291		// If the DOM is already ready
2292		if ( jQuery.isReady )
2293			// Execute the function immediately
2294			fn.call( document, jQuery );
2295
2296		// Otherwise, remember the function for later
2297		else
2298			// Add the function to the wait list
2299			jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
2300
2301		return this;
2302	}
2303});
2304
2305jQuery.extend({
2306	isReady: false,
2307	readyList: [],
2308	// Handle when the DOM is ready
2309	ready: function() {
2310		// Make sure that the DOM is not already loaded
2311		if ( !jQuery.isReady ) {
2312			// Remember that the DOM is ready
2313			jQuery.isReady = true;
2314
2315			// If there are functions bound, to execute
2316			if ( jQuery.readyList ) {
2317				// Execute all of them
2318				jQuery.each( jQuery.readyList, function(){
2319					this.call( document );
2320				});
2321
2322				// Reset the list of functions
2323				jQuery.readyList = null;
2324			}
2325
2326			// Trigger any bound ready events
2327			jQuery(document).triggerHandler("ready");
2328		}
2329	}
2330});
2331
2332var readyBound = false;
2333
2334function bindReady(){
2335	if ( readyBound ) return;
2336	readyBound = true;
2337
2338	// Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
2339	if ( document.addEventListener && !jQuery.browser.opera)
2340		// Use the handy event callback
2341		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
2342
2343	// If IE is used and is not in a frame
2344	// Continually check to see if the document is ready
2345	if ( jQuery.browser.msie && window == top ) (function(){
2346		if (jQuery.isReady) return;
2347		try {
2348			// If IE is used, use the trick by Diego Perini
2349			// http://javascript.nwbox.com/IEContentLoaded/
2350			document.documentElement.doScroll("left");
2351		} catch( error ) {
2352			setTimeout( arguments.callee, 0 );
2353			return;
2354		}
2355		// and execute any waiting functions
2356		jQuery.ready();
2357	})();
2358
2359	if ( jQuery.browser.opera )
2360		document.addEventListener( "DOMContentLoaded", function () {
2361			if (jQuery.isReady) return;
2362			for (var i = 0; i < document.styleSheets.length; i++)
2363				if (document.styleSheets[i].disabled) {
2364					setTimeout( arguments.callee, 0 );
2365					return;
2366				}
2367			// and execute any waiting functions
2368			jQuery.ready();
2369		}, false);
2370
2371	if ( jQuery.browser.safari ) {
2372		var numStyles;
2373		(function(){
2374			if (jQuery.isReady) return;
2375			if ( document.readyState != "loaded" && document.readyState != "complete" ) {
2376				setTimeout( arguments.callee, 0 );
2377				return;
2378			}
2379			if ( numStyles === undefined )
2380				numStyles = jQuery("style, link[rel=stylesheet]").length;
2381			if ( document.styleSheets.length != numStyles ) {
2382				setTimeout( arguments.callee, 0 );
2383				return;
2384			}
2385			// and execute any waiting functions
2386			jQuery.ready();
2387		})();
2388	}
2389
2390	// A fallback to window.onload, that will always work
2391	jQuery.event.add( window, "load", jQuery.ready );
2392}
2393
2394jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
2395	"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
2396	"submit,keydown,keypress,keyup,error").split(","), function(i, name){
2397
2398	// Handle event binding
2399	jQuery.fn[name] = function(fn){
2400		return fn ? this.bind(name, fn) : this.trigger(name);
2401	};
2402});
2403
2404// Checks if an event happened on an element within another element
2405// Used in jQuery.event.special.mouseenter and mouseleave handlers
2406var withinElement = function(event, elem) {
2407	// Check if mouse(over|out) are still within the same parent element
2408	var parent = event.relatedTarget;
2409	// Traverse up the tree
2410	while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }
2411	// Return true if we actually just moused on to a sub-element
2412	return parent == elem;
2413};
2414
2415// Prevent memory leaks in IE
2416// And prevent errors on refresh with events like mouseover in other browsers
2417// Window isn't included so as not to unbind existing unload events
2418jQuery(window).bind("unload", function() {
2419	jQuery("*").add(document).unbind();
2420});
2421jQuery.fn.extend({
2422	// Keep a copy of the old load
2423	_load: jQuery.fn.load,
2424
2425	load: function( url, params, callback ) {
2426		if ( typeof url != 'string' )
2427			return this._load( url );
2428
2429		var off = url.indexOf(" ");
2430		if ( off >= 0 ) {
2431			var selector = url.slice(off, url.length);
2432			url = url.slice(0, off);
2433		}
2434
2435		callback = callback || function(){};
2436
2437		// Default to a GET request
2438		var type = "GET";
2439
2440		// If the second parameter was provided
2441		if ( params )
2442			// If it's a function
2443			if ( jQuery.isFunction( params ) ) {
2444				// We assume that it's the callback
2445				callback = params;
2446				params = null;
2447
2448			// Otherwise, build a param string
2449			} else if( typeof params == 'object' ) {
2450				params = jQuery.param( params );
2451				type = "POST";
2452			}
2453
2454		var self = this;
2455
2456		// Request the remote document
2457		jQuery.ajax({
2458			url: url,
2459			type: type,
2460			dataType: "html",
2461			data: params,
2462			complete: function(res, status){
2463				// If successful, inject the HTML into all the matched elements
2464				if ( status == "success" || status == "notmodified" )
2465					// See if a selector was specified
2466					self.html( selector ?
2467						// Create a dummy div to hold the results
2468						jQuery("<div/>")
2469							// inject the contents of the document in, removing the scripts
2470							// to avoid any 'Permission Denied' errors in IE
2471							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
2472
2473							// Locate the specified elements
2474							.find(selector) :
2475
2476						// If not, just inject the full result
2477						res.responseText );
2478
2479				self.each( callback, [res.responseText, status, res] );
2480			}
2481		});
2482		return this;
2483	},
2484
2485	serialize: function() {
2486		return jQuery.param(this.serializeArray());
2487	},
2488	serializeArray: function() {
2489		return this.map(function(){
2490			return jQuery.nodeName(this, "form") ?
2491				jQuery.makeArray(this.elements) : this;
2492		})
2493		.filter(function(){
2494			return this.name && !this.disabled &&
2495				(this.checked || /select|textarea/i.test(this.nodeName) ||
2496					/text|hidden|password/i.test(this.type));
2497		})
2498		.map(function(i, elem){
2499			var val = jQuery(this).val();
2500			return val == null ? null :
2501				val.constructor == Array ?
2502					jQuery.map( val, function(val, i){
2503						return {name: elem.name, value: val};
2504					}) :
2505					{name: elem.name, value: val};
2506		}).get();
2507	}
2508});
2509
2510// Attach a bunch of functions for handling common AJAX events
2511jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
2512	jQuery.fn[o] = function(f){
2513		return this.bind(o, f);
2514	};
2515});
2516
2517var jsc = now();
2518
2519jQuery.extend({
2520	get: function( url, data, callback, type ) {
2521		// shift arguments if data argument was ommited
2522		if ( jQuery.isFunction( data ) ) {
2523			callback = data;
2524			data = null;
2525		}
2526
2527		return jQuery.ajax({
2528			type: "GET",
2529			url: url,
2530			data: data,
2531			success: callback,
2532			dataType: type
2533		});
2534	},
2535
2536	getScript: function( url, callback ) {
2537		return jQuery.get(url, null, callback, "script");
2538	},
2539
2540	getJSON: function( url, data, callback ) {
2541		return jQuery.get(url, data, callback, "json");
2542	},
2543
2544	post: function( url, data, callback, type ) {
2545		if ( jQuery.isFunction( data ) ) {
2546			callback = data;
2547			data = {};
2548		}
2549
2550		return jQuery.ajax({
2551			type: "POST",
2552			url: url,
2553			data: data,
2554			success: callback,
2555			dataType: type
2556		});
2557	},
2558
2559	ajaxSetup: function( settings ) {
2560		jQuery.extend( jQuery.ajaxSettings, settings );
2561	},
2562
2563	ajaxSettings: {
2564		url: location.href,
2565		global: true,
2566		type: "GET",
2567		timeout: 0,
2568		contentType: "application/x-www-form-urlencoded",
2569		processData: true,
2570		async: true,
2571		data: null,
2572		username: null,
2573		password: null,
2574		accepts: {
2575			xml: "application/xml, text/xml",
2576			html: "text/html",
2577			script: "text/javascript, application/javascript",
2578			json: "application/json, text/javascript",
2579			text: "text/plain",
2580			_default: "*/*"
2581		}
2582	},
2583
2584	// Last-Modified header cache for next request
2585	lastModified: {},
2586
2587	ajax: function( s ) {
2588		// Extend the settings, but re-extend 's' so that it can be
2589		// checked again later (in the test suite, specifically)
2590		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
2591
2592		var jsonp, jsre = /=\?(&|$)/g, status, data,
2593			type = s.type.toUpperCase();
2594
2595		// convert data if not already a string
2596		if ( s.data && s.processData && typeof s.data != "string" )
2597			s.data = jQuery.param(s.data);
2598
2599		// Handle JSONP Parameter Callbacks
2600		if ( s.dataType == "jsonp" ) {
2601			if ( type == "GET" ) {
2602				if ( !s.url.match(jsre) )
2603					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
2604			} else if ( !s.data || !s.data.match(jsre) )
2605				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
2606			s.dataType = "json";
2607		}
2608
2609		// Build temporary JSONP function
2610		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
2611			jsonp = "jsonp" + jsc++;
2612
2613			// Replace the =? sequence both in the query string and the data
2614			if ( s.data )
2615				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
2616			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
2617
2618			// We need to make sure
2619			// that a JSONP style response is executed properly
2620			s.dataType = "script";
2621
2622			// Handle JSONP-style loading
2623			window[ jsonp ] = function(tmp){
2624				data = tmp;
2625				success();
2626				complete();
2627				// Garbage collect
2628				window[ jsonp ] = undefined;
2629				try{ delete window[ jsonp ]; } catch(e){}
2630				if ( head )
2631					head.removeChild( script );
2632			};
2633		}
2634
2635		if ( s.dataType == "script" && s.cache == null )
2636			s.cache = false;
2637
2638		if ( s.cache === false && type == "GET" ) {
2639			var ts = now();
2640			// try replacing _= if it is there
2641			var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
2642			// if nothing was replaced, add timestamp to the end
2643			s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
2644		}
2645
2646		// If data is available, append data to url for get requests
2647		if ( s.data && type == "GET" ) {
2648			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
2649
2650			// IE likes to send both get and post data, prevent this
2651			s.data = null;
2652		}
2653
2654		// Watch for a new set of requests
2655		if ( s.global && ! jQuery.active++ )
2656			jQuery.event.trigger( "ajaxStart" );
2657
2658		// Matches an absolute URL, and saves the domain
2659		var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;
2660
2661		// If we're requesting a remote document
2662		// and trying to load JSON or Script with a GET
2663		if ( s.dataType == "script" && type == "GET"
2664				&& remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
2665			var head = document.getElementsByTagName("head")[0];
2666			var script = document.createElement("script");
2667			script.src = s.url;
2668			if (s.scriptCharset)
2669				script.charset = s.scriptCharset;
2670
2671			// Handle Script loading
2672			if ( !jsonp ) {
2673				var done = false;
2674
2675				// Attach handlers for all browsers
2676				script.onload = script.onreadystatechange = function(){
2677					if ( !done && (!this.readyState ||
2678							this.readyState == "loaded" || this.readyState == "complete") ) {
2679						done = true;
2680						success();
2681						complete();
2682						head.removeChild( script );
2683					}
2684				};
2685			}
2686
2687			head.appendChild(script);
2688
2689			// We handle everything using the script element injection
2690			return undefined;
2691		}
2692
2693		var requestDone = false;
2694
2695		// Create the request object; Microsoft failed to properly
2696		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
2697		var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
2698
2699		// Open the socket
2700		// Passing null username, generates a login popup on Opera (#2865)
2701		if( s.username )
2702			xhr.open(type, s.url, s.async, s.username, s.password);
2703		else
2704			xhr.open(type, s.url, s.async);
2705
2706		// Need an extra try/catch for cross domain requests in Firefox 3
2707		try {
2708			// Set the correct header, if data is being sent
2709			if ( s.data )
2710				xhr.setRequestHeader("Content-Type", s.contentType);
2711
2712			// Set the If-Modified-Since header, if ifModified mode.
2713			if ( s.ifModified )
2714				xhr.setRequestHeader("If-Modified-Since",
2715					jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
2716
2717			// Set header so the called script knows that it's an XMLHttpRequest
2718			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
2719
2720			// Set the Accepts header for the server, depending on the dataType
2721			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
2722				s.accepts[ s.dataType ] + ", */*" :
2723				s.accepts._default );
2724		} catch(e){}
2725
2726		// Allow custom headers/mimetypes
2727		if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
2728			// cleanup active request counter
2729			s.global && jQuery.active--;
2730			// close opended socket
2731			xhr.abort();
2732			return false;
2733		}
2734
2735		if ( s.global )
2736			jQuery.event.trigger("ajaxSend", [xhr, s]);
2737
2738		// Wait for a response to come back
2739		var onreadystatechange = function(isTimeout){
2740			// The transfer is complete and the data is available, or the request timed out
2741			if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
2742				requestDone = true;
2743
2744				// clear poll interval
2745				if (ival) {
2746					clearInterval(ival);
2747					ival = null;
2748				}
2749
2750				status = isTimeout == "timeout" ? "timeout" :
2751					!jQuery.httpSuccess( xhr ) ? "error" :
2752					s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
2753					"success";
2754
2755				if ( status == "success" ) {
2756					// Watch for, and catch, XML document parse errors
2757					try {
2758						// process the data (runs the xml through httpData regardless of callback)
2759						data = jQuery.httpData( xhr, s.dataType, s.dataFilter );
2760					} catch(e) {
2761						status = "parsererror";
2762					}
2763				}
2764
2765				// Make sure that the request was successful or notmodified
2766				if ( status == "success" ) {
2767					// Cache Last-Modified header, if ifModified mode.
2768					var modRes;
2769					try {
2770						modRes = xhr.getResponseHeader("Last-Modified");
2771					} catch(e) {} // swallow exception thrown by FF if header is not available
2772
2773					if ( s.ifModified && modRes )
2774						jQuery.lastModified[s.url] = modRes;
2775
2776					// JSONP handles its own success callback
2777					if ( !jsonp )
2778						success();
2779				} else
2780					jQuery.handleError(s, xhr, status);
2781
2782				// Fire the complete handlers
2783				complete();
2784
2785				// Stop memory leaks
2786				if ( s.async )
2787					xhr = null;
2788			}
2789		};
2790
2791		if ( s.async ) {
2792			// don't attach the handler to the request, just poll it instead
2793			var ival = setInterval(onreadystatechange, 13);
2794
2795			// Timeout checker
2796			if ( s.timeout > 0 )
2797				setTimeout(function(){
2798					// Check to see if the request is still happening
2799					if ( xhr ) {
2800						// Cancel the request
2801						xhr.abort();
2802
2803						if( !requestDone )
2804							onreadystatechange( "timeout" );
2805					}
2806				}, s.timeout);
2807		}
2808
2809		// Send the data
2810		try {
2811			xhr.send(s.data);
2812		} catch(e) {
2813			jQuery.handleError(s, xhr, null, e);
2814		}
2815
2816		// firefox 1.5 doesn't fire statechange for sync requests
2817		if ( !s.async )
2818			onreadystatechange();
2819
2820		function success(){
2821			// If a local callback was specified, fire it and pass it the data
2822			if ( s.success )
2823				s.success( data, status );
2824
2825			// Fire the global callback
2826			if ( s.global )
2827				jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
2828		}
2829
2830		function complete(){
2831			// Process result
2832			if ( s.complete )
2833				s.complete(xhr, status);
2834
2835			// The request was completed
2836			if ( s.global )
2837				jQuery.event.trigger( "ajaxComplete", [xhr, s] );
2838
2839			// Handle the global AJAX counter
2840			if ( s.global && ! --jQuery.active )
2841				jQuery.event.trigger( "ajaxStop" );
2842		}
2843
2844		// return XMLHttpRequest to allow aborting the request etc.
2845		return xhr;
2846	},
2847
2848	handleError: function( s, xhr, status, e ) {
2849		// If a local callback was specified, fire it
2850		if ( s.error ) s.error( xhr, status, e );
2851
2852		// Fire the global callback
2853		if ( s.global )
2854			jQuery.event.trigger( "ajaxError", [xhr, s, e] );
2855	},
2856
2857	// Counter for holding the number of active queries
2858	active: 0,
2859
2860	// Determines if an XMLHttpRequest was successful or not
2861	httpSuccess: function( xhr ) {
2862		try {
2863			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
2864			return !xhr.status && location.protocol == "file:" ||
2865				( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
2866				jQuery.browser.safari && xhr.status == undefined;
2867		} catch(e){}
2868		return false;
2869	},
2870
2871	// Determines if an XMLHttpRequest returns NotModified
2872	httpNotModified: function( xhr, url ) {
2873		try {
2874			var xhrRes = xhr.getResponseHeader("Last-Modified");
2875
2876			// Firefox always returns 200. check Last-Modified date
2877			return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
2878				jQuery.browser.safari && xhr.status == undefined;
2879		} catch(e){}
2880		return false;
2881	},
2882
2883	httpData: function( xhr, type, filter ) {
2884		var ct = xhr.getResponseHeader("content-type"),
2885			xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
2886			data = xml ? xhr.responseXML : xhr.responseText;
2887
2888		if ( xml && data.documentElement.tagName == "parsererror" )
2889			throw "parsererror";
2890			
2891		// Allow a pre-filtering function to sanitize the response
2892		if( filter )
2893			data = filter( data, type );
2894
2895		// If the type is "script", eval it in global context
2896		if ( type == "script" )
2897			jQuery.globalEval( data );
2898
2899		// Get the JavaScript object, if JSON is used.
2900		if ( type == "json" )
2901			data = eval("(" + data + ")");
2902
2903		return data;
2904	},
2905
2906	// Serialize an array of form elements or a set of
2907	// key/values into a query string
2908	param: function( a ) {
2909		var s = [ ];
2910
2911		function add( key, value ){
2912			s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
2913		};
2914
2915		// If an array was passed in, assume that it is an array
2916		// of form elements
2917		if ( a.constructor == Array || a.jquery )
2918			// Serialize the form elements
2919			jQuery.each( a, function(){
2920				add( this.name, this.value );
2921			});
2922
2923		// Otherwise, assume that it's an object of key/value pairs
2924		else
2925			// Serialize the key/values
2926			for ( var j in a )
2927				// If the value is an array then the key names need to be repeated
2928				if ( a[j] && a[j].constructor == Array )
2929					jQuery.each( a[j], function(){
2930						add( j, this );
2931					});
2932				else
2933					add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
2934
2935		// Return the resulting serialization
2936		return s.join("&").replace(/%20/g, "+");
2937	}
2938
2939});
2940jQuery.fn.extend({
2941	show: function(speed,callback){
2942		return speed ?
2943			this.animate({
2944				height: "show", width: "show", opacity: "show"
2945			}, speed, callback) :
2946
2947			this.filter(":hidden").each(function(){
2948				this.style.display = this.oldblock || "";
2949				if ( jQuery.css(this,"display") == "none" ) {
2950					var elem = jQuery("<" + this.tagName + " />").appendTo("body");
2951					this.style.display = elem.css("display");
2952					// handle an edge condition where css is - div { display:none; } or similar
2953					if (this.style.display == "none")
2954						this.style.display = "block";
2955					elem.remove();
2956				}
2957			}).end();
2958	},
2959
2960	hide: function(speed,callback){
2961		return speed ?
2962			this.animate({
2963				height: "hide", width: "hide", opacity: "hide"
2964			}, speed, callback) :
2965
2966			this.filter(":visible").each(function(){
2967				this.oldblock = this.oldblock || jQuery.css(this,"display");
2968				this.style.display = "none";
2969			}).end();
2970	},
2971
2972	// Save the old toggle function
2973	_toggle: jQuery.fn.toggle,
2974
2975	toggle: function( fn, fn2 ){
2976		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
2977			this._toggle.apply( this, arguments ) :
2978			fn ?
2979				this.animate({
2980					height: "toggle", width: "toggle", opacity: "toggle"
2981				}, fn, fn2) :
2982				this.each(function(){
2983					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
2984				});
2985	},
2986
2987	slideDown: function(speed,callback){
2988		return this.animate({height: "show"}, speed, callback);
2989	},
2990
2991	slideUp: function(speed,callback){
2992		return this.animate({height: "hide"}, speed, callback);
2993	},
2994
2995	slideToggle: function(speed, callback){
2996		return this.animate({height: "toggle"}, speed, callback);
2997	},
2998
2999	fadeIn: function(speed, callback){
3000		return this.animate({opacity: "show"}, speed, callback);
3001	},
3002
3003	fadeOut: function(speed, callback){
3004		return this.animate({opacity: "hide"}, speed, callback);
3005	},
3006
3007	fadeTo: function(speed,to,callback){
3008		return this.animate({opacity: to}, speed, callback);
3009	},
3010
3011	animate: function( prop, speed, easing, callback ) {
3012		var optall = jQuery.speed(speed, easing, callback);
3013
3014		return this[ optall.queue === false ? "each" : "queue" ](function(){
3015			if ( this.nodeType != 1)
3016				return false;
3017
3018			var opt = jQuery.extend({}, optall), p,
3019				hidden = jQuery(this).is(":hidden"), self = this;
3020
3021			for ( p in prop ) {
3022				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
3023					return opt.complete.call(this);
3024
3025				if ( p == "height" || p == "width" ) {
3026					// Store display property
3027					opt.display = jQuery.css(this, "display");
3028
3029					// Make sure that nothing sneaks out
3030					opt.overflow = this.style.overflow;
3031				}
3032			}
3033
3034			if ( opt.overflow != null )
3035				this.style.overflow = "hidden";
3036
3037			opt.curAnim = jQuery.extend({}, prop);
3038
3039			jQuery.each( prop, function(name, val){
3040				var e = new jQuery.fx( self, opt, name );
3041
3042				if ( /toggle|show|hide/.test(val) )
3043					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
3044				else {
3045					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
3046						start = e.cur(true) || 0;
3047
3048					if ( parts ) {
3049						var end = parseFloat(parts[2]),
3050							unit = parts[3] || "px";
3051
3052						// We need to compute starting value
3053						if ( unit != "px" ) {
3054							self.style[ name ] = (end || 1) + unit;
3055							start = ((end || 1) / e.cur(true)) * start;
3056							self.style[ name ] = start + unit;
3057						}
3058
3059						// If a +=/-= token was provided, we're doing a relative animation
3060						if ( parts[1] )
3061							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
3062
3063						e.custom( start, end, unit );
3064					} else
3065						e.custom( start, val, "" );
3066				}
3067			});
3068
3069			// For JS strict compliance
3070			return true;
3071		});
3072	},
3073
3074	queue: function(type, fn){
3075		if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
3076			fn = type;
3077			type = "fx";
3078		}
3079
3080		if ( !type || (typeof type == "string" && !fn) )
3081			return queue( this[0], type );
3082
3083		return this.each(function(){
3084			if ( fn.constructor == Array )
3085				queue(this, type, fn);
3086			else {
3087				queue(this, type).push( fn );
3088
3089				if ( queue(this, type).length == 1 )
3090					fn.call(this);
3091			}
3092		});
3093	},
3094
3095	stop: function(clearQueue, gotoEnd){
3096		var timers = jQuery.timers;
3097
3098		if (clearQueue)
3099			this.queue([]);
3100
3101		this.each(function(){
3102			// go in reverse order so anything added to the queue during the loop is ignored
3103			for ( var i = timers.length - 1; i >= 0; i-- )
3104				if ( timers[i].elem == this ) {
3105					if (gotoEnd)
3106						// force the next step to be the last
3107						timers[i](true);
3108					timers.splice(i, 1);
3109				}
3110		});
3111
3112		// start the next in the queue if the last step wasn't forced
3113		if (!gotoEnd)
3114			this.dequeue();
3115
3116		return this;
3117	}
3118
3119});
3120
3121var queue = function( elem, type, array ) {
3122	if ( elem ){
3123
3124		type = type || "fx";
3125
3126		var q = jQuery.data( elem, type + "queue" );
3127
3128		if ( !q || array )
3129			q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
3130
3131	}
3132	return q;
3133};
3134
3135jQuery.fn.dequeue = function(type){
3136	type = type || "fx";
3137
3138	return this.each(function(){
3139		var q = queue(this, type);
3140
3141		q.shift();
3142
3143		if ( q.length )
3144			q[0].call( this );
3145	});
3146};
3147
3148jQuery.extend({
3149
3150	speed: function(speed, easing, fn) {
3151		var opt = speed && speed.constructor == Object ? speed : {
3152			complete: fn || !fn && easing ||
3153				jQuery.isFunction( speed ) && speed,
3154			duration: speed,
3155			easing: fn && easing || easing && easing.constructor != Function && easing
3156		};
3157
3158		opt.duration = (opt.duration && opt.duration.constructor == Number ?
3159			opt.duration :
3160			jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
3161
3162		// Queueing
3163		opt.old = opt.complete;
3164		opt.complete = function(){
3165			if ( opt.queue !== false )
3166				jQuery(this).dequeue();
3167			if ( jQuery.isFunction( opt.old ) )
3168				opt.old.call( this );
3169		};
3170
3171		return opt;
3172	},
3173
3174	easing: {
3175		linear: function( p, n, firstNum, diff ) {
3176			return firstNum + diff * p;
3177		},
3178		swing: function( p, n, firstNum, diff ) {
3179			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
3180		}
3181	},
3182
3183	timers: [],
3184	timerId: null,
3185
3186	fx: function( elem, options, prop ){
3187		this.options = options;
3188		this.elem = elem;
3189		this.prop = prop;
3190
3191		if ( !options.orig )
3192			options.orig = {};
3193	}
3194
3195});
3196
3197jQuery.fx.prototype = {
3198
3199	// Simple function for setting a style value
3200	update: function(){
3201		if ( this.options.step )
3202			this.options.step.call( this.elem, this.now, this );
3203
3204		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
3205
3206		// Set display property to block for height/width animations
3207		if ( this.prop == "height" || this.prop == "width" )
3208			this.elem.style.display = "block";
3209	},
3210
3211	// Get the current size
3212	cur: function(force){
3213		if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
3214			return this.elem[ this.prop ];
3215
3216		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
3217		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
3218	},
3219
3220	// Start an animation from one number to another
3221	custom: function(from, to, unit){
3222		this.startTime = now();
3223		this.start = from;
3224		this.end = to;
3225		this.unit = unit || this.unit || "px";
3226		this.now = this.start;
3227		this.pos = this.state = 0;
3228		this.update();
3229
3230		var self = this;
3231		function t(gotoEnd){
3232			return self.step(gotoEnd);
3233		}
3234
3235		t.elem = this.elem;
3236
3237		jQuery.timers.push(t);
3238
3239		if ( jQuery.timerId == null ) {
3240			jQuery.timerId = setInterval(function(){
3241				var timers = jQuery.timers;
3242
3243				for ( var i = 0; i < timers.length; i++ )
3244					if ( !timers[i]() )
3245						timers.splice(i--, 1);
3246
3247				if ( !timers.length ) {
3248					clearInterval( jQuery.timerId );
3249					jQuery.timerId = null;
3250				}
3251			}, 13);
3252		}
3253	},
3254
3255	// Simple 'show' function
3256	show: function(){
3257		// Remember where we started, so that we can go back to it later
3258		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
3259		this.options.show = true;
3260
3261		// Begin the animation
3262		this.custom(0, this.cur());
3263
3264		// Make sure that we start at a small width/height to avoid any
3265		// flash of content
3266		if ( this.prop == "width" || this.prop == "height" )
3267			this.elem.style[this.prop] = "1px";
3268
3269		// Start by showing the element
3270		jQuery(this.elem).show();
3271	},
3272
3273	// Simple 'hide' function
3274	hide: function(){
3275		// Remember where we started, so that we can go back to it later
3276		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
3277		this.options.hide = true;
3278
3279		// Begin the animation
3280		this.custom(this.cur(), 0);
3281	},
3282
3283	// Each step of an animation
3284	step: function(gotoEnd){
3285		var t = now();
3286
3287		if ( gotoEnd || t > this.options.duration + this.startTime ) {
3288			this.now = this.end;
3289			this.pos = this.state = 1;
3290			this.update();
3291
3292			this.options.curAnim[ this.prop ] = true;
3293
3294			var done = true;
3295			for ( var i in this.options.curAnim )
3296				if ( this.options.curAnim[i] !== true )
3297					done = false;
3298
3299			if ( done ) {
3300				if ( this.options.display != null ) {
3301					// Reset the overflow
3302					this.elem.style.overflow = this.options.overflow;
3303
3304					// Reset the display
3305					this.elem.style.display = this.options.display;
3306					if ( jQuery.css(this.elem, "display") == "none" )
3307						this.elem.style.display = "block";
3308				}
3309
3310				// Hide the element if the "hide" operation was done
3311				if ( this.options.hide )
3312					this.elem.style.display = "none";
3313
3314				// Reset the properties, if the item has been hidden or shown
3315				if ( this.options.hide || this.options.show )
3316					for ( var p in this.options.curAnim )
3317						jQuery.attr(this.elem.style, p, this.options.orig[p]);
3318			}
3319
3320			if ( done )
3321				// Execute the complete function
3322				this.options.complete.call( this.elem );
3323
3324			return false;
3325		} else {
3326			var n = t - this.startTime;
3327			this.state = n / this.options.duration;
3328
3329			// Perform the easing function, defaults to swing
3330			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
3331			this.now = this.start + ((this.end - this.start) * this.pos);
3332
3333			// Perform the next step of the animation
3334			this.update();
3335		}
3336
3337		return true;
3338	}
3339
3340};
3341
3342jQuery.extend( jQuery.fx, {
3343	speeds:{
3344		slow: 600,
3345 		fast: 200,
3346 		// Default speed
3347 		def: 400
3348	},
3349	step: {
3350		scrollLeft: function(fx){
3351			fx.elem.scrollLeft = fx.now;
3352		},
3353
3354		scrollTop: function(fx){
3355			fx.elem.scrollTop = fx.now;
3356		},
3357
3358		opacity: function(fx){
3359			jQuery.attr(fx.elem.style, "opacity", fx.now);
3360		},
3361
3362		_default: function(fx){
3363			fx.elem.style[ fx.prop ] = fx.now + fx.unit;
3364		}
3365	}
3366});
3367// The Offset Method
3368// Originally By Brandon Aaron, part of the Dimension Plugin
3369// http://jquery.com/plugins/project/dimensions
3370jQuery.fn.offset = function() {
3371	var left = 0, top = 0, elem = this[0], results;
3372
3373	if ( elem ) with ( jQuery.browser ) {
3374		var parent       = elem.parentNode,
3375		    offsetChild  = elem,
3376		    offsetParent = elem.offsetParent,
3377		    doc          = elem.ownerDocument,
3378		    safari2      = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
3379		    css          = jQuery.curCSS,
3380		    fixed        = css(elem, "position") == "fixed";
3381
3382		// Use getBoundingClientRect if available
3383		if ( !(mozilla && elem == document.body) && elem.getBoundingClientRect ) {
3384			var box = elem.getBoundingClientRect();
3385
3386			// Add the document scroll offsets
3387			add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
3388				box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
3389
3390			// IE adds the HTML element's border, by default it is medium which is 2px
3391			// IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }
3392			// IE 7 standards mode, the border is always 2px
3393			// This border/offset is typically represented by the clientLeft and clientTop properties
3394			// However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS
3395			// Therefore this method will be off by 2px in IE while in quirksmode
3396			add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
3397
3398		// Otherwise loop through the offsetParents and parentNodes
3399		} else {
3400
3401			// Initial element offsets
3402			add( elem.offsetLeft, elem.offsetTop );
3403
3404			// Get parent offsets
3405			while ( offsetParent ) {
3406				// Add offsetParent offsets
3407				add( offsetParent.offsetLeft, offsetParent.offsetTop );
3408
3409				// Mozilla and Safari > 2 does not include the border on offset parents
3410				// However Mozilla adds the border for table or table cells
3411				if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
3412					border( offsetParent );
3413
3414				// Add the document scroll offsets if position is fixed on any offsetParent
3415				if ( !fixed && css(offsetParent, "position") == "fixed" )
3416					fixed = true;
3417
3418				// Set offsetChild to previous offsetParent unless it is the body element
3419				offsetChild  = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
3420				// Get next offsetParent
3421				offsetParent = offsetParent.offsetParent;
3422			}
3423
3424			// Get parent scroll offsets
3425			while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
3426				// Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug
3427				if ( !/^inline|table.*$/i.test(css(parent, "display")) )
3428					// Subtract parent scroll offsets
3429					add( -parent.scrollLeft, -parent.scrollTop );
3430
3431				// Mozilla does not add the border for a parent that has overflow != visible
3432				if ( mozilla && css(parent, "overflow") != "visible" )
3433					border( parent );
3434
3435				// Get next parent
3436				parent = parent.parentNode;
3437			}
3438
3439			// Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild
3440			// Mozilla doubles body offsets with a non-absolutely positioned offsetChild
3441			if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
3442				(mozilla && css(offsetChild, "position") != "absolute") )
3443					add( -doc.body.offsetLeft, -doc.body.offsetTop );
3444
3445			// Add the document scroll offsets if position is fixed
3446			if ( fixed )
3447				add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
3448					Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop));
3449		}
3450
3451		// Return an object with top and left properties
3452		results = { top: top, left: left };
3453	}
3454
3455	function border(elem) {
3456		add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );
3457	}
3458
3459	function add(l, t) {
3460		left += parseInt(l, 10) || 0;
3461		top += parseInt(t, 10) || 0;
3462	}
3463
3464	return results;
3465};
3466
3467
3468jQuery.fn.extend({
3469	position: function() {
3470		var left = 0, top = 0, results;
3471
3472		if ( this[0] ) {
3473			// Get *real* offsetParent
3474			var offsetParent = this.offsetParent(),
3475
3476			// Get correct offsets
3477			offset       = this.offset(),
3478			parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
3479
3480			// Subtract element margins
3481			// note: when an element has margin: auto the offsetLeft and marginLeft 
3482			// are the same in Safari causing offset.left to incorrectly be 0
3483			offset.top  -= num( this, 'marginTop' );
3484			offset.left -= num( this, 'marginLeft' );
3485
3486			// Add offsetParent borders
3487			parentOffset.top  += num( offsetParent, 'borderTopWidth' );
3488			parentOffset.left += num( offsetParent, 'borderLeftWidth' );
3489
3490			// Subtract the two offsets
3491			results = {
3492				top:  offset.top  - parentOffset.top,
3493				left: offset.left - parentOffset.left
3494			};
3495		}
3496
3497		return results;
3498	},
3499
3500	offsetParent: function() {
3501		var offsetParent = this[0].offsetParent;
3502		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
3503			offsetParent = offsetParent.offsetParent;
3504		return jQuery(offsetParent);
3505	}
3506});
3507
3508
3509// Create scrollLeft and scrollTop methods
3510jQuery.each( ['Left', 'Top'], function(i, name) {
3511	var method = 'scroll' + name;
3512	
3513	jQuery.fn[ method ] = function(val) {
3514		if (!this[0]) return;
3515
3516		return val != undefined ?
3517
3518			// Set the scroll offset
3519			this.each(function() {
3520				this == window || this == document ?
3521					window.scrollTo(
3522						!i ? val : jQuery(window).scrollLeft(),
3523						 i ? val : jQuery(window).scrollTop()
3524					) :
3525					this[ method ] = val;
3526			}) :
3527
3528			// Return the scroll offset
3529			this[0] == window || this[0] == document ?
3530				self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
3531					jQuery.boxModel && document.documentElement[ method ] ||
3532					document.body[ method ] :
3533				this[0][ method ];
3534	};
3535});
3536// Create innerHeight, innerWidth, outerHeight and outerWidth methods
3537jQuery.each([ "Height", "Width" ], function(i, name){
3538
3539	var tl = i ? "Left"  : "Top",  // top or left
3540		br = i ? "Right" : "Bottom"; // bottom or right
3541
3542	// innerHeight and innerWidth
3543	jQuery.fn["inner" + name] = function(){
3544		return this[ name.toLowerCase() ]() +
3545			num(this, "padding" + tl) +
3546			num(this, "padding" + br);
3547	};
3548
3549	// outerHeight and outerWidth
3550	jQuery.fn["outer" + name] = function(margin) {
3551		return this["inner" + name]() +
3552			num(this, "border" + tl + "Width") +
3553			num(this, "border" + br + "Width") +
3554			(margin ?
3555				num(this, "margin" + tl) + num(this, "margin" + br) : 0);
3556	};
3557
3558});})();

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.