app/jquery/jquery-1.3.2.js
changeset 2738 5723f329d098
equal deleted inserted replaced
2737:5b43af491b93 2738:5723f329d098
       
     1 /*!
       
     2  * jQuery JavaScript Library v1.3.2
       
     3  * http://jquery.com/
       
     4  *
       
     5  * Copyright (c) 2009 John Resig
       
     6  * Dual licensed under the MIT and GPL licenses.
       
     7  * http://docs.jquery.com/License
       
     8  *
       
     9  * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
       
    10  * Revision: 6246
       
    11  */
       
    12 (function(){
       
    13 
       
    14 var 
       
    15 	// Will speed up references to window, and allows munging its name.
       
    16 	window = this,
       
    17 	// Will speed up references to undefined, and allows munging its name.
       
    18 	undefined,
       
    19 	// Map over jQuery in case of overwrite
       
    20 	_jQuery = window.jQuery,
       
    21 	// Map over the $ in case of overwrite
       
    22 	_$ = window.$,
       
    23 
       
    24 	jQuery = window.jQuery = window.$ = function( selector, context ) {
       
    25 		// The jQuery object is actually just the init constructor 'enhanced'
       
    26 		return new jQuery.fn.init( selector, context );
       
    27 	},
       
    28 
       
    29 	// A simple way to check for HTML strings or ID strings
       
    30 	// (both of which we optimize for)
       
    31 	quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
       
    32 	// Is it a simple selector
       
    33 	isSimple = /^.[^:#\[\.,]*$/;
       
    34 
       
    35 jQuery.fn = jQuery.prototype = {
       
    36 	init: function( selector, context ) {
       
    37 		// Make sure that a selection was provided
       
    38 		selector = selector || document;
       
    39 
       
    40 		// Handle $(DOMElement)
       
    41 		if ( selector.nodeType ) {
       
    42 			this[0] = selector;
       
    43 			this.length = 1;
       
    44 			this.context = selector;
       
    45 			return this;
       
    46 		}
       
    47 		// Handle HTML strings
       
    48 		if ( typeof selector === "string" ) {
       
    49 			// Are we dealing with HTML string or an ID?
       
    50 			var match = quickExpr.exec( selector );
       
    51 
       
    52 			// Verify a match, and that no context was specified for #id
       
    53 			if ( match && (match[1] || !context) ) {
       
    54 
       
    55 				// HANDLE: $(html) -> $(array)
       
    56 				if ( match[1] )
       
    57 					selector = jQuery.clean( [ match[1] ], context );
       
    58 
       
    59 				// HANDLE: $("#id")
       
    60 				else {
       
    61 					var elem = document.getElementById( match[3] );
       
    62 
       
    63 					// Handle the case where IE and Opera return items
       
    64 					// by name instead of ID
       
    65 					if ( elem && elem.id != match[3] )
       
    66 						return jQuery().find( selector );
       
    67 
       
    68 					// Otherwise, we inject the element directly into the jQuery object
       
    69 					var ret = jQuery( elem || [] );
       
    70 					ret.context = document;
       
    71 					ret.selector = selector;
       
    72 					return ret;
       
    73 				}
       
    74 
       
    75 			// HANDLE: $(expr, [context])
       
    76 			// (which is just equivalent to: $(content).find(expr)
       
    77 			} else
       
    78 				return jQuery( context ).find( selector );
       
    79 
       
    80 		// HANDLE: $(function)
       
    81 		// Shortcut for document ready
       
    82 		} else if ( jQuery.isFunction( selector ) )
       
    83 			return jQuery( document ).ready( selector );
       
    84 
       
    85 		// Make sure that old selector state is passed along
       
    86 		if ( selector.selector && selector.context ) {
       
    87 			this.selector = selector.selector;
       
    88 			this.context = selector.context;
       
    89 		}
       
    90 
       
    91 		return this.setArray(jQuery.isArray( selector ) ?
       
    92 			selector :
       
    93 			jQuery.makeArray(selector));
       
    94 	},
       
    95 
       
    96 	// Start with an empty selector
       
    97 	selector: "",
       
    98 
       
    99 	// The current version of jQuery being used
       
   100 	jquery: "1.3.2",
       
   101 
       
   102 	// The number of elements contained in the matched element set
       
   103 	size: function() {
       
   104 		return this.length;
       
   105 	},
       
   106 
       
   107 	// Get the Nth element in the matched element set OR
       
   108 	// Get the whole matched element set as a clean array
       
   109 	get: function( num ) {
       
   110 		return num === undefined ?
       
   111 
       
   112 			// Return a 'clean' array
       
   113 			Array.prototype.slice.call( this ) :
       
   114 
       
   115 			// Return just the object
       
   116 			this[ num ];
       
   117 	},
       
   118 
       
   119 	// Take an array of elements and push it onto the stack
       
   120 	// (returning the new matched element set)
       
   121 	pushStack: function( elems, name, selector ) {
       
   122 		// Build a new jQuery matched element set
       
   123 		var ret = jQuery( elems );
       
   124 
       
   125 		// Add the old object onto the stack (as a reference)
       
   126 		ret.prevObject = this;
       
   127 
       
   128 		ret.context = this.context;
       
   129 
       
   130 		if ( name === "find" )
       
   131 			ret.selector = this.selector + (this.selector ? " " : "") + selector;
       
   132 		else if ( name )
       
   133 			ret.selector = this.selector + "." + name + "(" + selector + ")";
       
   134 
       
   135 		// Return the newly-formed element set
       
   136 		return ret;
       
   137 	},
       
   138 
       
   139 	// Force the current matched set of elements to become
       
   140 	// the specified array of elements (destroying the stack in the process)
       
   141 	// You should use pushStack() in order to do this, but maintain the stack
       
   142 	setArray: function( elems ) {
       
   143 		// Resetting the length to 0, then using the native Array push
       
   144 		// is a super-fast way to populate an object with array-like properties
       
   145 		this.length = 0;
       
   146 		Array.prototype.push.apply( this, elems );
       
   147 
       
   148 		return this;
       
   149 	},
       
   150 
       
   151 	// Execute a callback for every element in the matched set.
       
   152 	// (You can seed the arguments with an array of args, but this is
       
   153 	// only used internally.)
       
   154 	each: function( callback, args ) {
       
   155 		return jQuery.each( this, callback, args );
       
   156 	},
       
   157 
       
   158 	// Determine the position of an element within
       
   159 	// the matched set of elements
       
   160 	index: function( elem ) {
       
   161 		// Locate the position of the desired element
       
   162 		return jQuery.inArray(
       
   163 			// If it receives a jQuery object, the first element is used
       
   164 			elem && elem.jquery ? elem[0] : elem
       
   165 		, this );
       
   166 	},
       
   167 
       
   168 	attr: function( name, value, type ) {
       
   169 		var options = name;
       
   170 
       
   171 		// Look for the case where we're accessing a style value
       
   172 		if ( typeof name === "string" )
       
   173 			if ( value === undefined )
       
   174 				return this[0] && jQuery[ type || "attr" ]( this[0], name );
       
   175 
       
   176 			else {
       
   177 				options = {};
       
   178 				options[ name ] = value;
       
   179 			}
       
   180 
       
   181 		// Check to see if we're setting style values
       
   182 		return this.each(function(i){
       
   183 			// Set all the styles
       
   184 			for ( name in options )
       
   185 				jQuery.attr(
       
   186 					type ?
       
   187 						this.style :
       
   188 						this,
       
   189 					name, jQuery.prop( this, options[ name ], type, i, name )
       
   190 				);
       
   191 		});
       
   192 	},
       
   193 
       
   194 	css: function( key, value ) {
       
   195 		// ignore negative width and height values
       
   196 		if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
       
   197 			value = undefined;
       
   198 		return this.attr( key, value, "curCSS" );
       
   199 	},
       
   200 
       
   201 	text: function( text ) {
       
   202 		if ( typeof text !== "object" && text != null )
       
   203 			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
       
   204 
       
   205 		var ret = "";
       
   206 
       
   207 		jQuery.each( text || this, function(){
       
   208 			jQuery.each( this.childNodes, function(){
       
   209 				if ( this.nodeType != 8 )
       
   210 					ret += this.nodeType != 1 ?
       
   211 						this.nodeValue :
       
   212 						jQuery.fn.text( [ this ] );
       
   213 			});
       
   214 		});
       
   215 
       
   216 		return ret;
       
   217 	},
       
   218 
       
   219 	wrapAll: function( html ) {
       
   220 		if ( this[0] ) {
       
   221 			// The elements to wrap the target around
       
   222 			var wrap = jQuery( html, this[0].ownerDocument ).clone();
       
   223 
       
   224 			if ( this[0].parentNode )
       
   225 				wrap.insertBefore( this[0] );
       
   226 
       
   227 			wrap.map(function(){
       
   228 				var elem = this;
       
   229 
       
   230 				while ( elem.firstChild )
       
   231 					elem = elem.firstChild;
       
   232 
       
   233 				return elem;
       
   234 			}).append(this);
       
   235 		}
       
   236 
       
   237 		return this;
       
   238 	},
       
   239 
       
   240 	wrapInner: function( html ) {
       
   241 		return this.each(function(){
       
   242 			jQuery( this ).contents().wrapAll( html );
       
   243 		});
       
   244 	},
       
   245 
       
   246 	wrap: function( html ) {
       
   247 		return this.each(function(){
       
   248 			jQuery( this ).wrapAll( html );
       
   249 		});
       
   250 	},
       
   251 
       
   252 	append: function() {
       
   253 		return this.domManip(arguments, true, function(elem){
       
   254 			if (this.nodeType == 1)
       
   255 				this.appendChild( elem );
       
   256 		});
       
   257 	},
       
   258 
       
   259 	prepend: function() {
       
   260 		return this.domManip(arguments, true, function(elem){
       
   261 			if (this.nodeType == 1)
       
   262 				this.insertBefore( elem, this.firstChild );
       
   263 		});
       
   264 	},
       
   265 
       
   266 	before: function() {
       
   267 		return this.domManip(arguments, false, function(elem){
       
   268 			this.parentNode.insertBefore( elem, this );
       
   269 		});
       
   270 	},
       
   271 
       
   272 	after: function() {
       
   273 		return this.domManip(arguments, false, function(elem){
       
   274 			this.parentNode.insertBefore( elem, this.nextSibling );
       
   275 		});
       
   276 	},
       
   277 
       
   278 	end: function() {
       
   279 		return this.prevObject || jQuery( [] );
       
   280 	},
       
   281 
       
   282 	// For internal use only.
       
   283 	// Behaves like an Array's method, not like a jQuery method.
       
   284 	push: [].push,
       
   285 	sort: [].sort,
       
   286 	splice: [].splice,
       
   287 
       
   288 	find: function( selector ) {
       
   289 		if ( this.length === 1 ) {
       
   290 			var ret = this.pushStack( [], "find", selector );
       
   291 			ret.length = 0;
       
   292 			jQuery.find( selector, this[0], ret );
       
   293 			return ret;
       
   294 		} else {
       
   295 			return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
       
   296 				return jQuery.find( selector, elem );
       
   297 			})), "find", selector );
       
   298 		}
       
   299 	},
       
   300 
       
   301 	clone: function( events ) {
       
   302 		// Do the clone
       
   303 		var ret = this.map(function(){
       
   304 			if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
       
   305 				// IE copies events bound via attachEvent when
       
   306 				// using cloneNode. Calling detachEvent on the
       
   307 				// clone will also remove the events from the orignal
       
   308 				// In order to get around this, we use innerHTML.
       
   309 				// Unfortunately, this means some modifications to
       
   310 				// attributes in IE that are actually only stored
       
   311 				// as properties will not be copied (such as the
       
   312 				// the name attribute on an input).
       
   313 				var html = this.outerHTML;
       
   314 				if ( !html ) {
       
   315 					var div = this.ownerDocument.createElement("div");
       
   316 					div.appendChild( this.cloneNode(true) );
       
   317 					html = div.innerHTML;
       
   318 				}
       
   319 
       
   320 				return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0];
       
   321 			} else
       
   322 				return this.cloneNode(true);
       
   323 		});
       
   324 
       
   325 		// Copy the events from the original to the clone
       
   326 		if ( events === true ) {
       
   327 			var orig = this.find("*").andSelf(), i = 0;
       
   328 
       
   329 			ret.find("*").andSelf().each(function(){
       
   330 				if ( this.nodeName !== orig[i].nodeName )
       
   331 					return;
       
   332 
       
   333 				var events = jQuery.data( orig[i], "events" );
       
   334 
       
   335 				for ( var type in events ) {
       
   336 					for ( var handler in events[ type ] ) {
       
   337 						jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
       
   338 					}
       
   339 				}
       
   340 
       
   341 				i++;
       
   342 			});
       
   343 		}
       
   344 
       
   345 		// Return the cloned set
       
   346 		return ret;
       
   347 	},
       
   348 
       
   349 	filter: function( selector ) {
       
   350 		return this.pushStack(
       
   351 			jQuery.isFunction( selector ) &&
       
   352 			jQuery.grep(this, function(elem, i){
       
   353 				return selector.call( elem, i );
       
   354 			}) ||
       
   355 
       
   356 			jQuery.multiFilter( selector, jQuery.grep(this, function(elem){
       
   357 				return elem.nodeType === 1;
       
   358 			}) ), "filter", selector );
       
   359 	},
       
   360 
       
   361 	closest: function( selector ) {
       
   362 		var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
       
   363 			closer = 0;
       
   364 
       
   365 		return this.map(function(){
       
   366 			var cur = this;
       
   367 			while ( cur && cur.ownerDocument ) {
       
   368 				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
       
   369 					jQuery.data(cur, "closest", closer);
       
   370 					return cur;
       
   371 				}
       
   372 				cur = cur.parentNode;
       
   373 				closer++;
       
   374 			}
       
   375 		});
       
   376 	},
       
   377 
       
   378 	not: function( selector ) {
       
   379 		if ( typeof selector === "string" )
       
   380 			// test special case where just one selector is passed in
       
   381 			if ( isSimple.test( selector ) )
       
   382 				return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector );
       
   383 			else
       
   384 				selector = jQuery.multiFilter( selector, this );
       
   385 
       
   386 		var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
       
   387 		return this.filter(function() {
       
   388 			return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
       
   389 		});
       
   390 	},
       
   391 
       
   392 	add: function( selector ) {
       
   393 		return this.pushStack( jQuery.unique( jQuery.merge(
       
   394 			this.get(),
       
   395 			typeof selector === "string" ?
       
   396 				jQuery( selector ) :
       
   397 				jQuery.makeArray( selector )
       
   398 		)));
       
   399 	},
       
   400 
       
   401 	is: function( selector ) {
       
   402 		return !!selector && jQuery.multiFilter( selector, this ).length > 0;
       
   403 	},
       
   404 
       
   405 	hasClass: function( selector ) {
       
   406 		return !!selector && this.is( "." + selector );
       
   407 	},
       
   408 
       
   409 	val: function( value ) {
       
   410 		if ( value === undefined ) {			
       
   411 			var elem = this[0];
       
   412 
       
   413 			if ( elem ) {
       
   414 				if( jQuery.nodeName( elem, 'option' ) )
       
   415 					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
       
   416 				
       
   417 				// We need to handle select boxes special
       
   418 				if ( jQuery.nodeName( elem, "select" ) ) {
       
   419 					var index = elem.selectedIndex,
       
   420 						values = [],
       
   421 						options = elem.options,
       
   422 						one = elem.type == "select-one";
       
   423 
       
   424 					// Nothing was selected
       
   425 					if ( index < 0 )
       
   426 						return null;
       
   427 
       
   428 					// Loop through all the selected options
       
   429 					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
       
   430 						var option = options[ i ];
       
   431 
       
   432 						if ( option.selected ) {
       
   433 							// Get the specifc value for the option
       
   434 							value = jQuery(option).val();
       
   435 
       
   436 							// We don't need an array for one selects
       
   437 							if ( one )
       
   438 								return value;
       
   439 
       
   440 							// Multi-Selects return an array
       
   441 							values.push( value );
       
   442 						}
       
   443 					}
       
   444 
       
   445 					return values;				
       
   446 				}
       
   447 
       
   448 				// Everything else, we just grab the value
       
   449 				return (elem.value || "").replace(/\r/g, "");
       
   450 
       
   451 			}
       
   452 
       
   453 			return undefined;
       
   454 		}
       
   455 
       
   456 		if ( typeof value === "number" )
       
   457 			value += '';
       
   458 
       
   459 		return this.each(function(){
       
   460 			if ( this.nodeType != 1 )
       
   461 				return;
       
   462 
       
   463 			if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) )
       
   464 				this.checked = (jQuery.inArray(this.value, value) >= 0 ||
       
   465 					jQuery.inArray(this.name, value) >= 0);
       
   466 
       
   467 			else if ( jQuery.nodeName( this, "select" ) ) {
       
   468 				var values = jQuery.makeArray(value);
       
   469 
       
   470 				jQuery( "option", this ).each(function(){
       
   471 					this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
       
   472 						jQuery.inArray( this.text, values ) >= 0);
       
   473 				});
       
   474 
       
   475 				if ( !values.length )
       
   476 					this.selectedIndex = -1;
       
   477 
       
   478 			} else
       
   479 				this.value = value;
       
   480 		});
       
   481 	},
       
   482 
       
   483 	html: function( value ) {
       
   484 		return value === undefined ?
       
   485 			(this[0] ?
       
   486 				this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
       
   487 				null) :
       
   488 			this.empty().append( value );
       
   489 	},
       
   490 
       
   491 	replaceWith: function( value ) {
       
   492 		return this.after( value ).remove();
       
   493 	},
       
   494 
       
   495 	eq: function( i ) {
       
   496 		return this.slice( i, +i + 1 );
       
   497 	},
       
   498 
       
   499 	slice: function() {
       
   500 		return this.pushStack( Array.prototype.slice.apply( this, arguments ),
       
   501 			"slice", Array.prototype.slice.call(arguments).join(",") );
       
   502 	},
       
   503 
       
   504 	map: function( callback ) {
       
   505 		return this.pushStack( jQuery.map(this, function(elem, i){
       
   506 			return callback.call( elem, i, elem );
       
   507 		}));
       
   508 	},
       
   509 
       
   510 	andSelf: function() {
       
   511 		return this.add( this.prevObject );
       
   512 	},
       
   513 
       
   514 	domManip: function( args, table, callback ) {
       
   515 		if ( this[0] ) {
       
   516 			var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
       
   517 				scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
       
   518 				first = fragment.firstChild;
       
   519 
       
   520 			if ( first )
       
   521 				for ( var i = 0, l = this.length; i < l; i++ )
       
   522 					callback.call( root(this[i], first), this.length > 1 || i > 0 ?
       
   523 							fragment.cloneNode(true) : fragment );
       
   524 		
       
   525 			if ( scripts )
       
   526 				jQuery.each( scripts, evalScript );
       
   527 		}
       
   528 
       
   529 		return this;
       
   530 		
       
   531 		function root( elem, cur ) {
       
   532 			return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ?
       
   533 				(elem.getElementsByTagName("tbody")[0] ||
       
   534 				elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
       
   535 				elem;
       
   536 		}
       
   537 	}
       
   538 };
       
   539 
       
   540 // Give the init function the jQuery prototype for later instantiation
       
   541 jQuery.fn.init.prototype = jQuery.fn;
       
   542 
       
   543 function evalScript( i, elem ) {
       
   544 	if ( elem.src )
       
   545 		jQuery.ajax({
       
   546 			url: elem.src,
       
   547 			async: false,
       
   548 			dataType: "script"
       
   549 		});
       
   550 
       
   551 	else
       
   552 		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
       
   553 
       
   554 	if ( elem.parentNode )
       
   555 		elem.parentNode.removeChild( elem );
       
   556 }
       
   557 
       
   558 function now(){
       
   559 	return +new Date;
       
   560 }
       
   561 
       
   562 jQuery.extend = jQuery.fn.extend = function() {
       
   563 	// copy reference to target object
       
   564 	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
       
   565 
       
   566 	// Handle a deep copy situation
       
   567 	if ( typeof target === "boolean" ) {
       
   568 		deep = target;
       
   569 		target = arguments[1] || {};
       
   570 		// skip the boolean and the target
       
   571 		i = 2;
       
   572 	}
       
   573 
       
   574 	// Handle case when target is a string or something (possible in deep copy)
       
   575 	if ( typeof target !== "object" && !jQuery.isFunction(target) )
       
   576 		target = {};
       
   577 
       
   578 	// extend jQuery itself if only one argument is passed
       
   579 	if ( length == i ) {
       
   580 		target = this;
       
   581 		--i;
       
   582 	}
       
   583 
       
   584 	for ( ; i < length; i++ )
       
   585 		// Only deal with non-null/undefined values
       
   586 		if ( (options = arguments[ i ]) != null )
       
   587 			// Extend the base object
       
   588 			for ( var name in options ) {
       
   589 				var src = target[ name ], copy = options[ name ];
       
   590 
       
   591 				// Prevent never-ending loop
       
   592 				if ( target === copy )
       
   593 					continue;
       
   594 
       
   595 				// Recurse if we're merging object values
       
   596 				if ( deep && copy && typeof copy === "object" && !copy.nodeType )
       
   597 					target[ name ] = jQuery.extend( deep, 
       
   598 						// Never move original objects, clone them
       
   599 						src || ( copy.length != null ? [ ] : { } )
       
   600 					, copy );
       
   601 
       
   602 				// Don't bring in undefined values
       
   603 				else if ( copy !== undefined )
       
   604 					target[ name ] = copy;
       
   605 
       
   606 			}
       
   607 
       
   608 	// Return the modified object
       
   609 	return target;
       
   610 };
       
   611 
       
   612 // exclude the following css properties to add px
       
   613 var	exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
       
   614 	// cache defaultView
       
   615 	defaultView = document.defaultView || {},
       
   616 	toString = Object.prototype.toString;
       
   617 
       
   618 jQuery.extend({
       
   619 	noConflict: function( deep ) {
       
   620 		window.$ = _$;
       
   621 
       
   622 		if ( deep )
       
   623 			window.jQuery = _jQuery;
       
   624 
       
   625 		return jQuery;
       
   626 	},
       
   627 
       
   628 	// See test/unit/core.js for details concerning isFunction.
       
   629 	// Since version 1.3, DOM methods and functions like alert
       
   630 	// aren't supported. They return false on IE (#2968).
       
   631 	isFunction: function( obj ) {
       
   632 		return toString.call(obj) === "[object Function]";
       
   633 	},
       
   634 
       
   635 	isArray: function( obj ) {
       
   636 		return toString.call(obj) === "[object Array]";
       
   637 	},
       
   638 
       
   639 	// check if an element is in a (or is an) XML document
       
   640 	isXMLDoc: function( elem ) {
       
   641 		return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
       
   642 			!!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument );
       
   643 	},
       
   644 
       
   645 	// Evalulates a script in a global context
       
   646 	globalEval: function( data ) {
       
   647 		if ( data && /\S/.test(data) ) {
       
   648 			// Inspired by code by Andrea Giammarchi
       
   649 			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
       
   650 			var head = document.getElementsByTagName("head")[0] || document.documentElement,
       
   651 				script = document.createElement("script");
       
   652 
       
   653 			script.type = "text/javascript";
       
   654 			if ( jQuery.support.scriptEval )
       
   655 				script.appendChild( document.createTextNode( data ) );
       
   656 			else
       
   657 				script.text = data;
       
   658 
       
   659 			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
       
   660 			// This arises when a base node is used (#2709).
       
   661 			head.insertBefore( script, head.firstChild );
       
   662 			head.removeChild( script );
       
   663 		}
       
   664 	},
       
   665 
       
   666 	nodeName: function( elem, name ) {
       
   667 		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
       
   668 	},
       
   669 
       
   670 	// args is for internal usage only
       
   671 	each: function( object, callback, args ) {
       
   672 		var name, i = 0, length = object.length;
       
   673 
       
   674 		if ( args ) {
       
   675 			if ( length === undefined ) {
       
   676 				for ( name in object )
       
   677 					if ( callback.apply( object[ name ], args ) === false )
       
   678 						break;
       
   679 			} else
       
   680 				for ( ; i < length; )
       
   681 					if ( callback.apply( object[ i++ ], args ) === false )
       
   682 						break;
       
   683 
       
   684 		// A special, fast, case for the most common use of each
       
   685 		} else {
       
   686 			if ( length === undefined ) {
       
   687 				for ( name in object )
       
   688 					if ( callback.call( object[ name ], name, object[ name ] ) === false )
       
   689 						break;
       
   690 			} else
       
   691 				for ( var value = object[0];
       
   692 					i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
       
   693 		}
       
   694 
       
   695 		return object;
       
   696 	},
       
   697 
       
   698 	prop: function( elem, value, type, i, name ) {
       
   699 		// Handle executable functions
       
   700 		if ( jQuery.isFunction( value ) )
       
   701 			value = value.call( elem, i );
       
   702 
       
   703 		// Handle passing in a number to a CSS property
       
   704 		return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ?
       
   705 			value + "px" :
       
   706 			value;
       
   707 	},
       
   708 
       
   709 	className: {
       
   710 		// internal only, use addClass("class")
       
   711 		add: function( elem, classNames ) {
       
   712 			jQuery.each((classNames || "").split(/\s+/), function(i, className){
       
   713 				if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
       
   714 					elem.className += (elem.className ? " " : "") + className;
       
   715 			});
       
   716 		},
       
   717 
       
   718 		// internal only, use removeClass("class")
       
   719 		remove: function( elem, classNames ) {
       
   720 			if (elem.nodeType == 1)
       
   721 				elem.className = classNames !== undefined ?
       
   722 					jQuery.grep(elem.className.split(/\s+/), function(className){
       
   723 						return !jQuery.className.has( classNames, className );
       
   724 					}).join(" ") :
       
   725 					"";
       
   726 		},
       
   727 
       
   728 		// internal only, use hasClass("class")
       
   729 		has: function( elem, className ) {
       
   730 			return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
       
   731 		}
       
   732 	},
       
   733 
       
   734 	// A method for quickly swapping in/out CSS properties to get correct calculations
       
   735 	swap: function( elem, options, callback ) {
       
   736 		var old = {};
       
   737 		// Remember the old values, and insert the new ones
       
   738 		for ( var name in options ) {
       
   739 			old[ name ] = elem.style[ name ];
       
   740 			elem.style[ name ] = options[ name ];
       
   741 		}
       
   742 
       
   743 		callback.call( elem );
       
   744 
       
   745 		// Revert the old values
       
   746 		for ( var name in options )
       
   747 			elem.style[ name ] = old[ name ];
       
   748 	},
       
   749 
       
   750 	css: function( elem, name, force, extra ) {
       
   751 		if ( name == "width" || name == "height" ) {
       
   752 			var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
       
   753 
       
   754 			function getWH() {
       
   755 				val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
       
   756 
       
   757 				if ( extra === "border" )
       
   758 					return;
       
   759 
       
   760 				jQuery.each( which, function() {
       
   761 					if ( !extra )
       
   762 						val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
       
   763 					if ( extra === "margin" )
       
   764 						val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
       
   765 					else
       
   766 						val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
       
   767 				});
       
   768 			}
       
   769 
       
   770 			if ( elem.offsetWidth !== 0 )
       
   771 				getWH();
       
   772 			else
       
   773 				jQuery.swap( elem, props, getWH );
       
   774 
       
   775 			return Math.max(0, Math.round(val));
       
   776 		}
       
   777 
       
   778 		return jQuery.curCSS( elem, name, force );
       
   779 	},
       
   780 
       
   781 	curCSS: function( elem, name, force ) {
       
   782 		var ret, style = elem.style;
       
   783 
       
   784 		// We need to handle opacity special in IE
       
   785 		if ( name == "opacity" && !jQuery.support.opacity ) {
       
   786 			ret = jQuery.attr( style, "opacity" );
       
   787 
       
   788 			return ret == "" ?
       
   789 				"1" :
       
   790 				ret;
       
   791 		}
       
   792 
       
   793 		// Make sure we're using the right name for getting the float value
       
   794 		if ( name.match( /float/i ) )
       
   795 			name = styleFloat;
       
   796 
       
   797 		if ( !force && style && style[ name ] )
       
   798 			ret = style[ name ];
       
   799 
       
   800 		else if ( defaultView.getComputedStyle ) {
       
   801 
       
   802 			// Only "float" is needed here
       
   803 			if ( name.match( /float/i ) )
       
   804 				name = "float";
       
   805 
       
   806 			name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
       
   807 
       
   808 			var computedStyle = defaultView.getComputedStyle( elem, null );
       
   809 
       
   810 			if ( computedStyle )
       
   811 				ret = computedStyle.getPropertyValue( name );
       
   812 
       
   813 			// We should always get a number back from opacity
       
   814 			if ( name == "opacity" && ret == "" )
       
   815 				ret = "1";
       
   816 
       
   817 		} else if ( elem.currentStyle ) {
       
   818 			var camelCase = name.replace(/\-(\w)/g, function(all, letter){
       
   819 				return letter.toUpperCase();
       
   820 			});
       
   821 
       
   822 			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
       
   823 
       
   824 			// From the awesome hack by Dean Edwards
       
   825 			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
       
   826 
       
   827 			// If we're not dealing with a regular pixel number
       
   828 			// but a number that has a weird ending, we need to convert it to pixels
       
   829 			if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
       
   830 				// Remember the original values
       
   831 				var left = style.left, rsLeft = elem.runtimeStyle.left;
       
   832 
       
   833 				// Put in the new values to get a computed value out
       
   834 				elem.runtimeStyle.left = elem.currentStyle.left;
       
   835 				style.left = ret || 0;
       
   836 				ret = style.pixelLeft + "px";
       
   837 
       
   838 				// Revert the changed values
       
   839 				style.left = left;
       
   840 				elem.runtimeStyle.left = rsLeft;
       
   841 			}
       
   842 		}
       
   843 
       
   844 		return ret;
       
   845 	},
       
   846 
       
   847 	clean: function( elems, context, fragment ) {
       
   848 		context = context || document;
       
   849 
       
   850 		// !context.createElement fails in IE with an error but returns typeof 'object'
       
   851 		if ( typeof context.createElement === "undefined" )
       
   852 			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
       
   853 
       
   854 		// If a single string is passed in and it's a single tag
       
   855 		// just do a createElement and skip the rest
       
   856 		if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) {
       
   857 			var match = /^<(\w+)\s*\/?>$/.exec(elems[0]);
       
   858 			if ( match )
       
   859 				return [ context.createElement( match[1] ) ];
       
   860 		}
       
   861 
       
   862 		var ret = [], scripts = [], div = context.createElement("div");
       
   863 
       
   864 		jQuery.each(elems, function(i, elem){
       
   865 			if ( typeof elem === "number" )
       
   866 				elem += '';
       
   867 
       
   868 			if ( !elem )
       
   869 				return;
       
   870 
       
   871 			// Convert html string into DOM nodes
       
   872 			if ( typeof elem === "string" ) {
       
   873 				// Fix "XHTML"-style tags in all browsers
       
   874 				elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
       
   875 					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
       
   876 						all :
       
   877 						front + "></" + tag + ">";
       
   878 				});
       
   879 
       
   880 				// Trim whitespace, otherwise indexOf won't work as expected
       
   881 				var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
       
   882 
       
   883 				var wrap =
       
   884 					// option or optgroup
       
   885 					!tags.indexOf("<opt") &&
       
   886 					[ 1, "<select multiple='multiple'>", "</select>" ] ||
       
   887 
       
   888 					!tags.indexOf("<leg") &&
       
   889 					[ 1, "<fieldset>", "</fieldset>" ] ||
       
   890 
       
   891 					tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
       
   892 					[ 1, "<table>", "</table>" ] ||
       
   893 
       
   894 					!tags.indexOf("<tr") &&
       
   895 					[ 2, "<table><tbody>", "</tbody></table>" ] ||
       
   896 
       
   897 				 	// <thead> matched above
       
   898 					(!tags.indexOf("<td") || !tags.indexOf("<th")) &&
       
   899 					[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
       
   900 
       
   901 					!tags.indexOf("<col") &&
       
   902 					[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
       
   903 
       
   904 					// IE can't serialize <link> and <script> tags normally
       
   905 					!jQuery.support.htmlSerialize &&
       
   906 					[ 1, "div<div>", "</div>" ] ||
       
   907 
       
   908 					[ 0, "", "" ];
       
   909 
       
   910 				// Go to html and back, then peel off extra wrappers
       
   911 				div.innerHTML = wrap[1] + elem + wrap[2];
       
   912 
       
   913 				// Move to the right depth
       
   914 				while ( wrap[0]-- )
       
   915 					div = div.lastChild;
       
   916 
       
   917 				// Remove IE's autoinserted <tbody> from table fragments
       
   918 				if ( !jQuery.support.tbody ) {
       
   919 
       
   920 					// String was a <table>, *may* have spurious <tbody>
       
   921 					var hasBody = /<tbody/i.test(elem),
       
   922 						tbody = !tags.indexOf("<table") && !hasBody ?
       
   923 							div.firstChild && div.firstChild.childNodes :
       
   924 
       
   925 						// String was a bare <thead> or <tfoot>
       
   926 						wrap[1] == "<table>" && !hasBody ?
       
   927 							div.childNodes :
       
   928 							[];
       
   929 
       
   930 					for ( var j = tbody.length - 1; j >= 0 ; --j )
       
   931 						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
       
   932 							tbody[ j ].parentNode.removeChild( tbody[ j ] );
       
   933 
       
   934 					}
       
   935 
       
   936 				// IE completely kills leading whitespace when innerHTML is used
       
   937 				if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) )
       
   938 					div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
       
   939 				
       
   940 				elem = jQuery.makeArray( div.childNodes );
       
   941 			}
       
   942 
       
   943 			if ( elem.nodeType )
       
   944 				ret.push( elem );
       
   945 			else
       
   946 				ret = jQuery.merge( ret, elem );
       
   947 
       
   948 		});
       
   949 
       
   950 		if ( fragment ) {
       
   951 			for ( var i = 0; ret[i]; i++ ) {
       
   952 				if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
       
   953 					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
       
   954 				} else {
       
   955 					if ( ret[i].nodeType === 1 )
       
   956 						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
       
   957 					fragment.appendChild( ret[i] );
       
   958 				}
       
   959 			}
       
   960 			
       
   961 			return scripts;
       
   962 		}
       
   963 
       
   964 		return ret;
       
   965 	},
       
   966 
       
   967 	attr: function( elem, name, value ) {
       
   968 		// don't set attributes on text and comment nodes
       
   969 		if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
       
   970 			return undefined;
       
   971 
       
   972 		var notxml = !jQuery.isXMLDoc( elem ),
       
   973 			// Whether we are setting (or getting)
       
   974 			set = value !== undefined;
       
   975 
       
   976 		// Try to normalize/fix the name
       
   977 		name = notxml && jQuery.props[ name ] || name;
       
   978 
       
   979 		// Only do all the following if this is a node (faster for style)
       
   980 		// IE elem.getAttribute passes even for style
       
   981 		if ( elem.tagName ) {
       
   982 
       
   983 			// These attributes require special treatment
       
   984 			var special = /href|src|style/.test( name );
       
   985 
       
   986 			// Safari mis-reports the default selected property of a hidden option
       
   987 			// Accessing the parent's selectedIndex property fixes it
       
   988 			if ( name == "selected" && elem.parentNode )
       
   989 				elem.parentNode.selectedIndex;
       
   990 
       
   991 			// If applicable, access the attribute via the DOM 0 way
       
   992 			if ( name in elem && notxml && !special ) {
       
   993 				if ( set ){
       
   994 					// We can't allow the type property to be changed (since it causes problems in IE)
       
   995 					if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
       
   996 						throw "type property can't be changed";
       
   997 
       
   998 					elem[ name ] = value;
       
   999 				}
       
  1000 
       
  1001 				// browsers index elements by id/name on forms, give priority to attributes.
       
  1002 				if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
       
  1003 					return elem.getAttributeNode( name ).nodeValue;
       
  1004 
       
  1005 				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
       
  1006 				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
       
  1007 				if ( name == "tabIndex" ) {
       
  1008 					var attributeNode = elem.getAttributeNode( "tabIndex" );
       
  1009 					return attributeNode && attributeNode.specified
       
  1010 						? attributeNode.value
       
  1011 						: elem.nodeName.match(/(button|input|object|select|textarea)/i)
       
  1012 							? 0
       
  1013 							: elem.nodeName.match(/^(a|area)$/i) && elem.href
       
  1014 								? 0
       
  1015 								: undefined;
       
  1016 				}
       
  1017 
       
  1018 				return elem[ name ];
       
  1019 			}
       
  1020 
       
  1021 			if ( !jQuery.support.style && notxml &&  name == "style" )
       
  1022 				return jQuery.attr( elem.style, "cssText", value );
       
  1023 
       
  1024 			if ( set )
       
  1025 				// convert the value to a string (all browsers do this but IE) see #1070
       
  1026 				elem.setAttribute( name, "" + value );
       
  1027 
       
  1028 			var attr = !jQuery.support.hrefNormalized && notxml && special
       
  1029 					// Some attributes require a special call on IE
       
  1030 					? elem.getAttribute( name, 2 )
       
  1031 					: elem.getAttribute( name );
       
  1032 
       
  1033 			// Non-existent attributes return null, we normalize to undefined
       
  1034 			return attr === null ? undefined : attr;
       
  1035 		}
       
  1036 
       
  1037 		// elem is actually elem.style ... set the style
       
  1038 
       
  1039 		// IE uses filters for opacity
       
  1040 		if ( !jQuery.support.opacity && name == "opacity" ) {
       
  1041 			if ( set ) {
       
  1042 				// IE has trouble with opacity if it does not have layout
       
  1043 				// Force it by setting the zoom level
       
  1044 				elem.zoom = 1;
       
  1045 
       
  1046 				// Set the alpha filter to set the opacity
       
  1047 				elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
       
  1048 					(parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
       
  1049 			}
       
  1050 
       
  1051 			return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
       
  1052 				(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
       
  1053 				"";
       
  1054 		}
       
  1055 
       
  1056 		name = name.replace(/-([a-z])/ig, function(all, letter){
       
  1057 			return letter.toUpperCase();
       
  1058 		});
       
  1059 
       
  1060 		if ( set )
       
  1061 			elem[ name ] = value;
       
  1062 
       
  1063 		return elem[ name ];
       
  1064 	},
       
  1065 
       
  1066 	trim: function( text ) {
       
  1067 		return (text || "").replace( /^\s+|\s+$/g, "" );
       
  1068 	},
       
  1069 
       
  1070 	makeArray: function( array ) {
       
  1071 		var ret = [];
       
  1072 
       
  1073 		if( array != null ){
       
  1074 			var i = array.length;
       
  1075 			// The window, strings (and functions) also have 'length'
       
  1076 			if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval )
       
  1077 				ret[0] = array;
       
  1078 			else
       
  1079 				while( i )
       
  1080 					ret[--i] = array[i];
       
  1081 		}
       
  1082 
       
  1083 		return ret;
       
  1084 	},
       
  1085 
       
  1086 	inArray: function( elem, array ) {
       
  1087 		for ( var i = 0, length = array.length; i < length; i++ )
       
  1088 		// Use === because on IE, window == document
       
  1089 			if ( array[ i ] === elem )
       
  1090 				return i;
       
  1091 
       
  1092 		return -1;
       
  1093 	},
       
  1094 
       
  1095 	merge: function( first, second ) {
       
  1096 		// We have to loop this way because IE & Opera overwrite the length
       
  1097 		// expando of getElementsByTagName
       
  1098 		var i = 0, elem, pos = first.length;
       
  1099 		// Also, we need to make sure that the correct elements are being returned
       
  1100 		// (IE returns comment nodes in a '*' query)
       
  1101 		if ( !jQuery.support.getAll ) {
       
  1102 			while ( (elem = second[ i++ ]) != null )
       
  1103 				if ( elem.nodeType != 8 )
       
  1104 					first[ pos++ ] = elem;
       
  1105 
       
  1106 		} else
       
  1107 			while ( (elem = second[ i++ ]) != null )
       
  1108 				first[ pos++ ] = elem;
       
  1109 
       
  1110 		return first;
       
  1111 	},
       
  1112 
       
  1113 	unique: function( array ) {
       
  1114 		var ret = [], done = {};
       
  1115 
       
  1116 		try {
       
  1117 
       
  1118 			for ( var i = 0, length = array.length; i < length; i++ ) {
       
  1119 				var id = jQuery.data( array[ i ] );
       
  1120 
       
  1121 				if ( !done[ id ] ) {
       
  1122 					done[ id ] = true;
       
  1123 					ret.push( array[ i ] );
       
  1124 				}
       
  1125 			}
       
  1126 
       
  1127 		} catch( e ) {
       
  1128 			ret = array;
       
  1129 		}
       
  1130 
       
  1131 		return ret;
       
  1132 	},
       
  1133 
       
  1134 	grep: function( elems, callback, inv ) {
       
  1135 		var ret = [];
       
  1136 
       
  1137 		// Go through the array, only saving the items
       
  1138 		// that pass the validator function
       
  1139 		for ( var i = 0, length = elems.length; i < length; i++ )
       
  1140 			if ( !inv != !callback( elems[ i ], i ) )
       
  1141 				ret.push( elems[ i ] );
       
  1142 
       
  1143 		return ret;
       
  1144 	},
       
  1145 
       
  1146 	map: function( elems, callback ) {
       
  1147 		var ret = [];
       
  1148 
       
  1149 		// Go through the array, translating each of the items to their
       
  1150 		// new value (or values).
       
  1151 		for ( var i = 0, length = elems.length; i < length; i++ ) {
       
  1152 			var value = callback( elems[ i ], i );
       
  1153 
       
  1154 			if ( value != null )
       
  1155 				ret[ ret.length ] = value;
       
  1156 		}
       
  1157 
       
  1158 		return ret.concat.apply( [], ret );
       
  1159 	}
       
  1160 });
       
  1161 
       
  1162 // Use of jQuery.browser is deprecated.
       
  1163 // It's included for backwards compatibility and plugins,
       
  1164 // although they should work to migrate away.
       
  1165 
       
  1166 var userAgent = navigator.userAgent.toLowerCase();
       
  1167 
       
  1168 // Figure out what browser is being used
       
  1169 jQuery.browser = {
       
  1170 	version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
       
  1171 	safari: /webkit/.test( userAgent ),
       
  1172 	opera: /opera/.test( userAgent ),
       
  1173 	msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
       
  1174 	mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
       
  1175 };
       
  1176 
       
  1177 jQuery.each({
       
  1178 	parent: function(elem){return elem.parentNode;},
       
  1179 	parents: function(elem){return jQuery.dir(elem,"parentNode");},
       
  1180 	next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
       
  1181 	prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
       
  1182 	nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
       
  1183 	prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
       
  1184 	siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
       
  1185 	children: function(elem){return jQuery.sibling(elem.firstChild);},
       
  1186 	contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
       
  1187 }, function(name, fn){
       
  1188 	jQuery.fn[ name ] = function( selector ) {
       
  1189 		var ret = jQuery.map( this, fn );
       
  1190 
       
  1191 		if ( selector && typeof selector == "string" )
       
  1192 			ret = jQuery.multiFilter( selector, ret );
       
  1193 
       
  1194 		return this.pushStack( jQuery.unique( ret ), name, selector );
       
  1195 	};
       
  1196 });
       
  1197 
       
  1198 jQuery.each({
       
  1199 	appendTo: "append",
       
  1200 	prependTo: "prepend",
       
  1201 	insertBefore: "before",
       
  1202 	insertAfter: "after",
       
  1203 	replaceAll: "replaceWith"
       
  1204 }, function(name, original){
       
  1205 	jQuery.fn[ name ] = function( selector ) {
       
  1206 		var ret = [], insert = jQuery( selector );
       
  1207 
       
  1208 		for ( var i = 0, l = insert.length; i < l; i++ ) {
       
  1209 			var elems = (i > 0 ? this.clone(true) : this).get();
       
  1210 			jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
       
  1211 			ret = ret.concat( elems );
       
  1212 		}
       
  1213 
       
  1214 		return this.pushStack( ret, name, selector );
       
  1215 	};
       
  1216 });
       
  1217 
       
  1218 jQuery.each({
       
  1219 	removeAttr: function( name ) {
       
  1220 		jQuery.attr( this, name, "" );
       
  1221 		if (this.nodeType == 1)
       
  1222 			this.removeAttribute( name );
       
  1223 	},
       
  1224 
       
  1225 	addClass: function( classNames ) {
       
  1226 		jQuery.className.add( this, classNames );
       
  1227 	},
       
  1228 
       
  1229 	removeClass: function( classNames ) {
       
  1230 		jQuery.className.remove( this, classNames );
       
  1231 	},
       
  1232 
       
  1233 	toggleClass: function( classNames, state ) {
       
  1234 		if( typeof state !== "boolean" )
       
  1235 			state = !jQuery.className.has( this, classNames );
       
  1236 		jQuery.className[ state ? "add" : "remove" ]( this, classNames );
       
  1237 	},
       
  1238 
       
  1239 	remove: function( selector ) {
       
  1240 		if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
       
  1241 			// Prevent memory leaks
       
  1242 			jQuery( "*", this ).add([this]).each(function(){
       
  1243 				jQuery.event.remove(this);
       
  1244 				jQuery.removeData(this);
       
  1245 			});
       
  1246 			if (this.parentNode)
       
  1247 				this.parentNode.removeChild( this );
       
  1248 		}
       
  1249 	},
       
  1250 
       
  1251 	empty: function() {
       
  1252 		// Remove element nodes and prevent memory leaks
       
  1253 		jQuery(this).children().remove();
       
  1254 
       
  1255 		// Remove any remaining nodes
       
  1256 		while ( this.firstChild )
       
  1257 			this.removeChild( this.firstChild );
       
  1258 	}
       
  1259 }, function(name, fn){
       
  1260 	jQuery.fn[ name ] = function(){
       
  1261 		return this.each( fn, arguments );
       
  1262 	};
       
  1263 });
       
  1264 
       
  1265 // Helper function used by the dimensions and offset modules
       
  1266 function num(elem, prop) {
       
  1267 	return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
       
  1268 }
       
  1269 var expando = "jQuery" + now(), uuid = 0, windowData = {};
       
  1270 
       
  1271 jQuery.extend({
       
  1272 	cache: {},
       
  1273 
       
  1274 	data: function( elem, name, data ) {
       
  1275 		elem = elem == window ?
       
  1276 			windowData :
       
  1277 			elem;
       
  1278 
       
  1279 		var id = elem[ expando ];
       
  1280 
       
  1281 		// Compute a unique ID for the element
       
  1282 		if ( !id )
       
  1283 			id = elem[ expando ] = ++uuid;
       
  1284 
       
  1285 		// Only generate the data cache if we're
       
  1286 		// trying to access or manipulate it
       
  1287 		if ( name && !jQuery.cache[ id ] )
       
  1288 			jQuery.cache[ id ] = {};
       
  1289 
       
  1290 		// Prevent overriding the named cache with undefined values
       
  1291 		if ( data !== undefined )
       
  1292 			jQuery.cache[ id ][ name ] = data;
       
  1293 
       
  1294 		// Return the named cache data, or the ID for the element
       
  1295 		return name ?
       
  1296 			jQuery.cache[ id ][ name ] :
       
  1297 			id;
       
  1298 	},
       
  1299 
       
  1300 	removeData: function( elem, name ) {
       
  1301 		elem = elem == window ?
       
  1302 			windowData :
       
  1303 			elem;
       
  1304 
       
  1305 		var id = elem[ expando ];
       
  1306 
       
  1307 		// If we want to remove a specific section of the element's data
       
  1308 		if ( name ) {
       
  1309 			if ( jQuery.cache[ id ] ) {
       
  1310 				// Remove the section of cache data
       
  1311 				delete jQuery.cache[ id ][ name ];
       
  1312 
       
  1313 				// If we've removed all the data, remove the element's cache
       
  1314 				name = "";
       
  1315 
       
  1316 				for ( name in jQuery.cache[ id ] )
       
  1317 					break;
       
  1318 
       
  1319 				if ( !name )
       
  1320 					jQuery.removeData( elem );
       
  1321 			}
       
  1322 
       
  1323 		// Otherwise, we want to remove all of the element's data
       
  1324 		} else {
       
  1325 			// Clean up the element expando
       
  1326 			try {
       
  1327 				delete elem[ expando ];
       
  1328 			} catch(e){
       
  1329 				// IE has trouble directly removing the expando
       
  1330 				// but it's ok with using removeAttribute
       
  1331 				if ( elem.removeAttribute )
       
  1332 					elem.removeAttribute( expando );
       
  1333 			}
       
  1334 
       
  1335 			// Completely remove the data cache
       
  1336 			delete jQuery.cache[ id ];
       
  1337 		}
       
  1338 	},
       
  1339 	queue: function( elem, type, data ) {
       
  1340 		if ( elem ){
       
  1341 	
       
  1342 			type = (type || "fx") + "queue";
       
  1343 	
       
  1344 			var q = jQuery.data( elem, type );
       
  1345 	
       
  1346 			if ( !q || jQuery.isArray(data) )
       
  1347 				q = jQuery.data( elem, type, jQuery.makeArray(data) );
       
  1348 			else if( data )
       
  1349 				q.push( data );
       
  1350 	
       
  1351 		}
       
  1352 		return q;
       
  1353 	},
       
  1354 
       
  1355 	dequeue: function( elem, type ){
       
  1356 		var queue = jQuery.queue( elem, type ),
       
  1357 			fn = queue.shift();
       
  1358 		
       
  1359 		if( !type || type === "fx" )
       
  1360 			fn = queue[0];
       
  1361 			
       
  1362 		if( fn !== undefined )
       
  1363 			fn.call(elem);
       
  1364 	}
       
  1365 });
       
  1366 
       
  1367 jQuery.fn.extend({
       
  1368 	data: function( key, value ){
       
  1369 		var parts = key.split(".");
       
  1370 		parts[1] = parts[1] ? "." + parts[1] : "";
       
  1371 
       
  1372 		if ( value === undefined ) {
       
  1373 			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
       
  1374 
       
  1375 			if ( data === undefined && this.length )
       
  1376 				data = jQuery.data( this[0], key );
       
  1377 
       
  1378 			return data === undefined && parts[1] ?
       
  1379 				this.data( parts[0] ) :
       
  1380 				data;
       
  1381 		} else
       
  1382 			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
       
  1383 				jQuery.data( this, key, value );
       
  1384 			});
       
  1385 	},
       
  1386 
       
  1387 	removeData: function( key ){
       
  1388 		return this.each(function(){
       
  1389 			jQuery.removeData( this, key );
       
  1390 		});
       
  1391 	},
       
  1392 	queue: function(type, data){
       
  1393 		if ( typeof type !== "string" ) {
       
  1394 			data = type;
       
  1395 			type = "fx";
       
  1396 		}
       
  1397 
       
  1398 		if ( data === undefined )
       
  1399 			return jQuery.queue( this[0], type );
       
  1400 
       
  1401 		return this.each(function(){
       
  1402 			var queue = jQuery.queue( this, type, data );
       
  1403 			
       
  1404 			 if( type == "fx" && queue.length == 1 )
       
  1405 				queue[0].call(this);
       
  1406 		});
       
  1407 	},
       
  1408 	dequeue: function(type){
       
  1409 		return this.each(function(){
       
  1410 			jQuery.dequeue( this, type );
       
  1411 		});
       
  1412 	}
       
  1413 });/*!
       
  1414  * Sizzle CSS Selector Engine - v0.9.3
       
  1415  *  Copyright 2009, The Dojo Foundation
       
  1416  *  Released under the MIT, BSD, and GPL Licenses.
       
  1417  *  More information: http://sizzlejs.com/
       
  1418  */
       
  1419 (function(){
       
  1420 
       
  1421 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,
       
  1422 	done = 0,
       
  1423 	toString = Object.prototype.toString;
       
  1424 
       
  1425 var Sizzle = function(selector, context, results, seed) {
       
  1426 	results = results || [];
       
  1427 	context = context || document;
       
  1428 
       
  1429 	if ( context.nodeType !== 1 && context.nodeType !== 9 )
       
  1430 		return [];
       
  1431 	
       
  1432 	if ( !selector || typeof selector !== "string" ) {
       
  1433 		return results;
       
  1434 	}
       
  1435 
       
  1436 	var parts = [], m, set, checkSet, check, mode, extra, prune = true;
       
  1437 	
       
  1438 	// Reset the position of the chunker regexp (start from head)
       
  1439 	chunker.lastIndex = 0;
       
  1440 	
       
  1441 	while ( (m = chunker.exec(selector)) !== null ) {
       
  1442 		parts.push( m[1] );
       
  1443 		
       
  1444 		if ( m[2] ) {
       
  1445 			extra = RegExp.rightContext;
       
  1446 			break;
       
  1447 		}
       
  1448 	}
       
  1449 
       
  1450 	if ( parts.length > 1 && origPOS.exec( selector ) ) {
       
  1451 		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
       
  1452 			set = posProcess( parts[0] + parts[1], context );
       
  1453 		} else {
       
  1454 			set = Expr.relative[ parts[0] ] ?
       
  1455 				[ context ] :
       
  1456 				Sizzle( parts.shift(), context );
       
  1457 
       
  1458 			while ( parts.length ) {
       
  1459 				selector = parts.shift();
       
  1460 
       
  1461 				if ( Expr.relative[ selector ] )
       
  1462 					selector += parts.shift();
       
  1463 
       
  1464 				set = posProcess( selector, set );
       
  1465 			}
       
  1466 		}
       
  1467 	} else {
       
  1468 		var ret = seed ?
       
  1469 			{ expr: parts.pop(), set: makeArray(seed) } :
       
  1470 			Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) );
       
  1471 		set = Sizzle.filter( ret.expr, ret.set );
       
  1472 
       
  1473 		if ( parts.length > 0 ) {
       
  1474 			checkSet = makeArray(set);
       
  1475 		} else {
       
  1476 			prune = false;
       
  1477 		}
       
  1478 
       
  1479 		while ( parts.length ) {
       
  1480 			var cur = parts.pop(), pop = cur;
       
  1481 
       
  1482 			if ( !Expr.relative[ cur ] ) {
       
  1483 				cur = "";
       
  1484 			} else {
       
  1485 				pop = parts.pop();
       
  1486 			}
       
  1487 
       
  1488 			if ( pop == null ) {
       
  1489 				pop = context;
       
  1490 			}
       
  1491 
       
  1492 			Expr.relative[ cur ]( checkSet, pop, isXML(context) );
       
  1493 		}
       
  1494 	}
       
  1495 
       
  1496 	if ( !checkSet ) {
       
  1497 		checkSet = set;
       
  1498 	}
       
  1499 
       
  1500 	if ( !checkSet ) {
       
  1501 		throw "Syntax error, unrecognized expression: " + (cur || selector);
       
  1502 	}
       
  1503 
       
  1504 	if ( toString.call(checkSet) === "[object Array]" ) {
       
  1505 		if ( !prune ) {
       
  1506 			results.push.apply( results, checkSet );
       
  1507 		} else if ( context.nodeType === 1 ) {
       
  1508 			for ( var i = 0; checkSet[i] != null; i++ ) {
       
  1509 				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
       
  1510 					results.push( set[i] );
       
  1511 				}
       
  1512 			}
       
  1513 		} else {
       
  1514 			for ( var i = 0; checkSet[i] != null; i++ ) {
       
  1515 				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
       
  1516 					results.push( set[i] );
       
  1517 				}
       
  1518 			}
       
  1519 		}
       
  1520 	} else {
       
  1521 		makeArray( checkSet, results );
       
  1522 	}
       
  1523 
       
  1524 	if ( extra ) {
       
  1525 		Sizzle( extra, context, results, seed );
       
  1526 
       
  1527 		if ( sortOrder ) {
       
  1528 			hasDuplicate = false;
       
  1529 			results.sort(sortOrder);
       
  1530 
       
  1531 			if ( hasDuplicate ) {
       
  1532 				for ( var i = 1; i < results.length; i++ ) {
       
  1533 					if ( results[i] === results[i-1] ) {
       
  1534 						results.splice(i--, 1);
       
  1535 					}
       
  1536 				}
       
  1537 			}
       
  1538 		}
       
  1539 	}
       
  1540 
       
  1541 	return results;
       
  1542 };
       
  1543 
       
  1544 Sizzle.matches = function(expr, set){
       
  1545 	return Sizzle(expr, null, null, set);
       
  1546 };
       
  1547 
       
  1548 Sizzle.find = function(expr, context, isXML){
       
  1549 	var set, match;
       
  1550 
       
  1551 	if ( !expr ) {
       
  1552 		return [];
       
  1553 	}
       
  1554 
       
  1555 	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
       
  1556 		var type = Expr.order[i], match;
       
  1557 		
       
  1558 		if ( (match = Expr.match[ type ].exec( expr )) ) {
       
  1559 			var left = RegExp.leftContext;
       
  1560 
       
  1561 			if ( left.substr( left.length - 1 ) !== "\\" ) {
       
  1562 				match[1] = (match[1] || "").replace(/\\/g, "");
       
  1563 				set = Expr.find[ type ]( match, context, isXML );
       
  1564 				if ( set != null ) {
       
  1565 					expr = expr.replace( Expr.match[ type ], "" );
       
  1566 					break;
       
  1567 				}
       
  1568 			}
       
  1569 		}
       
  1570 	}
       
  1571 
       
  1572 	if ( !set ) {
       
  1573 		set = context.getElementsByTagName("*");
       
  1574 	}
       
  1575 
       
  1576 	return {set: set, expr: expr};
       
  1577 };
       
  1578 
       
  1579 Sizzle.filter = function(expr, set, inplace, not){
       
  1580 	var old = expr, result = [], curLoop = set, match, anyFound,
       
  1581 		isXMLFilter = set && set[0] && isXML(set[0]);
       
  1582 
       
  1583 	while ( expr && set.length ) {
       
  1584 		for ( var type in Expr.filter ) {
       
  1585 			if ( (match = Expr.match[ type ].exec( expr )) != null ) {
       
  1586 				var filter = Expr.filter[ type ], found, item;
       
  1587 				anyFound = false;
       
  1588 
       
  1589 				if ( curLoop == result ) {
       
  1590 					result = [];
       
  1591 				}
       
  1592 
       
  1593 				if ( Expr.preFilter[ type ] ) {
       
  1594 					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
       
  1595 
       
  1596 					if ( !match ) {
       
  1597 						anyFound = found = true;
       
  1598 					} else if ( match === true ) {
       
  1599 						continue;
       
  1600 					}
       
  1601 				}
       
  1602 
       
  1603 				if ( match ) {
       
  1604 					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
       
  1605 						if ( item ) {
       
  1606 							found = filter( item, match, i, curLoop );
       
  1607 							var pass = not ^ !!found;
       
  1608 
       
  1609 							if ( inplace && found != null ) {
       
  1610 								if ( pass ) {
       
  1611 									anyFound = true;
       
  1612 								} else {
       
  1613 									curLoop[i] = false;
       
  1614 								}
       
  1615 							} else if ( pass ) {
       
  1616 								result.push( item );
       
  1617 								anyFound = true;
       
  1618 							}
       
  1619 						}
       
  1620 					}
       
  1621 				}
       
  1622 
       
  1623 				if ( found !== undefined ) {
       
  1624 					if ( !inplace ) {
       
  1625 						curLoop = result;
       
  1626 					}
       
  1627 
       
  1628 					expr = expr.replace( Expr.match[ type ], "" );
       
  1629 
       
  1630 					if ( !anyFound ) {
       
  1631 						return [];
       
  1632 					}
       
  1633 
       
  1634 					break;
       
  1635 				}
       
  1636 			}
       
  1637 		}
       
  1638 
       
  1639 		// Improper expression
       
  1640 		if ( expr == old ) {
       
  1641 			if ( anyFound == null ) {
       
  1642 				throw "Syntax error, unrecognized expression: " + expr;
       
  1643 			} else {
       
  1644 				break;
       
  1645 			}
       
  1646 		}
       
  1647 
       
  1648 		old = expr;
       
  1649 	}
       
  1650 
       
  1651 	return curLoop;
       
  1652 };
       
  1653 
       
  1654 var Expr = Sizzle.selectors = {
       
  1655 	order: [ "ID", "NAME", "TAG" ],
       
  1656 	match: {
       
  1657 		ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
       
  1658 		CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,
       
  1659 		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,
       
  1660 		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
       
  1661 		TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,
       
  1662 		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
       
  1663 		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
       
  1664 		PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
       
  1665 	},
       
  1666 	attrMap: {
       
  1667 		"class": "className",
       
  1668 		"for": "htmlFor"
       
  1669 	},
       
  1670 	attrHandle: {
       
  1671 		href: function(elem){
       
  1672 			return elem.getAttribute("href");
       
  1673 		}
       
  1674 	},
       
  1675 	relative: {
       
  1676 		"+": function(checkSet, part, isXML){
       
  1677 			var isPartStr = typeof part === "string",
       
  1678 				isTag = isPartStr && !/\W/.test(part),
       
  1679 				isPartStrNotTag = isPartStr && !isTag;
       
  1680 
       
  1681 			if ( isTag && !isXML ) {
       
  1682 				part = part.toUpperCase();
       
  1683 			}
       
  1684 
       
  1685 			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
       
  1686 				if ( (elem = checkSet[i]) ) {
       
  1687 					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
       
  1688 
       
  1689 					checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ?
       
  1690 						elem || false :
       
  1691 						elem === part;
       
  1692 				}
       
  1693 			}
       
  1694 
       
  1695 			if ( isPartStrNotTag ) {
       
  1696 				Sizzle.filter( part, checkSet, true );
       
  1697 			}
       
  1698 		},
       
  1699 		">": function(checkSet, part, isXML){
       
  1700 			var isPartStr = typeof part === "string";
       
  1701 
       
  1702 			if ( isPartStr && !/\W/.test(part) ) {
       
  1703 				part = isXML ? part : part.toUpperCase();
       
  1704 
       
  1705 				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  1706 					var elem = checkSet[i];
       
  1707 					if ( elem ) {
       
  1708 						var parent = elem.parentNode;
       
  1709 						checkSet[i] = parent.nodeName === part ? parent : false;
       
  1710 					}
       
  1711 				}
       
  1712 			} else {
       
  1713 				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  1714 					var elem = checkSet[i];
       
  1715 					if ( elem ) {
       
  1716 						checkSet[i] = isPartStr ?
       
  1717 							elem.parentNode :
       
  1718 							elem.parentNode === part;
       
  1719 					}
       
  1720 				}
       
  1721 
       
  1722 				if ( isPartStr ) {
       
  1723 					Sizzle.filter( part, checkSet, true );
       
  1724 				}
       
  1725 			}
       
  1726 		},
       
  1727 		"": function(checkSet, part, isXML){
       
  1728 			var doneName = done++, checkFn = dirCheck;
       
  1729 
       
  1730 			if ( !part.match(/\W/) ) {
       
  1731 				var nodeCheck = part = isXML ? part : part.toUpperCase();
       
  1732 				checkFn = dirNodeCheck;
       
  1733 			}
       
  1734 
       
  1735 			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
       
  1736 		},
       
  1737 		"~": function(checkSet, part, isXML){
       
  1738 			var doneName = done++, checkFn = dirCheck;
       
  1739 
       
  1740 			if ( typeof part === "string" && !part.match(/\W/) ) {
       
  1741 				var nodeCheck = part = isXML ? part : part.toUpperCase();
       
  1742 				checkFn = dirNodeCheck;
       
  1743 			}
       
  1744 
       
  1745 			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
       
  1746 		}
       
  1747 	},
       
  1748 	find: {
       
  1749 		ID: function(match, context, isXML){
       
  1750 			if ( typeof context.getElementById !== "undefined" && !isXML ) {
       
  1751 				var m = context.getElementById(match[1]);
       
  1752 				return m ? [m] : [];
       
  1753 			}
       
  1754 		},
       
  1755 		NAME: function(match, context, isXML){
       
  1756 			if ( typeof context.getElementsByName !== "undefined" ) {
       
  1757 				var ret = [], results = context.getElementsByName(match[1]);
       
  1758 
       
  1759 				for ( var i = 0, l = results.length; i < l; i++ ) {
       
  1760 					if ( results[i].getAttribute("name") === match[1] ) {
       
  1761 						ret.push( results[i] );
       
  1762 					}
       
  1763 				}
       
  1764 
       
  1765 				return ret.length === 0 ? null : ret;
       
  1766 			}
       
  1767 		},
       
  1768 		TAG: function(match, context){
       
  1769 			return context.getElementsByTagName(match[1]);
       
  1770 		}
       
  1771 	},
       
  1772 	preFilter: {
       
  1773 		CLASS: function(match, curLoop, inplace, result, not, isXML){
       
  1774 			match = " " + match[1].replace(/\\/g, "") + " ";
       
  1775 
       
  1776 			if ( isXML ) {
       
  1777 				return match;
       
  1778 			}
       
  1779 
       
  1780 			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
       
  1781 				if ( elem ) {
       
  1782 					if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) {
       
  1783 						if ( !inplace )
       
  1784 							result.push( elem );
       
  1785 					} else if ( inplace ) {
       
  1786 						curLoop[i] = false;
       
  1787 					}
       
  1788 				}
       
  1789 			}
       
  1790 
       
  1791 			return false;
       
  1792 		},
       
  1793 		ID: function(match){
       
  1794 			return match[1].replace(/\\/g, "");
       
  1795 		},
       
  1796 		TAG: function(match, curLoop){
       
  1797 			for ( var i = 0; curLoop[i] === false; i++ ){}
       
  1798 			return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase();
       
  1799 		},
       
  1800 		CHILD: function(match){
       
  1801 			if ( match[1] == "nth" ) {
       
  1802 				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
       
  1803 				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
       
  1804 					match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" ||
       
  1805 					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
       
  1806 
       
  1807 				// calculate the numbers (first)n+(last) including if they are negative
       
  1808 				match[2] = (test[1] + (test[2] || 1)) - 0;
       
  1809 				match[3] = test[3] - 0;
       
  1810 			}
       
  1811 
       
  1812 			// TODO: Move to normal caching system
       
  1813 			match[0] = done++;
       
  1814 
       
  1815 			return match;
       
  1816 		},
       
  1817 		ATTR: function(match, curLoop, inplace, result, not, isXML){
       
  1818 			var name = match[1].replace(/\\/g, "");
       
  1819 			
       
  1820 			if ( !isXML && Expr.attrMap[name] ) {
       
  1821 				match[1] = Expr.attrMap[name];
       
  1822 			}
       
  1823 
       
  1824 			if ( match[2] === "~=" ) {
       
  1825 				match[4] = " " + match[4] + " ";
       
  1826 			}
       
  1827 
       
  1828 			return match;
       
  1829 		},
       
  1830 		PSEUDO: function(match, curLoop, inplace, result, not){
       
  1831 			if ( match[1] === "not" ) {
       
  1832 				// If we're dealing with a complex expression, or a simple one
       
  1833 				if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) {
       
  1834 					match[3] = Sizzle(match[3], null, null, curLoop);
       
  1835 				} else {
       
  1836 					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
       
  1837 					if ( !inplace ) {
       
  1838 						result.push.apply( result, ret );
       
  1839 					}
       
  1840 					return false;
       
  1841 				}
       
  1842 			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
       
  1843 				return true;
       
  1844 			}
       
  1845 			
       
  1846 			return match;
       
  1847 		},
       
  1848 		POS: function(match){
       
  1849 			match.unshift( true );
       
  1850 			return match;
       
  1851 		}
       
  1852 	},
       
  1853 	filters: {
       
  1854 		enabled: function(elem){
       
  1855 			return elem.disabled === false && elem.type !== "hidden";
       
  1856 		},
       
  1857 		disabled: function(elem){
       
  1858 			return elem.disabled === true;
       
  1859 		},
       
  1860 		checked: function(elem){
       
  1861 			return elem.checked === true;
       
  1862 		},
       
  1863 		selected: function(elem){
       
  1864 			// Accessing this property makes selected-by-default
       
  1865 			// options in Safari work properly
       
  1866 			elem.parentNode.selectedIndex;
       
  1867 			return elem.selected === true;
       
  1868 		},
       
  1869 		parent: function(elem){
       
  1870 			return !!elem.firstChild;
       
  1871 		},
       
  1872 		empty: function(elem){
       
  1873 			return !elem.firstChild;
       
  1874 		},
       
  1875 		has: function(elem, i, match){
       
  1876 			return !!Sizzle( match[3], elem ).length;
       
  1877 		},
       
  1878 		header: function(elem){
       
  1879 			return /h\d/i.test( elem.nodeName );
       
  1880 		},
       
  1881 		text: function(elem){
       
  1882 			return "text" === elem.type;
       
  1883 		},
       
  1884 		radio: function(elem){
       
  1885 			return "radio" === elem.type;
       
  1886 		},
       
  1887 		checkbox: function(elem){
       
  1888 			return "checkbox" === elem.type;
       
  1889 		},
       
  1890 		file: function(elem){
       
  1891 			return "file" === elem.type;
       
  1892 		},
       
  1893 		password: function(elem){
       
  1894 			return "password" === elem.type;
       
  1895 		},
       
  1896 		submit: function(elem){
       
  1897 			return "submit" === elem.type;
       
  1898 		},
       
  1899 		image: function(elem){
       
  1900 			return "image" === elem.type;
       
  1901 		},
       
  1902 		reset: function(elem){
       
  1903 			return "reset" === elem.type;
       
  1904 		},
       
  1905 		button: function(elem){
       
  1906 			return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON";
       
  1907 		},
       
  1908 		input: function(elem){
       
  1909 			return /input|select|textarea|button/i.test(elem.nodeName);
       
  1910 		}
       
  1911 	},
       
  1912 	setFilters: {
       
  1913 		first: function(elem, i){
       
  1914 			return i === 0;
       
  1915 		},
       
  1916 		last: function(elem, i, match, array){
       
  1917 			return i === array.length - 1;
       
  1918 		},
       
  1919 		even: function(elem, i){
       
  1920 			return i % 2 === 0;
       
  1921 		},
       
  1922 		odd: function(elem, i){
       
  1923 			return i % 2 === 1;
       
  1924 		},
       
  1925 		lt: function(elem, i, match){
       
  1926 			return i < match[3] - 0;
       
  1927 		},
       
  1928 		gt: function(elem, i, match){
       
  1929 			return i > match[3] - 0;
       
  1930 		},
       
  1931 		nth: function(elem, i, match){
       
  1932 			return match[3] - 0 == i;
       
  1933 		},
       
  1934 		eq: function(elem, i, match){
       
  1935 			return match[3] - 0 == i;
       
  1936 		}
       
  1937 	},
       
  1938 	filter: {
       
  1939 		PSEUDO: function(elem, match, i, array){
       
  1940 			var name = match[1], filter = Expr.filters[ name ];
       
  1941 
       
  1942 			if ( filter ) {
       
  1943 				return filter( elem, i, match, array );
       
  1944 			} else if ( name === "contains" ) {
       
  1945 				return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0;
       
  1946 			} else if ( name === "not" ) {
       
  1947 				var not = match[3];
       
  1948 
       
  1949 				for ( var i = 0, l = not.length; i < l; i++ ) {
       
  1950 					if ( not[i] === elem ) {
       
  1951 						return false;
       
  1952 					}
       
  1953 				}
       
  1954 
       
  1955 				return true;
       
  1956 			}
       
  1957 		},
       
  1958 		CHILD: function(elem, match){
       
  1959 			var type = match[1], node = elem;
       
  1960 			switch (type) {
       
  1961 				case 'only':
       
  1962 				case 'first':
       
  1963 					while (node = node.previousSibling)  {
       
  1964 						if ( node.nodeType === 1 ) return false;
       
  1965 					}
       
  1966 					if ( type == 'first') return true;
       
  1967 					node = elem;
       
  1968 				case 'last':
       
  1969 					while (node = node.nextSibling)  {
       
  1970 						if ( node.nodeType === 1 ) return false;
       
  1971 					}
       
  1972 					return true;
       
  1973 				case 'nth':
       
  1974 					var first = match[2], last = match[3];
       
  1975 
       
  1976 					if ( first == 1 && last == 0 ) {
       
  1977 						return true;
       
  1978 					}
       
  1979 					
       
  1980 					var doneName = match[0],
       
  1981 						parent = elem.parentNode;
       
  1982 	
       
  1983 					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
       
  1984 						var count = 0;
       
  1985 						for ( node = parent.firstChild; node; node = node.nextSibling ) {
       
  1986 							if ( node.nodeType === 1 ) {
       
  1987 								node.nodeIndex = ++count;
       
  1988 							}
       
  1989 						} 
       
  1990 						parent.sizcache = doneName;
       
  1991 					}
       
  1992 					
       
  1993 					var diff = elem.nodeIndex - last;
       
  1994 					if ( first == 0 ) {
       
  1995 						return diff == 0;
       
  1996 					} else {
       
  1997 						return ( diff % first == 0 && diff / first >= 0 );
       
  1998 					}
       
  1999 			}
       
  2000 		},
       
  2001 		ID: function(elem, match){
       
  2002 			return elem.nodeType === 1 && elem.getAttribute("id") === match;
       
  2003 		},
       
  2004 		TAG: function(elem, match){
       
  2005 			return (match === "*" && elem.nodeType === 1) || elem.nodeName === match;
       
  2006 		},
       
  2007 		CLASS: function(elem, match){
       
  2008 			return (" " + (elem.className || elem.getAttribute("class")) + " ")
       
  2009 				.indexOf( match ) > -1;
       
  2010 		},
       
  2011 		ATTR: function(elem, match){
       
  2012 			var name = match[1],
       
  2013 				result = Expr.attrHandle[ name ] ?
       
  2014 					Expr.attrHandle[ name ]( elem ) :
       
  2015 					elem[ name ] != null ?
       
  2016 						elem[ name ] :
       
  2017 						elem.getAttribute( name ),
       
  2018 				value = result + "",
       
  2019 				type = match[2],
       
  2020 				check = match[4];
       
  2021 
       
  2022 			return result == null ?
       
  2023 				type === "!=" :
       
  2024 				type === "=" ?
       
  2025 				value === check :
       
  2026 				type === "*=" ?
       
  2027 				value.indexOf(check) >= 0 :
       
  2028 				type === "~=" ?
       
  2029 				(" " + value + " ").indexOf(check) >= 0 :
       
  2030 				!check ?
       
  2031 				value && result !== false :
       
  2032 				type === "!=" ?
       
  2033 				value != check :
       
  2034 				type === "^=" ?
       
  2035 				value.indexOf(check) === 0 :
       
  2036 				type === "$=" ?
       
  2037 				value.substr(value.length - check.length) === check :
       
  2038 				type === "|=" ?
       
  2039 				value === check || value.substr(0, check.length + 1) === check + "-" :
       
  2040 				false;
       
  2041 		},
       
  2042 		POS: function(elem, match, i, array){
       
  2043 			var name = match[2], filter = Expr.setFilters[ name ];
       
  2044 
       
  2045 			if ( filter ) {
       
  2046 				return filter( elem, i, match, array );
       
  2047 			}
       
  2048 		}
       
  2049 	}
       
  2050 };
       
  2051 
       
  2052 var origPOS = Expr.match.POS;
       
  2053 
       
  2054 for ( var type in Expr.match ) {
       
  2055 	Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
       
  2056 }
       
  2057 
       
  2058 var makeArray = function(array, results) {
       
  2059 	array = Array.prototype.slice.call( array );
       
  2060 
       
  2061 	if ( results ) {
       
  2062 		results.push.apply( results, array );
       
  2063 		return results;
       
  2064 	}
       
  2065 	
       
  2066 	return array;
       
  2067 };
       
  2068 
       
  2069 // Perform a simple check to determine if the browser is capable of
       
  2070 // converting a NodeList to an array using builtin methods.
       
  2071 try {
       
  2072 	Array.prototype.slice.call( document.documentElement.childNodes );
       
  2073 
       
  2074 // Provide a fallback method if it does not work
       
  2075 } catch(e){
       
  2076 	makeArray = function(array, results) {
       
  2077 		var ret = results || [];
       
  2078 
       
  2079 		if ( toString.call(array) === "[object Array]" ) {
       
  2080 			Array.prototype.push.apply( ret, array );
       
  2081 		} else {
       
  2082 			if ( typeof array.length === "number" ) {
       
  2083 				for ( var i = 0, l = array.length; i < l; i++ ) {
       
  2084 					ret.push( array[i] );
       
  2085 				}
       
  2086 			} else {
       
  2087 				for ( var i = 0; array[i]; i++ ) {
       
  2088 					ret.push( array[i] );
       
  2089 				}
       
  2090 			}
       
  2091 		}
       
  2092 
       
  2093 		return ret;
       
  2094 	};
       
  2095 }
       
  2096 
       
  2097 var sortOrder;
       
  2098 
       
  2099 if ( document.documentElement.compareDocumentPosition ) {
       
  2100 	sortOrder = function( a, b ) {
       
  2101 		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
       
  2102 		if ( ret === 0 ) {
       
  2103 			hasDuplicate = true;
       
  2104 		}
       
  2105 		return ret;
       
  2106 	};
       
  2107 } else if ( "sourceIndex" in document.documentElement ) {
       
  2108 	sortOrder = function( a, b ) {
       
  2109 		var ret = a.sourceIndex - b.sourceIndex;
       
  2110 		if ( ret === 0 ) {
       
  2111 			hasDuplicate = true;
       
  2112 		}
       
  2113 		return ret;
       
  2114 	};
       
  2115 } else if ( document.createRange ) {
       
  2116 	sortOrder = function( a, b ) {
       
  2117 		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
       
  2118 		aRange.selectNode(a);
       
  2119 		aRange.collapse(true);
       
  2120 		bRange.selectNode(b);
       
  2121 		bRange.collapse(true);
       
  2122 		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
       
  2123 		if ( ret === 0 ) {
       
  2124 			hasDuplicate = true;
       
  2125 		}
       
  2126 		return ret;
       
  2127 	};
       
  2128 }
       
  2129 
       
  2130 // Check to see if the browser returns elements by name when
       
  2131 // querying by getElementById (and provide a workaround)
       
  2132 (function(){
       
  2133 	// We're going to inject a fake input element with a specified name
       
  2134 	var form = document.createElement("form"),
       
  2135 		id = "script" + (new Date).getTime();
       
  2136 	form.innerHTML = "<input name='" + id + "'/>";
       
  2137 
       
  2138 	// Inject it into the root element, check its status, and remove it quickly
       
  2139 	var root = document.documentElement;
       
  2140 	root.insertBefore( form, root.firstChild );
       
  2141 
       
  2142 	// The workaround has to do additional checks after a getElementById
       
  2143 	// Which slows things down for other browsers (hence the branching)
       
  2144 	if ( !!document.getElementById( id ) ) {
       
  2145 		Expr.find.ID = function(match, context, isXML){
       
  2146 			if ( typeof context.getElementById !== "undefined" && !isXML ) {
       
  2147 				var m = context.getElementById(match[1]);
       
  2148 				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
       
  2149 			}
       
  2150 		};
       
  2151 
       
  2152 		Expr.filter.ID = function(elem, match){
       
  2153 			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
       
  2154 			return elem.nodeType === 1 && node && node.nodeValue === match;
       
  2155 		};
       
  2156 	}
       
  2157 
       
  2158 	root.removeChild( form );
       
  2159 })();
       
  2160 
       
  2161 (function(){
       
  2162 	// Check to see if the browser returns only elements
       
  2163 	// when doing getElementsByTagName("*")
       
  2164 
       
  2165 	// Create a fake element
       
  2166 	var div = document.createElement("div");
       
  2167 	div.appendChild( document.createComment("") );
       
  2168 
       
  2169 	// Make sure no comments are found
       
  2170 	if ( div.getElementsByTagName("*").length > 0 ) {
       
  2171 		Expr.find.TAG = function(match, context){
       
  2172 			var results = context.getElementsByTagName(match[1]);
       
  2173 
       
  2174 			// Filter out possible comments
       
  2175 			if ( match[1] === "*" ) {
       
  2176 				var tmp = [];
       
  2177 
       
  2178 				for ( var i = 0; results[i]; i++ ) {
       
  2179 					if ( results[i].nodeType === 1 ) {
       
  2180 						tmp.push( results[i] );
       
  2181 					}
       
  2182 				}
       
  2183 
       
  2184 				results = tmp;
       
  2185 			}
       
  2186 
       
  2187 			return results;
       
  2188 		};
       
  2189 	}
       
  2190 
       
  2191 	// Check to see if an attribute returns normalized href attributes
       
  2192 	div.innerHTML = "<a href='#'></a>";
       
  2193 	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
       
  2194 			div.firstChild.getAttribute("href") !== "#" ) {
       
  2195 		Expr.attrHandle.href = function(elem){
       
  2196 			return elem.getAttribute("href", 2);
       
  2197 		};
       
  2198 	}
       
  2199 })();
       
  2200 
       
  2201 if ( document.querySelectorAll ) (function(){
       
  2202 	var oldSizzle = Sizzle, div = document.createElement("div");
       
  2203 	div.innerHTML = "<p class='TEST'></p>";
       
  2204 
       
  2205 	// Safari can't handle uppercase or unicode characters when
       
  2206 	// in quirks mode.
       
  2207 	if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
       
  2208 		return;
       
  2209 	}
       
  2210 	
       
  2211 	Sizzle = function(query, context, extra, seed){
       
  2212 		context = context || document;
       
  2213 
       
  2214 		// Only use querySelectorAll on non-XML documents
       
  2215 		// (ID selectors don't work in non-HTML documents)
       
  2216 		if ( !seed && context.nodeType === 9 && !isXML(context) ) {
       
  2217 			try {
       
  2218 				return makeArray( context.querySelectorAll(query), extra );
       
  2219 			} catch(e){}
       
  2220 		}
       
  2221 		
       
  2222 		return oldSizzle(query, context, extra, seed);
       
  2223 	};
       
  2224 
       
  2225 	Sizzle.find = oldSizzle.find;
       
  2226 	Sizzle.filter = oldSizzle.filter;
       
  2227 	Sizzle.selectors = oldSizzle.selectors;
       
  2228 	Sizzle.matches = oldSizzle.matches;
       
  2229 })();
       
  2230 
       
  2231 if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){
       
  2232 	var div = document.createElement("div");
       
  2233 	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
       
  2234 
       
  2235 	// Opera can't find a second classname (in 9.6)
       
  2236 	if ( div.getElementsByClassName("e").length === 0 )
       
  2237 		return;
       
  2238 
       
  2239 	// Safari caches class attributes, doesn't catch changes (in 3.2)
       
  2240 	div.lastChild.className = "e";
       
  2241 
       
  2242 	if ( div.getElementsByClassName("e").length === 1 )
       
  2243 		return;
       
  2244 
       
  2245 	Expr.order.splice(1, 0, "CLASS");
       
  2246 	Expr.find.CLASS = function(match, context, isXML) {
       
  2247 		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
       
  2248 			return context.getElementsByClassName(match[1]);
       
  2249 		}
       
  2250 	};
       
  2251 })();
       
  2252 
       
  2253 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
       
  2254 	var sibDir = dir == "previousSibling" && !isXML;
       
  2255 	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  2256 		var elem = checkSet[i];
       
  2257 		if ( elem ) {
       
  2258 			if ( sibDir && elem.nodeType === 1 ){
       
  2259 				elem.sizcache = doneName;
       
  2260 				elem.sizset = i;
       
  2261 			}
       
  2262 			elem = elem[dir];
       
  2263 			var match = false;
       
  2264 
       
  2265 			while ( elem ) {
       
  2266 				if ( elem.sizcache === doneName ) {
       
  2267 					match = checkSet[elem.sizset];
       
  2268 					break;
       
  2269 				}
       
  2270 
       
  2271 				if ( elem.nodeType === 1 && !isXML ){
       
  2272 					elem.sizcache = doneName;
       
  2273 					elem.sizset = i;
       
  2274 				}
       
  2275 
       
  2276 				if ( elem.nodeName === cur ) {
       
  2277 					match = elem;
       
  2278 					break;
       
  2279 				}
       
  2280 
       
  2281 				elem = elem[dir];
       
  2282 			}
       
  2283 
       
  2284 			checkSet[i] = match;
       
  2285 		}
       
  2286 	}
       
  2287 }
       
  2288 
       
  2289 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
       
  2290 	var sibDir = dir == "previousSibling" && !isXML;
       
  2291 	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  2292 		var elem = checkSet[i];
       
  2293 		if ( elem ) {
       
  2294 			if ( sibDir && elem.nodeType === 1 ) {
       
  2295 				elem.sizcache = doneName;
       
  2296 				elem.sizset = i;
       
  2297 			}
       
  2298 			elem = elem[dir];
       
  2299 			var match = false;
       
  2300 
       
  2301 			while ( elem ) {
       
  2302 				if ( elem.sizcache === doneName ) {
       
  2303 					match = checkSet[elem.sizset];
       
  2304 					break;
       
  2305 				}
       
  2306 
       
  2307 				if ( elem.nodeType === 1 ) {
       
  2308 					if ( !isXML ) {
       
  2309 						elem.sizcache = doneName;
       
  2310 						elem.sizset = i;
       
  2311 					}
       
  2312 					if ( typeof cur !== "string" ) {
       
  2313 						if ( elem === cur ) {
       
  2314 							match = true;
       
  2315 							break;
       
  2316 						}
       
  2317 
       
  2318 					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
       
  2319 						match = elem;
       
  2320 						break;
       
  2321 					}
       
  2322 				}
       
  2323 
       
  2324 				elem = elem[dir];
       
  2325 			}
       
  2326 
       
  2327 			checkSet[i] = match;
       
  2328 		}
       
  2329 	}
       
  2330 }
       
  2331 
       
  2332 var contains = document.compareDocumentPosition ?  function(a, b){
       
  2333 	return a.compareDocumentPosition(b) & 16;
       
  2334 } : function(a, b){
       
  2335 	return a !== b && (a.contains ? a.contains(b) : true);
       
  2336 };
       
  2337 
       
  2338 var isXML = function(elem){
       
  2339 	return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" ||
       
  2340 		!!elem.ownerDocument && isXML( elem.ownerDocument );
       
  2341 };
       
  2342 
       
  2343 var posProcess = function(selector, context){
       
  2344 	var tmpSet = [], later = "", match,
       
  2345 		root = context.nodeType ? [context] : context;
       
  2346 
       
  2347 	// Position selectors must be done after the filter
       
  2348 	// And so must :not(positional) so we move all PSEUDOs to the end
       
  2349 	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
       
  2350 		later += match[0];
       
  2351 		selector = selector.replace( Expr.match.PSEUDO, "" );
       
  2352 	}
       
  2353 
       
  2354 	selector = Expr.relative[selector] ? selector + "*" : selector;
       
  2355 
       
  2356 	for ( var i = 0, l = root.length; i < l; i++ ) {
       
  2357 		Sizzle( selector, root[i], tmpSet );
       
  2358 	}
       
  2359 
       
  2360 	return Sizzle.filter( later, tmpSet );
       
  2361 };
       
  2362 
       
  2363 // EXPOSE
       
  2364 jQuery.find = Sizzle;
       
  2365 jQuery.filter = Sizzle.filter;
       
  2366 jQuery.expr = Sizzle.selectors;
       
  2367 jQuery.expr[":"] = jQuery.expr.filters;
       
  2368 
       
  2369 Sizzle.selectors.filters.hidden = function(elem){
       
  2370 	return elem.offsetWidth === 0 || elem.offsetHeight === 0;
       
  2371 };
       
  2372 
       
  2373 Sizzle.selectors.filters.visible = function(elem){
       
  2374 	return elem.offsetWidth > 0 || elem.offsetHeight > 0;
       
  2375 };
       
  2376 
       
  2377 Sizzle.selectors.filters.animated = function(elem){
       
  2378 	return jQuery.grep(jQuery.timers, function(fn){
       
  2379 		return elem === fn.elem;
       
  2380 	}).length;
       
  2381 };
       
  2382 
       
  2383 jQuery.multiFilter = function( expr, elems, not ) {
       
  2384 	if ( not ) {
       
  2385 		expr = ":not(" + expr + ")";
       
  2386 	}
       
  2387 
       
  2388 	return Sizzle.matches(expr, elems);
       
  2389 };
       
  2390 
       
  2391 jQuery.dir = function( elem, dir ){
       
  2392 	var matched = [], cur = elem[dir];
       
  2393 	while ( cur && cur != document ) {
       
  2394 		if ( cur.nodeType == 1 )
       
  2395 			matched.push( cur );
       
  2396 		cur = cur[dir];
       
  2397 	}
       
  2398 	return matched;
       
  2399 };
       
  2400 
       
  2401 jQuery.nth = function(cur, result, dir, elem){
       
  2402 	result = result || 1;
       
  2403 	var num = 0;
       
  2404 
       
  2405 	for ( ; cur; cur = cur[dir] )
       
  2406 		if ( cur.nodeType == 1 && ++num == result )
       
  2407 			break;
       
  2408 
       
  2409 	return cur;
       
  2410 };
       
  2411 
       
  2412 jQuery.sibling = function(n, elem){
       
  2413 	var r = [];
       
  2414 
       
  2415 	for ( ; n; n = n.nextSibling ) {
       
  2416 		if ( n.nodeType == 1 && n != elem )
       
  2417 			r.push( n );
       
  2418 	}
       
  2419 
       
  2420 	return r;
       
  2421 };
       
  2422 
       
  2423 return;
       
  2424 
       
  2425 window.Sizzle = Sizzle;
       
  2426 
       
  2427 })();
       
  2428 /*
       
  2429  * A number of helper functions used for managing events.
       
  2430  * Many of the ideas behind this code originated from
       
  2431  * Dean Edwards' addEvent library.
       
  2432  */
       
  2433 jQuery.event = {
       
  2434 
       
  2435 	// Bind an event to an element
       
  2436 	// Original by Dean Edwards
       
  2437 	add: function(elem, types, handler, data) {
       
  2438 		if ( elem.nodeType == 3 || elem.nodeType == 8 )
       
  2439 			return;
       
  2440 
       
  2441 		// For whatever reason, IE has trouble passing the window object
       
  2442 		// around, causing it to be cloned in the process
       
  2443 		if ( elem.setInterval && elem != window )
       
  2444 			elem = window;
       
  2445 
       
  2446 		// Make sure that the function being executed has a unique ID
       
  2447 		if ( !handler.guid )
       
  2448 			handler.guid = this.guid++;
       
  2449 
       
  2450 		// if data is passed, bind to handler
       
  2451 		if ( data !== undefined ) {
       
  2452 			// Create temporary function pointer to original handler
       
  2453 			var fn = handler;
       
  2454 
       
  2455 			// Create unique handler function, wrapped around original handler
       
  2456 			handler = this.proxy( fn );
       
  2457 
       
  2458 			// Store data in unique handler
       
  2459 			handler.data = data;
       
  2460 		}
       
  2461 
       
  2462 		// Init the element's event structure
       
  2463 		var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
       
  2464 			handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
       
  2465 				// Handle the second event of a trigger and when
       
  2466 				// an event is called after a page has unloaded
       
  2467 				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
       
  2468 					jQuery.event.handle.apply(arguments.callee.elem, arguments) :
       
  2469 					undefined;
       
  2470 			});
       
  2471 		// Add elem as a property of the handle function
       
  2472 		// This is to prevent a memory leak with non-native
       
  2473 		// event in IE.
       
  2474 		handle.elem = elem;
       
  2475 
       
  2476 		// Handle multiple events separated by a space
       
  2477 		// jQuery(...).bind("mouseover mouseout", fn);
       
  2478 		jQuery.each(types.split(/\s+/), function(index, type) {
       
  2479 			// Namespaced event handlers
       
  2480 			var namespaces = type.split(".");
       
  2481 			type = namespaces.shift();
       
  2482 			handler.type = namespaces.slice().sort().join(".");
       
  2483 
       
  2484 			// Get the current list of functions bound to this event
       
  2485 			var handlers = events[type];
       
  2486 			
       
  2487 			if ( jQuery.event.specialAll[type] )
       
  2488 				jQuery.event.specialAll[type].setup.call(elem, data, namespaces);
       
  2489 
       
  2490 			// Init the event handler queue
       
  2491 			if (!handlers) {
       
  2492 				handlers = events[type] = {};
       
  2493 
       
  2494 				// Check for a special event handler
       
  2495 				// Only use addEventListener/attachEvent if the special
       
  2496 				// events handler returns false
       
  2497 				if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) {
       
  2498 					// Bind the global event handler to the element
       
  2499 					if (elem.addEventListener)
       
  2500 						elem.addEventListener(type, handle, false);
       
  2501 					else if (elem.attachEvent)
       
  2502 						elem.attachEvent("on" + type, handle);
       
  2503 				}
       
  2504 			}
       
  2505 
       
  2506 			// Add the function to the element's handler list
       
  2507 			handlers[handler.guid] = handler;
       
  2508 
       
  2509 			// Keep track of which events have been used, for global triggering
       
  2510 			jQuery.event.global[type] = true;
       
  2511 		});
       
  2512 
       
  2513 		// Nullify elem to prevent memory leaks in IE
       
  2514 		elem = null;
       
  2515 	},
       
  2516 
       
  2517 	guid: 1,
       
  2518 	global: {},
       
  2519 
       
  2520 	// Detach an event or set of events from an element
       
  2521 	remove: function(elem, types, handler) {
       
  2522 		// don't do events on text and comment nodes
       
  2523 		if ( elem.nodeType == 3 || elem.nodeType == 8 )
       
  2524 			return;
       
  2525 
       
  2526 		var events = jQuery.data(elem, "events"), ret, index;
       
  2527 
       
  2528 		if ( events ) {
       
  2529 			// Unbind all events for the element
       
  2530 			if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") )
       
  2531 				for ( var type in events )
       
  2532 					this.remove( elem, type + (types || "") );
       
  2533 			else {
       
  2534 				// types is actually an event object here
       
  2535 				if ( types.type ) {
       
  2536 					handler = types.handler;
       
  2537 					types = types.type;
       
  2538 				}
       
  2539 
       
  2540 				// Handle multiple events seperated by a space
       
  2541 				// jQuery(...).unbind("mouseover mouseout", fn);
       
  2542 				jQuery.each(types.split(/\s+/), function(index, type){
       
  2543 					// Namespaced event handlers
       
  2544 					var namespaces = type.split(".");
       
  2545 					type = namespaces.shift();
       
  2546 					var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
       
  2547 
       
  2548 					if ( events[type] ) {
       
  2549 						// remove the given handler for the given type
       
  2550 						if ( handler )
       
  2551 							delete events[type][handler.guid];
       
  2552 
       
  2553 						// remove all handlers for the given type
       
  2554 						else
       
  2555 							for ( var handle in events[type] )
       
  2556 								// Handle the removal of namespaced events
       
  2557 								if ( namespace.test(events[type][handle].type) )
       
  2558 									delete events[type][handle];
       
  2559 									
       
  2560 						if ( jQuery.event.specialAll[type] )
       
  2561 							jQuery.event.specialAll[type].teardown.call(elem, namespaces);
       
  2562 
       
  2563 						// remove generic event handler if no more handlers exist
       
  2564 						for ( ret in events[type] ) break;
       
  2565 						if ( !ret ) {
       
  2566 							if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) {
       
  2567 								if (elem.removeEventListener)
       
  2568 									elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
       
  2569 								else if (elem.detachEvent)
       
  2570 									elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
       
  2571 							}
       
  2572 							ret = null;
       
  2573 							delete events[type];
       
  2574 						}
       
  2575 					}
       
  2576 				});
       
  2577 			}
       
  2578 
       
  2579 			// Remove the expando if it's no longer used
       
  2580 			for ( ret in events ) break;
       
  2581 			if ( !ret ) {
       
  2582 				var handle = jQuery.data( elem, "handle" );
       
  2583 				if ( handle ) handle.elem = null;
       
  2584 				jQuery.removeData( elem, "events" );
       
  2585 				jQuery.removeData( elem, "handle" );
       
  2586 			}
       
  2587 		}
       
  2588 	},
       
  2589 
       
  2590 	// bubbling is internal
       
  2591 	trigger: function( event, data, elem, bubbling ) {
       
  2592 		// Event object or event type
       
  2593 		var type = event.type || event;
       
  2594 
       
  2595 		if( !bubbling ){
       
  2596 			event = typeof event === "object" ?
       
  2597 				// jQuery.Event object
       
  2598 				event[expando] ? event :
       
  2599 				// Object literal
       
  2600 				jQuery.extend( jQuery.Event(type), event ) :
       
  2601 				// Just the event type (string)
       
  2602 				jQuery.Event(type);
       
  2603 
       
  2604 			if ( type.indexOf("!") >= 0 ) {
       
  2605 				event.type = type = type.slice(0, -1);
       
  2606 				event.exclusive = true;
       
  2607 			}
       
  2608 
       
  2609 			// Handle a global trigger
       
  2610 			if ( !elem ) {
       
  2611 				// Don't bubble custom events when global (to avoid too much overhead)
       
  2612 				event.stopPropagation();
       
  2613 				// Only trigger if we've ever bound an event for it
       
  2614 				if ( this.global[type] )
       
  2615 					jQuery.each( jQuery.cache, function(){
       
  2616 						if ( this.events && this.events[type] )
       
  2617 							jQuery.event.trigger( event, data, this.handle.elem );
       
  2618 					});
       
  2619 			}
       
  2620 
       
  2621 			// Handle triggering a single element
       
  2622 
       
  2623 			// don't do events on text and comment nodes
       
  2624 			if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 )
       
  2625 				return undefined;
       
  2626 			
       
  2627 			// Clean up in case it is reused
       
  2628 			event.result = undefined;
       
  2629 			event.target = elem;
       
  2630 			
       
  2631 			// Clone the incoming data, if any
       
  2632 			data = jQuery.makeArray(data);
       
  2633 			data.unshift( event );
       
  2634 		}
       
  2635 
       
  2636 		event.currentTarget = elem;
       
  2637 
       
  2638 		// Trigger the event, it is assumed that "handle" is a function
       
  2639 		var handle = jQuery.data(elem, "handle");
       
  2640 		if ( handle )
       
  2641 			handle.apply( elem, data );
       
  2642 
       
  2643 		// Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
       
  2644 		if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
       
  2645 			event.result = false;
       
  2646 
       
  2647 		// Trigger the native events (except for clicks on links)
       
  2648 		if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
       
  2649 			this.triggered = true;
       
  2650 			try {
       
  2651 				elem[ type ]();
       
  2652 			// prevent IE from throwing an error for some hidden elements
       
  2653 			} catch (e) {}
       
  2654 		}
       
  2655 
       
  2656 		this.triggered = false;
       
  2657 
       
  2658 		if ( !event.isPropagationStopped() ) {
       
  2659 			var parent = elem.parentNode || elem.ownerDocument;
       
  2660 			if ( parent )
       
  2661 				jQuery.event.trigger(event, data, parent, true);
       
  2662 		}
       
  2663 	},
       
  2664 
       
  2665 	handle: function(event) {
       
  2666 		// returned undefined or false
       
  2667 		var all, handlers;
       
  2668 
       
  2669 		event = arguments[0] = jQuery.event.fix( event || window.event );
       
  2670 		event.currentTarget = this;
       
  2671 		
       
  2672 		// Namespaced event handlers
       
  2673 		var namespaces = event.type.split(".");
       
  2674 		event.type = namespaces.shift();
       
  2675 
       
  2676 		// Cache this now, all = true means, any handler
       
  2677 		all = !namespaces.length && !event.exclusive;
       
  2678 		
       
  2679 		var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)");
       
  2680 
       
  2681 		handlers = ( jQuery.data(this, "events") || {} )[event.type];
       
  2682 
       
  2683 		for ( var j in handlers ) {
       
  2684 			var handler = handlers[j];
       
  2685 
       
  2686 			// Filter the functions by class
       
  2687 			if ( all || namespace.test(handler.type) ) {
       
  2688 				// Pass in a reference to the handler function itself
       
  2689 				// So that we can later remove it
       
  2690 				event.handler = handler;
       
  2691 				event.data = handler.data;
       
  2692 
       
  2693 				var ret = handler.apply(this, arguments);
       
  2694 
       
  2695 				if( ret !== undefined ){
       
  2696 					event.result = ret;
       
  2697 					if ( ret === false ) {
       
  2698 						event.preventDefault();
       
  2699 						event.stopPropagation();
       
  2700 					}
       
  2701 				}
       
  2702 
       
  2703 				if( event.isImmediatePropagationStopped() )
       
  2704 					break;
       
  2705 
       
  2706 			}
       
  2707 		}
       
  2708 	},
       
  2709 
       
  2710 	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 toElement view wheelDelta which".split(" "),
       
  2711 
       
  2712 	fix: function(event) {
       
  2713 		if ( event[expando] )
       
  2714 			return event;
       
  2715 
       
  2716 		// store a copy of the original event object
       
  2717 		// and "clone" to set read-only properties
       
  2718 		var originalEvent = event;
       
  2719 		event = jQuery.Event( originalEvent );
       
  2720 
       
  2721 		for ( var i = this.props.length, prop; i; ){
       
  2722 			prop = this.props[ --i ];
       
  2723 			event[ prop ] = originalEvent[ prop ];
       
  2724 		}
       
  2725 
       
  2726 		// Fix target property, if necessary
       
  2727 		if ( !event.target )
       
  2728 			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
       
  2729 
       
  2730 		// check if target is a textnode (safari)
       
  2731 		if ( event.target.nodeType == 3 )
       
  2732 			event.target = event.target.parentNode;
       
  2733 
       
  2734 		// Add relatedTarget, if necessary
       
  2735 		if ( !event.relatedTarget && event.fromElement )
       
  2736 			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
       
  2737 
       
  2738 		// Calculate pageX/Y if missing and clientX/Y available
       
  2739 		if ( event.pageX == null && event.clientX != null ) {
       
  2740 			var doc = document.documentElement, body = document.body;
       
  2741 			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
       
  2742 			event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
       
  2743 		}
       
  2744 
       
  2745 		// Add which for key events
       
  2746 		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
       
  2747 			event.which = event.charCode || event.keyCode;
       
  2748 
       
  2749 		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
       
  2750 		if ( !event.metaKey && event.ctrlKey )
       
  2751 			event.metaKey = event.ctrlKey;
       
  2752 
       
  2753 		// Add which for click: 1 == left; 2 == middle; 3 == right
       
  2754 		// Note: button is not normalized, so don't use it
       
  2755 		if ( !event.which && event.button )
       
  2756 			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
       
  2757 
       
  2758 		return event;
       
  2759 	},
       
  2760 
       
  2761 	proxy: function( fn, proxy ){
       
  2762 		proxy = proxy || function(){ return fn.apply(this, arguments); };
       
  2763 		// Set the guid of unique handler to the same of original handler, so it can be removed
       
  2764 		proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
       
  2765 		// So proxy can be declared as an argument
       
  2766 		return proxy;
       
  2767 	},
       
  2768 
       
  2769 	special: {
       
  2770 		ready: {
       
  2771 			// Make sure the ready event is setup
       
  2772 			setup: bindReady,
       
  2773 			teardown: function() {}
       
  2774 		}
       
  2775 	},
       
  2776 	
       
  2777 	specialAll: {
       
  2778 		live: {
       
  2779 			setup: function( selector, namespaces ){
       
  2780 				jQuery.event.add( this, namespaces[0], liveHandler );
       
  2781 			},
       
  2782 			teardown:  function( namespaces ){
       
  2783 				if ( namespaces.length ) {
       
  2784 					var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)");
       
  2785 					
       
  2786 					jQuery.each( (jQuery.data(this, "events").live || {}), function(){
       
  2787 						if ( name.test(this.type) )
       
  2788 							remove++;
       
  2789 					});
       
  2790 					
       
  2791 					if ( remove < 1 )
       
  2792 						jQuery.event.remove( this, namespaces[0], liveHandler );
       
  2793 				}
       
  2794 			}
       
  2795 		}
       
  2796 	}
       
  2797 };
       
  2798 
       
  2799 jQuery.Event = function( src ){
       
  2800 	// Allow instantiation without the 'new' keyword
       
  2801 	if( !this.preventDefault )
       
  2802 		return new jQuery.Event(src);
       
  2803 	
       
  2804 	// Event object
       
  2805 	if( src && src.type ){
       
  2806 		this.originalEvent = src;
       
  2807 		this.type = src.type;
       
  2808 	// Event type
       
  2809 	}else
       
  2810 		this.type = src;
       
  2811 
       
  2812 	// timeStamp is buggy for some events on Firefox(#3843)
       
  2813 	// So we won't rely on the native value
       
  2814 	this.timeStamp = now();
       
  2815 	
       
  2816 	// Mark it as fixed
       
  2817 	this[expando] = true;
       
  2818 };
       
  2819 
       
  2820 function returnFalse(){
       
  2821 	return false;
       
  2822 }
       
  2823 function returnTrue(){
       
  2824 	return true;
       
  2825 }
       
  2826 
       
  2827 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
       
  2828 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
       
  2829 jQuery.Event.prototype = {
       
  2830 	preventDefault: function() {
       
  2831 		this.isDefaultPrevented = returnTrue;
       
  2832 
       
  2833 		var e = this.originalEvent;
       
  2834 		if( !e )
       
  2835 			return;
       
  2836 		// if preventDefault exists run it on the original event
       
  2837 		if (e.preventDefault)
       
  2838 			e.preventDefault();
       
  2839 		// otherwise set the returnValue property of the original event to false (IE)
       
  2840 		e.returnValue = false;
       
  2841 	},
       
  2842 	stopPropagation: function() {
       
  2843 		this.isPropagationStopped = returnTrue;
       
  2844 
       
  2845 		var e = this.originalEvent;
       
  2846 		if( !e )
       
  2847 			return;
       
  2848 		// if stopPropagation exists run it on the original event
       
  2849 		if (e.stopPropagation)
       
  2850 			e.stopPropagation();
       
  2851 		// otherwise set the cancelBubble property of the original event to true (IE)
       
  2852 		e.cancelBubble = true;
       
  2853 	},
       
  2854 	stopImmediatePropagation:function(){
       
  2855 		this.isImmediatePropagationStopped = returnTrue;
       
  2856 		this.stopPropagation();
       
  2857 	},
       
  2858 	isDefaultPrevented: returnFalse,
       
  2859 	isPropagationStopped: returnFalse,
       
  2860 	isImmediatePropagationStopped: returnFalse
       
  2861 };
       
  2862 // Checks if an event happened on an element within another element
       
  2863 // Used in jQuery.event.special.mouseenter and mouseleave handlers
       
  2864 var withinElement = function(event) {
       
  2865 	// Check if mouse(over|out) are still within the same parent element
       
  2866 	var parent = event.relatedTarget;
       
  2867 	// Traverse up the tree
       
  2868 	while ( parent && parent != this )
       
  2869 		try { parent = parent.parentNode; }
       
  2870 		catch(e) { parent = this; }
       
  2871 	
       
  2872 	if( parent != this ){
       
  2873 		// set the correct event type
       
  2874 		event.type = event.data;
       
  2875 		// handle event if we actually just moused on to a non sub-element
       
  2876 		jQuery.event.handle.apply( this, arguments );
       
  2877 	}
       
  2878 };
       
  2879 	
       
  2880 jQuery.each({ 
       
  2881 	mouseover: 'mouseenter', 
       
  2882 	mouseout: 'mouseleave'
       
  2883 }, function( orig, fix ){
       
  2884 	jQuery.event.special[ fix ] = {
       
  2885 		setup: function(){
       
  2886 			jQuery.event.add( this, orig, withinElement, fix );
       
  2887 		},
       
  2888 		teardown: function(){
       
  2889 			jQuery.event.remove( this, orig, withinElement );
       
  2890 		}
       
  2891 	};			   
       
  2892 });
       
  2893 
       
  2894 jQuery.fn.extend({
       
  2895 	bind: function( type, data, fn ) {
       
  2896 		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
       
  2897 			jQuery.event.add( this, type, fn || data, fn && data );
       
  2898 		});
       
  2899 	},
       
  2900 
       
  2901 	one: function( type, data, fn ) {
       
  2902 		var one = jQuery.event.proxy( fn || data, function(event) {
       
  2903 			jQuery(this).unbind(event, one);
       
  2904 			return (fn || data).apply( this, arguments );
       
  2905 		});
       
  2906 		return this.each(function(){
       
  2907 			jQuery.event.add( this, type, one, fn && data);
       
  2908 		});
       
  2909 	},
       
  2910 
       
  2911 	unbind: function( type, fn ) {
       
  2912 		return this.each(function(){
       
  2913 			jQuery.event.remove( this, type, fn );
       
  2914 		});
       
  2915 	},
       
  2916 
       
  2917 	trigger: function( type, data ) {
       
  2918 		return this.each(function(){
       
  2919 			jQuery.event.trigger( type, data, this );
       
  2920 		});
       
  2921 	},
       
  2922 
       
  2923 	triggerHandler: function( type, data ) {
       
  2924 		if( this[0] ){
       
  2925 			var event = jQuery.Event(type);
       
  2926 			event.preventDefault();
       
  2927 			event.stopPropagation();
       
  2928 			jQuery.event.trigger( event, data, this[0] );
       
  2929 			return event.result;
       
  2930 		}		
       
  2931 	},
       
  2932 
       
  2933 	toggle: function( fn ) {
       
  2934 		// Save reference to arguments for access in closure
       
  2935 		var args = arguments, i = 1;
       
  2936 
       
  2937 		// link all the functions, so any of them can unbind this click handler
       
  2938 		while( i < args.length )
       
  2939 			jQuery.event.proxy( fn, args[i++] );
       
  2940 
       
  2941 		return this.click( jQuery.event.proxy( fn, function(event) {
       
  2942 			// Figure out which function to execute
       
  2943 			this.lastToggle = ( this.lastToggle || 0 ) % i;
       
  2944 
       
  2945 			// Make sure that clicks stop
       
  2946 			event.preventDefault();
       
  2947 
       
  2948 			// and execute the function
       
  2949 			return args[ this.lastToggle++ ].apply( this, arguments ) || false;
       
  2950 		}));
       
  2951 	},
       
  2952 
       
  2953 	hover: function(fnOver, fnOut) {
       
  2954 		return this.mouseenter(fnOver).mouseleave(fnOut);
       
  2955 	},
       
  2956 
       
  2957 	ready: function(fn) {
       
  2958 		// Attach the listeners
       
  2959 		bindReady();
       
  2960 
       
  2961 		// If the DOM is already ready
       
  2962 		if ( jQuery.isReady )
       
  2963 			// Execute the function immediately
       
  2964 			fn.call( document, jQuery );
       
  2965 
       
  2966 		// Otherwise, remember the function for later
       
  2967 		else
       
  2968 			// Add the function to the wait list
       
  2969 			jQuery.readyList.push( fn );
       
  2970 
       
  2971 		return this;
       
  2972 	},
       
  2973 	
       
  2974 	live: function( type, fn ){
       
  2975 		var proxy = jQuery.event.proxy( fn );
       
  2976 		proxy.guid += this.selector + type;
       
  2977 
       
  2978 		jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
       
  2979 
       
  2980 		return this;
       
  2981 	},
       
  2982 	
       
  2983 	die: function( type, fn ){
       
  2984 		jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null );
       
  2985 		return this;
       
  2986 	}
       
  2987 });
       
  2988 
       
  2989 function liveHandler( event ){
       
  2990 	var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
       
  2991 		stop = true,
       
  2992 		elems = [];
       
  2993 
       
  2994 	jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
       
  2995 		if ( check.test(fn.type) ) {
       
  2996 			var elem = jQuery(event.target).closest(fn.data)[0];
       
  2997 			if ( elem )
       
  2998 				elems.push({ elem: elem, fn: fn });
       
  2999 		}
       
  3000 	});
       
  3001 
       
  3002 	elems.sort(function(a,b) {
       
  3003 		return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest");
       
  3004 	});
       
  3005 	
       
  3006 	jQuery.each(elems, function(){
       
  3007 		if ( this.fn.call(this.elem, event, this.fn.data) === false )
       
  3008 			return (stop = false);
       
  3009 	});
       
  3010 
       
  3011 	return stop;
       
  3012 }
       
  3013 
       
  3014 function liveConvert(type, selector){
       
  3015 	return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join(".");
       
  3016 }
       
  3017 
       
  3018 jQuery.extend({
       
  3019 	isReady: false,
       
  3020 	readyList: [],
       
  3021 	// Handle when the DOM is ready
       
  3022 	ready: function() {
       
  3023 		// Make sure that the DOM is not already loaded
       
  3024 		if ( !jQuery.isReady ) {
       
  3025 			// Remember that the DOM is ready
       
  3026 			jQuery.isReady = true;
       
  3027 
       
  3028 			// If there are functions bound, to execute
       
  3029 			if ( jQuery.readyList ) {
       
  3030 				// Execute all of them
       
  3031 				jQuery.each( jQuery.readyList, function(){
       
  3032 					this.call( document, jQuery );
       
  3033 				});
       
  3034 
       
  3035 				// Reset the list of functions
       
  3036 				jQuery.readyList = null;
       
  3037 			}
       
  3038 
       
  3039 			// Trigger any bound ready events
       
  3040 			jQuery(document).triggerHandler("ready");
       
  3041 		}
       
  3042 	}
       
  3043 });
       
  3044 
       
  3045 var readyBound = false;
       
  3046 
       
  3047 function bindReady(){
       
  3048 	if ( readyBound ) return;
       
  3049 	readyBound = true;
       
  3050 
       
  3051 	// Mozilla, Opera and webkit nightlies currently support this event
       
  3052 	if ( document.addEventListener ) {
       
  3053 		// Use the handy event callback
       
  3054 		document.addEventListener( "DOMContentLoaded", function(){
       
  3055 			document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
       
  3056 			jQuery.ready();
       
  3057 		}, false );
       
  3058 
       
  3059 	// If IE event model is used
       
  3060 	} else if ( document.attachEvent ) {
       
  3061 		// ensure firing before onload,
       
  3062 		// maybe late but safe also for iframes
       
  3063 		document.attachEvent("onreadystatechange", function(){
       
  3064 			if ( document.readyState === "complete" ) {
       
  3065 				document.detachEvent( "onreadystatechange", arguments.callee );
       
  3066 				jQuery.ready();
       
  3067 			}
       
  3068 		});
       
  3069 
       
  3070 		// If IE and not an iframe
       
  3071 		// continually check to see if the document is ready
       
  3072 		if ( document.documentElement.doScroll && window == window.top ) (function(){
       
  3073 			if ( jQuery.isReady ) return;
       
  3074 
       
  3075 			try {
       
  3076 				// If IE is used, use the trick by Diego Perini
       
  3077 				// http://javascript.nwbox.com/IEContentLoaded/
       
  3078 				document.documentElement.doScroll("left");
       
  3079 			} catch( error ) {
       
  3080 				setTimeout( arguments.callee, 0 );
       
  3081 				return;
       
  3082 			}
       
  3083 
       
  3084 			// and execute any waiting functions
       
  3085 			jQuery.ready();
       
  3086 		})();
       
  3087 	}
       
  3088 
       
  3089 	// A fallback to window.onload, that will always work
       
  3090 	jQuery.event.add( window, "load", jQuery.ready );
       
  3091 }
       
  3092 
       
  3093 jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
       
  3094 	"mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," +
       
  3095 	"change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){
       
  3096 
       
  3097 	// Handle event binding
       
  3098 	jQuery.fn[name] = function(fn){
       
  3099 		return fn ? this.bind(name, fn) : this.trigger(name);
       
  3100 	};
       
  3101 });
       
  3102 
       
  3103 // Prevent memory leaks in IE
       
  3104 // And prevent errors on refresh with events like mouseover in other browsers
       
  3105 // Window isn't included so as not to unbind existing unload events
       
  3106 jQuery( window ).bind( 'unload', function(){ 
       
  3107 	for ( var id in jQuery.cache )
       
  3108 		// Skip the window
       
  3109 		if ( id != 1 && jQuery.cache[ id ].handle )
       
  3110 			jQuery.event.remove( jQuery.cache[ id ].handle.elem );
       
  3111 }); 
       
  3112 (function(){
       
  3113 
       
  3114 	jQuery.support = {};
       
  3115 
       
  3116 	var root = document.documentElement,
       
  3117 		script = document.createElement("script"),
       
  3118 		div = document.createElement("div"),
       
  3119 		id = "script" + (new Date).getTime();
       
  3120 
       
  3121 	div.style.display = "none";
       
  3122 	div.innerHTML = '   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';
       
  3123 
       
  3124 	var all = div.getElementsByTagName("*"),
       
  3125 		a = div.getElementsByTagName("a")[0];
       
  3126 
       
  3127 	// Can't get basic test support
       
  3128 	if ( !all || !all.length || !a ) {
       
  3129 		return;
       
  3130 	}
       
  3131 
       
  3132 	jQuery.support = {
       
  3133 		// IE strips leading whitespace when .innerHTML is used
       
  3134 		leadingWhitespace: div.firstChild.nodeType == 3,
       
  3135 		
       
  3136 		// Make sure that tbody elements aren't automatically inserted
       
  3137 		// IE will insert them into empty tables
       
  3138 		tbody: !div.getElementsByTagName("tbody").length,
       
  3139 		
       
  3140 		// Make sure that you can get all elements in an <object> element
       
  3141 		// IE 7 always returns no results
       
  3142 		objectAll: !!div.getElementsByTagName("object")[0]
       
  3143 			.getElementsByTagName("*").length,
       
  3144 		
       
  3145 		// Make sure that link elements get serialized correctly by innerHTML
       
  3146 		// This requires a wrapper element in IE
       
  3147 		htmlSerialize: !!div.getElementsByTagName("link").length,
       
  3148 		
       
  3149 		// Get the style information from getAttribute
       
  3150 		// (IE uses .cssText insted)
       
  3151 		style: /red/.test( a.getAttribute("style") ),
       
  3152 		
       
  3153 		// Make sure that URLs aren't manipulated
       
  3154 		// (IE normalizes it by default)
       
  3155 		hrefNormalized: a.getAttribute("href") === "/a",
       
  3156 		
       
  3157 		// Make sure that element opacity exists
       
  3158 		// (IE uses filter instead)
       
  3159 		opacity: a.style.opacity === "0.5",
       
  3160 		
       
  3161 		// Verify style float existence
       
  3162 		// (IE uses styleFloat instead of cssFloat)
       
  3163 		cssFloat: !!a.style.cssFloat,
       
  3164 
       
  3165 		// Will be defined later
       
  3166 		scriptEval: false,
       
  3167 		noCloneEvent: true,
       
  3168 		boxModel: null
       
  3169 	};
       
  3170 	
       
  3171 	script.type = "text/javascript";
       
  3172 	try {
       
  3173 		script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
       
  3174 	} catch(e){}
       
  3175 
       
  3176 	root.insertBefore( script, root.firstChild );
       
  3177 	
       
  3178 	// Make sure that the execution of code works by injecting a script
       
  3179 	// tag with appendChild/createTextNode
       
  3180 	// (IE doesn't support this, fails, and uses .text instead)
       
  3181 	if ( window[ id ] ) {
       
  3182 		jQuery.support.scriptEval = true;
       
  3183 		delete window[ id ];
       
  3184 	}
       
  3185 
       
  3186 	root.removeChild( script );
       
  3187 
       
  3188 	if ( div.attachEvent && div.fireEvent ) {
       
  3189 		div.attachEvent("onclick", function(){
       
  3190 			// Cloning a node shouldn't copy over any
       
  3191 			// bound event handlers (IE does this)
       
  3192 			jQuery.support.noCloneEvent = false;
       
  3193 			div.detachEvent("onclick", arguments.callee);
       
  3194 		});
       
  3195 		div.cloneNode(true).fireEvent("onclick");
       
  3196 	}
       
  3197 
       
  3198 	// Figure out if the W3C box model works as expected
       
  3199 	// document.body must exist before we can do this
       
  3200 	jQuery(function(){
       
  3201 		var div = document.createElement("div");
       
  3202 		div.style.width = div.style.paddingLeft = "1px";
       
  3203 
       
  3204 		document.body.appendChild( div );
       
  3205 		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
       
  3206 		document.body.removeChild( div ).style.display = 'none';
       
  3207 	});
       
  3208 })();
       
  3209 
       
  3210 var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat";
       
  3211 
       
  3212 jQuery.props = {
       
  3213 	"for": "htmlFor",
       
  3214 	"class": "className",
       
  3215 	"float": styleFloat,
       
  3216 	cssFloat: styleFloat,
       
  3217 	styleFloat: styleFloat,
       
  3218 	readonly: "readOnly",
       
  3219 	maxlength: "maxLength",
       
  3220 	cellspacing: "cellSpacing",
       
  3221 	rowspan: "rowSpan",
       
  3222 	tabindex: "tabIndex"
       
  3223 };
       
  3224 jQuery.fn.extend({
       
  3225 	// Keep a copy of the old load
       
  3226 	_load: jQuery.fn.load,
       
  3227 
       
  3228 	load: function( url, params, callback ) {
       
  3229 		if ( typeof url !== "string" )
       
  3230 			return this._load( url );
       
  3231 
       
  3232 		var off = url.indexOf(" ");
       
  3233 		if ( off >= 0 ) {
       
  3234 			var selector = url.slice(off, url.length);
       
  3235 			url = url.slice(0, off);
       
  3236 		}
       
  3237 
       
  3238 		// Default to a GET request
       
  3239 		var type = "GET";
       
  3240 
       
  3241 		// If the second parameter was provided
       
  3242 		if ( params )
       
  3243 			// If it's a function
       
  3244 			if ( jQuery.isFunction( params ) ) {
       
  3245 				// We assume that it's the callback
       
  3246 				callback = params;
       
  3247 				params = null;
       
  3248 
       
  3249 			// Otherwise, build a param string
       
  3250 			} else if( typeof params === "object" ) {
       
  3251 				params = jQuery.param( params );
       
  3252 				type = "POST";
       
  3253 			}
       
  3254 
       
  3255 		var self = this;
       
  3256 
       
  3257 		// Request the remote document
       
  3258 		jQuery.ajax({
       
  3259 			url: url,
       
  3260 			type: type,
       
  3261 			dataType: "html",
       
  3262 			data: params,
       
  3263 			complete: function(res, status){
       
  3264 				// If successful, inject the HTML into all the matched elements
       
  3265 				if ( status == "success" || status == "notmodified" )
       
  3266 					// See if a selector was specified
       
  3267 					self.html( selector ?
       
  3268 						// Create a dummy div to hold the results
       
  3269 						jQuery("<div/>")
       
  3270 							// inject the contents of the document in, removing the scripts
       
  3271 							// to avoid any 'Permission Denied' errors in IE
       
  3272 							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
       
  3273 
       
  3274 							// Locate the specified elements
       
  3275 							.find(selector) :
       
  3276 
       
  3277 						// If not, just inject the full result
       
  3278 						res.responseText );
       
  3279 
       
  3280 				if( callback )
       
  3281 					self.each( callback, [res.responseText, status, res] );
       
  3282 			}
       
  3283 		});
       
  3284 		return this;
       
  3285 	},
       
  3286 
       
  3287 	serialize: function() {
       
  3288 		return jQuery.param(this.serializeArray());
       
  3289 	},
       
  3290 	serializeArray: function() {
       
  3291 		return this.map(function(){
       
  3292 			return this.elements ? jQuery.makeArray(this.elements) : this;
       
  3293 		})
       
  3294 		.filter(function(){
       
  3295 			return this.name && !this.disabled &&
       
  3296 				(this.checked || /select|textarea/i.test(this.nodeName) ||
       
  3297 					/text|hidden|password|search/i.test(this.type));
       
  3298 		})
       
  3299 		.map(function(i, elem){
       
  3300 			var val = jQuery(this).val();
       
  3301 			return val == null ? null :
       
  3302 				jQuery.isArray(val) ?
       
  3303 					jQuery.map( val, function(val, i){
       
  3304 						return {name: elem.name, value: val};
       
  3305 					}) :
       
  3306 					{name: elem.name, value: val};
       
  3307 		}).get();
       
  3308 	}
       
  3309 });
       
  3310 
       
  3311 // Attach a bunch of functions for handling common AJAX events
       
  3312 jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
       
  3313 	jQuery.fn[o] = function(f){
       
  3314 		return this.bind(o, f);
       
  3315 	};
       
  3316 });
       
  3317 
       
  3318 var jsc = now();
       
  3319 
       
  3320 jQuery.extend({
       
  3321   
       
  3322 	get: function( url, data, callback, type ) {
       
  3323 		// shift arguments if data argument was ommited
       
  3324 		if ( jQuery.isFunction( data ) ) {
       
  3325 			callback = data;
       
  3326 			data = null;
       
  3327 		}
       
  3328 
       
  3329 		return jQuery.ajax({
       
  3330 			type: "GET",
       
  3331 			url: url,
       
  3332 			data: data,
       
  3333 			success: callback,
       
  3334 			dataType: type
       
  3335 		});
       
  3336 	},
       
  3337 
       
  3338 	getScript: function( url, callback ) {
       
  3339 		return jQuery.get(url, null, callback, "script");
       
  3340 	},
       
  3341 
       
  3342 	getJSON: function( url, data, callback ) {
       
  3343 		return jQuery.get(url, data, callback, "json");
       
  3344 	},
       
  3345 
       
  3346 	post: function( url, data, callback, type ) {
       
  3347 		if ( jQuery.isFunction( data ) ) {
       
  3348 			callback = data;
       
  3349 			data = {};
       
  3350 		}
       
  3351 
       
  3352 		return jQuery.ajax({
       
  3353 			type: "POST",
       
  3354 			url: url,
       
  3355 			data: data,
       
  3356 			success: callback,
       
  3357 			dataType: type
       
  3358 		});
       
  3359 	},
       
  3360 
       
  3361 	ajaxSetup: function( settings ) {
       
  3362 		jQuery.extend( jQuery.ajaxSettings, settings );
       
  3363 	},
       
  3364 
       
  3365 	ajaxSettings: {
       
  3366 		url: location.href,
       
  3367 		global: true,
       
  3368 		type: "GET",
       
  3369 		contentType: "application/x-www-form-urlencoded",
       
  3370 		processData: true,
       
  3371 		async: true,
       
  3372 		/*
       
  3373 		timeout: 0,
       
  3374 		data: null,
       
  3375 		username: null,
       
  3376 		password: null,
       
  3377 		*/
       
  3378 		// Create the request object; Microsoft failed to properly
       
  3379 		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
       
  3380 		// This function can be overriden by calling jQuery.ajaxSetup
       
  3381 		xhr:function(){
       
  3382 			return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
       
  3383 		},
       
  3384 		accepts: {
       
  3385 			xml: "application/xml, text/xml",
       
  3386 			html: "text/html",
       
  3387 			script: "text/javascript, application/javascript",
       
  3388 			json: "application/json, text/javascript",
       
  3389 			text: "text/plain",
       
  3390 			_default: "*/*"
       
  3391 		}
       
  3392 	},
       
  3393 
       
  3394 	// Last-Modified header cache for next request
       
  3395 	lastModified: {},
       
  3396 
       
  3397 	ajax: function( s ) {
       
  3398 		// Extend the settings, but re-extend 's' so that it can be
       
  3399 		// checked again later (in the test suite, specifically)
       
  3400 		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
       
  3401 
       
  3402 		var jsonp, jsre = /=\?(&|$)/g, status, data,
       
  3403 			type = s.type.toUpperCase();
       
  3404 
       
  3405 		// convert data if not already a string
       
  3406 		if ( s.data && s.processData && typeof s.data !== "string" )
       
  3407 			s.data = jQuery.param(s.data);
       
  3408 
       
  3409 		// Handle JSONP Parameter Callbacks
       
  3410 		if ( s.dataType == "jsonp" ) {
       
  3411 			if ( type == "GET" ) {
       
  3412 				if ( !s.url.match(jsre) )
       
  3413 					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
       
  3414 			} else if ( !s.data || !s.data.match(jsre) )
       
  3415 				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
       
  3416 			s.dataType = "json";
       
  3417 		}
       
  3418 
       
  3419 		// Build temporary JSONP function
       
  3420 		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
       
  3421 			jsonp = "jsonp" + jsc++;
       
  3422 
       
  3423 			// Replace the =? sequence both in the query string and the data
       
  3424 			if ( s.data )
       
  3425 				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
       
  3426 			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
       
  3427 
       
  3428 			// We need to make sure
       
  3429 			// that a JSONP style response is executed properly
       
  3430 			s.dataType = "script";
       
  3431 
       
  3432 			// Handle JSONP-style loading
       
  3433 			window[ jsonp ] = function(tmp){
       
  3434 				data = tmp;
       
  3435 				success();
       
  3436 				complete();
       
  3437 				// Garbage collect
       
  3438 				window[ jsonp ] = undefined;
       
  3439 				try{ delete window[ jsonp ]; } catch(e){}
       
  3440 				if ( head )
       
  3441 					head.removeChild( script );
       
  3442 			};
       
  3443 		}
       
  3444 
       
  3445 		if ( s.dataType == "script" && s.cache == null )
       
  3446 			s.cache = false;
       
  3447 
       
  3448 		if ( s.cache === false && type == "GET" ) {
       
  3449 			var ts = now();
       
  3450 			// try replacing _= if it is there
       
  3451 			var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
       
  3452 			// if nothing was replaced, add timestamp to the end
       
  3453 			s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
       
  3454 		}
       
  3455 
       
  3456 		// If data is available, append data to url for get requests
       
  3457 		if ( s.data && type == "GET" ) {
       
  3458 			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
       
  3459 
       
  3460 			// IE likes to send both get and post data, prevent this
       
  3461 			s.data = null;
       
  3462 		}
       
  3463 
       
  3464 		// Watch for a new set of requests
       
  3465 		if ( s.global && ! jQuery.active++ )
       
  3466 			jQuery.event.trigger( "ajaxStart" );
       
  3467 
       
  3468 		// Matches an absolute URL, and saves the domain
       
  3469 		var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url );
       
  3470 
       
  3471 		// If we're requesting a remote document
       
  3472 		// and trying to load JSON or Script with a GET
       
  3473 		if ( s.dataType == "script" && type == "GET" && parts
       
  3474 			&& ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){
       
  3475 
       
  3476 			var head = document.getElementsByTagName("head")[0];
       
  3477 			var script = document.createElement("script");
       
  3478 			script.src = s.url;
       
  3479 			if (s.scriptCharset)
       
  3480 				script.charset = s.scriptCharset;
       
  3481 
       
  3482 			// Handle Script loading
       
  3483 			if ( !jsonp ) {
       
  3484 				var done = false;
       
  3485 
       
  3486 				// Attach handlers for all browsers
       
  3487 				script.onload = script.onreadystatechange = function(){
       
  3488 					if ( !done && (!this.readyState ||
       
  3489 							this.readyState == "loaded" || this.readyState == "complete") ) {
       
  3490 						done = true;
       
  3491 						success();
       
  3492 						complete();
       
  3493 
       
  3494 						// Handle memory leak in IE
       
  3495 						script.onload = script.onreadystatechange = null;
       
  3496 						head.removeChild( script );
       
  3497 					}
       
  3498 				};
       
  3499 			}
       
  3500 
       
  3501 			head.appendChild(script);
       
  3502 
       
  3503 			// We handle everything using the script element injection
       
  3504 			return undefined;
       
  3505 		}
       
  3506 
       
  3507 		var requestDone = false;
       
  3508 
       
  3509 		// Create the request object
       
  3510 		var xhr = s.xhr();
       
  3511 
       
  3512 		// Open the socket
       
  3513 		// Passing null username, generates a login popup on Opera (#2865)
       
  3514 		if( s.username )
       
  3515 			xhr.open(type, s.url, s.async, s.username, s.password);
       
  3516 		else
       
  3517 			xhr.open(type, s.url, s.async);
       
  3518 
       
  3519 		// Need an extra try/catch for cross domain requests in Firefox 3
       
  3520 		try {
       
  3521 			// Set the correct header, if data is being sent
       
  3522 			if ( s.data )
       
  3523 				xhr.setRequestHeader("Content-Type", s.contentType);
       
  3524 
       
  3525 			// Set the If-Modified-Since header, if ifModified mode.
       
  3526 			if ( s.ifModified )
       
  3527 				xhr.setRequestHeader("If-Modified-Since",
       
  3528 					jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
       
  3529 
       
  3530 			// Set header so the called script knows that it's an XMLHttpRequest
       
  3531 			xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       
  3532 
       
  3533 			// Set the Accepts header for the server, depending on the dataType
       
  3534 			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
       
  3535 				s.accepts[ s.dataType ] + ", */*" :
       
  3536 				s.accepts._default );
       
  3537 		} catch(e){}
       
  3538 
       
  3539 		// Allow custom headers/mimetypes and early abort
       
  3540 		if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
       
  3541 			// Handle the global AJAX counter
       
  3542 			if ( s.global && ! --jQuery.active )
       
  3543 				jQuery.event.trigger( "ajaxStop" );
       
  3544 			// close opended socket
       
  3545 			xhr.abort();
       
  3546 			return false;
       
  3547 		}
       
  3548 
       
  3549 		if ( s.global )
       
  3550 			jQuery.event.trigger("ajaxSend", [xhr, s]);
       
  3551 
       
  3552 		// Wait for a response to come back
       
  3553 		var onreadystatechange = function(isTimeout){
       
  3554 			// The request was aborted, clear the interval and decrement jQuery.active
       
  3555 			if (xhr.readyState == 0) {
       
  3556 				if (ival) {
       
  3557 					// clear poll interval
       
  3558 					clearInterval(ival);
       
  3559 					ival = null;
       
  3560 					// Handle the global AJAX counter
       
  3561 					if ( s.global && ! --jQuery.active )
       
  3562 						jQuery.event.trigger( "ajaxStop" );
       
  3563 				}
       
  3564 			// The transfer is complete and the data is available, or the request timed out
       
  3565 			} else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
       
  3566 				requestDone = true;
       
  3567 
       
  3568 				// clear poll interval
       
  3569 				if (ival) {
       
  3570 					clearInterval(ival);
       
  3571 					ival = null;
       
  3572 				}
       
  3573 
       
  3574 				status = isTimeout == "timeout" ? "timeout" :
       
  3575 					!jQuery.httpSuccess( xhr ) ? "error" :
       
  3576 					s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" :
       
  3577 					"success";
       
  3578 
       
  3579 				if ( status == "success" ) {
       
  3580 					// Watch for, and catch, XML document parse errors
       
  3581 					try {
       
  3582 						// process the data (runs the xml through httpData regardless of callback)
       
  3583 						data = jQuery.httpData( xhr, s.dataType, s );
       
  3584 					} catch(e) {
       
  3585 						status = "parsererror";
       
  3586 					}
       
  3587 				}
       
  3588 
       
  3589 				// Make sure that the request was successful or notmodified
       
  3590 				if ( status == "success" ) {
       
  3591 					// Cache Last-Modified header, if ifModified mode.
       
  3592 					var modRes;
       
  3593 					try {
       
  3594 						modRes = xhr.getResponseHeader("Last-Modified");
       
  3595 					} catch(e) {} // swallow exception thrown by FF if header is not available
       
  3596 
       
  3597 					if ( s.ifModified && modRes )
       
  3598 						jQuery.lastModified[s.url] = modRes;
       
  3599 
       
  3600 					// JSONP handles its own success callback
       
  3601 					if ( !jsonp )
       
  3602 						success();
       
  3603 				} else
       
  3604 					jQuery.handleError(s, xhr, status);
       
  3605 
       
  3606 				// Fire the complete handlers
       
  3607 				complete();
       
  3608 
       
  3609 				if ( isTimeout )
       
  3610 					xhr.abort();
       
  3611 
       
  3612 				// Stop memory leaks
       
  3613 				if ( s.async )
       
  3614 					xhr = null;
       
  3615 			}
       
  3616 		};
       
  3617 
       
  3618 		if ( s.async ) {
       
  3619 			// don't attach the handler to the request, just poll it instead
       
  3620 			var ival = setInterval(onreadystatechange, 13);
       
  3621 
       
  3622 			// Timeout checker
       
  3623 			if ( s.timeout > 0 )
       
  3624 				setTimeout(function(){
       
  3625 					// Check to see if the request is still happening
       
  3626 					if ( xhr && !requestDone )
       
  3627 						onreadystatechange( "timeout" );
       
  3628 				}, s.timeout);
       
  3629 		}
       
  3630 
       
  3631 		// Send the data
       
  3632 		try {
       
  3633 			xhr.send(s.data);
       
  3634 		} catch(e) {
       
  3635 			jQuery.handleError(s, xhr, null, e);
       
  3636 		}
       
  3637 
       
  3638 		// firefox 1.5 doesn't fire statechange for sync requests
       
  3639 		if ( !s.async )
       
  3640 			onreadystatechange();
       
  3641 
       
  3642 		function success(){
       
  3643 			// If a local callback was specified, fire it and pass it the data
       
  3644 			if ( s.success )
       
  3645 				s.success( data, status );
       
  3646 
       
  3647 			// Fire the global callback
       
  3648 			if ( s.global )
       
  3649 				jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
       
  3650 		}
       
  3651 
       
  3652 		function complete(){
       
  3653 			// Process result
       
  3654 			if ( s.complete )
       
  3655 				s.complete(xhr, status);
       
  3656 
       
  3657 			// The request was completed
       
  3658 			if ( s.global )
       
  3659 				jQuery.event.trigger( "ajaxComplete", [xhr, s] );
       
  3660 
       
  3661 			// Handle the global AJAX counter
       
  3662 			if ( s.global && ! --jQuery.active )
       
  3663 				jQuery.event.trigger( "ajaxStop" );
       
  3664 		}
       
  3665 
       
  3666 		// return XMLHttpRequest to allow aborting the request etc.
       
  3667 		return xhr;
       
  3668 	},
       
  3669 
       
  3670 	handleError: function( s, xhr, status, e ) {
       
  3671 		// If a local callback was specified, fire it
       
  3672 		if ( s.error ) s.error( xhr, status, e );
       
  3673 
       
  3674 		// Fire the global callback
       
  3675 		if ( s.global )
       
  3676 			jQuery.event.trigger( "ajaxError", [xhr, s, e] );
       
  3677 	},
       
  3678 
       
  3679 	// Counter for holding the number of active queries
       
  3680 	active: 0,
       
  3681 
       
  3682 	// Determines if an XMLHttpRequest was successful or not
       
  3683 	httpSuccess: function( xhr ) {
       
  3684 		try {
       
  3685 			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
       
  3686 			return !xhr.status && location.protocol == "file:" ||
       
  3687 				( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223;
       
  3688 		} catch(e){}
       
  3689 		return false;
       
  3690 	},
       
  3691 
       
  3692 	// Determines if an XMLHttpRequest returns NotModified
       
  3693 	httpNotModified: function( xhr, url ) {
       
  3694 		try {
       
  3695 			var xhrRes = xhr.getResponseHeader("Last-Modified");
       
  3696 
       
  3697 			// Firefox always returns 200. check Last-Modified date
       
  3698 			return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
       
  3699 		} catch(e){}
       
  3700 		return false;
       
  3701 	},
       
  3702 
       
  3703 	httpData: function( xhr, type, s ) {
       
  3704 		var ct = xhr.getResponseHeader("content-type"),
       
  3705 			xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
       
  3706 			data = xml ? xhr.responseXML : xhr.responseText;
       
  3707 
       
  3708 		if ( xml && data.documentElement.tagName == "parsererror" )
       
  3709 			throw "parsererror";
       
  3710 			
       
  3711 		// Allow a pre-filtering function to sanitize the response
       
  3712 		// s != null is checked to keep backwards compatibility
       
  3713 		if( s && s.dataFilter )
       
  3714 			data = s.dataFilter( data, type );
       
  3715 
       
  3716 		// The filter can actually parse the response
       
  3717 		if( typeof data === "string" ){
       
  3718 
       
  3719 			// If the type is "script", eval it in global context
       
  3720 			if ( type == "script" )
       
  3721 				jQuery.globalEval( data );
       
  3722 
       
  3723 			// Get the JavaScript object, if JSON is used.
       
  3724 			if ( type == "json" )
       
  3725 				data = window["eval"]("(" + data + ")");
       
  3726 		}
       
  3727 		
       
  3728 		return data;
       
  3729 	},
       
  3730 
       
  3731 	// Serialize an array of form elements or a set of
       
  3732 	// key/values into a query string
       
  3733 	param: function( a ) {
       
  3734 		var s = [ ];
       
  3735 
       
  3736 		function add( key, value ){
       
  3737 			s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value);
       
  3738 		};
       
  3739 
       
  3740 		// If an array was passed in, assume that it is an array
       
  3741 		// of form elements
       
  3742 		if ( jQuery.isArray(a) || a.jquery )
       
  3743 			// Serialize the form elements
       
  3744 			jQuery.each( a, function(){
       
  3745 				add( this.name, this.value );
       
  3746 			});
       
  3747 
       
  3748 		// Otherwise, assume that it's an object of key/value pairs
       
  3749 		else
       
  3750 			// Serialize the key/values
       
  3751 			for ( var j in a )
       
  3752 				// If the value is an array then the key names need to be repeated
       
  3753 				if ( jQuery.isArray(a[j]) )
       
  3754 					jQuery.each( a[j], function(){
       
  3755 						add( j, this );
       
  3756 					});
       
  3757 				else
       
  3758 					add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] );
       
  3759 
       
  3760 		// Return the resulting serialization
       
  3761 		return s.join("&").replace(/%20/g, "+");
       
  3762 	}
       
  3763 
       
  3764 });
       
  3765 var elemdisplay = {},
       
  3766 	timerId,
       
  3767 	fxAttrs = [
       
  3768 		// height animations
       
  3769 		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
       
  3770 		// width animations
       
  3771 		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
       
  3772 		// opacity animations
       
  3773 		[ "opacity" ]
       
  3774 	];
       
  3775 
       
  3776 function genFx( type, num ){
       
  3777 	var obj = {};
       
  3778 	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){
       
  3779 		obj[ this ] = type;
       
  3780 	});
       
  3781 	return obj;
       
  3782 }
       
  3783 
       
  3784 jQuery.fn.extend({
       
  3785 	show: function(speed,callback){
       
  3786 		if ( speed ) {
       
  3787 			return this.animate( genFx("show", 3), speed, callback);
       
  3788 		} else {
       
  3789 			for ( var i = 0, l = this.length; i < l; i++ ){
       
  3790 				var old = jQuery.data(this[i], "olddisplay");
       
  3791 				
       
  3792 				this[i].style.display = old || "";
       
  3793 				
       
  3794 				if ( jQuery.css(this[i], "display") === "none" ) {
       
  3795 					var tagName = this[i].tagName, display;
       
  3796 					
       
  3797 					if ( elemdisplay[ tagName ] ) {
       
  3798 						display = elemdisplay[ tagName ];
       
  3799 					} else {
       
  3800 						var elem = jQuery("<" + tagName + " />").appendTo("body");
       
  3801 						
       
  3802 						display = elem.css("display");
       
  3803 						if ( display === "none" )
       
  3804 							display = "block";
       
  3805 						
       
  3806 						elem.remove();
       
  3807 						
       
  3808 						elemdisplay[ tagName ] = display;
       
  3809 					}
       
  3810 					
       
  3811 					jQuery.data(this[i], "olddisplay", display);
       
  3812 				}
       
  3813 			}
       
  3814 
       
  3815 			// Set the display of the elements in a second loop
       
  3816 			// to avoid the constant reflow
       
  3817 			for ( var i = 0, l = this.length; i < l; i++ ){
       
  3818 				this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
       
  3819 			}
       
  3820 			
       
  3821 			return this;
       
  3822 		}
       
  3823 	},
       
  3824 
       
  3825 	hide: function(speed,callback){
       
  3826 		if ( speed ) {
       
  3827 			return this.animate( genFx("hide", 3), speed, callback);
       
  3828 		} else {
       
  3829 			for ( var i = 0, l = this.length; i < l; i++ ){
       
  3830 				var old = jQuery.data(this[i], "olddisplay");
       
  3831 				if ( !old && old !== "none" )
       
  3832 					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
       
  3833 			}
       
  3834 
       
  3835 			// Set the display of the elements in a second loop
       
  3836 			// to avoid the constant reflow
       
  3837 			for ( var i = 0, l = this.length; i < l; i++ ){
       
  3838 				this[i].style.display = "none";
       
  3839 			}
       
  3840 
       
  3841 			return this;
       
  3842 		}
       
  3843 	},
       
  3844 
       
  3845 	// Save the old toggle function
       
  3846 	_toggle: jQuery.fn.toggle,
       
  3847 
       
  3848 	toggle: function( fn, fn2 ){
       
  3849 		var bool = typeof fn === "boolean";
       
  3850 
       
  3851 		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
       
  3852 			this._toggle.apply( this, arguments ) :
       
  3853 			fn == null || bool ?
       
  3854 				this.each(function(){
       
  3855 					var state = bool ? fn : jQuery(this).is(":hidden");
       
  3856 					jQuery(this)[ state ? "show" : "hide" ]();
       
  3857 				}) :
       
  3858 				this.animate(genFx("toggle", 3), fn, fn2);
       
  3859 	},
       
  3860 
       
  3861 	fadeTo: function(speed,to,callback){
       
  3862 		return this.animate({opacity: to}, speed, callback);
       
  3863 	},
       
  3864 
       
  3865 	animate: function( prop, speed, easing, callback ) {
       
  3866 		var optall = jQuery.speed(speed, easing, callback);
       
  3867 
       
  3868 		return this[ optall.queue === false ? "each" : "queue" ](function(){
       
  3869 		
       
  3870 			var opt = jQuery.extend({}, optall), p,
       
  3871 				hidden = this.nodeType == 1 && jQuery(this).is(":hidden"),
       
  3872 				self = this;
       
  3873 	
       
  3874 			for ( p in prop ) {
       
  3875 				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
       
  3876 					return opt.complete.call(this);
       
  3877 
       
  3878 				if ( ( p == "height" || p == "width" ) && this.style ) {
       
  3879 					// Store display property
       
  3880 					opt.display = jQuery.css(this, "display");
       
  3881 
       
  3882 					// Make sure that nothing sneaks out
       
  3883 					opt.overflow = this.style.overflow;
       
  3884 				}
       
  3885 			}
       
  3886 
       
  3887 			if ( opt.overflow != null )
       
  3888 				this.style.overflow = "hidden";
       
  3889 
       
  3890 			opt.curAnim = jQuery.extend({}, prop);
       
  3891 
       
  3892 			jQuery.each( prop, function(name, val){
       
  3893 				var e = new jQuery.fx( self, opt, name );
       
  3894 
       
  3895 				if ( /toggle|show|hide/.test(val) )
       
  3896 					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
       
  3897 				else {
       
  3898 					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
       
  3899 						start = e.cur(true) || 0;
       
  3900 
       
  3901 					if ( parts ) {
       
  3902 						var end = parseFloat(parts[2]),
       
  3903 							unit = parts[3] || "px";
       
  3904 
       
  3905 						// We need to compute starting value
       
  3906 						if ( unit != "px" ) {
       
  3907 							self.style[ name ] = (end || 1) + unit;
       
  3908 							start = ((end || 1) / e.cur(true)) * start;
       
  3909 							self.style[ name ] = start + unit;
       
  3910 						}
       
  3911 
       
  3912 						// If a +=/-= token was provided, we're doing a relative animation
       
  3913 						if ( parts[1] )
       
  3914 							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
       
  3915 
       
  3916 						e.custom( start, end, unit );
       
  3917 					} else
       
  3918 						e.custom( start, val, "" );
       
  3919 				}
       
  3920 			});
       
  3921 
       
  3922 			// For JS strict compliance
       
  3923 			return true;
       
  3924 		});
       
  3925 	},
       
  3926 
       
  3927 	stop: function(clearQueue, gotoEnd){
       
  3928 		var timers = jQuery.timers;
       
  3929 
       
  3930 		if (clearQueue)
       
  3931 			this.queue([]);
       
  3932 
       
  3933 		this.each(function(){
       
  3934 			// go in reverse order so anything added to the queue during the loop is ignored
       
  3935 			for ( var i = timers.length - 1; i >= 0; i-- )
       
  3936 				if ( timers[i].elem == this ) {
       
  3937 					if (gotoEnd)
       
  3938 						// force the next step to be the last
       
  3939 						timers[i](true);
       
  3940 					timers.splice(i, 1);
       
  3941 				}
       
  3942 		});
       
  3943 
       
  3944 		// start the next in the queue if the last step wasn't forced
       
  3945 		if (!gotoEnd)
       
  3946 			this.dequeue();
       
  3947 
       
  3948 		return this;
       
  3949 	}
       
  3950 
       
  3951 });
       
  3952 
       
  3953 // Generate shortcuts for custom animations
       
  3954 jQuery.each({
       
  3955 	slideDown: genFx("show", 1),
       
  3956 	slideUp: genFx("hide", 1),
       
  3957 	slideToggle: genFx("toggle", 1),
       
  3958 	fadeIn: { opacity: "show" },
       
  3959 	fadeOut: { opacity: "hide" }
       
  3960 }, function( name, props ){
       
  3961 	jQuery.fn[ name ] = function( speed, callback ){
       
  3962 		return this.animate( props, speed, callback );
       
  3963 	};
       
  3964 });
       
  3965 
       
  3966 jQuery.extend({
       
  3967 
       
  3968 	speed: function(speed, easing, fn) {
       
  3969 		var opt = typeof speed === "object" ? speed : {
       
  3970 			complete: fn || !fn && easing ||
       
  3971 				jQuery.isFunction( speed ) && speed,
       
  3972 			duration: speed,
       
  3973 			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
       
  3974 		};
       
  3975 
       
  3976 		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
       
  3977 			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
       
  3978 
       
  3979 		// Queueing
       
  3980 		opt.old = opt.complete;
       
  3981 		opt.complete = function(){
       
  3982 			if ( opt.queue !== false )
       
  3983 				jQuery(this).dequeue();
       
  3984 			if ( jQuery.isFunction( opt.old ) )
       
  3985 				opt.old.call( this );
       
  3986 		};
       
  3987 
       
  3988 		return opt;
       
  3989 	},
       
  3990 
       
  3991 	easing: {
       
  3992 		linear: function( p, n, firstNum, diff ) {
       
  3993 			return firstNum + diff * p;
       
  3994 		},
       
  3995 		swing: function( p, n, firstNum, diff ) {
       
  3996 			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
       
  3997 		}
       
  3998 	},
       
  3999 
       
  4000 	timers: [],
       
  4001 
       
  4002 	fx: function( elem, options, prop ){
       
  4003 		this.options = options;
       
  4004 		this.elem = elem;
       
  4005 		this.prop = prop;
       
  4006 
       
  4007 		if ( !options.orig )
       
  4008 			options.orig = {};
       
  4009 	}
       
  4010 
       
  4011 });
       
  4012 
       
  4013 jQuery.fx.prototype = {
       
  4014 
       
  4015 	// Simple function for setting a style value
       
  4016 	update: function(){
       
  4017 		if ( this.options.step )
       
  4018 			this.options.step.call( this.elem, this.now, this );
       
  4019 
       
  4020 		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
       
  4021 
       
  4022 		// Set display property to block for height/width animations
       
  4023 		if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style )
       
  4024 			this.elem.style.display = "block";
       
  4025 	},
       
  4026 
       
  4027 	// Get the current size
       
  4028 	cur: function(force){
       
  4029 		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) )
       
  4030 			return this.elem[ this.prop ];
       
  4031 
       
  4032 		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
       
  4033 		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
       
  4034 	},
       
  4035 
       
  4036 	// Start an animation from one number to another
       
  4037 	custom: function(from, to, unit){
       
  4038 		this.startTime = now();
       
  4039 		this.start = from;
       
  4040 		this.end = to;
       
  4041 		this.unit = unit || this.unit || "px";
       
  4042 		this.now = this.start;
       
  4043 		this.pos = this.state = 0;
       
  4044 
       
  4045 		var self = this;
       
  4046 		function t(gotoEnd){
       
  4047 			return self.step(gotoEnd);
       
  4048 		}
       
  4049 
       
  4050 		t.elem = this.elem;
       
  4051 
       
  4052 		if ( t() && jQuery.timers.push(t) && !timerId ) {
       
  4053 			timerId = setInterval(function(){
       
  4054 				var timers = jQuery.timers;
       
  4055 
       
  4056 				for ( var i = 0; i < timers.length; i++ )
       
  4057 					if ( !timers[i]() )
       
  4058 						timers.splice(i--, 1);
       
  4059 
       
  4060 				if ( !timers.length ) {
       
  4061 					clearInterval( timerId );
       
  4062 					timerId = undefined;
       
  4063 				}
       
  4064 			}, 13);
       
  4065 		}
       
  4066 	},
       
  4067 
       
  4068 	// Simple 'show' function
       
  4069 	show: function(){
       
  4070 		// Remember where we started, so that we can go back to it later
       
  4071 		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
       
  4072 		this.options.show = true;
       
  4073 
       
  4074 		// Begin the animation
       
  4075 		// Make sure that we start at a small width/height to avoid any
       
  4076 		// flash of content
       
  4077 		this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur());
       
  4078 
       
  4079 		// Start by showing the element
       
  4080 		jQuery(this.elem).show();
       
  4081 	},
       
  4082 
       
  4083 	// Simple 'hide' function
       
  4084 	hide: function(){
       
  4085 		// Remember where we started, so that we can go back to it later
       
  4086 		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
       
  4087 		this.options.hide = true;
       
  4088 
       
  4089 		// Begin the animation
       
  4090 		this.custom(this.cur(), 0);
       
  4091 	},
       
  4092 
       
  4093 	// Each step of an animation
       
  4094 	step: function(gotoEnd){
       
  4095 		var t = now();
       
  4096 
       
  4097 		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
       
  4098 			this.now = this.end;
       
  4099 			this.pos = this.state = 1;
       
  4100 			this.update();
       
  4101 
       
  4102 			this.options.curAnim[ this.prop ] = true;
       
  4103 
       
  4104 			var done = true;
       
  4105 			for ( var i in this.options.curAnim )
       
  4106 				if ( this.options.curAnim[i] !== true )
       
  4107 					done = false;
       
  4108 
       
  4109 			if ( done ) {
       
  4110 				if ( this.options.display != null ) {
       
  4111 					// Reset the overflow
       
  4112 					this.elem.style.overflow = this.options.overflow;
       
  4113 
       
  4114 					// Reset the display
       
  4115 					this.elem.style.display = this.options.display;
       
  4116 					if ( jQuery.css(this.elem, "display") == "none" )
       
  4117 						this.elem.style.display = "block";
       
  4118 				}
       
  4119 
       
  4120 				// Hide the element if the "hide" operation was done
       
  4121 				if ( this.options.hide )
       
  4122 					jQuery(this.elem).hide();
       
  4123 
       
  4124 				// Reset the properties, if the item has been hidden or shown
       
  4125 				if ( this.options.hide || this.options.show )
       
  4126 					for ( var p in this.options.curAnim )
       
  4127 						jQuery.attr(this.elem.style, p, this.options.orig[p]);
       
  4128 					
       
  4129 				// Execute the complete function
       
  4130 				this.options.complete.call( this.elem );
       
  4131 			}
       
  4132 
       
  4133 			return false;
       
  4134 		} else {
       
  4135 			var n = t - this.startTime;
       
  4136 			this.state = n / this.options.duration;
       
  4137 
       
  4138 			// Perform the easing function, defaults to swing
       
  4139 			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
       
  4140 			this.now = this.start + ((this.end - this.start) * this.pos);
       
  4141 
       
  4142 			// Perform the next step of the animation
       
  4143 			this.update();
       
  4144 		}
       
  4145 
       
  4146 		return true;
       
  4147 	}
       
  4148 
       
  4149 };
       
  4150 
       
  4151 jQuery.extend( jQuery.fx, {
       
  4152 	speeds:{
       
  4153 		slow: 600,
       
  4154  		fast: 200,
       
  4155  		// Default speed
       
  4156  		_default: 400
       
  4157 	},
       
  4158 	step: {
       
  4159 
       
  4160 		opacity: function(fx){
       
  4161 			jQuery.attr(fx.elem.style, "opacity", fx.now);
       
  4162 		},
       
  4163 
       
  4164 		_default: function(fx){
       
  4165 			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null )
       
  4166 				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
       
  4167 			else
       
  4168 				fx.elem[ fx.prop ] = fx.now;
       
  4169 		}
       
  4170 	}
       
  4171 });
       
  4172 if ( document.documentElement["getBoundingClientRect"] )
       
  4173 	jQuery.fn.offset = function() {
       
  4174 		if ( !this[0] ) return { top: 0, left: 0 };
       
  4175 		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
       
  4176 		var box  = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement,
       
  4177 			clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
       
  4178 			top  = box.top  + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
       
  4179 			left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
       
  4180 		return { top: top, left: left };
       
  4181 	};
       
  4182 else 
       
  4183 	jQuery.fn.offset = function() {
       
  4184 		if ( !this[0] ) return { top: 0, left: 0 };
       
  4185 		if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] );
       
  4186 		jQuery.offset.initialized || jQuery.offset.initialize();
       
  4187 
       
  4188 		var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem,
       
  4189 			doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
       
  4190 			body = doc.body, defaultView = doc.defaultView,
       
  4191 			prevComputedStyle = defaultView.getComputedStyle(elem, null),
       
  4192 			top = elem.offsetTop, left = elem.offsetLeft;
       
  4193 
       
  4194 		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
       
  4195 			computedStyle = defaultView.getComputedStyle(elem, null);
       
  4196 			top -= elem.scrollTop, left -= elem.scrollLeft;
       
  4197 			if ( elem === offsetParent ) {
       
  4198 				top += elem.offsetTop, left += elem.offsetLeft;
       
  4199 				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) )
       
  4200 					top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
       
  4201 					left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
       
  4202 				prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
       
  4203 			}
       
  4204 			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" )
       
  4205 				top  += parseInt( computedStyle.borderTopWidth,  10) || 0,
       
  4206 				left += parseInt( computedStyle.borderLeftWidth, 10) || 0;
       
  4207 			prevComputedStyle = computedStyle;
       
  4208 		}
       
  4209 
       
  4210 		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" )
       
  4211 			top  += body.offsetTop,
       
  4212 			left += body.offsetLeft;
       
  4213 
       
  4214 		if ( prevComputedStyle.position === "fixed" )
       
  4215 			top  += Math.max(docElem.scrollTop, body.scrollTop),
       
  4216 			left += Math.max(docElem.scrollLeft, body.scrollLeft);
       
  4217 
       
  4218 		return { top: top, left: left };
       
  4219 	};
       
  4220 
       
  4221 jQuery.offset = {
       
  4222 	initialize: function() {
       
  4223 		if ( this.initialized ) return;
       
  4224 		var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop,
       
  4225 			html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';
       
  4226 
       
  4227 		rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' };
       
  4228 		for ( prop in rules ) container.style[prop] = rules[prop];
       
  4229 
       
  4230 		container.innerHTML = html;
       
  4231 		body.insertBefore(container, body.firstChild);
       
  4232 		innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild;
       
  4233 
       
  4234 		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
       
  4235 		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
       
  4236 
       
  4237 		innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative';
       
  4238 		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
       
  4239 
       
  4240 		body.style.marginTop = '1px';
       
  4241 		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0);
       
  4242 		body.style.marginTop = bodyMarginTop;
       
  4243 
       
  4244 		body.removeChild(container);
       
  4245 		this.initialized = true;
       
  4246 	},
       
  4247 
       
  4248 	bodyOffset: function(body) {
       
  4249 		jQuery.offset.initialized || jQuery.offset.initialize();
       
  4250 		var top = body.offsetTop, left = body.offsetLeft;
       
  4251 		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset )
       
  4252 			top  += parseInt( jQuery.curCSS(body, 'marginTop',  true), 10 ) || 0,
       
  4253 			left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0;
       
  4254 		return { top: top, left: left };
       
  4255 	}
       
  4256 };
       
  4257 
       
  4258 
       
  4259 jQuery.fn.extend({
       
  4260 	position: function() {
       
  4261 		var left = 0, top = 0, results;
       
  4262 
       
  4263 		if ( this[0] ) {
       
  4264 			// Get *real* offsetParent
       
  4265 			var offsetParent = this.offsetParent(),
       
  4266 
       
  4267 			// Get correct offsets
       
  4268 			offset       = this.offset(),
       
  4269 			parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
       
  4270 
       
  4271 			// Subtract element margins
       
  4272 			// note: when an element has margin: auto the offsetLeft and marginLeft 
       
  4273 			// are the same in Safari causing offset.left to incorrectly be 0
       
  4274 			offset.top  -= num( this, 'marginTop'  );
       
  4275 			offset.left -= num( this, 'marginLeft' );
       
  4276 
       
  4277 			// Add offsetParent borders
       
  4278 			parentOffset.top  += num( offsetParent, 'borderTopWidth'  );
       
  4279 			parentOffset.left += num( offsetParent, 'borderLeftWidth' );
       
  4280 
       
  4281 			// Subtract the two offsets
       
  4282 			results = {
       
  4283 				top:  offset.top  - parentOffset.top,
       
  4284 				left: offset.left - parentOffset.left
       
  4285 			};
       
  4286 		}
       
  4287 
       
  4288 		return results;
       
  4289 	},
       
  4290 
       
  4291 	offsetParent: function() {
       
  4292 		var offsetParent = this[0].offsetParent || document.body;
       
  4293 		while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
       
  4294 			offsetParent = offsetParent.offsetParent;
       
  4295 		return jQuery(offsetParent);
       
  4296 	}
       
  4297 });
       
  4298 
       
  4299 
       
  4300 // Create scrollLeft and scrollTop methods
       
  4301 jQuery.each( ['Left', 'Top'], function(i, name) {
       
  4302 	var method = 'scroll' + name;
       
  4303 	
       
  4304 	jQuery.fn[ method ] = function(val) {
       
  4305 		if (!this[0]) return null;
       
  4306 
       
  4307 		return val !== undefined ?
       
  4308 
       
  4309 			// Set the scroll offset
       
  4310 			this.each(function() {
       
  4311 				this == window || this == document ?
       
  4312 					window.scrollTo(
       
  4313 						!i ? val : jQuery(window).scrollLeft(),
       
  4314 						 i ? val : jQuery(window).scrollTop()
       
  4315 					) :
       
  4316 					this[ method ] = val;
       
  4317 			}) :
       
  4318 
       
  4319 			// Return the scroll offset
       
  4320 			this[0] == window || this[0] == document ?
       
  4321 				self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
       
  4322 					jQuery.boxModel && document.documentElement[ method ] ||
       
  4323 					document.body[ method ] :
       
  4324 				this[0][ method ];
       
  4325 	};
       
  4326 });
       
  4327 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
       
  4328 jQuery.each([ "Height", "Width" ], function(i, name){
       
  4329 
       
  4330 	var tl = i ? "Left"  : "Top",  // top or left
       
  4331 		br = i ? "Right" : "Bottom", // bottom or right
       
  4332 		lower = name.toLowerCase();
       
  4333 
       
  4334 	// innerHeight and innerWidth
       
  4335 	jQuery.fn["inner" + name] = function(){
       
  4336 		return this[0] ?
       
  4337 			jQuery.css( this[0], lower, false, "padding" ) :
       
  4338 			null;
       
  4339 	};
       
  4340 
       
  4341 	// outerHeight and outerWidth
       
  4342 	jQuery.fn["outer" + name] = function(margin) {
       
  4343 		return this[0] ?
       
  4344 			jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) :
       
  4345 			null;
       
  4346 	};
       
  4347 	
       
  4348 	var type = name.toLowerCase();
       
  4349 
       
  4350 	jQuery.fn[ type ] = function( size ) {
       
  4351 		// Get window width or height
       
  4352 		return this[0] == window ?
       
  4353 			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
       
  4354 			document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] ||
       
  4355 			document.body[ "client" + name ] :
       
  4356 
       
  4357 			// Get document width or height
       
  4358 			this[0] == document ?
       
  4359 				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
       
  4360 				Math.max(
       
  4361 					document.documentElement["client" + name],
       
  4362 					document.body["scroll" + name], document.documentElement["scroll" + name],
       
  4363 					document.body["offset" + name], document.documentElement["offset" + name]
       
  4364 				) :
       
  4365 
       
  4366 				// Get or set width or height on the element
       
  4367 				size === undefined ?
       
  4368 					// Get width or height on the element
       
  4369 					(this.length ? jQuery.css( this[0], type ) : null) :
       
  4370 
       
  4371 					// Set the width or height on the element (default to pixels if value is unitless)
       
  4372 					this.css( type, typeof size === "string" ? size : size + "px" );
       
  4373 	};
       
  4374 
       
  4375 });
       
  4376 })();