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