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