Resources/Web/js/jquery-1.7.2.js
author moel.mich
Sun, 23 Sep 2012 18:37:43 +0000
changeset 380 573f1fff48b2
permissions -rw-r--r--
Fixed Issue 387. The new implementation does not try to start a ring 0 driver that already exists, but could not be opened. It tries to delete the driver and install it new. The driver is now stored temporarily in the application folder. The driver is not correctly removed on system shutdown.
     1 /*!
     2  * jQuery JavaScript Library v1.7.2
     3  * http://jquery.com/
     4  *
     5  * Copyright 2011, John Resig
     6  * Dual licensed under the MIT or GPL Version 2 licenses.
     7  * http://jquery.org/license
     8  *
     9  * Includes Sizzle.js
    10  * http://sizzlejs.com/
    11  * Copyright 2011, The Dojo Foundation
    12  * Released under the MIT, BSD, and GPL Licenses.
    13  *
    14  * Date: Wed Mar 21 12:46:34 2012 -0700
    15  */
    16 (function( window, undefined ) {
    17 
    18 // Use the correct document accordingly with window argument (sandbox)
    19 var document = window.document,
    20 	navigator = window.navigator,
    21 	location = window.location;
    22 var jQuery = (function() {
    23 
    24 // Define a local copy of jQuery
    25 var jQuery = function( selector, context ) {
    26 		// The jQuery object is actually just the init constructor 'enhanced'
    27 		return new jQuery.fn.init( selector, context, rootjQuery );
    28 	},
    29 
    30 	// Map over jQuery in case of overwrite
    31 	_jQuery = window.jQuery,
    32 
    33 	// Map over the $ in case of overwrite
    34 	_$ = window.$,
    35 
    36 	// A central reference to the root jQuery(document)
    37 	rootjQuery,
    38 
    39 	// A simple way to check for HTML strings or ID strings
    40 	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
    41 	quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
    42 
    43 	// Check if a string has a non-whitespace character in it
    44 	rnotwhite = /\S/,
    45 
    46 	// Used for trimming whitespace
    47 	trimLeft = /^\s+/,
    48 	trimRight = /\s+$/,
    49 
    50 	// Match a standalone tag
    51 	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
    52 
    53 	// JSON RegExp
    54 	rvalidchars = /^[\],:{}\s]*$/,
    55 	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
    56 	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
    57 	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
    58 
    59 	// Useragent RegExp
    60 	rwebkit = /(webkit)[ \/]([\w.]+)/,
    61 	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
    62 	rmsie = /(msie) ([\w.]+)/,
    63 	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
    64 
    65 	// Matches dashed string for camelizing
    66 	rdashAlpha = /-([a-z]|[0-9])/ig,
    67 	rmsPrefix = /^-ms-/,
    68 
    69 	// Used by jQuery.camelCase as callback to replace()
    70 	fcamelCase = function( all, letter ) {
    71 		return ( letter + "" ).toUpperCase();
    72 	},
    73 
    74 	// Keep a UserAgent string for use with jQuery.browser
    75 	userAgent = navigator.userAgent,
    76 
    77 	// For matching the engine and version of the browser
    78 	browserMatch,
    79 
    80 	// The deferred used on DOM ready
    81 	readyList,
    82 
    83 	// The ready event handler
    84 	DOMContentLoaded,
    85 
    86 	// Save a reference to some core methods
    87 	toString = Object.prototype.toString,
    88 	hasOwn = Object.prototype.hasOwnProperty,
    89 	push = Array.prototype.push,
    90 	slice = Array.prototype.slice,
    91 	trim = String.prototype.trim,
    92 	indexOf = Array.prototype.indexOf,
    93 
    94 	// [[Class]] -> type pairs
    95 	class2type = {};
    96 
    97 jQuery.fn = jQuery.prototype = {
    98 	constructor: jQuery,
    99 	init: function( selector, context, rootjQuery ) {
   100 		var match, elem, ret, doc;
   101 
   102 		// Handle $(""), $(null), or $(undefined)
   103 		if ( !selector ) {
   104 			return this;
   105 		}
   106 
   107 		// Handle $(DOMElement)
   108 		if ( selector.nodeType ) {
   109 			this.context = this[0] = selector;
   110 			this.length = 1;
   111 			return this;
   112 		}
   113 
   114 		// The body element only exists once, optimize finding it
   115 		if ( selector === "body" && !context && document.body ) {
   116 			this.context = document;
   117 			this[0] = document.body;
   118 			this.selector = selector;
   119 			this.length = 1;
   120 			return this;
   121 		}
   122 
   123 		// Handle HTML strings
   124 		if ( typeof selector === "string" ) {
   125 			// Are we dealing with HTML string or an ID?
   126 			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
   127 				// Assume that strings that start and end with <> are HTML and skip the regex check
   128 				match = [ null, selector, null ];
   129 
   130 			} else {
   131 				match = quickExpr.exec( selector );
   132 			}
   133 
   134 			// Verify a match, and that no context was specified for #id
   135 			if ( match && (match[1] || !context) ) {
   136 
   137 				// HANDLE: $(html) -> $(array)
   138 				if ( match[1] ) {
   139 					context = context instanceof jQuery ? context[0] : context;
   140 					doc = ( context ? context.ownerDocument || context : document );
   141 
   142 					// If a single string is passed in and it's a single tag
   143 					// just do a createElement and skip the rest
   144 					ret = rsingleTag.exec( selector );
   145 
   146 					if ( ret ) {
   147 						if ( jQuery.isPlainObject( context ) ) {
   148 							selector = [ document.createElement( ret[1] ) ];
   149 							jQuery.fn.attr.call( selector, context, true );
   150 
   151 						} else {
   152 							selector = [ doc.createElement( ret[1] ) ];
   153 						}
   154 
   155 					} else {
   156 						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
   157 						selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
   158 					}
   159 
   160 					return jQuery.merge( this, selector );
   161 
   162 				// HANDLE: $("#id")
   163 				} else {
   164 					elem = document.getElementById( match[2] );
   165 
   166 					// Check parentNode to catch when Blackberry 4.6 returns
   167 					// nodes that are no longer in the document #6963
   168 					if ( elem && elem.parentNode ) {
   169 						// Handle the case where IE and Opera return items
   170 						// by name instead of ID
   171 						if ( elem.id !== match[2] ) {
   172 							return rootjQuery.find( selector );
   173 						}
   174 
   175 						// Otherwise, we inject the element directly into the jQuery object
   176 						this.length = 1;
   177 						this[0] = elem;
   178 					}
   179 
   180 					this.context = document;
   181 					this.selector = selector;
   182 					return this;
   183 				}
   184 
   185 			// HANDLE: $(expr, $(...))
   186 			} else if ( !context || context.jquery ) {
   187 				return ( context || rootjQuery ).find( selector );
   188 
   189 			// HANDLE: $(expr, context)
   190 			// (which is just equivalent to: $(context).find(expr)
   191 			} else {
   192 				return this.constructor( context ).find( selector );
   193 			}
   194 
   195 		// HANDLE: $(function)
   196 		// Shortcut for document ready
   197 		} else if ( jQuery.isFunction( selector ) ) {
   198 			return rootjQuery.ready( selector );
   199 		}
   200 
   201 		if ( selector.selector !== undefined ) {
   202 			this.selector = selector.selector;
   203 			this.context = selector.context;
   204 		}
   205 
   206 		return jQuery.makeArray( selector, this );
   207 	},
   208 
   209 	// Start with an empty selector
   210 	selector: "",
   211 
   212 	// The current version of jQuery being used
   213 	jquery: "1.7.2",
   214 
   215 	// The default length of a jQuery object is 0
   216 	length: 0,
   217 
   218 	// The number of elements contained in the matched element set
   219 	size: function() {
   220 		return this.length;
   221 	},
   222 
   223 	toArray: function() {
   224 		return slice.call( this, 0 );
   225 	},
   226 
   227 	// Get the Nth element in the matched element set OR
   228 	// Get the whole matched element set as a clean array
   229 	get: function( num ) {
   230 		return num == null ?
   231 
   232 			// Return a 'clean' array
   233 			this.toArray() :
   234 
   235 			// Return just the object
   236 			( num < 0 ? this[ this.length + num ] : this[ num ] );
   237 	},
   238 
   239 	// Take an array of elements and push it onto the stack
   240 	// (returning the new matched element set)
   241 	pushStack: function( elems, name, selector ) {
   242 		// Build a new jQuery matched element set
   243 		var ret = this.constructor();
   244 
   245 		if ( jQuery.isArray( elems ) ) {
   246 			push.apply( ret, elems );
   247 
   248 		} else {
   249 			jQuery.merge( ret, elems );
   250 		}
   251 
   252 		// Add the old object onto the stack (as a reference)
   253 		ret.prevObject = this;
   254 
   255 		ret.context = this.context;
   256 
   257 		if ( name === "find" ) {
   258 			ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
   259 		} else if ( name ) {
   260 			ret.selector = this.selector + "." + name + "(" + selector + ")";
   261 		}
   262 
   263 		// Return the newly-formed element set
   264 		return ret;
   265 	},
   266 
   267 	// Execute a callback for every element in the matched set.
   268 	// (You can seed the arguments with an array of args, but this is
   269 	// only used internally.)
   270 	each: function( callback, args ) {
   271 		return jQuery.each( this, callback, args );
   272 	},
   273 
   274 	ready: function( fn ) {
   275 		// Attach the listeners
   276 		jQuery.bindReady();
   277 
   278 		// Add the callback
   279 		readyList.add( fn );
   280 
   281 		return this;
   282 	},
   283 
   284 	eq: function( i ) {
   285 		i = +i;
   286 		return i === -1 ?
   287 			this.slice( i ) :
   288 			this.slice( i, i + 1 );
   289 	},
   290 
   291 	first: function() {
   292 		return this.eq( 0 );
   293 	},
   294 
   295 	last: function() {
   296 		return this.eq( -1 );
   297 	},
   298 
   299 	slice: function() {
   300 		return this.pushStack( slice.apply( this, arguments ),
   301 			"slice", slice.call(arguments).join(",") );
   302 	},
   303 
   304 	map: function( callback ) {
   305 		return this.pushStack( jQuery.map(this, function( elem, i ) {
   306 			return callback.call( elem, i, elem );
   307 		}));
   308 	},
   309 
   310 	end: function() {
   311 		return this.prevObject || this.constructor(null);
   312 	},
   313 
   314 	// For internal use only.
   315 	// Behaves like an Array's method, not like a jQuery method.
   316 	push: push,
   317 	sort: [].sort,
   318 	splice: [].splice
   319 };
   320 
   321 // Give the init function the jQuery prototype for later instantiation
   322 jQuery.fn.init.prototype = jQuery.fn;
   323 
   324 jQuery.extend = jQuery.fn.extend = function() {
   325 	var options, name, src, copy, copyIsArray, clone,
   326 		target = arguments[0] || {},
   327 		i = 1,
   328 		length = arguments.length,
   329 		deep = false;
   330 
   331 	// Handle a deep copy situation
   332 	if ( typeof target === "boolean" ) {
   333 		deep = target;
   334 		target = arguments[1] || {};
   335 		// skip the boolean and the target
   336 		i = 2;
   337 	}
   338 
   339 	// Handle case when target is a string or something (possible in deep copy)
   340 	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
   341 		target = {};
   342 	}
   343 
   344 	// extend jQuery itself if only one argument is passed
   345 	if ( length === i ) {
   346 		target = this;
   347 		--i;
   348 	}
   349 
   350 	for ( ; i < length; i++ ) {
   351 		// Only deal with non-null/undefined values
   352 		if ( (options = arguments[ i ]) != null ) {
   353 			// Extend the base object
   354 			for ( name in options ) {
   355 				src = target[ name ];
   356 				copy = options[ name ];
   357 
   358 				// Prevent never-ending loop
   359 				if ( target === copy ) {
   360 					continue;
   361 				}
   362 
   363 				// Recurse if we're merging plain objects or arrays
   364 				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
   365 					if ( copyIsArray ) {
   366 						copyIsArray = false;
   367 						clone = src && jQuery.isArray(src) ? src : [];
   368 
   369 					} else {
   370 						clone = src && jQuery.isPlainObject(src) ? src : {};
   371 					}
   372 
   373 					// Never move original objects, clone them
   374 					target[ name ] = jQuery.extend( deep, clone, copy );
   375 
   376 				// Don't bring in undefined values
   377 				} else if ( copy !== undefined ) {
   378 					target[ name ] = copy;
   379 				}
   380 			}
   381 		}
   382 	}
   383 
   384 	// Return the modified object
   385 	return target;
   386 };
   387 
   388 jQuery.extend({
   389 	noConflict: function( deep ) {
   390 		if ( window.$ === jQuery ) {
   391 			window.$ = _$;
   392 		}
   393 
   394 		if ( deep && window.jQuery === jQuery ) {
   395 			window.jQuery = _jQuery;
   396 		}
   397 
   398 		return jQuery;
   399 	},
   400 
   401 	// Is the DOM ready to be used? Set to true once it occurs.
   402 	isReady: false,
   403 
   404 	// A counter to track how many items to wait for before
   405 	// the ready event fires. See #6781
   406 	readyWait: 1,
   407 
   408 	// Hold (or release) the ready event
   409 	holdReady: function( hold ) {
   410 		if ( hold ) {
   411 			jQuery.readyWait++;
   412 		} else {
   413 			jQuery.ready( true );
   414 		}
   415 	},
   416 
   417 	// Handle when the DOM is ready
   418 	ready: function( wait ) {
   419 		// Either a released hold or an DOMready/load event and not yet ready
   420 		if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
   421 			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
   422 			if ( !document.body ) {
   423 				return setTimeout( jQuery.ready, 1 );
   424 			}
   425 
   426 			// Remember that the DOM is ready
   427 			jQuery.isReady = true;
   428 
   429 			// If a normal DOM Ready event fired, decrement, and wait if need be
   430 			if ( wait !== true && --jQuery.readyWait > 0 ) {
   431 				return;
   432 			}
   433 
   434 			// If there are functions bound, to execute
   435 			readyList.fireWith( document, [ jQuery ] );
   436 
   437 			// Trigger any bound ready events
   438 			if ( jQuery.fn.trigger ) {
   439 				jQuery( document ).trigger( "ready" ).off( "ready" );
   440 			}
   441 		}
   442 	},
   443 
   444 	bindReady: function() {
   445 		if ( readyList ) {
   446 			return;
   447 		}
   448 
   449 		readyList = jQuery.Callbacks( "once memory" );
   450 
   451 		// Catch cases where $(document).ready() is called after the
   452 		// browser event has already occurred.
   453 		if ( document.readyState === "complete" ) {
   454 			// Handle it asynchronously to allow scripts the opportunity to delay ready
   455 			return setTimeout( jQuery.ready, 1 );
   456 		}
   457 
   458 		// Mozilla, Opera and webkit nightlies currently support this event
   459 		if ( document.addEventListener ) {
   460 			// Use the handy event callback
   461 			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
   462 
   463 			// A fallback to window.onload, that will always work
   464 			window.addEventListener( "load", jQuery.ready, false );
   465 
   466 		// If IE event model is used
   467 		} else if ( document.attachEvent ) {
   468 			// ensure firing before onload,
   469 			// maybe late but safe also for iframes
   470 			document.attachEvent( "onreadystatechange", DOMContentLoaded );
   471 
   472 			// A fallback to window.onload, that will always work
   473 			window.attachEvent( "onload", jQuery.ready );
   474 
   475 			// If IE and not a frame
   476 			// continually check to see if the document is ready
   477 			var toplevel = false;
   478 
   479 			try {
   480 				toplevel = window.frameElement == null;
   481 			} catch(e) {}
   482 
   483 			if ( document.documentElement.doScroll && toplevel ) {
   484 				doScrollCheck();
   485 			}
   486 		}
   487 	},
   488 
   489 	// See test/unit/core.js for details concerning isFunction.
   490 	// Since version 1.3, DOM methods and functions like alert
   491 	// aren't supported. They return false on IE (#2968).
   492 	isFunction: function( obj ) {
   493 		return jQuery.type(obj) === "function";
   494 	},
   495 
   496 	isArray: Array.isArray || function( obj ) {
   497 		return jQuery.type(obj) === "array";
   498 	},
   499 
   500 	isWindow: function( obj ) {
   501 		return obj != null && obj == obj.window;
   502 	},
   503 
   504 	isNumeric: function( obj ) {
   505 		return !isNaN( parseFloat(obj) ) && isFinite( obj );
   506 	},
   507 
   508 	type: function( obj ) {
   509 		return obj == null ?
   510 			String( obj ) :
   511 			class2type[ toString.call(obj) ] || "object";
   512 	},
   513 
   514 	isPlainObject: function( obj ) {
   515 		// Must be an Object.
   516 		// Because of IE, we also have to check the presence of the constructor property.
   517 		// Make sure that DOM nodes and window objects don't pass through, as well
   518 		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
   519 			return false;
   520 		}
   521 
   522 		try {
   523 			// Not own constructor property must be Object
   524 			if ( obj.constructor &&
   525 				!hasOwn.call(obj, "constructor") &&
   526 				!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
   527 				return false;
   528 			}
   529 		} catch ( e ) {
   530 			// IE8,9 Will throw exceptions on certain host objects #9897
   531 			return false;
   532 		}
   533 
   534 		// Own properties are enumerated firstly, so to speed up,
   535 		// if last one is own, then all properties are own.
   536 
   537 		var key;
   538 		for ( key in obj ) {}
   539 
   540 		return key === undefined || hasOwn.call( obj, key );
   541 	},
   542 
   543 	isEmptyObject: function( obj ) {
   544 		for ( var name in obj ) {
   545 			return false;
   546 		}
   547 		return true;
   548 	},
   549 
   550 	error: function( msg ) {
   551 		throw new Error( msg );
   552 	},
   553 
   554 	parseJSON: function( data ) {
   555 		if ( typeof data !== "string" || !data ) {
   556 			return null;
   557 		}
   558 
   559 		// Make sure leading/trailing whitespace is removed (IE can't handle it)
   560 		data = jQuery.trim( data );
   561 
   562 		// Attempt to parse using the native JSON parser first
   563 		if ( window.JSON && window.JSON.parse ) {
   564 			return window.JSON.parse( data );
   565 		}
   566 
   567 		// Make sure the incoming data is actual JSON
   568 		// Logic borrowed from http://json.org/json2.js
   569 		if ( rvalidchars.test( data.replace( rvalidescape, "@" )
   570 			.replace( rvalidtokens, "]" )
   571 			.replace( rvalidbraces, "")) ) {
   572 
   573 			return ( new Function( "return " + data ) )();
   574 
   575 		}
   576 		jQuery.error( "Invalid JSON: " + data );
   577 	},
   578 
   579 	// Cross-browser xml parsing
   580 	parseXML: function( data ) {
   581 		if ( typeof data !== "string" || !data ) {
   582 			return null;
   583 		}
   584 		var xml, tmp;
   585 		try {
   586 			if ( window.DOMParser ) { // Standard
   587 				tmp = new DOMParser();
   588 				xml = tmp.parseFromString( data , "text/xml" );
   589 			} else { // IE
   590 				xml = new ActiveXObject( "Microsoft.XMLDOM" );
   591 				xml.async = "false";
   592 				xml.loadXML( data );
   593 			}
   594 		} catch( e ) {
   595 			xml = undefined;
   596 		}
   597 		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
   598 			jQuery.error( "Invalid XML: " + data );
   599 		}
   600 		return xml;
   601 	},
   602 
   603 	noop: function() {},
   604 
   605 	// Evaluates a script in a global context
   606 	// Workarounds based on findings by Jim Driscoll
   607 	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
   608 	globalEval: function( data ) {
   609 		if ( data && rnotwhite.test( data ) ) {
   610 			// We use execScript on Internet Explorer
   611 			// We use an anonymous function so that context is window
   612 			// rather than jQuery in Firefox
   613 			( window.execScript || function( data ) {
   614 				window[ "eval" ].call( window, data );
   615 			} )( data );
   616 		}
   617 	},
   618 
   619 	// Convert dashed to camelCase; used by the css and data modules
   620 	// Microsoft forgot to hump their vendor prefix (#9572)
   621 	camelCase: function( string ) {
   622 		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
   623 	},
   624 
   625 	nodeName: function( elem, name ) {
   626 		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
   627 	},
   628 
   629 	// args is for internal usage only
   630 	each: function( object, callback, args ) {
   631 		var name, i = 0,
   632 			length = object.length,
   633 			isObj = length === undefined || jQuery.isFunction( object );
   634 
   635 		if ( args ) {
   636 			if ( isObj ) {
   637 				for ( name in object ) {
   638 					if ( callback.apply( object[ name ], args ) === false ) {
   639 						break;
   640 					}
   641 				}
   642 			} else {
   643 				for ( ; i < length; ) {
   644 					if ( callback.apply( object[ i++ ], args ) === false ) {
   645 						break;
   646 					}
   647 				}
   648 			}
   649 
   650 		// A special, fast, case for the most common use of each
   651 		} else {
   652 			if ( isObj ) {
   653 				for ( name in object ) {
   654 					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
   655 						break;
   656 					}
   657 				}
   658 			} else {
   659 				for ( ; i < length; ) {
   660 					if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
   661 						break;
   662 					}
   663 				}
   664 			}
   665 		}
   666 
   667 		return object;
   668 	},
   669 
   670 	// Use native String.trim function wherever possible
   671 	trim: trim ?
   672 		function( text ) {
   673 			return text == null ?
   674 				"" :
   675 				trim.call( text );
   676 		} :
   677 
   678 		// Otherwise use our own trimming functionality
   679 		function( text ) {
   680 			return text == null ?
   681 				"" :
   682 				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
   683 		},
   684 
   685 	// results is for internal usage only
   686 	makeArray: function( array, results ) {
   687 		var ret = results || [];
   688 
   689 		if ( array != null ) {
   690 			// The window, strings (and functions) also have 'length'
   691 			// Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
   692 			var type = jQuery.type( array );
   693 
   694 			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
   695 				push.call( ret, array );
   696 			} else {
   697 				jQuery.merge( ret, array );
   698 			}
   699 		}
   700 
   701 		return ret;
   702 	},
   703 
   704 	inArray: function( elem, array, i ) {
   705 		var len;
   706 
   707 		if ( array ) {
   708 			if ( indexOf ) {
   709 				return indexOf.call( array, elem, i );
   710 			}
   711 
   712 			len = array.length;
   713 			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
   714 
   715 			for ( ; i < len; i++ ) {
   716 				// Skip accessing in sparse arrays
   717 				if ( i in array && array[ i ] === elem ) {
   718 					return i;
   719 				}
   720 			}
   721 		}
   722 
   723 		return -1;
   724 	},
   725 
   726 	merge: function( first, second ) {
   727 		var i = first.length,
   728 			j = 0;
   729 
   730 		if ( typeof second.length === "number" ) {
   731 			for ( var l = second.length; j < l; j++ ) {
   732 				first[ i++ ] = second[ j ];
   733 			}
   734 
   735 		} else {
   736 			while ( second[j] !== undefined ) {
   737 				first[ i++ ] = second[ j++ ];
   738 			}
   739 		}
   740 
   741 		first.length = i;
   742 
   743 		return first;
   744 	},
   745 
   746 	grep: function( elems, callback, inv ) {
   747 		var ret = [], retVal;
   748 		inv = !!inv;
   749 
   750 		// Go through the array, only saving the items
   751 		// that pass the validator function
   752 		for ( var i = 0, length = elems.length; i < length; i++ ) {
   753 			retVal = !!callback( elems[ i ], i );
   754 			if ( inv !== retVal ) {
   755 				ret.push( elems[ i ] );
   756 			}
   757 		}
   758 
   759 		return ret;
   760 	},
   761 
   762 	// arg is for internal usage only
   763 	map: function( elems, callback, arg ) {
   764 		var value, key, ret = [],
   765 			i = 0,
   766 			length = elems.length,
   767 			// jquery objects are treated as arrays
   768 			isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
   769 
   770 		// Go through the array, translating each of the items to their
   771 		if ( isArray ) {
   772 			for ( ; i < length; i++ ) {
   773 				value = callback( elems[ i ], i, arg );
   774 
   775 				if ( value != null ) {
   776 					ret[ ret.length ] = value;
   777 				}
   778 			}
   779 
   780 		// Go through every key on the object,
   781 		} else {
   782 			for ( key in elems ) {
   783 				value = callback( elems[ key ], key, arg );
   784 
   785 				if ( value != null ) {
   786 					ret[ ret.length ] = value;
   787 				}
   788 			}
   789 		}
   790 
   791 		// Flatten any nested arrays
   792 		return ret.concat.apply( [], ret );
   793 	},
   794 
   795 	// A global GUID counter for objects
   796 	guid: 1,
   797 
   798 	// Bind a function to a context, optionally partially applying any
   799 	// arguments.
   800 	proxy: function( fn, context ) {
   801 		if ( typeof context === "string" ) {
   802 			var tmp = fn[ context ];
   803 			context = fn;
   804 			fn = tmp;
   805 		}
   806 
   807 		// Quick check to determine if target is callable, in the spec
   808 		// this throws a TypeError, but we will just return undefined.
   809 		if ( !jQuery.isFunction( fn ) ) {
   810 			return undefined;
   811 		}
   812 
   813 		// Simulated bind
   814 		var args = slice.call( arguments, 2 ),
   815 			proxy = function() {
   816 				return fn.apply( context, args.concat( slice.call( arguments ) ) );
   817 			};
   818 
   819 		// Set the guid of unique handler to the same of original handler, so it can be removed
   820 		proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
   821 
   822 		return proxy;
   823 	},
   824 
   825 	// Mutifunctional method to get and set values to a collection
   826 	// The value/s can optionally be executed if it's a function
   827 	access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
   828 		var exec,
   829 			bulk = key == null,
   830 			i = 0,
   831 			length = elems.length;
   832 
   833 		// Sets many values
   834 		if ( key && typeof key === "object" ) {
   835 			for ( i in key ) {
   836 				jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
   837 			}
   838 			chainable = 1;
   839 
   840 		// Sets one value
   841 		} else if ( value !== undefined ) {
   842 			// Optionally, function values get executed if exec is true
   843 			exec = pass === undefined && jQuery.isFunction( value );
   844 
   845 			if ( bulk ) {
   846 				// Bulk operations only iterate when executing function values
   847 				if ( exec ) {
   848 					exec = fn;
   849 					fn = function( elem, key, value ) {
   850 						return exec.call( jQuery( elem ), value );
   851 					};
   852 
   853 				// Otherwise they run against the entire set
   854 				} else {
   855 					fn.call( elems, value );
   856 					fn = null;
   857 				}
   858 			}
   859 
   860 			if ( fn ) {
   861 				for (; i < length; i++ ) {
   862 					fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
   863 				}
   864 			}
   865 
   866 			chainable = 1;
   867 		}
   868 
   869 		return chainable ?
   870 			elems :
   871 
   872 			// Gets
   873 			bulk ?
   874 				fn.call( elems ) :
   875 				length ? fn( elems[0], key ) : emptyGet;
   876 	},
   877 
   878 	now: function() {
   879 		return ( new Date() ).getTime();
   880 	},
   881 
   882 	// Use of jQuery.browser is frowned upon.
   883 	// More details: http://docs.jquery.com/Utilities/jQuery.browser
   884 	uaMatch: function( ua ) {
   885 		ua = ua.toLowerCase();
   886 
   887 		var match = rwebkit.exec( ua ) ||
   888 			ropera.exec( ua ) ||
   889 			rmsie.exec( ua ) ||
   890 			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
   891 			[];
   892 
   893 		return { browser: match[1] || "", version: match[2] || "0" };
   894 	},
   895 
   896 	sub: function() {
   897 		function jQuerySub( selector, context ) {
   898 			return new jQuerySub.fn.init( selector, context );
   899 		}
   900 		jQuery.extend( true, jQuerySub, this );
   901 		jQuerySub.superclass = this;
   902 		jQuerySub.fn = jQuerySub.prototype = this();
   903 		jQuerySub.fn.constructor = jQuerySub;
   904 		jQuerySub.sub = this.sub;
   905 		jQuerySub.fn.init = function init( selector, context ) {
   906 			if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
   907 				context = jQuerySub( context );
   908 			}
   909 
   910 			return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
   911 		};
   912 		jQuerySub.fn.init.prototype = jQuerySub.fn;
   913 		var rootjQuerySub = jQuerySub(document);
   914 		return jQuerySub;
   915 	},
   916 
   917 	browser: {}
   918 });
   919 
   920 // Populate the class2type map
   921 jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
   922 	class2type[ "[object " + name + "]" ] = name.toLowerCase();
   923 });
   924 
   925 browserMatch = jQuery.uaMatch( userAgent );
   926 if ( browserMatch.browser ) {
   927 	jQuery.browser[ browserMatch.browser ] = true;
   928 	jQuery.browser.version = browserMatch.version;
   929 }
   930 
   931 // Deprecated, use jQuery.browser.webkit instead
   932 if ( jQuery.browser.webkit ) {
   933 	jQuery.browser.safari = true;
   934 }
   935 
   936 // IE doesn't match non-breaking spaces with \s
   937 if ( rnotwhite.test( "\xA0" ) ) {
   938 	trimLeft = /^[\s\xA0]+/;
   939 	trimRight = /[\s\xA0]+$/;
   940 }
   941 
   942 // All jQuery objects should point back to these
   943 rootjQuery = jQuery(document);
   944 
   945 // Cleanup functions for the document ready method
   946 if ( document.addEventListener ) {
   947 	DOMContentLoaded = function() {
   948 		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
   949 		jQuery.ready();
   950 	};
   951 
   952 } else if ( document.attachEvent ) {
   953 	DOMContentLoaded = function() {
   954 		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
   955 		if ( document.readyState === "complete" ) {
   956 			document.detachEvent( "onreadystatechange", DOMContentLoaded );
   957 			jQuery.ready();
   958 		}
   959 	};
   960 }
   961 
   962 // The DOM ready check for Internet Explorer
   963 function doScrollCheck() {
   964 	if ( jQuery.isReady ) {
   965 		return;
   966 	}
   967 
   968 	try {
   969 		// If IE is used, use the trick by Diego Perini
   970 		// http://javascript.nwbox.com/IEContentLoaded/
   971 		document.documentElement.doScroll("left");
   972 	} catch(e) {
   973 		setTimeout( doScrollCheck, 1 );
   974 		return;
   975 	}
   976 
   977 	// and execute any waiting functions
   978 	jQuery.ready();
   979 }
   980 
   981 return jQuery;
   982 
   983 })();
   984 
   985 
   986 // String to Object flags format cache
   987 var flagsCache = {};
   988 
   989 // Convert String-formatted flags into Object-formatted ones and store in cache
   990 function createFlags( flags ) {
   991 	var object = flagsCache[ flags ] = {},
   992 		i, length;
   993 	flags = flags.split( /\s+/ );
   994 	for ( i = 0, length = flags.length; i < length; i++ ) {
   995 		object[ flags[i] ] = true;
   996 	}
   997 	return object;
   998 }
   999 
  1000 /*
  1001  * Create a callback list using the following parameters:
  1002  *
  1003  *	flags:	an optional list of space-separated flags that will change how
  1004  *			the callback list behaves
  1005  *
  1006  * By default a callback list will act like an event callback list and can be
  1007  * "fired" multiple times.
  1008  *
  1009  * Possible flags:
  1010  *
  1011  *	once:			will ensure the callback list can only be fired once (like a Deferred)
  1012  *
  1013  *	memory:			will keep track of previous values and will call any callback added
  1014  *					after the list has been fired right away with the latest "memorized"
  1015  *					values (like a Deferred)
  1016  *
  1017  *	unique:			will ensure a callback can only be added once (no duplicate in the list)
  1018  *
  1019  *	stopOnFalse:	interrupt callings when a callback returns false
  1020  *
  1021  */
  1022 jQuery.Callbacks = function( flags ) {
  1023 
  1024 	// Convert flags from String-formatted to Object-formatted
  1025 	// (we check in cache first)
  1026 	flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
  1027 
  1028 	var // Actual callback list
  1029 		list = [],
  1030 		// Stack of fire calls for repeatable lists
  1031 		stack = [],
  1032 		// Last fire value (for non-forgettable lists)
  1033 		memory,
  1034 		// Flag to know if list was already fired
  1035 		fired,
  1036 		// Flag to know if list is currently firing
  1037 		firing,
  1038 		// First callback to fire (used internally by add and fireWith)
  1039 		firingStart,
  1040 		// End of the loop when firing
  1041 		firingLength,
  1042 		// Index of currently firing callback (modified by remove if needed)
  1043 		firingIndex,
  1044 		// Add one or several callbacks to the list
  1045 		add = function( args ) {
  1046 			var i,
  1047 				length,
  1048 				elem,
  1049 				type,
  1050 				actual;
  1051 			for ( i = 0, length = args.length; i < length; i++ ) {
  1052 				elem = args[ i ];
  1053 				type = jQuery.type( elem );
  1054 				if ( type === "array" ) {
  1055 					// Inspect recursively
  1056 					add( elem );
  1057 				} else if ( type === "function" ) {
  1058 					// Add if not in unique mode and callback is not in
  1059 					if ( !flags.unique || !self.has( elem ) ) {
  1060 						list.push( elem );
  1061 					}
  1062 				}
  1063 			}
  1064 		},
  1065 		// Fire callbacks
  1066 		fire = function( context, args ) {
  1067 			args = args || [];
  1068 			memory = !flags.memory || [ context, args ];
  1069 			fired = true;
  1070 			firing = true;
  1071 			firingIndex = firingStart || 0;
  1072 			firingStart = 0;
  1073 			firingLength = list.length;
  1074 			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
  1075 				if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
  1076 					memory = true; // Mark as halted
  1077 					break;
  1078 				}
  1079 			}
  1080 			firing = false;
  1081 			if ( list ) {
  1082 				if ( !flags.once ) {
  1083 					if ( stack && stack.length ) {
  1084 						memory = stack.shift();
  1085 						self.fireWith( memory[ 0 ], memory[ 1 ] );
  1086 					}
  1087 				} else if ( memory === true ) {
  1088 					self.disable();
  1089 				} else {
  1090 					list = [];
  1091 				}
  1092 			}
  1093 		},
  1094 		// Actual Callbacks object
  1095 		self = {
  1096 			// Add a callback or a collection of callbacks to the list
  1097 			add: function() {
  1098 				if ( list ) {
  1099 					var length = list.length;
  1100 					add( arguments );
  1101 					// Do we need to add the callbacks to the
  1102 					// current firing batch?
  1103 					if ( firing ) {
  1104 						firingLength = list.length;
  1105 					// With memory, if we're not firing then
  1106 					// we should call right away, unless previous
  1107 					// firing was halted (stopOnFalse)
  1108 					} else if ( memory && memory !== true ) {
  1109 						firingStart = length;
  1110 						fire( memory[ 0 ], memory[ 1 ] );
  1111 					}
  1112 				}
  1113 				return this;
  1114 			},
  1115 			// Remove a callback from the list
  1116 			remove: function() {
  1117 				if ( list ) {
  1118 					var args = arguments,
  1119 						argIndex = 0,
  1120 						argLength = args.length;
  1121 					for ( ; argIndex < argLength ; argIndex++ ) {
  1122 						for ( var i = 0; i < list.length; i++ ) {
  1123 							if ( args[ argIndex ] === list[ i ] ) {
  1124 								// Handle firingIndex and firingLength
  1125 								if ( firing ) {
  1126 									if ( i <= firingLength ) {
  1127 										firingLength--;
  1128 										if ( i <= firingIndex ) {
  1129 											firingIndex--;
  1130 										}
  1131 									}
  1132 								}
  1133 								// Remove the element
  1134 								list.splice( i--, 1 );
  1135 								// If we have some unicity property then
  1136 								// we only need to do this once
  1137 								if ( flags.unique ) {
  1138 									break;
  1139 								}
  1140 							}
  1141 						}
  1142 					}
  1143 				}
  1144 				return this;
  1145 			},
  1146 			// Control if a given callback is in the list
  1147 			has: function( fn ) {
  1148 				if ( list ) {
  1149 					var i = 0,
  1150 						length = list.length;
  1151 					for ( ; i < length; i++ ) {
  1152 						if ( fn === list[ i ] ) {
  1153 							return true;
  1154 						}
  1155 					}
  1156 				}
  1157 				return false;
  1158 			},
  1159 			// Remove all callbacks from the list
  1160 			empty: function() {
  1161 				list = [];
  1162 				return this;
  1163 			},
  1164 			// Have the list do nothing anymore
  1165 			disable: function() {
  1166 				list = stack = memory = undefined;
  1167 				return this;
  1168 			},
  1169 			// Is it disabled?
  1170 			disabled: function() {
  1171 				return !list;
  1172 			},
  1173 			// Lock the list in its current state
  1174 			lock: function() {
  1175 				stack = undefined;
  1176 				if ( !memory || memory === true ) {
  1177 					self.disable();
  1178 				}
  1179 				return this;
  1180 			},
  1181 			// Is it locked?
  1182 			locked: function() {
  1183 				return !stack;
  1184 			},
  1185 			// Call all callbacks with the given context and arguments
  1186 			fireWith: function( context, args ) {
  1187 				if ( stack ) {
  1188 					if ( firing ) {
  1189 						if ( !flags.once ) {
  1190 							stack.push( [ context, args ] );
  1191 						}
  1192 					} else if ( !( flags.once && memory ) ) {
  1193 						fire( context, args );
  1194 					}
  1195 				}
  1196 				return this;
  1197 			},
  1198 			// Call all the callbacks with the given arguments
  1199 			fire: function() {
  1200 				self.fireWith( this, arguments );
  1201 				return this;
  1202 			},
  1203 			// To know if the callbacks have already been called at least once
  1204 			fired: function() {
  1205 				return !!fired;
  1206 			}
  1207 		};
  1208 
  1209 	return self;
  1210 };
  1211 
  1212 
  1213 
  1214 
  1215 var // Static reference to slice
  1216 	sliceDeferred = [].slice;
  1217 
  1218 jQuery.extend({
  1219 
  1220 	Deferred: function( func ) {
  1221 		var doneList = jQuery.Callbacks( "once memory" ),
  1222 			failList = jQuery.Callbacks( "once memory" ),
  1223 			progressList = jQuery.Callbacks( "memory" ),
  1224 			state = "pending",
  1225 			lists = {
  1226 				resolve: doneList,
  1227 				reject: failList,
  1228 				notify: progressList
  1229 			},
  1230 			promise = {
  1231 				done: doneList.add,
  1232 				fail: failList.add,
  1233 				progress: progressList.add,
  1234 
  1235 				state: function() {
  1236 					return state;
  1237 				},
  1238 
  1239 				// Deprecated
  1240 				isResolved: doneList.fired,
  1241 				isRejected: failList.fired,
  1242 
  1243 				then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
  1244 					deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
  1245 					return this;
  1246 				},
  1247 				always: function() {
  1248 					deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
  1249 					return this;
  1250 				},
  1251 				pipe: function( fnDone, fnFail, fnProgress ) {
  1252 					return jQuery.Deferred(function( newDefer ) {
  1253 						jQuery.each( {
  1254 							done: [ fnDone, "resolve" ],
  1255 							fail: [ fnFail, "reject" ],
  1256 							progress: [ fnProgress, "notify" ]
  1257 						}, function( handler, data ) {
  1258 							var fn = data[ 0 ],
  1259 								action = data[ 1 ],
  1260 								returned;
  1261 							if ( jQuery.isFunction( fn ) ) {
  1262 								deferred[ handler ](function() {
  1263 									returned = fn.apply( this, arguments );
  1264 									if ( returned && jQuery.isFunction( returned.promise ) ) {
  1265 										returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
  1266 									} else {
  1267 										newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
  1268 									}
  1269 								});
  1270 							} else {
  1271 								deferred[ handler ]( newDefer[ action ] );
  1272 							}
  1273 						});
  1274 					}).promise();
  1275 				},
  1276 				// Get a promise for this deferred
  1277 				// If obj is provided, the promise aspect is added to the object
  1278 				promise: function( obj ) {
  1279 					if ( obj == null ) {
  1280 						obj = promise;
  1281 					} else {
  1282 						for ( var key in promise ) {
  1283 							obj[ key ] = promise[ key ];
  1284 						}
  1285 					}
  1286 					return obj;
  1287 				}
  1288 			},
  1289 			deferred = promise.promise({}),
  1290 			key;
  1291 
  1292 		for ( key in lists ) {
  1293 			deferred[ key ] = lists[ key ].fire;
  1294 			deferred[ key + "With" ] = lists[ key ].fireWith;
  1295 		}
  1296 
  1297 		// Handle state
  1298 		deferred.done( function() {
  1299 			state = "resolved";
  1300 		}, failList.disable, progressList.lock ).fail( function() {
  1301 			state = "rejected";
  1302 		}, doneList.disable, progressList.lock );
  1303 
  1304 		// Call given func if any
  1305 		if ( func ) {
  1306 			func.call( deferred, deferred );
  1307 		}
  1308 
  1309 		// All done!
  1310 		return deferred;
  1311 	},
  1312 
  1313 	// Deferred helper
  1314 	when: function( firstParam ) {
  1315 		var args = sliceDeferred.call( arguments, 0 ),
  1316 			i = 0,
  1317 			length = args.length,
  1318 			pValues = new Array( length ),
  1319 			count = length,
  1320 			pCount = length,
  1321 			deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
  1322 				firstParam :
  1323 				jQuery.Deferred(),
  1324 			promise = deferred.promise();
  1325 		function resolveFunc( i ) {
  1326 			return function( value ) {
  1327 				args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
  1328 				if ( !( --count ) ) {
  1329 					deferred.resolveWith( deferred, args );
  1330 				}
  1331 			};
  1332 		}
  1333 		function progressFunc( i ) {
  1334 			return function( value ) {
  1335 				pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
  1336 				deferred.notifyWith( promise, pValues );
  1337 			};
  1338 		}
  1339 		if ( length > 1 ) {
  1340 			for ( ; i < length; i++ ) {
  1341 				if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
  1342 					args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
  1343 				} else {
  1344 					--count;
  1345 				}
  1346 			}
  1347 			if ( !count ) {
  1348 				deferred.resolveWith( deferred, args );
  1349 			}
  1350 		} else if ( deferred !== firstParam ) {
  1351 			deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
  1352 		}
  1353 		return promise;
  1354 	}
  1355 });
  1356 
  1357 
  1358 
  1359 
  1360 jQuery.support = (function() {
  1361 
  1362 	var support,
  1363 		all,
  1364 		a,
  1365 		select,
  1366 		opt,
  1367 		input,
  1368 		fragment,
  1369 		tds,
  1370 		events,
  1371 		eventName,
  1372 		i,
  1373 		isSupported,
  1374 		div = document.createElement( "div" ),
  1375 		documentElement = document.documentElement;
  1376 
  1377 	// Preliminary tests
  1378 	div.setAttribute("className", "t");
  1379 	div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
  1380 
  1381 	all = div.getElementsByTagName( "*" );
  1382 	a = div.getElementsByTagName( "a" )[ 0 ];
  1383 
  1384 	// Can't get basic test support
  1385 	if ( !all || !all.length || !a ) {
  1386 		return {};
  1387 	}
  1388 
  1389 	// First batch of supports tests
  1390 	select = document.createElement( "select" );
  1391 	opt = select.appendChild( document.createElement("option") );
  1392 	input = div.getElementsByTagName( "input" )[ 0 ];
  1393 
  1394 	support = {
  1395 		// IE strips leading whitespace when .innerHTML is used
  1396 		leadingWhitespace: ( div.firstChild.nodeType === 3 ),
  1397 
  1398 		// Make sure that tbody elements aren't automatically inserted
  1399 		// IE will insert them into empty tables
  1400 		tbody: !div.getElementsByTagName("tbody").length,
  1401 
  1402 		// Make sure that link elements get serialized correctly by innerHTML
  1403 		// This requires a wrapper element in IE
  1404 		htmlSerialize: !!div.getElementsByTagName("link").length,
  1405 
  1406 		// Get the style information from getAttribute
  1407 		// (IE uses .cssText instead)
  1408 		style: /top/.test( a.getAttribute("style") ),
  1409 
  1410 		// Make sure that URLs aren't manipulated
  1411 		// (IE normalizes it by default)
  1412 		hrefNormalized: ( a.getAttribute("href") === "/a" ),
  1413 
  1414 		// Make sure that element opacity exists
  1415 		// (IE uses filter instead)
  1416 		// Use a regex to work around a WebKit issue. See #5145
  1417 		opacity: /^0.55/.test( a.style.opacity ),
  1418 
  1419 		// Verify style float existence
  1420 		// (IE uses styleFloat instead of cssFloat)
  1421 		cssFloat: !!a.style.cssFloat,
  1422 
  1423 		// Make sure that if no value is specified for a checkbox
  1424 		// that it defaults to "on".
  1425 		// (WebKit defaults to "" instead)
  1426 		checkOn: ( input.value === "on" ),
  1427 
  1428 		// Make sure that a selected-by-default option has a working selected property.
  1429 		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
  1430 		optSelected: opt.selected,
  1431 
  1432 		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
  1433 		getSetAttribute: div.className !== "t",
  1434 
  1435 		// Tests for enctype support on a form(#6743)
  1436 		enctype: !!document.createElement("form").enctype,
  1437 
  1438 		// Makes sure cloning an html5 element does not cause problems
  1439 		// Where outerHTML is undefined, this still works
  1440 		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
  1441 
  1442 		// Will be defined later
  1443 		submitBubbles: true,
  1444 		changeBubbles: true,
  1445 		focusinBubbles: false,
  1446 		deleteExpando: true,
  1447 		noCloneEvent: true,
  1448 		inlineBlockNeedsLayout: false,
  1449 		shrinkWrapBlocks: false,
  1450 		reliableMarginRight: true,
  1451 		pixelMargin: true
  1452 	};
  1453 
  1454 	// jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
  1455 	jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
  1456 
  1457 	// Make sure checked status is properly cloned
  1458 	input.checked = true;
  1459 	support.noCloneChecked = input.cloneNode( true ).checked;
  1460 
  1461 	// Make sure that the options inside disabled selects aren't marked as disabled
  1462 	// (WebKit marks them as disabled)
  1463 	select.disabled = true;
  1464 	support.optDisabled = !opt.disabled;
  1465 
  1466 	// Test to see if it's possible to delete an expando from an element
  1467 	// Fails in Internet Explorer
  1468 	try {
  1469 		delete div.test;
  1470 	} catch( e ) {
  1471 		support.deleteExpando = false;
  1472 	}
  1473 
  1474 	if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
  1475 		div.attachEvent( "onclick", function() {
  1476 			// Cloning a node shouldn't copy over any
  1477 			// bound event handlers (IE does this)
  1478 			support.noCloneEvent = false;
  1479 		});
  1480 		div.cloneNode( true ).fireEvent( "onclick" );
  1481 	}
  1482 
  1483 	// Check if a radio maintains its value
  1484 	// after being appended to the DOM
  1485 	input = document.createElement("input");
  1486 	input.value = "t";
  1487 	input.setAttribute("type", "radio");
  1488 	support.radioValue = input.value === "t";
  1489 
  1490 	input.setAttribute("checked", "checked");
  1491 
  1492 	// #11217 - WebKit loses check when the name is after the checked attribute
  1493 	input.setAttribute( "name", "t" );
  1494 
  1495 	div.appendChild( input );
  1496 	fragment = document.createDocumentFragment();
  1497 	fragment.appendChild( div.lastChild );
  1498 
  1499 	// WebKit doesn't clone checked state correctly in fragments
  1500 	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
  1501 
  1502 	// Check if a disconnected checkbox will retain its checked
  1503 	// value of true after appended to the DOM (IE6/7)
  1504 	support.appendChecked = input.checked;
  1505 
  1506 	fragment.removeChild( input );
  1507 	fragment.appendChild( div );
  1508 
  1509 	// Technique from Juriy Zaytsev
  1510 	// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
  1511 	// We only care about the case where non-standard event systems
  1512 	// are used, namely in IE. Short-circuiting here helps us to
  1513 	// avoid an eval call (in setAttribute) which can cause CSP
  1514 	// to go haywire. See: https://developer.mozilla.org/en/Security/CSP
  1515 	if ( div.attachEvent ) {
  1516 		for ( i in {
  1517 			submit: 1,
  1518 			change: 1,
  1519 			focusin: 1
  1520 		}) {
  1521 			eventName = "on" + i;
  1522 			isSupported = ( eventName in div );
  1523 			if ( !isSupported ) {
  1524 				div.setAttribute( eventName, "return;" );
  1525 				isSupported = ( typeof div[ eventName ] === "function" );
  1526 			}
  1527 			support[ i + "Bubbles" ] = isSupported;
  1528 		}
  1529 	}
  1530 
  1531 	fragment.removeChild( div );
  1532 
  1533 	// Null elements to avoid leaks in IE
  1534 	fragment = select = opt = div = input = null;
  1535 
  1536 	// Run tests that need a body at doc ready
  1537 	jQuery(function() {
  1538 		var container, outer, inner, table, td, offsetSupport,
  1539 			marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
  1540 			paddingMarginBorderVisibility, paddingMarginBorder,
  1541 			body = document.getElementsByTagName("body")[0];
  1542 
  1543 		if ( !body ) {
  1544 			// Return for frameset docs that don't have a body
  1545 			return;
  1546 		}
  1547 
  1548 		conMarginTop = 1;
  1549 		paddingMarginBorder = "padding:0;margin:0;border:";
  1550 		positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
  1551 		paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
  1552 		style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
  1553 		html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
  1554 			"<table " + style + "' cellpadding='0' cellspacing='0'>" +
  1555 			"<tr><td></td></tr></table>";
  1556 
  1557 		container = document.createElement("div");
  1558 		container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
  1559 		body.insertBefore( container, body.firstChild );
  1560 
  1561 		// Construct the test element
  1562 		div = document.createElement("div");
  1563 		container.appendChild( div );
  1564 
  1565 		// Check if table cells still have offsetWidth/Height when they are set
  1566 		// to display:none and there are still other visible table cells in a
  1567 		// table row; if so, offsetWidth/Height are not reliable for use when
  1568 		// determining if an element has been hidden directly using
  1569 		// display:none (it is still safe to use offsets if a parent element is
  1570 		// hidden; don safety goggles and see bug #4512 for more information).
  1571 		// (only IE 8 fails this test)
  1572 		div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
  1573 		tds = div.getElementsByTagName( "td" );
  1574 		isSupported = ( tds[ 0 ].offsetHeight === 0 );
  1575 
  1576 		tds[ 0 ].style.display = "";
  1577 		tds[ 1 ].style.display = "none";
  1578 
  1579 		// Check if empty table cells still have offsetWidth/Height
  1580 		// (IE <= 8 fail this test)
  1581 		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
  1582 
  1583 		// Check if div with explicit width and no margin-right incorrectly
  1584 		// gets computed margin-right based on width of container. For more
  1585 		// info see bug #3333
  1586 		// Fails in WebKit before Feb 2011 nightlies
  1587 		// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
  1588 		if ( window.getComputedStyle ) {
  1589 			div.innerHTML = "";
  1590 			marginDiv = document.createElement( "div" );
  1591 			marginDiv.style.width = "0";
  1592 			marginDiv.style.marginRight = "0";
  1593 			div.style.width = "2px";
  1594 			div.appendChild( marginDiv );
  1595 			support.reliableMarginRight =
  1596 				( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
  1597 		}
  1598 
  1599 		if ( typeof div.style.zoom !== "undefined" ) {
  1600 			// Check if natively block-level elements act like inline-block
  1601 			// elements when setting their display to 'inline' and giving
  1602 			// them layout
  1603 			// (IE < 8 does this)
  1604 			div.innerHTML = "";
  1605 			div.style.width = div.style.padding = "1px";
  1606 			div.style.border = 0;
  1607 			div.style.overflow = "hidden";
  1608 			div.style.display = "inline";
  1609 			div.style.zoom = 1;
  1610 			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
  1611 
  1612 			// Check if elements with layout shrink-wrap their children
  1613 			// (IE 6 does this)
  1614 			div.style.display = "block";
  1615 			div.style.overflow = "visible";
  1616 			div.innerHTML = "<div style='width:5px;'></div>";
  1617 			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
  1618 		}
  1619 
  1620 		div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
  1621 		div.innerHTML = html;
  1622 
  1623 		outer = div.firstChild;
  1624 		inner = outer.firstChild;
  1625 		td = outer.nextSibling.firstChild.firstChild;
  1626 
  1627 		offsetSupport = {
  1628 			doesNotAddBorder: ( inner.offsetTop !== 5 ),
  1629 			doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
  1630 		};
  1631 
  1632 		inner.style.position = "fixed";
  1633 		inner.style.top = "20px";
  1634 
  1635 		// safari subtracts parent border width here which is 5px
  1636 		offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
  1637 		inner.style.position = inner.style.top = "";
  1638 
  1639 		outer.style.overflow = "hidden";
  1640 		outer.style.position = "relative";
  1641 
  1642 		offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
  1643 		offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
  1644 
  1645 		if ( window.getComputedStyle ) {
  1646 			div.style.marginTop = "1%";
  1647 			support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
  1648 		}
  1649 
  1650 		if ( typeof container.style.zoom !== "undefined" ) {
  1651 			container.style.zoom = 1;
  1652 		}
  1653 
  1654 		body.removeChild( container );
  1655 		marginDiv = div = container = null;
  1656 
  1657 		jQuery.extend( support, offsetSupport );
  1658 	});
  1659 
  1660 	return support;
  1661 })();
  1662 
  1663 
  1664 
  1665 
  1666 var rbrace = /^(?:\{.*\}|\[.*\])$/,
  1667 	rmultiDash = /([A-Z])/g;
  1668 
  1669 jQuery.extend({
  1670 	cache: {},
  1671 
  1672 	// Please use with caution
  1673 	uuid: 0,
  1674 
  1675 	// Unique for each copy of jQuery on the page
  1676 	// Non-digits removed to match rinlinejQuery
  1677 	expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
  1678 
  1679 	// The following elements throw uncatchable exceptions if you
  1680 	// attempt to add expando properties to them.
  1681 	noData: {
  1682 		"embed": true,
  1683 		// Ban all objects except for Flash (which handle expandos)
  1684 		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
  1685 		"applet": true
  1686 	},
  1687 
  1688 	hasData: function( elem ) {
  1689 		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
  1690 		return !!elem && !isEmptyDataObject( elem );
  1691 	},
  1692 
  1693 	data: function( elem, name, data, pvt /* Internal Use Only */ ) {
  1694 		if ( !jQuery.acceptData( elem ) ) {
  1695 			return;
  1696 		}
  1697 
  1698 		var privateCache, thisCache, ret,
  1699 			internalKey = jQuery.expando,
  1700 			getByName = typeof name === "string",
  1701 
  1702 			// We have to handle DOM nodes and JS objects differently because IE6-7
  1703 			// can't GC object references properly across the DOM-JS boundary
  1704 			isNode = elem.nodeType,
  1705 
  1706 			// Only DOM nodes need the global jQuery cache; JS object data is
  1707 			// attached directly to the object so GC can occur automatically
  1708 			cache = isNode ? jQuery.cache : elem,
  1709 
  1710 			// Only defining an ID for JS objects if its cache already exists allows
  1711 			// the code to shortcut on the same path as a DOM node with no cache
  1712 			id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
  1713 			isEvents = name === "events";
  1714 
  1715 		// Avoid doing any more work than we need to when trying to get data on an
  1716 		// object that has no data at all
  1717 		if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
  1718 			return;
  1719 		}
  1720 
  1721 		if ( !id ) {
  1722 			// Only DOM nodes need a new unique ID for each element since their data
  1723 			// ends up in the global cache
  1724 			if ( isNode ) {
  1725 				elem[ internalKey ] = id = ++jQuery.uuid;
  1726 			} else {
  1727 				id = internalKey;
  1728 			}
  1729 		}
  1730 
  1731 		if ( !cache[ id ] ) {
  1732 			cache[ id ] = {};
  1733 
  1734 			// Avoids exposing jQuery metadata on plain JS objects when the object
  1735 			// is serialized using JSON.stringify
  1736 			if ( !isNode ) {
  1737 				cache[ id ].toJSON = jQuery.noop;
  1738 			}
  1739 		}
  1740 
  1741 		// An object can be passed to jQuery.data instead of a key/value pair; this gets
  1742 		// shallow copied over onto the existing cache
  1743 		if ( typeof name === "object" || typeof name === "function" ) {
  1744 			if ( pvt ) {
  1745 				cache[ id ] = jQuery.extend( cache[ id ], name );
  1746 			} else {
  1747 				cache[ id ].data = jQuery.extend( cache[ id ].data, name );
  1748 			}
  1749 		}
  1750 
  1751 		privateCache = thisCache = cache[ id ];
  1752 
  1753 		// jQuery data() is stored in a separate object inside the object's internal data
  1754 		// cache in order to avoid key collisions between internal data and user-defined
  1755 		// data.
  1756 		if ( !pvt ) {
  1757 			if ( !thisCache.data ) {
  1758 				thisCache.data = {};
  1759 			}
  1760 
  1761 			thisCache = thisCache.data;
  1762 		}
  1763 
  1764 		if ( data !== undefined ) {
  1765 			thisCache[ jQuery.camelCase( name ) ] = data;
  1766 		}
  1767 
  1768 		// Users should not attempt to inspect the internal events object using jQuery.data,
  1769 		// it is undocumented and subject to change. But does anyone listen? No.
  1770 		if ( isEvents && !thisCache[ name ] ) {
  1771 			return privateCache.events;
  1772 		}
  1773 
  1774 		// Check for both converted-to-camel and non-converted data property names
  1775 		// If a data property was specified
  1776 		if ( getByName ) {
  1777 
  1778 			// First Try to find as-is property data
  1779 			ret = thisCache[ name ];
  1780 
  1781 			// Test for null|undefined property data
  1782 			if ( ret == null ) {
  1783 
  1784 				// Try to find the camelCased property
  1785 				ret = thisCache[ jQuery.camelCase( name ) ];
  1786 			}
  1787 		} else {
  1788 			ret = thisCache;
  1789 		}
  1790 
  1791 		return ret;
  1792 	},
  1793 
  1794 	removeData: function( elem, name, pvt /* Internal Use Only */ ) {
  1795 		if ( !jQuery.acceptData( elem ) ) {
  1796 			return;
  1797 		}
  1798 
  1799 		var thisCache, i, l,
  1800 
  1801 			// Reference to internal data cache key
  1802 			internalKey = jQuery.expando,
  1803 
  1804 			isNode = elem.nodeType,
  1805 
  1806 			// See jQuery.data for more information
  1807 			cache = isNode ? jQuery.cache : elem,
  1808 
  1809 			// See jQuery.data for more information
  1810 			id = isNode ? elem[ internalKey ] : internalKey;
  1811 
  1812 		// If there is already no cache entry for this object, there is no
  1813 		// purpose in continuing
  1814 		if ( !cache[ id ] ) {
  1815 			return;
  1816 		}
  1817 
  1818 		if ( name ) {
  1819 
  1820 			thisCache = pvt ? cache[ id ] : cache[ id ].data;
  1821 
  1822 			if ( thisCache ) {
  1823 
  1824 				// Support array or space separated string names for data keys
  1825 				if ( !jQuery.isArray( name ) ) {
  1826 
  1827 					// try the string as a key before any manipulation
  1828 					if ( name in thisCache ) {
  1829 						name = [ name ];
  1830 					} else {
  1831 
  1832 						// split the camel cased version by spaces unless a key with the spaces exists
  1833 						name = jQuery.camelCase( name );
  1834 						if ( name in thisCache ) {
  1835 							name = [ name ];
  1836 						} else {
  1837 							name = name.split( " " );
  1838 						}
  1839 					}
  1840 				}
  1841 
  1842 				for ( i = 0, l = name.length; i < l; i++ ) {
  1843 					delete thisCache[ name[i] ];
  1844 				}
  1845 
  1846 				// If there is no data left in the cache, we want to continue
  1847 				// and let the cache object itself get destroyed
  1848 				if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
  1849 					return;
  1850 				}
  1851 			}
  1852 		}
  1853 
  1854 		// See jQuery.data for more information
  1855 		if ( !pvt ) {
  1856 			delete cache[ id ].data;
  1857 
  1858 			// Don't destroy the parent cache unless the internal data object
  1859 			// had been the only thing left in it
  1860 			if ( !isEmptyDataObject(cache[ id ]) ) {
  1861 				return;
  1862 			}
  1863 		}
  1864 
  1865 		// Browsers that fail expando deletion also refuse to delete expandos on
  1866 		// the window, but it will allow it on all other JS objects; other browsers
  1867 		// don't care
  1868 		// Ensure that `cache` is not a window object #10080
  1869 		if ( jQuery.support.deleteExpando || !cache.setInterval ) {
  1870 			delete cache[ id ];
  1871 		} else {
  1872 			cache[ id ] = null;
  1873 		}
  1874 
  1875 		// We destroyed the cache and need to eliminate the expando on the node to avoid
  1876 		// false lookups in the cache for entries that no longer exist
  1877 		if ( isNode ) {
  1878 			// IE does not allow us to delete expando properties from nodes,
  1879 			// nor does it have a removeAttribute function on Document nodes;
  1880 			// we must handle all of these cases
  1881 			if ( jQuery.support.deleteExpando ) {
  1882 				delete elem[ internalKey ];
  1883 			} else if ( elem.removeAttribute ) {
  1884 				elem.removeAttribute( internalKey );
  1885 			} else {
  1886 				elem[ internalKey ] = null;
  1887 			}
  1888 		}
  1889 	},
  1890 
  1891 	// For internal use only.
  1892 	_data: function( elem, name, data ) {
  1893 		return jQuery.data( elem, name, data, true );
  1894 	},
  1895 
  1896 	// A method for determining if a DOM node can handle the data expando
  1897 	acceptData: function( elem ) {
  1898 		if ( elem.nodeName ) {
  1899 			var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
  1900 
  1901 			if ( match ) {
  1902 				return !(match === true || elem.getAttribute("classid") !== match);
  1903 			}
  1904 		}
  1905 
  1906 		return true;
  1907 	}
  1908 });
  1909 
  1910 jQuery.fn.extend({
  1911 	data: function( key, value ) {
  1912 		var parts, part, attr, name, l,
  1913 			elem = this[0],
  1914 			i = 0,
  1915 			data = null;
  1916 
  1917 		// Gets all values
  1918 		if ( key === undefined ) {
  1919 			if ( this.length ) {
  1920 				data = jQuery.data( elem );
  1921 
  1922 				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
  1923 					attr = elem.attributes;
  1924 					for ( l = attr.length; i < l; i++ ) {
  1925 						name = attr[i].name;
  1926 
  1927 						if ( name.indexOf( "data-" ) === 0 ) {
  1928 							name = jQuery.camelCase( name.substring(5) );
  1929 
  1930 							dataAttr( elem, name, data[ name ] );
  1931 						}
  1932 					}
  1933 					jQuery._data( elem, "parsedAttrs", true );
  1934 				}
  1935 			}
  1936 
  1937 			return data;
  1938 		}
  1939 
  1940 		// Sets multiple values
  1941 		if ( typeof key === "object" ) {
  1942 			return this.each(function() {
  1943 				jQuery.data( this, key );
  1944 			});
  1945 		}
  1946 
  1947 		parts = key.split( ".", 2 );
  1948 		parts[1] = parts[1] ? "." + parts[1] : "";
  1949 		part = parts[1] + "!";
  1950 
  1951 		return jQuery.access( this, function( value ) {
  1952 
  1953 			if ( value === undefined ) {
  1954 				data = this.triggerHandler( "getData" + part, [ parts[0] ] );
  1955 
  1956 				// Try to fetch any internally stored data first
  1957 				if ( data === undefined && elem ) {
  1958 					data = jQuery.data( elem, key );
  1959 					data = dataAttr( elem, key, data );
  1960 				}
  1961 
  1962 				return data === undefined && parts[1] ?
  1963 					this.data( parts[0] ) :
  1964 					data;
  1965 			}
  1966 
  1967 			parts[1] = value;
  1968 			this.each(function() {
  1969 				var self = jQuery( this );
  1970 
  1971 				self.triggerHandler( "setData" + part, parts );
  1972 				jQuery.data( this, key, value );
  1973 				self.triggerHandler( "changeData" + part, parts );
  1974 			});
  1975 		}, null, value, arguments.length > 1, null, false );
  1976 	},
  1977 
  1978 	removeData: function( key ) {
  1979 		return this.each(function() {
  1980 			jQuery.removeData( this, key );
  1981 		});
  1982 	}
  1983 });
  1984 
  1985 function dataAttr( elem, key, data ) {
  1986 	// If nothing was found internally, try to fetch any
  1987 	// data from the HTML5 data-* attribute
  1988 	if ( data === undefined && elem.nodeType === 1 ) {
  1989 
  1990 		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
  1991 
  1992 		data = elem.getAttribute( name );
  1993 
  1994 		if ( typeof data === "string" ) {
  1995 			try {
  1996 				data = data === "true" ? true :
  1997 				data === "false" ? false :
  1998 				data === "null" ? null :
  1999 				jQuery.isNumeric( data ) ? +data :
  2000 					rbrace.test( data ) ? jQuery.parseJSON( data ) :
  2001 					data;
  2002 			} catch( e ) {}
  2003 
  2004 			// Make sure we set the data so it isn't changed later
  2005 			jQuery.data( elem, key, data );
  2006 
  2007 		} else {
  2008 			data = undefined;
  2009 		}
  2010 	}
  2011 
  2012 	return data;
  2013 }
  2014 
  2015 // checks a cache object for emptiness
  2016 function isEmptyDataObject( obj ) {
  2017 	for ( var name in obj ) {
  2018 
  2019 		// if the public data object is empty, the private is still empty
  2020 		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
  2021 			continue;
  2022 		}
  2023 		if ( name !== "toJSON" ) {
  2024 			return false;
  2025 		}
  2026 	}
  2027 
  2028 	return true;
  2029 }
  2030 
  2031 
  2032 
  2033 
  2034 function handleQueueMarkDefer( elem, type, src ) {
  2035 	var deferDataKey = type + "defer",
  2036 		queueDataKey = type + "queue",
  2037 		markDataKey = type + "mark",
  2038 		defer = jQuery._data( elem, deferDataKey );
  2039 	if ( defer &&
  2040 		( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
  2041 		( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
  2042 		// Give room for hard-coded callbacks to fire first
  2043 		// and eventually mark/queue something else on the element
  2044 		setTimeout( function() {
  2045 			if ( !jQuery._data( elem, queueDataKey ) &&
  2046 				!jQuery._data( elem, markDataKey ) ) {
  2047 				jQuery.removeData( elem, deferDataKey, true );
  2048 				defer.fire();
  2049 			}
  2050 		}, 0 );
  2051 	}
  2052 }
  2053 
  2054 jQuery.extend({
  2055 
  2056 	_mark: function( elem, type ) {
  2057 		if ( elem ) {
  2058 			type = ( type || "fx" ) + "mark";
  2059 			jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
  2060 		}
  2061 	},
  2062 
  2063 	_unmark: function( force, elem, type ) {
  2064 		if ( force !== true ) {
  2065 			type = elem;
  2066 			elem = force;
  2067 			force = false;
  2068 		}
  2069 		if ( elem ) {
  2070 			type = type || "fx";
  2071 			var key = type + "mark",
  2072 				count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
  2073 			if ( count ) {
  2074 				jQuery._data( elem, key, count );
  2075 			} else {
  2076 				jQuery.removeData( elem, key, true );
  2077 				handleQueueMarkDefer( elem, type, "mark" );
  2078 			}
  2079 		}
  2080 	},
  2081 
  2082 	queue: function( elem, type, data ) {
  2083 		var q;
  2084 		if ( elem ) {
  2085 			type = ( type || "fx" ) + "queue";
  2086 			q = jQuery._data( elem, type );
  2087 
  2088 			// Speed up dequeue by getting out quickly if this is just a lookup
  2089 			if ( data ) {
  2090 				if ( !q || jQuery.isArray(data) ) {
  2091 					q = jQuery._data( elem, type, jQuery.makeArray(data) );
  2092 				} else {
  2093 					q.push( data );
  2094 				}
  2095 			}
  2096 			return q || [];
  2097 		}
  2098 	},
  2099 
  2100 	dequeue: function( elem, type ) {
  2101 		type = type || "fx";
  2102 
  2103 		var queue = jQuery.queue( elem, type ),
  2104 			fn = queue.shift(),
  2105 			hooks = {};
  2106 
  2107 		// If the fx queue is dequeued, always remove the progress sentinel
  2108 		if ( fn === "inprogress" ) {
  2109 			fn = queue.shift();
  2110 		}
  2111 
  2112 		if ( fn ) {
  2113 			// Add a progress sentinel to prevent the fx queue from being
  2114 			// automatically dequeued
  2115 			if ( type === "fx" ) {
  2116 				queue.unshift( "inprogress" );
  2117 			}
  2118 
  2119 			jQuery._data( elem, type + ".run", hooks );
  2120 			fn.call( elem, function() {
  2121 				jQuery.dequeue( elem, type );
  2122 			}, hooks );
  2123 		}
  2124 
  2125 		if ( !queue.length ) {
  2126 			jQuery.removeData( elem, type + "queue " + type + ".run", true );
  2127 			handleQueueMarkDefer( elem, type, "queue" );
  2128 		}
  2129 	}
  2130 });
  2131 
  2132 jQuery.fn.extend({
  2133 	queue: function( type, data ) {
  2134 		var setter = 2;
  2135 
  2136 		if ( typeof type !== "string" ) {
  2137 			data = type;
  2138 			type = "fx";
  2139 			setter--;
  2140 		}
  2141 
  2142 		if ( arguments.length < setter ) {
  2143 			return jQuery.queue( this[0], type );
  2144 		}
  2145 
  2146 		return data === undefined ?
  2147 			this :
  2148 			this.each(function() {
  2149 				var queue = jQuery.queue( this, type, data );
  2150 
  2151 				if ( type === "fx" && queue[0] !== "inprogress" ) {
  2152 					jQuery.dequeue( this, type );
  2153 				}
  2154 			});
  2155 	},
  2156 	dequeue: function( type ) {
  2157 		return this.each(function() {
  2158 			jQuery.dequeue( this, type );
  2159 		});
  2160 	},
  2161 	// Based off of the plugin by Clint Helfers, with permission.
  2162 	// http://blindsignals.com/index.php/2009/07/jquery-delay/
  2163 	delay: function( time, type ) {
  2164 		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
  2165 		type = type || "fx";
  2166 
  2167 		return this.queue( type, function( next, hooks ) {
  2168 			var timeout = setTimeout( next, time );
  2169 			hooks.stop = function() {
  2170 				clearTimeout( timeout );
  2171 			};
  2172 		});
  2173 	},
  2174 	clearQueue: function( type ) {
  2175 		return this.queue( type || "fx", [] );
  2176 	},
  2177 	// Get a promise resolved when queues of a certain type
  2178 	// are emptied (fx is the type by default)
  2179 	promise: function( type, object ) {
  2180 		if ( typeof type !== "string" ) {
  2181 			object = type;
  2182 			type = undefined;
  2183 		}
  2184 		type = type || "fx";
  2185 		var defer = jQuery.Deferred(),
  2186 			elements = this,
  2187 			i = elements.length,
  2188 			count = 1,
  2189 			deferDataKey = type + "defer",
  2190 			queueDataKey = type + "queue",
  2191 			markDataKey = type + "mark",
  2192 			tmp;
  2193 		function resolve() {
  2194 			if ( !( --count ) ) {
  2195 				defer.resolveWith( elements, [ elements ] );
  2196 			}
  2197 		}
  2198 		while( i-- ) {
  2199 			if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
  2200 					( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
  2201 						jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
  2202 					jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
  2203 				count++;
  2204 				tmp.add( resolve );
  2205 			}
  2206 		}
  2207 		resolve();
  2208 		return defer.promise( object );
  2209 	}
  2210 });
  2211 
  2212 
  2213 
  2214 
  2215 var rclass = /[\n\t\r]/g,
  2216 	rspace = /\s+/,
  2217 	rreturn = /\r/g,
  2218 	rtype = /^(?:button|input)$/i,
  2219 	rfocusable = /^(?:button|input|object|select|textarea)$/i,
  2220 	rclickable = /^a(?:rea)?$/i,
  2221 	rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
  2222 	getSetAttribute = jQuery.support.getSetAttribute,
  2223 	nodeHook, boolHook, fixSpecified;
  2224 
  2225 jQuery.fn.extend({
  2226 	attr: function( name, value ) {
  2227 		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
  2228 	},
  2229 
  2230 	removeAttr: function( name ) {
  2231 		return this.each(function() {
  2232 			jQuery.removeAttr( this, name );
  2233 		});
  2234 	},
  2235 
  2236 	prop: function( name, value ) {
  2237 		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
  2238 	},
  2239 
  2240 	removeProp: function( name ) {
  2241 		name = jQuery.propFix[ name ] || name;
  2242 		return this.each(function() {
  2243 			// try/catch handles cases where IE balks (such as removing a property on window)
  2244 			try {
  2245 				this[ name ] = undefined;
  2246 				delete this[ name ];
  2247 			} catch( e ) {}
  2248 		});
  2249 	},
  2250 
  2251 	addClass: function( value ) {
  2252 		var classNames, i, l, elem,
  2253 			setClass, c, cl;
  2254 
  2255 		if ( jQuery.isFunction( value ) ) {
  2256 			return this.each(function( j ) {
  2257 				jQuery( this ).addClass( value.call(this, j, this.className) );
  2258 			});
  2259 		}
  2260 
  2261 		if ( value && typeof value === "string" ) {
  2262 			classNames = value.split( rspace );
  2263 
  2264 			for ( i = 0, l = this.length; i < l; i++ ) {
  2265 				elem = this[ i ];
  2266 
  2267 				if ( elem.nodeType === 1 ) {
  2268 					if ( !elem.className && classNames.length === 1 ) {
  2269 						elem.className = value;
  2270 
  2271 					} else {
  2272 						setClass = " " + elem.className + " ";
  2273 
  2274 						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
  2275 							if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
  2276 								setClass += classNames[ c ] + " ";
  2277 							}
  2278 						}
  2279 						elem.className = jQuery.trim( setClass );
  2280 					}
  2281 				}
  2282 			}
  2283 		}
  2284 
  2285 		return this;
  2286 	},
  2287 
  2288 	removeClass: function( value ) {
  2289 		var classNames, i, l, elem, className, c, cl;
  2290 
  2291 		if ( jQuery.isFunction( value ) ) {
  2292 			return this.each(function( j ) {
  2293 				jQuery( this ).removeClass( value.call(this, j, this.className) );
  2294 			});
  2295 		}
  2296 
  2297 		if ( (value && typeof value === "string") || value === undefined ) {
  2298 			classNames = ( value || "" ).split( rspace );
  2299 
  2300 			for ( i = 0, l = this.length; i < l; i++ ) {
  2301 				elem = this[ i ];
  2302 
  2303 				if ( elem.nodeType === 1 && elem.className ) {
  2304 					if ( value ) {
  2305 						className = (" " + elem.className + " ").replace( rclass, " " );
  2306 						for ( c = 0, cl = classNames.length; c < cl; c++ ) {
  2307 							className = className.replace(" " + classNames[ c ] + " ", " ");
  2308 						}
  2309 						elem.className = jQuery.trim( className );
  2310 
  2311 					} else {
  2312 						elem.className = "";
  2313 					}
  2314 				}
  2315 			}
  2316 		}
  2317 
  2318 		return this;
  2319 	},
  2320 
  2321 	toggleClass: function( value, stateVal ) {
  2322 		var type = typeof value,
  2323 			isBool = typeof stateVal === "boolean";
  2324 
  2325 		if ( jQuery.isFunction( value ) ) {
  2326 			return this.each(function( i ) {
  2327 				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
  2328 			});
  2329 		}
  2330 
  2331 		return this.each(function() {
  2332 			if ( type === "string" ) {
  2333 				// toggle individual class names
  2334 				var className,
  2335 					i = 0,
  2336 					self = jQuery( this ),
  2337 					state = stateVal,
  2338 					classNames = value.split( rspace );
  2339 
  2340 				while ( (className = classNames[ i++ ]) ) {
  2341 					// check each className given, space seperated list
  2342 					state = isBool ? state : !self.hasClass( className );
  2343 					self[ state ? "addClass" : "removeClass" ]( className );
  2344 				}
  2345 
  2346 			} else if ( type === "undefined" || type === "boolean" ) {
  2347 				if ( this.className ) {
  2348 					// store className if set
  2349 					jQuery._data( this, "__className__", this.className );
  2350 				}
  2351 
  2352 				// toggle whole className
  2353 				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
  2354 			}
  2355 		});
  2356 	},
  2357 
  2358 	hasClass: function( selector ) {
  2359 		var className = " " + selector + " ",
  2360 			i = 0,
  2361 			l = this.length;
  2362 		for ( ; i < l; i++ ) {
  2363 			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
  2364 				return true;
  2365 			}
  2366 		}
  2367 
  2368 		return false;
  2369 	},
  2370 
  2371 	val: function( value ) {
  2372 		var hooks, ret, isFunction,
  2373 			elem = this[0];
  2374 
  2375 		if ( !arguments.length ) {
  2376 			if ( elem ) {
  2377 				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
  2378 
  2379 				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
  2380 					return ret;
  2381 				}
  2382 
  2383 				ret = elem.value;
  2384 
  2385 				return typeof ret === "string" ?
  2386 					// handle most common string cases
  2387 					ret.replace(rreturn, "") :
  2388 					// handle cases where value is null/undef or number
  2389 					ret == null ? "" : ret;
  2390 			}
  2391 
  2392 			return;
  2393 		}
  2394 
  2395 		isFunction = jQuery.isFunction( value );
  2396 
  2397 		return this.each(function( i ) {
  2398 			var self = jQuery(this), val;
  2399 
  2400 			if ( this.nodeType !== 1 ) {
  2401 				return;
  2402 			}
  2403 
  2404 			if ( isFunction ) {
  2405 				val = value.call( this, i, self.val() );
  2406 			} else {
  2407 				val = value;
  2408 			}
  2409 
  2410 			// Treat null/undefined as ""; convert numbers to string
  2411 			if ( val == null ) {
  2412 				val = "";
  2413 			} else if ( typeof val === "number" ) {
  2414 				val += "";
  2415 			} else if ( jQuery.isArray( val ) ) {
  2416 				val = jQuery.map(val, function ( value ) {
  2417 					return value == null ? "" : value + "";
  2418 				});
  2419 			}
  2420 
  2421 			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
  2422 
  2423 			// If set returns undefined, fall back to normal setting
  2424 			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
  2425 				this.value = val;
  2426 			}
  2427 		});
  2428 	}
  2429 });
  2430 
  2431 jQuery.extend({
  2432 	valHooks: {
  2433 		option: {
  2434 			get: function( elem ) {
  2435 				// attributes.value is undefined in Blackberry 4.7 but
  2436 				// uses .value. See #6932
  2437 				var val = elem.attributes.value;
  2438 				return !val || val.specified ? elem.value : elem.text;
  2439 			}
  2440 		},
  2441 		select: {
  2442 			get: function( elem ) {
  2443 				var value, i, max, option,
  2444 					index = elem.selectedIndex,
  2445 					values = [],
  2446 					options = elem.options,
  2447 					one = elem.type === "select-one";
  2448 
  2449 				// Nothing was selected
  2450 				if ( index < 0 ) {
  2451 					return null;
  2452 				}
  2453 
  2454 				// Loop through all the selected options
  2455 				i = one ? index : 0;
  2456 				max = one ? index + 1 : options.length;
  2457 				for ( ; i < max; i++ ) {
  2458 					option = options[ i ];
  2459 
  2460 					// Don't return options that are disabled or in a disabled optgroup
  2461 					if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
  2462 							(!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
  2463 
  2464 						// Get the specific value for the option
  2465 						value = jQuery( option ).val();
  2466 
  2467 						// We don't need an array for one selects
  2468 						if ( one ) {
  2469 							return value;
  2470 						}
  2471 
  2472 						// Multi-Selects return an array
  2473 						values.push( value );
  2474 					}
  2475 				}
  2476 
  2477 				// Fixes Bug #2551 -- select.val() broken in IE after form.reset()
  2478 				if ( one && !values.length && options.length ) {
  2479 					return jQuery( options[ index ] ).val();
  2480 				}
  2481 
  2482 				return values;
  2483 			},
  2484 
  2485 			set: function( elem, value ) {
  2486 				var values = jQuery.makeArray( value );
  2487 
  2488 				jQuery(elem).find("option").each(function() {
  2489 					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
  2490 				});
  2491 
  2492 				if ( !values.length ) {
  2493 					elem.selectedIndex = -1;
  2494 				}
  2495 				return values;
  2496 			}
  2497 		}
  2498 	},
  2499 
  2500 	attrFn: {
  2501 		val: true,
  2502 		css: true,
  2503 		html: true,
  2504 		text: true,
  2505 		data: true,
  2506 		width: true,
  2507 		height: true,
  2508 		offset: true
  2509 	},
  2510 
  2511 	attr: function( elem, name, value, pass ) {
  2512 		var ret, hooks, notxml,
  2513 			nType = elem.nodeType;
  2514 
  2515 		// don't get/set attributes on text, comment and attribute nodes
  2516 		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
  2517 			return;
  2518 		}
  2519 
  2520 		if ( pass && name in jQuery.attrFn ) {
  2521 			return jQuery( elem )[ name ]( value );
  2522 		}
  2523 
  2524 		// Fallback to prop when attributes are not supported
  2525 		if ( typeof elem.getAttribute === "undefined" ) {
  2526 			return jQuery.prop( elem, name, value );
  2527 		}
  2528 
  2529 		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
  2530 
  2531 		// All attributes are lowercase
  2532 		// Grab necessary hook if one is defined
  2533 		if ( notxml ) {
  2534 			name = name.toLowerCase();
  2535 			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
  2536 		}
  2537 
  2538 		if ( value !== undefined ) {
  2539 
  2540 			if ( value === null ) {
  2541 				jQuery.removeAttr( elem, name );
  2542 				return;
  2543 
  2544 			} else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
  2545 				return ret;
  2546 
  2547 			} else {
  2548 				elem.setAttribute( name, "" + value );
  2549 				return value;
  2550 			}
  2551 
  2552 		} else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
  2553 			return ret;
  2554 
  2555 		} else {
  2556 
  2557 			ret = elem.getAttribute( name );
  2558 
  2559 			// Non-existent attributes return null, we normalize to undefined
  2560 			return ret === null ?
  2561 				undefined :
  2562 				ret;
  2563 		}
  2564 	},
  2565 
  2566 	removeAttr: function( elem, value ) {
  2567 		var propName, attrNames, name, l, isBool,
  2568 			i = 0;
  2569 
  2570 		if ( value && elem.nodeType === 1 ) {
  2571 			attrNames = value.toLowerCase().split( rspace );
  2572 			l = attrNames.length;
  2573 
  2574 			for ( ; i < l; i++ ) {
  2575 				name = attrNames[ i ];
  2576 
  2577 				if ( name ) {
  2578 					propName = jQuery.propFix[ name ] || name;
  2579 					isBool = rboolean.test( name );
  2580 
  2581 					// See #9699 for explanation of this approach (setting first, then removal)
  2582 					// Do not do this for boolean attributes (see #10870)
  2583 					if ( !isBool ) {
  2584 						jQuery.attr( elem, name, "" );
  2585 					}
  2586 					elem.removeAttribute( getSetAttribute ? name : propName );
  2587 
  2588 					// Set corresponding property to false for boolean attributes
  2589 					if ( isBool && propName in elem ) {
  2590 						elem[ propName ] = false;
  2591 					}
  2592 				}
  2593 			}
  2594 		}
  2595 	},
  2596 
  2597 	attrHooks: {
  2598 		type: {
  2599 			set: function( elem, value ) {
  2600 				// We can't allow the type property to be changed (since it causes problems in IE)
  2601 				if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
  2602 					jQuery.error( "type property can't be changed" );
  2603 				} else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
  2604 					// Setting the type on a radio button after the value resets the value in IE6-9
  2605 					// Reset value to it's default in case type is set after value
  2606 					// This is for element creation
  2607 					var val = elem.value;
  2608 					elem.setAttribute( "type", value );
  2609 					if ( val ) {
  2610 						elem.value = val;
  2611 					}
  2612 					return value;
  2613 				}
  2614 			}
  2615 		},
  2616 		// Use the value property for back compat
  2617 		// Use the nodeHook for button elements in IE6/7 (#1954)
  2618 		value: {
  2619 			get: function( elem, name ) {
  2620 				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
  2621 					return nodeHook.get( elem, name );
  2622 				}
  2623 				return name in elem ?
  2624 					elem.value :
  2625 					null;
  2626 			},
  2627 			set: function( elem, value, name ) {
  2628 				if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
  2629 					return nodeHook.set( elem, value, name );
  2630 				}
  2631 				// Does not return so that setAttribute is also used
  2632 				elem.value = value;
  2633 			}
  2634 		}
  2635 	},
  2636 
  2637 	propFix: {
  2638 		tabindex: "tabIndex",
  2639 		readonly: "readOnly",
  2640 		"for": "htmlFor",
  2641 		"class": "className",
  2642 		maxlength: "maxLength",
  2643 		cellspacing: "cellSpacing",
  2644 		cellpadding: "cellPadding",
  2645 		rowspan: "rowSpan",
  2646 		colspan: "colSpan",
  2647 		usemap: "useMap",
  2648 		frameborder: "frameBorder",
  2649 		contenteditable: "contentEditable"
  2650 	},
  2651 
  2652 	prop: function( elem, name, value ) {
  2653 		var ret, hooks, notxml,
  2654 			nType = elem.nodeType;
  2655 
  2656 		// don't get/set properties on text, comment and attribute nodes
  2657 		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
  2658 			return;
  2659 		}
  2660 
  2661 		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
  2662 
  2663 		if ( notxml ) {
  2664 			// Fix name and attach hooks
  2665 			name = jQuery.propFix[ name ] || name;
  2666 			hooks = jQuery.propHooks[ name ];
  2667 		}
  2668 
  2669 		if ( value !== undefined ) {
  2670 			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
  2671 				return ret;
  2672 
  2673 			} else {
  2674 				return ( elem[ name ] = value );
  2675 			}
  2676 
  2677 		} else {
  2678 			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
  2679 				return ret;
  2680 
  2681 			} else {
  2682 				return elem[ name ];
  2683 			}
  2684 		}
  2685 	},
  2686 
  2687 	propHooks: {
  2688 		tabIndex: {
  2689 			get: function( elem ) {
  2690 				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
  2691 				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
  2692 				var attributeNode = elem.getAttributeNode("tabindex");
  2693 
  2694 				return attributeNode && attributeNode.specified ?
  2695 					parseInt( attributeNode.value, 10 ) :
  2696 					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
  2697 						0 :
  2698 						undefined;
  2699 			}
  2700 		}
  2701 	}
  2702 });
  2703 
  2704 // Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
  2705 jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
  2706 
  2707 // Hook for boolean attributes
  2708 boolHook = {
  2709 	get: function( elem, name ) {
  2710 		// Align boolean attributes with corresponding properties
  2711 		// Fall back to attribute presence where some booleans are not supported
  2712 		var attrNode,
  2713 			property = jQuery.prop( elem, name );
  2714 		return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
  2715 			name.toLowerCase() :
  2716 			undefined;
  2717 	},
  2718 	set: function( elem, value, name ) {
  2719 		var propName;
  2720 		if ( value === false ) {
  2721 			// Remove boolean attributes when set to false
  2722 			jQuery.removeAttr( elem, name );
  2723 		} else {
  2724 			// value is true since we know at this point it's type boolean and not false
  2725 			// Set boolean attributes to the same name and set the DOM property
  2726 			propName = jQuery.propFix[ name ] || name;
  2727 			if ( propName in elem ) {
  2728 				// Only set the IDL specifically if it already exists on the element
  2729 				elem[ propName ] = true;
  2730 			}
  2731 
  2732 			elem.setAttribute( name, name.toLowerCase() );
  2733 		}
  2734 		return name;
  2735 	}
  2736 };
  2737 
  2738 // IE6/7 do not support getting/setting some attributes with get/setAttribute
  2739 if ( !getSetAttribute ) {
  2740 
  2741 	fixSpecified = {
  2742 		name: true,
  2743 		id: true,
  2744 		coords: true
  2745 	};
  2746 
  2747 	// Use this for any attribute in IE6/7
  2748 	// This fixes almost every IE6/7 issue
  2749 	nodeHook = jQuery.valHooks.button = {
  2750 		get: function( elem, name ) {
  2751 			var ret;
  2752 			ret = elem.getAttributeNode( name );
  2753 			return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
  2754 				ret.nodeValue :
  2755 				undefined;
  2756 		},
  2757 		set: function( elem, value, name ) {
  2758 			// Set the existing or create a new attribute node
  2759 			var ret = elem.getAttributeNode( name );
  2760 			if ( !ret ) {
  2761 				ret = document.createAttribute( name );
  2762 				elem.setAttributeNode( ret );
  2763 			}
  2764 			return ( ret.nodeValue = value + "" );
  2765 		}
  2766 	};
  2767 
  2768 	// Apply the nodeHook to tabindex
  2769 	jQuery.attrHooks.tabindex.set = nodeHook.set;
  2770 
  2771 	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
  2772 	// This is for removals
  2773 	jQuery.each([ "width", "height" ], function( i, name ) {
  2774 		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
  2775 			set: function( elem, value ) {
  2776 				if ( value === "" ) {
  2777 					elem.setAttribute( name, "auto" );
  2778 					return value;
  2779 				}
  2780 			}
  2781 		});
  2782 	});
  2783 
  2784 	// Set contenteditable to false on removals(#10429)
  2785 	// Setting to empty string throws an error as an invalid value
  2786 	jQuery.attrHooks.contenteditable = {
  2787 		get: nodeHook.get,
  2788 		set: function( elem, value, name ) {
  2789 			if ( value === "" ) {
  2790 				value = "false";
  2791 			}
  2792 			nodeHook.set( elem, value, name );
  2793 		}
  2794 	};
  2795 }
  2796 
  2797 
  2798 // Some attributes require a special call on IE
  2799 if ( !jQuery.support.hrefNormalized ) {
  2800 	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
  2801 		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
  2802 			get: function( elem ) {
  2803 				var ret = elem.getAttribute( name, 2 );
  2804 				return ret === null ? undefined : ret;
  2805 			}
  2806 		});
  2807 	});
  2808 }
  2809 
  2810 if ( !jQuery.support.style ) {
  2811 	jQuery.attrHooks.style = {
  2812 		get: function( elem ) {
  2813 			// Return undefined in the case of empty string
  2814 			// Normalize to lowercase since IE uppercases css property names
  2815 			return elem.style.cssText.toLowerCase() || undefined;
  2816 		},
  2817 		set: function( elem, value ) {
  2818 			return ( elem.style.cssText = "" + value );
  2819 		}
  2820 	};
  2821 }
  2822 
  2823 // Safari mis-reports the default selected property of an option
  2824 // Accessing the parent's selectedIndex property fixes it
  2825 if ( !jQuery.support.optSelected ) {
  2826 	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
  2827 		get: function( elem ) {
  2828 			var parent = elem.parentNode;
  2829 
  2830 			if ( parent ) {
  2831 				parent.selectedIndex;
  2832 
  2833 				// Make sure that it also works with optgroups, see #5701
  2834 				if ( parent.parentNode ) {
  2835 					parent.parentNode.selectedIndex;
  2836 				}
  2837 			}
  2838 			return null;
  2839 		}
  2840 	});
  2841 }
  2842 
  2843 // IE6/7 call enctype encoding
  2844 if ( !jQuery.support.enctype ) {
  2845 	jQuery.propFix.enctype = "encoding";
  2846 }
  2847 
  2848 // Radios and checkboxes getter/setter
  2849 if ( !jQuery.support.checkOn ) {
  2850 	jQuery.each([ "radio", "checkbox" ], function() {
  2851 		jQuery.valHooks[ this ] = {
  2852 			get: function( elem ) {
  2853 				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
  2854 				return elem.getAttribute("value") === null ? "on" : elem.value;
  2855 			}
  2856 		};
  2857 	});
  2858 }
  2859 jQuery.each([ "radio", "checkbox" ], function() {
  2860 	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
  2861 		set: function( elem, value ) {
  2862 			if ( jQuery.isArray( value ) ) {
  2863 				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
  2864 			}
  2865 		}
  2866 	});
  2867 });
  2868 
  2869 
  2870 
  2871 
  2872 var rformElems = /^(?:textarea|input|select)$/i,
  2873 	rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
  2874 	rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
  2875 	rkeyEvent = /^key/,
  2876 	rmouseEvent = /^(?:mouse|contextmenu)|click/,
  2877 	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
  2878 	rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
  2879 	quickParse = function( selector ) {
  2880 		var quick = rquickIs.exec( selector );
  2881 		if ( quick ) {
  2882 			//   0  1    2   3
  2883 			// [ _, tag, id, class ]
  2884 			quick[1] = ( quick[1] || "" ).toLowerCase();
  2885 			quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
  2886 		}
  2887 		return quick;
  2888 	},
  2889 	quickIs = function( elem, m ) {
  2890 		var attrs = elem.attributes || {};
  2891 		return (
  2892 			(!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
  2893 			(!m[2] || (attrs.id || {}).value === m[2]) &&
  2894 			(!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
  2895 		);
  2896 	},
  2897 	hoverHack = function( events ) {
  2898 		return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
  2899 	};
  2900 
  2901 /*
  2902  * Helper functions for managing events -- not part of the public interface.
  2903  * Props to Dean Edwards' addEvent library for many of the ideas.
  2904  */
  2905 jQuery.event = {
  2906 
  2907 	add: function( elem, types, handler, data, selector ) {
  2908 
  2909 		var elemData, eventHandle, events,
  2910 			t, tns, type, namespaces, handleObj,
  2911 			handleObjIn, quick, handlers, special;
  2912 
  2913 		// Don't attach events to noData or text/comment nodes (allow plain objects tho)
  2914 		if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
  2915 			return;
  2916 		}
  2917 
  2918 		// Caller can pass in an object of custom data in lieu of the handler
  2919 		if ( handler.handler ) {
  2920 			handleObjIn = handler;
  2921 			handler = handleObjIn.handler;
  2922 			selector = handleObjIn.selector;
  2923 		}
  2924 
  2925 		// Make sure that the handler has a unique ID, used to find/remove it later
  2926 		if ( !handler.guid ) {
  2927 			handler.guid = jQuery.guid++;
  2928 		}
  2929 
  2930 		// Init the element's event structure and main handler, if this is the first
  2931 		events = elemData.events;
  2932 		if ( !events ) {
  2933 			elemData.events = events = {};
  2934 		}
  2935 		eventHandle = elemData.handle;
  2936 		if ( !eventHandle ) {
  2937 			elemData.handle = eventHandle = function( e ) {
  2938 				// Discard the second event of a jQuery.event.trigger() and
  2939 				// when an event is called after a page has unloaded
  2940 				return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
  2941 					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
  2942 					undefined;
  2943 			};
  2944 			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
  2945 			eventHandle.elem = elem;
  2946 		}
  2947 
  2948 		// Handle multiple events separated by a space
  2949 		// jQuery(...).bind("mouseover mouseout", fn);
  2950 		types = jQuery.trim( hoverHack(types) ).split( " " );
  2951 		for ( t = 0; t < types.length; t++ ) {
  2952 
  2953 			tns = rtypenamespace.exec( types[t] ) || [];
  2954 			type = tns[1];
  2955 			namespaces = ( tns[2] || "" ).split( "." ).sort();
  2956 
  2957 			// If event changes its type, use the special event handlers for the changed type
  2958 			special = jQuery.event.special[ type ] || {};
  2959 
  2960 			// If selector defined, determine special event api type, otherwise given type
  2961 			type = ( selector ? special.delegateType : special.bindType ) || type;
  2962 
  2963 			// Update special based on newly reset type
  2964 			special = jQuery.event.special[ type ] || {};
  2965 
  2966 			// handleObj is passed to all event handlers
  2967 			handleObj = jQuery.extend({
  2968 				type: type,
  2969 				origType: tns[1],
  2970 				data: data,
  2971 				handler: handler,
  2972 				guid: handler.guid,
  2973 				selector: selector,
  2974 				quick: selector && quickParse( selector ),
  2975 				namespace: namespaces.join(".")
  2976 			}, handleObjIn );
  2977 
  2978 			// Init the event handler queue if we're the first
  2979 			handlers = events[ type ];
  2980 			if ( !handlers ) {
  2981 				handlers = events[ type ] = [];
  2982 				handlers.delegateCount = 0;
  2983 
  2984 				// Only use addEventListener/attachEvent if the special events handler returns false
  2985 				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
  2986 					// Bind the global event handler to the element
  2987 					if ( elem.addEventListener ) {
  2988 						elem.addEventListener( type, eventHandle, false );
  2989 
  2990 					} else if ( elem.attachEvent ) {
  2991 						elem.attachEvent( "on" + type, eventHandle );
  2992 					}
  2993 				}
  2994 			}
  2995 
  2996 			if ( special.add ) {
  2997 				special.add.call( elem, handleObj );
  2998 
  2999 				if ( !handleObj.handler.guid ) {
  3000 					handleObj.handler.guid = handler.guid;
  3001 				}
  3002 			}
  3003 
  3004 			// Add to the element's handler list, delegates in front
  3005 			if ( selector ) {
  3006 				handlers.splice( handlers.delegateCount++, 0, handleObj );
  3007 			} else {
  3008 				handlers.push( handleObj );
  3009 			}
  3010 
  3011 			// Keep track of which events have ever been used, for event optimization
  3012 			jQuery.event.global[ type ] = true;
  3013 		}
  3014 
  3015 		// Nullify elem to prevent memory leaks in IE
  3016 		elem = null;
  3017 	},
  3018 
  3019 	global: {},
  3020 
  3021 	// Detach an event or set of events from an element
  3022 	remove: function( elem, types, handler, selector, mappedTypes ) {
  3023 
  3024 		var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
  3025 			t, tns, type, origType, namespaces, origCount,
  3026 			j, events, special, handle, eventType, handleObj;
  3027 
  3028 		if ( !elemData || !(events = elemData.events) ) {
  3029 			return;
  3030 		}
  3031 
  3032 		// Once for each type.namespace in types; type may be omitted
  3033 		types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
  3034 		for ( t = 0; t < types.length; t++ ) {
  3035 			tns = rtypenamespace.exec( types[t] ) || [];
  3036 			type = origType = tns[1];
  3037 			namespaces = tns[2];
  3038 
  3039 			// Unbind all events (on this namespace, if provided) for the element
  3040 			if ( !type ) {
  3041 				for ( type in events ) {
  3042 					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
  3043 				}
  3044 				continue;
  3045 			}
  3046 
  3047 			special = jQuery.event.special[ type ] || {};
  3048 			type = ( selector? special.delegateType : special.bindType ) || type;
  3049 			eventType = events[ type ] || [];
  3050 			origCount = eventType.length;
  3051 			namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
  3052 
  3053 			// Remove matching events
  3054 			for ( j = 0; j < eventType.length; j++ ) {
  3055 				handleObj = eventType[ j ];
  3056 
  3057 				if ( ( mappedTypes || origType === handleObj.origType ) &&
  3058 					 ( !handler || handler.guid === handleObj.guid ) &&
  3059 					 ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
  3060 					 ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
  3061 					eventType.splice( j--, 1 );
  3062 
  3063 					if ( handleObj.selector ) {
  3064 						eventType.delegateCount--;
  3065 					}
  3066 					if ( special.remove ) {
  3067 						special.remove.call( elem, handleObj );
  3068 					}
  3069 				}
  3070 			}
  3071 
  3072 			// Remove generic event handler if we removed something and no more handlers exist
  3073 			// (avoids potential for endless recursion during removal of special event handlers)
  3074 			if ( eventType.length === 0 && origCount !== eventType.length ) {
  3075 				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
  3076 					jQuery.removeEvent( elem, type, elemData.handle );
  3077 				}
  3078 
  3079 				delete events[ type ];
  3080 			}
  3081 		}
  3082 
  3083 		// Remove the expando if it's no longer used
  3084 		if ( jQuery.isEmptyObject( events ) ) {
  3085 			handle = elemData.handle;
  3086 			if ( handle ) {
  3087 				handle.elem = null;
  3088 			}
  3089 
  3090 			// removeData also checks for emptiness and clears the expando if empty
  3091 			// so use it instead of delete
  3092 			jQuery.removeData( elem, [ "events", "handle" ], true );
  3093 		}
  3094 	},
  3095 
  3096 	// Events that are safe to short-circuit if no handlers are attached.
  3097 	// Native DOM events should not be added, they may have inline handlers.
  3098 	customEvent: {
  3099 		"getData": true,
  3100 		"setData": true,
  3101 		"changeData": true
  3102 	},
  3103 
  3104 	trigger: function( event, data, elem, onlyHandlers ) {
  3105 		// Don't do events on text and comment nodes
  3106 		if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
  3107 			return;
  3108 		}
  3109 
  3110 		// Event object or event type
  3111 		var type = event.type || event,
  3112 			namespaces = [],
  3113 			cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
  3114 
  3115 		// focus/blur morphs to focusin/out; ensure we're not firing them right now
  3116 		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
  3117 			return;
  3118 		}
  3119 
  3120 		if ( type.indexOf( "!" ) >= 0 ) {
  3121 			// Exclusive events trigger only for the exact event (no namespaces)
  3122 			type = type.slice(0, -1);
  3123 			exclusive = true;
  3124 		}
  3125 
  3126 		if ( type.indexOf( "." ) >= 0 ) {
  3127 			// Namespaced trigger; create a regexp to match event type in handle()
  3128 			namespaces = type.split(".");
  3129 			type = namespaces.shift();
  3130 			namespaces.sort();
  3131 		}
  3132 
  3133 		if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
  3134 			// No jQuery handlers for this event type, and it can't have inline handlers
  3135 			return;
  3136 		}
  3137 
  3138 		// Caller can pass in an Event, Object, or just an event type string
  3139 		event = typeof event === "object" ?
  3140 			// jQuery.Event object
  3141 			event[ jQuery.expando ] ? event :
  3142 			// Object literal
  3143 			new jQuery.Event( type, event ) :
  3144 			// Just the event type (string)
  3145 			new jQuery.Event( type );
  3146 
  3147 		event.type = type;
  3148 		event.isTrigger = true;
  3149 		event.exclusive = exclusive;
  3150 		event.namespace = namespaces.join( "." );
  3151 		event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
  3152 		ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
  3153 
  3154 		// Handle a global trigger
  3155 		if ( !elem ) {
  3156 
  3157 			// TODO: Stop taunting the data cache; remove global events and always attach to document
  3158 			cache = jQuery.cache;
  3159 			for ( i in cache ) {
  3160 				if ( cache[ i ].events && cache[ i ].events[ type ] ) {
  3161 					jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
  3162 				}
  3163 			}
  3164 			return;
  3165 		}
  3166 
  3167 		// Clean up the event in case it is being reused
  3168 		event.result = undefined;
  3169 		if ( !event.target ) {
  3170 			event.target = elem;
  3171 		}
  3172 
  3173 		// Clone any incoming data and prepend the event, creating the handler arg list
  3174 		data = data != null ? jQuery.makeArray( data ) : [];
  3175 		data.unshift( event );
  3176 
  3177 		// Allow special events to draw outside the lines
  3178 		special = jQuery.event.special[ type ] || {};
  3179 		if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
  3180 			return;
  3181 		}
  3182 
  3183 		// Determine event propagation path in advance, per W3C events spec (#9951)
  3184 		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
  3185 		eventPath = [[ elem, special.bindType || type ]];
  3186 		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
  3187 
  3188 			bubbleType = special.delegateType || type;
  3189 			cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
  3190 			old = null;
  3191 			for ( ; cur; cur = cur.parentNode ) {
  3192 				eventPath.push([ cur, bubbleType ]);
  3193 				old = cur;
  3194 			}
  3195 
  3196 			// Only add window if we got to document (e.g., not plain obj or detached DOM)
  3197 			if ( old && old === elem.ownerDocument ) {
  3198 				eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
  3199 			}
  3200 		}
  3201 
  3202 		// Fire handlers on the event path
  3203 		for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
  3204 
  3205 			cur = eventPath[i][0];
  3206 			event.type = eventPath[i][1];
  3207 
  3208 			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
  3209 			if ( handle ) {
  3210 				handle.apply( cur, data );
  3211 			}
  3212 			// Note that this is a bare JS function and not a jQuery handler
  3213 			handle = ontype && cur[ ontype ];
  3214 			if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
  3215 				event.preventDefault();
  3216 			}
  3217 		}
  3218 		event.type = type;
  3219 
  3220 		// If nobody prevented the default action, do it now
  3221 		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
  3222 
  3223 			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
  3224 				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
  3225 
  3226 				// Call a native DOM method on the target with the same name name as the event.
  3227 				// Can't use an .isFunction() check here because IE6/7 fails that test.
  3228 				// Don't do default actions on window, that's where global variables be (#6170)
  3229 				// IE<9 dies on focus/blur to hidden element (#1486)
  3230 				if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
  3231 
  3232 					// Don't re-trigger an onFOO event when we call its FOO() method
  3233 					old = elem[ ontype ];
  3234 
  3235 					if ( old ) {
  3236 						elem[ ontype ] = null;
  3237 					}
  3238 
  3239 					// Prevent re-triggering of the same event, since we already bubbled it above
  3240 					jQuery.event.triggered = type;
  3241 					elem[ type ]();
  3242 					jQuery.event.triggered = undefined;
  3243 
  3244 					if ( old ) {
  3245 						elem[ ontype ] = old;
  3246 					}
  3247 				}
  3248 			}
  3249 		}
  3250 
  3251 		return event.result;
  3252 	},
  3253 
  3254 	dispatch: function( event ) {
  3255 
  3256 		// Make a writable jQuery.Event from the native event object
  3257 		event = jQuery.event.fix( event || window.event );
  3258 
  3259 		var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
  3260 			delegateCount = handlers.delegateCount,
  3261 			args = [].slice.call( arguments, 0 ),
  3262 			run_all = !event.exclusive && !event.namespace,
  3263 			special = jQuery.event.special[ event.type ] || {},
  3264 			handlerQueue = [],
  3265 			i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
  3266 
  3267 		// Use the fix-ed jQuery.Event rather than the (read-only) native event
  3268 		args[0] = event;
  3269 		event.delegateTarget = this;
  3270 
  3271 		// Call the preDispatch hook for the mapped type, and let it bail if desired
  3272 		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
  3273 			return;
  3274 		}
  3275 
  3276 		// Determine handlers that should run if there are delegated events
  3277 		// Avoid non-left-click bubbling in Firefox (#3861)
  3278 		if ( delegateCount && !(event.button && event.type === "click") ) {
  3279 
  3280 			// Pregenerate a single jQuery object for reuse with .is()
  3281 			jqcur = jQuery(this);
  3282 			jqcur.context = this.ownerDocument || this;
  3283 
  3284 			for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
  3285 
  3286 				// Don't process events on disabled elements (#6911, #8165)
  3287 				if ( cur.disabled !== true ) {
  3288 					selMatch = {};
  3289 					matches = [];
  3290 					jqcur[0] = cur;
  3291 					for ( i = 0; i < delegateCount; i++ ) {
  3292 						handleObj = handlers[ i ];
  3293 						sel = handleObj.selector;
  3294 
  3295 						if ( selMatch[ sel ] === undefined ) {
  3296 							selMatch[ sel ] = (
  3297 								handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
  3298 							);
  3299 						}
  3300 						if ( selMatch[ sel ] ) {
  3301 							matches.push( handleObj );
  3302 						}
  3303 					}
  3304 					if ( matches.length ) {
  3305 						handlerQueue.push({ elem: cur, matches: matches });
  3306 					}
  3307 				}
  3308 			}
  3309 		}
  3310 
  3311 		// Add the remaining (directly-bound) handlers
  3312 		if ( handlers.length > delegateCount ) {
  3313 			handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
  3314 		}
  3315 
  3316 		// Run delegates first; they may want to stop propagation beneath us
  3317 		for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
  3318 			matched = handlerQueue[ i ];
  3319 			event.currentTarget = matched.elem;
  3320 
  3321 			for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
  3322 				handleObj = matched.matches[ j ];
  3323 
  3324 				// Triggered event must either 1) be non-exclusive and have no namespace, or
  3325 				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
  3326 				if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
  3327 
  3328 					event.data = handleObj.data;
  3329 					event.handleObj = handleObj;
  3330 
  3331 					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
  3332 							.apply( matched.elem, args );
  3333 
  3334 					if ( ret !== undefined ) {
  3335 						event.result = ret;
  3336 						if ( ret === false ) {
  3337 							event.preventDefault();
  3338 							event.stopPropagation();
  3339 						}
  3340 					}
  3341 				}
  3342 			}
  3343 		}
  3344 
  3345 		// Call the postDispatch hook for the mapped type
  3346 		if ( special.postDispatch ) {
  3347 			special.postDispatch.call( this, event );
  3348 		}
  3349 
  3350 		return event.result;
  3351 	},
  3352 
  3353 	// Includes some event props shared by KeyEvent and MouseEvent
  3354 	// *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
  3355 	props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
  3356 
  3357 	fixHooks: {},
  3358 
  3359 	keyHooks: {
  3360 		props: "char charCode key keyCode".split(" "),
  3361 		filter: function( event, original ) {
  3362 
  3363 			// Add which for key events
  3364 			if ( event.which == null ) {
  3365 				event.which = original.charCode != null ? original.charCode : original.keyCode;
  3366 			}
  3367 
  3368 			return event;
  3369 		}
  3370 	},
  3371 
  3372 	mouseHooks: {
  3373 		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
  3374 		filter: function( event, original ) {
  3375 			var eventDoc, doc, body,
  3376 				button = original.button,
  3377 				fromElement = original.fromElement;
  3378 
  3379 			// Calculate pageX/Y if missing and clientX/Y available
  3380 			if ( event.pageX == null && original.clientX != null ) {
  3381 				eventDoc = event.target.ownerDocument || document;
  3382 				doc = eventDoc.documentElement;
  3383 				body = eventDoc.body;
  3384 
  3385 				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
  3386 				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
  3387 			}
  3388 
  3389 			// Add relatedTarget, if necessary
  3390 			if ( !event.relatedTarget && fromElement ) {
  3391 				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
  3392 			}
  3393 
  3394 			// Add which for click: 1 === left; 2 === middle; 3 === right
  3395 			// Note: button is not normalized, so don't use it
  3396 			if ( !event.which && button !== undefined ) {
  3397 				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
  3398 			}
  3399 
  3400 			return event;
  3401 		}
  3402 	},
  3403 
  3404 	fix: function( event ) {
  3405 		if ( event[ jQuery.expando ] ) {
  3406 			return event;
  3407 		}
  3408 
  3409 		// Create a writable copy of the event object and normalize some properties
  3410 		var i, prop,
  3411 			originalEvent = event,
  3412 			fixHook = jQuery.event.fixHooks[ event.type ] || {},
  3413 			copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
  3414 
  3415 		event = jQuery.Event( originalEvent );
  3416 
  3417 		for ( i = copy.length; i; ) {
  3418 			prop = copy[ --i ];
  3419 			event[ prop ] = originalEvent[ prop ];
  3420 		}
  3421 
  3422 		// Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
  3423 		if ( !event.target ) {
  3424 			event.target = originalEvent.srcElement || document;
  3425 		}
  3426 
  3427 		// Target should not be a text node (#504, Safari)
  3428 		if ( event.target.nodeType === 3 ) {
  3429 			event.target = event.target.parentNode;
  3430 		}
  3431 
  3432 		// For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
  3433 		if ( event.metaKey === undefined ) {
  3434 			event.metaKey = event.ctrlKey;
  3435 		}
  3436 
  3437 		return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
  3438 	},
  3439 
  3440 	special: {
  3441 		ready: {
  3442 			// Make sure the ready event is setup
  3443 			setup: jQuery.bindReady
  3444 		},
  3445 
  3446 		load: {
  3447 			// Prevent triggered image.load events from bubbling to window.load
  3448 			noBubble: true
  3449 		},
  3450 
  3451 		focus: {
  3452 			delegateType: "focusin"
  3453 		},
  3454 		blur: {
  3455 			delegateType: "focusout"
  3456 		},
  3457 
  3458 		beforeunload: {
  3459 			setup: function( data, namespaces, eventHandle ) {
  3460 				// We only want to do this special case on windows
  3461 				if ( jQuery.isWindow( this ) ) {
  3462 					this.onbeforeunload = eventHandle;
  3463 				}
  3464 			},
  3465 
  3466 			teardown: function( namespaces, eventHandle ) {
  3467 				if ( this.onbeforeunload === eventHandle ) {
  3468 					this.onbeforeunload = null;
  3469 				}
  3470 			}
  3471 		}
  3472 	},
  3473 
  3474 	simulate: function( type, elem, event, bubble ) {
  3475 		// Piggyback on a donor event to simulate a different one.
  3476 		// Fake originalEvent to avoid donor's stopPropagation, but if the
  3477 		// simulated event prevents default then we do the same on the donor.
  3478 		var e = jQuery.extend(
  3479 			new jQuery.Event(),
  3480 			event,
  3481 			{ type: type,
  3482 				isSimulated: true,
  3483 				originalEvent: {}
  3484 			}
  3485 		);
  3486 		if ( bubble ) {
  3487 			jQuery.event.trigger( e, null, elem );
  3488 		} else {
  3489 			jQuery.event.dispatch.call( elem, e );
  3490 		}
  3491 		if ( e.isDefaultPrevented() ) {
  3492 			event.preventDefault();
  3493 		}
  3494 	}
  3495 };
  3496 
  3497 // Some plugins are using, but it's undocumented/deprecated and will be removed.
  3498 // The 1.7 special event interface should provide all the hooks needed now.
  3499 jQuery.event.handle = jQuery.event.dispatch;
  3500 
  3501 jQuery.removeEvent = document.removeEventListener ?
  3502 	function( elem, type, handle ) {
  3503 		if ( elem.removeEventListener ) {
  3504 			elem.removeEventListener( type, handle, false );
  3505 		}
  3506 	} :
  3507 	function( elem, type, handle ) {
  3508 		if ( elem.detachEvent ) {
  3509 			elem.detachEvent( "on" + type, handle );
  3510 		}
  3511 	};
  3512 
  3513 jQuery.Event = function( src, props ) {
  3514 	// Allow instantiation without the 'new' keyword
  3515 	if ( !(this instanceof jQuery.Event) ) {
  3516 		return new jQuery.Event( src, props );
  3517 	}
  3518 
  3519 	// Event object
  3520 	if ( src && src.type ) {
  3521 		this.originalEvent = src;
  3522 		this.type = src.type;
  3523 
  3524 		// Events bubbling up the document may have been marked as prevented
  3525 		// by a handler lower down the tree; reflect the correct value.
  3526 		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
  3527 			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
  3528 
  3529 	// Event type
  3530 	} else {
  3531 		this.type = src;
  3532 	}
  3533 
  3534 	// Put explicitly provided properties onto the event object
  3535 	if ( props ) {
  3536 		jQuery.extend( this, props );
  3537 	}
  3538 
  3539 	// Create a timestamp if incoming event doesn't have one
  3540 	this.timeStamp = src && src.timeStamp || jQuery.now();
  3541 
  3542 	// Mark it as fixed
  3543 	this[ jQuery.expando ] = true;
  3544 };
  3545 
  3546 function returnFalse() {
  3547 	return false;
  3548 }
  3549 function returnTrue() {
  3550 	return true;
  3551 }
  3552 
  3553 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
  3554 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
  3555 jQuery.Event.prototype = {
  3556 	preventDefault: function() {
  3557 		this.isDefaultPrevented = returnTrue;
  3558 
  3559 		var e = this.originalEvent;
  3560 		if ( !e ) {
  3561 			return;
  3562 		}
  3563 
  3564 		// if preventDefault exists run it on the original event
  3565 		if ( e.preventDefault ) {
  3566 			e.preventDefault();
  3567 
  3568 		// otherwise set the returnValue property of the original event to false (IE)
  3569 		} else {
  3570 			e.returnValue = false;
  3571 		}
  3572 	},
  3573 	stopPropagation: function() {
  3574 		this.isPropagationStopped = returnTrue;
  3575 
  3576 		var e = this.originalEvent;
  3577 		if ( !e ) {
  3578 			return;
  3579 		}
  3580 		// if stopPropagation exists run it on the original event
  3581 		if ( e.stopPropagation ) {
  3582 			e.stopPropagation();
  3583 		}
  3584 		// otherwise set the cancelBubble property of the original event to true (IE)
  3585 		e.cancelBubble = true;
  3586 	},
  3587 	stopImmediatePropagation: function() {
  3588 		this.isImmediatePropagationStopped = returnTrue;
  3589 		this.stopPropagation();
  3590 	},
  3591 	isDefaultPrevented: returnFalse,
  3592 	isPropagationStopped: returnFalse,
  3593 	isImmediatePropagationStopped: returnFalse
  3594 };
  3595 
  3596 // Create mouseenter/leave events using mouseover/out and event-time checks
  3597 jQuery.each({
  3598 	mouseenter: "mouseover",
  3599 	mouseleave: "mouseout"
  3600 }, function( orig, fix ) {
  3601 	jQuery.event.special[ orig ] = {
  3602 		delegateType: fix,
  3603 		bindType: fix,
  3604 
  3605 		handle: function( event ) {
  3606 			var target = this,
  3607 				related = event.relatedTarget,
  3608 				handleObj = event.handleObj,
  3609 				selector = handleObj.selector,
  3610 				ret;
  3611 
  3612 			// For mousenter/leave call the handler if related is outside the target.
  3613 			// NB: No relatedTarget if the mouse left/entered the browser window
  3614 			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
  3615 				event.type = handleObj.origType;
  3616 				ret = handleObj.handler.apply( this, arguments );
  3617 				event.type = fix;
  3618 			}
  3619 			return ret;
  3620 		}
  3621 	};
  3622 });
  3623 
  3624 // IE submit delegation
  3625 if ( !jQuery.support.submitBubbles ) {
  3626 
  3627 	jQuery.event.special.submit = {
  3628 		setup: function() {
  3629 			// Only need this for delegated form submit events
  3630 			if ( jQuery.nodeName( this, "form" ) ) {
  3631 				return false;
  3632 			}
  3633 
  3634 			// Lazy-add a submit handler when a descendant form may potentially be submitted
  3635 			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
  3636 				// Node name check avoids a VML-related crash in IE (#9807)
  3637 				var elem = e.target,
  3638 					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
  3639 				if ( form && !form._submit_attached ) {
  3640 					jQuery.event.add( form, "submit._submit", function( event ) {
  3641 						event._submit_bubble = true;
  3642 					});
  3643 					form._submit_attached = true;
  3644 				}
  3645 			});
  3646 			// return undefined since we don't need an event listener
  3647 		},
  3648 		
  3649 		postDispatch: function( event ) {
  3650 			// If form was submitted by the user, bubble the event up the tree
  3651 			if ( event._submit_bubble ) {
  3652 				delete event._submit_bubble;
  3653 				if ( this.parentNode && !event.isTrigger ) {
  3654 					jQuery.event.simulate( "submit", this.parentNode, event, true );
  3655 				}
  3656 			}
  3657 		},
  3658 
  3659 		teardown: function() {
  3660 			// Only need this for delegated form submit events
  3661 			if ( jQuery.nodeName( this, "form" ) ) {
  3662 				return false;
  3663 			}
  3664 
  3665 			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
  3666 			jQuery.event.remove( this, "._submit" );
  3667 		}
  3668 	};
  3669 }
  3670 
  3671 // IE change delegation and checkbox/radio fix
  3672 if ( !jQuery.support.changeBubbles ) {
  3673 
  3674 	jQuery.event.special.change = {
  3675 
  3676 		setup: function() {
  3677 
  3678 			if ( rformElems.test( this.nodeName ) ) {
  3679 				// IE doesn't fire change on a check/radio until blur; trigger it on click
  3680 				// after a propertychange. Eat the blur-change in special.change.handle.
  3681 				// This still fires onchange a second time for check/radio after blur.
  3682 				if ( this.type === "checkbox" || this.type === "radio" ) {
  3683 					jQuery.event.add( this, "propertychange._change", function( event ) {
  3684 						if ( event.originalEvent.propertyName === "checked" ) {
  3685 							this._just_changed = true;
  3686 						}
  3687 					});
  3688 					jQuery.event.add( this, "click._change", function( event ) {
  3689 						if ( this._just_changed && !event.isTrigger ) {
  3690 							this._just_changed = false;
  3691 							jQuery.event.simulate( "change", this, event, true );
  3692 						}
  3693 					});
  3694 				}
  3695 				return false;
  3696 			}
  3697 			// Delegated event; lazy-add a change handler on descendant inputs
  3698 			jQuery.event.add( this, "beforeactivate._change", function( e ) {
  3699 				var elem = e.target;
  3700 
  3701 				if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
  3702 					jQuery.event.add( elem, "change._change", function( event ) {
  3703 						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
  3704 							jQuery.event.simulate( "change", this.parentNode, event, true );
  3705 						}
  3706 					});
  3707 					elem._change_attached = true;
  3708 				}
  3709 			});
  3710 		},
  3711 
  3712 		handle: function( event ) {
  3713 			var elem = event.target;
  3714 
  3715 			// Swallow native change events from checkbox/radio, we already triggered them above
  3716 			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
  3717 				return event.handleObj.handler.apply( this, arguments );
  3718 			}
  3719 		},
  3720 
  3721 		teardown: function() {
  3722 			jQuery.event.remove( this, "._change" );
  3723 
  3724 			return rformElems.test( this.nodeName );
  3725 		}
  3726 	};
  3727 }
  3728 
  3729 // Create "bubbling" focus and blur events
  3730 if ( !jQuery.support.focusinBubbles ) {
  3731 	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
  3732 
  3733 		// Attach a single capturing handler while someone wants focusin/focusout
  3734 		var attaches = 0,
  3735 			handler = function( event ) {
  3736 				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
  3737 			};
  3738 
  3739 		jQuery.event.special[ fix ] = {
  3740 			setup: function() {
  3741 				if ( attaches++ === 0 ) {
  3742 					document.addEventListener( orig, handler, true );
  3743 				}
  3744 			},
  3745 			teardown: function() {
  3746 				if ( --attaches === 0 ) {
  3747 					document.removeEventListener( orig, handler, true );
  3748 				}
  3749 			}
  3750 		};
  3751 	});
  3752 }
  3753 
  3754 jQuery.fn.extend({
  3755 
  3756 	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
  3757 		var origFn, type;
  3758 
  3759 		// Types can be a map of types/handlers
  3760 		if ( typeof types === "object" ) {
  3761 			// ( types-Object, selector, data )
  3762 			if ( typeof selector !== "string" ) { // && selector != null
  3763 				// ( types-Object, data )
  3764 				data = data || selector;
  3765 				selector = undefined;
  3766 			}
  3767 			for ( type in types ) {
  3768 				this.on( type, selector, data, types[ type ], one );
  3769 			}
  3770 			return this;
  3771 		}
  3772 
  3773 		if ( data == null && fn == null ) {
  3774 			// ( types, fn )
  3775 			fn = selector;
  3776 			data = selector = undefined;
  3777 		} else if ( fn == null ) {
  3778 			if ( typeof selector === "string" ) {
  3779 				// ( types, selector, fn )
  3780 				fn = data;
  3781 				data = undefined;
  3782 			} else {
  3783 				// ( types, data, fn )
  3784 				fn = data;
  3785 				data = selector;
  3786 				selector = undefined;
  3787 			}
  3788 		}
  3789 		if ( fn === false ) {
  3790 			fn = returnFalse;
  3791 		} else if ( !fn ) {
  3792 			return this;
  3793 		}
  3794 
  3795 		if ( one === 1 ) {
  3796 			origFn = fn;
  3797 			fn = function( event ) {
  3798 				// Can use an empty set, since event contains the info
  3799 				jQuery().off( event );
  3800 				return origFn.apply( this, arguments );
  3801 			};
  3802 			// Use same guid so caller can remove using origFn
  3803 			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
  3804 		}
  3805 		return this.each( function() {
  3806 			jQuery.event.add( this, types, fn, data, selector );
  3807 		});
  3808 	},
  3809 	one: function( types, selector, data, fn ) {
  3810 		return this.on( types, selector, data, fn, 1 );
  3811 	},
  3812 	off: function( types, selector, fn ) {
  3813 		if ( types && types.preventDefault && types.handleObj ) {
  3814 			// ( event )  dispatched jQuery.Event
  3815 			var handleObj = types.handleObj;
  3816 			jQuery( types.delegateTarget ).off(
  3817 				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
  3818 				handleObj.selector,
  3819 				handleObj.handler
  3820 			);
  3821 			return this;
  3822 		}
  3823 		if ( typeof types === "object" ) {
  3824 			// ( types-object [, selector] )
  3825 			for ( var type in types ) {
  3826 				this.off( type, selector, types[ type ] );
  3827 			}
  3828 			return this;
  3829 		}
  3830 		if ( selector === false || typeof selector === "function" ) {
  3831 			// ( types [, fn] )
  3832 			fn = selector;
  3833 			selector = undefined;
  3834 		}
  3835 		if ( fn === false ) {
  3836 			fn = returnFalse;
  3837 		}
  3838 		return this.each(function() {
  3839 			jQuery.event.remove( this, types, fn, selector );
  3840 		});
  3841 	},
  3842 
  3843 	bind: function( types, data, fn ) {
  3844 		return this.on( types, null, data, fn );
  3845 	},
  3846 	unbind: function( types, fn ) {
  3847 		return this.off( types, null, fn );
  3848 	},
  3849 
  3850 	live: function( types, data, fn ) {
  3851 		jQuery( this.context ).on( types, this.selector, data, fn );
  3852 		return this;
  3853 	},
  3854 	die: function( types, fn ) {
  3855 		jQuery( this.context ).off( types, this.selector || "**", fn );
  3856 		return this;
  3857 	},
  3858 
  3859 	delegate: function( selector, types, data, fn ) {
  3860 		return this.on( types, selector, data, fn );
  3861 	},
  3862 	undelegate: function( selector, types, fn ) {
  3863 		// ( namespace ) or ( selector, types [, fn] )
  3864 		return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
  3865 	},
  3866 
  3867 	trigger: function( type, data ) {
  3868 		return this.each(function() {
  3869 			jQuery.event.trigger( type, data, this );
  3870 		});
  3871 	},
  3872 	triggerHandler: function( type, data ) {
  3873 		if ( this[0] ) {
  3874 			return jQuery.event.trigger( type, data, this[0], true );
  3875 		}
  3876 	},
  3877 
  3878 	toggle: function( fn ) {
  3879 		// Save reference to arguments for access in closure
  3880 		var args = arguments,
  3881 			guid = fn.guid || jQuery.guid++,
  3882 			i = 0,
  3883 			toggler = function( event ) {
  3884 				// Figure out which function to execute
  3885 				var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
  3886 				jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
  3887 
  3888 				// Make sure that clicks stop
  3889 				event.preventDefault();
  3890 
  3891 				// and execute the function
  3892 				return args[ lastToggle ].apply( this, arguments ) || false;
  3893 			};
  3894 
  3895 		// link all the functions, so any of them can unbind this click handler
  3896 		toggler.guid = guid;
  3897 		while ( i < args.length ) {
  3898 			args[ i++ ].guid = guid;
  3899 		}
  3900 
  3901 		return this.click( toggler );
  3902 	},
  3903 
  3904 	hover: function( fnOver, fnOut ) {
  3905 		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
  3906 	}
  3907 });
  3908 
  3909 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
  3910 	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
  3911 	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
  3912 
  3913 	// Handle event binding
  3914 	jQuery.fn[ name ] = function( data, fn ) {
  3915 		if ( fn == null ) {
  3916 			fn = data;
  3917 			data = null;
  3918 		}
  3919 
  3920 		return arguments.length > 0 ?
  3921 			this.on( name, null, data, fn ) :
  3922 			this.trigger( name );
  3923 	};
  3924 
  3925 	if ( jQuery.attrFn ) {
  3926 		jQuery.attrFn[ name ] = true;
  3927 	}
  3928 
  3929 	if ( rkeyEvent.test( name ) ) {
  3930 		jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
  3931 	}
  3932 
  3933 	if ( rmouseEvent.test( name ) ) {
  3934 		jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
  3935 	}
  3936 });
  3937 
  3938 
  3939 
  3940 /*!
  3941  * Sizzle CSS Selector Engine
  3942  *  Copyright 2011, The Dojo Foundation
  3943  *  Released under the MIT, BSD, and GPL Licenses.
  3944  *  More information: http://sizzlejs.com/
  3945  */
  3946 (function(){
  3947 
  3948 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
  3949 	expando = "sizcache" + (Math.random() + '').replace('.', ''),
  3950 	done = 0,
  3951 	toString = Object.prototype.toString,
  3952 	hasDuplicate = false,
  3953 	baseHasDuplicate = true,
  3954 	rBackslash = /\\/g,
  3955 	rReturn = /\r\n/g,
  3956 	rNonWord = /\W/;
  3957 
  3958 // Here we check if the JavaScript engine is using some sort of
  3959 // optimization where it does not always call our comparision
  3960 // function. If that is the case, discard the hasDuplicate value.
  3961 //   Thus far that includes Google Chrome.
  3962 [0, 0].sort(function() {
  3963 	baseHasDuplicate = false;
  3964 	return 0;
  3965 });
  3966 
  3967 var Sizzle = function( selector, context, results, seed ) {
  3968 	results = results || [];
  3969 	context = context || document;
  3970 
  3971 	var origContext = context;
  3972 
  3973 	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
  3974 		return [];
  3975 	}
  3976 
  3977 	if ( !selector || typeof selector !== "string" ) {
  3978 		return results;
  3979 	}
  3980 
  3981 	var m, set, checkSet, extra, ret, cur, pop, i,
  3982 		prune = true,
  3983 		contextXML = Sizzle.isXML( context ),
  3984 		parts = [],
  3985 		soFar = selector;
  3986 
  3987 	// Reset the position of the chunker regexp (start from head)
  3988 	do {
  3989 		chunker.exec( "" );
  3990 		m = chunker.exec( soFar );
  3991 
  3992 		if ( m ) {
  3993 			soFar = m[3];
  3994 
  3995 			parts.push( m[1] );
  3996 
  3997 			if ( m[2] ) {
  3998 				extra = m[3];
  3999 				break;
  4000 			}
  4001 		}
  4002 	} while ( m );
  4003 
  4004 	if ( parts.length > 1 && origPOS.exec( selector ) ) {
  4005 
  4006 		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
  4007 			set = posProcess( parts[0] + parts[1], context, seed );
  4008 
  4009 		} else {
  4010 			set = Expr.relative[ parts[0] ] ?
  4011 				[ context ] :
  4012 				Sizzle( parts.shift(), context );
  4013 
  4014 			while ( parts.length ) {
  4015 				selector = parts.shift();
  4016 
  4017 				if ( Expr.relative[ selector ] ) {
  4018 					selector += parts.shift();
  4019 				}
  4020 
  4021 				set = posProcess( selector, set, seed );
  4022 			}
  4023 		}
  4024 
  4025 	} else {
  4026 		// Take a shortcut and set the context if the root selector is an ID
  4027 		// (but not if it'll be faster if the inner selector is an ID)
  4028 		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
  4029 				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
  4030 
  4031 			ret = Sizzle.find( parts.shift(), context, contextXML );
  4032 			context = ret.expr ?
  4033 				Sizzle.filter( ret.expr, ret.set )[0] :
  4034 				ret.set[0];
  4035 		}
  4036 
  4037 		if ( context ) {
  4038 			ret = seed ?
  4039 				{ expr: parts.pop(), set: makeArray(seed) } :
  4040 				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
  4041 
  4042 			set = ret.expr ?
  4043 				Sizzle.filter( ret.expr, ret.set ) :
  4044 				ret.set;
  4045 
  4046 			if ( parts.length > 0 ) {
  4047 				checkSet = makeArray( set );
  4048 
  4049 			} else {
  4050 				prune = false;
  4051 			}
  4052 
  4053 			while ( parts.length ) {
  4054 				cur = parts.pop();
  4055 				pop = cur;
  4056 
  4057 				if ( !Expr.relative[ cur ] ) {
  4058 					cur = "";
  4059 				} else {
  4060 					pop = parts.pop();
  4061 				}
  4062 
  4063 				if ( pop == null ) {
  4064 					pop = context;
  4065 				}
  4066 
  4067 				Expr.relative[ cur ]( checkSet, pop, contextXML );
  4068 			}
  4069 
  4070 		} else {
  4071 			checkSet = parts = [];
  4072 		}
  4073 	}
  4074 
  4075 	if ( !checkSet ) {
  4076 		checkSet = set;
  4077 	}
  4078 
  4079 	if ( !checkSet ) {
  4080 		Sizzle.error( cur || selector );
  4081 	}
  4082 
  4083 	if ( toString.call(checkSet) === "[object Array]" ) {
  4084 		if ( !prune ) {
  4085 			results.push.apply( results, checkSet );
  4086 
  4087 		} else if ( context && context.nodeType === 1 ) {
  4088 			for ( i = 0; checkSet[i] != null; i++ ) {
  4089 				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
  4090 					results.push( set[i] );
  4091 				}
  4092 			}
  4093 
  4094 		} else {
  4095 			for ( i = 0; checkSet[i] != null; i++ ) {
  4096 				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
  4097 					results.push( set[i] );
  4098 				}
  4099 			}
  4100 		}
  4101 
  4102 	} else {
  4103 		makeArray( checkSet, results );
  4104 	}
  4105 
  4106 	if ( extra ) {
  4107 		Sizzle( extra, origContext, results, seed );
  4108 		Sizzle.uniqueSort( results );
  4109 	}
  4110 
  4111 	return results;
  4112 };
  4113 
  4114 Sizzle.uniqueSort = function( results ) {
  4115 	if ( sortOrder ) {
  4116 		hasDuplicate = baseHasDuplicate;
  4117 		results.sort( sortOrder );
  4118 
  4119 		if ( hasDuplicate ) {
  4120 			for ( var i = 1; i < results.length; i++ ) {
  4121 				if ( results[i] === results[ i - 1 ] ) {
  4122 					results.splice( i--, 1 );
  4123 				}
  4124 			}
  4125 		}
  4126 	}
  4127 
  4128 	return results;
  4129 };
  4130 
  4131 Sizzle.matches = function( expr, set ) {
  4132 	return Sizzle( expr, null, null, set );
  4133 };
  4134 
  4135 Sizzle.matchesSelector = function( node, expr ) {
  4136 	return Sizzle( expr, null, null, [node] ).length > 0;
  4137 };
  4138 
  4139 Sizzle.find = function( expr, context, isXML ) {
  4140 	var set, i, len, match, type, left;
  4141 
  4142 	if ( !expr ) {
  4143 		return [];
  4144 	}
  4145 
  4146 	for ( i = 0, len = Expr.order.length; i < len; i++ ) {
  4147 		type = Expr.order[i];
  4148 
  4149 		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
  4150 			left = match[1];
  4151 			match.splice( 1, 1 );
  4152 
  4153 			if ( left.substr( left.length - 1 ) !== "\\" ) {
  4154 				match[1] = (match[1] || "").replace( rBackslash, "" );
  4155 				set = Expr.find[ type ]( match, context, isXML );
  4156 
  4157 				if ( set != null ) {
  4158 					expr = expr.replace( Expr.match[ type ], "" );
  4159 					break;
  4160 				}
  4161 			}
  4162 		}
  4163 	}
  4164 
  4165 	if ( !set ) {
  4166 		set = typeof context.getElementsByTagName !== "undefined" ?
  4167 			context.getElementsByTagName( "*" ) :
  4168 			[];
  4169 	}
  4170 
  4171 	return { set: set, expr: expr };
  4172 };
  4173 
  4174 Sizzle.filter = function( expr, set, inplace, not ) {
  4175 	var match, anyFound,
  4176 		type, found, item, filter, left,
  4177 		i, pass,
  4178 		old = expr,
  4179 		result = [],
  4180 		curLoop = set,
  4181 		isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
  4182 
  4183 	while ( expr && set.length ) {
  4184 		for ( type in Expr.filter ) {
  4185 			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
  4186 				filter = Expr.filter[ type ];
  4187 				left = match[1];
  4188 
  4189 				anyFound = false;
  4190 
  4191 				match.splice(1,1);
  4192 
  4193 				if ( left.substr( left.length - 1 ) === "\\" ) {
  4194 					continue;
  4195 				}
  4196 
  4197 				if ( curLoop === result ) {
  4198 					result = [];
  4199 				}
  4200 
  4201 				if ( Expr.preFilter[ type ] ) {
  4202 					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
  4203 
  4204 					if ( !match ) {
  4205 						anyFound = found = true;
  4206 
  4207 					} else if ( match === true ) {
  4208 						continue;
  4209 					}
  4210 				}
  4211 
  4212 				if ( match ) {
  4213 					for ( i = 0; (item = curLoop[i]) != null; i++ ) {
  4214 						if ( item ) {
  4215 							found = filter( item, match, i, curLoop );
  4216 							pass = not ^ found;
  4217 
  4218 							if ( inplace && found != null ) {
  4219 								if ( pass ) {
  4220 									anyFound = true;
  4221 
  4222 								} else {
  4223 									curLoop[i] = false;
  4224 								}
  4225 
  4226 							} else if ( pass ) {
  4227 								result.push( item );
  4228 								anyFound = true;
  4229 							}
  4230 						}
  4231 					}
  4232 				}
  4233 
  4234 				if ( found !== undefined ) {
  4235 					if ( !inplace ) {
  4236 						curLoop = result;
  4237 					}
  4238 
  4239 					expr = expr.replace( Expr.match[ type ], "" );
  4240 
  4241 					if ( !anyFound ) {
  4242 						return [];
  4243 					}
  4244 
  4245 					break;
  4246 				}
  4247 			}
  4248 		}
  4249 
  4250 		// Improper expression
  4251 		if ( expr === old ) {
  4252 			if ( anyFound == null ) {
  4253 				Sizzle.error( expr );
  4254 
  4255 			} else {
  4256 				break;
  4257 			}
  4258 		}
  4259 
  4260 		old = expr;
  4261 	}
  4262 
  4263 	return curLoop;
  4264 };
  4265 
  4266 Sizzle.error = function( msg ) {
  4267 	throw new Error( "Syntax error, unrecognized expression: " + msg );
  4268 };
  4269 
  4270 /**
  4271  * Utility function for retreiving the text value of an array of DOM nodes
  4272  * @param {Array|Element} elem
  4273  */
  4274 var getText = Sizzle.getText = function( elem ) {
  4275     var i, node,
  4276 		nodeType = elem.nodeType,
  4277 		ret = "";
  4278 
  4279 	if ( nodeType ) {
  4280 		if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
  4281 			// Use textContent || innerText for elements
  4282 			if ( typeof elem.textContent === 'string' ) {
  4283 				return elem.textContent;
  4284 			} else if ( typeof elem.innerText === 'string' ) {
  4285 				// Replace IE's carriage returns
  4286 				return elem.innerText.replace( rReturn, '' );
  4287 			} else {
  4288 				// Traverse it's children
  4289 				for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
  4290 					ret += getText( elem );
  4291 				}
  4292 			}
  4293 		} else if ( nodeType === 3 || nodeType === 4 ) {
  4294 			return elem.nodeValue;
  4295 		}
  4296 	} else {
  4297 
  4298 		// If no nodeType, this is expected to be an array
  4299 		for ( i = 0; (node = elem[i]); i++ ) {
  4300 			// Do not traverse comment nodes
  4301 			if ( node.nodeType !== 8 ) {
  4302 				ret += getText( node );
  4303 			}
  4304 		}
  4305 	}
  4306 	return ret;
  4307 };
  4308 
  4309 var Expr = Sizzle.selectors = {
  4310 	order: [ "ID", "NAME", "TAG" ],
  4311 
  4312 	match: {
  4313 		ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
  4314 		CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
  4315 		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
  4316 		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
  4317 		TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
  4318 		CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
  4319 		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
  4320 		PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
  4321 	},
  4322 
  4323 	leftMatch: {},
  4324 
  4325 	attrMap: {
  4326 		"class": "className",
  4327 		"for": "htmlFor"
  4328 	},
  4329 
  4330 	attrHandle: {
  4331 		href: function( elem ) {
  4332 			return elem.getAttribute( "href" );
  4333 		},
  4334 		type: function( elem ) {
  4335 			return elem.getAttribute( "type" );
  4336 		}
  4337 	},
  4338 
  4339 	relative: {
  4340 		"+": function(checkSet, part){
  4341 			var isPartStr = typeof part === "string",
  4342 				isTag = isPartStr && !rNonWord.test( part ),
  4343 				isPartStrNotTag = isPartStr && !isTag;
  4344 
  4345 			if ( isTag ) {
  4346 				part = part.toLowerCase();
  4347 			}
  4348 
  4349 			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
  4350 				if ( (elem = checkSet[i]) ) {
  4351 					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
  4352 
  4353 					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
  4354 						elem || false :
  4355 						elem === part;
  4356 				}
  4357 			}
  4358 
  4359 			if ( isPartStrNotTag ) {
  4360 				Sizzle.filter( part, checkSet, true );
  4361 			}
  4362 		},
  4363 
  4364 		">": function( checkSet, part ) {
  4365 			var elem,
  4366 				isPartStr = typeof part === "string",
  4367 				i = 0,
  4368 				l = checkSet.length;
  4369 
  4370 			if ( isPartStr && !rNonWord.test( part ) ) {
  4371 				part = part.toLowerCase();
  4372 
  4373 				for ( ; i < l; i++ ) {
  4374 					elem = checkSet[i];
  4375 
  4376 					if ( elem ) {
  4377 						var parent = elem.parentNode;
  4378 						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
  4379 					}
  4380 				}
  4381 
  4382 			} else {
  4383 				for ( ; i < l; i++ ) {
  4384 					elem = checkSet[i];
  4385 
  4386 					if ( elem ) {
  4387 						checkSet[i] = isPartStr ?
  4388 							elem.parentNode :
  4389 							elem.parentNode === part;
  4390 					}
  4391 				}
  4392 
  4393 				if ( isPartStr ) {
  4394 					Sizzle.filter( part, checkSet, true );
  4395 				}
  4396 			}
  4397 		},
  4398 
  4399 		"": function(checkSet, part, isXML){
  4400 			var nodeCheck,
  4401 				doneName = done++,
  4402 				checkFn = dirCheck;
  4403 
  4404 			if ( typeof part === "string" && !rNonWord.test( part ) ) {
  4405 				part = part.toLowerCase();
  4406 				nodeCheck = part;
  4407 				checkFn = dirNodeCheck;
  4408 			}
  4409 
  4410 			checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
  4411 		},
  4412 
  4413 		"~": function( checkSet, part, isXML ) {
  4414 			var nodeCheck,
  4415 				doneName = done++,
  4416 				checkFn = dirCheck;
  4417 
  4418 			if ( typeof part === "string" && !rNonWord.test( part ) ) {
  4419 				part = part.toLowerCase();
  4420 				nodeCheck = part;
  4421 				checkFn = dirNodeCheck;
  4422 			}
  4423 
  4424 			checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
  4425 		}
  4426 	},
  4427 
  4428 	find: {
  4429 		ID: function( match, context, isXML ) {
  4430 			if ( typeof context.getElementById !== "undefined" && !isXML ) {
  4431 				var m = context.getElementById(match[1]);
  4432 				// Check parentNode to catch when Blackberry 4.6 returns
  4433 				// nodes that are no longer in the document #6963
  4434 				return m && m.parentNode ? [m] : [];
  4435 			}
  4436 		},
  4437 
  4438 		NAME: function( match, context ) {
  4439 			if ( typeof context.getElementsByName !== "undefined" ) {
  4440 				var ret = [],
  4441 					results = context.getElementsByName( match[1] );
  4442 
  4443 				for ( var i = 0, l = results.length; i < l; i++ ) {
  4444 					if ( results[i].getAttribute("name") === match[1] ) {
  4445 						ret.push( results[i] );
  4446 					}
  4447 				}
  4448 
  4449 				return ret.length === 0 ? null : ret;
  4450 			}
  4451 		},
  4452 
  4453 		TAG: function( match, context ) {
  4454 			if ( typeof context.getElementsByTagName !== "undefined" ) {
  4455 				return context.getElementsByTagName( match[1] );
  4456 			}
  4457 		}
  4458 	},
  4459 	preFilter: {
  4460 		CLASS: function( match, curLoop, inplace, result, not, isXML ) {
  4461 			match = " " + match[1].replace( rBackslash, "" ) + " ";
  4462 
  4463 			if ( isXML ) {
  4464 				return match;
  4465 			}
  4466 
  4467 			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
  4468 				if ( elem ) {
  4469 					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
  4470 						if ( !inplace ) {
  4471 							result.push( elem );
  4472 						}
  4473 
  4474 					} else if ( inplace ) {
  4475 						curLoop[i] = false;
  4476 					}
  4477 				}
  4478 			}
  4479 
  4480 			return false;
  4481 		},
  4482 
  4483 		ID: function( match ) {
  4484 			return match[1].replace( rBackslash, "" );
  4485 		},
  4486 
  4487 		TAG: function( match, curLoop ) {
  4488 			return match[1].replace( rBackslash, "" ).toLowerCase();
  4489 		},
  4490 
  4491 		CHILD: function( match ) {
  4492 			if ( match[1] === "nth" ) {
  4493 				if ( !match[2] ) {
  4494 					Sizzle.error( match[0] );
  4495 				}
  4496 
  4497 				match[2] = match[2].replace(/^\+|\s*/g, '');
  4498 
  4499 				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
  4500 				var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
  4501 					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
  4502 					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
  4503 
  4504 				// calculate the numbers (first)n+(last) including if they are negative
  4505 				match[2] = (test[1] + (test[2] || 1)) - 0;
  4506 				match[3] = test[3] - 0;
  4507 			}
  4508 			else if ( match[2] ) {
  4509 				Sizzle.error( match[0] );
  4510 			}
  4511 
  4512 			// TODO: Move to normal caching system
  4513 			match[0] = done++;
  4514 
  4515 			return match;
  4516 		},
  4517 
  4518 		ATTR: function( match, curLoop, inplace, result, not, isXML ) {
  4519 			var name = match[1] = match[1].replace( rBackslash, "" );
  4520 
  4521 			if ( !isXML && Expr.attrMap[name] ) {
  4522 				match[1] = Expr.attrMap[name];
  4523 			}
  4524 
  4525 			// Handle if an un-quoted value was used
  4526 			match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
  4527 
  4528 			if ( match[2] === "~=" ) {
  4529 				match[4] = " " + match[4] + " ";
  4530 			}
  4531 
  4532 			return match;
  4533 		},
  4534 
  4535 		PSEUDO: function( match, curLoop, inplace, result, not ) {
  4536 			if ( match[1] === "not" ) {
  4537 				// If we're dealing with a complex expression, or a simple one
  4538 				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
  4539 					match[3] = Sizzle(match[3], null, null, curLoop);
  4540 
  4541 				} else {
  4542 					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
  4543 
  4544 					if ( !inplace ) {
  4545 						result.push.apply( result, ret );
  4546 					}
  4547 
  4548 					return false;
  4549 				}
  4550 
  4551 			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
  4552 				return true;
  4553 			}
  4554 
  4555 			return match;
  4556 		},
  4557 
  4558 		POS: function( match ) {
  4559 			match.unshift( true );
  4560 
  4561 			return match;
  4562 		}
  4563 	},
  4564 
  4565 	filters: {
  4566 		enabled: function( elem ) {
  4567 			return elem.disabled === false && elem.type !== "hidden";
  4568 		},
  4569 
  4570 		disabled: function( elem ) {
  4571 			return elem.disabled === true;
  4572 		},
  4573 
  4574 		checked: function( elem ) {
  4575 			return elem.checked === true;
  4576 		},
  4577 
  4578 		selected: function( elem ) {
  4579 			// Accessing this property makes selected-by-default
  4580 			// options in Safari work properly
  4581 			if ( elem.parentNode ) {
  4582 				elem.parentNode.selectedIndex;
  4583 			}
  4584 
  4585 			return elem.selected === true;
  4586 		},
  4587 
  4588 		parent: function( elem ) {
  4589 			return !!elem.firstChild;
  4590 		},
  4591 
  4592 		empty: function( elem ) {
  4593 			return !elem.firstChild;
  4594 		},
  4595 
  4596 		has: function( elem, i, match ) {
  4597 			return !!Sizzle( match[3], elem ).length;
  4598 		},
  4599 
  4600 		header: function( elem ) {
  4601 			return (/h\d/i).test( elem.nodeName );
  4602 		},
  4603 
  4604 		text: function( elem ) {
  4605 			var attr = elem.getAttribute( "type" ), type = elem.type;
  4606 			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
  4607 			// use getAttribute instead to test this case
  4608 			return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
  4609 		},
  4610 
  4611 		radio: function( elem ) {
  4612 			return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
  4613 		},
  4614 
  4615 		checkbox: function( elem ) {
  4616 			return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
  4617 		},
  4618 
  4619 		file: function( elem ) {
  4620 			return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
  4621 		},
  4622 
  4623 		password: function( elem ) {
  4624 			return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
  4625 		},
  4626 
  4627 		submit: function( elem ) {
  4628 			var name = elem.nodeName.toLowerCase();
  4629 			return (name === "input" || name === "button") && "submit" === elem.type;
  4630 		},
  4631 
  4632 		image: function( elem ) {
  4633 			return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
  4634 		},
  4635 
  4636 		reset: function( elem ) {
  4637 			var name = elem.nodeName.toLowerCase();
  4638 			return (name === "input" || name === "button") && "reset" === elem.type;
  4639 		},
  4640 
  4641 		button: function( elem ) {
  4642 			var name = elem.nodeName.toLowerCase();
  4643 			return name === "input" && "button" === elem.type || name === "button";
  4644 		},
  4645 
  4646 		input: function( elem ) {
  4647 			return (/input|select|textarea|button/i).test( elem.nodeName );
  4648 		},
  4649 
  4650 		focus: function( elem ) {
  4651 			return elem === elem.ownerDocument.activeElement;
  4652 		}
  4653 	},
  4654 	setFilters: {
  4655 		first: function( elem, i ) {
  4656 			return i === 0;
  4657 		},
  4658 
  4659 		last: function( elem, i, match, array ) {
  4660 			return i === array.length - 1;
  4661 		},
  4662 
  4663 		even: function( elem, i ) {
  4664 			return i % 2 === 0;
  4665 		},
  4666 
  4667 		odd: function( elem, i ) {
  4668 			return i % 2 === 1;
  4669 		},
  4670 
  4671 		lt: function( elem, i, match ) {
  4672 			return i < match[3] - 0;
  4673 		},
  4674 
  4675 		gt: function( elem, i, match ) {
  4676 			return i > match[3] - 0;
  4677 		},
  4678 
  4679 		nth: function( elem, i, match ) {
  4680 			return match[3] - 0 === i;
  4681 		},
  4682 
  4683 		eq: function( elem, i, match ) {
  4684 			return match[3] - 0 === i;
  4685 		}
  4686 	},
  4687 	filter: {
  4688 		PSEUDO: function( elem, match, i, array ) {
  4689 			var name = match[1],
  4690 				filter = Expr.filters[ name ];
  4691 
  4692 			if ( filter ) {
  4693 				return filter( elem, i, match, array );
  4694 
  4695 			} else if ( name === "contains" ) {
  4696 				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
  4697 
  4698 			} else if ( name === "not" ) {
  4699 				var not = match[3];
  4700 
  4701 				for ( var j = 0, l = not.length; j < l; j++ ) {
  4702 					if ( not[j] === elem ) {
  4703 						return false;
  4704 					}
  4705 				}
  4706 
  4707 				return true;
  4708 
  4709 			} else {
  4710 				Sizzle.error( name );
  4711 			}
  4712 		},
  4713 
  4714 		CHILD: function( elem, match ) {
  4715 			var first, last,
  4716 				doneName, parent, cache,
  4717 				count, diff,
  4718 				type = match[1],
  4719 				node = elem;
  4720 
  4721 			switch ( type ) {
  4722 				case "only":
  4723 				case "first":
  4724 					while ( (node = node.previousSibling) ) {
  4725 						if ( node.nodeType === 1 ) {
  4726 							return false;
  4727 						}
  4728 					}
  4729 
  4730 					if ( type === "first" ) {
  4731 						return true;
  4732 					}
  4733 
  4734 					node = elem;
  4735 
  4736 					/* falls through */
  4737 				case "last":
  4738 					while ( (node = node.nextSibling) ) {
  4739 						if ( node.nodeType === 1 ) {
  4740 							return false;
  4741 						}
  4742 					}
  4743 
  4744 					return true;
  4745 
  4746 				case "nth":
  4747 					first = match[2];
  4748 					last = match[3];
  4749 
  4750 					if ( first === 1 && last === 0 ) {
  4751 						return true;
  4752 					}
  4753 
  4754 					doneName = match[0];
  4755 					parent = elem.parentNode;
  4756 
  4757 					if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
  4758 						count = 0;
  4759 
  4760 						for ( node = parent.firstChild; node; node = node.nextSibling ) {
  4761 							if ( node.nodeType === 1 ) {
  4762 								node.nodeIndex = ++count;
  4763 							}
  4764 						}
  4765 
  4766 						parent[ expando ] = doneName;
  4767 					}
  4768 
  4769 					diff = elem.nodeIndex - last;
  4770 
  4771 					if ( first === 0 ) {
  4772 						return diff === 0;
  4773 
  4774 					} else {
  4775 						return ( diff % first === 0 && diff / first >= 0 );
  4776 					}
  4777 			}
  4778 		},
  4779 
  4780 		ID: function( elem, match ) {
  4781 			return elem.nodeType === 1 && elem.getAttribute("id") === match;
  4782 		},
  4783 
  4784 		TAG: function( elem, match ) {
  4785 			return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
  4786 		},
  4787 
  4788 		CLASS: function( elem, match ) {
  4789 			return (" " + (elem.className || elem.getAttribute("class")) + " ")
  4790 				.indexOf( match ) > -1;
  4791 		},
  4792 
  4793 		ATTR: function( elem, match ) {
  4794 			var name = match[1],
  4795 				result = Sizzle.attr ?
  4796 					Sizzle.attr( elem, name ) :
  4797 					Expr.attrHandle[ name ] ?
  4798 					Expr.attrHandle[ name ]( elem ) :
  4799 					elem[ name ] != null ?
  4800 						elem[ name ] :
  4801 						elem.getAttribute( name ),
  4802 				value = result + "",
  4803 				type = match[2],
  4804 				check = match[4];
  4805 
  4806 			return result == null ?
  4807 				type === "!=" :
  4808 				!type && Sizzle.attr ?
  4809 				result != null :
  4810 				type === "=" ?
  4811 				value === check :
  4812 				type === "*=" ?
  4813 				value.indexOf(check) >= 0 :
  4814 				type === "~=" ?
  4815 				(" " + value + " ").indexOf(check) >= 0 :
  4816 				!check ?
  4817 				value && result !== false :
  4818 				type === "!=" ?
  4819 				value !== check :
  4820 				type === "^=" ?
  4821 				value.indexOf(check) === 0 :
  4822 				type === "$=" ?
  4823 				value.substr(value.length - check.length) === check :
  4824 				type === "|=" ?
  4825 				value === check || value.substr(0, check.length + 1) === check + "-" :
  4826 				false;
  4827 		},
  4828 
  4829 		POS: function( elem, match, i, array ) {
  4830 			var name = match[2],
  4831 				filter = Expr.setFilters[ name ];
  4832 
  4833 			if ( filter ) {
  4834 				return filter( elem, i, match, array );
  4835 			}
  4836 		}
  4837 	}
  4838 };
  4839 
  4840 var origPOS = Expr.match.POS,
  4841 	fescape = function(all, num){
  4842 		return "\\" + (num - 0 + 1);
  4843 	};
  4844 
  4845 for ( var type in Expr.match ) {
  4846 	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
  4847 	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
  4848 }
  4849 // Expose origPOS
  4850 // "global" as in regardless of relation to brackets/parens
  4851 Expr.match.globalPOS = origPOS;
  4852 
  4853 var makeArray = function( array, results ) {
  4854 	array = Array.prototype.slice.call( array, 0 );
  4855 
  4856 	if ( results ) {
  4857 		results.push.apply( results, array );
  4858 		return results;
  4859 	}
  4860 
  4861 	return array;
  4862 };
  4863 
  4864 // Perform a simple check to determine if the browser is capable of
  4865 // converting a NodeList to an array using builtin methods.
  4866 // Also verifies that the returned array holds DOM nodes
  4867 // (which is not the case in the Blackberry browser)
  4868 try {
  4869 	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
  4870 
  4871 // Provide a fallback method if it does not work
  4872 } catch( e ) {
  4873 	makeArray = function( array, results ) {
  4874 		var i = 0,
  4875 			ret = results || [];
  4876 
  4877 		if ( toString.call(array) === "[object Array]" ) {
  4878 			Array.prototype.push.apply( ret, array );
  4879 
  4880 		} else {
  4881 			if ( typeof array.length === "number" ) {
  4882 				for ( var l = array.length; i < l; i++ ) {
  4883 					ret.push( array[i] );
  4884 				}
  4885 
  4886 			} else {
  4887 				for ( ; array[i]; i++ ) {
  4888 					ret.push( array[i] );
  4889 				}
  4890 			}
  4891 		}
  4892 
  4893 		return ret;
  4894 	};
  4895 }
  4896 
  4897 var sortOrder, siblingCheck;
  4898 
  4899 if ( document.documentElement.compareDocumentPosition ) {
  4900 	sortOrder = function( a, b ) {
  4901 		if ( a === b ) {
  4902 			hasDuplicate = true;
  4903 			return 0;
  4904 		}
  4905 
  4906 		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
  4907 			return a.compareDocumentPosition ? -1 : 1;
  4908 		}
  4909 
  4910 		return a.compareDocumentPosition(b) & 4 ? -1 : 1;
  4911 	};
  4912 
  4913 } else {
  4914 	sortOrder = function( a, b ) {
  4915 		// The nodes are identical, we can exit early
  4916 		if ( a === b ) {
  4917 			hasDuplicate = true;
  4918 			return 0;
  4919 
  4920 		// Fallback to using sourceIndex (in IE) if it's available on both nodes
  4921 		} else if ( a.sourceIndex && b.sourceIndex ) {
  4922 			return a.sourceIndex - b.sourceIndex;
  4923 		}
  4924 
  4925 		var al, bl,
  4926 			ap = [],
  4927 			bp = [],
  4928 			aup = a.parentNode,
  4929 			bup = b.parentNode,
  4930 			cur = aup;
  4931 
  4932 		// If the nodes are siblings (or identical) we can do a quick check
  4933 		if ( aup === bup ) {
  4934 			return siblingCheck( a, b );
  4935 
  4936 		// If no parents were found then the nodes are disconnected
  4937 		} else if ( !aup ) {
  4938 			return -1;
  4939 
  4940 		} else if ( !bup ) {
  4941 			return 1;
  4942 		}
  4943 
  4944 		// Otherwise they're somewhere else in the tree so we need
  4945 		// to build up a full list of the parentNodes for comparison
  4946 		while ( cur ) {
  4947 			ap.unshift( cur );
  4948 			cur = cur.parentNode;
  4949 		}
  4950 
  4951 		cur = bup;
  4952 
  4953 		while ( cur ) {
  4954 			bp.unshift( cur );
  4955 			cur = cur.parentNode;
  4956 		}
  4957 
  4958 		al = ap.length;
  4959 		bl = bp.length;
  4960 
  4961 		// Start walking down the tree looking for a discrepancy
  4962 		for ( var i = 0; i < al && i < bl; i++ ) {
  4963 			if ( ap[i] !== bp[i] ) {
  4964 				return siblingCheck( ap[i], bp[i] );
  4965 			}
  4966 		}
  4967 
  4968 		// We ended someplace up the tree so do a sibling check
  4969 		return i === al ?
  4970 			siblingCheck( a, bp[i], -1 ) :
  4971 			siblingCheck( ap[i], b, 1 );
  4972 	};
  4973 
  4974 	siblingCheck = function( a, b, ret ) {
  4975 		if ( a === b ) {
  4976 			return ret;
  4977 		}
  4978 
  4979 		var cur = a.nextSibling;
  4980 
  4981 		while ( cur ) {
  4982 			if ( cur === b ) {
  4983 				return -1;
  4984 			}
  4985 
  4986 			cur = cur.nextSibling;
  4987 		}
  4988 
  4989 		return 1;
  4990 	};
  4991 }
  4992 
  4993 // Check to see if the browser returns elements by name when
  4994 // querying by getElementById (and provide a workaround)
  4995 (function(){
  4996 	// We're going to inject a fake input element with a specified name
  4997 	var form = document.createElement("div"),
  4998 		id = "script" + (new Date()).getTime(),
  4999 		root = document.documentElement;
  5000 
  5001 	form.innerHTML = "<a name='" + id + "'/>";
  5002 
  5003 	// Inject it into the root element, check its status, and remove it quickly
  5004 	root.insertBefore( form, root.firstChild );
  5005 
  5006 	// The workaround has to do additional checks after a getElementById
  5007 	// Which slows things down for other browsers (hence the branching)
  5008 	if ( document.getElementById( id ) ) {
  5009 		Expr.find.ID = function( match, context, isXML ) {
  5010 			if ( typeof context.getElementById !== "undefined" && !isXML ) {
  5011 				var m = context.getElementById(match[1]);
  5012 
  5013 				return m ?
  5014 					m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
  5015 						[m] :
  5016 						undefined :
  5017 					[];
  5018 			}
  5019 		};
  5020 
  5021 		Expr.filter.ID = function( elem, match ) {
  5022 			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
  5023 
  5024 			return elem.nodeType === 1 && node && node.nodeValue === match;
  5025 		};
  5026 	}
  5027 
  5028 	root.removeChild( form );
  5029 
  5030 	// release memory in IE
  5031 	root = form = null;
  5032 })();
  5033 
  5034 (function(){
  5035 	// Check to see if the browser returns only elements
  5036 	// when doing getElementsByTagName("*")
  5037 
  5038 	// Create a fake element
  5039 	var div = document.createElement("div");
  5040 	div.appendChild( document.createComment("") );
  5041 
  5042 	// Make sure no comments are found
  5043 	if ( div.getElementsByTagName("*").length > 0 ) {
  5044 		Expr.find.TAG = function( match, context ) {
  5045 			var results = context.getElementsByTagName( match[1] );
  5046 
  5047 			// Filter out possible comments
  5048 			if ( match[1] === "*" ) {
  5049 				var tmp = [];
  5050 
  5051 				for ( var i = 0; results[i]; i++ ) {
  5052 					if ( results[i].nodeType === 1 ) {
  5053 						tmp.push( results[i] );
  5054 					}
  5055 				}
  5056 
  5057 				results = tmp;
  5058 			}
  5059 
  5060 			return results;
  5061 		};
  5062 	}
  5063 
  5064 	// Check to see if an attribute returns normalized href attributes
  5065 	div.innerHTML = "<a href='#'></a>";
  5066 
  5067 	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
  5068 			div.firstChild.getAttribute("href") !== "#" ) {
  5069 
  5070 		Expr.attrHandle.href = function( elem ) {
  5071 			return elem.getAttribute( "href", 2 );
  5072 		};
  5073 	}
  5074 
  5075 	// release memory in IE
  5076 	div = null;
  5077 })();
  5078 
  5079 if ( document.querySelectorAll ) {
  5080 	(function(){
  5081 		var oldSizzle = Sizzle,
  5082 			div = document.createElement("div"),
  5083 			id = "__sizzle__";
  5084 
  5085 		div.innerHTML = "<p class='TEST'></p>";
  5086 
  5087 		// Safari can't handle uppercase or unicode characters when
  5088 		// in quirks mode.
  5089 		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
  5090 			return;
  5091 		}
  5092 
  5093 		Sizzle = function( query, context, extra, seed ) {
  5094 			context = context || document;
  5095 
  5096 			// Only use querySelectorAll on non-XML documents
  5097 			// (ID selectors don't work in non-HTML documents)
  5098 			if ( !seed && !Sizzle.isXML(context) ) {
  5099 				// See if we find a selector to speed up
  5100 				var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
  5101 
  5102 				if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
  5103 					// Speed-up: Sizzle("TAG")
  5104 					if ( match[1] ) {
  5105 						return makeArray( context.getElementsByTagName( query ), extra );
  5106 
  5107 					// Speed-up: Sizzle(".CLASS")
  5108 					} else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
  5109 						return makeArray( context.getElementsByClassName( match[2] ), extra );
  5110 					}
  5111 				}
  5112 
  5113 				if ( context.nodeType === 9 ) {
  5114 					// Speed-up: Sizzle("body")
  5115 					// The body element only exists once, optimize finding it
  5116 					if ( query === "body" && context.body ) {
  5117 						return makeArray( [ context.body ], extra );
  5118 
  5119 					// Speed-up: Sizzle("#ID")
  5120 					} else if ( match && match[3] ) {
  5121 						var elem = context.getElementById( match[3] );
  5122 
  5123 						// Check parentNode to catch when Blackberry 4.6 returns
  5124 						// nodes that are no longer in the document #6963
  5125 						if ( elem && elem.parentNode ) {
  5126 							// Handle the case where IE and Opera return items
  5127 							// by name instead of ID
  5128 							if ( elem.id === match[3] ) {
  5129 								return makeArray( [ elem ], extra );
  5130 							}
  5131 
  5132 						} else {
  5133 							return makeArray( [], extra );
  5134 						}
  5135 					}
  5136 
  5137 					try {
  5138 						return makeArray( context.querySelectorAll(query), extra );
  5139 					} catch(qsaError) {}
  5140 
  5141 				// qSA works strangely on Element-rooted queries
  5142 				// We can work around this by specifying an extra ID on the root
  5143 				// and working up from there (Thanks to Andrew Dupont for the technique)
  5144 				// IE 8 doesn't work on object elements
  5145 				} else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
  5146 					var oldContext = context,
  5147 						old = context.getAttribute( "id" ),
  5148 						nid = old || id,
  5149 						hasParent = context.parentNode,
  5150 						relativeHierarchySelector = /^\s*[+~]/.test( query );
  5151 
  5152 					if ( !old ) {
  5153 						context.setAttribute( "id", nid );
  5154 					} else {
  5155 						nid = nid.replace( /'/g, "\\$&" );
  5156 					}
  5157 					if ( relativeHierarchySelector && hasParent ) {
  5158 						context = context.parentNode;
  5159 					}
  5160 
  5161 					try {
  5162 						if ( !relativeHierarchySelector || hasParent ) {
  5163 							return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
  5164 						}
  5165 
  5166 					} catch(pseudoError) {
  5167 					} finally {
  5168 						if ( !old ) {
  5169 							oldContext.removeAttribute( "id" );
  5170 						}
  5171 					}
  5172 				}
  5173 			}
  5174 
  5175 			return oldSizzle(query, context, extra, seed);
  5176 		};
  5177 
  5178 		for ( var prop in oldSizzle ) {
  5179 			Sizzle[ prop ] = oldSizzle[ prop ];
  5180 		}
  5181 
  5182 		// release memory in IE
  5183 		div = null;
  5184 	})();
  5185 }
  5186 
  5187 (function(){
  5188 	var html = document.documentElement,
  5189 		matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
  5190 
  5191 	if ( matches ) {
  5192 		// Check to see if it's possible to do matchesSelector
  5193 		// on a disconnected node (IE 9 fails this)
  5194 		var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
  5195 			pseudoWorks = false;
  5196 
  5197 		try {
  5198 			// This should fail with an exception
  5199 			// Gecko does not error, returns false instead
  5200 			matches.call( document.documentElement, "[test!='']:sizzle" );
  5201 
  5202 		} catch( pseudoError ) {
  5203 			pseudoWorks = true;
  5204 		}
  5205 
  5206 		Sizzle.matchesSelector = function( node, expr ) {
  5207 			// Make sure that attribute selectors are quoted
  5208 			expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
  5209 
  5210 			if ( !Sizzle.isXML( node ) ) {
  5211 				try {
  5212 					if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
  5213 						var ret = matches.call( node, expr );
  5214 
  5215 						// IE 9's matchesSelector returns false on disconnected nodes
  5216 						if ( ret || !disconnectedMatch ||
  5217 								// As well, disconnected nodes are said to be in a document
  5218 								// fragment in IE 9, so check for that
  5219 								node.document && node.document.nodeType !== 11 ) {
  5220 							return ret;
  5221 						}
  5222 					}
  5223 				} catch(e) {}
  5224 			}
  5225 
  5226 			return Sizzle(expr, null, null, [node]).length > 0;
  5227 		};
  5228 	}
  5229 })();
  5230 
  5231 (function(){
  5232 	var div = document.createElement("div");
  5233 
  5234 	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
  5235 
  5236 	// Opera can't find a second classname (in 9.6)
  5237 	// Also, make sure that getElementsByClassName actually exists
  5238 	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
  5239 		return;
  5240 	}
  5241 
  5242 	// Safari caches class attributes, doesn't catch changes (in 3.2)
  5243 	div.lastChild.className = "e";
  5244 
  5245 	if ( div.getElementsByClassName("e").length === 1 ) {
  5246 		return;
  5247 	}
  5248 
  5249 	Expr.order.splice(1, 0, "CLASS");
  5250 	Expr.find.CLASS = function( match, context, isXML ) {
  5251 		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
  5252 			return context.getElementsByClassName(match[1]);
  5253 		}
  5254 	};
  5255 
  5256 	// release memory in IE
  5257 	div = null;
  5258 })();
  5259 
  5260 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  5261 	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  5262 		var elem = checkSet[i];
  5263 
  5264 		if ( elem ) {
  5265 			var match = false;
  5266 
  5267 			elem = elem[dir];
  5268 
  5269 			while ( elem ) {
  5270 				if ( elem[ expando ] === doneName ) {
  5271 					match = checkSet[elem.sizset];
  5272 					break;
  5273 				}
  5274 
  5275 				if ( elem.nodeType === 1 && !isXML ){
  5276 					elem[ expando ] = doneName;
  5277 					elem.sizset = i;
  5278 				}
  5279 
  5280 				if ( elem.nodeName.toLowerCase() === cur ) {
  5281 					match = elem;
  5282 					break;
  5283 				}
  5284 
  5285 				elem = elem[dir];
  5286 			}
  5287 
  5288 			checkSet[i] = match;
  5289 		}
  5290 	}
  5291 }
  5292 
  5293 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
  5294 	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
  5295 		var elem = checkSet[i];
  5296 
  5297 		if ( elem ) {
  5298 			var match = false;
  5299 
  5300 			elem = elem[dir];
  5301 
  5302 			while ( elem ) {
  5303 				if ( elem[ expando ] === doneName ) {
  5304 					match = checkSet[elem.sizset];
  5305 					break;
  5306 				}
  5307 
  5308 				if ( elem.nodeType === 1 ) {
  5309 					if ( !isXML ) {
  5310 						elem[ expando ] = doneName;
  5311 						elem.sizset = i;
  5312 					}
  5313 
  5314 					if ( typeof cur !== "string" ) {
  5315 						if ( elem === cur ) {
  5316 							match = true;
  5317 							break;
  5318 						}
  5319 
  5320 					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
  5321 						match = elem;
  5322 						break;
  5323 					}
  5324 				}
  5325 
  5326 				elem = elem[dir];
  5327 			}
  5328 
  5329 			checkSet[i] = match;
  5330 		}
  5331 	}
  5332 }
  5333 
  5334 if ( document.documentElement.contains ) {
  5335 	Sizzle.contains = function( a, b ) {
  5336 		return a !== b && (a.contains ? a.contains(b) : true);
  5337 	};
  5338 
  5339 } else if ( document.documentElement.compareDocumentPosition ) {
  5340 	Sizzle.contains = function( a, b ) {
  5341 		return !!(a.compareDocumentPosition(b) & 16);
  5342 	};
  5343 
  5344 } else {
  5345 	Sizzle.contains = function() {
  5346 		return false;
  5347 	};
  5348 }
  5349 
  5350 Sizzle.isXML = function( elem ) {
  5351 	// documentElement is verified for cases where it doesn't yet exist
  5352 	// (such as loading iframes in IE - #4833)
  5353 	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
  5354 
  5355 	return documentElement ? documentElement.nodeName !== "HTML" : false;
  5356 };
  5357 
  5358 var posProcess = function( selector, context, seed ) {
  5359 	var match,
  5360 		tmpSet = [],
  5361 		later = "",
  5362 		root = context.nodeType ? [context] : context;
  5363 
  5364 	// Position selectors must be done after the filter
  5365 	// And so must :not(positional) so we move all PSEUDOs to the end
  5366 	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
  5367 		later += match[0];
  5368 		selector = selector.replace( Expr.match.PSEUDO, "" );
  5369 	}
  5370 
  5371 	selector = Expr.relative[selector] ? selector + "*" : selector;
  5372 
  5373 	for ( var i = 0, l = root.length; i < l; i++ ) {
  5374 		Sizzle( selector, root[i], tmpSet, seed );
  5375 	}
  5376 
  5377 	return Sizzle.filter( later, tmpSet );
  5378 };
  5379 
  5380 // EXPOSE
  5381 // Override sizzle attribute retrieval
  5382 Sizzle.attr = jQuery.attr;
  5383 Sizzle.selectors.attrMap = {};
  5384 jQuery.find = Sizzle;
  5385 jQuery.expr = Sizzle.selectors;
  5386 jQuery.expr[":"] = jQuery.expr.filters;
  5387 jQuery.unique = Sizzle.uniqueSort;
  5388 jQuery.text = Sizzle.getText;
  5389 jQuery.isXMLDoc = Sizzle.isXML;
  5390 jQuery.contains = Sizzle.contains;
  5391 
  5392 
  5393 })();
  5394 
  5395 
  5396 var runtil = /Until$/,
  5397 	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
  5398 	// Note: This RegExp should be improved, or likely pulled from Sizzle
  5399 	rmultiselector = /,/,
  5400 	isSimple = /^.[^:#\[\.,]*$/,
  5401 	slice = Array.prototype.slice,
  5402 	POS = jQuery.expr.match.globalPOS,
  5403 	// methods guaranteed to produce a unique set when starting from a unique set
  5404 	guaranteedUnique = {
  5405 		children: true,
  5406 		contents: true,
  5407 		next: true,
  5408 		prev: true
  5409 	};
  5410 
  5411 jQuery.fn.extend({
  5412 	find: function( selector ) {
  5413 		var self = this,
  5414 			i, l;
  5415 
  5416 		if ( typeof selector !== "string" ) {
  5417 			return jQuery( selector ).filter(function() {
  5418 				for ( i = 0, l = self.length; i < l; i++ ) {
  5419 					if ( jQuery.contains( self[ i ], this ) ) {
  5420 						return true;
  5421 					}
  5422 				}
  5423 			});
  5424 		}
  5425 
  5426 		var ret = this.pushStack( "", "find", selector ),
  5427 			length, n, r;
  5428 
  5429 		for ( i = 0, l = this.length; i < l; i++ ) {
  5430 			length = ret.length;
  5431 			jQuery.find( selector, this[i], ret );
  5432 
  5433 			if ( i > 0 ) {
  5434 				// Make sure that the results are unique
  5435 				for ( n = length; n < ret.length; n++ ) {
  5436 					for ( r = 0; r < length; r++ ) {
  5437 						if ( ret[r] === ret[n] ) {
  5438 							ret.splice(n--, 1);
  5439 							break;
  5440 						}
  5441 					}
  5442 				}
  5443 			}
  5444 		}
  5445 
  5446 		return ret;
  5447 	},
  5448 
  5449 	has: function( target ) {
  5450 		var targets = jQuery( target );
  5451 		return this.filter(function() {
  5452 			for ( var i = 0, l = targets.length; i < l; i++ ) {
  5453 				if ( jQuery.contains( this, targets[i] ) ) {
  5454 					return true;
  5455 				}
  5456 			}
  5457 		});
  5458 	},
  5459 
  5460 	not: function( selector ) {
  5461 		return this.pushStack( winnow(this, selector, false), "not", selector);
  5462 	},
  5463 
  5464 	filter: function( selector ) {
  5465 		return this.pushStack( winnow(this, selector, true), "filter", selector );
  5466 	},
  5467 
  5468 	is: function( selector ) {
  5469 		return !!selector && (
  5470 			typeof selector === "string" ?
  5471 				// If this is a positional selector, check membership in the returned set
  5472 				// so $("p:first").is("p:last") won't return true for a doc with two "p".
  5473 				POS.test( selector ) ?
  5474 					jQuery( selector, this.context ).index( this[0] ) >= 0 :
  5475 					jQuery.filter( selector, this ).length > 0 :
  5476 				this.filter( selector ).length > 0 );
  5477 	},
  5478 
  5479 	closest: function( selectors, context ) {
  5480 		var ret = [], i, l, cur = this[0];
  5481 
  5482 		// Array (deprecated as of jQuery 1.7)
  5483 		if ( jQuery.isArray( selectors ) ) {
  5484 			var level = 1;
  5485 
  5486 			while ( cur && cur.ownerDocument && cur !== context ) {
  5487 				for ( i = 0; i < selectors.length; i++ ) {
  5488 
  5489 					if ( jQuery( cur ).is( selectors[ i ] ) ) {
  5490 						ret.push({ selector: selectors[ i ], elem: cur, level: level });
  5491 					}
  5492 				}
  5493 
  5494 				cur = cur.parentNode;
  5495 				level++;
  5496 			}
  5497 
  5498 			return ret;
  5499 		}
  5500 
  5501 		// String
  5502 		var pos = POS.test( selectors ) || typeof selectors !== "string" ?
  5503 				jQuery( selectors, context || this.context ) :
  5504 				0;
  5505 
  5506 		for ( i = 0, l = this.length; i < l; i++ ) {
  5507 			cur = this[i];
  5508 
  5509 			while ( cur ) {
  5510 				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
  5511 					ret.push( cur );
  5512 					break;
  5513 
  5514 				} else {
  5515 					cur = cur.parentNode;
  5516 					if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
  5517 						break;
  5518 					}
  5519 				}
  5520 			}
  5521 		}
  5522 
  5523 		ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
  5524 
  5525 		return this.pushStack( ret, "closest", selectors );
  5526 	},
  5527 
  5528 	// Determine the position of an element within
  5529 	// the matched set of elements
  5530 	index: function( elem ) {
  5531 
  5532 		// No argument, return index in parent
  5533 		if ( !elem ) {
  5534 			return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
  5535 		}
  5536 
  5537 		// index in selector
  5538 		if ( typeof elem === "string" ) {
  5539 			return jQuery.inArray( this[0], jQuery( elem ) );
  5540 		}
  5541 
  5542 		// Locate the position of the desired element
  5543 		return jQuery.inArray(
  5544 			// If it receives a jQuery object, the first element is used
  5545 			elem.jquery ? elem[0] : elem, this );
  5546 	},
  5547 
  5548 	add: function( selector, context ) {
  5549 		var set = typeof selector === "string" ?
  5550 				jQuery( selector, context ) :
  5551 				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
  5552 			all = jQuery.merge( this.get(), set );
  5553 
  5554 		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
  5555 			all :
  5556 			jQuery.unique( all ) );
  5557 	},
  5558 
  5559 	andSelf: function() {
  5560 		return this.add( this.prevObject );
  5561 	}
  5562 });
  5563 
  5564 // A painfully simple check to see if an element is disconnected
  5565 // from a document (should be improved, where feasible).
  5566 function isDisconnected( node ) {
  5567 	return !node || !node.parentNode || node.parentNode.nodeType === 11;
  5568 }
  5569 
  5570 jQuery.each({
  5571 	parent: function( elem ) {
  5572 		var parent = elem.parentNode;
  5573 		return parent && parent.nodeType !== 11 ? parent : null;
  5574 	},
  5575 	parents: function( elem ) {
  5576 		return jQuery.dir( elem, "parentNode" );
  5577 	},
  5578 	parentsUntil: function( elem, i, until ) {
  5579 		return jQuery.dir( elem, "parentNode", until );
  5580 	},
  5581 	next: function( elem ) {
  5582 		return jQuery.nth( elem, 2, "nextSibling" );
  5583 	},
  5584 	prev: function( elem ) {
  5585 		return jQuery.nth( elem, 2, "previousSibling" );
  5586 	},
  5587 	nextAll: function( elem ) {
  5588 		return jQuery.dir( elem, "nextSibling" );
  5589 	},
  5590 	prevAll: function( elem ) {
  5591 		return jQuery.dir( elem, "previousSibling" );
  5592 	},
  5593 	nextUntil: function( elem, i, until ) {
  5594 		return jQuery.dir( elem, "nextSibling", until );
  5595 	},
  5596 	prevUntil: function( elem, i, until ) {
  5597 		return jQuery.dir( elem, "previousSibling", until );
  5598 	},
  5599 	siblings: function( elem ) {
  5600 		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
  5601 	},
  5602 	children: function( elem ) {
  5603 		return jQuery.sibling( elem.firstChild );
  5604 	},
  5605 	contents: function( elem ) {
  5606 		return jQuery.nodeName( elem, "iframe" ) ?
  5607 			elem.contentDocument || elem.contentWindow.document :
  5608 			jQuery.makeArray( elem.childNodes );
  5609 	}
  5610 }, function( name, fn ) {
  5611 	jQuery.fn[ name ] = function( until, selector ) {
  5612 		var ret = jQuery.map( this, fn, until );
  5613 
  5614 		if ( !runtil.test( name ) ) {
  5615 			selector = until;
  5616 		}
  5617 
  5618 		if ( selector && typeof selector === "string" ) {
  5619 			ret = jQuery.filter( selector, ret );
  5620 		}
  5621 
  5622 		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
  5623 
  5624 		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
  5625 			ret = ret.reverse();
  5626 		}
  5627 
  5628 		return this.pushStack( ret, name, slice.call( arguments ).join(",") );
  5629 	};
  5630 });
  5631 
  5632 jQuery.extend({
  5633 	filter: function( expr, elems, not ) {
  5634 		if ( not ) {
  5635 			expr = ":not(" + expr + ")";
  5636 		}
  5637 
  5638 		return elems.length === 1 ?
  5639 			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
  5640 			jQuery.find.matches(expr, elems);
  5641 	},
  5642 
  5643 	dir: function( elem, dir, until ) {
  5644 		var matched = [],
  5645 			cur = elem[ dir ];
  5646 
  5647 		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
  5648 			if ( cur.nodeType === 1 ) {
  5649 				matched.push( cur );
  5650 			}
  5651 			cur = cur[dir];
  5652 		}
  5653 		return matched;
  5654 	},
  5655 
  5656 	nth: function( cur, result, dir, elem ) {
  5657 		result = result || 1;
  5658 		var num = 0;
  5659 
  5660 		for ( ; cur; cur = cur[dir] ) {
  5661 			if ( cur.nodeType === 1 && ++num === result ) {
  5662 				break;
  5663 			}
  5664 		}
  5665 
  5666 		return cur;
  5667 	},
  5668 
  5669 	sibling: function( n, elem ) {
  5670 		var r = [];
  5671 
  5672 		for ( ; n; n = n.nextSibling ) {
  5673 			if ( n.nodeType === 1 && n !== elem ) {
  5674 				r.push( n );
  5675 			}
  5676 		}
  5677 
  5678 		return r;
  5679 	}
  5680 });
  5681 
  5682 // Implement the identical functionality for filter and not
  5683 function winnow( elements, qualifier, keep ) {
  5684 
  5685 	// Can't pass null or undefined to indexOf in Firefox 4
  5686 	// Set to 0 to skip string check
  5687 	qualifier = qualifier || 0;
  5688 
  5689 	if ( jQuery.isFunction( qualifier ) ) {
  5690 		return jQuery.grep(elements, function( elem, i ) {
  5691 			var retVal = !!qualifier.call( elem, i, elem );
  5692 			return retVal === keep;
  5693 		});
  5694 
  5695 	} else if ( qualifier.nodeType ) {
  5696 		return jQuery.grep(elements, function( elem, i ) {
  5697 			return ( elem === qualifier ) === keep;
  5698 		});
  5699 
  5700 	} else if ( typeof qualifier === "string" ) {
  5701 		var filtered = jQuery.grep(elements, function( elem ) {
  5702 			return elem.nodeType === 1;
  5703 		});
  5704 
  5705 		if ( isSimple.test( qualifier ) ) {
  5706 			return jQuery.filter(qualifier, filtered, !keep);
  5707 		} else {
  5708 			qualifier = jQuery.filter( qualifier, filtered );
  5709 		}
  5710 	}
  5711 
  5712 	return jQuery.grep(elements, function( elem, i ) {
  5713 		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
  5714 	});
  5715 }
  5716 
  5717 
  5718 
  5719 
  5720 function createSafeFragment( document ) {
  5721 	var list = nodeNames.split( "|" ),
  5722 	safeFrag = document.createDocumentFragment();
  5723 
  5724 	if ( safeFrag.createElement ) {
  5725 		while ( list.length ) {
  5726 			safeFrag.createElement(
  5727 				list.pop()
  5728 			);
  5729 		}
  5730 	}
  5731 	return safeFrag;
  5732 }
  5733 
  5734 var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
  5735 		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
  5736 	rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
  5737 	rleadingWhitespace = /^\s+/,
  5738 	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
  5739 	rtagName = /<([\w:]+)/,
  5740 	rtbody = /<tbody/i,
  5741 	rhtml = /<|&#?\w+;/,
  5742 	rnoInnerhtml = /<(?:script|style)/i,
  5743 	rnocache = /<(?:script|object|embed|option|style)/i,
  5744 	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
  5745 	// checked="checked" or checked
  5746 	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
  5747 	rscriptType = /\/(java|ecma)script/i,
  5748 	rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
  5749 	wrapMap = {
  5750 		option: [ 1, "<select multiple='multiple'>", "</select>" ],
  5751 		legend: [ 1, "<fieldset>", "</fieldset>" ],
  5752 		thead: [ 1, "<table>", "</table>" ],
  5753 		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
  5754 		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
  5755 		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
  5756 		area: [ 1, "<map>", "</map>" ],
  5757 		_default: [ 0, "", "" ]
  5758 	},
  5759 	safeFragment = createSafeFragment( document );
  5760 
  5761 wrapMap.optgroup = wrapMap.option;
  5762 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
  5763 wrapMap.th = wrapMap.td;
  5764 
  5765 // IE can't serialize <link> and <script> tags normally
  5766 if ( !jQuery.support.htmlSerialize ) {
  5767 	wrapMap._default = [ 1, "div<div>", "</div>" ];
  5768 }
  5769 
  5770 jQuery.fn.extend({
  5771 	text: function( value ) {
  5772 		return jQuery.access( this, function( value ) {
  5773 			return value === undefined ?
  5774 				jQuery.text( this ) :
  5775 				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
  5776 		}, null, value, arguments.length );
  5777 	},
  5778 
  5779 	wrapAll: function( html ) {
  5780 		if ( jQuery.isFunction( html ) ) {
  5781 			return this.each(function(i) {
  5782 				jQuery(this).wrapAll( html.call(this, i) );
  5783 			});
  5784 		}
  5785 
  5786 		if ( this[0] ) {
  5787 			// The elements to wrap the target around
  5788 			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
  5789 
  5790 			if ( this[0].parentNode ) {
  5791 				wrap.insertBefore( this[0] );
  5792 			}
  5793 
  5794 			wrap.map(function() {
  5795 				var elem = this;
  5796 
  5797 				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
  5798 					elem = elem.firstChild;
  5799 				}
  5800 
  5801 				return elem;
  5802 			}).append( this );
  5803 		}
  5804 
  5805 		return this;
  5806 	},
  5807 
  5808 	wrapInner: function( html ) {
  5809 		if ( jQuery.isFunction( html ) ) {
  5810 			return this.each(function(i) {
  5811 				jQuery(this).wrapInner( html.call(this, i) );
  5812 			});
  5813 		}
  5814 
  5815 		return this.each(function() {
  5816 			var self = jQuery( this ),
  5817 				contents = self.contents();
  5818 
  5819 			if ( contents.length ) {
  5820 				contents.wrapAll( html );
  5821 
  5822 			} else {
  5823 				self.append( html );
  5824 			}
  5825 		});
  5826 	},
  5827 
  5828 	wrap: function( html ) {
  5829 		var isFunction = jQuery.isFunction( html );
  5830 
  5831 		return this.each(function(i) {
  5832 			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
  5833 		});
  5834 	},
  5835 
  5836 	unwrap: function() {
  5837 		return this.parent().each(function() {
  5838 			if ( !jQuery.nodeName( this, "body" ) ) {
  5839 				jQuery( this ).replaceWith( this.childNodes );
  5840 			}
  5841 		}).end();
  5842 	},
  5843 
  5844 	append: function() {
  5845 		return this.domManip(arguments, true, function( elem ) {
  5846 			if ( this.nodeType === 1 ) {
  5847 				this.appendChild( elem );
  5848 			}
  5849 		});
  5850 	},
  5851 
  5852 	prepend: function() {
  5853 		return this.domManip(arguments, true, function( elem ) {
  5854 			if ( this.nodeType === 1 ) {
  5855 				this.insertBefore( elem, this.firstChild );
  5856 			}
  5857 		});
  5858 	},
  5859 
  5860 	before: function() {
  5861 		if ( this[0] && this[0].parentNode ) {
  5862 			return this.domManip(arguments, false, function( elem ) {
  5863 				this.parentNode.insertBefore( elem, this );
  5864 			});
  5865 		} else if ( arguments.length ) {
  5866 			var set = jQuery.clean( arguments );
  5867 			set.push.apply( set, this.toArray() );
  5868 			return this.pushStack( set, "before", arguments );
  5869 		}
  5870 	},
  5871 
  5872 	after: function() {
  5873 		if ( this[0] && this[0].parentNode ) {
  5874 			return this.domManip(arguments, false, function( elem ) {
  5875 				this.parentNode.insertBefore( elem, this.nextSibling );
  5876 			});
  5877 		} else if ( arguments.length ) {
  5878 			var set = this.pushStack( this, "after", arguments );
  5879 			set.push.apply( set, jQuery.clean(arguments) );
  5880 			return set;
  5881 		}
  5882 	},
  5883 
  5884 	// keepData is for internal use only--do not document
  5885 	remove: function( selector, keepData ) {
  5886 		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
  5887 			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
  5888 				if ( !keepData && elem.nodeType === 1 ) {
  5889 					jQuery.cleanData( elem.getElementsByTagName("*") );
  5890 					jQuery.cleanData( [ elem ] );
  5891 				}
  5892 
  5893 				if ( elem.parentNode ) {
  5894 					elem.parentNode.removeChild( elem );
  5895 				}
  5896 			}
  5897 		}
  5898 
  5899 		return this;
  5900 	},
  5901 
  5902 	empty: function() {
  5903 		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
  5904 			// Remove element nodes and prevent memory leaks
  5905 			if ( elem.nodeType === 1 ) {
  5906 				jQuery.cleanData( elem.getElementsByTagName("*") );
  5907 			}
  5908 
  5909 			// Remove any remaining nodes
  5910 			while ( elem.firstChild ) {
  5911 				elem.removeChild( elem.firstChild );
  5912 			}
  5913 		}
  5914 
  5915 		return this;
  5916 	},
  5917 
  5918 	clone: function( dataAndEvents, deepDataAndEvents ) {
  5919 		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
  5920 		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
  5921 
  5922 		return this.map( function () {
  5923 			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
  5924 		});
  5925 	},
  5926 
  5927 	html: function( value ) {
  5928 		return jQuery.access( this, function( value ) {
  5929 			var elem = this[0] || {},
  5930 				i = 0,
  5931 				l = this.length;
  5932 
  5933 			if ( value === undefined ) {
  5934 				return elem.nodeType === 1 ?
  5935 					elem.innerHTML.replace( rinlinejQuery, "" ) :
  5936 					null;
  5937 			}
  5938 
  5939 
  5940 			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
  5941 				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
  5942 				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
  5943 
  5944 				value = value.replace( rxhtmlTag, "<$1></$2>" );
  5945 
  5946 				try {
  5947 					for (; i < l; i++ ) {
  5948 						// Remove element nodes and prevent memory leaks
  5949 						elem = this[i] || {};
  5950 						if ( elem.nodeType === 1 ) {
  5951 							jQuery.cleanData( elem.getElementsByTagName( "*" ) );
  5952 							elem.innerHTML = value;
  5953 						}
  5954 					}
  5955 
  5956 					elem = 0;
  5957 
  5958 				// If using innerHTML throws an exception, use the fallback method
  5959 				} catch(e) {}
  5960 			}
  5961 
  5962 			if ( elem ) {
  5963 				this.empty().append( value );
  5964 			}
  5965 		}, null, value, arguments.length );
  5966 	},
  5967 
  5968 	replaceWith: function( value ) {
  5969 		if ( this[0] && this[0].parentNode ) {
  5970 			// Make sure that the elements are removed from the DOM before they are inserted
  5971 			// this can help fix replacing a parent with child elements
  5972 			if ( jQuery.isFunction( value ) ) {
  5973 				return this.each(function(i) {
  5974 					var self = jQuery(this), old = self.html();
  5975 					self.replaceWith( value.call( this, i, old ) );
  5976 				});
  5977 			}
  5978 
  5979 			if ( typeof value !== "string" ) {
  5980 				value = jQuery( value ).detach();
  5981 			}
  5982 
  5983 			return this.each(function() {
  5984 				var next = this.nextSibling,
  5985 					parent = this.parentNode;
  5986 
  5987 				jQuery( this ).remove();
  5988 
  5989 				if ( next ) {
  5990 					jQuery(next).before( value );
  5991 				} else {
  5992 					jQuery(parent).append( value );
  5993 				}
  5994 			});
  5995 		} else {
  5996 			return this.length ?
  5997 				this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
  5998 				this;
  5999 		}
  6000 	},
  6001 
  6002 	detach: function( selector ) {
  6003 		return this.remove( selector, true );
  6004 	},
  6005 
  6006 	domManip: function( args, table, callback ) {
  6007 		var results, first, fragment, parent,
  6008 			value = args[0],
  6009 			scripts = [];
  6010 
  6011 		// We can't cloneNode fragments that contain checked, in WebKit
  6012 		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
  6013 			return this.each(function() {
  6014 				jQuery(this).domManip( args, table, callback, true );
  6015 			});
  6016 		}
  6017 
  6018 		if ( jQuery.isFunction(value) ) {
  6019 			return this.each(function(i) {
  6020 				var self = jQuery(this);
  6021 				args[0] = value.call(this, i, table ? self.html() : undefined);
  6022 				self.domManip( args, table, callback );
  6023 			});
  6024 		}
  6025 
  6026 		if ( this[0] ) {
  6027 			parent = value && value.parentNode;
  6028 
  6029 			// If we're in a fragment, just use that instead of building a new one
  6030 			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
  6031 				results = { fragment: parent };
  6032 
  6033 			} else {
  6034 				results = jQuery.buildFragment( args, this, scripts );
  6035 			}
  6036 
  6037 			fragment = results.fragment;
  6038 
  6039 			if ( fragment.childNodes.length === 1 ) {
  6040 				first = fragment = fragment.firstChild;
  6041 			} else {
  6042 				first = fragment.firstChild;
  6043 			}
  6044 
  6045 			if ( first ) {
  6046 				table = table && jQuery.nodeName( first, "tr" );
  6047 
  6048 				for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
  6049 					callback.call(
  6050 						table ?
  6051 							root(this[i], first) :
  6052 							this[i],
  6053 						// Make sure that we do not leak memory by inadvertently discarding
  6054 						// the original fragment (which might have attached data) instead of
  6055 						// using it; in addition, use the original fragment object for the last
  6056 						// item instead of first because it can end up being emptied incorrectly
  6057 						// in certain situations (Bug #8070).
  6058 						// Fragments from the fragment cache must always be cloned and never used
  6059 						// in place.
  6060 						results.cacheable || ( l > 1 && i < lastIndex ) ?
  6061 							jQuery.clone( fragment, true, true ) :
  6062 							fragment
  6063 					);
  6064 				}
  6065 			}
  6066 
  6067 			if ( scripts.length ) {
  6068 				jQuery.each( scripts, function( i, elem ) {
  6069 					if ( elem.src ) {
  6070 						jQuery.ajax({
  6071 							type: "GET",
  6072 							global: false,
  6073 							url: elem.src,
  6074 							async: false,
  6075 							dataType: "script"
  6076 						});
  6077 					} else {
  6078 						jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
  6079 					}
  6080 
  6081 					if ( elem.parentNode ) {
  6082 						elem.parentNode.removeChild( elem );
  6083 					}
  6084 				});
  6085 			}
  6086 		}
  6087 
  6088 		return this;
  6089 	}
  6090 });
  6091 
  6092 function root( elem, cur ) {
  6093 	return jQuery.nodeName(elem, "table") ?
  6094 		(elem.getElementsByTagName("tbody")[0] ||
  6095 		elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
  6096 		elem;
  6097 }
  6098 
  6099 function cloneCopyEvent( src, dest ) {
  6100 
  6101 	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
  6102 		return;
  6103 	}
  6104 
  6105 	var type, i, l,
  6106 		oldData = jQuery._data( src ),
  6107 		curData = jQuery._data( dest, oldData ),
  6108 		events = oldData.events;
  6109 
  6110 	if ( events ) {
  6111 		delete curData.handle;
  6112 		curData.events = {};
  6113 
  6114 		for ( type in events ) {
  6115 			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
  6116 				jQuery.event.add( dest, type, events[ type ][ i ] );
  6117 			}
  6118 		}
  6119 	}
  6120 
  6121 	// make the cloned public data object a copy from the original
  6122 	if ( curData.data ) {
  6123 		curData.data = jQuery.extend( {}, curData.data );
  6124 	}
  6125 }
  6126 
  6127 function cloneFixAttributes( src, dest ) {
  6128 	var nodeName;
  6129 
  6130 	// We do not need to do anything for non-Elements
  6131 	if ( dest.nodeType !== 1 ) {
  6132 		return;
  6133 	}
  6134 
  6135 	// clearAttributes removes the attributes, which we don't want,
  6136 	// but also removes the attachEvent events, which we *do* want
  6137 	if ( dest.clearAttributes ) {
  6138 		dest.clearAttributes();
  6139 	}
  6140 
  6141 	// mergeAttributes, in contrast, only merges back on the
  6142 	// original attributes, not the events
  6143 	if ( dest.mergeAttributes ) {
  6144 		dest.mergeAttributes( src );
  6145 	}
  6146 
  6147 	nodeName = dest.nodeName.toLowerCase();
  6148 
  6149 	// IE6-8 fail to clone children inside object elements that use
  6150 	// the proprietary classid attribute value (rather than the type
  6151 	// attribute) to identify the type of content to display
  6152 	if ( nodeName === "object" ) {
  6153 		dest.outerHTML = src.outerHTML;
  6154 
  6155 	} else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
  6156 		// IE6-8 fails to persist the checked state of a cloned checkbox
  6157 		// or radio button. Worse, IE6-7 fail to give the cloned element
  6158 		// a checked appearance if the defaultChecked value isn't also set
  6159 		if ( src.checked ) {
  6160 			dest.defaultChecked = dest.checked = src.checked;
  6161 		}
  6162 
  6163 		// IE6-7 get confused and end up setting the value of a cloned
  6164 		// checkbox/radio button to an empty string instead of "on"
  6165 		if ( dest.value !== src.value ) {
  6166 			dest.value = src.value;
  6167 		}
  6168 
  6169 	// IE6-8 fails to return the selected option to the default selected
  6170 	// state when cloning options
  6171 	} else if ( nodeName === "option" ) {
  6172 		dest.selected = src.defaultSelected;
  6173 
  6174 	// IE6-8 fails to set the defaultValue to the correct value when
  6175 	// cloning other types of input fields
  6176 	} else if ( nodeName === "input" || nodeName === "textarea" ) {
  6177 		dest.defaultValue = src.defaultValue;
  6178 
  6179 	// IE blanks contents when cloning scripts
  6180 	} else if ( nodeName === "script" && dest.text !== src.text ) {
  6181 		dest.text = src.text;
  6182 	}
  6183 
  6184 	// Event data gets referenced instead of copied if the expando
  6185 	// gets copied too
  6186 	dest.removeAttribute( jQuery.expando );
  6187 
  6188 	// Clear flags for bubbling special change/submit events, they must
  6189 	// be reattached when the newly cloned events are first activated
  6190 	dest.removeAttribute( "_submit_attached" );
  6191 	dest.removeAttribute( "_change_attached" );
  6192 }
  6193 
  6194 jQuery.buildFragment = function( args, nodes, scripts ) {
  6195 	var fragment, cacheable, cacheresults, doc,
  6196 	first = args[ 0 ];
  6197 
  6198 	// nodes may contain either an explicit document object,
  6199 	// a jQuery collection or context object.
  6200 	// If nodes[0] contains a valid object to assign to doc
  6201 	if ( nodes && nodes[0] ) {
  6202 		doc = nodes[0].ownerDocument || nodes[0];
  6203 	}
  6204 
  6205 	// Ensure that an attr object doesn't incorrectly stand in as a document object
  6206 	// Chrome and Firefox seem to allow this to occur and will throw exception
  6207 	// Fixes #8950
  6208 	if ( !doc.createDocumentFragment ) {
  6209 		doc = document;
  6210 	}
  6211 
  6212 	// Only cache "small" (1/2 KB) HTML strings that are associated with the main document
  6213 	// Cloning options loses the selected state, so don't cache them
  6214 	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
  6215 	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
  6216 	// Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
  6217 	if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
  6218 		first.charAt(0) === "<" && !rnocache.test( first ) &&
  6219 		(jQuery.support.checkClone || !rchecked.test( first )) &&
  6220 		(jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
  6221 
  6222 		cacheable = true;
  6223 
  6224 		cacheresults = jQuery.fragments[ first ];
  6225 		if ( cacheresults && cacheresults !== 1 ) {
  6226 			fragment = cacheresults;
  6227 		}
  6228 	}
  6229 
  6230 	if ( !fragment ) {
  6231 		fragment = doc.createDocumentFragment();
  6232 		jQuery.clean( args, doc, fragment, scripts );
  6233 	}
  6234 
  6235 	if ( cacheable ) {
  6236 		jQuery.fragments[ first ] = cacheresults ? fragment : 1;
  6237 	}
  6238 
  6239 	return { fragment: fragment, cacheable: cacheable };
  6240 };
  6241 
  6242 jQuery.fragments = {};
  6243 
  6244 jQuery.each({
  6245 	appendTo: "append",
  6246 	prependTo: "prepend",
  6247 	insertBefore: "before",
  6248 	insertAfter: "after",
  6249 	replaceAll: "replaceWith"
  6250 }, function( name, original ) {
  6251 	jQuery.fn[ name ] = function( selector ) {
  6252 		var ret = [],
  6253 			insert = jQuery( selector ),
  6254 			parent = this.length === 1 && this[0].parentNode;
  6255 
  6256 		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
  6257 			insert[ original ]( this[0] );
  6258 			return this;
  6259 
  6260 		} else {
  6261 			for ( var i = 0, l = insert.length; i < l; i++ ) {
  6262 				var elems = ( i > 0 ? this.clone(true) : this ).get();
  6263 				jQuery( insert[i] )[ original ]( elems );
  6264 				ret = ret.concat( elems );
  6265 			}
  6266 
  6267 			return this.pushStack( ret, name, insert.selector );
  6268 		}
  6269 	};
  6270 });
  6271 
  6272 function getAll( elem ) {
  6273 	if ( typeof elem.getElementsByTagName !== "undefined" ) {
  6274 		return elem.getElementsByTagName( "*" );
  6275 
  6276 	} else if ( typeof elem.querySelectorAll !== "undefined" ) {
  6277 		return elem.querySelectorAll( "*" );
  6278 
  6279 	} else {
  6280 		return [];
  6281 	}
  6282 }
  6283 
  6284 // Used in clean, fixes the defaultChecked property
  6285 function fixDefaultChecked( elem ) {
  6286 	if ( elem.type === "checkbox" || elem.type === "radio" ) {
  6287 		elem.defaultChecked = elem.checked;
  6288 	}
  6289 }
  6290 // Finds all inputs and passes them to fixDefaultChecked
  6291 function findInputs( elem ) {
  6292 	var nodeName = ( elem.nodeName || "" ).toLowerCase();
  6293 	if ( nodeName === "input" ) {
  6294 		fixDefaultChecked( elem );
  6295 	// Skip scripts, get other children
  6296 	} else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
  6297 		jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
  6298 	}
  6299 }
  6300 
  6301 // Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
  6302 function shimCloneNode( elem ) {
  6303 	var div = document.createElement( "div" );
  6304 	safeFragment.appendChild( div );
  6305 
  6306 	div.innerHTML = elem.outerHTML;
  6307 	return div.firstChild;
  6308 }
  6309 
  6310 jQuery.extend({
  6311 	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
  6312 		var srcElements,
  6313 			destElements,
  6314 			i,
  6315 			// IE<=8 does not properly clone detached, unknown element nodes
  6316 			clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
  6317 				elem.cloneNode( true ) :
  6318 				shimCloneNode( elem );
  6319 
  6320 		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
  6321 				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
  6322 			// IE copies events bound via attachEvent when using cloneNode.
  6323 			// Calling detachEvent on the clone will also remove the events
  6324 			// from the original. In order to get around this, we use some
  6325 			// proprietary methods to clear the events. Thanks to MooTools
  6326 			// guys for this hotness.
  6327 
  6328 			cloneFixAttributes( elem, clone );
  6329 
  6330 			// Using Sizzle here is crazy slow, so we use getElementsByTagName instead
  6331 			srcElements = getAll( elem );
  6332 			destElements = getAll( clone );
  6333 
  6334 			// Weird iteration because IE will replace the length property
  6335 			// with an element if you are cloning the body and one of the
  6336 			// elements on the page has a name or id of "length"
  6337 			for ( i = 0; srcElements[i]; ++i ) {
  6338 				// Ensure that the destination node is not null; Fixes #9587
  6339 				if ( destElements[i] ) {
  6340 					cloneFixAttributes( srcElements[i], destElements[i] );
  6341 				}
  6342 			}
  6343 		}
  6344 
  6345 		// Copy the events from the original to the clone
  6346 		if ( dataAndEvents ) {
  6347 			cloneCopyEvent( elem, clone );
  6348 
  6349 			if ( deepDataAndEvents ) {
  6350 				srcElements = getAll( elem );
  6351 				destElements = getAll( clone );
  6352 
  6353 				for ( i = 0; srcElements[i]; ++i ) {
  6354 					cloneCopyEvent( srcElements[i], destElements[i] );
  6355 				}
  6356 			}
  6357 		}
  6358 
  6359 		srcElements = destElements = null;
  6360 
  6361 		// Return the cloned set
  6362 		return clone;
  6363 	},
  6364 
  6365 	clean: function( elems, context, fragment, scripts ) {
  6366 		var checkScriptType, script, j,
  6367 				ret = [];
  6368 
  6369 		context = context || document;
  6370 
  6371 		// !context.createElement fails in IE with an error but returns typeof 'object'
  6372 		if ( typeof context.createElement === "undefined" ) {
  6373 			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
  6374 		}
  6375 
  6376 		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
  6377 			if ( typeof elem === "number" ) {
  6378 				elem += "";
  6379 			}
  6380 
  6381 			if ( !elem ) {
  6382 				continue;
  6383 			}
  6384 
  6385 			// Convert html string into DOM nodes
  6386 			if ( typeof elem === "string" ) {
  6387 				if ( !rhtml.test( elem ) ) {
  6388 					elem = context.createTextNode( elem );
  6389 				} else {
  6390 					// Fix "XHTML"-style tags in all browsers
  6391 					elem = elem.replace(rxhtmlTag, "<$1></$2>");
  6392 
  6393 					// Trim whitespace, otherwise indexOf won't work as expected
  6394 					var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
  6395 						wrap = wrapMap[ tag ] || wrapMap._default,
  6396 						depth = wrap[0],
  6397 						div = context.createElement("div"),
  6398 						safeChildNodes = safeFragment.childNodes,
  6399 						remove;
  6400 
  6401 					// Append wrapper element to unknown element safe doc fragment
  6402 					if ( context === document ) {
  6403 						// Use the fragment we've already created for this document
  6404 						safeFragment.appendChild( div );
  6405 					} else {
  6406 						// Use a fragment created with the owner document
  6407 						createSafeFragment( context ).appendChild( div );
  6408 					}
  6409 
  6410 					// Go to html and back, then peel off extra wrappers
  6411 					div.innerHTML = wrap[1] + elem + wrap[2];
  6412 
  6413 					// Move to the right depth
  6414 					while ( depth-- ) {
  6415 						div = div.lastChild;
  6416 					}
  6417 
  6418 					// Remove IE's autoinserted <tbody> from table fragments
  6419 					if ( !jQuery.support.tbody ) {
  6420 
  6421 						// String was a <table>, *may* have spurious <tbody>
  6422 						var hasBody = rtbody.test(elem),
  6423 							tbody = tag === "table" && !hasBody ?
  6424 								div.firstChild && div.firstChild.childNodes :
  6425 
  6426 								// String was a bare <thead> or <tfoot>
  6427 								wrap[1] === "<table>" && !hasBody ?
  6428 									div.childNodes :
  6429 									[];
  6430 
  6431 						for ( j = tbody.length - 1; j >= 0 ; --j ) {
  6432 							if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
  6433 								tbody[ j ].parentNode.removeChild( tbody[ j ] );
  6434 							}
  6435 						}
  6436 					}
  6437 
  6438 					// IE completely kills leading whitespace when innerHTML is used
  6439 					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
  6440 						div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
  6441 					}
  6442 
  6443 					elem = div.childNodes;
  6444 
  6445 					// Clear elements from DocumentFragment (safeFragment or otherwise)
  6446 					// to avoid hoarding elements. Fixes #11356
  6447 					if ( div ) {
  6448 						div.parentNode.removeChild( div );
  6449 
  6450 						// Guard against -1 index exceptions in FF3.6
  6451 						if ( safeChildNodes.length > 0 ) {
  6452 							remove = safeChildNodes[ safeChildNodes.length - 1 ];
  6453 
  6454 							if ( remove && remove.parentNode ) {
  6455 								remove.parentNode.removeChild( remove );
  6456 							}
  6457 						}
  6458 					}
  6459 				}
  6460 			}
  6461 
  6462 			// Resets defaultChecked for any radios and checkboxes
  6463 			// about to be appended to the DOM in IE 6/7 (#8060)
  6464 			var len;
  6465 			if ( !jQuery.support.appendChecked ) {
  6466 				if ( elem[0] && typeof (len = elem.length) === "number" ) {
  6467 					for ( j = 0; j < len; j++ ) {
  6468 						findInputs( elem[j] );
  6469 					}
  6470 				} else {
  6471 					findInputs( elem );
  6472 				}
  6473 			}
  6474 
  6475 			if ( elem.nodeType ) {
  6476 				ret.push( elem );
  6477 			} else {
  6478 				ret = jQuery.merge( ret, elem );
  6479 			}
  6480 		}
  6481 
  6482 		if ( fragment ) {
  6483 			checkScriptType = function( elem ) {
  6484 				return !elem.type || rscriptType.test( elem.type );
  6485 			};
  6486 			for ( i = 0; ret[i]; i++ ) {
  6487 				script = ret[i];
  6488 				if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
  6489 					scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
  6490 
  6491 				} else {
  6492 					if ( script.nodeType === 1 ) {
  6493 						var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
  6494 
  6495 						ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
  6496 					}
  6497 					fragment.appendChild( script );
  6498 				}
  6499 			}
  6500 		}
  6501 
  6502 		return ret;
  6503 	},
  6504 
  6505 	cleanData: function( elems ) {
  6506 		var data, id,
  6507 			cache = jQuery.cache,
  6508 			special = jQuery.event.special,
  6509 			deleteExpando = jQuery.support.deleteExpando;
  6510 
  6511 		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
  6512 			if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
  6513 				continue;
  6514 			}
  6515 
  6516 			id = elem[ jQuery.expando ];
  6517 
  6518 			if ( id ) {
  6519 				data = cache[ id ];
  6520 
  6521 				if ( data && data.events ) {
  6522 					for ( var type in data.events ) {
  6523 						if ( special[ type ] ) {
  6524 							jQuery.event.remove( elem, type );
  6525 
  6526 						// This is a shortcut to avoid jQuery.event.remove's overhead
  6527 						} else {
  6528 							jQuery.removeEvent( elem, type, data.handle );
  6529 						}
  6530 					}
  6531 
  6532 					// Null the DOM reference to avoid IE6/7/8 leak (#7054)
  6533 					if ( data.handle ) {
  6534 						data.handle.elem = null;
  6535 					}
  6536 				}
  6537 
  6538 				if ( deleteExpando ) {
  6539 					delete elem[ jQuery.expando ];
  6540 
  6541 				} else if ( elem.removeAttribute ) {
  6542 					elem.removeAttribute( jQuery.expando );
  6543 				}
  6544 
  6545 				delete cache[ id ];
  6546 			}
  6547 		}
  6548 	}
  6549 });
  6550 
  6551 
  6552 
  6553 
  6554 var ralpha = /alpha\([^)]*\)/i,
  6555 	ropacity = /opacity=([^)]*)/,
  6556 	// fixed for IE9, see #8346
  6557 	rupper = /([A-Z]|^ms)/g,
  6558 	rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
  6559 	rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
  6560 	rrelNum = /^([\-+])=([\-+.\de]+)/,
  6561 	rmargin = /^margin/,
  6562 
  6563 	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
  6564 
  6565 	// order is important!
  6566 	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
  6567 
  6568 	curCSS,
  6569 
  6570 	getComputedStyle,
  6571 	currentStyle;
  6572 
  6573 jQuery.fn.css = function( name, value ) {
  6574 	return jQuery.access( this, function( elem, name, value ) {
  6575 		return value !== undefined ?
  6576 			jQuery.style( elem, name, value ) :
  6577 			jQuery.css( elem, name );
  6578 	}, name, value, arguments.length > 1 );
  6579 };
  6580 
  6581 jQuery.extend({
  6582 	// Add in style property hooks for overriding the default
  6583 	// behavior of getting and setting a style property
  6584 	cssHooks: {
  6585 		opacity: {
  6586 			get: function( elem, computed ) {
  6587 				if ( computed ) {
  6588 					// We should always get a number back from opacity
  6589 					var ret = curCSS( elem, "opacity" );
  6590 					return ret === "" ? "1" : ret;
  6591 
  6592 				} else {
  6593 					return elem.style.opacity;
  6594 				}
  6595 			}
  6596 		}
  6597 	},
  6598 
  6599 	// Exclude the following css properties to add px
  6600 	cssNumber: {
  6601 		"fillOpacity": true,
  6602 		"fontWeight": true,
  6603 		"lineHeight": true,
  6604 		"opacity": true,
  6605 		"orphans": true,
  6606 		"widows": true,
  6607 		"zIndex": true,
  6608 		"zoom": true
  6609 	},
  6610 
  6611 	// Add in properties whose names you wish to fix before
  6612 	// setting or getting the value
  6613 	cssProps: {
  6614 		// normalize float css property
  6615 		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
  6616 	},
  6617 
  6618 	// Get and set the style property on a DOM Node
  6619 	style: function( elem, name, value, extra ) {
  6620 		// Don't set styles on text and comment nodes
  6621 		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
  6622 			return;
  6623 		}
  6624 
  6625 		// Make sure that we're working with the right name
  6626 		var ret, type, origName = jQuery.camelCase( name ),
  6627 			style = elem.style, hooks = jQuery.cssHooks[ origName ];
  6628 
  6629 		name = jQuery.cssProps[ origName ] || origName;
  6630 
  6631 		// Check if we're setting a value
  6632 		if ( value !== undefined ) {
  6633 			type = typeof value;
  6634 
  6635 			// convert relative number strings (+= or -=) to relative numbers. #7345
  6636 			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
  6637 				value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
  6638 				// Fixes bug #9237
  6639 				type = "number";
  6640 			}
  6641 
  6642 			// Make sure that NaN and null values aren't set. See: #7116
  6643 			if ( value == null || type === "number" && isNaN( value ) ) {
  6644 				return;
  6645 			}
  6646 
  6647 			// If a number was passed in, add 'px' to the (except for certain CSS properties)
  6648 			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
  6649 				value += "px";
  6650 			}
  6651 
  6652 			// If a hook was provided, use that value, otherwise just set the specified value
  6653 			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
  6654 				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
  6655 				// Fixes bug #5509
  6656 				try {
  6657 					style[ name ] = value;
  6658 				} catch(e) {}
  6659 			}
  6660 
  6661 		} else {
  6662 			// If a hook was provided get the non-computed value from there
  6663 			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
  6664 				return ret;
  6665 			}
  6666 
  6667 			// Otherwise just get the value from the style object
  6668 			return style[ name ];
  6669 		}
  6670 	},
  6671 
  6672 	css: function( elem, name, extra ) {
  6673 		var ret, hooks;
  6674 
  6675 		// Make sure that we're working with the right name
  6676 		name = jQuery.camelCase( name );
  6677 		hooks = jQuery.cssHooks[ name ];
  6678 		name = jQuery.cssProps[ name ] || name;
  6679 
  6680 		// cssFloat needs a special treatment
  6681 		if ( name === "cssFloat" ) {
  6682 			name = "float";
  6683 		}
  6684 
  6685 		// If a hook was provided get the computed value from there
  6686 		if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
  6687 			return ret;
  6688 
  6689 		// Otherwise, if a way to get the computed value exists, use that
  6690 		} else if ( curCSS ) {
  6691 			return curCSS( elem, name );
  6692 		}
  6693 	},
  6694 
  6695 	// A method for quickly swapping in/out CSS properties to get correct calculations
  6696 	swap: function( elem, options, callback ) {
  6697 		var old = {},
  6698 			ret, name;
  6699 
  6700 		// Remember the old values, and insert the new ones
  6701 		for ( name in options ) {
  6702 			old[ name ] = elem.style[ name ];
  6703 			elem.style[ name ] = options[ name ];
  6704 		}
  6705 
  6706 		ret = callback.call( elem );
  6707 
  6708 		// Revert the old values
  6709 		for ( name in options ) {
  6710 			elem.style[ name ] = old[ name ];
  6711 		}
  6712 
  6713 		return ret;
  6714 	}
  6715 });
  6716 
  6717 // DEPRECATED in 1.3, Use jQuery.css() instead
  6718 jQuery.curCSS = jQuery.css;
  6719 
  6720 if ( document.defaultView && document.defaultView.getComputedStyle ) {
  6721 	getComputedStyle = function( elem, name ) {
  6722 		var ret, defaultView, computedStyle, width,
  6723 			style = elem.style;
  6724 
  6725 		name = name.replace( rupper, "-$1" ).toLowerCase();
  6726 
  6727 		if ( (defaultView = elem.ownerDocument.defaultView) &&
  6728 				(computedStyle = defaultView.getComputedStyle( elem, null )) ) {
  6729 
  6730 			ret = computedStyle.getPropertyValue( name );
  6731 			if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
  6732 				ret = jQuery.style( elem, name );
  6733 			}
  6734 		}
  6735 
  6736 		// A tribute to the "awesome hack by Dean Edwards"
  6737 		// WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
  6738 		// which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
  6739 		if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
  6740 			width = style.width;
  6741 			style.width = ret;
  6742 			ret = computedStyle.width;
  6743 			style.width = width;
  6744 		}
  6745 
  6746 		return ret;
  6747 	};
  6748 }
  6749 
  6750 if ( document.documentElement.currentStyle ) {
  6751 	currentStyle = function( elem, name ) {
  6752 		var left, rsLeft, uncomputed,
  6753 			ret = elem.currentStyle && elem.currentStyle[ name ],
  6754 			style = elem.style;
  6755 
  6756 		// Avoid setting ret to empty string here
  6757 		// so we don't default to auto
  6758 		if ( ret == null && style && (uncomputed = style[ name ]) ) {
  6759 			ret = uncomputed;
  6760 		}
  6761 
  6762 		// From the awesome hack by Dean Edwards
  6763 		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
  6764 
  6765 		// If we're not dealing with a regular pixel number
  6766 		// but a number that has a weird ending, we need to convert it to pixels
  6767 		if ( rnumnonpx.test( ret ) ) {
  6768 
  6769 			// Remember the original values
  6770 			left = style.left;
  6771 			rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
  6772 
  6773 			// Put in the new values to get a computed value out
  6774 			if ( rsLeft ) {
  6775 				elem.runtimeStyle.left = elem.currentStyle.left;
  6776 			}
  6777 			style.left = name === "fontSize" ? "1em" : ret;
  6778 			ret = style.pixelLeft + "px";
  6779 
  6780 			// Revert the changed values
  6781 			style.left = left;
  6782 			if ( rsLeft ) {
  6783 				elem.runtimeStyle.left = rsLeft;
  6784 			}
  6785 		}
  6786 
  6787 		return ret === "" ? "auto" : ret;
  6788 	};
  6789 }
  6790 
  6791 curCSS = getComputedStyle || currentStyle;
  6792 
  6793 function getWidthOrHeight( elem, name, extra ) {
  6794 
  6795 	// Start with offset property
  6796 	var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
  6797 		i = name === "width" ? 1 : 0,
  6798 		len = 4;
  6799 
  6800 	if ( val > 0 ) {
  6801 		if ( extra !== "border" ) {
  6802 			for ( ; i < len; i += 2 ) {
  6803 				if ( !extra ) {
  6804 					val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
  6805 				}
  6806 				if ( extra === "margin" ) {
  6807 					val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
  6808 				} else {
  6809 					val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
  6810 				}
  6811 			}
  6812 		}
  6813 
  6814 		return val + "px";
  6815 	}
  6816 
  6817 	// Fall back to computed then uncomputed css if necessary
  6818 	val = curCSS( elem, name );
  6819 	if ( val < 0 || val == null ) {
  6820 		val = elem.style[ name ];
  6821 	}
  6822 
  6823 	// Computed unit is not pixels. Stop here and return.
  6824 	if ( rnumnonpx.test(val) ) {
  6825 		return val;
  6826 	}
  6827 
  6828 	// Normalize "", auto, and prepare for extra
  6829 	val = parseFloat( val ) || 0;
  6830 
  6831 	// Add padding, border, margin
  6832 	if ( extra ) {
  6833 		for ( ; i < len; i += 2 ) {
  6834 			val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
  6835 			if ( extra !== "padding" ) {
  6836 				val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
  6837 			}
  6838 			if ( extra === "margin" ) {
  6839 				val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
  6840 			}
  6841 		}
  6842 	}
  6843 
  6844 	return val + "px";
  6845 }
  6846 
  6847 jQuery.each([ "height", "width" ], function( i, name ) {
  6848 	jQuery.cssHooks[ name ] = {
  6849 		get: function( elem, computed, extra ) {
  6850 			if ( computed ) {
  6851 				if ( elem.offsetWidth !== 0 ) {
  6852 					return getWidthOrHeight( elem, name, extra );
  6853 				} else {
  6854 					return jQuery.swap( elem, cssShow, function() {
  6855 						return getWidthOrHeight( elem, name, extra );
  6856 					});
  6857 				}
  6858 			}
  6859 		},
  6860 
  6861 		set: function( elem, value ) {
  6862 			return rnum.test( value ) ?
  6863 				value + "px" :
  6864 				value;
  6865 		}
  6866 	};
  6867 });
  6868 
  6869 if ( !jQuery.support.opacity ) {
  6870 	jQuery.cssHooks.opacity = {
  6871 		get: function( elem, computed ) {
  6872 			// IE uses filters for opacity
  6873 			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
  6874 				( parseFloat( RegExp.$1 ) / 100 ) + "" :
  6875 				computed ? "1" : "";
  6876 		},
  6877 
  6878 		set: function( elem, value ) {
  6879 			var style = elem.style,
  6880 				currentStyle = elem.currentStyle,
  6881 				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
  6882 				filter = currentStyle && currentStyle.filter || style.filter || "";
  6883 
  6884 			// IE has trouble with opacity if it does not have layout
  6885 			// Force it by setting the zoom level
  6886 			style.zoom = 1;
  6887 
  6888 			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
  6889 			if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
  6890 
  6891 				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
  6892 				// if "filter:" is present at all, clearType is disabled, we want to avoid this
  6893 				// style.removeAttribute is IE Only, but so apparently is this code path...
  6894 				style.removeAttribute( "filter" );
  6895 
  6896 				// if there there is no filter style applied in a css rule, we are done
  6897 				if ( currentStyle && !currentStyle.filter ) {
  6898 					return;
  6899 				}
  6900 			}
  6901 
  6902 			// otherwise, set new filter values
  6903 			style.filter = ralpha.test( filter ) ?
  6904 				filter.replace( ralpha, opacity ) :
  6905 				filter + " " + opacity;
  6906 		}
  6907 	};
  6908 }
  6909 
  6910 jQuery(function() {
  6911 	// This hook cannot be added until DOM ready because the support test
  6912 	// for it is not run until after DOM ready
  6913 	if ( !jQuery.support.reliableMarginRight ) {
  6914 		jQuery.cssHooks.marginRight = {
  6915 			get: function( elem, computed ) {
  6916 				// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
  6917 				// Work around by temporarily setting element display to inline-block
  6918 				return jQuery.swap( elem, { "display": "inline-block" }, function() {
  6919 					if ( computed ) {
  6920 						return curCSS( elem, "margin-right" );
  6921 					} else {
  6922 						return elem.style.marginRight;
  6923 					}
  6924 				});
  6925 			}
  6926 		};
  6927 	}
  6928 });
  6929 
  6930 if ( jQuery.expr && jQuery.expr.filters ) {
  6931 	jQuery.expr.filters.hidden = function( elem ) {
  6932 		var width = elem.offsetWidth,
  6933 			height = elem.offsetHeight;
  6934 
  6935 		return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
  6936 	};
  6937 
  6938 	jQuery.expr.filters.visible = function( elem ) {
  6939 		return !jQuery.expr.filters.hidden( elem );
  6940 	};
  6941 }
  6942 
  6943 // These hooks are used by animate to expand properties
  6944 jQuery.each({
  6945 	margin: "",
  6946 	padding: "",
  6947 	border: "Width"
  6948 }, function( prefix, suffix ) {
  6949 
  6950 	jQuery.cssHooks[ prefix + suffix ] = {
  6951 		expand: function( value ) {
  6952 			var i,
  6953 
  6954 				// assumes a single number if not a string
  6955 				parts = typeof value === "string" ? value.split(" ") : [ value ],
  6956 				expanded = {};
  6957 
  6958 			for ( i = 0; i < 4; i++ ) {
  6959 				expanded[ prefix + cssExpand[ i ] + suffix ] =
  6960 					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
  6961 			}
  6962 
  6963 			return expanded;
  6964 		}
  6965 	};
  6966 });
  6967 
  6968 
  6969 
  6970 
  6971 var r20 = /%20/g,
  6972 	rbracket = /\[\]$/,
  6973 	rCRLF = /\r?\n/g,
  6974 	rhash = /#.*$/,
  6975 	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
  6976 	rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
  6977 	// #7653, #8125, #8152: local protocol detection
  6978 	rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
  6979 	rnoContent = /^(?:GET|HEAD)$/,
  6980 	rprotocol = /^\/\//,
  6981 	rquery = /\?/,
  6982 	rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
  6983 	rselectTextarea = /^(?:select|textarea)/i,
  6984 	rspacesAjax = /\s+/,
  6985 	rts = /([?&])_=[^&]*/,
  6986 	rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
  6987 
  6988 	// Keep a copy of the old load method
  6989 	_load = jQuery.fn.load,
  6990 
  6991 	/* Prefilters
  6992 	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
  6993 	 * 2) These are called:
  6994 	 *    - BEFORE asking for a transport
  6995 	 *    - AFTER param serialization (s.data is a string if s.processData is true)
  6996 	 * 3) key is the dataType
  6997 	 * 4) the catchall symbol "*" can be used
  6998 	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
  6999 	 */
  7000 	prefilters = {},
  7001 
  7002 	/* Transports bindings
  7003 	 * 1) key is the dataType
  7004 	 * 2) the catchall symbol "*" can be used
  7005 	 * 3) selection will start with transport dataType and THEN go to "*" if needed
  7006 	 */
  7007 	transports = {},
  7008 
  7009 	// Document location
  7010 	ajaxLocation,
  7011 
  7012 	// Document location segments
  7013 	ajaxLocParts,
  7014 
  7015 	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
  7016 	allTypes = ["*/"] + ["*"];
  7017 
  7018 // #8138, IE may throw an exception when accessing
  7019 // a field from window.location if document.domain has been set
  7020 try {
  7021 	ajaxLocation = location.href;
  7022 } catch( e ) {
  7023 	// Use the href attribute of an A element
  7024 	// since IE will modify it given document.location
  7025 	ajaxLocation = document.createElement( "a" );
  7026 	ajaxLocation.href = "";
  7027 	ajaxLocation = ajaxLocation.href;
  7028 }
  7029 
  7030 // Segment location into parts
  7031 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
  7032 
  7033 // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
  7034 function addToPrefiltersOrTransports( structure ) {
  7035 
  7036 	// dataTypeExpression is optional and defaults to "*"
  7037 	return function( dataTypeExpression, func ) {
  7038 
  7039 		if ( typeof dataTypeExpression !== "string" ) {
  7040 			func = dataTypeExpression;
  7041 			dataTypeExpression = "*";
  7042 		}
  7043 
  7044 		if ( jQuery.isFunction( func ) ) {
  7045 			var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
  7046 				i = 0,
  7047 				length = dataTypes.length,
  7048 				dataType,
  7049 				list,
  7050 				placeBefore;
  7051 
  7052 			// For each dataType in the dataTypeExpression
  7053 			for ( ; i < length; i++ ) {
  7054 				dataType = dataTypes[ i ];
  7055 				// We control if we're asked to add before
  7056 				// any existing element
  7057 				placeBefore = /^\+/.test( dataType );
  7058 				if ( placeBefore ) {
  7059 					dataType = dataType.substr( 1 ) || "*";
  7060 				}
  7061 				list = structure[ dataType ] = structure[ dataType ] || [];
  7062 				// then we add to the structure accordingly
  7063 				list[ placeBefore ? "unshift" : "push" ]( func );
  7064 			}
  7065 		}
  7066 	};
  7067 }
  7068 
  7069 // Base inspection function for prefilters and transports
  7070 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
  7071 		dataType /* internal */, inspected /* internal */ ) {
  7072 
  7073 	dataType = dataType || options.dataTypes[ 0 ];
  7074 	inspected = inspected || {};
  7075 
  7076 	inspected[ dataType ] = true;
  7077 
  7078 	var list = structure[ dataType ],
  7079 		i = 0,
  7080 		length = list ? list.length : 0,
  7081 		executeOnly = ( structure === prefilters ),
  7082 		selection;
  7083 
  7084 	for ( ; i < length && ( executeOnly || !selection ); i++ ) {
  7085 		selection = list[ i ]( options, originalOptions, jqXHR );
  7086 		// If we got redirected to another dataType
  7087 		// we try there if executing only and not done already
  7088 		if ( typeof selection === "string" ) {
  7089 			if ( !executeOnly || inspected[ selection ] ) {
  7090 				selection = undefined;
  7091 			} else {
  7092 				options.dataTypes.unshift( selection );
  7093 				selection = inspectPrefiltersOrTransports(
  7094 						structure, options, originalOptions, jqXHR, selection, inspected );
  7095 			}
  7096 		}
  7097 	}
  7098 	// If we're only executing or nothing was selected
  7099 	// we try the catchall dataType if not done already
  7100 	if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
  7101 		selection = inspectPrefiltersOrTransports(
  7102 				structure, options, originalOptions, jqXHR, "*", inspected );
  7103 	}
  7104 	// unnecessary when only executing (prefilters)
  7105 	// but it'll be ignored by the caller in that case
  7106 	return selection;
  7107 }
  7108 
  7109 // A special extend for ajax options
  7110 // that takes "flat" options (not to be deep extended)
  7111 // Fixes #9887
  7112 function ajaxExtend( target, src ) {
  7113 	var key, deep,
  7114 		flatOptions = jQuery.ajaxSettings.flatOptions || {};
  7115 	for ( key in src ) {
  7116 		if ( src[ key ] !== undefined ) {
  7117 			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
  7118 		}
  7119 	}
  7120 	if ( deep ) {
  7121 		jQuery.extend( true, target, deep );
  7122 	}
  7123 }
  7124 
  7125 jQuery.fn.extend({
  7126 	load: function( url, params, callback ) {
  7127 		if ( typeof url !== "string" && _load ) {
  7128 			return _load.apply( this, arguments );
  7129 
  7130 		// Don't do a request if no elements are being requested
  7131 		} else if ( !this.length ) {
  7132 			return this;
  7133 		}
  7134 
  7135 		var off = url.indexOf( " " );
  7136 		if ( off >= 0 ) {
  7137 			var selector = url.slice( off, url.length );
  7138 			url = url.slice( 0, off );
  7139 		}
  7140 
  7141 		// Default to a GET request
  7142 		var type = "GET";
  7143 
  7144 		// If the second parameter was provided
  7145 		if ( params ) {
  7146 			// If it's a function
  7147 			if ( jQuery.isFunction( params ) ) {
  7148 				// We assume that it's the callback
  7149 				callback = params;
  7150 				params = undefined;
  7151 
  7152 			// Otherwise, build a param string
  7153 			} else if ( typeof params === "object" ) {
  7154 				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
  7155 				type = "POST";
  7156 			}
  7157 		}
  7158 
  7159 		var self = this;
  7160 
  7161 		// Request the remote document
  7162 		jQuery.ajax({
  7163 			url: url,
  7164 			type: type,
  7165 			dataType: "html",
  7166 			data: params,
  7167 			// Complete callback (responseText is used internally)
  7168 			complete: function( jqXHR, status, responseText ) {
  7169 				// Store the response as specified by the jqXHR object
  7170 				responseText = jqXHR.responseText;
  7171 				// If successful, inject the HTML into all the matched elements
  7172 				if ( jqXHR.isResolved() ) {
  7173 					// #4825: Get the actual response in case
  7174 					// a dataFilter is present in ajaxSettings
  7175 					jqXHR.done(function( r ) {
  7176 						responseText = r;
  7177 					});
  7178 					// See if a selector was specified
  7179 					self.html( selector ?
  7180 						// Create a dummy div to hold the results
  7181 						jQuery("<div>")
  7182 							// inject the contents of the document in, removing the scripts
  7183 							// to avoid any 'Permission Denied' errors in IE
  7184 							.append(responseText.replace(rscript, ""))
  7185 
  7186 							// Locate the specified elements
  7187 							.find(selector) :
  7188 
  7189 						// If not, just inject the full result
  7190 						responseText );
  7191 				}
  7192 
  7193 				if ( callback ) {
  7194 					self.each( callback, [ responseText, status, jqXHR ] );
  7195 				}
  7196 			}
  7197 		});
  7198 
  7199 		return this;
  7200 	},
  7201 
  7202 	serialize: function() {
  7203 		return jQuery.param( this.serializeArray() );
  7204 	},
  7205 
  7206 	serializeArray: function() {
  7207 		return this.map(function(){
  7208 			return this.elements ? jQuery.makeArray( this.elements ) : this;
  7209 		})
  7210 		.filter(function(){
  7211 			return this.name && !this.disabled &&
  7212 				( this.checked || rselectTextarea.test( this.nodeName ) ||
  7213 					rinput.test( this.type ) );
  7214 		})
  7215 		.map(function( i, elem ){
  7216 			var val = jQuery( this ).val();
  7217 
  7218 			return val == null ?
  7219 				null :
  7220 				jQuery.isArray( val ) ?
  7221 					jQuery.map( val, function( val, i ){
  7222 						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  7223 					}) :
  7224 					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
  7225 		}).get();
  7226 	}
  7227 });
  7228 
  7229 // Attach a bunch of functions for handling common AJAX events
  7230 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
  7231 	jQuery.fn[ o ] = function( f ){
  7232 		return this.on( o, f );
  7233 	};
  7234 });
  7235 
  7236 jQuery.each( [ "get", "post" ], function( i, method ) {
  7237 	jQuery[ method ] = function( url, data, callback, type ) {
  7238 		// shift arguments if data argument was omitted
  7239 		if ( jQuery.isFunction( data ) ) {
  7240 			type = type || callback;
  7241 			callback = data;
  7242 			data = undefined;
  7243 		}
  7244 
  7245 		return jQuery.ajax({
  7246 			type: method,
  7247 			url: url,
  7248 			data: data,
  7249 			success: callback,
  7250 			dataType: type
  7251 		});
  7252 	};
  7253 });
  7254 
  7255 jQuery.extend({
  7256 
  7257 	getScript: function( url, callback ) {
  7258 		return jQuery.get( url, undefined, callback, "script" );
  7259 	},
  7260 
  7261 	getJSON: function( url, data, callback ) {
  7262 		return jQuery.get( url, data, callback, "json" );
  7263 	},
  7264 
  7265 	// Creates a full fledged settings object into target
  7266 	// with both ajaxSettings and settings fields.
  7267 	// If target is omitted, writes into ajaxSettings.
  7268 	ajaxSetup: function( target, settings ) {
  7269 		if ( settings ) {
  7270 			// Building a settings object
  7271 			ajaxExtend( target, jQuery.ajaxSettings );
  7272 		} else {
  7273 			// Extending ajaxSettings
  7274 			settings = target;
  7275 			target = jQuery.ajaxSettings;
  7276 		}
  7277 		ajaxExtend( target, settings );
  7278 		return target;
  7279 	},
  7280 
  7281 	ajaxSettings: {
  7282 		url: ajaxLocation,
  7283 		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
  7284 		global: true,
  7285 		type: "GET",
  7286 		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
  7287 		processData: true,
  7288 		async: true,
  7289 		/*
  7290 		timeout: 0,
  7291 		data: null,
  7292 		dataType: null,
  7293 		username: null,
  7294 		password: null,
  7295 		cache: null,
  7296 		traditional: false,
  7297 		headers: {},
  7298 		*/
  7299 
  7300 		accepts: {
  7301 			xml: "application/xml, text/xml",
  7302 			html: "text/html",
  7303 			text: "text/plain",
  7304 			json: "application/json, text/javascript",
  7305 			"*": allTypes
  7306 		},
  7307 
  7308 		contents: {
  7309 			xml: /xml/,
  7310 			html: /html/,
  7311 			json: /json/
  7312 		},
  7313 
  7314 		responseFields: {
  7315 			xml: "responseXML",
  7316 			text: "responseText"
  7317 		},
  7318 
  7319 		// List of data converters
  7320 		// 1) key format is "source_type destination_type" (a single space in-between)
  7321 		// 2) the catchall symbol "*" can be used for source_type
  7322 		converters: {
  7323 
  7324 			// Convert anything to text
  7325 			"* text": window.String,
  7326 
  7327 			// Text to html (true = no transformation)
  7328 			"text html": true,
  7329 
  7330 			// Evaluate text as a json expression
  7331 			"text json": jQuery.parseJSON,
  7332 
  7333 			// Parse text as xml
  7334 			"text xml": jQuery.parseXML
  7335 		},
  7336 
  7337 		// For options that shouldn't be deep extended:
  7338 		// you can add your own custom options here if
  7339 		// and when you create one that shouldn't be
  7340 		// deep extended (see ajaxExtend)
  7341 		flatOptions: {
  7342 			context: true,
  7343 			url: true
  7344 		}
  7345 	},
  7346 
  7347 	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
  7348 	ajaxTransport: addToPrefiltersOrTransports( transports ),
  7349 
  7350 	// Main method
  7351 	ajax: function( url, options ) {
  7352 
  7353 		// If url is an object, simulate pre-1.5 signature
  7354 		if ( typeof url === "object" ) {
  7355 			options = url;
  7356 			url = undefined;
  7357 		}
  7358 
  7359 		// Force options to be an object
  7360 		options = options || {};
  7361 
  7362 		var // Create the final options object
  7363 			s = jQuery.ajaxSetup( {}, options ),
  7364 			// Callbacks context
  7365 			callbackContext = s.context || s,
  7366 			// Context for global events
  7367 			// It's the callbackContext if one was provided in the options
  7368 			// and if it's a DOM node or a jQuery collection
  7369 			globalEventContext = callbackContext !== s &&
  7370 				( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
  7371 						jQuery( callbackContext ) : jQuery.event,
  7372 			// Deferreds
  7373 			deferred = jQuery.Deferred(),
  7374 			completeDeferred = jQuery.Callbacks( "once memory" ),
  7375 			// Status-dependent callbacks
  7376 			statusCode = s.statusCode || {},
  7377 			// ifModified key
  7378 			ifModifiedKey,
  7379 			// Headers (they are sent all at once)
  7380 			requestHeaders = {},
  7381 			requestHeadersNames = {},
  7382 			// Response headers
  7383 			responseHeadersString,
  7384 			responseHeaders,
  7385 			// transport
  7386 			transport,
  7387 			// timeout handle
  7388 			timeoutTimer,
  7389 			// Cross-domain detection vars
  7390 			parts,
  7391 			// The jqXHR state
  7392 			state = 0,
  7393 			// To know if global events are to be dispatched
  7394 			fireGlobals,
  7395 			// Loop variable
  7396 			i,
  7397 			// Fake xhr
  7398 			jqXHR = {
  7399 
  7400 				readyState: 0,
  7401 
  7402 				// Caches the header
  7403 				setRequestHeader: function( name, value ) {
  7404 					if ( !state ) {
  7405 						var lname = name.toLowerCase();
  7406 						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
  7407 						requestHeaders[ name ] = value;
  7408 					}
  7409 					return this;
  7410 				},
  7411 
  7412 				// Raw string
  7413 				getAllResponseHeaders: function() {
  7414 					return state === 2 ? responseHeadersString : null;
  7415 				},
  7416 
  7417 				// Builds headers hashtable if needed
  7418 				getResponseHeader: function( key ) {
  7419 					var match;
  7420 					if ( state === 2 ) {
  7421 						if ( !responseHeaders ) {
  7422 							responseHeaders = {};
  7423 							while( ( match = rheaders.exec( responseHeadersString ) ) ) {
  7424 								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
  7425 							}
  7426 						}
  7427 						match = responseHeaders[ key.toLowerCase() ];
  7428 					}
  7429 					return match === undefined ? null : match;
  7430 				},
  7431 
  7432 				// Overrides response content-type header
  7433 				overrideMimeType: function( type ) {
  7434 					if ( !state ) {
  7435 						s.mimeType = type;
  7436 					}
  7437 					return this;
  7438 				},
  7439 
  7440 				// Cancel the request
  7441 				abort: function( statusText ) {
  7442 					statusText = statusText || "abort";
  7443 					if ( transport ) {
  7444 						transport.abort( statusText );
  7445 					}
  7446 					done( 0, statusText );
  7447 					return this;
  7448 				}
  7449 			};
  7450 
  7451 		// Callback for when everything is done
  7452 		// It is defined here because jslint complains if it is declared
  7453 		// at the end of the function (which would be more logical and readable)
  7454 		function done( status, nativeStatusText, responses, headers ) {
  7455 
  7456 			// Called once
  7457 			if ( state === 2 ) {
  7458 				return;
  7459 			}
  7460 
  7461 			// State is "done" now
  7462 			state = 2;
  7463 
  7464 			// Clear timeout if it exists
  7465 			if ( timeoutTimer ) {
  7466 				clearTimeout( timeoutTimer );
  7467 			}
  7468 
  7469 			// Dereference transport for early garbage collection
  7470 			// (no matter how long the jqXHR object will be used)
  7471 			transport = undefined;
  7472 
  7473 			// Cache response headers
  7474 			responseHeadersString = headers || "";
  7475 
  7476 			// Set readyState
  7477 			jqXHR.readyState = status > 0 ? 4 : 0;
  7478 
  7479 			var isSuccess,
  7480 				success,
  7481 				error,
  7482 				statusText = nativeStatusText,
  7483 				response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
  7484 				lastModified,
  7485 				etag;
  7486 
  7487 			// If successful, handle type chaining
  7488 			if ( status >= 200 && status < 300 || status === 304 ) {
  7489 
  7490 				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  7491 				if ( s.ifModified ) {
  7492 
  7493 					if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
  7494 						jQuery.lastModified[ ifModifiedKey ] = lastModified;
  7495 					}
  7496 					if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
  7497 						jQuery.etag[ ifModifiedKey ] = etag;
  7498 					}
  7499 				}
  7500 
  7501 				// If not modified
  7502 				if ( status === 304 ) {
  7503 
  7504 					statusText = "notmodified";
  7505 					isSuccess = true;
  7506 
  7507 				// If we have data
  7508 				} else {
  7509 
  7510 					try {
  7511 						success = ajaxConvert( s, response );
  7512 						statusText = "success";
  7513 						isSuccess = true;
  7514 					} catch(e) {
  7515 						// We have a parsererror
  7516 						statusText = "parsererror";
  7517 						error = e;
  7518 					}
  7519 				}
  7520 			} else {
  7521 				// We extract error from statusText
  7522 				// then normalize statusText and status for non-aborts
  7523 				error = statusText;
  7524 				if ( !statusText || status ) {
  7525 					statusText = "error";
  7526 					if ( status < 0 ) {
  7527 						status = 0;
  7528 					}
  7529 				}
  7530 			}
  7531 
  7532 			// Set data for the fake xhr object
  7533 			jqXHR.status = status;
  7534 			jqXHR.statusText = "" + ( nativeStatusText || statusText );
  7535 
  7536 			// Success/Error
  7537 			if ( isSuccess ) {
  7538 				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
  7539 			} else {
  7540 				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
  7541 			}
  7542 
  7543 			// Status-dependent callbacks
  7544 			jqXHR.statusCode( statusCode );
  7545 			statusCode = undefined;
  7546 
  7547 			if ( fireGlobals ) {
  7548 				globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
  7549 						[ jqXHR, s, isSuccess ? success : error ] );
  7550 			}
  7551 
  7552 			// Complete
  7553 			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
  7554 
  7555 			if ( fireGlobals ) {
  7556 				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
  7557 				// Handle the global AJAX counter
  7558 				if ( !( --jQuery.active ) ) {
  7559 					jQuery.event.trigger( "ajaxStop" );
  7560 				}
  7561 			}
  7562 		}
  7563 
  7564 		// Attach deferreds
  7565 		deferred.promise( jqXHR );
  7566 		jqXHR.success = jqXHR.done;
  7567 		jqXHR.error = jqXHR.fail;
  7568 		jqXHR.complete = completeDeferred.add;
  7569 
  7570 		// Status-dependent callbacks
  7571 		jqXHR.statusCode = function( map ) {
  7572 			if ( map ) {
  7573 				var tmp;
  7574 				if ( state < 2 ) {
  7575 					for ( tmp in map ) {
  7576 						statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
  7577 					}
  7578 				} else {
  7579 					tmp = map[ jqXHR.status ];
  7580 					jqXHR.then( tmp, tmp );
  7581 				}
  7582 			}
  7583 			return this;
  7584 		};
  7585 
  7586 		// Remove hash character (#7531: and string promotion)
  7587 		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
  7588 		// We also use the url parameter if available
  7589 		s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
  7590 
  7591 		// Extract dataTypes list
  7592 		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
  7593 
  7594 		// Determine if a cross-domain request is in order
  7595 		if ( s.crossDomain == null ) {
  7596 			parts = rurl.exec( s.url.toLowerCase() );
  7597 			s.crossDomain = !!( parts &&
  7598 				( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
  7599 					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
  7600 						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
  7601 			);
  7602 		}
  7603 
  7604 		// Convert data if not already a string
  7605 		if ( s.data && s.processData && typeof s.data !== "string" ) {
  7606 			s.data = jQuery.param( s.data, s.traditional );
  7607 		}
  7608 
  7609 		// Apply prefilters
  7610 		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
  7611 
  7612 		// If request was aborted inside a prefilter, stop there
  7613 		if ( state === 2 ) {
  7614 			return false;
  7615 		}
  7616 
  7617 		// We can fire global events as of now if asked to
  7618 		fireGlobals = s.global;
  7619 
  7620 		// Uppercase the type
  7621 		s.type = s.type.toUpperCase();
  7622 
  7623 		// Determine if request has content
  7624 		s.hasContent = !rnoContent.test( s.type );
  7625 
  7626 		// Watch for a new set of requests
  7627 		if ( fireGlobals && jQuery.active++ === 0 ) {
  7628 			jQuery.event.trigger( "ajaxStart" );
  7629 		}
  7630 
  7631 		// More options handling for requests with no content
  7632 		if ( !s.hasContent ) {
  7633 
  7634 			// If data is available, append data to url
  7635 			if ( s.data ) {
  7636 				s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
  7637 				// #9682: remove data so that it's not used in an eventual retry
  7638 				delete s.data;
  7639 			}
  7640 
  7641 			// Get ifModifiedKey before adding the anti-cache parameter
  7642 			ifModifiedKey = s.url;
  7643 
  7644 			// Add anti-cache in url if needed
  7645 			if ( s.cache === false ) {
  7646 
  7647 				var ts = jQuery.now(),
  7648 					// try replacing _= if it is there
  7649 					ret = s.url.replace( rts, "$1_=" + ts );
  7650 
  7651 				// if nothing was replaced, add timestamp to the end
  7652 				s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
  7653 			}
  7654 		}
  7655 
  7656 		// Set the correct header, if data is being sent
  7657 		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
  7658 			jqXHR.setRequestHeader( "Content-Type", s.contentType );
  7659 		}
  7660 
  7661 		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
  7662 		if ( s.ifModified ) {
  7663 			ifModifiedKey = ifModifiedKey || s.url;
  7664 			if ( jQuery.lastModified[ ifModifiedKey ] ) {
  7665 				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
  7666 			}
  7667 			if ( jQuery.etag[ ifModifiedKey ] ) {
  7668 				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
  7669 			}
  7670 		}
  7671 
  7672 		// Set the Accepts header for the server, depending on the dataType
  7673 		jqXHR.setRequestHeader(
  7674 			"Accept",
  7675 			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
  7676 				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
  7677 				s.accepts[ "*" ]
  7678 		);
  7679 
  7680 		// Check for headers option
  7681 		for ( i in s.headers ) {
  7682 			jqXHR.setRequestHeader( i, s.headers[ i ] );
  7683 		}
  7684 
  7685 		// Allow custom headers/mimetypes and early abort
  7686 		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
  7687 				// Abort if not done already
  7688 				jqXHR.abort();
  7689 				return false;
  7690 
  7691 		}
  7692 
  7693 		// Install callbacks on deferreds
  7694 		for ( i in { success: 1, error: 1, complete: 1 } ) {
  7695 			jqXHR[ i ]( s[ i ] );
  7696 		}
  7697 
  7698 		// Get transport
  7699 		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
  7700 
  7701 		// If no transport, we auto-abort
  7702 		if ( !transport ) {
  7703 			done( -1, "No Transport" );
  7704 		} else {
  7705 			jqXHR.readyState = 1;
  7706 			// Send global event
  7707 			if ( fireGlobals ) {
  7708 				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
  7709 			}
  7710 			// Timeout
  7711 			if ( s.async && s.timeout > 0 ) {
  7712 				timeoutTimer = setTimeout( function(){
  7713 					jqXHR.abort( "timeout" );
  7714 				}, s.timeout );
  7715 			}
  7716 
  7717 			try {
  7718 				state = 1;
  7719 				transport.send( requestHeaders, done );
  7720 			} catch (e) {
  7721 				// Propagate exception as error if not done
  7722 				if ( state < 2 ) {
  7723 					done( -1, e );
  7724 				// Simply rethrow otherwise
  7725 				} else {
  7726 					throw e;
  7727 				}
  7728 			}
  7729 		}
  7730 
  7731 		return jqXHR;
  7732 	},
  7733 
  7734 	// Serialize an array of form elements or a set of
  7735 	// key/values into a query string
  7736 	param: function( a, traditional ) {
  7737 		var s = [],
  7738 			add = function( key, value ) {
  7739 				// If value is a function, invoke it and return its value
  7740 				value = jQuery.isFunction( value ) ? value() : value;
  7741 				s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
  7742 			};
  7743 
  7744 		// Set traditional to true for jQuery <= 1.3.2 behavior.
  7745 		if ( traditional === undefined ) {
  7746 			traditional = jQuery.ajaxSettings.traditional;
  7747 		}
  7748 
  7749 		// If an array was passed in, assume that it is an array of form elements.
  7750 		if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
  7751 			// Serialize the form elements
  7752 			jQuery.each( a, function() {
  7753 				add( this.name, this.value );
  7754 			});
  7755 
  7756 		} else {
  7757 			// If traditional, encode the "old" way (the way 1.3.2 or older
  7758 			// did it), otherwise encode params recursively.
  7759 			for ( var prefix in a ) {
  7760 				buildParams( prefix, a[ prefix ], traditional, add );
  7761 			}
  7762 		}
  7763 
  7764 		// Return the resulting serialization
  7765 		return s.join( "&" ).replace( r20, "+" );
  7766 	}
  7767 });
  7768 
  7769 function buildParams( prefix, obj, traditional, add ) {
  7770 	if ( jQuery.isArray( obj ) ) {
  7771 		// Serialize array item.
  7772 		jQuery.each( obj, function( i, v ) {
  7773 			if ( traditional || rbracket.test( prefix ) ) {
  7774 				// Treat each array item as a scalar.
  7775 				add( prefix, v );
  7776 
  7777 			} else {
  7778 				// If array item is non-scalar (array or object), encode its
  7779 				// numeric index to resolve deserialization ambiguity issues.
  7780 				// Note that rack (as of 1.0.0) can't currently deserialize
  7781 				// nested arrays properly, and attempting to do so may cause
  7782 				// a server error. Possible fixes are to modify rack's
  7783 				// deserialization algorithm or to provide an option or flag
  7784 				// to force array serialization to be shallow.
  7785 				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
  7786 			}
  7787 		});
  7788 
  7789 	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
  7790 		// Serialize object item.
  7791 		for ( var name in obj ) {
  7792 			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
  7793 		}
  7794 
  7795 	} else {
  7796 		// Serialize scalar item.
  7797 		add( prefix, obj );
  7798 	}
  7799 }
  7800 
  7801 // This is still on the jQuery object... for now
  7802 // Want to move this to jQuery.ajax some day
  7803 jQuery.extend({
  7804 
  7805 	// Counter for holding the number of active queries
  7806 	active: 0,
  7807 
  7808 	// Last-Modified header cache for next request
  7809 	lastModified: {},
  7810 	etag: {}
  7811 
  7812 });
  7813 
  7814 /* Handles responses to an ajax request:
  7815  * - sets all responseXXX fields accordingly
  7816  * - finds the right dataType (mediates between content-type and expected dataType)
  7817  * - returns the corresponding response
  7818  */
  7819 function ajaxHandleResponses( s, jqXHR, responses ) {
  7820 
  7821 	var contents = s.contents,
  7822 		dataTypes = s.dataTypes,
  7823 		responseFields = s.responseFields,
  7824 		ct,
  7825 		type,
  7826 		finalDataType,
  7827 		firstDataType;
  7828 
  7829 	// Fill responseXXX fields
  7830 	for ( type in responseFields ) {
  7831 		if ( type in responses ) {
  7832 			jqXHR[ responseFields[type] ] = responses[ type ];
  7833 		}
  7834 	}
  7835 
  7836 	// Remove auto dataType and get content-type in the process
  7837 	while( dataTypes[ 0 ] === "*" ) {
  7838 		dataTypes.shift();
  7839 		if ( ct === undefined ) {
  7840 			ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
  7841 		}
  7842 	}
  7843 
  7844 	// Check if we're dealing with a known content-type
  7845 	if ( ct ) {
  7846 		for ( type in contents ) {
  7847 			if ( contents[ type ] && contents[ type ].test( ct ) ) {
  7848 				dataTypes.unshift( type );
  7849 				break;
  7850 			}
  7851 		}
  7852 	}
  7853 
  7854 	// Check to see if we have a response for the expected dataType
  7855 	if ( dataTypes[ 0 ] in responses ) {
  7856 		finalDataType = dataTypes[ 0 ];
  7857 	} else {
  7858 		// Try convertible dataTypes
  7859 		for ( type in responses ) {
  7860 			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
  7861 				finalDataType = type;
  7862 				break;
  7863 			}
  7864 			if ( !firstDataType ) {
  7865 				firstDataType = type;
  7866 			}
  7867 		}
  7868 		// Or just use first one
  7869 		finalDataType = finalDataType || firstDataType;
  7870 	}
  7871 
  7872 	// If we found a dataType
  7873 	// We add the dataType to the list if needed
  7874 	// and return the corresponding response
  7875 	if ( finalDataType ) {
  7876 		if ( finalDataType !== dataTypes[ 0 ] ) {
  7877 			dataTypes.unshift( finalDataType );
  7878 		}
  7879 		return responses[ finalDataType ];
  7880 	}
  7881 }
  7882 
  7883 // Chain conversions given the request and the original response
  7884 function ajaxConvert( s, response ) {
  7885 
  7886 	// Apply the dataFilter if provided
  7887 	if ( s.dataFilter ) {
  7888 		response = s.dataFilter( response, s.dataType );
  7889 	}
  7890 
  7891 	var dataTypes = s.dataTypes,
  7892 		converters = {},
  7893 		i,
  7894 		key,
  7895 		length = dataTypes.length,
  7896 		tmp,
  7897 		// Current and previous dataTypes
  7898 		current = dataTypes[ 0 ],
  7899 		prev,
  7900 		// Conversion expression
  7901 		conversion,
  7902 		// Conversion function
  7903 		conv,
  7904 		// Conversion functions (transitive conversion)
  7905 		conv1,
  7906 		conv2;
  7907 
  7908 	// For each dataType in the chain
  7909 	for ( i = 1; i < length; i++ ) {
  7910 
  7911 		// Create converters map
  7912 		// with lowercased keys
  7913 		if ( i === 1 ) {
  7914 			for ( key in s.converters ) {
  7915 				if ( typeof key === "string" ) {
  7916 					converters[ key.toLowerCase() ] = s.converters[ key ];
  7917 				}
  7918 			}
  7919 		}
  7920 
  7921 		// Get the dataTypes
  7922 		prev = current;
  7923 		current = dataTypes[ i ];
  7924 
  7925 		// If current is auto dataType, update it to prev
  7926 		if ( current === "*" ) {
  7927 			current = prev;
  7928 		// If no auto and dataTypes are actually different
  7929 		} else if ( prev !== "*" && prev !== current ) {
  7930 
  7931 			// Get the converter
  7932 			conversion = prev + " " + current;
  7933 			conv = converters[ conversion ] || converters[ "* " + current ];
  7934 
  7935 			// If there is no direct converter, search transitively
  7936 			if ( !conv ) {
  7937 				conv2 = undefined;
  7938 				for ( conv1 in converters ) {
  7939 					tmp = conv1.split( " " );
  7940 					if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
  7941 						conv2 = converters[ tmp[1] + " " + current ];
  7942 						if ( conv2 ) {
  7943 							conv1 = converters[ conv1 ];
  7944 							if ( conv1 === true ) {
  7945 								conv = conv2;
  7946 							} else if ( conv2 === true ) {
  7947 								conv = conv1;
  7948 							}
  7949 							break;
  7950 						}
  7951 					}
  7952 				}
  7953 			}
  7954 			// If we found no converter, dispatch an error
  7955 			if ( !( conv || conv2 ) ) {
  7956 				jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
  7957 			}
  7958 			// If found converter is not an equivalence
  7959 			if ( conv !== true ) {
  7960 				// Convert with 1 or 2 converters accordingly
  7961 				response = conv ? conv( response ) : conv2( conv1(response) );
  7962 			}
  7963 		}
  7964 	}
  7965 	return response;
  7966 }
  7967 
  7968 
  7969 
  7970 
  7971 var jsc = jQuery.now(),
  7972 	jsre = /(\=)\?(&|$)|\?\?/i;
  7973 
  7974 // Default jsonp settings
  7975 jQuery.ajaxSetup({
  7976 	jsonp: "callback",
  7977 	jsonpCallback: function() {
  7978 		return jQuery.expando + "_" + ( jsc++ );
  7979 	}
  7980 });
  7981 
  7982 // Detect, normalize options and install callbacks for jsonp requests
  7983 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
  7984 
  7985 	var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
  7986 
  7987 	if ( s.dataTypes[ 0 ] === "jsonp" ||
  7988 		s.jsonp !== false && ( jsre.test( s.url ) ||
  7989 				inspectData && jsre.test( s.data ) ) ) {
  7990 
  7991 		var responseContainer,
  7992 			jsonpCallback = s.jsonpCallback =
  7993 				jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
  7994 			previous = window[ jsonpCallback ],
  7995 			url = s.url,
  7996 			data = s.data,
  7997 			replace = "$1" + jsonpCallback + "$2";
  7998 
  7999 		if ( s.jsonp !== false ) {
  8000 			url = url.replace( jsre, replace );
  8001 			if ( s.url === url ) {
  8002 				if ( inspectData ) {
  8003 					data = data.replace( jsre, replace );
  8004 				}
  8005 				if ( s.data === data ) {
  8006 					// Add callback manually
  8007 					url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
  8008 				}
  8009 			}
  8010 		}
  8011 
  8012 		s.url = url;
  8013 		s.data = data;
  8014 
  8015 		// Install callback
  8016 		window[ jsonpCallback ] = function( response ) {
  8017 			responseContainer = [ response ];
  8018 		};
  8019 
  8020 		// Clean-up function
  8021 		jqXHR.always(function() {
  8022 			// Set callback back to previous value
  8023 			window[ jsonpCallback ] = previous;
  8024 			// Call if it was a function and we have a response
  8025 			if ( responseContainer && jQuery.isFunction( previous ) ) {
  8026 				window[ jsonpCallback ]( responseContainer[ 0 ] );
  8027 			}
  8028 		});
  8029 
  8030 		// Use data converter to retrieve json after script execution
  8031 		s.converters["script json"] = function() {
  8032 			if ( !responseContainer ) {
  8033 				jQuery.error( jsonpCallback + " was not called" );
  8034 			}
  8035 			return responseContainer[ 0 ];
  8036 		};
  8037 
  8038 		// force json dataType
  8039 		s.dataTypes[ 0 ] = "json";
  8040 
  8041 		// Delegate to script
  8042 		return "script";
  8043 	}
  8044 });
  8045 
  8046 
  8047 
  8048 
  8049 // Install script dataType
  8050 jQuery.ajaxSetup({
  8051 	accepts: {
  8052 		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
  8053 	},
  8054 	contents: {
  8055 		script: /javascript|ecmascript/
  8056 	},
  8057 	converters: {
  8058 		"text script": function( text ) {
  8059 			jQuery.globalEval( text );
  8060 			return text;
  8061 		}
  8062 	}
  8063 });
  8064 
  8065 // Handle cache's special case and global
  8066 jQuery.ajaxPrefilter( "script", function( s ) {
  8067 	if ( s.cache === undefined ) {
  8068 		s.cache = false;
  8069 	}
  8070 	if ( s.crossDomain ) {
  8071 		s.type = "GET";
  8072 		s.global = false;
  8073 	}
  8074 });
  8075 
  8076 // Bind script tag hack transport
  8077 jQuery.ajaxTransport( "script", function(s) {
  8078 
  8079 	// This transport only deals with cross domain requests
  8080 	if ( s.crossDomain ) {
  8081 
  8082 		var script,
  8083 			head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
  8084 
  8085 		return {
  8086 
  8087 			send: function( _, callback ) {
  8088 
  8089 				script = document.createElement( "script" );
  8090 
  8091 				script.async = "async";
  8092 
  8093 				if ( s.scriptCharset ) {
  8094 					script.charset = s.scriptCharset;
  8095 				}
  8096 
  8097 				script.src = s.url;
  8098 
  8099 				// Attach handlers for all browsers
  8100 				script.onload = script.onreadystatechange = function( _, isAbort ) {
  8101 
  8102 					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
  8103 
  8104 						// Handle memory leak in IE
  8105 						script.onload = script.onreadystatechange = null;
  8106 
  8107 						// Remove the script
  8108 						if ( head && script.parentNode ) {
  8109 							head.removeChild( script );
  8110 						}
  8111 
  8112 						// Dereference the script
  8113 						script = undefined;
  8114 
  8115 						// Callback if not abort
  8116 						if ( !isAbort ) {
  8117 							callback( 200, "success" );
  8118 						}
  8119 					}
  8120 				};
  8121 				// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
  8122 				// This arises when a base node is used (#2709 and #4378).
  8123 				head.insertBefore( script, head.firstChild );
  8124 			},
  8125 
  8126 			abort: function() {
  8127 				if ( script ) {
  8128 					script.onload( 0, 1 );
  8129 				}
  8130 			}
  8131 		};
  8132 	}
  8133 });
  8134 
  8135 
  8136 
  8137 
  8138 var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
  8139 	xhrOnUnloadAbort = window.ActiveXObject ? function() {
  8140 		// Abort all pending requests
  8141 		for ( var key in xhrCallbacks ) {
  8142 			xhrCallbacks[ key ]( 0, 1 );
  8143 		}
  8144 	} : false,
  8145 	xhrId = 0,
  8146 	xhrCallbacks;
  8147 
  8148 // Functions to create xhrs
  8149 function createStandardXHR() {
  8150 	try {
  8151 		return new window.XMLHttpRequest();
  8152 	} catch( e ) {}
  8153 }
  8154 
  8155 function createActiveXHR() {
  8156 	try {
  8157 		return new window.ActiveXObject( "Microsoft.XMLHTTP" );
  8158 	} catch( e ) {}
  8159 }
  8160 
  8161 // Create the request object
  8162 // (This is still attached to ajaxSettings for backward compatibility)
  8163 jQuery.ajaxSettings.xhr = window.ActiveXObject ?
  8164 	/* Microsoft failed to properly
  8165 	 * implement the XMLHttpRequest in IE7 (can't request local files),
  8166 	 * so we use the ActiveXObject when it is available
  8167 	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
  8168 	 * we need a fallback.
  8169 	 */
  8170 	function() {
  8171 		return !this.isLocal && createStandardXHR() || createActiveXHR();
  8172 	} :
  8173 	// For all other browsers, use the standard XMLHttpRequest object
  8174 	createStandardXHR;
  8175 
  8176 // Determine support properties
  8177 (function( xhr ) {
  8178 	jQuery.extend( jQuery.support, {
  8179 		ajax: !!xhr,
  8180 		cors: !!xhr && ( "withCredentials" in xhr )
  8181 	});
  8182 })( jQuery.ajaxSettings.xhr() );
  8183 
  8184 // Create transport if the browser can provide an xhr
  8185 if ( jQuery.support.ajax ) {
  8186 
  8187 	jQuery.ajaxTransport(function( s ) {
  8188 		// Cross domain only allowed if supported through XMLHttpRequest
  8189 		if ( !s.crossDomain || jQuery.support.cors ) {
  8190 
  8191 			var callback;
  8192 
  8193 			return {
  8194 				send: function( headers, complete ) {
  8195 
  8196 					// Get a new xhr
  8197 					var xhr = s.xhr(),
  8198 						handle,
  8199 						i;
  8200 
  8201 					// Open the socket
  8202 					// Passing null username, generates a login popup on Opera (#2865)
  8203 					if ( s.username ) {
  8204 						xhr.open( s.type, s.url, s.async, s.username, s.password );
  8205 					} else {
  8206 						xhr.open( s.type, s.url, s.async );
  8207 					}
  8208 
  8209 					// Apply custom fields if provided
  8210 					if ( s.xhrFields ) {
  8211 						for ( i in s.xhrFields ) {
  8212 							xhr[ i ] = s.xhrFields[ i ];
  8213 						}
  8214 					}
  8215 
  8216 					// Override mime type if needed
  8217 					if ( s.mimeType && xhr.overrideMimeType ) {
  8218 						xhr.overrideMimeType( s.mimeType );
  8219 					}
  8220 
  8221 					// X-Requested-With header
  8222 					// For cross-domain requests, seeing as conditions for a preflight are
  8223 					// akin to a jigsaw puzzle, we simply never set it to be sure.
  8224 					// (it can always be set on a per-request basis or even using ajaxSetup)
  8225 					// For same-domain requests, won't change header if already provided.
  8226 					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
  8227 						headers[ "X-Requested-With" ] = "XMLHttpRequest";
  8228 					}
  8229 
  8230 					// Need an extra try/catch for cross domain requests in Firefox 3
  8231 					try {
  8232 						for ( i in headers ) {
  8233 							xhr.setRequestHeader( i, headers[ i ] );
  8234 						}
  8235 					} catch( _ ) {}
  8236 
  8237 					// Do send the request
  8238 					// This may raise an exception which is actually
  8239 					// handled in jQuery.ajax (so no try/catch here)
  8240 					xhr.send( ( s.hasContent && s.data ) || null );
  8241 
  8242 					// Listener
  8243 					callback = function( _, isAbort ) {
  8244 
  8245 						var status,
  8246 							statusText,
  8247 							responseHeaders,
  8248 							responses,
  8249 							xml;
  8250 
  8251 						// Firefox throws exceptions when accessing properties
  8252 						// of an xhr when a network error occured
  8253 						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
  8254 						try {
  8255 
  8256 							// Was never called and is aborted or complete
  8257 							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
  8258 
  8259 								// Only called once
  8260 								callback = undefined;
  8261 
  8262 								// Do not keep as active anymore
  8263 								if ( handle ) {
  8264 									xhr.onreadystatechange = jQuery.noop;
  8265 									if ( xhrOnUnloadAbort ) {
  8266 										delete xhrCallbacks[ handle ];
  8267 									}
  8268 								}
  8269 
  8270 								// If it's an abort
  8271 								if ( isAbort ) {
  8272 									// Abort it manually if needed
  8273 									if ( xhr.readyState !== 4 ) {
  8274 										xhr.abort();
  8275 									}
  8276 								} else {
  8277 									status = xhr.status;
  8278 									responseHeaders = xhr.getAllResponseHeaders();
  8279 									responses = {};
  8280 									xml = xhr.responseXML;
  8281 
  8282 									// Construct response list
  8283 									if ( xml && xml.documentElement /* #4958 */ ) {
  8284 										responses.xml = xml;
  8285 									}
  8286 
  8287 									// When requesting binary data, IE6-9 will throw an exception
  8288 									// on any attempt to access responseText (#11426)
  8289 									try {
  8290 										responses.text = xhr.responseText;
  8291 									} catch( _ ) {
  8292 									}
  8293 
  8294 									// Firefox throws an exception when accessing
  8295 									// statusText for faulty cross-domain requests
  8296 									try {
  8297 										statusText = xhr.statusText;
  8298 									} catch( e ) {
  8299 										// We normalize with Webkit giving an empty statusText
  8300 										statusText = "";
  8301 									}
  8302 
  8303 									// Filter status for non standard behaviors
  8304 
  8305 									// If the request is local and we have data: assume a success
  8306 									// (success with no data won't get notified, that's the best we
  8307 									// can do given current implementations)
  8308 									if ( !status && s.isLocal && !s.crossDomain ) {
  8309 										status = responses.text ? 200 : 404;
  8310 									// IE - #1450: sometimes returns 1223 when it should be 204
  8311 									} else if ( status === 1223 ) {
  8312 										status = 204;
  8313 									}
  8314 								}
  8315 							}
  8316 						} catch( firefoxAccessException ) {
  8317 							if ( !isAbort ) {
  8318 								complete( -1, firefoxAccessException );
  8319 							}
  8320 						}
  8321 
  8322 						// Call complete if needed
  8323 						if ( responses ) {
  8324 							complete( status, statusText, responses, responseHeaders );
  8325 						}
  8326 					};
  8327 
  8328 					// if we're in sync mode or it's in cache
  8329 					// and has been retrieved directly (IE6 & IE7)
  8330 					// we need to manually fire the callback
  8331 					if ( !s.async || xhr.readyState === 4 ) {
  8332 						callback();
  8333 					} else {
  8334 						handle = ++xhrId;
  8335 						if ( xhrOnUnloadAbort ) {
  8336 							// Create the active xhrs callbacks list if needed
  8337 							// and attach the unload handler
  8338 							if ( !xhrCallbacks ) {
  8339 								xhrCallbacks = {};
  8340 								jQuery( window ).unload( xhrOnUnloadAbort );
  8341 							}
  8342 							// Add to list of active xhrs callbacks
  8343 							xhrCallbacks[ handle ] = callback;
  8344 						}
  8345 						xhr.onreadystatechange = callback;
  8346 					}
  8347 				},
  8348 
  8349 				abort: function() {
  8350 					if ( callback ) {
  8351 						callback(0,1);
  8352 					}
  8353 				}
  8354 			};
  8355 		}
  8356 	});
  8357 }
  8358 
  8359 
  8360 
  8361 
  8362 var elemdisplay = {},
  8363 	iframe, iframeDoc,
  8364 	rfxtypes = /^(?:toggle|show|hide)$/,
  8365 	rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
  8366 	timerId,
  8367 	fxAttrs = [
  8368 		// height animations
  8369 		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
  8370 		// width animations
  8371 		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
  8372 		// opacity animations
  8373 		[ "opacity" ]
  8374 	],
  8375 	fxNow;
  8376 
  8377 jQuery.fn.extend({
  8378 	show: function( speed, easing, callback ) {
  8379 		var elem, display;
  8380 
  8381 		if ( speed || speed === 0 ) {
  8382 			return this.animate( genFx("show", 3), speed, easing, callback );
  8383 
  8384 		} else {
  8385 			for ( var i = 0, j = this.length; i < j; i++ ) {
  8386 				elem = this[ i ];
  8387 
  8388 				if ( elem.style ) {
  8389 					display = elem.style.display;
  8390 
  8391 					// Reset the inline display of this element to learn if it is
  8392 					// being hidden by cascaded rules or not
  8393 					if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
  8394 						display = elem.style.display = "";
  8395 					}
  8396 
  8397 					// Set elements which have been overridden with display: none
  8398 					// in a stylesheet to whatever the default browser style is
  8399 					// for such an element
  8400 					if ( (display === "" && jQuery.css(elem, "display") === "none") ||
  8401 						!jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
  8402 						jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
  8403 					}
  8404 				}
  8405 			}
  8406 
  8407 			// Set the display of most of the elements in a second loop
  8408 			// to avoid the constant reflow
  8409 			for ( i = 0; i < j; i++ ) {
  8410 				elem = this[ i ];
  8411 
  8412 				if ( elem.style ) {
  8413 					display = elem.style.display;
  8414 
  8415 					if ( display === "" || display === "none" ) {
  8416 						elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
  8417 					}
  8418 				}
  8419 			}
  8420 
  8421 			return this;
  8422 		}
  8423 	},
  8424 
  8425 	hide: function( speed, easing, callback ) {
  8426 		if ( speed || speed === 0 ) {
  8427 			return this.animate( genFx("hide", 3), speed, easing, callback);
  8428 
  8429 		} else {
  8430 			var elem, display,
  8431 				i = 0,
  8432 				j = this.length;
  8433 
  8434 			for ( ; i < j; i++ ) {
  8435 				elem = this[i];
  8436 				if ( elem.style ) {
  8437 					display = jQuery.css( elem, "display" );
  8438 
  8439 					if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
  8440 						jQuery._data( elem, "olddisplay", display );
  8441 					}
  8442 				}
  8443 			}
  8444 
  8445 			// Set the display of the elements in a second loop
  8446 			// to avoid the constant reflow
  8447 			for ( i = 0; i < j; i++ ) {
  8448 				if ( this[i].style ) {
  8449 					this[i].style.display = "none";
  8450 				}
  8451 			}
  8452 
  8453 			return this;
  8454 		}
  8455 	},
  8456 
  8457 	// Save the old toggle function
  8458 	_toggle: jQuery.fn.toggle,
  8459 
  8460 	toggle: function( fn, fn2, callback ) {
  8461 		var bool = typeof fn === "boolean";
  8462 
  8463 		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
  8464 			this._toggle.apply( this, arguments );
  8465 
  8466 		} else if ( fn == null || bool ) {
  8467 			this.each(function() {
  8468 				var state = bool ? fn : jQuery(this).is(":hidden");
  8469 				jQuery(this)[ state ? "show" : "hide" ]();
  8470 			});
  8471 
  8472 		} else {
  8473 			this.animate(genFx("toggle", 3), fn, fn2, callback);
  8474 		}
  8475 
  8476 		return this;
  8477 	},
  8478 
  8479 	fadeTo: function( speed, to, easing, callback ) {
  8480 		return this.filter(":hidden").css("opacity", 0).show().end()
  8481 					.animate({opacity: to}, speed, easing, callback);
  8482 	},
  8483 
  8484 	animate: function( prop, speed, easing, callback ) {
  8485 		var optall = jQuery.speed( speed, easing, callback );
  8486 
  8487 		if ( jQuery.isEmptyObject( prop ) ) {
  8488 			return this.each( optall.complete, [ false ] );
  8489 		}
  8490 
  8491 		// Do not change referenced properties as per-property easing will be lost
  8492 		prop = jQuery.extend( {}, prop );
  8493 
  8494 		function doAnimation() {
  8495 			// XXX 'this' does not always have a nodeName when running the
  8496 			// test suite
  8497 
  8498 			if ( optall.queue === false ) {
  8499 				jQuery._mark( this );
  8500 			}
  8501 
  8502 			var opt = jQuery.extend( {}, optall ),
  8503 				isElement = this.nodeType === 1,
  8504 				hidden = isElement && jQuery(this).is(":hidden"),
  8505 				name, val, p, e, hooks, replace,
  8506 				parts, start, end, unit,
  8507 				method;
  8508 
  8509 			// will store per property easing and be used to determine when an animation is complete
  8510 			opt.animatedProperties = {};
  8511 
  8512 			// first pass over propertys to expand / normalize
  8513 			for ( p in prop ) {
  8514 				name = jQuery.camelCase( p );
  8515 				if ( p !== name ) {
  8516 					prop[ name ] = prop[ p ];
  8517 					delete prop[ p ];
  8518 				}
  8519 
  8520 				if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
  8521 					replace = hooks.expand( prop[ name ] );
  8522 					delete prop[ name ];
  8523 
  8524 					// not quite $.extend, this wont overwrite keys already present.
  8525 					// also - reusing 'p' from above because we have the correct "name"
  8526 					for ( p in replace ) {
  8527 						if ( ! ( p in prop ) ) {
  8528 							prop[ p ] = replace[ p ];
  8529 						}
  8530 					}
  8531 				}
  8532 			}
  8533 
  8534 			for ( name in prop ) {
  8535 				val = prop[ name ];
  8536 				// easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
  8537 				if ( jQuery.isArray( val ) ) {
  8538 					opt.animatedProperties[ name ] = val[ 1 ];
  8539 					val = prop[ name ] = val[ 0 ];
  8540 				} else {
  8541 					opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
  8542 				}
  8543 
  8544 				if ( val === "hide" && hidden || val === "show" && !hidden ) {
  8545 					return opt.complete.call( this );
  8546 				}
  8547 
  8548 				if ( isElement && ( name === "height" || name === "width" ) ) {
  8549 					// Make sure that nothing sneaks out
  8550 					// Record all 3 overflow attributes because IE does not
  8551 					// change the overflow attribute when overflowX and
  8552 					// overflowY are set to the same value
  8553 					opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
  8554 
  8555 					// Set display property to inline-block for height/width
  8556 					// animations on inline elements that are having width/height animated
  8557 					if ( jQuery.css( this, "display" ) === "inline" &&
  8558 							jQuery.css( this, "float" ) === "none" ) {
  8559 
  8560 						// inline-level elements accept inline-block;
  8561 						// block-level elements need to be inline with layout
  8562 						if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
  8563 							this.style.display = "inline-block";
  8564 
  8565 						} else {
  8566 							this.style.zoom = 1;
  8567 						}
  8568 					}
  8569 				}
  8570 			}
  8571 
  8572 			if ( opt.overflow != null ) {
  8573 				this.style.overflow = "hidden";
  8574 			}
  8575 
  8576 			for ( p in prop ) {
  8577 				e = new jQuery.fx( this, opt, p );
  8578 				val = prop[ p ];
  8579 
  8580 				if ( rfxtypes.test( val ) ) {
  8581 
  8582 					// Tracks whether to show or hide based on private
  8583 					// data attached to the element
  8584 					method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
  8585 					if ( method ) {
  8586 						jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
  8587 						e[ method ]();
  8588 					} else {
  8589 						e[ val ]();
  8590 					}
  8591 
  8592 				} else {
  8593 					parts = rfxnum.exec( val );
  8594 					start = e.cur();
  8595 
  8596 					if ( parts ) {
  8597 						end = parseFloat( parts[2] );
  8598 						unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
  8599 
  8600 						// We need to compute starting value
  8601 						if ( unit !== "px" ) {
  8602 							jQuery.style( this, p, (end || 1) + unit);
  8603 							start = ( (end || 1) / e.cur() ) * start;
  8604 							jQuery.style( this, p, start + unit);
  8605 						}
  8606 
  8607 						// If a +=/-= token was provided, we're doing a relative animation
  8608 						if ( parts[1] ) {
  8609 							end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
  8610 						}
  8611 
  8612 						e.custom( start, end, unit );
  8613 
  8614 					} else {
  8615 						e.custom( start, val, "" );
  8616 					}
  8617 				}
  8618 			}
  8619 
  8620 			// For JS strict compliance
  8621 			return true;
  8622 		}
  8623 
  8624 		return optall.queue === false ?
  8625 			this.each( doAnimation ) :
  8626 			this.queue( optall.queue, doAnimation );
  8627 	},
  8628 
  8629 	stop: function( type, clearQueue, gotoEnd ) {
  8630 		if ( typeof type !== "string" ) {
  8631 			gotoEnd = clearQueue;
  8632 			clearQueue = type;
  8633 			type = undefined;
  8634 		}
  8635 		if ( clearQueue && type !== false ) {
  8636 			this.queue( type || "fx", [] );
  8637 		}
  8638 
  8639 		return this.each(function() {
  8640 			var index,
  8641 				hadTimers = false,
  8642 				timers = jQuery.timers,
  8643 				data = jQuery._data( this );
  8644 
  8645 			// clear marker counters if we know they won't be
  8646 			if ( !gotoEnd ) {
  8647 				jQuery._unmark( true, this );
  8648 			}
  8649 
  8650 			function stopQueue( elem, data, index ) {
  8651 				var hooks = data[ index ];
  8652 				jQuery.removeData( elem, index, true );
  8653 				hooks.stop( gotoEnd );
  8654 			}
  8655 
  8656 			if ( type == null ) {
  8657 				for ( index in data ) {
  8658 					if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
  8659 						stopQueue( this, data, index );
  8660 					}
  8661 				}
  8662 			} else if ( data[ index = type + ".run" ] && data[ index ].stop ){
  8663 				stopQueue( this, data, index );
  8664 			}
  8665 
  8666 			for ( index = timers.length; index--; ) {
  8667 				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
  8668 					if ( gotoEnd ) {
  8669 
  8670 						// force the next step to be the last
  8671 						timers[ index ]( true );
  8672 					} else {
  8673 						timers[ index ].saveState();
  8674 					}
  8675 					hadTimers = true;
  8676 					timers.splice( index, 1 );
  8677 				}
  8678 			}
  8679 
  8680 			// start the next in the queue if the last step wasn't forced
  8681 			// timers currently will call their complete callbacks, which will dequeue
  8682 			// but only if they were gotoEnd
  8683 			if ( !( gotoEnd && hadTimers ) ) {
  8684 				jQuery.dequeue( this, type );
  8685 			}
  8686 		});
  8687 	}
  8688 
  8689 });
  8690 
  8691 // Animations created synchronously will run synchronously
  8692 function createFxNow() {
  8693 	setTimeout( clearFxNow, 0 );
  8694 	return ( fxNow = jQuery.now() );
  8695 }
  8696 
  8697 function clearFxNow() {
  8698 	fxNow = undefined;
  8699 }
  8700 
  8701 // Generate parameters to create a standard animation
  8702 function genFx( type, num ) {
  8703 	var obj = {};
  8704 
  8705 	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
  8706 		obj[ this ] = type;
  8707 	});
  8708 
  8709 	return obj;
  8710 }
  8711 
  8712 // Generate shortcuts for custom animations
  8713 jQuery.each({
  8714 	slideDown: genFx( "show", 1 ),
  8715 	slideUp: genFx( "hide", 1 ),
  8716 	slideToggle: genFx( "toggle", 1 ),
  8717 	fadeIn: { opacity: "show" },
  8718 	fadeOut: { opacity: "hide" },
  8719 	fadeToggle: { opacity: "toggle" }
  8720 }, function( name, props ) {
  8721 	jQuery.fn[ name ] = function( speed, easing, callback ) {
  8722 		return this.animate( props, speed, easing, callback );
  8723 	};
  8724 });
  8725 
  8726 jQuery.extend({
  8727 	speed: function( speed, easing, fn ) {
  8728 		var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
  8729 			complete: fn || !fn && easing ||
  8730 				jQuery.isFunction( speed ) && speed,
  8731 			duration: speed,
  8732 			easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
  8733 		};
  8734 
  8735 		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
  8736 			opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
  8737 
  8738 		// normalize opt.queue - true/undefined/null -> "fx"
  8739 		if ( opt.queue == null || opt.queue === true ) {
  8740 			opt.queue = "fx";
  8741 		}
  8742 
  8743 		// Queueing
  8744 		opt.old = opt.complete;
  8745 
  8746 		opt.complete = function( noUnmark ) {
  8747 			if ( jQuery.isFunction( opt.old ) ) {
  8748 				opt.old.call( this );
  8749 			}
  8750 
  8751 			if ( opt.queue ) {
  8752 				jQuery.dequeue( this, opt.queue );
  8753 			} else if ( noUnmark !== false ) {
  8754 				jQuery._unmark( this );
  8755 			}
  8756 		};
  8757 
  8758 		return opt;
  8759 	},
  8760 
  8761 	easing: {
  8762 		linear: function( p ) {
  8763 			return p;
  8764 		},
  8765 		swing: function( p ) {
  8766 			return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
  8767 		}
  8768 	},
  8769 
  8770 	timers: [],
  8771 
  8772 	fx: function( elem, options, prop ) {
  8773 		this.options = options;
  8774 		this.elem = elem;
  8775 		this.prop = prop;
  8776 
  8777 		options.orig = options.orig || {};
  8778 	}
  8779 
  8780 });
  8781 
  8782 jQuery.fx.prototype = {
  8783 	// Simple function for setting a style value
  8784 	update: function() {
  8785 		if ( this.options.step ) {
  8786 			this.options.step.call( this.elem, this.now, this );
  8787 		}
  8788 
  8789 		( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
  8790 	},
  8791 
  8792 	// Get the current size
  8793 	cur: function() {
  8794 		if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
  8795 			return this.elem[ this.prop ];
  8796 		}
  8797 
  8798 		var parsed,
  8799 			r = jQuery.css( this.elem, this.prop );
  8800 		// Empty strings, null, undefined and "auto" are converted to 0,
  8801 		// complex values such as "rotate(1rad)" are returned as is,
  8802 		// simple values such as "10px" are parsed to Float.
  8803 		return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
  8804 	},
  8805 
  8806 	// Start an animation from one number to another
  8807 	custom: function( from, to, unit ) {
  8808 		var self = this,
  8809 			fx = jQuery.fx;
  8810 
  8811 		this.startTime = fxNow || createFxNow();
  8812 		this.end = to;
  8813 		this.now = this.start = from;
  8814 		this.pos = this.state = 0;
  8815 		this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
  8816 
  8817 		function t( gotoEnd ) {
  8818 			return self.step( gotoEnd );
  8819 		}
  8820 
  8821 		t.queue = this.options.queue;
  8822 		t.elem = this.elem;
  8823 		t.saveState = function() {
  8824 			if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
  8825 				if ( self.options.hide ) {
  8826 					jQuery._data( self.elem, "fxshow" + self.prop, self.start );
  8827 				} else if ( self.options.show ) {
  8828 					jQuery._data( self.elem, "fxshow" + self.prop, self.end );
  8829 				}
  8830 			}
  8831 		};
  8832 
  8833 		if ( t() && jQuery.timers.push(t) && !timerId ) {
  8834 			timerId = setInterval( fx.tick, fx.interval );
  8835 		}
  8836 	},
  8837 
  8838 	// Simple 'show' function
  8839 	show: function() {
  8840 		var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
  8841 
  8842 		// Remember where we started, so that we can go back to it later
  8843 		this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
  8844 		this.options.show = true;
  8845 
  8846 		// Begin the animation
  8847 		// Make sure that we start at a small width/height to avoid any flash of content
  8848 		if ( dataShow !== undefined ) {
  8849 			// This show is picking up where a previous hide or show left off
  8850 			this.custom( this.cur(), dataShow );
  8851 		} else {
  8852 			this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
  8853 		}
  8854 
  8855 		// Start by showing the element
  8856 		jQuery( this.elem ).show();
  8857 	},
  8858 
  8859 	// Simple 'hide' function
  8860 	hide: function() {
  8861 		// Remember where we started, so that we can go back to it later
  8862 		this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
  8863 		this.options.hide = true;
  8864 
  8865 		// Begin the animation
  8866 		this.custom( this.cur(), 0 );
  8867 	},
  8868 
  8869 	// Each step of an animation
  8870 	step: function( gotoEnd ) {
  8871 		var p, n, complete,
  8872 			t = fxNow || createFxNow(),
  8873 			done = true,
  8874 			elem = this.elem,
  8875 			options = this.options;
  8876 
  8877 		if ( gotoEnd || t >= options.duration + this.startTime ) {
  8878 			this.now = this.end;
  8879 			this.pos = this.state = 1;
  8880 			this.update();
  8881 
  8882 			options.animatedProperties[ this.prop ] = true;
  8883 
  8884 			for ( p in options.animatedProperties ) {
  8885 				if ( options.animatedProperties[ p ] !== true ) {
  8886 					done = false;
  8887 				}
  8888 			}
  8889 
  8890 			if ( done ) {
  8891 				// Reset the overflow
  8892 				if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
  8893 
  8894 					jQuery.each( [ "", "X", "Y" ], function( index, value ) {
  8895 						elem.style[ "overflow" + value ] = options.overflow[ index ];
  8896 					});
  8897 				}
  8898 
  8899 				// Hide the element if the "hide" operation was done
  8900 				if ( options.hide ) {
  8901 					jQuery( elem ).hide();
  8902 				}
  8903 
  8904 				// Reset the properties, if the item has been hidden or shown
  8905 				if ( options.hide || options.show ) {
  8906 					for ( p in options.animatedProperties ) {
  8907 						jQuery.style( elem, p, options.orig[ p ] );
  8908 						jQuery.removeData( elem, "fxshow" + p, true );
  8909 						// Toggle data is no longer needed
  8910 						jQuery.removeData( elem, "toggle" + p, true );
  8911 					}
  8912 				}
  8913 
  8914 				// Execute the complete function
  8915 				// in the event that the complete function throws an exception
  8916 				// we must ensure it won't be called twice. #5684
  8917 
  8918 				complete = options.complete;
  8919 				if ( complete ) {
  8920 
  8921 					options.complete = false;
  8922 					complete.call( elem );
  8923 				}
  8924 			}
  8925 
  8926 			return false;
  8927 
  8928 		} else {
  8929 			// classical easing cannot be used with an Infinity duration
  8930 			if ( options.duration == Infinity ) {
  8931 				this.now = t;
  8932 			} else {
  8933 				n = t - this.startTime;
  8934 				this.state = n / options.duration;
  8935 
  8936 				// Perform the easing function, defaults to swing
  8937 				this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
  8938 				this.now = this.start + ( (this.end - this.start) * this.pos );
  8939 			}
  8940 			// Perform the next step of the animation
  8941 			this.update();
  8942 		}
  8943 
  8944 		return true;
  8945 	}
  8946 };
  8947 
  8948 jQuery.extend( jQuery.fx, {
  8949 	tick: function() {
  8950 		var timer,
  8951 			timers = jQuery.timers,
  8952 			i = 0;
  8953 
  8954 		for ( ; i < timers.length; i++ ) {
  8955 			timer = timers[ i ];
  8956 			// Checks the timer has not already been removed
  8957 			if ( !timer() && timers[ i ] === timer ) {
  8958 				timers.splice( i--, 1 );
  8959 			}
  8960 		}
  8961 
  8962 		if ( !timers.length ) {
  8963 			jQuery.fx.stop();
  8964 		}
  8965 	},
  8966 
  8967 	interval: 13,
  8968 
  8969 	stop: function() {
  8970 		clearInterval( timerId );
  8971 		timerId = null;
  8972 	},
  8973 
  8974 	speeds: {
  8975 		slow: 600,
  8976 		fast: 200,
  8977 		// Default speed
  8978 		_default: 400
  8979 	},
  8980 
  8981 	step: {
  8982 		opacity: function( fx ) {
  8983 			jQuery.style( fx.elem, "opacity", fx.now );
  8984 		},
  8985 
  8986 		_default: function( fx ) {
  8987 			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
  8988 				fx.elem.style[ fx.prop ] = fx.now + fx.unit;
  8989 			} else {
  8990 				fx.elem[ fx.prop ] = fx.now;
  8991 			}
  8992 		}
  8993 	}
  8994 });
  8995 
  8996 // Ensure props that can't be negative don't go there on undershoot easing
  8997 jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
  8998 	// exclude marginTop, marginLeft, marginBottom and marginRight from this list
  8999 	if ( prop.indexOf( "margin" ) ) {
  9000 		jQuery.fx.step[ prop ] = function( fx ) {
  9001 			jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
  9002 		};
  9003 	}
  9004 });
  9005 
  9006 if ( jQuery.expr && jQuery.expr.filters ) {
  9007 	jQuery.expr.filters.animated = function( elem ) {
  9008 		return jQuery.grep(jQuery.timers, function( fn ) {
  9009 			return elem === fn.elem;
  9010 		}).length;
  9011 	};
  9012 }
  9013 
  9014 // Try to restore the default display value of an element
  9015 function defaultDisplay( nodeName ) {
  9016 
  9017 	if ( !elemdisplay[ nodeName ] ) {
  9018 
  9019 		var body = document.body,
  9020 			elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
  9021 			display = elem.css( "display" );
  9022 		elem.remove();
  9023 
  9024 		// If the simple way fails,
  9025 		// get element's real default display by attaching it to a temp iframe
  9026 		if ( display === "none" || display === "" ) {
  9027 			// No iframe to use yet, so create it
  9028 			if ( !iframe ) {
  9029 				iframe = document.createElement( "iframe" );
  9030 				iframe.frameBorder = iframe.width = iframe.height = 0;
  9031 			}
  9032 
  9033 			body.appendChild( iframe );
  9034 
  9035 			// Create a cacheable copy of the iframe document on first call.
  9036 			// IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
  9037 			// document to it; WebKit & Firefox won't allow reusing the iframe document.
  9038 			if ( !iframeDoc || !iframe.createElement ) {
  9039 				iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
  9040 				iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
  9041 				iframeDoc.close();
  9042 			}
  9043 
  9044 			elem = iframeDoc.createElement( nodeName );
  9045 
  9046 			iframeDoc.body.appendChild( elem );
  9047 
  9048 			display = jQuery.css( elem, "display" );
  9049 			body.removeChild( iframe );
  9050 		}
  9051 
  9052 		// Store the correct default display
  9053 		elemdisplay[ nodeName ] = display;
  9054 	}
  9055 
  9056 	return elemdisplay[ nodeName ];
  9057 }
  9058 
  9059 
  9060 
  9061 
  9062 var getOffset,
  9063 	rtable = /^t(?:able|d|h)$/i,
  9064 	rroot = /^(?:body|html)$/i;
  9065 
  9066 if ( "getBoundingClientRect" in document.documentElement ) {
  9067 	getOffset = function( elem, doc, docElem, box ) {
  9068 		try {
  9069 			box = elem.getBoundingClientRect();
  9070 		} catch(e) {}
  9071 
  9072 		// Make sure we're not dealing with a disconnected DOM node
  9073 		if ( !box || !jQuery.contains( docElem, elem ) ) {
  9074 			return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
  9075 		}
  9076 
  9077 		var body = doc.body,
  9078 			win = getWindow( doc ),
  9079 			clientTop  = docElem.clientTop  || body.clientTop  || 0,
  9080 			clientLeft = docElem.clientLeft || body.clientLeft || 0,
  9081 			scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
  9082 			scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
  9083 			top  = box.top  + scrollTop  - clientTop,
  9084 			left = box.left + scrollLeft - clientLeft;
  9085 
  9086 		return { top: top, left: left };
  9087 	};
  9088 
  9089 } else {
  9090 	getOffset = function( elem, doc, docElem ) {
  9091 		var computedStyle,
  9092 			offsetParent = elem.offsetParent,
  9093 			prevOffsetParent = elem,
  9094 			body = doc.body,
  9095 			defaultView = doc.defaultView,
  9096 			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
  9097 			top = elem.offsetTop,
  9098 			left = elem.offsetLeft;
  9099 
  9100 		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
  9101 			if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
  9102 				break;
  9103 			}
  9104 
  9105 			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
  9106 			top  -= elem.scrollTop;
  9107 			left -= elem.scrollLeft;
  9108 
  9109 			if ( elem === offsetParent ) {
  9110 				top  += elem.offsetTop;
  9111 				left += elem.offsetLeft;
  9112 
  9113 				if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
  9114 					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
  9115 					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
  9116 				}
  9117 
  9118 				prevOffsetParent = offsetParent;
  9119 				offsetParent = elem.offsetParent;
  9120 			}
  9121 
  9122 			if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
  9123 				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
  9124 				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
  9125 			}
  9126 
  9127 			prevComputedStyle = computedStyle;
  9128 		}
  9129 
  9130 		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
  9131 			top  += body.offsetTop;
  9132 			left += body.offsetLeft;
  9133 		}
  9134 
  9135 		if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
  9136 			top  += Math.max( docElem.scrollTop, body.scrollTop );
  9137 			left += Math.max( docElem.scrollLeft, body.scrollLeft );
  9138 		}
  9139 
  9140 		return { top: top, left: left };
  9141 	};
  9142 }
  9143 
  9144 jQuery.fn.offset = function( options ) {
  9145 	if ( arguments.length ) {
  9146 		return options === undefined ?
  9147 			this :
  9148 			this.each(function( i ) {
  9149 				jQuery.offset.setOffset( this, options, i );
  9150 			});
  9151 	}
  9152 
  9153 	var elem = this[0],
  9154 		doc = elem && elem.ownerDocument;
  9155 
  9156 	if ( !doc ) {
  9157 		return null;
  9158 	}
  9159 
  9160 	if ( elem === doc.body ) {
  9161 		return jQuery.offset.bodyOffset( elem );
  9162 	}
  9163 
  9164 	return getOffset( elem, doc, doc.documentElement );
  9165 };
  9166 
  9167 jQuery.offset = {
  9168 
  9169 	bodyOffset: function( body ) {
  9170 		var top = body.offsetTop,
  9171 			left = body.offsetLeft;
  9172 
  9173 		if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
  9174 			top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
  9175 			left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
  9176 		}
  9177 
  9178 		return { top: top, left: left };
  9179 	},
  9180 
  9181 	setOffset: function( elem, options, i ) {
  9182 		var position = jQuery.css( elem, "position" );
  9183 
  9184 		// set position first, in-case top/left are set even on static elem
  9185 		if ( position === "static" ) {
  9186 			elem.style.position = "relative";
  9187 		}
  9188 
  9189 		var curElem = jQuery( elem ),
  9190 			curOffset = curElem.offset(),
  9191 			curCSSTop = jQuery.css( elem, "top" ),
  9192 			curCSSLeft = jQuery.css( elem, "left" ),
  9193 			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
  9194 			props = {}, curPosition = {}, curTop, curLeft;
  9195 
  9196 		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
  9197 		if ( calculatePosition ) {
  9198 			curPosition = curElem.position();
  9199 			curTop = curPosition.top;
  9200 			curLeft = curPosition.left;
  9201 		} else {
  9202 			curTop = parseFloat( curCSSTop ) || 0;
  9203 			curLeft = parseFloat( curCSSLeft ) || 0;
  9204 		}
  9205 
  9206 		if ( jQuery.isFunction( options ) ) {
  9207 			options = options.call( elem, i, curOffset );
  9208 		}
  9209 
  9210 		if ( options.top != null ) {
  9211 			props.top = ( options.top - curOffset.top ) + curTop;
  9212 		}
  9213 		if ( options.left != null ) {
  9214 			props.left = ( options.left - curOffset.left ) + curLeft;
  9215 		}
  9216 
  9217 		if ( "using" in options ) {
  9218 			options.using.call( elem, props );
  9219 		} else {
  9220 			curElem.css( props );
  9221 		}
  9222 	}
  9223 };
  9224 
  9225 
  9226 jQuery.fn.extend({
  9227 
  9228 	position: function() {
  9229 		if ( !this[0] ) {
  9230 			return null;
  9231 		}
  9232 
  9233 		var elem = this[0],
  9234 
  9235 		// Get *real* offsetParent
  9236 		offsetParent = this.offsetParent(),
  9237 
  9238 		// Get correct offsets
  9239 		offset       = this.offset(),
  9240 		parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
  9241 
  9242 		// Subtract element margins
  9243 		// note: when an element has margin: auto the offsetLeft and marginLeft
  9244 		// are the same in Safari causing offset.left to incorrectly be 0
  9245 		offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
  9246 		offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
  9247 
  9248 		// Add offsetParent borders
  9249 		parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
  9250 		parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
  9251 
  9252 		// Subtract the two offsets
  9253 		return {
  9254 			top:  offset.top  - parentOffset.top,
  9255 			left: offset.left - parentOffset.left
  9256 		};
  9257 	},
  9258 
  9259 	offsetParent: function() {
  9260 		return this.map(function() {
  9261 			var offsetParent = this.offsetParent || document.body;
  9262 			while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
  9263 				offsetParent = offsetParent.offsetParent;
  9264 			}
  9265 			return offsetParent;
  9266 		});
  9267 	}
  9268 });
  9269 
  9270 
  9271 // Create scrollLeft and scrollTop methods
  9272 jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
  9273 	var top = /Y/.test( prop );
  9274 
  9275 	jQuery.fn[ method ] = function( val ) {
  9276 		return jQuery.access( this, function( elem, method, val ) {
  9277 			var win = getWindow( elem );
  9278 
  9279 			if ( val === undefined ) {
  9280 				return win ? (prop in win) ? win[ prop ] :
  9281 					jQuery.support.boxModel && win.document.documentElement[ method ] ||
  9282 						win.document.body[ method ] :
  9283 					elem[ method ];
  9284 			}
  9285 
  9286 			if ( win ) {
  9287 				win.scrollTo(
  9288 					!top ? val : jQuery( win ).scrollLeft(),
  9289 					 top ? val : jQuery( win ).scrollTop()
  9290 				);
  9291 
  9292 			} else {
  9293 				elem[ method ] = val;
  9294 			}
  9295 		}, method, val, arguments.length, null );
  9296 	};
  9297 });
  9298 
  9299 function getWindow( elem ) {
  9300 	return jQuery.isWindow( elem ) ?
  9301 		elem :
  9302 		elem.nodeType === 9 ?
  9303 			elem.defaultView || elem.parentWindow :
  9304 			false;
  9305 }
  9306 
  9307 
  9308 
  9309 
  9310 // Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
  9311 jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
  9312 	var clientProp = "client" + name,
  9313 		scrollProp = "scroll" + name,
  9314 		offsetProp = "offset" + name;
  9315 
  9316 	// innerHeight and innerWidth
  9317 	jQuery.fn[ "inner" + name ] = function() {
  9318 		var elem = this[0];
  9319 		return elem ?
  9320 			elem.style ?
  9321 			parseFloat( jQuery.css( elem, type, "padding" ) ) :
  9322 			this[ type ]() :
  9323 			null;
  9324 	};
  9325 
  9326 	// outerHeight and outerWidth
  9327 	jQuery.fn[ "outer" + name ] = function( margin ) {
  9328 		var elem = this[0];
  9329 		return elem ?
  9330 			elem.style ?
  9331 			parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
  9332 			this[ type ]() :
  9333 			null;
  9334 	};
  9335 
  9336 	jQuery.fn[ type ] = function( value ) {
  9337 		return jQuery.access( this, function( elem, type, value ) {
  9338 			var doc, docElemProp, orig, ret;
  9339 
  9340 			if ( jQuery.isWindow( elem ) ) {
  9341 				// 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
  9342 				doc = elem.document;
  9343 				docElemProp = doc.documentElement[ clientProp ];
  9344 				return jQuery.support.boxModel && docElemProp ||
  9345 					doc.body && doc.body[ clientProp ] || docElemProp;
  9346 			}
  9347 
  9348 			// Get document width or height
  9349 			if ( elem.nodeType === 9 ) {
  9350 				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
  9351 				doc = elem.documentElement;
  9352 
  9353 				// when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
  9354 				// so we can't use max, as it'll choose the incorrect offset[Width/Height]
  9355 				// instead we use the correct client[Width/Height]
  9356 				// support:IE6
  9357 				if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
  9358 					return doc[ clientProp ];
  9359 				}
  9360 
  9361 				return Math.max(
  9362 					elem.body[ scrollProp ], doc[ scrollProp ],
  9363 					elem.body[ offsetProp ], doc[ offsetProp ]
  9364 				);
  9365 			}
  9366 
  9367 			// Get width or height on the element
  9368 			if ( value === undefined ) {
  9369 				orig = jQuery.css( elem, type );
  9370 				ret = parseFloat( orig );
  9371 				return jQuery.isNumeric( ret ) ? ret : orig;
  9372 			}
  9373 
  9374 			// Set the width or height on the element
  9375 			jQuery( elem ).css( type, value );
  9376 		}, type, value, arguments.length, null );
  9377 	};
  9378 });
  9379 
  9380 
  9381 
  9382 
  9383 // Expose jQuery to the global object
  9384 window.jQuery = window.$ = jQuery;
  9385 
  9386 // Expose jQuery as an AMD module, but only for AMD loaders that
  9387 // understand the issues with loading multiple versions of jQuery
  9388 // in a page that all might call define(). The loader will indicate
  9389 // they have special allowances for multiple jQuery versions by
  9390 // specifying define.amd.jQuery = true. Register as a named module,
  9391 // since jQuery can be concatenated with other files that may use define,
  9392 // but not use a proper concatenation script that understands anonymous
  9393 // AMD modules. A named AMD is safest and most robust way to register.
  9394 // Lowercase jquery is used because AMD module names are derived from
  9395 // file names, and jQuery is normally delivered in a lowercase file name.
  9396 // Do this after creating the global so that if an AMD module wants to call
  9397 // noConflict to hide this version of jQuery, it will work.
  9398 if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
  9399 	define( "jquery", [], function () { return jQuery; } );
  9400 }
  9401 
  9402 
  9403 
  9404 })( window );