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